И вот 04.01.2019 г. пьедестал полностью сформирован и целая группа талантливых персонажей взяли последний и мучительный для них токен Image! перечислю ники на всякий случай: BadBlackHat, Mister_BertOni, zpointer, rOhack, ASV, cryptObOy из популярного форума codeby.net взявшие последний токен в один день, так же ребята rack2009, nerf, oneGuard и конечно же монстр лабы, который прошел ее просто молниеносно, CSV! Браво всем!
Да и еще, прошу Вас обратить внимание, что к написанию статьи мы подошли с трепетностью и душой.
Все, что я находил ранее, обзоры предыдущих лаб, то он сделаны примерно по следующему принципу:
Мы постарались описать все действия, при том, мы постарались скрыть все токены, дабы оставить Вам шанс проявить себя. Все написанное не более чем личный взгляд автора на классную лабораторную. Текст может иметь помарки и режущие фразы не относящиеся к литературному изложению, так сказать «по домашнему».
В этом году организаторы решили не давать карту сети в руки, люди поделились на 2 типа, кому начхать и те, как я, привыкшие работать по бумажке. Это даже хорошо, постараемся собрать свою карту сети и снабдить Вас достаточными знаниями, погнали…
По старой доброй привычке, я лично решил проходить задания на Винде (Windows 10 Redstone 5) по причине кончины моего рабочего Deepin, а именно нового загрузчика Grub 3 и было просто лениво его реанимировать и хотел поскорее начать. Сразу оговорюсь, это не чистая Винда, а все таки с shell на нем.
________________________________________
z 9r347 39u411z3r
Lab’s gateways: 192.168.101.12 and 192.168.101.13
________________________________________
Нам намекают на 2 хоста и да, не ищите подвох или токен в названии лабы — z 9r347 39u411z3r — это всего лишь название the great equalizer. Да и для тех, кто начал впервые и не понимает, что суть всех заданий в полном включении головы — читайте статьи предыдущих лабораторок (1, 2, 3 и вообще перейдите в наш раздел CTF и попытайтесь проверить себя) и тренируйте скил, а лишь после этого садитесь за эти задания.
Для подключения к лаборатории используйте зеленую кнопку HOW TO CONNECT lol вдруг тут новички…
Подключившись к VPN, мы включаем внутренний режим мониторинга и собираем любую доступную информацию.
Для начала сканируем сеть 192.168.101.0/24 чтобы понять что у нас есть.
Мы имеем 3 хоста:
192.168.101.1 — шлюз
192.168.101.12 — вэб-сервис, резолвит как site.test.lab
192.168.101.13 — хз…
Вуаля, сайт открылся )
Посканим его:
Ну и 13 хост, проверим так же:
________________________________________
Пытаемся определить что это за вэб-сервис, какой CMS использует:
Ничего.
________________________________________
Сканим директории:
Останавливаем, WAF не дает нам ничего посмотреть.
________________________________________
Пробуем другой способ проверки содержимого:
Только лишь index.html.
Идем на http://site.test.lab и рыскаем по коду и по страницам, пытаемся поэксплуатировать формы, найти хоть какую то зацепку.
И находим лишь ящик info@test.lab и по коду страницы понимаем что это WordPress (все просто, содержание каталогов типа wp-content и wp-includes).
Нашли уязвимости:
Видим SQL уязвимость, но из-за того, что Стоит WAF и лочит нас на 1 минуту. Бросаем затею пока не обойдем ВАФ…
________________________________________
Учитесь не упираться в одну точку, а пытаться снова и снова найти векторы и пытаться их эксплуатировать. Как девиз к великому и ужасному OSCP — Try harder!
Для новичков или людей не сведущих — хочу пояснить, может это походит на агонию, но это и есть пентест, дикие, безжалостные попытки найти уязвимость и пытаться эксплуатировать имея только намеки на уязвимость, как это наверное делают настоящие черно шляпники. Может быть с ростом навыка это будет происходить на автомате, но не думаю…
Смотрим на другие открытые порты и Переключаемся на почту:
http://192.168.101.12:8080/mail
В коде находим:
hiden_token=W8EIy6cLMUTzNEmhlujjUXxnJiWoizLf — не все так просто, не подходит. Да и вообще, что бы это значило [˧1D4IQ|g&%2
Дальше находим:
Проверим, что за ip мы обнаружили:
Все фильтруется, не удивительно, ведь мы таких маршрутов не видим.
Пытаемся прогидрить авторизацию:
Пытаемся накидать пост запросы, чтобы получить ответ:
Ищем выводные данные дальше:
Рано радуемся, т.к. запрос не верен.
Все не то, т.к. генерируется токен на каждую сессию. Ищем дальше и пробуем подсунуть токен сессии…
_token=jAf0pA3BamXdvJAVf6KuwJ4AOChtr3rt&_task=login&_action=login&_timezone=Asia%2FAlmaty&_url=&_user=info%40test.lab&_pass=123456
Это безумие, не отканывает из-за плавающего токена сессии. Пробуем другие варианты, у нас есть еще порты 25 и 143…
25:
Бросаем это гиблое дело и переключаемся на брут имапа:
Easy Братцы, 20 секунд и пасс у нас! Кстати пасс взят со статистики топ 10 простых паролей…
Идем авторизоваться к веб-роже RoudCube:
В удаленных находим конфиг vpn.conf
В отправленных — токен и еще одно сообщение:
Good day!
Congratulations on your thirtieth birthday!
Это всё-таки что-то может значить… 2018-30=09.12.1988 или 12.09.1988
Замечаем доменного пользователя sviridov@test.lab
Из 25 тысяч участников и 92 онлайн, лидерами взято уже 5 токенов, а мы только справились с первым. Просто я начал только после рабочего времени, а лабораторная началась в 12 по Москве.
________________________________________
Идем дальше…
Имея vpn.conf на руках, нам нужно подключить еще один TAP-интерфейс для OpenVPNчтобы провалиться внутрь другого туннеля:
Смотрим структуру конфига, это линевый формат для OpenVPN. Переименовываем его в ovpn и пробуем подключиться.
Но, нам нужен логин и пароль.
Пробуем подобрать пароль от найденной в почте учетной записи sviridov@test.lab, ложно думая, что info это групповая рассылка.
4 часа брута — результата нет… Для новичков прошу ознакомиться со статьей по бруту.
Ничего не вышло, пробуем зайти в VPN на удачу под уже найденным пользователем: info@test.lab
И вуаля, вошли.
Смотрим маршруты:
У нас новая сетка 172.16.0.0 и это жесть, 16 маска.
Нашли 4 хоста:
172.16.0.1
172.16.0.10
172.16.0.17 — AD TEST
172.16.2.1
Просканируем на сервисы:
Раздолье прям таки.
Давайте подробнее взглянем на самый интересный:
________________________________________
Пробуем дигом:
Скажу, что я исчерпал свои знания запросов по DNS записям — и нужно было прибегать к дополнительному инструментарию. Антон все же раньше меня нашел данный токен и дал хинт по инструментарию dnsrecon.
Этот NS сервер пустозвонит, пробуем другой:
Записи получены, там же заблудился и токен.
Пока мы копошились, мировые умы ушли далеко вперед, уже 11 токенов взято.
Пройдя этот токен — Мы имеем:
Заносим найденные доменные имена и айпишники в hosts.
Хочу немного пояснить, любая найденная информация на любом этапе может быть полезна, так что не стесняйтесь конспектировать, делать скрины и собирать все малейшие зацепки.
________________________________________
По результатам сканирования портов и определения сервисов, в первую очередь 445 порта,
Пробуем перечислить __SAMBA__
В общем сетка лежит, периодически проблемы с доступностью, попробуем позднее. Прошу обратить внимание на изобилие средств и каждая эта утилита может нам предоставить различный результат.
В итоге нам удается сэнумерейтить юзеров:
Если бы под руками была спарта (Sparta) данный токен был бы найден намного быстрее.
А еще можно использовать и другие средства, например старый добрый LanSpy:
Токен взят… Оба они были почти в одном месте, ну я так считаю и были достаточно простыми.
Мы имеем:
Ну и подведем мини итог по нахождению 3 токенов за прошедшие 2 дня поиска — это 18% на статусбаре
________________________________________
http://helpdesk.test.lab
Визуально только форма авторизации, и по коду 2 изображения имеют 404 ошибку: http://helpdesk.test.lab/footimg.jpg и favicon.ico
Параллельно ищем векторы sqmap’om:
Мап ничего не дал. Все мол чисто и хорошо.
Другие сканеры говорят о том, что на формах присутствует plaintext авторизация и это все, что они видят.
По факту находим только 2 формы
и одна форма выхода, ее не берем в счет.
Составляем список найденных в DNS пользователей, с учетом исключения отключенных и пробуем брутить:
Пробуем зайти туда имеющимся логином и паролем и смотрим на запросы формы http://helpdesk.test.lab/login.php
Попали внутрь. Осматриваемся и ищем векторы.
В этой форме находим скрытый элемент:
<input type=»hidden» name=»id» value=»MTQ1Cg==»>
Сначала думаем, что это токен, но в стринге это число 145 и мы тем самым узнаем IDнашего пользователя info
Там есть еще поле с вводом команды, но по коду видим, что это поле значения login=
Эта форма дает возможность менять пароль текущего пользователя:
т.е. мы проверили совпадение он все таки ищет или есть ли еще один вектор.
Пароль действительно меняется, да и как выяснили с повышенными привилегиями.
Делаем словарь из чисел от 1-1000, преобразовываем в base64 а затем в url encodeчтобы убрать символы =
Дикость, но по факту составив словарь скриптом
а затем получившиеся цифры в base64 построчно и число 145 получается как MTQ1 хотя MTQ1Cg== это тоже при декодинге 145…
Пробуем средствами бурпа:
Все изыскания и попытки состряпать такой словарик потерпел неудачу, т.к. построчный перевод ни батником, ни другими подвластными мне средствами на винде не давался. Даже встроенным функционалом Burp Siute в разделе Payload Intruder не верно делал необходимое.
Есть такой хороший человек с дружественной нам Белоруссии 3n.do — спасибо ему огромное, дал сгенереный словарик скриптом написанный им самим на питоне.
Пройдясь по нему взяв в подбор id мы получили 302 ответ на 2-ух id это MTQ1Cg%3D%3D или наш 145 и NDQwCg%3D%3D — а это новое значение в base64 NDQwCg== или 440
т.е. ID пользователя доступного к смене пароля 440 и нам всего лишь нужно найти логин этого пользователя, ведь пароль ему мы сменили.
Не забываем у нас есть всего пару минут, ведь виртуалка откатывается к первоначальному значению через 3-5 минут.
По предположению это sviridov@test.lab и это было верным замечанием.
Мы видим в Helpdesk следующее:
————————————————————————————————————————————
My Requests
————————————————————————————————————————————
Date Request Status Comment attachment
————————————————————————————————————————————
10.10.10 Access to corporate VPN Done
————————————————————————————————————————————
10.10.10 Restore the password to my corporate network account. Done New password.»значение» Change it!
————————————————————————————————————————————
Токен взят! Самый долгий, жгучий и невыносимый пока что токен. На него было потрачено уйму времени, но тем самым он отложился в голове, думаю и Вам будет полезно.
И пока мы решали этот токен в течении нескольких дней и ночей в Лабе появился лидер, который нашел все токены. Забегая вперед скажу, что по состоянию на 02.01.2019 он пока что единственный собравший все токены. Image токен пока не поддался никому из лидеров.
________________________________________
Когда мы взяли токен HelpDesk и там увидели явный намек, что есть еще один VPN, попробуем его искать большими и долгими всепортовыми запросами:
Это жуть как долго, попробуем ускорить пройдя по портам VPN:
Пока сканируется, мы смотрим на конфиг VPN и замечаем что мы сканим зря, т.к. в конфиге как раз указан UDP порт и IP. Пробуем сократить до имеющихся IP адресов и порт.
Дублируем имеющийся конфиг, меняем IP-адрес и пробуем войти под новым логином.
Мы в сети. Проверяем маршрутизацию и проверяем сетку.
Сеть та же, добавилась еще одна стандартная сетка.
Проверив 24 маску 172.16 находим только 1 новый IP:
Запускаем на скан 16 маску по быстрому:
а затем прогоним на сервисы найденные хосты:
Нашли еще 4 новых IP-адреса.
Лазаем, ищем и если проявим внимательность в маршрутизации, то получим токен.
________________________________________
Давайте подытожим, мы нашли уже 5 токенов, у нас осталось еще 12 заданий и это 30% общего прохождения:
Users, Repository, SIEM, Site, My, API, User API, Image, DB, admin, Reverse
В данном VPN есть еще один маршрут 192.168.0.0/24 и по моему предположению это техническая сетка. Т.к. о ней ни слова и не упоминали в почте, а также смело предположим, что Свиридов как то связан с админами.
За почти неделю, обитая в данной лабораторной, теперь http://my.test.lab стал доступен.
Так же мы видим новые хосты и будем их проверять.
Но для начала составим карту, ведь привычка дело страшное.
чистим вывод от мусора
Скормим nmap
Спарсим в красивый HTML
Ну и смотрим output.html
В целом мы имеем следующую картину:
Так же составляем привычную для нас сетевую карту, не без помощи друзей:
________________________________________
Когда мы получили в VPN попробуем вернуться снова к сайту site.test.lab
Выявлено, что организаторы решили немного усложнить после завершения всех задач победителем лабы CSV.
Они обновили уязвимый плагин с версии 1.1.7 до 1.5.7.8 или wpscan нас дико обманул.
Уязвимости есть, но по-прежнему эксплуатация приводит к бану веб-фаерволом. Ищем дальше.
Так же, хочу отметить тот факт, что при подключении к другому хосту по VPN через Свиридова часть прошлой сетки теряется и мы больше не сможем обратиться к некоторым хостам.
Я добавляю эту уточнение, которое мне лично сэкономила бы кучу времени, если я знал это ранее.
________________________________________
Мы понимаем, что репозиторий это или Веб-сервис или файловая шара. Ищем…
http://172.16.1.15/ но нам нужен логин и пароль — закрыто htpasswd.
Bypass .htpasswd не помог.
Идем дальше…
________________________________________
Мы понимаем, что искать нужно веб-морду сервиса. Ищем…
http://172.16.1.12/
нашли сервис Prewikka, это OSSEC-SIEM https://github.com/Prelude-SIEM/prewikka
Пробуем зайти под имеющимися info@test.lab и sviridov@test.lab
Не отканывает…
Пробуем бурпануть логины и пароль
Адски долго….
Знаете первый раз, я подумал верно, но потратил очень много времени чтобы себя самого запутать и пошел не туда… А ларчик просто открывался по аналогии с предыдущими заданиями, только небольшая ремарка — без доменного имени.
Находим нерабочие агенты, ошибки выполнения скриптов и т.п.
Внимательно анализируем все логи, может и подсказки есть.
Находим подсказки Repository сервис admin:тут пароль и там будет токен от репы…
Как Вы видите, мой напарник Антон вернулся в строй, начал догонять и мы снова работаем командой…
Почему я не открываю токены даже в виде изображений, ребята в SIEM системах, как в корреляторах всех событий можно всегда найти кучу всего интересного, осмотритесь сами, примечайте любую информацию, все что тут будет найдено, поможет очень сильно в дальнейшем.
________________________________________
Осталось 9 заданий: Users, Site, My, API, User API, Image, DB, admin, Reverse
Найдя новые хосты, снова редактируем хостс:
________________________________________
http://my.test.lab/login
Логинимся под infо по аналогии с предыдущим заданием.
Видим пустую страницу и форму поиска. Вбиваем token и видим 5 карликовых лошадок.
Думаем, что тут стеганография. Учитывая тот факт, что первая и последняя одинаковые с разным расширением и тратим драгоценное время на попытки поиска стеганографии.
Но стеганографии тут не найдено…
Анализируем код, пытаемся осуществить инъекцию в поле поиска. Форма отрабатывает пропуская некоторые уязвимости. WAF Nemesida очень мешает.
Очень долго считаю активной уязвимостью XSS и трачу на попытки эксплуатации и проверки слишком много времени…
Натыкаемся на SSTI инъекцию, проверив расчет через {{2*5}} и в поле вывода получаем расчет.
Что мы здесь видим? Явное исполнение кода(на стороне сервера) внутри песочницы.
В зависимости от используемого шаблонизатора, может стать возможным побег из песочницы и выполнение произвольного кода.
Уязвимость часто возникает из-за того, что разработчики дают возможность пользователю изменять шаблон (некоторые шаблонизаторы предлагают безопасный режим для этих целей).
Все функции, которые используют данные введенные пользователем, могут быть уязвимы, в том числе вики-страницы, ревью и комментарии.
Также, причиной уязвимости может быть то, что пользовательские данные вставляются непосредственно в шаблон.
Нам всего-то нужно подставлять конкретные выражения и следить за ответом сервера. В некоторых случаях одно выражение может приводить к разным ответам сервера (в зависимость от того, какой шаблонизатор используется). Например, {{7*’7′}} вернёт 49 значит если используется Twig, 7777777 — если используется Jinja2 и не вернёт ничего, если шаблонизатор не используется.
Для определения существует блок-схема:
Еще можно без прямого обращения к вэб-странице:
но нужна авторизация сессии.
Эксплуатация
После того, как мы выяснили какой шаблонизатор используется, следующий наш шаг — чтение документации. Вот ключевые области на которые стоит обратить внимание:
- раздел «For Template Authors» описывает базовый синтаксис;
- «Security Considerations» — есть огромный шанс, что разработчики не читали данный раздел;
- список встроенных функций, методов, переменных;
- список дополнений/расширений — некоторый из них могут быть включены по умолчанию.
В том случае, если в документации не будет говориться о встроенных переменных, то нам придётся их брутить. Нужные словари находятся в Burp Intruder и FuzzDB.
Я с этим типом уязвимости лично сталкиваюсь впервые, поэтому ушло очень приличное количество времени для поиска информации и чтения документации.
Определим какой тип шаблонизатора у нас:
Видит ответ 7777777 — значит это Jinja2.
Перепроверяем на шаблонизатор Twig — {{self}} и получаем ответ <TemplateReference None>. Значит точно Jinja.
Нашел автоматизацию на гитхабе https://github.com/epinna/tplmap
А вот и первый облом автоматизации:
Пробуем руками
Отлично, request возвращает GET запрос, смотрим окружение:
RCE Инъекция:
не приводит к нужному результату, сервак падает.
Листинг директорий %7B%7B9*9%7D%7D тоже не получается
Получили ‘SECRET_KEY’: ‘UGhldmJoZj8gY▒▒▒▒wYnovcG5lcnJlZg==’
в base64 это Phevbhf? aivfvhz.pbz/pnerref и это Шифр Цезаря Curious? nvisium.com/careers и походит на рекламу
Дает интересную картину:
А вот этот запрос выдает обычный config.
Запросы формируем и пытаемся найти RCE. Но все что мы пробуем WAF Nemesida рубит на корню.
Воспользуемся скриптом https://github.com/noraj/flask-session-cookie-manager
Интересно, eyJyb2xlIjoiYWRtaW4ifQ.DxKl4w.HXIxk2h1dHJQfINRWFxRV8Jh_G4 что это и зачем потратил время незнаю.
В итоге немного поигравшись, находим токен.
Нашел даже отчет из HackerOne, где исследователю удалось найти SSTI в Uber.
Выводы
Уязвимость SSTI действительно очень опасная, так как с её помощью мы можем добиться RCE.
Обнаружить уязвимость очень просто при опыте, но достаточно сложно впервые (хотя часто её можно перепутать с XSS), а вот поиск/разработка полезной нагрузки — очень трудоёмкий процесс (правда, не во всех случаях).
Для меня лично второй по сложности пока что токен, остальные брались немного легче.
________________________________________
У нас есть самая богатая подсеть 192.168.0.0/24 см. карту…
Сканим хосты найденные недавно, пробуем зайти под 445 портами, и под 22 под всеми уже имеющимеся юзерами.
Входим в каждый хост по ssh по аналогии с другими заданиями под имеющимися юзерами.
Ознакамливаемся с мусором, скрипты, логи. Много кто «намусорил», пробуем понять что это и для чего.
Тратим время и в итоге находим вектор:
Вся засада в том, что на отдельном хосте при настройке прав доступа админ совершил ошибку…
Ну и этот токен был не сложен…
Ищем еще что-нибудь полезное по статье с нашего блога
________________________________________
Только сейчас мы возвращается к одному из самых первых сервисов, который мы обнаружили в самом начале.
Найдя информацию в SIEM мы понимаем, что site отдает свою рожу на 3 ip-адреса, добавляем данные в хостс:
Когда мы добавим нужный IP адрес, мы начнем наблюдать такую картину:
Ранее у нас были варианты:
Но как мы помним из предыдущих рассказов — легких путей больше нет…
Пробуем воспользоваться ранее обнаруженной SQL инъекцией. https://packetstormsecurity.com/files/149379/wpsurverypoll1573-sql.txt
Инъекция не классифицирована в CVE, но перечислена в ExploitDB как EDB-ID:45411 и была обнаружена 09.09.2018 и представляет из себя возможность выполнения произвольного кода путем подброса плагину опроса в параметре Cookie wp_sap
Мы сэнумерейтили инфу о плагине:
Судя по мануалу к эксплуатации необходимо:
1. Зайти на сайт и ответить на опрос.
2. Подменить значение wp_sap на [«1650149780′)) OR 1=2 UNION ALL SELECT 1,2,3,4,5,6,7,8,9,@@version,11#»]
3. Обновить страницу и в исходном коде наблюдать версию БД. Дальше на что фантазии хватит.
Покажу для наглядности различный вариант решения имеющейся задачи:
1. Mozilla Firefox
2. Burp Suite
Сам запрос строим так:
Мы получаем версию БД:
10.1.37-MariaDB-0+deb9u1
Следующие и подобные инъекции не прошли:
- 1 and 1=if(load_file(‘/etc/passwd’) is not NULL,1,2)—+
- select username from users where username=1 and if((select concat(version(),0x3a,'<? php code ?>’) into outfile ‘/usr/home/www/test.php’),1,2)=1
по факту мы можем только вываливать инфу, а залить шелл не получается, ну или у меня лично конечно.
Давайте вспомним какие типы инъекций мы еще можем сделать:
Таким образом парсим данные. В итоге, Мы определили:
Путь до БД: /var/lib/mysql
Вресию :10.1.37-MariaDB-0
ОС: Debian 7.6
Директория: /usr/
user: wordpress
system_user: admin@localhost
UUID: d123efe8-0c25-11e9-9d61-080027a476d0
Путь до лога ошибок: /var/log/mysql/error.log
Пароль админа/хеш: admin:$P$B9X4nnQRqJZ6IJISA63PvigcudS2wz1
Еще выявлена непонятная реакция на один запрос:
Скульмапом не удалось найти брешь. Вообще от себя могу сказать, что практически все попытки автоматизации приводят к отказу. Организаторы постарались сделать так, чтобы мы с Вами поднимали свой практический навык путем понимания предмета, а не умением пользоваться сканерами уязвимостей и за это им Огромное СПАСИБО!
Запрос пароля:
Пробуем найти в таблицах по словосочетанию токен:
Токен найден.
Хоть токен и найден, так же есть юзер и хэш пароля, нужно найти еще токен БД. Но явно не в этой БД, а на хосте db.test.lab (172.16.0.30) на который пока нет доступа, и мы не видим даже портов открытых…
________________________________________
В репозитории мы нашли bin файл
Декомпилим его в https://onlinedisassembler.com/odaweb/CEg1sq9j
Далее в бинарнике находим:
Долго думаем, что же мы нашли и где же этот токен.
Пытаемся найти подвох в найденных base64 кусках, но там нет того, к чему мы привыкли решая CTF ранее.
Опять долго думаем, а причина в том, что нужно обладать навыками дизасемблирования, чтобы легко и не принужденно выполнить это задание. Ну и вспомним, что даже самые умные пользуются подсказкой — «помощь друга», в телевизоре видел, «звонок другу» называется…
Один из англоязычных участников, дал небольшой хинт нашему знакомому 3n.doc, который в последствии привел в соответствие полученный хинт: переведу как смогу — По коду идёт проверка cmp dl, al — в ал уже готовый аски код символа. Так нам 32 раза нужно его словить и мы получим токен.
Ну что, приступим к разбору. Есть наборы символов по 32 в строке: Точка старта: …aad4 (MAIN)
из которых один из символов соответствует одному из символов пароля.
После передачи в регистры данных о тексте и получения введенного пароля, программа проверяет каждый фрагмент посимвольно, стараясь запутать хакера.
Чтобы отловить посимвольную передачу, надо поставить брейкпоинт или так называемую «точку останова» на функции: «cmp dl, al», где dl — значение символа из нашего пароля, а al значение из «Нужного пароля»:
После установки брейкпоинта делаем старт программы и ждем, когда она остановится на этой точке:
Пароль запросило, вводим произвольный. В моем случае 1111111111111111111111111111111111111111111111111111111111111111 😀
Отлично, брейкпоинт словил сравнение пароля, как видно ниже: al = 0x62, а dl = 0x31, в частности, если пойти на следующий шаг, программа закроется с выводом ACCESS DENIED, так как символ не совпадает.
Меняем значение нашего RDX(Нашего символа в регистре) на нужные (62 в таблице) 0x62 и делаем следующий шаг:
Очередной символ и та же самая операция.
Итого 32 символа.
Конвертим из хекса в текст и получаем токен.
________________________________________
Сам хост 172.16.0.20 db.test.lab — не сканируется в vpn сети.
Еще в репозитории мы нашли client.jar.
В найденной JAVA client.jar находим main.java:
———————————————————————
Такс, это консольное приложение.
Вначале задаются параметры для SSL соединения — keystore(собственные ключи и сертификаты) и truststore(корневые сертификаты доверенных издателей).
На консоль выводится 4 пункта для выбора пользователя, в зависимости от введенной цифры инициализируется объект тип reqvest, этот объект используется
для формирования JSON объекта.
Если ввели 1, то формируется такой JSON Stirng:
Подымается SSL соединение с хостом 172.16.0.55 по порту 5074. На этот сокет отправляется сформированная строка содержащая JSON структуру. Выводится в консоль результат и выполнение программы завершается.
IP указанный там 172.16.0.55 не сканируется, нужно попробовать переписать коннектор для подключения к БД 172.16.0.30. Но пока это только мои предположения.
—————————————————————————
Еще данные о неком домене в tr_cl:
—————————————————————————
https://onlinedisassembler.com/odaweb/M35YYUkX
Пробуем подрубиться с разных подсетей и хостов к которым уже был доступ при прохождении токенов.
А еще, очень Важно обратить внимание на пользователей указанных в коде new Reqvest(«info»); и второго. Пройдя такой путь, мы понимаем, что такие пользователи фигурировали только в токене подсети 192.168… где мы находили в /etc/cron.weekly задание man-db и другие зацепки типа:
Подключаемся к хосту и щупаем коннект:
Замечательно, порт открыт но брыкается. Пробуем пробросить порт:
Когда подберем логин и пароль верный из прошлых, попадем:
Грепаем и думаем, что токен где-то на поверхности, как и юзер токен. Ан нет…
Пробуем подрубиться к БД:
Многочисленные попытки подключиться к БД с проброшенного порта отбривали и я понял, что выход только подключение через коннектор client.jar т.к. в нем есть серт и нужен коннект через SSL по TCP. По коду виден и пароль подключения и пароль сертификата и пользователи под которыми можно подрубаться. Мои неважные знания java только усугубляли ситуацию.
Еще один очень хороший человек — cutoffurmind давал не просто подсказки, а в принципе стал наставником в выполнении предстоящих работ. Он является разработчиком, в том числе на java и для него этот токен был не столь сложен, для меня токен и дорога к нему вообще сравнима с безумием. Представлю ниже его решение.
Немного замудрено все, но весело)
Вкратце — Для удобства декомпилил jar, потом загнал код в IDE, можно в eclipse или idea.
По сути клиент перегоняет json на сервер, в параметре там и есть инъекция. Тут или каким-то другим клиентом коннектиться и вручную высылать данные, что будет сложно, нужно учесть сертификат ssl и пароль к нему.
Итак:
Декомпилим jar на http://www.javadecompilers.com
Импортируем полученную папку с исходниками в intellij idea или eclipse. У меня intellij idea
import project
from existing sources
!Нужно, чтобы на компе был настроен java sdk
Получаем проект:
На 82 строке в main декомпилер натворил дел и исправляем это:
Должно быть:
Пытаемся сбилдить проект и получаем ошибку в файлах json библиотеки:
Декомпилер там что-то тоже повредил, поэтому удаляем org.json.simple из проекта:
Идем в настройки проекта или F4:
Во вкладке modules — dependencies жмем внизу плюсик:
Выбираем первый и указываем изначальный client.jar. Сохраняем и видим, что import org.json.simple.JSONObject; в Reqvest.java больше не ругается.
Дальше пробрасываем 172.16.0.55 5074 через ssh себе на локалхост:
ssh -L 5074:172.16.0.55:5074 info@192.168.0.100
Идем в Main.java и меняем адрес подключения:
Пробуем запустить:
Жмем 2 и получаем список из хелпдеска:
Ничего примечательного, ожидал большего 🙂
А именно данный конструктор:
Пробуем так:
Запускаем, жмем 2, видим что запросов нет, попробуем подобрать через union select:
Вуаля!
Дальше через information_schema узнаем о таблице token с полем token и забираем его…
Благодарим cutoffurmind за представленное решение!
________________________________________
Ну что, осталось 4 токена: API, User API, Image, Admin
Сразу скажу, что мне осталось 4 токена, дальше пойдет сумбур информации, т.к. пока общая картина у меня в голове не собрана. По мере получения токенов, буду корректировать статью.
________________________________________
Гуляя по сетке натыкаемся на сервис
http://172.16.1.20:8000
Проверим субкаталоги:
Как мы видим только 2 формы contact и support откликаются без ошибок.
http://172.16.1.20:8000/contact
"Contact support team if you have any problems with the service." http://172.16.1.20:8000/support
— тут какая то стеганография 4 разных изображения с одним и тем же значением support_team
Внимательно анализируем основную страницу:
Вот полный код:
Ищем пути и подходы:
Пробуем сходить в почту и проверить догадки:
Пробуем проэксплуатировать:
http://172.16.1.20:8000/get_user_list?login=root&password=12345678
«Incorrect login or password!»
У же лучше.
http://172.16.1.20:8000/recover_password?login=info&user=info
«Restricted area, use valid credentials!»
Тут можем попробовать подобрать логин. Составил словарик с имеющихся юзеров и всех паролей и токенов добавив к стандартному словарику и Бурп не дал результата. Ищем дальше…
Раз стандартные словарные пользователи и все имеющиеся у нас не брутятся, пробуем предположить что найденный support_team это юзер. Тут же понимаем после брута паролей, что нужно пробовать стандартную уязвимость с кавычкой и видим следующее:
Мы получили целую кучу юзеров (221 шт.), теперь попробуем воткнуть списки в рекавери.
Так ответ 200 для всех, пробуем поиграть с поиском пары user/ login… это не быстрый процесс…
Нужно попробовать Patator. Нашли…
Пробуем восстановить пароль для найденной пары:
Как только мы сменили пароль, вся сеть отвалилась, думаем…
В итоге пробовал использовать полученный логин и пароль для авторизации: уточнение, указанный пароль на скриншоте подменен на другой для сокрытия токена, получите его сами, для того, чтобы закрепить предмет.
Любой пароль в форме /login выдает такой токен. Значит эта пара не сюда.
Ищем дальше и решаем DB…
Вчера, имея в руках пароль и попробовав авторизоваться мы получали нулевой токен. Сегодня утром, еще один хороший человек с компании Pacifica — Кайрат нашел решение иным путем, она написал скрипт на питоне:
Который автоматизировал поиск пары логина и юзера. Вспомните как долго у нас искал Burp Suite.
Далее нам всего лишь остается правильно сконвертировать пароль в URL т.к. он имеет спецсимволы и токен у нас…
Осталось 3 токена: API, Admin, Image
________________________________________
Натыкаемся еще на один упущенный айпишник: 172.16.2.16
Думаем, что можно сделать.
Нашли 2 странички: auth и search в 405 ошибке…
Странно, что ответ получаем разный.
Нам нужен ключик лицензии (русский язык все же не всю суть отражает). Будем искать.
Есть неплохая мысль которую сгенерил на днях Кайрат— нужно играть с куками. Мне кажется, что на хосте my.test.lab есть еще что-то, чего мы не видели. Нам в итоге не удалось раскрутить SSTI на RCE в браузере, но можем пробовать под админом зайти или использовать куки.
Для работы с кукарями пользуйтесь лисой (Mozilla Firefox) — F12 — сеть или расширение к лисе еще можете бурпом или плагином для иного браузера.
скриптом https://github.com/noraj/flask-session-cookie-manager :
ну или
и вставим в результат:
и мы получили ключики:
Большая загадка, как вставить ключики в http://172.16.2.16:8000/auth POST запросами и другими не выходит.
А еще мы понимаем, что в куках есть SSTI уязвимость:
хз как, но ваф блочит тэг <?php ?> и как его обойти пока что загадка…
Кайра пробился в куки:
По этой статье https://github.com/swisskyrepo/PayloadsAllTheThings ищем Jinja2 — Remote Code Execution via reverse shell и находим, что с помощью ».__class__.__mro__[1].__subclasses__() можно посмотреть все подключенные классы.
Подставляем вывод в куки и видим:
Далее дампим вывод в файл и ищем индекс интересных библиотек.
(find.py)
Вывод:
Видим, что у нас есть subprocess.Popen значит можем сделать RCE. Для начала, запишем команду вывода /etc/passwd в конфиг и включим его в глобальный конфиг:
Подставляем куки, и видим что процесс выполнился:
Попробуем включить конфиг:
Пробуем обратится к нашему параметру,
и вуаля RCE!
Видим юзера flask-api:x:1001:1001::/var/www/api:/bin/false и пробуем посмотреть его файлы:
В дело включился cutoffurmind и пробился благодаря статье https://stackabuse.com/python-list-files-in-a-directory
Идеально.
Дальше рыскаем по серваку, что там еще есть.
Прокся? это интересно, но видимо не для нас.
Снова подгружаем наш конфиг, и пробуем обратиться к нашей переменной. Крутяк, нашли файл токен
Теперь прочитаем:
Снова подгружаем наш конфиг, и пробуем обратиться к нашей переменной.
Задание выполнено и флаг у нас:
Tips — ищите токен, он в /var/www/api/token.txt
Меня лично к этому жизнь не готовила, забираю свои слова — этот токен был намного сложнее всех…
________________________________________
У нас осталось 2 токена: Admin и Image
________________________________________
Заблудился где-то на уровне хоста 172.16.1.25, который так и называется admin.test.lab, но для коннекта по SSH нужен ключик, мы его нашли но пока коннект не обеспечен. Есть мысли, что этот хост судя по найденным данным в SIEM имеет клиента для сием, может через него попробовать подрубиться или запросами получить данные, а может ранее найденные сертификаты на хостах с SSH и есть ключ к которому нужно сделать пару. Еще будем пробовать найти зацепки на хосте my.test.lab…
Пробуя найти информацию на хосте my.test.lab используя RCE через куки,
Нашли много информации, пытались ее вытаскивать, но как Вы понимаете без прямого доступа постоянно формируя куки — это сравни безумия.
Кайрат вытащил все таки эту api.db:
Вытащил таблицы:
Нашли скрипт api.run.py, в котором находим интересные строки:
И тут, снова, Кайрат выдает нам сюрприз:
В коде просят токен в качестве куки, и если токен от админа качается файл:
Вот, что животворящие знания питона вытворяют. Гениально, Кайрат!
А там архивчик с ключиком! Это именно то, что мы так долго искали. Это скорее всего как раз ключ для подключения к хосту admin.test.lab. Пробуем…
Сначала сформируем правильный ключик, дадим на него права
Затем пробуем:
Нужны корректные права. попробуем по имени хоста.:
Пробуем менять права:
Затем меняем права на своего sshd клиента и так далее…
Стоит предположить, что скорее всего ключ не полный, нам нужно подобрать алгоритм ключа. Пойдем в SIEM и посмотрим в логах, мы помним, что там был этот хост.
Еще раз обращаем внимание на содержание оригинала ключа из архива token.gz и видим, etc/id_rsa
Создаем такую папку у себя, если ее нет и даем на нее права.
Делаем небольшие корректировки в ключе:
Пробуем снова:
И опять ничего хорошего…
В итоге в голову 3n.do приходит умная мысль — пробовать под авторизацией, пробуем admin, root, info и дальше по списку имеющихся у нас учеток — так же. В итоге находим точку входа:
УРАААА товарищи!
Рыскать бессмысленно, права урезаны, давайте глянем на authorized_keys
________________________________________
У нас осталось последний токен —
________________________________________
Image токен либо кроется в найденных QR картинках (Barcode), которые по факту были расшифрованы как support_team, либо в лошадках, чего я там не нашел, в потерянном на сайте изображении или в изображении которое мы еще не видели. Но могу предположить, что это стеганография и это именно лошадки, но все известные мне пути вытаскивания информации с фото-стеганографии не идут в счет, т.к. помним, что все великие умы взявшие 15 из 16 токенов в первую неделю, около 10-15 дней бились в конвульсиях чтобы найти этот токен!
Не стану отражать весь процесс поиска используя XNView, strings, steghide, ImageSpyer, архиваторы и мой любимый инструмент — Stegsolve.jar используя вымещение всех альфа каналов и т.п.
Я этих пони и в хвост и в гриву стегсолвил — ну нету в них ничего, реально для отвода глаз видимо.
Вспоминаем, какие еще у нас есть изображения — Barcode их аж 4 штуки. Давайте прогоним их в Stegsolve.jar:
в первом изображении support.png видим смещение офсета в 4 из 60 вариаций.
во втором изображении support.png нет смещения офсета из 599 вариаций.
в третьем изображении support.png смещение офсета в 4 из 220 вариаций.
в четвертом изображении support.png смещение офсета в 3 из 75 вариаций.
Пытаемся понять закономерность и логику, подставляя каждый полученный результат в онлайн баркод ридеры.
Понимаем, что 3 из 4 изображений имеют смещения в 1 шаг и в процессе режут изображение под типом flattermarken.
У нашего товарища cutoffurmind появилась идея отчистить изображение от лишнего мусора.
Если image берется по flattenmarke, то это в баркоде который mini pdf417
Если убрать все лишнее получатся такие линии
Насколько я понял Flattenmarken разбивает изображение на равные куски для каждого закодированного числа
И если 1111 это
то 1311 это
Сместили на 3 пикселя из-за значение цифры.
В генераторе который я нашел там изображение получается шириной кратной 18, но в баркоде ширина 220.
На этом изыскания завершились…
Итак, звонок другу у нас был, давайте попросим подсказку — помощь зала!
Помните, что мы не одни в этом жутком мире, есть товарищи и коллеги по цеху.
В целом идея в следующем: Нам нужно написать скрипт отчищающий все от мусора, потом циклом разобрать очищая от пустышек в виде 255,255,255 — обрезать содержимое очищая от нулей и по-буквенно заполнить вывод.
Вот вывод одного из кодированных изображений такой:
Делаем чистку и получаем:
Брюки превращаются:
#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒
Немного по играясь скажу — что мы и Вы на верном пути, токен ТУТ, он где-то рядом! Автор скрипта очень хороший и отзывчивый
________________________________________
В целом я очень доволен нашим результатом, меньше месяца и мы победили ее, я завершил последний токен 14-м!
Хочу пожелать организаторам никогда не останавливать эту пищу для мозга, которая так нужна всем молодым и растущим безопасникам, аналогов которой нет в просторах интернета, за что команде Pentestit спасибо! Но я бы хотел конечно видеть в личном кабинете хотя-бы занимаемое место.
Так же хотел отметить, что неважно насколько Вы считаете себя умным, помните — только команда специалистов может привести к верному результату, ведь Вы никогда не будете подготовлены во всех областях сразу. Как и команда из Codeby взявшая 2-5 места, мы и наши новые друзья с России, Казахстана, Белоруссии только сплочившись нашли различные варианты решений имея разные взгляды на задачи. Еще раз большое спасибо 3n.do, cutoffurmind, Кайрат, ну и конечно же взявшему второе место BadBlackHat, с которым познакомились уже по завершению лабаратории. Все ребята проявили отзывчивость, умение работать в комманде и целеустремленность, низкий Вам поклон
Ну и Вам, кто дочитал все эти умозаключения до конца большое спасибо, растите умственно, становитесь безопаснее с нами… да и совсем забыл, Соблюдайте законодательство, никогда не используйте свои навыки во вред и злонамеренно и эта статья лишь прохождение лабораторной работы и написана для ознакомления.
Ну и напоследок, не думайте, что это так сложно, как Выучить C++ за 21 день. Всегда стремитесь и Вас всегда будет ждать успех!
автор: Станислав Истягин
https://securixy.kz/hack-faq/pentestit-lab-12-prohozhdenie.html/