Desenvolvimento de Exploits: Construindo Seu Próprio Fuzzer com BASH

contente

Bem-vindo de volta, meus aspirantes a cibercombatentes!

No campo de batalha digital da cibersegurança, o fuzzing de aplicações web se destaca como uma técnica crítica para descobrir vulnerabilidades e desenvolver exploits. Este guia prático equipa aspirantes a guerreiros cibernéticos com o conhecimento para usar a script BASH como uma arma poderosa na criação de ferramentas de fuzzing personalizadas.

Fuzzing é uma técnica de análise dinâmica utilizada em testes de software e avaliações de segurança. Envolve fornecer dados inválidos, inesperados ou aleatórios como entradas para uma aplicação web a fim de descobrir vulnerabilidades, bugs ou comportamentos inesperados.

O conceito de fuzzing originou-se em 1988, quando o Professor Barton Miller, da Universidade de Wisconsin-Madison, observou falhas no sistema durante uma tempestade. Essa observação levou ao desenvolvimento das primeiras ferramentas de fuzzing. Desde então, o fuzzing evoluiu para uma técnica sofisticada e essencial na cibersegurança moderna.

No seu cerne, fuzzing explora o vasto espaço de entrada de um programa. No entanto, para aplicações complexas, esse espaço é astronomicamente grande, tornando os testes exaustivos uma missão impossível. Essa limitação está relacionada ao problema da parada em ciência da computação, provando que nunca podemos garantir que descobrimos todos os bugs apenas através do fuzzing. Como resultado, nossas operações de fuzzing dependem de métodos probabilísticos, visando gerar entradas com uma alta probabilidade de acionar bugs ou vulnerabilidades dentro de um prazo razoável.

Fuzzing pode ser categorizado em vários tipos com base no conhecimento e na abordagem utilizada:

  1. Caixa-preta:
*   Nenhum conhecimento sobre os internos da aplicação.
*   Entradas geradas sem considerar a estrutura ou lógica da aplicação.
*   Pode descobrir vulnerabilidades inesperadas, mas pode ser menos eficiente.
  1. Caixa-branca:
*   Usa o conhecimento dos internos do programa para guiar a geração de entradas.
*   Pode incluir análise de código fonte, gráficos de fluxo de controle e execução simbólica.
*   Alcança uma cobertura de código mais alta, mas requer mais recursos e expertise.
  1. Caixa cinza:
*   Uma abordagem híbrida usando algum, mas não completo, conhecimento do sistema.
*   Frequentemente envolve instrumentar o programa alvo para coletar informações em tempo de execução.
*   Equilibra eficiência e profundidade dos testes.
  1. Baseada em geração:
*   Cria casos de teste do zero com base nas especificações de entrada.
*   Eficaz para formatos de entrada complexos, mas requer uma compreensão profunda da estrutura de entrada.
  1. Baseada em mutação:
*   Começa com entradas válidas e aplica várias transformações.
*   Prático e pode gerar rapidamente um grande número de casos de teste.
  1. Evolutivo:
*   Usa conceitos de algoritmos genéticos para evoluir casos de teste ao longo do tempo.
*   Pode ser particularmente eficaz para encontrar bugs profundos e de difícil acesso.

A fuzzing na web com BASH oferece várias vantagens atraentes. Um dos principais benefícios é sua simplicidade - scripts BASH são relativamente fáceis de escrever e entender, tornando-os acessíveis a aspirantes a guerreiros cibernéticos de diferentes níveis de habilidade.

Outra vantagem significativa de usar BASH para fuzzing na web é sua integração perfeita com o sistema. Scripts BASH podem interagir facilmente com outras ferramentas de linha de comando e utilitários do sistema.

No entanto, é importante considerar as limitações do uso do BASH para fuzzing na web:

  • Pode ser lento em projetos de grande escala.
  • Implementar técnicas avançadas de fuzzing pode ser desafiador.

Mas, em geral, construir um fuzzer web com BASH é perfeito para você se familiarizar com operações cibernéticas.

Agora que entendemos as fundações teóricas e os prós e contras do fuzzing baseado em BASH, vamos mergulhar na criação do nosso próprio fuzzer de aplicação web. Começaremos com um shebang para designar nosso script como um executável BASH, seguido por um breve resumo da missão. Em seguida, criaremos um prompt interativo para adquirir nosso domínio alvo.

Eu usei 'read -p' para mostrar o prompt e obter a entrada juntos. Também adicionei uma linha para separar visualmente este bloco do programa.

O coração do nosso fuzzer é o gerador de payloads. Ele cria vários casos de teste para sondar a aplicação. Então, vamos começar com isso, criar uma função dedicada para esse propósito e escrever payloads base para diferentes tipos de vulnerabilidades (Injeção de SQL, XSS, Injeção de Comando, etc.).

