• 🚨 24 часа до повышения цены на курс «Пентест Active Directory: от теории к практике» от Академии Кодебай

    🔍 Изучите реальные техники атак на инфраструктуру Active Directory: от первоначального доступа до полной компрометации.
    🛠️ Освойте инструменты, такие как BloodHound, Mimikatz, CrackMapExec и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальные сценарии атак.
    🧠 Получите знания, которые помогут вам стать востребованным специалистом в области информационной безопасности.

    Последний день записи в текущий поток по старой цене Подробнее о курсе ...

Writeup Квантовый прорыв WriteUp — полный разбор CTF-задачи

kovalyoff

One Level
29.08.2023
2
10
1749568667986.webp


Честно, попыхтел над этой задачкой с hackerlab. Хотя, по сути, и пыхтеть-то было не над чем — лол.

Айпи переводит нас на сайт. На первый взгляд — ничего особенного, просто текст. Нас интересует вкладка "Контакты".

1749568726884.webp

1749568816381.webp


Первое, что приходит в голову — ввести рандомные данные в поля и нажать "отправить сообщение". Так и делаем. В ответ — привычное:
"Спасибо за ваше сообщение! Мы свяжемся с вами в ближайшее время."
А что же происходит в этот момент "под капотом"?

1749568998333.webp


В поле response видим base64-код. Декодируем — получаем HTML-страницу с заглушкой Cloudflare. Я ввел сайт lol.com, видимо, сервер решил, что мы лезем куда не надо. Но раз появляется заглушка, значит, поле "ваш сайт" отправляет запрос на указанный URL. А что если попробовать направить его на самого себя?

Вводим 127.0.0.1 и...

1749569541839.webp


Создатели явно предусмотрели такой вариант — защита сработала. Но мы не сдаемся. Попробуем обойти это ограничение.
Если 127.0.0.1 не работает, пробуем 127.1 и указываем порт. Сканирование показало, что порт 8000 открыт.

Вводим: http://127.1:8000/

1749569921493.webp


Опять сообщение:
"Спасибо за ваше сообщение".
Запрос сработал, а в ответ снова прилетает base64. Расшифровываем — и вот она, HTML главной страницы. Выходит, сервер возвращает содержимое запрашиваемой страницы.

На этом моменте я немного застопорился. Ну получил я HTML — и что дальше?

Но потом случилось буквально библейское чудо. Присел покурить, наблюдаю за птичками... случайно уронил сигарету на ногу — и тут меня осенило. 🤯

Если мы получаем главную страницу, то, возможно, можем получить и другие — например, contacts или about. Хотя они вряд ли что-то дадут. Значит, ищем скрытую директорию. Запускаем фаззер и получаем:
1749570331980.webp


Есть директория /secret, но статус у неё — forbidden. Пробуем зайти туда:

1749570388918.webp

Ну, кто бы сомневался. Понятно, что именно там и лежит флаг. Но вряд ли он просто в HTML. Скорее, это отдельный файл.

Допустим, попробуем: http://127.1:8000/secret/main.js

В ответ снова base64 → html, в котором написано:
PHP:
<title>404 Not Found</title>
<h1>Not Found</h1>
<p>The requested URL was not found on the server...</p>
И вот это сообщение — ключевое! Оно генерируется Flask, а значит, логично искать .py файл!

Пробуем main.py — опять 404. Тупик? А может и нет...

Если бы мы хотели напрямую попросить файл у сервера, использовали бы file:///, но есть одно но: поле "ваш сайт" принимает только адреса, начинающиеся с http:// или https://.

Тогда — хитрый ход. Делаем запрос вида: http://127.1:8000/secret?url=file:///app/main.py

(логично предположить, что main.py — основной файл)

Отправляем. В ответ — снова base64. Декодируем... и внутри — флаг!

Возможно, райтап получился немного сумбурным, но это мой первый пост на форуме, так что не судите строго :)
 
Спасибо за статью! Вопрос:

почему такой ip адрес корректно воспринимается браузером, к тому же является вектором атаки?
Спасибо за вопрос.
Если мы посмотрим на двоичное значение адреса 127.0.0.1, учитывая стандартный, состоящий из четырех октет, dot-decimal nonation, то получим 01111111.00000000.00000000.00000001. Но парсер браузера умеет работать с IP состоящим не только из четырех октет. Если мы возьмем всего лишь две октеты (то есть 127.1), то у нас получится 01111111.000000000000000000000001. А далее все просто - браузер с помощью функции inet_addr просто пересоберет и подгонит его под привычный 127.0.0.1. По сути, в результате такой махинации двоичное значение IP адреса не меняется, а браузер сам знает, как преобразовать его в нужный формат.
Почему это вектор атаки? Потому что в случае данной задачи фильтр, скорее всего, предусматривал только запрет на ввод 127.0.0.1, а вот 127.1 вообще не предусмотрен.
 
  • Нравится
Реакции: f22, And4R и N1GGA
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Курс AD