В данной статье мы разберемся с эксплуатацией некоторых 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 будет непустой.
Но при первой проверке, если сессия админа не установлена, нас переадресуют на эту сраницу без параметров.
Нужно просто воспользоваться web-агентом не браузером, к примеру curl.
Забираем пароль.
level 23
Анализируем исходный код. Функция strstr(s1, s2) возвращает подстроку из s1, которая начинается с s2. Так же php автоматически приводит типы. То есть при сравнении она приведет строку в число и отбросит лишние символы.
Под наше условие подойдет строка «11iloveyou». При первой проверки вернет «iloveyou», т. е. True. При второй проверке 11>10, т. е. True.
level 24
Этот уровень тоже содержит логическую ошибку. Условие проходит в любом случае, если strcmp вернет FALSE. Но strcmp вернет FALSE даже в случае ошибки.
Хоть php и приводит типы автоматически, но привести массив к строке не в состоянии. Для этого нужно открыть исходный код страницы и изменить имя поля с «passwd» на «passwd[]».
Отправляем любую строку.
Забираем пароль.
level 25
Наибольший интерес при анализе исходного кода вызывает функция logRequest(), в ней обрабатываются поля, которые может контролировать пользователь. Это HTTP-заголовок User_Agent и cookie session_id.
Стоит учесть, что из строки удаляются все последовательности «../», но это обходиться путем: «..././» => «../».
Идея решения: Так как путь для записи логов зависит от session_id, который мы можем конролировать, а за счет выбора языка отоброжения выбирается путь на сервере – за счет LFI мы сможем прочитать файл логов.
Теперь осталось записать пароль из /etc/natas_webpass/natas26 в наш файл логов. Так как сначала записывается, а потом выводится из файла наш Web-Agent, то допишем в это поле php код.
Получаем пароль.
level 26
В данном примере присутствует очень серьезная уязвиммость – нефильтрованная дессериализация обьектов. Функция unserialize() принимает одну сериализованную переменную и конвертирует её обратно в РНР-объект.
Возвращается конвертированное значение, которое может быть integer, float, string, array или object. Т.е. Можно выполнить любой код. Класс Logger при создании записывает в файл определенную информацию.
Идея следующая:
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)));
?>
Получаем пароль.
level 27
Данный сервис предоставляет данные пользователей. Но если пользователя не существует, он создает его с указанными логином и паролем.
Проблема в том, что после создания пользователя, сервис не проверяет его пароль при входе. При этом в базу даныых попадают лишь 64 первых символа логина и пароля после фильтрации. Мало того мы знаем имя пользователя: natas28.
Создаем пользователя с пустым паролем и именем: «natas28_60-пробелов_любой-символ». (Так при проверке не будет совпадения с пользователем natas28, а при создании будет отфильтрован и добавлен в базу. То есть при следующем заходе не будет проверяться пароль).
Заходим под именем natas28 и пустым паролем. Получаем данные пользователя natas28.
Продолжение следует. Вы можете присоединиться к нам в Telegram.
Автор: RalfHacker