
Um kit de ferramentas C# para MS SQL projetado para reconhecimento ofensivo e pós-exploração.
SQLRecon é um kit de ferramentas para Microsoft SQL Server projetado para reconhecimento ofensivo e pós-exploração. Para informações detalhadas sobre como usar cada técnica, consulte a wiki.
Você pode baixar uma cópia do SQLRecon na página de releases. Alternativamente, sinta-se à vontade para compilar a solução você mesmo. Isso deve ser tão simples quanto clonar o repositório, clicar duas vezes no arquivo da solução e compilar.
Guia de prevenção, detecção e mitigação também foi fornecido para todos os defensores de plantão.
Confira meu artigo no site IBM Security Intelligence. Se preferir vídeos, veja minha apresentação no Black Hat.
Os Módulos de Enumeração não requerem que um provedor de autenticação seja fornecido. Esses módulos devem ser passados para a flag de módulo de enumeração (/e:, /enum:). A wiki tem detalhes sobre o uso de módulos de enumeração.```
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.
# Provedores de Autenticação
O SQLRecon suporta um conjunto diversificado de provedores de autenticação (`/a:, /auth:`) para permitir a interação com um 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:) é obrigatório e permite um ou mais servidores SQL. Se quiser executar um módulo em vários servidores SQL, separe os hosts com vírgula, por exemplo /h:SQL01,10.10.10.2,SQL03.master por predefinição, no entanto, isto pode ser alterado opcionalmente fornecendo um nome de base de dados personalizado através do sinalizador de base de dados (/database:)./debug é opcional e exibe todas as consultas SQL que são executadas por um módulo, sem realmente executá-las no(s) anfitrião(ões) remoto(s). Um exemplo disto pode ser encontrado na wiki.1433 por predefinição, no entanto, isto pode ser alterado opcionalmente usando o sinalizador /port:.3 segundos, no entanto, este valor pode ser alterado opcionalmente fornecendo um valor de tempo limite (/t:, /timeout:) que corresponde ao número de segundos antes de terminar a tentativa de ligação.Tenha em atenção que o fornecedor de autenticação EntraID requer que a Azure Active Directory Authentication Library (ADAL) ou a Microsoft Authentication Library (MSAL) exista no sistema a partir do qual o SQLRecon é executado. Isto é para funcionalidade de autenticação e autorização do Azure EntraID.
Os módulos SQL são executados contra uma ou mais instâncias do Microsoft SQL Server. Estes módulos devem ser passados para o sinalizador de módulo (/m:, /module:).
O sinalizador de host (/h:, host:) é obrigatório e permite um ou mais servidores SQL. Se quiser executar um módulo em vários servidores SQL, separe os hosts com vírgula, por exemplo /h:SQL01,10.10.10.2,SQL03.
A wiki tem detalhes sobre como usar cada módulo que suporta execução numa ou mais instâncias do SQL Server.
Os módulos de impersonação são executados contra uma ou mais instâncias do Microsoft SQL Server, no contexto de um utilizador SQL impersonado. Todos os módulos de impersonação têm os seguintes requisitos mínimos:
/i:, /iuser:)./m:, /module:).A wiki tem detalhes sobre como usar cada módulo que suporta execução usando Impersonação.
Os módulos ligados são executados numa ou mais instâncias de um Microsoft SQL Server ligado. Todos os módulos ligados têm os seguintes requisitos mínimos:
/l:, /link:). O sinalizador de ligação permite um ou mais servidores SQL ligados. Por exemplo, se SQL01 tem uma ligação a SQL02, e SQL01 tem uma ligação a DB04, pode separar os hosts ligados com uma vírgula, e um módulo será executado em cada servidor SQL ligado, por exemplo /l:SQL02,DB04./m:, /module:).A wiki tem detalhes sobre como usar cada módulo que suporta execução numa ou mais instâncias de um SQL Server Ligado.
Os módulos de cadeia ligada são executados no servidor Microsoft SQL final numa cadeia de servidores ligados. Todos os módulos de cadeia ligada têm os seguintes requisitos mínimos:
/l:, /link:. Se SQL01 tem uma ligação a SQL02, e SQL02 tem uma ligação a PAYMENTS01, e pretende executar um módulo em PAYMENTS01, então o argumento seria /l:SQL02,PAYMENTS01./chain deve ser incluído para executar o módulo contra o servidor SQL final na cadeia ligada fornecida./m:, /module:).A wiki tem detalhes sobre como usar cada módulo que suporta execução no servidor SQL final fornecido numa Cadeia de Servidores SQL Ligados.
O SQLRecon tem vários módulos que podem ajudar na enumeração e ataque ao Microsoft System Center Configuration Manager (SCCM) e ao Microsoft Endpoint Configuration Manager (ECM). O servidor SCCM ou ECM precisará de ter uma base de dados Microsoft SQL exposta local ou remotamente.
Os módulos SCCM devem ser passados para o sinalizador de módulo SCCM (/s:, /sccm:).
A maioria dos módulos SCCM pode ser executada no contexto de um utilizador SQL impersonado (/i:, /iuser:).
A wiki tem detalhes sobre como usar cada módulo contra uma base de dados SCCM/ECM.
Users lista todos os utilizadores na tabela RBAC_Admins. Estes são todos os utilizadores configurados com algum nível de acesso ao SCCM.Sites lista todos os outros sites com dados armazenados na tabela DPInfo das bases de dados SCCM. Isto pode fornecer vias de ataque adicionais, uma vez que diferentes sites podem ser configurados de formas diferentes (inseguras).Logons consulta a tabela Computer_System_DATA para recuperar todos os clientes SCCM associados juntamente com o utilizador que iniciou sessão neles pela última vez. NOTA: Isto só é atualizado uma vez por semana por predefinição e não estará 100% atualizado. Use /option: como um argumento opcional (não obrigatório) para filtrar clientes SCCM.TaskList fornece uma lista de todas as sequências de tarefas armazenadas na base de dados SCCM, mas não acede ao conteúdo real dos dados da tarefa.TaskData recupera todas as sequências de tarefas armazenadas na base de dados SCCM e desencripta-as para texto claro. As sequências de tarefas podem conter credenciais para associar sistemas a domínios, mapear partilhas, executar comandos, etc.Credentials lista credenciais guardadas pelo SCCM para uso em várias funções. Estas credenciais não podem ser desencriptadas remotamente, pois a chave está armazenada no servidor SCCM. No entanto, este módulo fornece informações sobre se faz sentido tentar obter a chave.Se estiver interessado em expandir o SQLRecon, consulte a secção de contribuição e expansão na wiki.
Encorajo-o a abrir uma issue se tiver sugestões ou ideias.
O objetivo é melhorar continuamente o SQLRecon. Abaixo estão listadas algumas áreas de investigação planeadas:
As seguintes pessoas contribuíram direta ou indiretamente para vários aspetos do SQLRecon.
/auth:pth). Implementa autenticação TDS/NTLM raw via PTHTdsConnection, NtlmHelper e PthState para que todos os módulos funcionem sem credenciais em texto claro ou privilégios elevados. As correções principais incluem opções de sessão ANSI pós-login, divisão TDS multi-packet, tratamento de deadlock de fluxo TCP para conexões CLR concorrentes e compatibilidade com notação de colchetes OPENQUERY._linkedChainRpcQuerySystem.Byte[] nunca era convertido e exibido corretamente na consola.credentialobjectss e proxies (jakxx).agentcmd (jakxx).role que não funcionava corretamente em cadeia ligada (passthehashbrowns).impersonate que não funcionava corretamente em cadeia ligada (passthehashbrowns).EnableRpc/DisableRpc que não estavam disponíveis em cadeias ligadas (passthehashbrowns).XpCmd que não funcionava em cadeias ligadas, agora também suporta saída (passthehashbrowns).EXEC AT a menos que envolvidos por colchetes, o que causa problemas se o nome do servidor ligado for um endereço IP ou um FQDN (passthehashbrowns)..First devolver um "0". Atualizei para que a função LinkedChainQuery crie um novo array com um "0" à frente e depois chame a lógica existente numa função separada, agora chamada (passthehashbrowns).impersonate para lidar corretamente com casos de sysadmin (n3rada).scriptdata e cidata (G0ldenGunSec).auditstatus para verificar se a auditoria SQL está implementada (chryzsh).whoami (JBalanza).adsi onde o servidor LDAP não precisava de ser adicionado à base de dados msdb, e a função criada agora é eliminada corretamente./host ou /h agora é suportada usando valores separados por vírgula./link ou /l agora é suportada usando valores separados por vírgula./lhost para /link.s' e criado o switch /s, /sccm para módulos SCCM.DecryptCredentials./enum) chamado info que é capaz de usar um contexto não autenticado para obter informações do servidor SQL, incluindo nome da instância e porta TCP usando o protocolo UDP.adsi não estava removendo o servidor LDAP.adsi vinculado, em favor de openquery/rpc./lhost para /adsi no módulo adsi./rhost para /unc no módulo smb.CaptureHash.cs e simplificada a lógica.SetEnumerationType.cs e simplificada a lógica.Impersonation.cs para Impersonate.cs.OleCmdExec.cs para .smb.info.info.rows, iRows e lRows.sLogons para incluir um filtro opcional.xp_cmdshell não estavam exibindo a saída do comando no console.SetEnumerationType.cs.domain alterado para SqlSpns.SetAuthenticationType.cs alterado para um novo método chamado EvaluateAuthenticationType.CreateSqlConnectionObject em SetAuthenticationType.cs que estende o SQLRecon para suportar múltiplos objetos de conexão SQL simultâneos.ADSI.cs, que incorpora ataques de credenciais ADSI conforme descrito aqui.adsi, iAdsi e lAdsi.lLinks e iLinks.ExecuteImpersonationQuery e ExecuteImpersonationCustomQuery.Impersonate.cs.checkRpc.iCheckRpc.lCheckRpc.EnableDisable.cs para ConfigureOptions.cs.ExecuteLinkedCustomQueryRpcExec é chamado.PrintUtils.cs, que implementa uma classe de impressão para saída padronizada.TablePrinter de Help.cs para PrintUtils.cs.PrintUtils.querysearchtableslColumnslQuerylSearchlTablesiColumnsAzure para AzureAD.AzureLocal.disableRpc.enableRpc.iEnableRpc.iDisableRpc.lEnableRpc.lDisbleRpc.lAgentCmd.clr, iClr e lClr usando SqlCommand.ExecuteNonQuery ao criar a stored procedure.lClr onde não estava removendo assemblies ou stored procedures criados.columns.iColumns.iDatabases.iSearch.iTables.lColumns.lSearch.ExecuteLinkedCustomQueryRpcExec.x.Random.cs para o diretório utilities.Windows para WinToken.WinDomain, que usa nome de usuário e senha do domínio AD para autenticação via impersonação. Consulte Impersonation.cs.ArgumentLogic.cs, SQLAuthentication.cs e ModuleHandler.cs.ModuleHandler.cs não usa mais um enorme bloco if/else if/else para executar módulos. Em vez disso, a reflexão agora é usada para chamar métodos que correspondem aos nomes dos módulos de comando.commands, que possui variáveis globais usadas ao longo do programa.SQLAuthentication.cs.Program.cs para ArgumentLogic.cs.sccm.roles, iRoles e lRoles.users, iUsers e lUsers.sp_drop_trusted_assembly nos módulos clr e iClr.lAgentCmd.lClr.info.Local e Azure.-e domain).-r nos modos de autenticação Windows e Local para que portas TCP não padrão possam ser fornecidas.Environment.Exit de TestAuthentication.cs.AgentJobs.cs.agentStatus.iAgentStatus.lAgentStatus.agentCmd.iAgentCmd.clr.iEnableClr.iDisbleClr.iClr.iWhoami.iMapped.iRoles.lEnableRpc.lDisableRpc.lWhoami.lEnableXp.lDisableXp.lEnableOle.lDisableOle.lSmb.lWhoami.lRoles.oldCmd.iOleCmd.lDatabases.lTables./v, /verbose é opcional e exibe todas as consultas SQL que são executadas por um módulo antes de executá-las no(s) anfitrião(ões) remoto(s). Um exemplo disto pode ser encontrado na wiki.| Nome do Módulo | Descrição | Impersonação | Execução Ligada | Execução em Cadeia Ligada | Requer Contexto Privilegiado |
|---|
AuditStatus | Verificar se a auditoria SQL está implementada. | ✅ | ✅ | ✅ | ❎ |
CheckRpc | Obter uma lista de servidores ligados e o seu estado RPC. | ✅ | ✅ | ✅ | ❎ |
Databases | Exibir todas as bases de dados. | ✅ | ✅ | ✅ | ❎ |
Impersonate | Enumerar contas de utilizador que podem ser impersonadas. | ✅ | ✅ | ✅ | ❎ |
Info | Mostrar informações sobre o servidor SQL. | ✅ | ✅ | ✅ | ❎ |
Links | Enumerar servidores SQL ligados. | ✅ | ✅ | ✅ | ❎ |
Users | Exibir que contas de utilizador e grupos podem autenticar-se na base de dados. | ✅ | ✅ | ✅ | ❎ |
Whoami | Exibir os seus privilégios. | ✅ | ✅ | ✅ | ❎ |
Query /c:QUERY | Executar uma consulta SQL. | ✅ | ✅ | ✅ | ❎ |
Smb /unc:UNC_PATH | Capturar hash NetNTLMv2. | ✅ | ✅ | ✅ | ❎ |
Columns /db:DATABASE /table:TABLE | Exibir todas as colunas na base de dados e tabela fornecidas. | ✅ | ✅ | ✅ | ❎ |
Rows /db:DATABASE /table:TABLE | Exibir o número de linhas na tabela da base de dados fornecida. | ✅ | ✅ | ✅ | ❎ |
Search /keyword:KEYWORD | Procurar nomes de colunas na tabela fornecida da base de dados à qual está ligado. | ✅ | ✅ | ✅ | ❎ |
Tables /db:DATABASE | Exibir todas as tabelas na base de dados fornecida. | ✅ | ✅ | ✅ | ❎ |
EnableRpc /rhost:LINKED_HOST | Ativar RPC e RPC out num servidor ligado. | ✅ | ❌ | ❌ | ✔️ |
EnableClr | Ativar integração CLR. | ✅ | ✅ | ✅ | ✔️ |
EnableOle | Ativar procedimentos de automação OLE. | ✅ | ✅ | ✅ | ✔️ |
EnableXp | Ativar xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
DisableRpc /rhost:LINKED_HOST | Desativar RPC e RPC out num servidor ligado. | ✅ | ❌ | ❌ | ✔️ |
DisableClr | Desativar integração CLR. | ✅ | ✅ | ✅ | ✔️ |
DisableOle | Desativar procedimentos de automação OLE. | ✅ | ✅ | ✅ | ✔️ |
DisableXp | Desativar xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
AgentStatus | Exibir se o agente SQL está em execução e obter trabalhos do agente. | ✅ | ✅ | ✅ | ✔️ |
AgentCmd /c:COMMAND /subsystem:(OPCIONAL) /proxy:(OPCIONAL) | Executar um comando de sistema usando trabalhos do agente. Opcionalmente especificar um subsistema com /subsystem:, por defeito é 'PowerShell'. Opcionalmente especificar uma conta de proxy do Agente SQL com /proxy:. | ✅ | ✅ | ✅ | ✔️ |
Adsi /adsi:SERVER_NAME /lport:LOCAL_PORT | Obter credenciais ADSI em texto claro de um servidor ADSI ligado. | ✅ | ✅ | ✅ | ✔️ |
Clr /dll:DLL /function:FUNCTION | Carregar e executar um assembly .NET num procedimento armazenado personalizado. | ✅ | ✅ | ✅ | ✔️ |
CredentialObjects | Obter objetos de credenciais de sys.credentials. | ✅ | ✅ | ✅ | ✔️ |
OleCmd /c:COMMAND /subsystem:(OPCIONAL) | Executar um comando de sistema usando procedimentos de automação OLE. | ✅ | ✅ | ✅ | ✔️ |
Proxies | Obter informações de proxy do Agente SQL. | ✅ | ✅ | ✅ | ✔️ |
XpCmd /c:COMMAND | Executar um comando de sistema usando xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
| Nome do Módulo | Descrição | Impersonação | Requer Contexto Privilegiado |
|---|
Users | Exibir todos os utilizadores SCCM. | ✅ | ❎ |
Sites | Exibir todos os outros sites com dados armazenados. | ✅ | ❎ |
Logons | Exibir todos os clientes SCCM associados e o último utilizador com sessão iniciada. | ✅ | ❎ |
Credentials | Exibir credenciais encriptadas guardadas pelo SCCM. | ✅ | ❎ |
TaskList | Exibir todas as sequências de tarefas, mas não aceder ao conteúdo dos dados da tarefa. | ✅ | ❎ |
TaskData | Desencriptar todas as sequências de tarefas para texto claro. | ✅ | ❎ |
DecryptCredentials | Desencriptar um blob de credenciais SCCM. Deve ser executado num processo de alta integridade ou SYSTEM no servidor SCCM. | ❌ | ✔️ |
AddAdmin /user:DOMINIO\NOME_UTILIZADOR /sid:SID | Elevar uma conta fornecida a 'Administrador Completo' no SCCM. | ✅ | ✔️ |
RemoveAdmin /user:ADMIN_ID /remove:STRING | Remove privilégios de um utilizador, ou remove um utilizador completamente da base de dados SCCM. | ✅ | ✔️ |
ScriptData | Devolve todos os scripts configurados para executar no SCCM. | ✅ | ✔️ |
CIData | Devolve todos os CIs configurados para executar scripts no SCCM. | ✅ | ✔️ |
DecryptCredentials tenta desencriptar blobs de credenciais SCCM recuperados. Este módulo deve ser executado num processo de alta integridade ou SYSTEM num servidor SCCM.AddAdmin eleva a conta especificada a 'Administrador Completo' dentro do SCCM. Se o utilizador alvo já for um utilizador SCCM, este módulo adicionará os privilégios necessários para elevar. Forneça dois argumentos: /user:current /sid:current se pretender adicionar o utilizador que atualmente executa o processo SQLRecon como 'Administrador Completo' no SCCM. Se pretender adicionar outro utilizador como 'Administrador Completo' no SCCM, especifique o nome de utilizador de domínio e o SID completo /user:DOMINIO\NOME_UTILIZADOR /sid:S-1-5-.... Este módulo requer privilégios de sysadmin ou semelhantes, pois é necessário escrever nas tabelas da base de dados SCCM.RemoveAdmin remove os privilégios de um utilizador, removendo completamente um utilizador recém-adicionado da base de dados SCCM. Se o utilizador já existia de alguma forma, este módulo apenas remove as três funções que foram adicionadas à conta através de escritas na tabela de permissões. Use os argumentos fornecidos pela saída do comando sAddAdmin para executar este comando. Este módulo requer privilégios de sysadmin ou semelhantes, pois é necessário escrever nas tabelas da base de dados SCCM.LinkedChainQueryRecurseModuleHandler.cs para promover simplicidade e extensibilidade.Queries.cs.EnumerationModules.cs.FormatQuery.cs.SccmModules.cs.ModuleHandler.cs para SqlModules.cs.OleAutomation.csPrintUtils.cs para Print.cs.SQLServerInfo.cs para Info.cs.iQueryiSearchauthentication.Help.cs de um método para um construtor.CaptureHash.cs de um método para um construtor.Impersonate.cs de um método para um construtor.lEnableClr.lDisableClr.lXpCmd.lXpOle.Random.cs.EnableDisable.cs.clr.ole.mapped e roles no whoami.lMapped e lRoles no lWhoami.iMapped e iRoles no iWhoami.