Хабрахабр

Natas Web. Прохождение CTF площадки, направленной на эксплуатацию Web-уязвимостей. Часть 4

image

Каждый уровень имеет доступ к паролю следующего уровня. В данной статье мы разберемся с эксплуатацией некоторых WEB-узвимостей на примере прохождения варгейма Natas. Например, пароль для natas5 хранится в файле /etc/natas_webpass/natas5 и доступен для чтения только для пользователей natas4 и natas5. Все пароли также хранятся в файлах /etc/natas_webpass/.

Прошлые части: часть 1, часть 2 и часть 3.

Организационная информация

Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.

Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем. Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ.

Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Вся информация представлена исключительно в образовательных целях.

level 22

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

image

Но при первой проверке, если сессия админа не установлена, нас переадресуют на эту сраницу без параметров.

image

Нужно просто воспользоваться web-агентом не браузером, к примеру curl.

image

image

Забираем пароль.

level 23

Анализируем исходный код. Функция strstr(s1, s2) возвращает подстроку из s1, которая начинается с s2. Так же php автоматически приводит типы. То есть при сравнении она приведет строку в число и отбросит лишние символы.

image

При первой проверки вернет «iloveyou», т. Под наше условие подойдет строка «11iloveyou». True. е. е. При второй проверке 11>10, т. True.

image

level 24

Этот уровень тоже содержит логическую ошибку. Условие проходит в любом случае, если strcmp вернет FALSE. Но strcmp вернет FALSE даже в случае ошибки.

image

Для этого нужно открыть исходный код страницы и изменить имя поля с «passwd» на «passwd[]». Хоть php и приводит типы автоматически, но привести массив к строке не в состоянии.

image

Отправляем любую строку.

image

Забираем пароль.

level 25

Наибольший интерес при анализе исходного кода вызывает функция logRequest(), в ней обрабатываются поля, которые может контролировать пользователь. Это HTTP-заголовок User_Agent и cookie session_id.

image

image

image

Стоит учесть, что из строки удаляются все последовательности «../», но это обходиться путем: «..././» => «../».

Идея решения: Так как путь для записи логов зависит от session_id, который мы можем конролировать, а за счет выбора языка отоброжения выбирается путь на сервере – за счет LFI мы сможем прочитать файл логов.

image

image

image

image

Так как сначала записывается, а потом выводится из файла наш Web-Agent, то допишем в это поле php код. Теперь осталось записать пароль из /etc/natas_webpass/natas26 в наш файл логов.

image

image

Получаем пароль.

level 26

В данном примере присутствует очень серьезная уязвиммость – нефильтрованная дессериализация обьектов. Функция unserialize() принимает одну сериализованную переменную и конвертирует её обратно в РНР-объект.

image

Т.е. Возвращается конвертированное значение, которое может быть integer, float, string, array или object. Класс Logger при создании записывает в файл определенную информацию. Можно выполнить любой код.

image

Идея следующая:
1) Переписать класс Logger, где вместо одного из сообщений будет содержаться php-код, который будет выводить пароль.
2) Закодировать его в Base64.
3) Вставить в cookie.
4) Обратиться к файлу с логом.
5) Забрать пароль.

<?php
class Logger function log($msg){ ; } function __destruct(){ ; }
} $obj = new Logger("obj");
echo urlencode(base64_encode(serialize($obj)));
?>

image

image

image

Получаем пароль.

level 27

Данный сервис предоставляет данные пользователей. Но если пользователя не существует, он создает его с указанными логином и паролем.

image

При этом в базу даныых попадают лишь 64 первых символа логина и пароля после фильтрации. Проблема в том, что после создания пользователя, сервис не проверяет его пароль при входе. Мало того мы знаем имя пользователя: natas28.

image

(Так при проверке не будет совпадения с пользователем natas28, а при создании будет отфильтрован и добавлен в базу. Создаем пользователя с пустым паролем и именем: «natas28_60-пробелов_любой-символ». То есть при следующем заходе не будет проверяться пароль).

image

image

Получаем данные пользователя natas28. Заходим под именем natas28 и пустым паролем.

Вы можете присоединиться к нам в Telegram. Продолжение следует.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть