DorXNG 是一个现代化解决方案,用于通过多个上游搜索提供商的先进搜索引擎操作符来收集 OSINT 数据。在后端,它利用了一个专门构建的容器化镜像 SearXNG,这是一个自托管、可破解、注重隐私的元搜索引擎。
我们的 SearXNG 实现将所有搜索查询通过 Tor 网络路由,同时每十秒通过 Tor 的 MaxCircuitDirtiness 配置指令刷新电路。我们还禁用了 SearXNG 的所有客户端超时功能。这些设置允许规避在多次重复搜索查询中常见的搜索引擎限制。
DorXNG 客户端应用程序使用 Python3 编写,并与 SearXNG API 交互以并发发出搜索查询。它甚至可以向多个 SearXNG 实例发出请求。生成的搜索结果存储在 SQLite3 数据库中。

我们启用了所有支持高级搜索操作符查询的上游搜索引擎:
GoogleDuckDuckGoQwantBingBraveStartpageYahoo有关 SearXNG 支持哪些搜索引擎的更多信息,请参见:已配置的引擎
向 Tor 和 SearXNG 的开发者致敬,是他们的工作让这个项目成为可能。请为这两个项目捐款!
向 pagodo 的开发者致敬,感谢他的启发以及那个优秀的 ghdb_scraper.py 脚本!
最后但同样重要的是,向 j0hnny 致敬。他是最初的 Dork 大师。🧠🏴☠
安装 DorXNG
git clone https://github.com/researchanddestroy/dorxng
cd dorxng
pip install -r requirements.txt
./DorXNG.py -h
下载并运行我们的自定义 SearXNG Docker 容器(至少一个)。可以使用多个 SearXNG 实例。使用 DorXNG 的 --serverlist 选项。参见:server.lst
docker run researchanddestroy/searxng:latest
如果您想自己构建容器:
git clone https://github.com/researchanddestroy/searxng # URL 必须全部小写,构建过程才能完成
cd searxng
DOCKER_BUILDKIT=1 make docker.build
docker images
docker run <image-id>
默认情况下,DorXNG 在 parse_args.py 中有一个硬编码的 server 变量,设置为 Docker 分配给在您的机器上运行的第一个容器的 IP 地址 172.17.0.2。这个值可以更改,或者使用 --server 或 --serverlist 覆盖。
开始发出搜索查询
./DorXNG.py -q 'search query'
查询 DorXNG 数据库
./DorXNG.py -D 'regex search string'
-h, --help 显示此帮助信息并退出
-s SERVER, --server SERVER
DorXNG 服务器实例 - 示例:'https://172.17.0.2/search'
-S SERVERLIST, --serverlist SERVERLIST
在服务器列表上发出搜索查询 - 格式:换行分隔
-q QUERY, --query QUERY
发出搜索查询 - 示例:'search query' | '!tch search query' | 'site:example.com intext:example'
-Q QUERYLIST, --querylist QUERYLIST
遍历搜索查询列表 - 格式:换行分隔
-n NUMBER, --number NUMBER
定义页面结果迭代次数
-c CONCURRENT, --concurrent CONCURRENT
定义并发页面请求数
-l LIMITDATABASE, --limitdatabase LIMITDATABASE
设置最大数据库大小限制 - 超出后启动新数据库 - 示例:--limitdatabase 10(10k 数据库条目) - 建议最大数据库大小为 50k
当进行深度递归时
-L LOOP, --loop LOOP 定义主函数循环迭代次数 - 设为 0 为无限循环
-d DATABASE, --database DATABASE
指定 SQL 数据库文件 - 默认:'dorxng.db'
-D DATABASEQUERY, --databasequery DATABASEQUERY
发出数据库查询 - 格式:正则表达式
-m MERGEDATABASE, --mergedatabase MERGEDATABASE
合并 SQL 数据库文件 - 示例:--mergedatabase database.db
-t TIMEOUT, --timeout TIMEOUT
指定请求之间的超时间隔 - 默认:4 秒 - 设为 0 禁用
-r NONEWRESULTS, --nonewresults NONEWRESULTS
指定没有新结果的迭代次数 - 默认:4(3 次尝试) - 设为 0 禁用
-v, --verbose 启用详细输出
-vv, --veryverbose 启用非常详细的输出 - 显示原始 JSON 输出
有时您会碰到一个已被上游搜索提供商屏蔽的 Tor 出口节点,导致收到的搜索结果很少。别担心……继续发出查询即可。😉
保留您的 DorXNG SQL 数据库文件并重新运行命令,或者使用 --loop 开关重复迭代主函数。🔁
通常情况下,对同一个搜索查询进行越多次扫描,您会发现越多的结果。🍻
还要记住,为了获得更大量的数据输出,我们牺牲了速度。毕竟这是一个 OSINT 项目。🔎🌎
您发出的每个搜索查询都会同时发送给 7 个上游搜索提供商……尤其是在使用 --concurrent 查询时,会产生大量的上游请求……所以请耐心等待。
请记住,DorXNG 会继续将新的搜索结果追加到您的数据库文件中。使用 --database 开关指定数据库文件名,默认文件名为 dorxng.db。这对大多数人来说可能无关紧要,但如果您想将不同的 OSINT 调查分离开来,这个功能就是为您准备的。
四个并发搜索请求似乎是理想的数量。您可以发出更多请求,但一次发出的查询越多,收到结果所需的时间就越长。同时,在特定 Tor 电路上收到上游搜索提供商返回 HTTP/429 Too Many Requests 响应的可能性也会增加。
如果您过快启动多个 SearXNG Docker 容器,Tor 连接可能会建立失败。
在初始化容器时,Tor 连接检查功能的有效响应如下所示:
Checking Tor Connectivity..
{"IsTor":true,"IP":"<tor-exit-node>"}
如果您看到任何其他内容,或者开始从 SearXNG 监控脚本(容器中的 STDOUT)收到 HTTP/500 响应代码,请杀死 Docker 容器并重新启动一个新容器。
DorXNG 中出现 HTTP/504 Gateway Time-out 响应代码有时是正常的。这意味着 SearXNG 实例在一分钟内没有收到有效响应。那个特定的 Tor 电路可能太慢了。继续就好!
实际上没有理由运行一大堆这样的容器……现在还没有……😉 运行多少个完全取决于您在做什么。每个容器大约使用 1.25GB 的 RAM。
运行一个容器完全可以正常工作,只是您可能会错过一些搜索结果。所以请使用 --loop,并且不要禁用 --timeout。
运行多个容器很好,因为每个容器都有自己的 Tor 电路,每 10 秒刷新一次。
当使用 --serverlist 模式时,请禁用 --timeout 功能,这样请求之间就不会有延迟(默认延迟间隔为 4 秒)。
请记住,运行的容器越多,您需要的內存就越多。深度递归也是如此……我们已经禁用了 Python 的最大递归限制……🔁😉
您的命令在不返回 main 的情况下进行的递归次数越多,进程消耗的内存就越多。您可能会回来发现进程已崩溃并显示 Killed 错误消息。如果发生这种情况,说明您的机器内存不足并杀死了该进程。不过别担心……您的数据库文件仍然是好的。👍👍
如果您的数据库文件变得异常大,它不可避免地会减慢程序速度,并在每次迭代时消耗更多内存……
那些 Python 栈帧很厚……🍑😅
我们观察到,数据库文件超过大约 5 万条记录时,性能会明显下降。
--limitdatabase 选项已经实现,用于缓解一些内存消耗问题。结合 --loop 使用,可以中断 iterator.py 中的深度递归迭代,并从 main 函数重新开始,接续之前的工作。
一旦您有了一系列数据库文件,可以使用 --mergedatabase 逐个合并它们。如果使用 --database 指定一个未使用的文件名,甚至可以将它们全部合并到一个新的数据库文件中。
附带的 query.lst 文件包含了 Google Hacking Database (GHDB) 中当前存在的所有 dork。参见:ghdb_scraper.py
我们已经为您运行了一遍……😉 我们的 ghdb.db 文件包含超过一百万个条目,并且还在不断增加!🤩 如果您想要一份副本,可以在这里下载 ghdb.db。😉
查询 ghdb.db 数据库的示例:
./DorXNG.py -d ghdb.db -D '^http.*\.sql$'
用 Golang 重写 DorXNG 已经在进行中。😉 (GorXNG? | DorXNGNG?) 😆
我们需要更多的 dork……😅 来看看 DorkGPT 👀
单个搜索查询
./DorXNG.py -q 'search query'
并发搜索查询
./DorXNG.py -q 'search query' -c4
页面迭代模式
./DorXNG.py -q 'search query' -n4
迭代并发搜索查询
./DorXNG.py -q 'search query' -c4 -n64
服务器列表迭代模式
./DorXNG.py -S server.lst -q 'search query' -c4 -n64 -t0
查询列表迭代模式
./DorXNG.py -Q query.lst -c4 -n64
查询和服务器列表迭代
./DorXNG.py -S server.lst -Q query.lst -c4 -n64 -t0
主函数循环迭代模式
./DorXNG.py -S server.lst -Q query.lst -c4 -n64 -t0 -L4
无限主函数循环迭代模式,数据库文件大小限制设为 10k 条记录
./DorXNG.py -S server.lst -Q query.lst -c4 -n64 -t0 -L0 -l10
将数据库(逐个)合并到新数据库文件中
./DorXNG.py -d new-database.db -m dorxng.db
将当前工作目录中的所有数据库文件合并到新数据库文件中
for i in `ls *.db`; do ./DorXNG.py -d new-database.db -m $i; done
查询数据库
./DorXNG.py -d new-database.db -D 'regex search string'