Форум Positive Hack Days 11, проходивший 18–19 мая 2022 года, был по-настоящему грандиозным. В конкурсе по взлому банкоматов борьба развернулась не на шутку — 49 участников, это очень круто! Призовой фонд в этом году составлял 50 000 рублей, его забрал человек с ником Igor, сломавший виртуальные машины первым. Кстати, его даже не было на мероприятии! :)

Помимо победителя, в этом году было награждено восемь человек, показавших хорошие результаты во время взлома виртуальных машин, а именно: drd0c, vient, vrazov, durcm, zxcvcxzas7, asg_krd, hundred303, drink_more_water_dude. Хотим поблагодарить всех участников, а для тех, кто не был на PHDays, приводим ссылки на виртуальные машины:

Рисунок 1. Интерфейс банкомата
Рисунок 1. Интерфейс банкомата

Что касается задач, они были одинаковыми для двух разных виртуальных машин:

1) обход киоска (была решена 34 раза);

2) обход AppLocker (была решена 21 раз);

3) повышение привилегий до администратора (была решена 12 раз).

На диске C лежали несколько файлов: task_kiosk.exe, task_applocker.exe, task_escalation.exe, которые нужно было запустить, чтобы таск засчитался. Файл task_kiosk.exe был доступен к запуску сразу после обхода киоска, task_applocker.exe был заблокирован при помощи AppLocker, для запуска task_escalation.exe требовались права администратора.

Архитектурные решения в этом году позволяют нам отслеживать количество участников и решенные задачи через телеграм-бот, именно поэтому мы можем привести более подробную статистику (рисунок 2).

Рисунок 2. Общее количество участников
Рисунок 2. Общее количество участников

Разбор тасков

Следует отметить, что в этом году простор для действий участников был намного больше, и каждая задача на виртуальной машине имела большое количество решений. В прошлом году на обход киоска участникам потребовалось слишком много времени, и некоторые просто бросили это задание, не дойдя до конца. Изменения этого года принесли результаты, и мы получили очень интересные решения, не предусмотренные заложенным сценарием.

Ниже обзор решений представлен в общем виде, без ссылки на конкретные виртуальные машины. Участники с легкостью поймут, какое решение к какой машине подходит. Это сделано для того, чтобы у заинтересованных читателей статьи осталось пространство для решения наших задач.

Выход из режима киоска. Первый способ

Многие даже и не подозревали, насколько он был прост. Для выхода из режима киоска в одной из виртуальных машин нужно было воспользоваться правой кнопкой мыши. Удивительно, но участники не заметили, что правая кнопка мыши работает и, как в прошлом году, искали комбинации клавиш для выхода из режима киоска. Приложение киоска представляло собой веб-браузер, написанный на Delphi, поэтому полный сценарий обхода киоска выглядел так: правая кнопка мыши → Print → Find Printer (рисунок 3).

Рисунок 3. Меню после нажатия правой кнопки мыши
Рисунок 3. Меню после нажатия правой кнопки мыши

Эти действия позволяли открыть файл explorer.exe и перейти к диску С для запуска task_kiosk.exe.

Рисунок 4. Выполнение первого задания
Рисунок 4. Выполнение первого задания

Выход из режима киоска. Второй способ

В другой виртуальной машине все было немного сложнее, так как правая кнопка мыши была запрещена вместе с основными клавишами. Для выхода из режима киоска был заложен сетевой вектор, требующий сканирования портов банкомата. После сканирования портов с помощью Nmap участники могли заметить, что на порту 80 расположен некий сервис. Самый простой способ узнать, что же там работает, — перейти по ссылке http://<atm_adress>:80. Для конкурса был специально написан веб-сервер, работающий на порту 80. На каждое подключение к нему пользователя он отдавал ошибку и открывал страницу справки в браузере на виртуальной машине.

Рисунок 5. Демонстрация интерфейса Nmap
Рисунок 5. Демонстрация интерфейса Nmap

В моем случае IP банкомата был 192.168.56.102, и сканирование Nmap показало, что порт 80 открыт. После перехода в браузере по данному адресу появлялась такая ошибка, в которой нажатие на кнопку «OK» открывало браузер Internet Explorer.

