
Um poderoso rastreador de navegador para scanners de vulnerabilidades web
Um poderoso rastreador de navegador para scanners de vulnerabilidades web
Documento em Inglês | Documento em Chinês
crawlergo é um rastreador de navegador que utiliza o modo headless do chrome para coleta de URLs. Ele intercepta pontos-chave de toda a página web durante a fase de renderização do DOM, preenche e submete formulários automaticamente, com acionamento inteligente de eventos JS, e coleta o maior número possível de entradas expostas pelo site. O módulo interno de desduplicação de URLs filtra uma grande quantidade de URLs pseudoestáticas, mantendo uma velocidade rápida de análise e rastreamento para sites grandes, e finalmente obtém uma coleção de alta qualidade de resultados de requisições.
crawlergo atualmente suporta os seguintes recursos:

Por favor, leia e confirme o termo de isenção de responsabilidade cuidadosamente antes de instalar e usar.
Construção
make build
make build_all
Se estiver usando um sistema Linux e o Chrome reclamar de dependências ausentes, veja a seção de Solução de Problemas abaixo
Supondo que seu diretório de instalação do Chromium seja /tmp/chromium/, configure 10 abas abertas simultaneamente e rastreie o testphp.vulnweb.com:
bin/crawlergo -c /tmp/chromium/chrome -t 10 http://testphp.vulnweb.com/
Você também pode usar com docker sem problemas:
git clone https://github.com/Qianlitp/crawlergo
docker build . -t crawlergo
docker run crawlergo http://testphp.vulnweb.com/
bin/crawlergo -c /tmp/chromium/chrome -t 10 --request-proxy socks5://127.0.0.1:7891 http://testphp.vulnweb.com/
Por padrão, crawlergo imprime os resultados diretamente na tela. Em seguida, definimos o modo de saída como json, e o código de exemplo para chamá-lo usando Python é o seguinte:
#!/usr/bin/python3
# coding: utf-8
import simplejson
import subprocess
def main():
target = "http://testphp.vulnweb.com/"
cmd = ["bin/crawlergo", "-c", "/tmp/chromium/chrome", "-o", "json", target]
rsp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = rsp.communicate()
# "--[Mission Complete]--" é a string separadora de fim de tarefa
result = simplejson.loads(output.decode().split("--[Mission Complete]--")[1])
req_list = result["req_list"]
print(req_list[0])
if __name__ == '__main__':
main()
Quando o modo de saída é definido como json, o resultado retornado, após desserialização JSON, contém quatro partes:
all_req_list: Todas as requisições encontradas durante esta tarefa de rastreamento, contendo qualquer tipo de recurso de outros domínios.req_list: Retorna os resultados do domínio atual desta tarefa de rastreamento, desduplicados pseudoestaticamente, sem links de recursos estáticos. É um subconjunto de all_req_list.all_domain_list: Lista de todos os domínios encontrados.sub_domain_list: Lista de subdomínios encontrados.crawlergo retorna a requisição completa e a URL, que podem ser usadas de várias maneiras:
Usado em conjunto com outros scanners passivos de vulnerabilidades web
Primeiro, inicie um scanner passivo e defina o endereço de escuta como: http://127.0.0.1:1234/
Em seguida, assumindo que crawlergo está na mesma máquina que o scanner, inicie crawlergo e defina os parâmetros:
--push-to-proxy http://127.0.0.1:1234/
Vinculação de Host (não disponível para versões altas do Chrome) (exemplo)
Cookies Personalizados (exemplo)
Limpeza regular de processos zumbis gerados pelo crawlergo (exemplo), contribuído por @ring04h
crawlergo pode contornar a detecção de modo headless por padrão.
https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html

'Fetch.enable' não foi encontrado
Fetch é um recurso suportado pela nova versão do Chrome. Se este erro ocorrer, significa que sua versão é muito antiga, por favor, atualize a versão do Chrome.
Chrome é executado com dependências ausentes, como xxx.so
// Ubuntu
apt-get install -yq --no-install-recommends \
libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 \
libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 \
libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libgbm1 \
libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 libnss3
// CentOS 7
sudo yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 \
libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 \
ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc -y
sudo yum update nss -y
Execução com aviso Navigation timeout / navegador não encontrado / não sabe o caminho executável correto do navegador
Certifique-se de que o caminho executável do navegador está configurado corretamente. Digite: chrome://version na barra de endereços e encontre o caminho do arquivo executável:

