
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.
Orientações de prevenção, detecção e mitigação também foram fornecidas para todos vocês, defensores.
Confira minha postagem no site IBM Security Intelligence. Se preferir vídeos, confira minha apresentação na Black Hat.
Os Módulos de Enumeração não exigem 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 como usar 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
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.
/h:, host:) é obrigatória e permite um ou mais servidores SQL. Se você quiser executar um módulo contra vários servidores SQL, separe os hosts com vírgula, por exemplo /h:SQL01,10.10.10.2,SQL03.master por padrão; no entanto, isso pode ser alterado opcionalmente fornecendo um nome de banco de dados personalizado por meio da flag de banco de dados (/database:)./debug é opcional e exibe todas as consultas SQL executadas por um módulo, sem realmente executá-las no(s) host(s) remoto(s). Um exemplo disso pode ser encontrado na wiki.1433 por padrão; no entanto, isso pode ser alterado opcionalmente usando a flag /port:.3 segundos; no entanto, esse valor pode ser alterado opcionalmente fornecendo um valor de timeout (/t:, /timeout:), que corresponde ao número de segundos antes de encerrar a tentativa de conexão.Observe que o provedor de autenticação EntraID exige que a Biblioteca de Autenticação do Azure Active Directory (ADAL) ou a Biblioteca de Autenticação da Microsoft (MSAL) exista no sistema a partir do qual o SQLRecon é executado. Isso é para a 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. Esses módulos devem ser passados para a flag de módulo (/m:, /module:).
A flag de host (/h:, host:) é obrigatória e permite um ou mais servidores SQL. Se você quiser executar um módulo contra 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 em uma ou mais instâncias do SQL Server.
Os módulos de personificação são executados contra uma ou mais instâncias do Microsoft SQL Server, no contexto de um usuário SQL personificado. Todos os módulos de personificaçã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 Personificação.
Os módulos vinculados são executados em uma ou mais instâncias de um servidor Microsoft SQL vinculado. Todos os módulos vinculados têm os seguintes requisitos mínimos:
/l:, /link:). A flag de link permite um ou mais servidores SQL vinculados. Por exemplo, se SQL01 tem um link para SQL02, e SQL01 tem um link para DB04, você pode separar os hosts vinculados com vírgula, e um módulo será executado em cada servidor SQL vinculado, por exemplo /l:SQL02,DB04./m:, /module:).A wiki tem detalhes sobre como usar cada módulo que suporta execução em uma ou mais instâncias de um Servidor SQL Vinculado.
Os módulos de cadeia vinculada são executados no servidor Microsoft SQL final em uma cadeia de servidores vinculados. Todos os módulos de cadeia vinculada têm os seguintes requisitos mínimos:
/l:, /link:. Se SQL01 tem um link para SQL02, e SQL02 tem um link para PAYMENTS01, e você deseja executar um módulo em PAYMENTS01, então o argumento seria /l:SQL02,PAYMENTS01./chain deve ser incluída para executar o módulo contra o servidor SQL final na cadeia vinculada fornecida./m:, /module:).A wiki tem detalhes sobre como usar cada módulo que suporta execução no servidor SQL final fornecido em uma Cadeia de Servidores SQL Vinculados.
O SQLRecon possui vários módulos que podem auxiliar na enumeração e no ataque ao Microsoft System Center Configuration Manager (SCCM) e ao Microsoft Endpoint Configuration Manager (ECM). O servidor SCCM ou ECM precisará ter um banco de dados Microsoft SQL exposto local ou remotamente.
Os módulos SCCM devem ser passados para a flag de módulo SCCM (/s:, /sccm:).
A maioria dos módulos SCCM pode ser executada no contexto de um usuário SQL personificado (/i:, /iuser:).
A wiki tem detalhes sobre como usar cada módulo contra um banco de dados SCCM/ECM.
Users lista todos os usuários na tabela RBAC_Admins. Esses são todos os usuários configurados com algum nível de acesso ao SCCM.Sites lista todos os outros sites com dados armazenados na tabela DPInfo dos bancos de dados SCCM. Isso pode fornecer vetores de ataque adicionais, pois sites diferentes podem ser configurados de maneiras diferentes (inseguras).Logons consulta a tabela Computer_System_DATA para recuperar todos os clientes SCCM associados, juntamente com o usuário que fez login pela última vez neles. NOTA: Isso só é atualizado uma vez por semana por padrã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 no banco de dados SCCM, mas não acessa o conteúdo real dos dados das tarefas.TaskData recupera todas as sequências de tarefas armazenadas no banco de dados SCCM e as descriptografa para texto simples. As sequências de tarefas podem conter credenciais para ingressar sistemas em domínios, mapear compartilhamentos, executar comandos, etc.Credentials lista credenciais armazenadas pelo SCCM para uso em várias funções. Essas credenciais não podem ser descriptografadas 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 você estiver interessado em estender o SQLRecon, consulte a seção de contribuição e extensão na wiki.
Encorajo você a abrir uma issue se tiver alguma sugestão ou ideia.
O objetivo é melhorar continuamente o SQLRecon. Abaixo estão algumas áreas de pesquisa planejadas:
As seguintes pessoas contribuíram direta ou indiretamente para vários aspectos do SQLRecon.
whoami (JBalanza).adsi em que o servidor LDAP não precisa ser adicionado ao banco de dados msdb; além disso, a função criada agora é removida corretamente.SQL01 tem um link para SQL02, e SQL02 tem um link para SQL03, e SQL03 tem um link para PAYMENTS01. Agora é possível executar comandos de SQL01 em PAYMENTS01 usando a cadeia de servidores vinculados (/link:SQL02,SQL03,PAYMENTS01 /chain). Créditos a Azaël Martin (n3rada).l' e 'i', e introduzida lógica de contexto para que os nomes dos módulos possam ser os mesmos entre execução padrão, personificação, vinculada e em cadeia./debug), que exibirá várias informações de depuração e todas as consultas SQL que serão executadas por um módulo, sem executá-las./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 criada a opção /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 imprimindo a saída do comando no console.SetEnumerationType.cs.domain para SqlSpns.ExecuteImpersonationQuery e ExecuteImpersonationCustomQuery.Impersonate.cscheckRpc.iCheckRpc.lCheckRpc.EnableDisable.cs para ConfigureOptions.csExecuteLinkedCustomQueryRpcExec é 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 o procedimento armazenado.lClr em que ele não removia assemblies ou procedimentos armazenados 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. Confira Impersonation.cs.ArgumentLogic.cs, SQLAuthentication.cs e ModuleHandler.cs.ModuleHandler.cs não usa mais uma enorme declaração 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 contém variáveis globais usadas em todo o 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 aos 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.lWhoai.lEnableXp.lDisableXp.lEnableOle.lDisableOle.lSmb.lWhoami.lRoles.oldCmd.iOleCmd.lDatabases.lTables./v, /verbose é opcional e exibe todas as consultas SQL executadas por um módulo antes de executá-las no(s) host(s) remoto(s). Um exemplo disso pode ser encontrado na wiki.| Nome do Módulo | Descrição | Personificação | Execução Vinculada | Execução em Cadeia Vinculada | Requer Contexto Privilegiado |
|---|
CheckRpc | Obter uma lista de servidores vinculados e seu status RPC. | ✅ | ✅ | ✅ | ❎ |
Databases | Exibir todos os bancos de dados. | ✅ | ✅ | ✅ | ❎ |
Impersonate | Enumerar contas de usuário que podem ser personificadas. | ✅ | ✅ | ✅ | ❎ |
Info | Mostrar informações sobre o servidor SQL. | ✅ | ✅ | ✅ | ❎ |
Links | Enumerar servidores SQL vinculados. | ✅ | ✅ | ✅ | ❎ |
Users | Exibir quais contas de usuário e grupos podem autenticar no banco de dados. | ✅ | ✅ | ✅ | ❎ |
Whoami | Exibir 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 no banco de dados e na tabela fornecidos. | ✅ | ✅ | ✅ | ❎ |
Rows /db:DATABASE /table:TABLE | Exibir o número de linhas na tabela do banco de dados fornecida. | ✅ | ✅ | ✅ | ❎ |
Search /keyword:KEYWORD | Pesquisar nomes de colunas na tabela fornecida do banco de dados ao qual você está conectado. | ✅ | ✅ | ✅ | ❎ |
Tables /db:DATABASE | Exibir todas as tabelas no banco de dados fornecido. | ✅ | ✅ | ✅ | ❎ |
EnableRpc /rhost:LINKED_HOST | Habilitar RPC e RPC out em um servidor vinculado. | ✅ | ❌ | ❌ | ✔️ |
EnableClr | Habilitar integração CLR. | ✅ | ✅ | ✅ | ✔️ |
EnableOle | Habilitar procedimentos de automação OLE. | ✅ | ✅ | ✅ | ✔️ |
EnableXp | Habilitar xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
DisableRpc /rhost:LINKED_HOST | Desabilitar RPC e RPC out em um servidor vinculado. | ✅ | ❌ | ❌ | ✔️ |
DisableClr | Desabilitar integração CLR. | ✅ | ✅ | ✅ | ✔️ |
DisableOle | Desabilitar procedimentos de automação OLE. | ✅ | ✅ | ✅ | ✔️ |
DisableXp | Desabilitar xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
AgentStatus | Exibir se o agente SQL está em execução e obter trabalhos do agente. | ✅ | ✅ | ✅ | ✔️ |
AgentCmd /c:COMMAND | Executar um comando de sistema usando trabalhos do agente. | ✅ | ✅ | ✅ | ✔️ |
Adsi /adsi:SERVER_NAME /lport:LOCAL_PORT | Obter credenciais ADSI em texto claro de um servidor ADSI vinculado. | ✅ | ✅ | ✅ | ✔️ |
Clr /dll:DLL /function:FUNCTION | Carregar e executar um assembly .NET em um procedimento armazenado personalizado. | ✅ | ✅ | ✅ | ✔️ |
OleCmd /c:COMMAND /subsystem:(OPCIONAL) | Executar um comando de sistema usando procedimentos de automação OLE. | ✅ | ✅ | ✅ | ✔️ |
XpCmd /c:COMMAND | Executar um comando de sistema usando xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
| Nome do Módulo | Descrição | Personificação | Requer Contexto Privilegiado |
|---|
Users | Exibir todos os usuários do SCCM. | ✅ | ❎ |
Sites | Exibir todos os outros sites com dados armazenados. | ✅ | ❎ |
Logons | Exibir todos os clientes SCCM associados e o último usuário que fez login. | ✅ | ❎ |
Credentials | Exibir credenciais criptografadas armazenadas pelo SCCM. | ✅ | ❎ |
TaskList | Exibir todas as sequências de tarefas, mas sem acessar o conteúdo dos dados das tarefas. | ✅ | ❎ |
TaskData | Descriptografar todas as sequências de tarefas para texto simples. | ✅ | ❎ |
DecryptCredentials | Descriptografar um blob de credenciais do SCCM. Deve ser executado em um processo de alta integridade ou SYSTEM no servidor SCCM. | ❌ | ✔️ |
AddAdmin /user:DOMAIN\USERNAME /sid:SID | Elevar uma conta fornecida para 'Full Administrator' no SCCM. | ✅ | ✔️ |
RemoveAdmin /user:ADMIN_ID /remove:STRING | Remove privilégios de um usuário ou remove um usuário inteiramente do banco de dados SCCM. | ✅ | ✔️ |
DecryptCredentials tenta descriptografar blobs de credenciais SCCM recuperados. Este módulo deve ser executado em um processo de alta integridade ou SYSTEM em um servidor SCCM.AddAdmin eleva a conta especificada para 'Full Administrator' no SCCM. Se o usuário alvo já for um usuário SCCM, este módulo adicionará os privilégios necessários para elevar. Forneça dois argumentos: /user:current /sid:current se desejar adicionar o usuário que está executando atualmente o processo do SQLRecon como 'Full Administrator' no SCCM. Se desejar adicionar outro usuário como 'Full Administrator' no SCCM, especifique o nome de usuário do domínio e o SID completo /user:DOMAIN\USERNAME /sid:S-1-5-.... Este módulo requer privilégios de sysadmin ou similares, pois é necessário escrever nas tabelas do banco de dados SCCM.RemoveAdmin remove os privilégios de um usuário removendo completamente um usuário recém-adicionado do banco de dados SCCM. Se o usuário já existia de alguma forma, este módulo apenas remove as três funções que foram adicionadas à conta por meio de gravações 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 similares, pois é necessário escrever nas tabelas do banco de dados SCCM./verbose, /v), que exibirá todas as consultas SQL que serão executadas durante a execução do módulo./timeout, /t), que aceita um valor inteiro para o tempo limite de conexão com o banco de dados do SQL Server.links aprimorado para incluir informações detalhadas. Créditos a Azaël Martin (n3rada).whoami aprimorado para incluir principais do Windows e usuários do banco de dados. Créditos a Azaël Martin (n3rada).impersonation aprimorado para incluir principais do Windows e usuários do banco de dados. Créditos a Azaël Martin (n3rada).sqlspns. Créditos a Azaël Martin (n3rada)./enum:info./subsystem ao módulo olecmdexec, que aceita execução usando os subsistemas de automação OLE CmdExec ou PowerShell.AzureAD para EntraID.ModuleHandler.csQueries.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 em whoami.lMapped e lRoles em lWhoami.iMapped e iRoles em iWhoami.