May 20

День 44. "Хаос на АЗС" hackerlab.pro

CTF Write-up | «Хаос на АЗС» — hackerlab.pro

Заправка. Flask. Werkzeug. Выглядит скучно — внутри полный хаос.


Цель: 62.173.140.174:16109 Флаг: CODEBY{FU3L_B4CKUP_0WN3D}


[1/5] Захожу на территорию

nmap — живёт HTTP на Werkzeug 3.1.5, Python 3.11.6. Титул страницы: «AZS LEET». Окей, посмотрим что тут за лит-заправка.

Перебираю маршруты — /admin, /admin/fuel, /admin/backup, /admin/secret — всё редиректит на /adminLogin. Единственная открытая дверь. Стучимся.


[2/5] Приложение само сдаёт своих пользователей

Пробую случайный логин — User does not exist. Пробую operatorCheck username or password.

Стоп. Это разные сообщения. Приложение буквально говорит мне кто существует, а кто нет.

ffuf + SecLists, фильтрую по User does not exist — остаётся только то, что нашлось:

operator   → секция Fuel
superadmin → секция Secret

Два юзера. Меньше минуты.


[3/5] 42-я попытка

Берём darkweb2017_top-100.txt — самые позорные пароли планеты Земля. Запускаю ffuf на operator.

На 42-й итерации — HTTP 302. Редирект на /admin/fuel.

Пароль: qwe123. Серьёзно.

Куки в кармане. Захожу в панель управления.


[4/5] А вот это интересно

Смотрю исходник /admin/fuel. Форма с ценами — скучно. Но ниже:

html

<form method="post" action="/admin/backup"
      enctype="multipart/form-data" hidden>
  <input type="file" name="sqlfile">
</form>

hidden. В браузере не видно. Для обычного юзера — не существует. Для curl — прекрасно видна.

GET /admin/backup — сервер любезно отдаёт полный SQL-дамп. С таблицей users. С хешами паролей. Всех.

sql

INSERT INTO "users" VALUES('Secret','superadmin','d9e9fece...');

Что за хеш? Знаю пару qwe123 → b6a2976b... — проверяю схемы. SHA256 — мимо. MD5 — мимо. SHA256(SHA256(pass)) — попадание. Без соли. Классика.

Генерирую хеш для нового пароля pass123, создаю файлик:

sql

UPDATE users SET password='826ec584...'
WHERE username='superadmin';

Загружаю через скрытую форму:

bash

curl -b /tmp/cookies.txt \
  -F "sqlfile=@inject.sql" \
  http://62.173.140.174:16109/admin/backup

Сервер принимает. Выполняет. И — вишенка на торте — возвращает обновлённый дамп, где хеш superadmin уже мой.


[5/5] Заезжаю на секретную заправку

section=Secret&username=superadmin&password=pass123

HTTP 302 → /admin/secret → открываю страницу →

CODEBY{FU3L_B4CKUP_0WN3D}

Заправка наша.


Цепочка целиком: nmap → User Enum → брутфорс → скрытая форма → SQL-дамп с хешами → inject.sql → смена пароля superadmin → флаг

Ни одной экзотической техники. Только невнимательность разработчика — и четыре дыры выстроились в прямую дорожку к флагу.


Уязвимости: User Enumeration / Weak Password / SQL Dump Exposure / Arbitrary SQL Execution / Unsalted Double SHA-256


Основная группа обучения ИБ
Lab-группу с полезным софтом / книгами / аудио.
Чат для обсуждений, задавай свои вопросы.
P.S. С вами был @Fnay_Offensive
До новой встречи, user_name!