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

в 11:35, , рубрики: ctf, Natas, php, python, ralf_web, sql, информационная безопасность

image

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

Прошлые части: часть 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

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

image

level 24

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

image

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

image

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

image

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

level 25

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

image

image

image

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

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

image

image

image

image

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

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{
	private $logFile;
	private $initMsg;
	private $exitMsg;
	
	function __construct($file){
		$this->initMsg="<? passthru('cat /etc/natas_webpass/natas27'); ?>";
		$this->exitMsg="<? passthru('cat /etc/natas_webpass/natas27'); ?>";
		$this->logFile = "img/phpobjinj.php";
	}
	
	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_60-пробелов_любой-символ». (Так при проверке не будет совпадения с пользователем natas28, а при создании будет отфильтрован и добавлен в базу. То есть при следующем заходе не будет проверяться пароль).

image

image

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

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

Автор: RalfHacker

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js