Рисунок 6. Заложенная ошибка
Рисунок 6. Заложенная ошибка
Рисунок 7. Демонстрация открытия браузера после нажатия на «ОК»
Рисунок 7. Демонстрация открытия браузера после нажатия на «ОК»

Выход из браузера во многом идентичен первому сценарию и может осуществляться через загрузки Internet Explorer.

Обход AppLocker. Первый способ

По неизвестным причинам сценарий, заложенный в одной из виртуальных машин, отказался работать в последний момент, за что мы просим прощения ????. Дело в том, что мы заметили это слишком поздно. Таким образом, участники искали несуществующий обход AppLocker и нашли много разных сценариев. Некоторые говорили, что для обхода AppLocker достаточно просто получить права администратора, а потом уже отключить его. Действительно, это один из вариантов прохождения, но изначально предусматривалось, что таски будут выполняться по порядку и запуск task_applocker.exe пройдет без привилегий администратора. Заложенный сценарий заключался в использовании LOLBin и изначально был описан здесь.

wlrmdr.exe -s 3600 -f 0 -t Click me! -m To run calculator -a 10 -u C:\task_applocker.exe

Приведенная выше команда в обход AppLocker должна была показывать уведомление, после клика на которое должен был запускаться task_applocker.exe, но почему-то этого не происходило, при этом предупреждение от AppLocker не появлялось.

Рисунок 8. Демонстрация уведомления wlrmdr.exe (ключи в строке «Пуск»)
Рисунок 8. Демонстрация уведомления wlrmdr.exe (ключи в строке «Пуск»)

Обход AppLocker. Второй способ

Что касается второго обхода AppLocker, тут все работало нормально. Правилами проверялся хеш EXE-файла, поэтому обход был максимально простым (решение предложил hx0day).

Создаем пустой файл 0.txt и выполняем команду copy /b task_applocker.exe+0.txt notepad.exe, при этом мы получаем файл notepad.exe — по сути, копию task_applocker.exe c другим хешем. Запускаем его и получаем готовое решение.

Рисунок 9. Выполнение task_applocker.exe
Рисунок 9. Выполнение task_applocker.exe

Рисунок 10. Правила AppLocker
Рисунок 10. Правила AppLocker

Повышение привилегий. Первый способ

Повысить привилегии в одной из виртуальных машин было достаточно просто. Сценарий заключался в поиске истории PowerShell. Часто администраторы, пользуясь данным ПО, забывают удалять историю введенных команд. История PowerShell, в свою очередь, доступна и без привилегий администратора, и оставленной там информацией могут воспользоваться хакеры. В нашем случае в одной из виртуальных машин в истории были оставлены логин и пароль администратора в открытом виде. Их можно было найти по следующему пути:

C:\Users\ATM\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

Рисунок 11. Логин и пароль администратора в открытом виде
Рисунок 11. Логин и пароль администратора в открытом виде

Повышение привилегий. Второй способ

Еще один способ повысить привилегии был максимально нестандартным и заключался в использовании команды runas и поиске ярлыка на рабочем столе администратора, открывающего интерпретатор командной строки с максимальными привилегиями. Данная команда позволяет запускать EXE-файлы с правами администратора. Дело в том, что некоторые аргументы команды, такие как /savecard, позволяют сохранить логин и пароль администратора и в дальнейшем запускать приложения уже без ввода этих данных.

runas /user:Admin /savecard cmd.exe

Однако и здесь есть нюансы: при выполнении следующей команды открывается консоль, и можно увидеть, что она запущена от имени администратора, но после более детальной проверки удается понять, что соответствующих прав все-таки нет. Тем не менее вместе с этим у нас появляется возможность перейти на рабочий стол администратора, где нужно запустить ярлык.

Рисунок 12. Выполнение команды и запуск консоли от имени администратора
Рисунок 12. Выполнение команды и запуск консоли от имени администратора

Делаем попытку запуска task_escalation.exe и видим следующую ошибку:

Рисунок 13. Отсутствие прав администратора
Рисунок 13. Отсутствие прав администратора

Далее запускаем ярлык aministrator_cmd.lnk, расположенный по пути C:\Users\Admin\Desktop.