--chromium-path Path, -c Path O caminho para o executável do Chrome. (Obrigatório)--custom-headers Headers Personalize o cabeçalho HTTP. Por favor, passe os dados após serialização JSON; isso é definido globalmente e será usado para todas as requisições. (Padrão: null)--post-data PostData, -d PostData Dados POST. (Padrão: null)--max-crawled-count Number, -m Number O número máximo de tarefas para os rastreadores, para evitar tempo de rastreamento longo devido a pseudo-estática. (Padrão: 200)--filter-mode Mode, -f Mode Modo de filtragem, simple: apenas recursos estáticos e requisições duplicadas são filtrados. smart: com capacidade de filtrar pseudo-estática. strict: regras de filtragem pseudo-estática mais rigorosas. (Padrão: smart)--output-mode value, -o value Modo de saída dos resultados, console: imprime os resultados melhorados diretamente na tela. json: imprime a string serializada em JSON de todos os resultados. none: não imprime a saída. (Padrão: console)--fuzz-path Usa o dicionário interno para fuzzing de caminhos. (Padrão: false)--fuzz-path-dict Personaliza o caminho de Fuzz passando o caminho de um arquivo de dicionário, ex.: /home/user/fuzz_dir.txt, cada linha do arquivo representa um caminho a ser fuzzeado. (Padrão: null)--robots-path Resolve o caminho do arquivo /robots.txt. (Padrão: false)--ignore-url-keywords, -iuk Palavra-chave de URL que você não deseja visitar, geralmente usada para excluir links de logout ao personalizar cookies. Uso: -iuk logout -iuk exit. (padrão: "logout", "quit", "exit")--form-values, -fv Personaliza o valor do preenchimento do formulário, definido por tipo de texto. Tipos suportados: default, mail, code, phone, username, password, qq, id_card, url, date e number. Os tipos de texto são identificados pelas quatro palavras-chave de valor de atributo id, name, class, type da label do campo de entrada. Por exemplo, defina o campo de entrada de email para ser preenchido automaticamente com A e o campo de entrada de senha para ser preenchido automaticamente com B, -fv mail=A -fv password=B. Onde default representa o valor de preenchimento quando o tipo de texto não é reconhecido, como "Cralwergo". (Padrão: Cralwergo)--form-keyword-values, -fkv Personaliza o valor do preenchimento do formulário, definido por correspondência difusa de palavra-chave. A palavra-chave corresponde aos quatro valores de atributo id, name, , da label do campo de entrada. Por exemplo, correspondência difusa da palavra-chave pass para preencher 123456 e da palavra-chave user para preencher admin, . (Padrão: Cralwergo)--max-tab-count Number, -t Number O número máximo de abas que o rastreador pode abrir simultaneamente. (Padrão: 8)--tab-run-timeout Timeout Tempo máximo de execução para uma única aba. (Padrão: 20s)--wait-dom-content-loaded-timeout Timeout O tempo máximo de espera para a página terminar de carregar. (Padrão: 5s)--event-trigger-interval Interval O intervalo quando o evento é acionado automaticamente, geralmente usado no caso de rede lenta do alvo e conflitos de atualização do DOM que levam à perda de captura de URL. (Padrão: 100ms)--event-trigger-mode Value Modo de acionamento automático de eventos DOM, com async e sync, para captura perdida de URL devido a conflitos de atualização do DOM. (Padrão: async)--before-exit-delay Atraso para sair e fechar o Chrome no final de uma tarefa de aba única. Usado para esperar que atualizações parciais do DOM e requisições XHR sejam capturadas. (Padrão: 1s)--push-to-proxy O endereço de escuta para onde os resultados do rastreador serão enviados, geralmente o endereço de escuta do scanner passivo. (Padrão: null)--push-pool-max O número máximo de concorrência ao enviar os resultados do rastreador para o endereço de escuta. (Padrão: 10)--log-level Níveis de registro, debug, info, warn, error e fatal. (Padrão: info)--no-headless Desliga o modo headless do Chrome para visualizar o processo de rastreamento. (Padrão: false)Weibo: @9ian1i Twitter: @9ian1i
Artigos relacionados: Uma prática de rastreador de navegador para varredura de vulnerabilidades web
--output-json filepath Escreve o resultado no arquivo especificado após serializá-lo em JSON. (Padrão: null)--request-proxy proxyAddress Endereço do proxy socks5; todas as requisições de rede do crawlergo e do navegador Chrome são enviadas através do proxy. (Padrão: null)classtype-fkv user=admin -fkv pass=123456