2K+ Alcance em 30 dias Deiteriy Lab 44,79 Classificação 162 Assinantes Assinar callmerulzz Há 1 hora Listas de palavras personalizadas para os menores Simples 9 min 2.2K Blog da empresa Deiteriy Lab Segurança da informação * Tutorial Olá! Não é segredo para ninguém que listas de palavras de qualidade são a chave para um fuzzing eficaz e, consequentemente, maior cobertura do escopo e boas descobertas durante testes de penetração e bug bounty. No entanto, as listas de palavras de acesso público nem sempre fornecerão cobertura suficiente, por maiores que sejam. O aplicativo web pode ter sua própria nomenclatura específica de caminhos e parâmetros. Alguns manipuladores podem estar em domínios fora do escopo e duplicados no escopo, às vezes até com funcionalidade alterada. Parte dos parâmetros não pode ser encontrada sem análise manual do código JavaScript do aplicativo. É aqui que entram as listas de palavras personalizadas, cobrindo todas as nuances acima. Graças a elas, você pode realizar o fuzzing dos caminhos do aplicativo web de forma muito mais eficaz, bem como forçar os parâmetros de suas solicitações. Este artigo é o primeiro de um ciclo sobre dicionários personalizados, que fala sobre como coletar uma lista de palavras básica sem muito esforço. No próximo artigo, falarei sobre como criar uma lista de palavras personalizada mais complexa, que requer mais tempo. Eu realmente preciso disso? Não importa se você é um caçador de recompensas ou um testador de penetração, uma cobertura maior do alvo é boa, porque sempre há uma chance de encontrar parâmetros e caminhos esquecidos pelos desenvolvedores. Mesmo um novo ativo encontrado pode lhe dar uma vantagem sobre outros pesquisadores. Se você tem um escopo amplo com muitos subdomínios, as chances de encontrar esses ativos são muito maiores do que em um teste de penetração de uma pequena empresa com alguns subdomínios. Mas mesmo neste caso, se houver tempo, você não deve negligenciar a criação de listas de palavras personalizadas. Certa vez, durante um teste de penetração de uma pequena empresa, graças a uma lista de palavras personalizada, consegui detectar XSS em um parâmetro oculto na página de pagamento. Vale a pena mencionar separadamente que os dicionários personalizados se mostram bem em testes de penetração regulares (Penetration Testing as a Service) e em bug bounty em grandes programas com uma base de código atualizada regularmente. Ao formar uma lista de palavras personalizada com base no estado atual do sistema, você a torna a chave para a superfície de ataque oculta no futuro. Por exemplo, você interceptou respostas JSON da API de um usuário autenticado e obteve palavras que não podem ser encontradas em arquivos da web, focados principalmente em salvar estática. Essas palavras exclusivas podem não estar envolvidas na lógica ativa do aplicativo no momento, mas é muito provável que apareçam nas próximas iterações do desenvolvimento do aplicativo durante seu próximo teste. No fluxo de trabalho, é importante distribuir seu tempo corretamente e não fazer da criação de uma lista de palavras um objetivo em si. Caso contrário, pode acontecer que você gaste muito tempo nisso na esperança de encontrar funcionalidade oculta, mas não terá tempo para prestar atenção suficiente ao estudo da lógica de negócios básica do alvo. Considere as listas de palavras personalizadas como uma parte adicional do OSINT. Pessoalmente, durante um teste de penetração, compilo uma lista de palavras na segunda metade do trabalho, depois de fazer uma reconhecimento básico e olhar para a funcionalidade principal. Depois disso, uso o dicionário seletivamente, guiado pela minha intuição de hacker. Às vezes, não faço uma lista de palavras personalizada, se precisar verificar muita lógica de negócios. Lista de palavras personalizada básica Abaixo, escrevi o processo de coleta de uma lista de palavras personalizada básica usando o exemplo de um aplicativo de teste.
- Rastreamento manual com proxy Tudo começa com a visita manual dos alvos com um proxy ativado e a coleta de um número suficiente de solicitações. Em meu trabalho, uso o Firefox com a extensão FoxyProxy , direcionando solicitações para o Burp Suite. As solicitações e respostas salvas no Burp Suite serão necessárias até o final deste capítulo para analisá-las por meio da extensão e coletar uma lista de palavras. Os rastreadores automatizados podem clicar em todas as páginas estáticas, mas eles lidam mal com a funcionalidade dinâmica, então você não pode ficar sem a etapa manual. Registre-se em sua conta pessoal, altere sua senha, envie uma mensagem para o suporte, pague uma assinatura, etc. - faça todas as ações possíveis disponíveis através da interface do usuário. Assim, você obterá mais solicitações à API e as respectivas respostas do servidor.
- Rastreamento automatizado Como mencionei acima, a automação cuidará de visitar todas as páginas estáticas. Eu uso o rastreador Katana
- é bastante rápido e possui uma análise dinâmica conveniente de links em arquivos JavaScript. Não se esqueça de passar o Cookie da sessão para o rastreador, se houver funcionalidade no alvo fechada por autorização. Proxy as solicitações do rastreador para o Burp Suite de forma semelhante. Além disso, para se proteger contra o bloqueio pelo WAF, aconselho a alterar o User-Agent para o agente padrão do navegador. Exemplo de comando (você pode substituir o parâmetro de profundidade de rastreamento -depth como desejar, o mesmo com limites de taxa no parâmetro -rl ): katana -u https://example.com (-list urls.txt) -depth 5 -js-crawl -jsluice -known-files all -proxy http://127.0.0.1:8080 -rl 100 -o katana-example-com.out -v -H 'User-Agent: xxx' -H 'Cookie: xxx=xxx'
- Fuzzing com listas de palavras padrão
Também é importante fazer fuzzing nos caminhos do aplicativo web com listas de palavras de acesso público para encontrar manipuladores ocultos e, o mais importante, salvar as respostas a eles. O conteúdo das respostas em um painel de administração personalizado aberto pode conter muitas palavras para nossa lista de palavras, e os arquivos JS na página de login - ainda mais.
Para fuzzing, uso a ferramenta
ffuf
e listas de palavras
fuzz.txt
,
content discovery all.txt
. O segundo é bastante grande, aconselho deixá-lo em execução durante a noite em um VPS no tmux.
Páginas válidas podem ser enviadas imediatamente para o Burp via parâmetros
-r -replay-proxy
http://127.0.0.1:8080
(
-r
— seguir redirecionamentos,
-replay-proxy
— direcionar para o proxy Burp Suite apenas as solicitações que passaram pela filtragem). Isso permite que você colete os resultados do fuzzing e faça o proxy dos endpoints válidos em uma passagem.
Se você precisar filtrar outro código de resposta, altere 403 em
-fc
para o correspondente (você pode listar através de uma vírgula, por exemplo,
-fc 403,404
).
Exemplo de comando:
ffuf -c -w fuzz.txt -u https://example.com/FUZZ -rate 80 -t 5 -fc 403 -H "User-Agent: Mozilla Firefox" -r -replay-proxy http://127.0.0.1:8080 -o ffuf/
-fuzz.out - Coletamos URLs de arquivos através do gau gau é uma ferramenta que permite coletar URLs salvos de um domínio em vários sites de arquivos, como webarchive.org . Ou seja, na verdade, realizar um OSINT automatizado rápido - encontrar URLs que não aparecem mais no aplicativo, mas permaneceram na história da Internet. Não ignore esta etapa - muitas descobertas vêm daqui. Exemplo de comando: cat <subdomains.txt> | gau --blacklist ttf,woff,svg,png,jpg --fc 404 --o gau.out --verbose Na prática, o argumento blacklist nem sempre funciona corretamente, por isso aconselho a grep estática inversamente da saída gau: cat gau.out | grep -vE '.ttf|.woff|.svg|.png|.jpg' Os URLs resultantes são executados através do mesmo ffuf para fazer o proxy deles no Burp, como na segunda etapa. Como meu aplicativo de teste é local e não deixou rastros na rede, para exemplos relacionados ao OSINT, usarei o site www.spacex.com :
- Analisamos arquivos JavaScript através do xnLinkFinder xnLinkFinder é uma ferramenta para rastreamento e busca de URLs em arquivos JavaScript. É notável por ser capaz de verificar caminhos relativos, bem como coletar uma lista de palavras separada de parâmetros, que então combinaremos com nossa lista de palavras personalizada principal. A ferramenta é necessária para aumentar a cobertura - ela encontra manipuladores ocultos em arquivos JS. Embora a ferramenta seja posicionada como um rastreador, não vejo sentido em fazer o rastreamento novamente depois de tê-lo feito através do Katana. Portanto, recomendo usar o xnLinkFinder como um analisador para arquivos JavaScript. Salve as solicitações-respostas do Burp, selecionando todos os URLs no alvo - clique com o botão direito - Salvar itens selecionados - codificar solicitações e respostas em base64. Exemplo de comando ( -sp
- domínio com um esquema para substituição antes de URLs relativos, -sf
- filtro por um ou mais domínios no arquivo XML do Burp Suite, se houver vários): xnLinkFinder -i <urls.xml> -sp https://example.com -sf example.com -o xnlinkfinder.out -op xnlinkfinder-params.out -d 3 Como resultado, você obterá uma lista de URLs encontrados e uma lista de palavras com parâmetros. Os URLs resultantes também precisam ser proxy no Burp Suite via ffuf.
- Formamos uma lista de palavras personalizada através do GAP GAP é uma extensão para Burp do autor do xnLinkFinder. É por isso que fizemos o proxy de todas as solicitações no Burp nas etapas anteriores. Ele analisa todos os URLs no alvo e compila uma lista de palavras personalizada com base neles. Você pode baixá-lo na BApp Store. Para uma cobertura mais completa, aconselho a ativar as seguintes opções antes de iniciar a extensão: Include URL path words? (no modo Parâmetros e no modo Palavras) JSON params (em Parâmetros de Solicitação e Resposta) Cookie names Name and Id attributes of HTML input fields Include potential params? Params from links found Selected target(s) Especifique também o diretório no campo Auto save output directory e clique em Salvar opções. Para iniciar: clique com o botão direito no domínio em Target - Extensions - GAP. Como resultado, duas listas de palavras (Params, Words) e uma lista de URLs (Links) são obtidas. No final, combinamos as listas de palavras do GAP com a lista de palavras de parâmetros do xnLinkFinder, removemos duplicatas e obtemos uma lista de palavras personalizada! cat xnlinkfinder-deiteriypay-params.out http-deiteriypay.local/deiteriypay.local_20260414_155944_params.txt http-deiteriypay.local/deiteriypay.local_20260414_155944_words.txt | sort -u > wordlist-final.txt Usando listas de palavras em um exemplo prático Param Miner Param Miner é uma extensão para Burp Suite do famoso James Kettle. Para começar, você precisa configurá-lo na guia correspondente na parte superior, especificando nossa lista de palavras e marcando a caixa use custom wordlist. Também uso algumas outras opções que você pode ver na captura de tela. Iniciar a extensão é muito simples - clique com o botão direito na solicitação - Extensions - Param Miner - Guess … Aconselho que você escolha opções lógicas para cada solicitação: Guess query params para solicitações GET, body params para solicitações POST/PUT/PATCH. Aconselho a verificar Guess cookies/headers apenas uma vez, a lógica provavelmente se repetirá em todo o alvo (mas, é claro, veja a situação). Se você quiser saber mais sobre outras opções do Param Miner, pode ler sobre isso em nosso artigo . Após a conclusão da verificação, vemos um novo Issue que o parâmetro oculto internal_receipt_id foi encontrado no manipulador deiteriypay.local:8090/checkout: O parâmetro internal_receipt_id foi embutido no arquivo app.js e foi extraído com sucesso pela extensão GAP. Graças a este parâmetro legado no stand de teste, foi possível encontrar XSS:
- ffuf A lista de palavras personalizada não se limita a força bruta de parâmetros. Ele também pode ser usado para fuzzing de caminhos. No entanto, os caminhos são frequentemente muito mais caprichosos para a nomenclatura, e em um alvo real, o dicionário com parâmetros requer refinamento para ser usado para fuzzing de caminhos. Eu não conheço nenhuma ferramenta que possa analisar a nomenclatura de caminhos e gerar URLs potenciais com base nela. Algo semelhante é implementado em kiterunner
- um fuzzing de API, mas sua funcionalidade de fuzzing recursivo é limitada por listas de palavras embutidas. Talvez as redes neurais possam ajudar bem nesta tarefa. Se você conhece ferramentas adequadas para trabalhar com dicionários personalizados - compartilhe nos comentários! Portanto, para uma cobertura competente do alvo, você deve dedicar pelo menos um pouco de tempo à análise manual da nomenclatura de URL e edição da lista de palavras com parâmetros. Mas, é claro, você também pode simplesmente lançar a lista de palavras com parâmetros para fuzzing como https://example.com/FUZZ . No stand de teste, lendo a lista de palavras Links do GAP, você pode ver que a separação de várias palavras através de
e prefixos como deiteriy- , deit- é frequentemente usada. Também sabemos que a API está localizada em /api/v1/. Com base nesses dados, faremos mutações na lista de palavras com parâmetros, adicionando prefixos às palavras que começam com letras minúsculas, bem como combinando essas palavras com hífens. Vamos verificar o URL http://deiteriypay.local:8090/api/v1/FUZZ . Um exemplo de script bash para limpar e mutar o dicionário será fornecido abaixo. As mutações da lista de palavras devem ser realizadas na lista de palavras mais limpa e menor possível para que não se expanda em tamanho. Falarei mais sobre a limpeza de listas de palavras na próxima parte do artigo. Enquanto isso, darei um exemplo de mutação da lista de palavras para o stand de teste. Percebi que há muitas palavras repetidas na lista de palavras com letras maiúsculas. Decidi limpar a lista de palavras removendo palavras com letras maiúsculas e palavras com menos de 3 caracteres, e fazer a concatenação de palavras com hífens e prefixos. Escrevi um script bash, mas é mais conveniente fazer isso via Python. Para ajudar a escrever scripts simples, recomendo usar IA. #!/usr/bin/env bash set -euo pipefail
INPUT="${1:-wordlist-final.txt}" OUTPUT="${2:-paths-mutated.txt}" PREFIXES="deiteriy deit"
if [[ ! -f "$INPUT" ]]; then exit 1 fi
ATOMS=$(mktemp)
Limpeza e preparação de "átomos"
sed 's/[-_]/
/g' "$INPUT" |
grep -v '[A-Z]' |
awk 'length >= 3' |
grep -vxE "$(echo $PREFIXES | tr ' ' '|')" |
sort -u > "$ATOMS"
Geração de mutações
awk -v prefixes="$PREFIXES" ' BEGIN { np = split(prefixes, px, " ") } { a[NR] = $0; n = NR } END { for (i = 1; i <= n; i++) { print a[i] for (p = 1; p <= np; p++) print px[p] "-" a[i] } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { if (i == j) continue combo = a[i] "-" a[j] print combo for (p = 1; p <= np; p++) print px[p] "-" combo } } }' "$ATOMS" | sort -u > "$OUTPUT"
rm -f "$ATOMS" A lista de palavras acabou sendo impressionante, é por isso que mencionei acima que você deve trabalhar com a versão mais limpa possível do dicionário para mutações. Fuzzing da API do stand de teste e resultados: Conclusões Listas de palavras personalizadas podem ajudar a cobrir o alvo de forma mais ampla, bem como encontrar funcionalidade oculta, inacessível ao usar listas de palavras padrão. No entanto, a criação de listas de palavras não é um processo totalmente automático e leva tempo. É importante distribuí-lo de forma competente, percebendo as listas de palavras personalizadas como um complemento ao OSINT. Como resultado, o fluxo geral de criação de uma lista de palavras personalizada é o seguinte: Compartilhe suas opiniões sobre o artigo nos comentários, suas abordagens para compilar e usar listas de palavras, bem como as ferramentas que você usa para isso. Vejo você na próxima parte! Nela, falarei sobre como compilar listas de palavras personalizadas mais avançadas com a adição de OSINT ao fluxo, bem como sobre utilitários e abordagens para limpar dicionários. Também abordarei ferramentas que ajudam a coletar uma lista de palavras sem GAP - por exemplo, se você usa Caido em vez de Burp. Tags: segurança da informação teste de penetração fuzzing bug bounty segurança de aplicativos web burp suite ffuf recon teste de api
Hubs: Blog da empresa Deiteriy Lab Segurança da informação +1 3 0 2K+ Alcance em 30 dias Deiteriy Lab Site 1 Carma @callmerulzz Usuário Assinar O fluxo de segurança da informação está disponível 24 horas por dia, 7 dias por semana, graças ao apoio dos amigos do Habr Cursos Habr para todos PUBLICIDADE Prática, Hexlet, SkyPro, cursos do autor - reunimos todos e pedimos descontos. Resta escolher! Ir Ir para o fluxo de segurança da informação Comentar Os melhores do dia Semelhante





