Standoff 365. Самое красивое недопустимое событие в деталях

d3e6607d69e18f98b4ed937737ef9184.jpg

Привет, Хабр. Меня зовут Виктор, я работаю в компании «Инфосистемы Джет» пентестером и активно играю на киберполигоне Standoff 365 под ником VeeZy. Сегодня я хочу поделиться с тобой, на мой взгляд, самым красивым критическим событием, которое есть на платформе!

Инцидент, который мы реализуем, называется «Оплата товаров по QR-кодам за счет украденных средств», и за него можно получить 7500 баллов.

Взлом новостного портала, путешествие в страну Kubernetes, кража денежных средств с клиентских счетов, и это далеко не всё! Разумеется, это всё в рамках закона и служит исключительно в образовательных целях! Устраивайся поудобней, а мы начинаем.

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

Новостной портал Global Digital Bank

Новостной портал Global Digital Bank

Обнаруживаем, что если в детстве было плохо с арифметикой, то портал нам в этом охотно поможет и при правильном запросе сделает всё за нас. Например, при умножении {{49×49}} выдаст нам верный ответ — 2401. Внимательный читатель уже понял, к чему я веду. Уверен, для тебя будет делом техники выяснить, какой шаблонизатор используется, получить список установленных модулей и собрать полезную нагрузку. Но если ты ленишься, то можешь присмотреться к рисунку ниже, на котором я загружаю простейший Reverse Shell.

Успешная загрузка файла для создания обратного соединения

Успешная загрузка файла для создания обратного соединения

Но строгий WAF не даст тебе много времени на раздумья, чтобы понять, выполнилась ли твоя команда на сервере. Тут нам на помощь придет repeater с возможностью объединения нескольких запросов в одну группу и мгновенной отправкой одного запроса за другим (send group in sequence). Убедившись, что наш файл успешно загружен, поднимаем listener, исполняем файл и, счастливые ловим сессию.

Мы внутри! Внутри чего? Как понять, что мы попали в Kubernetes?

Есть отличный доклад от Сергея Канибора, который поможет тебе, как и мне, понять базовые вещи и не растеряться на местности. Через переменные окружения понимаем, что мы попали на один из подов в кубере и сразу находим креды от базы данных Postgres.

Обнаружение пароля к базе данных Postgres в переменных окружения

Обнаружение пароля к базе данных Postgres в переменных окружения

Не пугайся разной адресации на подах — в кубере сетка, обычно, плоская, и ты сможешь достучаться до нужного. Загрузить какую-либо тулзу для проксирования простыми способами не получится, тут отсутствуют wget и curl, но всеми любимый ресурс поможет тебе решить этот вопрос.

Дальше попадаем в базу данных Postgres и держим в уме, что начиная с версии 9.3 есть не уязвимость, а фича, хорошо описанная здесь и позволяющая суперпользователю исполнять произвольный код в контексте операционной системы. А пользователь-то у нас как раз postgres. Тут всё просто: создаем table, через команду COPY и параметр Program отправляем серверу полезную нагрузку, и ловим сессию уже на поде Postgres. Детальное описание атаки можешь найти тут.

Получение обратного соединения с пода Postgres-news-deployment

Получение обратного соединения с пода Postgres-news-deployment

Как обычно, оказавшись в новой среде, сначала проводим разведку и обнаруживаем, что имеем права на запрос информации о всех подах в кластере. С помощью утилиты kubectl изучаем каждый и видим, что один из них находится на 445 порту с сервисом samba, а также хранит креды двух сотрудников банка.

Обнаружение паролей от учетных записей BankWorker и CentralWorker

Обнаружение паролей от учетных записей BankWorker и CentralWorker

Одна из учетных записей называется CentralWorker, а сетевая шара, куда она имеет доступ — это Central Bank of the Standoff. Напомню, что в банковском сегменте представлены три банка: Commercial Bank of the Standoff для юридических лиц, First Partner Bank для малого бизнеса и облачный автоматизированный Global Digital Bank, в котором мы сейчас.