Рисунок 14. Запуск консоли
Рисунок 14. Запуск консоли

После этого можно уже с полными правами администратора запускать task_escalation.exe, чтобы наконец пройти этот таск.

Рисунок 15. Запуск task_escalation.exe
Рисунок 15. Запуск task_escalation.exe

Дополнительные задания

Теперь разберем дополнительные задания. Напомним, что интерфейс банкомата являлся веб-страницей, расположенной по адресу http://bank.paymentvillage.org. Он доступен и сейчас. Задания выделены в категорию дополнительных, потому что имеют косвенное отношение к банкомату и заключаются в поиске классических веб-уязвимостей. Для удобства и упрощения взлома в число ошибок были включены ошибки PHP.

Рисунок 16. Ошибка PHP
Рисунок 16. Ошибка PHP

Всего несколько человек попытались сломать кабинет банкомата, и мы получили репорты по заложенным сценариям. Первая уязвимость, которая была найдена участником vient, — Path Traversal. Мы с радостью подарили ему футболку.

Рисунок 17. Исходный код страницы index.php
Рисунок 17. Исходный код страницы index.php

curl --path-as-is http://bank.paymentvillage.org/favicon.ico/../index.php

Для просмотра исходного кода нужно было выполнить указанную выше команду.

Кстати, ошибка, показанная на рис. 16, могла натолкнуть участников на еще одну заложенную уязвимость, но, к сожалению, ее никто так и не нашел. Дело в том, что код банкомата, написанный на Delphi, постоянно считывал файл С:\Atm\atmkey.txt. В этом файле хранился atmkey — уникальный идентификатор банкомата, по которому мы могли отслеживать выполнения тасков. Далее atmkey подставлялся автоматически в каждый запрос в виде заголовка ATM, и с ним проходила авторизация в банкомате. Этот заголовок нужен в числе прочего для того, чтобы можно было выдавать деньги на конкретном банкомате (виртуальной машине). В итоге self-xss можно было эксплуатировать, передав вредоносный JS-код в заголовке ATM.

Рисунок 18. Демонстрация отправки запроса
Рисунок 18. Демонстрация отправки запроса

Следующую уязвимость тоже никто не обнаружил, хотя ее можно было найти очень легко, всего лишь изменив содержимое файла С:\Atm\atmkey.txt. Для этого не нужно даже было использовать средства, позволяющие проводить MITM-атаки. Вот так это выглядит:

Рисунок 19. Эксплуатация XSS
Рисунок 19. Эксплуатация XSS

В этом году в заложенных сценариях также присутствовал ARP Spoofing, в анализ которого мы не будем углубляться, поскольку пример такой атаки был описан ранее. Суть заключалась в том, что участникам необходимо было подделать ответ http://bank.paymentvillage.org/payout?atmid=<your_atm_id> для того, чтобы на второй виртуальной машине запустилось приложение C:\Atm\payout.exe, имитирующее выдачу денег. Банкомат каждые 5 секунд обращается к этому адресу и ждет ответа true для начала выдачи денег.

Помимо этого, конечно, в сценариях присутствуют уязвимости, которые хочется оставить в секрете, чтобы сохранить интригу.

Выводы

В этом году заложенные сценарии оказались очень простыми для участников. Многие успели хорошо подготовиться. Видимо, статья прошлого года сыграла свою роль :)

Мы поняли, что нужно искать баланс сложности, и сделали определенные выводы, которые реализуем в следующем году. В то же время многие участники и не осознавали настоящий масштаб конкурса и выполняли только основные таски.

Участникам были отправлены грамоты, и уже есть первые отзывы. Надеемся, что на момент публикации этой статьи все получили свои призы. C разрешения одного из участников (спасибо за отзыв, durcm!) публикуем фотографию с грамотой.

Еще хочется сказать огромное спасибо нашим международным участникам, в частности Boschko. Он уже несколько лет делится прохождениями наших виртуалок со своими читателями:

Больше информации о Payment Village ищите в Telegram. До скорой встречи! :)

Автор: @yurasikhacker


Читайте также разборы других конкурсов с PHDays11

Комментарии (0)