
Un toolkit C# MS SQL progettato per ricognizione offensiva e post-sfruttamento.
SQLRecon è un toolkit per Microsoft SQL Server progettato per ricognizione offensiva e post-sfruttamento. Per informazioni dettagliate su come utilizzare ogni tecnica, fare riferimento alla wiki.
Puoi scaricare una copia di SQLRecon dalla pagina releases. In alternativa, sentiti libero di compilare la soluzione da solo. Dovrebbe essere semplice come clonare il repository, fare doppio clic sul file della soluzione e compilare.
Guida alla prevenzione, rilevamento e mitigazione è stata fornita anche per tutti voi difensori.
Dai un'occhiata al mio post sul blog sul sito IBM Security Intelligence. Se preferisci i video, dai un'occhiata alla mia presentazione al Black Hat.
I moduli di enumerazione non richiedono che venga fornito un provider di autenticazione. Questi moduli devono essere passati al flag del modulo di enumerazione (/e:, /enum:). La wiki ha dettagli sull'uso dei moduli di enumerazione.```
Info - Show information about the SQL server.
/h:, /host -> SQL server hostname or IP. Multiple hosts supported.
/port: -> (OPTIONAL) Defaults to 1434 (UDP).
/t:, timeout: -> (OPTIONAL) Defaults to 3s.
SqlSpns - Use the current user token to enumerate the AD domain for MSSQL SPNs. /d:, /domain: -> (OPTIONAL) NETBIOS name or FQDN of domain.
# Fornitori di Autenticazione
SQLRecon supporta un insieme diversificato di fornitori di autenticazione (`/a:, /auth:`) per consentire l'interazione con un Microsoft SQL Server.```
WinToken - Use the current users token to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP
WinDomain - Use AD credentials to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> NETBIOS name or FQDN of domain.
/u:, /username: -> Username for domain user.
/p:, /password: -> Password for domain user.
Local - Use local SQL credentials to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/u:, /username: -> Username for local SQL user.
/p:, /password: -> Password for local SQL user.
EntraID - Use Azure EntraID credentials to authenticate against the Azure SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> FQDN of domain (DOMAIN.COM).
/u:, /username: -> Username for domain user.
/p:, /password: -> Password for domain user.
AzureLocal - Use local SQL credentials to authenticate against the Azure SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/u:, /username: -> Username for local SQL user.
/p:, /password: -> Password for local SQL user.
Pth - Authenticate using an NT hash (pass-the-hash) over raw TDS/NTLM. Elevated privileges or SeImpersonate is not required.
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> NETBIOS domain name.
/u:, /username: -> Domain username.
/hash: -> NT hash (32 hex chars, 8846f7eaee8fb117ad06bdd830b7586c) or LM:NT format.
/h:, host:) è obbligatorio e permette di specificare uno o più server SQL. Se si desidera eseguire un modulo su più server SQL, separare gli host con una virgola, ad esempio /h:SQL01,10.10.10.2,SQL03.master per impostazione predefinita, tuttavia è possibile modificarlo fornendo un nome di database personalizzato tramite il flag database (/database:)./debug è opzionale e mostra tutte le query SQL eseguite da un modulo, senza effettivamente eseguirle sul/i host remoto/i. Un esempio è disponibile nel wiki.1433 per impostazione predefinita, tuttavia è possibile modificarla utilizzando il flag /port:.3 secondi, tuttavia è possibile modificare questo valore fornendo un timeout (/t:, /timeout:) che corrisponde al numero di secondi prima di terminare il tentativo di connessione.Si noti che il provider di autenticazione EntraID richiede che la libreria di autenticazione Azure Active Directory (ADAL) o la libreria di autenticazione Microsoft (MSAL) sia presente nel sistema in cui viene eseguito SQLRecon. Questo è per la funzionalità di autenticazione e autorizzazione di Azure EntraID.
I moduli SQL vengono eseguiti su una o più istanze di Microsoft SQL Server. Questi moduli devono essere passati al flag del modulo (/m:, /module:).
Il flag host (/h:, host:) è obbligatorio e permette di specificare uno o più server SQL. Se si desidera eseguire un modulo su più server SQL, separare gli host con una virgola, ad esempio /h:SQL01,10.10.10.2,SQL03.
Il wiki ha dettagli sull'uso di ciascun modulo che supporta l'esecuzione su una o più istanze di SQL Server.
I moduli di impersonificazione vengono eseguiti su una o più istanze di Microsoft SQL Server, nel contesto di un utente SQL impersonato. Tutti i moduli di impersonificazione hanno i seguenti requisiti minimi:
/i:, /iuser:)./m:, /module:).Il wiki ha dettagli sull'uso di ciascun modulo che supporta l'esecuzione tramite Impersonificazione.
I moduli collegati vengono eseguiti su una o più istanze di un server Microsoft SQL collegato. Tutti i moduli collegati hanno i seguenti requisiti minimi:
/l:, /link:). Il flag link permette di specificare uno o più server SQL collegati. Ad esempio, se SQL01 ha un collegamento a SQL02, e SQL01 ha un collegamento a DB04, è possibile separare gli host collegati con una virgola, e il modulo verrà eseguito su ciascun server SQL collegato, ad esempio /l:SQL02,DB04./m:, /module:).Il wiki ha dettagli sull'uso di ciascun modulo che supporta l'esecuzione su una o più istanze di un Server SQL Collegato.
I moduli di catena collegata vengono eseguiti sul server Microsoft SQL finale in una catena di server collegati. Tutti i moduli di catena collegata hanno i seguenti requisiti minimi:
/l:, /link:. Se SQL01 ha un collegamento a SQL02, e SQL02 ha un collegamento a PAYMENTS01, e si desidera eseguire un modulo su PAYMENTS01, l'argomento sarebbe /l:SQL02,PAYMENTS01./chain deve essere incluso per eseguire il modulo sul server SQL finale nella catena collegata fornita./m:, /module:).Il wiki ha dettagli sull'uso di ciascun modulo che supporta l'esecuzione sul server SQL finale fornito in una Catena di Server SQL Collegati.
SQLRecon dispone di diversi moduli che possono aiutare nell'enumerazione e nell'attacco di Microsoft System Center Configuration Manager (SCCM) e Microsoft Endpoint Configuration Manager (ECM). Il server SCCM o ECM dovrà esporre un database Microsoft SQL, localmente o in remoto.
I moduli SCCM devono essere passati al flag del modulo SCCM (/s:, /sccm:).
La maggior parte dei moduli SCCM può essere eseguita nel contesto di un utente SQL impersonato (/i:, /iuser:).
Il wiki ha dettagli sull'uso di ciascun modulo contro un database SCCM/ECM.
Users elenca tutti gli utenti nella tabella RBAC_Admins. Questi sono tutti gli utenti configurati per un certo livello di accesso a SCCM.Sites elenca tutti gli altri siti con dati archiviati nella tabella DPInfo del database SCCM. Questo può fornire ulteriori vie di attacco poiché diversi siti possono essere configurati in modi diversi (e non sicuri).Logons interroga la tabella Computer_System_DATA per recuperare tutti i client SCCM associati insieme all'utente che ha effettuato l'ultimo accesso. NOTA: Questo si aggiorna solo una volta a settimana per impostazione predefinita e non sarà aggiornato al 100%. Utilizzare /option: come argomento opzionale (non obbligatorio) per filtrare i client SCCM.TaskList fornisce un elenco di tutte le sequenze di attività archiviate nel database SCCM, ma non accede al contenuto effettivo dei dati delle attività.TaskData recupera tutte le sequenze di attività archiviate nel database SCCM e le decifra in testo semplice. Le sequenze di attività possono contenere credenziali per l'aggiunta di sistemi ai domini, la mappatura di condivisioni, l'esecuzione di comandi, ecc.Se sei interessato a estendere SQLRecon, consulta la sezione contributi ed estensione nel wiki.
Ti incoraggio ad aprire un issue se hai suggerimenti o idee.
L'obiettivo è migliorare continuamente SQLRecon. Di seguito sono elencate alcune aree di ricerca pianificate:
Le seguenti persone hanno contribuito direttamente o indirettamente a vari aspetti di SQLRecon.
/auth:pth). Implementa l'autenticazione TDS/NTLM raw tramite PTHTdsConnection, NtlmHelper e PthState in modo che tutti i moduli funzionino senza credenziali in chiaro o privilegi elevati. Le correzioni principali includono opzioni di sessione ANSI post-login, suddivisione TDS multi-pacchetto, gestione del deadlock del flusso TCP per connessioni CLR concorrenti e compatibilità con la notazione parentesi di OPENQUERY._linkedChainRpcQuerySystem.Byte[] non veniva mai convertito e stampato correttamente nella console.credentialobjects e proxies (jakxx).agentcmd (jakxx).role che non funzionava correttamente su catena collegata (passthehashbrowns).impersonate che non funzionava correttamente su catena collegata (passthehashbrowns).EnableRpc/DisableRpc non disponibili su catene collegate (passthehashbrowns).XpCmd che non funzionava su catene collegate, ora supporta anche l'output (passthehashbrowns).EXEC AT a meno che non fossero racchiusi tra parentesi; questo causava problemi se il nome del server collegato è un indirizzo IP o un FQDN (passthehashbrowns).LinkedChainQuery crei un nuovo array con uno '0' all'inizio e poi chiami la logica esistente in una funzione separata, ora chiamata LinkedChainQueryRecurse (passthehashbrowns).impersonate per gestire correttamente i casi sysadmin (n3rada).scriptdata e cidata (G0ldenGunSec).auditstatus per verificare se il controllo SQL è attivo (chryzsh).whoami (JBalanza).adsi in cui il server LDAP non necessita di essere aggiunto al database msdb, inoltre la funzione creata ora viene eliminata correttamente./host o /h utilizzando valori separati da virgola./link o /l utilizzando valori separati da virgola./lhost in /link.s' e creato lo switch /s, /sccm per i moduli SCCM.DecryptCredentials./enum) chiamato info in grado di utilizzare un contesto non autenticato per ottenere informazioni sul server SQL, inclusi nome dell'istanza e porta TCP tramite protocollo UDP.adsi non rimuoveva il server LDAP.adsi collegato, in favore di openquery/rpc./lhost in /adsi nel modulo adsi./rhost in /unc nel modulo smb.CaptureHash.cs e semplificata la logica.SetEnumerationType.cs e semplificata la logica.Impersonation.cs in Impersonate.cs.OleCmdExec.cs in .smb.info.info.rows, iRows e lRows.sLogons per includere un filtro opzionale.xp_cmdshell non stampavano l'output dei comandi sulla console.SetEnumerationType.cs.domain in SqlSpns.SetAuthenticationType.cs in un nuovo metodo chiamato EvaluateAuthenticationType.CreateSqlConnectionObject in SetAuthenticationType.cs che estende SQLRecon per supportare oggetti di connessione SQL multipli simultanei.ADSI.cs, che incorpora attacchi alle credenziali ADSI come descritto qui.adsi, iAdsi e lAdsi.lLinks e iLinks.ExecuteImpersonationQuery e ExecuteImpersonationCustomQuery.Impersonate.cscheckRpc.iCheckRpc.lCheckRpc.EnableDisable.cs in ConfigureOptions.csExecuteLinkedCustomQueryRpcExec.PrintUtils.cs, che implementa una classe di stampa per output standardizzato.TablePrinter da Help.cs a PrintUtils.cs.PrintUtils.querysearchtableslColumnslQuerylSearchlTablesiColumnsAzure in AzureAD.AzureLocal.disableRpc.enableRpc.iEnableRpc.iDisableRpc.lEnableRpc.lDisableRpc.lAgentCmd.clr, iClr e lClr usando SqlCommand.ExecuteNonQuery durante la creazione della stored procedure.lClr dove non venivano rimossi gli assembly o le stored procedure create.columns.iColumns.iDatabases.iSearch.iTables.lColumns.lSearch.ExecuteLinkedCustomQueryRpcExec.x.Random.cs nella directory utilities.Windows in WinToken.WinDomain, che utilizza nome utente e password del dominio AD per l'autenticazione tramite impersonificazione. Dai un'occhiata a Impersonation.cs.ArgumentLogic.cs, SQLAuthentication.cs e ModuleHandler.cs.ModuleHandler.cs non utilizza più un enorme statement if/else if/else per eseguire i moduli. Invece, ora viene utilizzata la riflessione per chiamare metodi corrispondenti ai nomi dei moduli comandi.commands, che contiene variabili globali utilizzate in tutto il programma.SQLAuthentication.cs.Program.cs a ArgumentLogic.cs.sccm.roles, iRoles e lRoles.users, iUsers e lUsers.sp_drop_trusted_assembly nei moduli clr e iClr.lAgentCmd.lClr.info.Local e Azure.-e domain).-r nelle modalità di autenticazione Windows e Local in modo che possano essere fornite porte TCP non standard.Environment.Exit da TestAuthentication.cs.AgentJobs.cs.agentStatus.iAgentStatus.lAgentStatus.agentCmd.iAgentCmd.clr.iEnableClr.iDisableClr.iClr.iWhoami.iMapped.iRoles.lEnableRpc.lDisableRpc.lWhoami.lEnableXp.lDisableXp.lEnableOle.lDisableOle.lSmb.lWhoami.lRoles.oldCmd.iOleCmd.lDatabases.lTables./v, /verbose è opzionale e mostra tutte le query SQL eseguite da un modulo prima di eseguirle sul/i host remoto/i. Un esempio è disponibile nel wiki.| Nome Modulo | Descrizione | Impersonificazione | Esecuzione Collegata | Esecuzione Catena Collegata | Richiede Contesto Privilegiato |
|---|
AuditStatus | Verifica se il controllo (audit) SQL è attivo. | ✅ | ✅ | ✅ | ❎ |
CheckRpc | Ottiene un elenco di server collegati e del loro stato RPC. | ✅ | ✅ | ✅ | ❎ |
Databases | Mostra tutti i database. | ✅ | ✅ | ✅ | ❎ |
Impersonate | Enumera gli account utente che possono essere impersonati. | ✅ | ✅ | ✅ | ❎ |
Info | Mostra informazioni sul server SQL. | ✅ | ✅ | ✅ | ❎ |
Links | Enumera i server SQL collegati. | ✅ | ✅ | ✅ | ❎ |
Users | Mostra quali account utente e gruppi possono autenticarsi sul database. | ✅ | ✅ | ✅ | ❎ |
Whoami | Mostra i tuoi privilegi. | ✅ | ✅ | ✅ | ❎ |
Query /c:QUERY | Esegue una query SQL. | ✅ | ✅ | ✅ | ❎ |
Smb /unc:UNC_PATH | Cattura l'hash NetNTLMv2. | ✅ | ✅ | ✅ | ❎ |
Columns /db:DATABASE /table:TABLE | Mostra tutte le colonne nel database e nella tabella forniti. | ✅ | ✅ | ✅ | ❎ |
Rows /db:DATABASE /table:TABLE | Mostra il numero di righe nella tabella del database fornito. | ✅ | ✅ | ✅ | ❎ |
Search /keyword:KEYWORD | Cerca i nomi delle colonne nella tabella fornita del database a cui si è connessi. | ✅ | ✅ | ✅ | ❎ |
Tables /db:DATABASE | Mostra tutte le tabelle nel database fornito. | ✅ | ✅ | ✅ | ❎ |
EnableRpc /rhost:LINKED_HOST | Abilita RPC e RPC out su un server collegato. | ✅ | ❌ | ❌ | ✔️ |
EnableClr | Abilita l'integrazione CLR. | ✅ | ✅ | ✅ | ✔️ |
EnableOle | Abilita le procedure di automazione OLE. | ✅ | ✅ | ✅ | ✔️ |
EnableXp | Abilita xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
DisableRpc /rhost:LINKED_HOST | Disabilita RPC e RPC out su un server collegato. | ✅ | ❌ | ❌ | ✔️ |
DisableClr | Disabilita l'integrazione CLR. | ✅ | ✅ | ✅ | ✔️ |
DisableOle | Disabilita le procedure di automazione OLE. | ✅ | ✅ | ✅ | ✔️ |
DisableXp | Disabilita xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
AgentStatus | Mostra se l'agente SQL è in esecuzione e ottiene i processi dell'agente. | ✅ | ✅ | ✅ | ✔️ |
AgentCmd /c:COMMAND /subsystem:(OPTIONAL) /proxy:(OPTIONAL) | Esegue un comando di sistema utilizzando i processi dell'agente. Opzionalmente specificare un sottosistema con /subsystem:, per impostazione predefinita 'PowerShell'. Opzionalmente specificare un account proxy dell'agente SQL con /proxy:. | ✅ | ✅ | ✅ | ✔️ |
Adsi /adsi:SERVER_NAME /lport:LOCAL_PORT | Ottiene le credenziali ADSI in chiaro da un server ADSI collegato. | ✅ | ✅ | ✅ | ✔️ |
Clr /dll:DLL /function:FUNCTION | Carica ed esegue un assembly .NET in una stored procedure personalizzata. | ✅ | ✅ | ✅ | ✔️ |
CredentialObjects | Ottiene gli oggetti credenziali da sys.credentials. | ✅ | ✅ | ✅ | ✔️ |
OleCmd /c:COMMAND /subsystem:(OPTIONAL) | Esegue un comando di sistema utilizzando le procedure di automazione OLE. | ✅ | ✅ | ✅ | ✔️ |
Proxies | Ottiene le informazioni sul proxy dell'agente SQL. | ✅ | ✅ | ✅ | ✔️ |
XpCmd /c:COMMAND | Esegue un comando di sistema utilizzando xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
| Nome Modulo | Descrizione | Impersonificazione | Richiede Contesto Privilegiato |
|---|
Users | Mostra tutti gli utenti SCCM. | ✅ | ❎ |
Sites | Mostra tutti gli altri siti con dati archiviati. | ✅ | ❎ |
Logons | Mostra tutti i client SCCM associati e l'ultimo utente che ha effettuato l'accesso. | ✅ | ❎ |
Credentials | Mostra le credenziali crittografate custodite da SCCM. | ✅ | ❎ |
TaskList | Mostra tutte le sequenze di attività, ma non accede al contenuto dei dati delle attività. | ✅ | ❎ |
TaskData | Decifra tutte le sequenze di attività in testo semplice. | ✅ | ❎ |
DecryptCredentials | Decifra un blob di credenziali SCCM. Deve essere eseguito in un processo ad alta integrità o SYSTEM sul server SCCM. | ❌ | ✔️ |
AddAdmin /user:DOMAIN\USERNAME /sid:SID | Eleva un account fornito a 'Amministratore completo' in SCCM. | ✅ | ✔️ |
RemoveAdmin /user:ADMIN_ID /remove:STRING | Rimuove i privilegi di un utente, o rimuove completamente un utente dal database SCCM. | ✅ | ✔️ |
ScriptData | Restituisce tutti gli script configurati per essere eseguiti in SCCM. | ✅ | ✔️ |
CIData | Restituisce tutti i CI configurati per eseguire script in SCCM. | ✅ | ✔️ |
CredentialsDecryptCredentials tenta di decifrare i blob di credenziali SCCM recuperati. Questo modulo deve essere eseguito in un processo ad alta integrità o SYSTEM su un server SCCM.AddAdmin eleva l'account specificato a 'Amministratore completo' in SCCM. Se l'utente target è già un utente SCCM, questo modulo aggiungerà invece i privilegi necessari per l'elevazione. Fornire due argomenti, /user:current /sid:current se si desidera aggiungere l'utente che sta eseguendo il processo SQLRecon come 'Amministratore completo' in SCCM. Se si desidera aggiungere un altro utente come 'Amministratore completo' in SCCM, specificare il nome utente del dominio e il SID completo /user:DOMINIO\NOMEUTENTE /sid:S-1-5-.... Questo modulo richiede privilegi sysadmin o simili poiché è necessario scrivere nelle tabelle del database SCCM.RemoveAdmin rimuove i privilegi di un utente eliminando completamente un utente appena aggiunto dal database SCCM. Se l'utente esisteva già in qualche misura, questo modulo rimuove solo i tre ruoli che sono stati aggiunti all'account tramite scritture nella tabella delle autorizzazioni. Utilizzare gli argomenti forniti dall'output del comando sAddAdmin per eseguire questo comando. Questo modulo richiede privilegi sysadmin o simili poiché è necessario scrivere nelle tabelle del database SCCM.ModuleHandler.csQueries.cs.EnumerationModules.cs.FormatQuery.cs.SccmModules.cs.ModuleHandler.cs in SqlModules.cs.OleAutomation.csPrintUtils.cs in Print.cs.SQLServerInfo.cs in Info.cs.iQueryiSearchauthentication.Help.cs da un metodo a un costruttore.CaptureHash.cs da un metodo a un costruttore.Impersonate.cs da un metodo a un costruttore.lEnableClr.lDisableClr.lXpCmd.lXpOle.Random.cs.EnableDisable.cs.clr.ole.mapped e roles in whoami.lMapped e lRoles in lWhoami.iMapped e iRoles in iWhoami.