
DorX de Próxima Geração. Construído por Dorks, para Dorks. 🤓
DorXNG é uma solução moderna para coletar dados de OSINT utilizando operadores de busca avançados através de múltiplos provedores de busca upstream. No backend, utiliza uma imagem conteinerizada especialmente construída do SearXNG, um meta-mecanismo de busca auto-hospedado, customizável e focado em privacidade.
Nossa implementação do SearXNG direciona todas as consultas de pesquisa pela rede Tor, renovando os circuitos a cada dez segundos com a diretiva de configuração MaxCircuitDirtiness do Tor. Também desabilitamos todos os recursos de timeout do lado do cliente do SearXNG. Essas configurações permitem evadir restrições comuns dos mecanismos de busca ao emitir muitas consultas repetidas.
O aplicativo cliente DorXNG é escrito em Python3 e interage com a API do SearXNG para emitir consultas de pesquisa simultaneamente. Ele pode até mesmo enviar requisições através de múltiplas instâncias do SearXNG. Os resultados da pesquisa são armazenados em um banco de dados SQLite3.

Ativamos todos os mecanismos de busca upstream suportados que permitem consultas com operadores avançados:
GoogleDuckDuckGoQwantBingBraveStartpageYahooPara mais informações sobre quais mecanismos de busca o SearXNG suporta, veja: Configured Engines
Agradecimentos aos desenvolvedores do Tor e do SearXNG por tornarem isso possível. Vá doar para ambos os projetos!
Agradecimento ao desenvolvedor do pagodo pela inspiração e pelo ótimo script ghdb_scraper.py!
Por último, mas certamente não menos importante, agradecimento ao j0hnny. O OG Dork. 🧠🏴☠
Instalar o DorXNG
git clone https://github.com/researchanddestroy/dorxng
cd dorxng
pip install -r requirements.txt
./DorXNG.py -h
Baixar e Executar Nosso Contêiner Docker Customizado do SearXNG (pelo menos um). Múltiplas instâncias do SearXNG podem ser usadas. Utilize a opção --serverlist com o DorXNG. Veja: server.lst
docker run researchanddestroy/searxng:latest
Se você quiser construir o contêiner você mesmo:
git clone https://github.com/researchanddestroy/searxng # A URL deve estar em letras minúsculas para que o processo de build seja concluído
cd searxng
DOCKER_BUILDKIT=1 make docker.build
docker images
docker run <image-id>
Por padrão, o DorXNG possui uma variável server codificada em parse_args.py que é definida como o endereço IP que o Docker atribuirá ao primeiro contêiner executado em sua máquina 172.17.0.2. Isso pode ser alterado ou substituído com --server ou --serverlist.
Comece a Emitir Consultas de Pesquisa
./DorXNG.py -q 'consulta de pesquisa'
Consultar o Banco de Dados do DorXNG
./DorXNG.py -D 'string de regex para pesquisa'
-h, --help mostra esta mensagem de ajuda e sai
-s SERVER, --server SERVER
Instância do Servidor DorXNG - Exemplo: 'https://172.17.0.2/search'
-S SERVERLIST, --serverlist SERVERLIST
Emitir Consultas de Pesquisa em uma Lista de Servidores - Formato: Delimitado por Nova Linha
-q QUERY, --query QUERY
Emitir uma Consulta de Pesquisa - Exemplos: 'consulta de pesquisa' | '!tch consulta de pesquisa' | 'site:exemplo.com intext:exemplo'
-Q QUERYLIST, --querylist QUERYLIST
Iterar por uma Lista de Consultas de Pesquisa - Formato: Delimitado por Nova Linha
-n NUMBER, --number NUMBER
Definir o Número de Iterações de Resultados de Página
-c CONCURRENT, --concurrent CONCURRENT
Definir o Número de Requisições de Página Simultâneas
-l LIMITDATABASE, --limitdatabase LIMITDATABASE
Definir o Limite Máximo de Tamanho do Banco de Dados - Inicia Novo Banco de Dados Após Exceder - Exemplo: --limitdatabase 10 (10k Entradas no Banco) - O Tamanho Máximo Sugerido é 50k
ao fazer Recursão Profunda
-L LOOP, --loop LOOP Definir o Número de Iterações do Loop da Função Principal - Loop Infinito com 0
-d DATABASE, --database DATABASE
Especificar o Arquivo do Banco de Dados SQL - Padrão: 'dorxng.db'
-D DATABASEQUERY, --databasequery DATABASEQUERY
Emitir Consulta ao Banco de Dados - Formato: Regex
-m MERGEDATABASE, --mergedatabase MERGEDATABASE
Mesclar Arquivo de Banco de Dados SQL - Exemplo: --mergedatabase database.db
-t TIMEOUT, --timeout TIMEOUT
Especificar Intervalo de Timeout Entre Requisições - Padrão: 4 Segundos - Desabilitar com 0
-r NONEWRESULTS, --nonewresults NONEWRESULTS
Especificar Número de Iterações Sem Novos Resultados - Padrão: 4 (3 Tentativas) - Desabilitar com 0
-v, --verbose Habilitar Saída Detalhada
-vv, --veryverbose Habilitar Saída Muito Detalhada - Exibe Saída JSON Bruta
Às vezes você encontrará um nó de saída do Tor que já foi limitado pelos provedores de busca upstream, fazendo com que você receba uma quantidade mínima de resultados de pesquisa. Não se preocupe... Apenas continue enviando consultas. 😉
Mantenha seu arquivo de banco de dados SQL do DorXNG e execute novamente seu comando, ou use a opção --loop para iterar a função principal repetidamente. 🔁
Na maioria das vezes, quanto mais vezes você passar por uma consulta de pesquisa, mais resultados encontrará. 🍻
Lembre-se também de que sacrificamos velocidade em prol de uma maior quantidade de dados de saída. Afinal, este é um projeto de OSINT. 🔎🌎
Cada consulta de pesquisa que você faz está sendo emitida para 7 provedores de busca upstream... Especialmente com consultas --concurrent, isso gera muitas requisições upstream... Portanto, tenha paciência.
Lembre-se de que o DorXNG continuará adicionando novos resultados de pesquisa ao seu arquivo de banco de dados. Use a opção --database para especificar um nome de arquivo de banco de dados; o nome padrão é dorxng.db. Isso provavelmente não importa para a maioria, mas se quiser manter suas investigações de OSINT separadas, está disponível.
Quatro requisições de pesquisa simultâneas parece ser o ponto ideal. Você pode emitir mais, mas quanto mais consultas emitir de uma vez, mais tempo leva para receber os resultados. Também aumenta a probabilidade de receber respostas HTTP/429 Too Many Requests dos provedores de busca upstream naquele circuito Tor específico.
Se você iniciar vários contêineres Docker do SearXNG muito rapidamente, as conexões Tor podem falhar ao estabelecer. Ao inicializar um contêiner, uma resposta válida da função de Verificação de Conectividade Tor é assim:
Checking Tor Connectivity..
{"IsTor":true,"IP":"<tor-exit-node>"}
Se você vir algo diferente disso, ou se começar a ver códigos de resposta HTTP/500 vindos do script de monitoramento do SearXNG (STDOUT no contêiner), mate o contêiner Docker e inicie um novo.
Códigos de resposta HTTP/504 Gateway Time-out dentro do DorXNG são esperados às vezes. Isso significa que a instância do SearXNG não recebeu uma resposta válida dentro de um minuto. Esse circuito Tor específico provavelmente está muito lento. Apenas continue!
Realmente não há motivo para executar uma tonelada desses contêineres... Ainda... 😉 Quantos você executa realmente depende do que está fazendo. Cada contêiner usa aproximadamente 1,25GBs de RAM.
Executar um contêiner funciona perfeitamente bem, exceto que você provavelmente perderá resultados de pesquisa. Portanto, use --loop e não desabilite --timeout.
Executar múltiplos contêineres é bom porque cada um tem seu próprio circuito Tor que está sendo renovado a cada 10 segundos.
Ao executar o modo --serverlist, desabilite a opção --timeout para que não haja atraso entre as requisições (o intervalo de atraso padrão é de 4 segundos).
Lembre-se de que quanto mais contêineres você executar, mais memória será necessária. Isso também se aplica à recursão profunda... Desabilitamos o limite máximo de recursão do Python... 🔁😉
Quanto mais recursões seu comando passar sem retornar ao main, mais memória o processo consumirá. Você pode voltar e descobrir que o processo travou com uma mensagem de erro Killed. Se isso acontecer, sua máquina ficou sem memória e matou o processo. Não se preocupe... Seu arquivo de banco de dados ainda está bom. 👍👍
Se seu arquivo de banco de dados ficar excepcionalmente grande, inevitavelmente isso diminui o programa e consome mais memória a cada iteração...
Esses Stack Frames do Python são Grossos... 🍑😅
Observamos uma queda perceptível no desempenho com arquivos de banco de dados que excedem aproximadamente 50 mil entradas.
A opção --limitdatabase foi implementada para mitigar alguns desses problemas de consumo de memória. Use-a em combinação com --loop para interromper a iteração recursiva profunda dentro de iterator.py e reiniciar a partir de main exatamente de onde parou.
Depois de ter uma série de arquivos de banco de dados, você pode mesclá-los todos (um de cada vez) com --mergedatabase. Você pode até mesmo mesclá-los todos em um novo arquivo de banco de dados se especificar um nome de arquivo não utilizado com --database.
O arquivo query.lst incluído contém todos os dorks que atualmente existem no Google Hacking Database (GHDB). Veja: ghdb_scraper.py
Já executamos tudo para você... 😉 Nosso arquivo ghdb.db contém mais de um milhão de entradas e contando! 🤩 Você pode baixá-lo aqui ghdb.db se quiser uma cópia. 😉
Exemplo de consulta ao banco de dados ghdb.db:
./DorXNG.py -d ghdb.db -D '^http.*\.sql$'
Uma reescrita do DorXNG em Golang já está em andamento. 😉 (GorXNG? | DorXNGNG?) 😆
Vamos precisar de mais dorks... 😅 Dê uma olhada no DorkGPT 👀
Consulta de Pesquisa Única
./DorXNG.py -q 'consulta de pesquisa'
Consultas de Pesquisa Simultâneas
./DorXNG.py -q 'consulta de pesquisa' -c4
Modo de Iteração de Página
./DorXNG.py -q 'consulta de pesquisa' -n4
Consultas de Pesquisa Simultâneas Iterativas
./DorXNG.py -q 'consulta de pesquisa' -c4 -n64
Modo de Iteração de Lista de Servidores
./DorXNG.py -S server.lst -q 'consulta de pesquisa' -c4 -n64 -t0
Modo de Iteração de Lista de Consultas
./DorXNG.py -Q query.lst -c4 -n64
Iteração de Lista de Consultas e Servidores
./DorXNG.py -S server.lst -Q query.lst -c4 -n64 -t0
Modo de Iteração do Loop da Função Principal
./DorXNG.py -S server.lst -Q query.lst -c4 -n64 -t0 -L4
Modo de Iteração do Loop da Função Principal Infinito com Limite de Tamanho do Arquivo de Banco de Dados Definido em 10k Entradas
./DorXNG.py -S server.lst -Q query.lst -c4 -n64 -t0 -L0 -l10
Mesclando um Banco de Dados (Um de Cada Vez) em um Novo Arquivo de Banco de Dados
./DorXNG.py -d new-database.db -m dorxng.db
Mesclar Todos os Arquivos de Banco de Dados no Diretório de Trabalho Atual em um Novo Arquivo de Banco de Dados
for i in `ls *.db`; do ./DorXNG.py -d new-database.db -m $i; done
Consultar um Banco de Dados
./DorXNG.py -d new-database.db -D 'string de regex para pesquisa'