
DorX de próxima generación. Construido por Dorks, para Dorks. 🤓
DorXNG es una solución moderna para recolectar datos de OSINT utilizando operadores de búsqueda avanzados a través de múltiples proveedores de búsqueda upstream. En el backend, utiliza una imagen contenerizada especialmente construida de SearXNG, un metabuscador autoalojado, hackeable y centrado en la privacidad.
Nuestra implementación de SearXNG enruta todas las consultas de búsqueda a través de la red Tor, renovando los circuitos cada diez segundos mediante la directiva de configuración MaxCircuitDirtiness de Tor. También hemos desactivado todas las funciones de tiempo de espera del lado del cliente de SearXNG. Estos ajustes permiten evadir las restricciones que los motores de búsqueda suelen imponer al realizar muchas consultas repetidas.
La aplicación cliente de DorXNG está escrita en Python3 e interactúa con la API de SearXNG para emitir consultas de búsqueda de forma concurrente. Incluso puede realizar peticiones a través de múltiples instancias de SearXNG. Los resultados obtenidos se almacenan en una base de datos SQLite3.

Hemos habilitado todos los motores de búsqueda upstream compatibles que permiten consultas con operadores avanzados:
GoogleDuckDuckGoQwantBingBraveStartpageYahooPara más información sobre qué motores de búsqueda soporta SearXNG, consulte: Configured Engines
Un agradecimiento a los desarrolladores de Tor y SearXNG por hacer esto posible. ¡Donen a ambos proyectos!
Otro agradecimiento al desarrollador de pagodo por la inspiración y ese fantástico script ghdb_scraper.py.
Por último, pero no menos importante, un agradecimiento a j0hnny. El OG Dork. 🧠🏴☠
Instalar DorXNG
git clone https://github.com/researchanddestroy/dorxng
cd dorxng
pip install -r requirements.txt
./DorXNG.py -h
Descargar y ejecutar nuestro contenedor Docker personalizado de SearXNG (al menos uno). Se pueden usar múltiples instancias de SearXNG. Utilice la opción --serverlist con DorXNG. Consulte: server.lst
docker run researchanddestroy/searxng:latest
Si desea construir el contenedor usted mismo:
git clone https://github.com/researchanddestroy/searxng # La URL debe estar en minúsculas para que el proceso de compilación se complete
cd searxng
DOCKER_BUILDKIT=1 make docker.build
docker images
docker run <image-id>
Por defecto, DorXNG tiene una variable server codificada en parse_args.py que está configurada con la dirección IP que Docker asignará al primer contenedor que ejecute en su máquina: 172.17.0.2. Esto se puede cambiar o sobrescribir con --server o --serverlist.
Comenzar a emitir consultas de búsqueda
./DorXNG.py -q 'consulta de búsqueda'
Consultar la base de datos de DorXNG
./DorXNG.py -D 'cadena de búsqueda regex'
-h, --help Muestra este mensaje de ayuda y sale.
-s SERVER, --server SERVER
Instancia del servidor DorXNG - Ejemplo: 'https://172.17.0.2/search'
-S SERVERLIST, --serverlist SERVERLIST
Emite consultas de búsqueda a través de una lista de servidores - Formato: delimitado por nueva línea
-q QUERY, --query QUERY
Emite una consulta de búsqueda - Ejemplos: 'consulta de búsqueda' | '!tch consulta de búsqueda' | 'site:ejemplo.com intext:ejemplo'
-Q QUERYLIST, --querylist QUERYLIST
Itera a través de una lista de consultas de búsqueda - Formato: delimitado por nueva línea
-n NUMBER, --number NUMBER
Define el número de iteraciones de resultados por página
-c CONCURRENT, --concurrent CONCURRENT
Define el número de peticiones de página concurrentes
-l LIMITDATABASE, --limitdatabase LIMITDATABASE
Establece el tamaño máximo de la base de datos - Inicia una nueva base de datos al superarlo - Ejemplo: --limitdatabase 10 (10k entradas en la base de datos) - Tamaño máximo sugerido: 50k
cuando se hace recursión profunda
-L LOOP, --loop LOOP Define el número de iteraciones del bucle de la función principal - Bucle infinito con 0
-d DATABASE, --database DATABASE
Especifica el archivo de base de datos SQL - Por defecto: 'dorxng.db'
-D DATABASEQUERY, --databasequery DATABASEQUERY
Emite una consulta en la base de datos - Formato: Regex
-m MERGEDATABASE, --mergedatabase MERGEDATABASE
Fusiona un archivo de base de datos SQL - Ejemplo: --mergedatabase database.db
-t TIMEOUT, --timeout TIMEOUT
Especifica el intervalo de espera entre peticiones - Por defecto: 4 segundos - Deshabilitar con 0
-r NONEWRESULTS, --nonewresults NONEWRESULTS
Especifica el número de iteraciones sin resultados nuevos - Por defecto: 4 (3 intentos) - Deshabilitar con 0
-v, --verbose Activa la salida detallada
-vv, --veryverbose Activa la salida muy detallada - Muestra la salida JSON sin procesar
A veces te encontrarás con un nodo de salida de Tor que ya está bloqueado por los proveedores de búsqueda upstream, lo que provocará que recibas una cantidad mínima de resultados. No te preocupes... Sigue lanzando consultas. 😉
Conserva tu archivo de base de datos SQL de DorXNG y vuelve a ejecutar tu comando, o usa el interruptor --loop para iterar la función principal repetidamente. 🔁
Por lo general, cuantas más pasadas hagas sobre una consulta de búsqueda, más resultados encontrarás. 🍻
También ten en cuenta que hemos sacrificado velocidad para obtener un mayor volumen de datos. Después de todo, esto es un proyecto de OSINT. 🔎🌎
Cada consulta de búsqueda que realizas se envía a 7 proveedores de búsqueda upstream... Especialmente con consultas --concurrent, esto genera muchas peticiones upstream... Así que ten paciencia.
Ten en cuenta que DorXNG seguirá añadiendo nuevos resultados de búsqueda a tu archivo de base de datos. Usa el interruptor --database para especificar un nombre de archivo de base de datos; el nombre por defecto es dorxng.db. Esto probablemente no importe para la mayoría, pero si quieres mantener separadas tus investigaciones de OSINT, está ahí para ti.
Cuatro consultas concurrentes parece ser el punto óptimo. Puedes emitir más, pero cuantas más consultas hagas a la vez, más tardarás en recibir los resultados. También aumenta la probabilidad de recibir respuestas HTTP/429 Too Many Requests de los proveedores de búsqueda upstream en ese circuito específico de Tor.
Si inicias varios contenedores Docker de SearXNG demasiado rápido, las conexiones Tor pueden fallar al establecerse. Al inicializar un contenedor, una respuesta válida de la función de verificación de conectividad Tor tiene este aspecto:
Checking Tor Connectivity..
{"IsTor":true,"IP":"<tor-exit-node>"}
Si ves algo diferente, o si empiezas a ver códigos de respuesta HTTP/500 provenientes del script de monitoreo de SearXNG (STDOUT en el contenedor), mata el contenedor Docker y levanta uno nuevo.
A veces se esperan códigos de respuesta HTTP/504 Gateway Time-out dentro de DorXNG. Esto significa que la instancia de SearXNG no recibió una respuesta válida en menos de un minuto. Ese circuito Tor en particular probablemente sea demasiado lento. ¡Sigue adelante!
Realmente no hay razón para ejecutar una gran cantidad de estos contenedores... Todavía... 😉 Cuántos ejecutes depende de lo que estés haciendo. Cada contenedor usa aproximadamente 1.25 GB de RAM.
Ejecutar un solo contenedor funciona perfectamente, excepto que probablemente perderás resultados de búsqueda. Así que usa --loop y no deshabilites --timeout.
Ejecutar múltiples contenedores es bueno porque cada uno tiene su propio circuito Tor que se renueva cada 10 segundos.
Cuando uses el modo --serverlist, deshabilita la opción --timeout para que no haya demora entre peticiones (el intervalo de demora por defecto es de 4 segundos).
Ten en cuenta que cuantos más contenedores ejecutes, más memoria necesitarás. Esto también aplica para la recursión profunda... Hemos deshabilitado el límite máximo de recursión de Python... 🔁😉
Cuantas más recursiones atraviese tu comando sin volver a main, más memoria consumirá el proceso. Puede que vuelvas y descubras que el proceso se ha bloqueado con un mensaje de error Killed. Si esto sucede, tu máquina se quedó sin memoria y mató el proceso. Pero no te preocupes... Tu archivo de base de datos sigue intacto. 👍👍
Si tu archivo de base de datos se vuelve excepcionalmente grande, inevitablemente ralentiza el programa y consume más memoria con cada iteración...
Esos Stack Frames de Python son gruesos... 🍑😅
Hemos notado una caída significativa en el rendimiento con archivos de base de datos que superan aproximadamente las 50 mil entradas.
La opción --limitdatabase se ha implementado para mitigar algunos de estos problemas de consumo de memoria. Úsala en combinación con --loop para romper la iteración recursiva profunda dentro de iterator.py y reiniciar desde main justo donde lo dejaste.
Una vez que tengas una serie de archivos de base de datos, puedes fusionarlos todos (uno a la vez) con --mergedatabase. Incluso puedes fusionarlos todos en un nuevo archivo de base de datos si especificas un nombre de archivo no utilizado con --database.
El archivo incluido query.lst contiene todos los dorks que existen actualmente en la Google Hacking Database (GHDB). Ver: ghdb_scraper.py
Ya lo hemos ejecutado por ti... 😉 ¡Nuestro archivo ghdb.db contiene más de un millón de entradas y sigue creciendo! 🤩 Puedes descargarlo aquí ghdb.db si deseas una copia. 😉
Ejemplo de consulta a la base de datos ghdb.db:
./DorXNG.py -d ghdb.db -D '^http.*\.sql$'
Una reescritura de DorXNG en Golang ya está en proceso. 😉 (GorXNG? | DorXNGNG?) 😆
Vamos a necesitar más dorks... 😅 Echa un vistazo a DorkGPT 👀
Consulta de búsqueda única
./DorXNG.py -q 'consulta de búsqueda'
Consultas de búsqueda concurrentes
./DorXNG.py -q 'consulta de búsqueda' -c4
Modo de iteración de página
./DorXNG.py -q 'consulta de búsqueda' -n4
Consultas de búsqueda concurrentes iterativas
./DorXNG.py -q 'consulta de búsqueda' -c4 -n64
Modo de iteración de lista de servidores
./DorXNG.py -S server.lst -q 'consulta de búsqueda' -c4 -n64 -t0
Modo de iteración de lista de consultas
./DorXNG.py -Q query.lst -c4 -n64
Iteración de consultas y lista de servidores
./DorXNG.py -S server.lst -Q query.lst -c4 -n64 -t0
Modo de iteración de bucle de función principal
./DorXNG.py -S server.lst -Q query.lst -c4 -n64 -t0 -L4
Modo de iteración de bucle infinito de función principal con límite de tamaño de base de datos establecido en 10k entradas
./DorXNG.py -S server.lst -Q query.lst -c4 -n64 -t0 -L0 -l10
Fusionar una base de datos (una a la vez) en un nuevo archivo de base de datos
./DorXNG.py -d new-database.db -m dorxng.db
Fusionar todos los archivos de base de datos en el directorio de trabajo actual en un nuevo archivo de base de datos
for i in `ls *.db`; do ./DorXNG.py -d new-database.db -m $i; done
Consultar una base de datos
./DorXNG.py -d new-database.db -D 'cadena de búsqueda regex'