Проверим свои права на сетевой шаре. Отлично — можем читать и записывать.

Локальная аутентификация на поде 10.42.0.2

Локальная аутентификация на поде 10.42.0.2

Идем на неё и видим, помимо кем-то скомпиленых reverse-shell«ов, три папки: Incoming, Outcoming и [.]deleted. Папка Outcoming пустая (мы к ней еще вернемся), и каково же было мое удивление, когда в папке Incoming я нахожу свои же платежки по риску АРМ КБР из другого сегмента банка! На тот момент я был единственным, кто сдал этот риск. Только погружаясь всё глубже в инфраструктуру, ты начинаешь понимать, насколько интересно сделаны сегменты и как они взаимодействуют между собой!

Cодержимое сетевой шары

Cодержимое сетевой шары

В папке .deleted мы находим множество платежных поручений, тип электронного сообщения ED101. На работе я часто провожу инфраструктурные пентесты банков по стандарту PCI DSS, и тут мне было легко сориентироваться. При изучении платежных документов видно, что плательщик всегда один и тот же. Это хорошо: выглядит так, что у него на счету много денег (значит, может и с нами поделиться, хе-хе). Уже имея опыт взаимодействия с банковским сектором, сразу задумываешься:, а что будет, если я скачаю себе платежное поручение, поменяю там получателя на себя, поменяю сумму перевода и загружу обратно на сетевую шару, но в папку Outcoming (исходящие) — улетит ли моя платежка и придут ли мне деньги? Спойлер: ДА!

Скачиваем мобильное приложение с главной страницы First Partner Bank и открываем там счет. Загружаем «правильную» платежку и наблюдаем, как, не успев загрузиться, она сразу же и улетела!

Успешная загрузка «нашего» платежного поручения

Успешная загрузка «нашего» платежного поручения

Проверяем баланс в приложении и…Бинго!

Симпатичный баланс в банковском приложении

Симпатичный баланс в банковском приложении

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

Неудачная попытка попасть на страницу магазина

Неудачная попытка попасть на страницу магазина

Но ты уже закаленный стендоффер, и проблемы с DNS решаешь на раз, тем более что утилита dig тебе в этом сильно облегчит жизнь. Находим нужный IP-адрес, заносим все в /etc/hosts — и мы в магазине.

Главная страница магазина Quality & Design Retail

Главная страница магазина Quality & Design Retail

Как оказалось так, что симпатичную кошечку можно приобрести всего за 10 тысяч, а пиратский флаг, необходимый для сдачи инцидента, стоит 390 тысяч, пусть останется на совести организаторов!

Выбираем нужный товар и формируем QR-код.

Сформированный QR-код на оплату

Сформированный QR-код на оплату

Под QR-кодом написано, что после оплаты нужно обновить страницу. Забегая вперед, ты просто успешно скачаешь картинку с пиратским флагом, но она будет отличаться от любой другой, что у тебя есть, не так ли?

Итак, сканируем QR-код в приложении и оплачиваем своими честно заработанными рублями, только что пополнившими наш счет. Платеж проведен успешно. Мы реализовали атаку!

Успешная оплата и реализация недопустимого события

Успешная оплата и реализация недопустимого события

Онлайн-киберполигон Standoff 365 — уникальная тренировочная площадка, где каждый найдет задачи для себя: веб-уязвимости, Docker, Kubernetes, Active Directory, CTF и многое другое. К тому же она работает 24/7, что очень удобно! Я выбрал это критическое событие, но на площадке хватает и других, не менее интересных и сложных рисков. Надеюсь, тебе было интересно читать, и ты узнал для себя немало нового. Успехов, и увидимся на полигоне!

bd3a897c8b21f69e0a29e7a9a8301f1b.jpgВиктор Зварыкин

консультант по информационной безопасности, «Инфосистемы Джет»

© Habrahabr.ru