Форум 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) обход киоска (была решена 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).
Разбор тасков
Следует отметить, что в этом году простор для действий участников был намного больше, и каждая задача на виртуальной машине имела большое количество решений. В прошлом году на обход киоска участникам потребовалось слишком много времени, и некоторые просто бросили это задание, не дойдя до конца. Изменения этого года принесли результаты, и мы получили очень интересные решения, не предусмотренные заложенным сценарием.
Ниже обзор решений представлен в общем виде, без ссылки на конкретные виртуальные машины. Участники с легкостью поймут, какое решение к какой машине подходит. Это сделано для того, чтобы у заинтересованных читателей статьи осталось пространство для решения наших задач.
Выход из режима киоска. Первый способ
Многие даже и не подозревали, насколько он был прост. Для выхода из режима киоска в одной из виртуальных машин нужно было воспользоваться правой кнопкой мыши. Удивительно, но участники не заметили, что правая кнопка мыши работает и, как в прошлом году, искали комбинации клавиш для выхода из режима киоска. Приложение киоска представляло собой веб-браузер, написанный на Delphi, поэтому полный сценарий обхода киоска выглядел так: правая кнопка мыши → Print → Find Printer (рисунок 3).
Эти действия позволяли открыть файл explorer.exe и перейти к диску С для запуска task_kiosk.exe.
Выход из режима киоска. Второй способ
В другой виртуальной машине все было немного сложнее, так как правая кнопка мыши была запрещена вместе с основными клавишами. Для выхода из режима киоска был заложен сетевой вектор, требующий сканирования портов банкомата. После сканирования портов с помощью Nmap участники могли заметить, что на порту 80 расположен некий сервис. Самый простой способ узнать, что же там работает, — перейти по ссылке http://<atm_adress>:80. Для конкурса был специально написан веб-сервер, работающий на порту 80. На каждое подключение к нему пользователя он отдавал ошибку и открывал страницу справки в браузере на виртуальной машине.
В моем случае IP банкомата был 192.168.56.102, и сканирование Nmap показало, что порт 80 открыт. После перехода в браузере по данному адресу появлялась такая ошибка, в которой нажатие на кнопку «OK» открывало браузер Internet Explorer.
Выход из браузера во многом идентичен первому сценарию и может осуществляться через загрузки 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 не появлялось.
Обход AppLocker. Второй способ
Что касается второго обхода AppLocker, тут все работало нормально. Правилами проверялся хеш EXE-файла, поэтому обход был максимально простым (решение предложил hx0day).
Создаем пустой файл 0.txt и выполняем команду copy /b task_applocker.exe+0.txt notepad.exe, при этом мы получаем файл notepad.exe — по сути, копию task_applocker.exe c другим хешем. Запускаем его и получаем готовое решение.
Повышение привилегий. Первый способ
Повысить привилегии в одной из виртуальных машин было достаточно просто. Сценарий заключался в поиске истории PowerShell. Часто администраторы, пользуясь данным ПО, забывают удалять историю введенных команд. История PowerShell, в свою очередь, доступна и без привилегий администратора, и оставленной там информацией могут воспользоваться хакеры. В нашем случае в одной из виртуальных машин в истории были оставлены логин и пароль администратора в открытом виде. Их можно было найти по следующему пути:
C:\Users\ATM\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
Повышение привилегий. Второй способ
Еще один способ повысить привилегии был максимально нестандартным и заключался в использовании команды runas и поиске ярлыка на рабочем столе администратора, открывающего интерпретатор командной строки с максимальными привилегиями. Данная команда позволяет запускать EXE-файлы с правами администратора. Дело в том, что некоторые аргументы команды, такие как /savecard, позволяют сохранить логин и пароль администратора и в дальнейшем запускать приложения уже без ввода этих данных.
runas /user:Admin /savecard cmd.exe
Однако и здесь есть нюансы: при выполнении следующей команды открывается консоль, и можно увидеть, что она запущена от имени администратора, но после более детальной проверки удается понять, что соответствующих прав все-таки нет. Тем не менее вместе с этим у нас появляется возможность перейти на рабочий стол администратора, где нужно запустить ярлык.
Делаем попытку запуска task_escalation.exe и видим следующую ошибку:
Далее запускаем ярлык aministrator_cmd.lnk, расположенный по пути C:\Users\Admin\Desktop.
После этого можно уже с полными правами администратора запускать task_escalation.exe, чтобы наконец пройти этот таск.
Дополнительные задания
Теперь разберем дополнительные задания. Напомним, что интерфейс банкомата являлся веб-страницей, расположенной по адресу http://bank.paymentvillage.org. Он доступен и сейчас. Задания выделены в категорию дополнительных, потому что имеют косвенное отношение к банкомату и заключаются в поиске классических веб-уязвимостей. Для удобства и упрощения взлома в число ошибок были включены ошибки PHP.
Всего несколько человек попытались сломать кабинет банкомата, и мы получили репорты по заложенным сценариям. Первая уязвимость, которая была найдена участником vient, — Path Traversal. Мы с радостью подарили ему футболку.
curl --path-as-is http://bank.paymentvillage.org/favicon.ico/../index.php
Для просмотра исходного кода нужно было выполнить указанную выше команду.
Кстати, ошибка, показанная на рис. 16, могла натолкнуть участников на еще одну заложенную уязвимость, но, к сожалению, ее никто так и не нашел. Дело в том, что код банкомата, написанный на Delphi, постоянно считывал файл С:\Atm\atmkey.txt. В этом файле хранился atmkey — уникальный идентификатор банкомата, по которому мы могли отслеживать выполнения тасков. Далее atmkey подставлялся автоматически в каждый запрос в виде заголовка ATM, и с ним проходила авторизация в банкомате. Этот заголовок нужен в числе прочего для того, чтобы можно было выдавать деньги на конкретном банкомате (виртуальной машине). В итоге self-xss можно было эксплуатировать, передав вредоносный JS-код в заголовке ATM.
Следующую уязвимость тоже никто не обнаружил, хотя ее можно было найти очень легко, всего лишь изменив содержимое файла С:\Atm\atmkey.txt. Для этого не нужно даже было использовать средства, позволяющие проводить MITM-атаки. Вот так это выглядит:
В этом году в заложенных сценариях также присутствовал ARP Spoofing, в анализ которого мы не будем углубляться, поскольку пример такой атаки был описан ранее. Суть заключалась в том, что участникам необходимо было подделать ответ http://bank.paymentvillage.org/payout?atmid=<your_atm_id> для того, чтобы на второй виртуальной машине запустилось приложение C:\Atm\payout.exe, имитирующее выдачу денег. Банкомат каждые 5 секунд обращается к этому адресу и ждет ответа true для начала выдачи денег.
Помимо этого, конечно, в сценариях присутствуют уязвимости, которые хочется оставить в секрете, чтобы сохранить интригу.
Выводы
В этом году заложенные сценарии оказались очень простыми для участников. Многие успели хорошо подготовиться. Видимо, статья прошлого года сыграла свою роль :)
Мы поняли, что нужно искать баланс сложности, и сделали определенные выводы, которые реализуем в следующем году. В то же время многие участники и не осознавали настоящий масштаб конкурса и выполняли только основные таски.
Участникам были отправлены грамоты, и уже есть первые отзывы. Надеемся, что на момент публикации этой статьи все получили свои призы. C разрешения одного из участников (спасибо за отзыв, durcm!) публикуем фотографию с грамотой.
Еще хочется сказать огромное спасибо нашим международным участникам, в частности Boschko. Он уже несколько лет делится прохождениями наших виртуалок со своими читателями:
Больше информации о Payment Village ищите в Telegram. До скорой встречи! :)
Автор: @yurasikhacker