«Атака на топливный склад» или ломаем SCADA систему на PHDays VI

Организаторы PHDays традиционно показали свое мастерство организации, как всегда что-то новое, интересное и конечно большое количество стендов под управлением SCADA систем. Редкая возможность попробовать свои силы во взломе системы жизнеобеспечения большого города, развернуть противоракетную установку и произвести выстрел, устроить железнодорожную катастрофу, затопить город, захватить управление дамбой и многое другое.
Всех участников, и мы не исключение, привлекает возможность получения опыта работы со SCADA, управляющей моделями промышленных объектов. Нам показался интересным стенд компании ИнфоТеКС — «Атака на топливный склад», который нам в итоге удалось покорить. Ниже приведена последовательность взлома, кому это интересно.

Условия конкурса «Атака на топливный склад»
Исходные данные: атака состоит из двух этапов.
1. Этап: Необходимо в «Цифровом баре» найти подсказку для начала первого этапа атаки. В результате 1 этапа атаки требуется овладеть неким «секретом» для перехода к этапу №2. Первый этап считается успешно пройденным в случае, если действия нарушителя не были замечены межсетевым экраном.
2. Этап: Получив «секрет», атакующий переходит ко второй стадии атаки. Задача — подача не авторизованной команды на розлив пунша.
Цель: Осуществить несанкционированный слив топлива объемом 50 или 100 литров.
Разрешается: Использование собственного ноутбука, с любым необходимым программным обеспечением.
Запрещается: Любое физическое воздействие на макет топливного склада. Нарушитель будет сразу отстраняется от участия в конкурсе.
Итак, этап 1.
Известно:
WiFi
SSID: step_default
PASS: 00000000
FTP
login: user
pass: Zb1HjJ9I

d0f448ce4ebe4681972a50ea64117c8b.jpg

Подключившись к сети по DHCP получаем IP 50.50.50.12. и сканируем доступную сеть.
sudo netdiscover -i wlan0 результат дает нам несколько IP, каждый из которых сканируем на открытые порты через nmap.
nmap -Pn — из всего списка самым интересным оказался IP:50.50.50.3, с открытыми портами 22(SSH), 21(FTP), 80(HTTP) и 7777 (не известный сервис). Сразу вспомнилось, что у нас есть логин и пароль к FTP серверу. После авторизации на FTP обнаруживается файл 7777.zip. Скачиваем и пробуем распаковать, но не тут-то было, архив запаролен. Вводим все, что нам известно из условий задания и найденного по пути. Ничего не помогло. Приняли решение отложить вопрос и идти дальше. Через браузер открываем 50.50.50.3 и видим следующее:

80e7f4fe57b04c3192bbc455c57beabb.png

Казалось бы, обычная картинка, но, опыт прохождения HackQuest’ов не прошел бесследно. Скачиваем картинку и изучаем содержимое.

26f8bea55f1e4cc58460a1161d5620ac.png

Используя cat обнаруживаем некоторое значение в конце файла »TnpjM056bzNPVFU0TWpRMk5nbz0K». Поразмыслив пришли к выводу, что это Base64 и выполнили следующую команду:

echo TnpjM056bzNPVFU0TWpRMk5nbz0K | base64 -d
получили ответ — Nzc3Nzo3OTU4MjQ2Ngo=

проделываем этот трюк еще раз, на этот раз с полученным результатом
echo Nzc3Nzo3OTU4MjQ2Ngo= | base64 -d
в ответ — 7777:79582466

Итак, теперь у нас есть новые значения, остается вопрос: «Куда их девать?!». Попытки авторизоваться с этими данными через FTP и SSH, а также использования в качестве пароля к *.zip архиву результата не дали. Вспомнили, что на удаленной машине так же открыт порт 7777. Соединяемся через telnet и получаем сообщение «Tell me your ID». Так как первая часть ответа является указанием на порт (7777), предположили, что вторая запрашиваемый ID.

a8afb60d2023419691c197210a575d34.png

Все сделано правильно! Результатом работы стал еще один ФЛАГ (Ffl42Nm5b4#445). Не отходя от кассы вспоминаем, что у нас так же есть файл с именем 7777.zip. Вводим в качестве пароля полученные данные и вуаля, архив распакован. Внутри архива файл johny, посмотрев на содержание которого наш сисадмин, без тени сомнений озвучил приговор «Это SSH ключ» и сделал следующее:

6f8d15322b514fbdb2fc4212ddcb101c.png

Используя SSH ключ и имя файла в качестве имени учетной записи (johny) мы подключились к серверу 50.50.50.3 и получили в ответ новые данные
IG10: YourPassPhrese987

IG10 оказалась еще одной Wi-Fi точкой доступа. Подключившись к IG10, мы начали все сначала.

sudo netdiscover -i wlan0
на этот раз внимание привлекло то, что в сети было два адресных пространства — 192.168.2.1/24 и 192.168.20.1/24
Примечательно, что gateway (192.168.1.1 & 192.168.20.1) имели один и тот же MAC, а это значит — в сети всего один роутер. Для доступа к обеим подсетям прописали маршрут.

sudo route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.20.1

Далее взялись за спуфинг. Для подачи топлива на роботе, подключенного к WiFi сети IG10, подавалась команда, которая, в свою очередь, обрабатывалась на сервере и выдавала команду на сброс топлива. К сожалению, файл *.pcap, с данными собранными через спуфинг, мы не сохранили, поэтому придется объяснять на пальцах.
Мы обнаружили, что при нажатии кнопки сброса топлива с IP 192.168.20.7 (предположительно робот), по протоколу modbus, в сторону IP 192.168.2.2 (предположительно управляющий сервер) передается пакет на порт 502. Таким образом, мы определили роли устройств. Осталось только воспроизвести повторную отправку пакета, вся необходимая для этого информация у нас уже имелась. Однако, повторно воспроизвести отправку пакета своими силами у нас не вышло из-за сложности отправки сформированного пакета. На помощь пришел github, скачав необходимую либу и немного ее модифицировав под свои цели, получилось воспроизвести данные отправляемые роботом — команду на сброс топлива.

bdc2b1ef606942669474bb82cb160be7.png

© Habrahabr.ru