Em seguida, crie uma função “mutate_payload” que recebe um payload como argumento e imprime uma versão aleatória das versões mutadas dele. As mutações incluem adicionar caracteres (', <script>, /, \n) e realizar a codificação ROT13 no payload.

${#mutations">@"} - fornece o comprimento do array “mutations”.

ALEATÓRIO % ${#mutations[@]} -computa um índice aleatório dentro do intervalo de índices do array “mutations”. O operador % (módulo) garante que o número aleatório gerado esteja dentro dos limites válidos (de 0 até o comprimento do array “mutations” – 1).

Para gerar cargas úteis mutadas, precisamos que cada carga útil de "base_payloads" seja passada para "mutate_payload".

${base_payloads[@]}" - é usado para acessar todos os elementos de um array de uma vez.

Após gerar os payloads base e mutados, eles podem ser combinados no array de payloads. Para verificar se tudo está funcionando corretamente, também adicionarei outro loop para exibir todos os payloads.

Após criar os payloads, podemos prosseguir para escrever uma função para enviar requisições.

  1. São necessárias quatro coisas: onde estamos atingindo (URL), o que estamos enviando (payload), como estamos enviando (método) e quaisquer instruções especiais (cabeçalhos).
  1. Dependendo do método (GET, POST, PUT, DELETE), ele usa um comando curl diferente para enviar nossa solicitação.

_ -w "%{http_code}" -_ estamos pedindo ao curl para nos enviar o código de status HTTP.

Aqui são usados "case" e "esac" para criar uma declaração de ramificação múltipla, semelhante a uma declaração switch em Python ou outras linguagens de programação. "Esac" é simplesmente "case" soletrado ao contrário e é usado para terminar a declaração case.

3. Ele captura a resposta do site e tenta separar o código de status da mensagem real.

se [ \${#response} -ge 3 \] ; então - esta condição verifica se o comprimento da resposta é 3 ou mais caracteres.

código t_http - atribui esses últimos 3 caracteres (presumivelmente o código de status HTTP como 200, 404, etc.) à variável.

body=${response:0:${#response}-3} - atribui a substring (tudo, exceto os últimos 3 caracteres de response) à variável.

  1. Se a resposta for muito curta, ela define um código padrão e nos avisa.
  1. Finalmente, ele passa tudo o que aprendeu para outra função para descobrir o que tudo isso significa.

O analisador de resposta examina a resposta do servidor em busca de vulnerabilidades potenciais.

A princípio, analisaremos os códigos de status:

Ele escaneia a resposta em busca de palavras como "erro" ou "exceção". Se as encontrar, nos alerta e mostra um trecho. Em seguida, procura sinais específicos de vulnerabilidades:

Em seguida, criaremos uma função que chamará todas as anteriores necessárias. O ponto principal aqui é que primeiro geramos os payloads e, em seguida, fazemos uma solicitação para cada método e para cada payload.

Depois disso, vou adicionar uma entrada para obter os métodos necessários e escrevê-los em um array. Também vou adicionar um cabeçalho geral.

Fuzzing é frequentemente o primeiro passo no desenvolvimento de exploits. Ao fuzzar a aplicação, podemos identificar onde e como ela falha. O "break" é frequentemente um lugar onde podemos explorar.

Neste tutorial, apresentamos a você a fuzzing de aplicações web usando Bash, adaptado para aspirantes a guerreiros cibernéticos. Ele cobre o básico do que é fuzzing, por que o Bash pode ser uma boa ferramenta para aprendizado e fornece uma explicação passo a passo de como construir um fuzzer simples.

Resumir
O artigo aborda a técnica de fuzzing em aplicações web, essencial para identificar vulnerabilidades em segurança cibernética. Fuzzing consiste em fornecer dados inválidos ou inesperados a uma aplicação para descobrir falhas. Originado em 1988, evoluiu para uma técnica sofisticada, mas enfrenta limitações devido ao vasto espaço de entrada em aplicações complexas. O texto categoriza fuzzing em tipos como black-box, white-box, grey-box, entre outros, cada um com suas características e eficiência. O uso de scripts BASH para fuzzing é destacado por sua simplicidade e integração com ferramentas de linha de comando, embora possa ser lento em projetos grandes. O artigo também orienta sobre a criação de um fuzzer web em BASH, começando com a geração de payloads para diferentes tipos de vulnerabilidades, como SQL Injection e XSS. Funções são desenvolvidas para mutar payloads e enviar requisições, utilizando o comando curl para interagir com a aplicação alvo. O texto conclui com a importância de analisar as respostas recebidas para entender as vulnerabilidades exploradas.