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

image

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

Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

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

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

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


level 11


Разбираем код:

  1. пароль будем доступен, если значение из массива data по ключу showpassword будет «yes»;

    image

  2. массив data создается функцие loadData, в которую в качестве параметра передаются данные по умолчанию;

    image

    image

  3. функция loadData загружает значения data из cookie (кодирует data в base64, шифрует xor на неизвестном ключе, декодирует данные в формате json);

    image

    image

  4. устанавливает полученные значения.


Что же нужно сделать:

  1. восстановить ключ XOR шифрования:
    • взять зашифрованные данные из cookie;
    • декодировать base64;
    • закодировать данные по умолчанию в json формат;
    • проксорить полученные сроки.
  2. закодировать и зашифровать по обратному алгоритму новые данные, где showpassword == yes;
  3. вставить новые данные в cookie и перезагрузить страницу.


image

"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

image

level 12


При сохранении файла на сайте, он сохраняется под случайным именем и расширение JPEG. Но самое главное, что это имя формируется и предоставляется пользователю в скрытом поле формы hidden еще до выбора файла, а после — вместе с файлом отправляется на сервер.

image

Задача: cоздать php-shell, перехватить запрос на сервер и
изменить имя файла на *.php.


image

Используем Burp Suite: Выставляем настройки прокси браузера на 127.0.0.1:8080. Отправляем shell. Во вкладке Proxy подменяем запрос.

image

image

image

Обращаемся к своему файлу на сервере, передавая команды в командную строку через параметр cmd.

cat /etc/natas_webpass/natas13


image

Данный вид уязвимости относится к категории Unrestricted File Upload.


Для создания Shell`a лучше всего использовать константы php, так как выполнение системных функций может быть запрещено настройками сервера.


level 13


При сохранении на сервер того же самого shell`a, нам говорят, что это не изображение. Анализируем код.

image

Присутствует функция exif_imagetype.

image

image

Для проверки JPEG файла данная функция использует внутреннюю функцию is_jpeg, которая проверяет первые четыре байта файла.

image

Дело в том, что интерпретатор языка php выполняет код, который находится между , пропуская все остальные символы. Откроем shell прошлого уровня в hex редакторе и допишем в начало файла байты 0xFFD8FFE0.

image

Отправим на сайт по аналогии с прошлым уровнем и получим пароль.

image

level 14


Обычная ошибка в форме авторизации. Запрос к БД:

SELECT * from users where username="username" and password="password";


image

Есть возможность сделать запрос всегда истинным: login = «admin» or 1=1 — ».

image

В таком случае or 1=1 возвращает истину, а остальная часть запроса комментируется:

SELECT * from users where username="admin" or 1=1;


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

image

Данный вид уязвимости относится к категории SQL Injection.


level 15


На данной форме разберем работу sqlmap. Отправим запрос и перехватим данные и заголовок HTTP.

image

image

Выбираем из заголовка только необходимую информацию. В данном случае: User-Agent, Referer, Authorization. Задаем параметры sqlmap:

  • -u «URL»
  • --headers= «заголовки HTTP, разделенный `\n` »
  • --data=«данные POST-запроса»
  • --current-db — определить какая БД используется
  • --tamper=space2comment — заменить пробел строкой /**/ (в SQL это одно и тоже)
  • --level=(1–5) — уровень сканирования
  • --risk=(1–3) — риск сканирования


image

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

Sqlmap сообщил, что версия MySQL >= 5.0.12 (это необходимо для выбора служебных констант СУБД).

image

Sqlmap определил нагрузку для параметра username и спросил нужно ли проверять другие параметры (по умолчанию — no). Также он показывает нагрузку.

image

Предоставляет информацию об узле и, как мы просили — текущую БД: natas15.

image

image

С учетом новых известных данных узнаем таблицы из базы данных natas15:

  • -D «база данных»
  • --tables — определить таблицы


image

Sqlmap определил одну таблицу users.

image

Узнаем столбцы в таблице users:

  • -T «таблица»
  • --columns — определить столбцы


image

Sqlmap определил 2 столбца.

image

Сдампим таблицу users (опция --dump). Дамп занял 3 минуты. Выполним запрос в 8 потоков (--threads 8) — как итог: 1 минута.

image

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

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

© Habrahabr.ru