xnl-h4ck3r/xnLinkFinder
GitHub: xnl-h4ck3r/xnLinkFinder
xnLinkFinder 是一款基于 Python 的链接发现与参数抽取工具,能够从在线站点或离线安全日志中自动收集 URL、参数、词表和潜在机密。
Stars: 1530 | Forks: 186

## 关于 - v8.1
这是一款用于发现端点、发现潜在参数、生成针对特定目标的词表以及为给定目标寻找机密的工具。它可以通过以下方式实现:
- 爬取目标(传递域名/URL)
- 爬取多个目标(传递包含域名/URL 的文件)
- 在给定目录中搜索文件(传递目录名)
- 搜索单个文件的内容
- 从 **Burp** 项目中获取(传递 Burp XML 文件的位置)
- 从 **ZAP** 项目中获取(传递 ZAP ASCII 消息文件的位置)
- 从 **Caido** 项目中获取(传递 Caido 导出 CSV 文件的位置)
- 从 **HAR(HTTP Archive)文件** 中获取(传递 HAR JSON 文件的位置)
- 处理 [waymore](https://github.com/xnl-h4ck3r/waymore) 结果目录(搜索 `waymore -mode R` 的归档响应文件,并请求 `waymore.txt` 中的 URL 以及 `waymore_index.txt` 中的原始 URL - 参见 [waymore README.md](https://github.com/xnl-h4ck3r/waymore/blob/main/README.md))
该 Python 脚本基于我的 Burp 扩展 [GAP](https://github.com/xnl-h4ck3r/burp-extensions) 的链接发现功能。
作为起点,我采用了 Gerben Javado 的出色工具 [LinkFinder](https://github.com/GerbenJavado/LinkFinder),并使用正则表达式来寻找链接,同时进行了一些改进,以发现更多内容。
## 安装
`xnLinkFinder` 支持 **Python 3**。
在默认(全局)Python 环境中安装 `xnLinkFinder`。
```
pip install xnLinkFinder
```
或
```
pip install git+https://github.com/xnl-h4ck3r/xnLinkFinder.git -v
```
您可以通过以下方式升级
```
pip install --upgrade xnLinkFinder
```
### pipx
使用 [pipx](https://pypa.github.io/pipx/) 在隔离的 Python 环境中快速设置
```
pipx install git+https://github.com/xnl-h4ck3r/xnLinkFinder.git
```
**注意:要从 PDF 文件中提取链接,您可以在系统上安装 `pdftotext`。在 Linux 上可以使用 `sudo apt install -y poppler-utils`,在 macOS 上可以使用 `brew install poppler`。如果未安装 `pdftotext`,`xnLinkFinder` 将回退使用 `pypdf` Python 库。如果未找到文本(例如扫描的 PDF),它会尝试使用已安装的 `ocrmypdf`(例如 `sudo apt install -y ocrmypdf`)。使用 `pdftotext` 和 `ocrmypdf` 通常能获得比仅使用 `pypdf` 更好的结果。**
## 用法
| 参数 | 长参数 | 描述 |
| ----------- | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| -i | --input | 输入:URL、URL 文本文件、要搜索的文件目录、Burp XML 输出文件、ZAP 输出文件、Caido CSV 文件、HAR JSON 文件,或单个文件的内容搜索。 |
| -o | --output | 保存链接输出的文件(包括必要的路径),默认:output.txt。如果设置为 `cli`,则仅输出到 STDOUT。如果文件已存在,则会追加(并去重),除非传递 `-ow` 选项。 |
| -op | --output-params | 保存潜在参数输出的文件(包括必要的路径),默认:parameters.txt。如果设置为 `cli`,则仅输出到 STDOUT(但不会管道到其他程序)。如果文件已存在,则会追加(并去重),除非传递 `-ow` 选项。 |
| -owl | --output-wordlist | 保存针对特定目标词表输出的文件(包括必要的路径),默认:不输出词表。如果设置为 `cli`,则仅输出到 STDOUT(但不会管道到其他程序)。如果文件已存在,则会追加(并去重),除非传递 `-ow` 选项。 |
| -oo | --output-oos | 保存超出范围链接输出的文件(包括必要的路径),默认:不输出 OOS。如果设置为 `cli`,则仅输出到 STDOUT(但不会管道到其他程序)。如果文件已存在,则会追加(并去重),除非传递 `-ow` 选项。 |
| -os | --output-secrets | 保存响应中发现的任何机密(JSON 格式)的文件(包括必要的路径),默认:不输出机密。如果文件已存在,机密将被合并,除非传递 `-ow` 选项。机密按类型和值分组,并附带发现来源的数组。 |
| -ow | --output-overwrite | 如果输出文件已存在,将覆盖而不是追加。 |
| -sp | --scope-prefix | 任何以 `/` 开头的链接将在输出中加上作用域域名前缀,而不是原始链接。如果传递的值是有效的文件名,则使用该文件;否则使用字符串字面量。 |
| -spo | --scope-prefix-original | 如果传递了 `-sp` 参数,则此项决定是否在输出中也包含以 `/` 开头的原始链接(默认:false)。 |
| -spkf | --scope-prefix-keep-failed | 如果传递了 `-spkf` 参数,则此项决定在输出中是否保留返回 404 或出现 RequestException 的前缀链接(默认:false)。 |
| -sf | --scope-filter | 只保留域名在指定作用域内的链接。若传递的值是有效的文件名,则使用该文件;否则使用字符串字面量。若输入为域名/URL(或域名/URL 文件),此参数为必需,以防止爬取不在作用域内的站点并避免误导性结果。 |
| -c | --cookies † | 为 HTTP 请求添加 Cookie。格式为 `'name1=value1; name2=value2;'` |
| -H | --headers † | 为 HTTP 请求添加自定义头。格式为 `'Header1: value1; Header2: value2;'` |
| -ra | --regex-after | 在输出前对发现的端点进行正则过滤(例如 `/api/v[0-9]\.[0-9]\*`)。匹配后输出该链接。 |
| -d | --depth † | 搜索深度层级。例如,传递值为 2,则首先找到的所有链接会再次被搜索以发现更多链接(默认:1)。该选项对 Burp、ZAP、Caido、HAR 文件无效,因为它们可能很大且占用大量内存。建议使用 `-sp`(`--scope-prefix`)参数,以确保对没有域名的链接进行请求尝试。 |
| -p | --processes † | 在为 URL 或 URL 文件(非 Burp、ZAP、Caido、HAR 文件)获取请求时使用基本多线程。此参数决定使用的进程(线程)数(默认:25)。 |
| -rl | --rate-limit † | 每秒最大请求数(默认:0,无速率限制)。有助于防止对目标服务器造成过大负载。 |
| -x | --exclude | 额外的链接排除(对应 `config.yml` 中的列表),逗号分隔,例如 `careers,forum` |
| -orig | --origin | 是否在输出中显示链接的来源。输出格式为 `LINK-URL [ORIGIN-URL]`(默认:false)。 |
| -prefixed | | 是否在输出中显示哪些链接被加了前缀。输出时在链接和来源后显示 `(PREFIXED)`(默认:false)。 |
| -xrel | --exclude-relative-links | 默认情况下,结果中以 `./` 或 `../` 开头的相对链接会被包含。使用此参数不添加这些相对链接。 |
| -t | --timeout † | 等待服务器发送数据的最大秒数(默认:10 秒)。 |
| -r | --retries † | 失败后(如超时、连接错误等)重试请求的次数。最多 5 次(默认:0)。 |
| -inc | --include | 在输出中包含输入(`-i`)的链接(默认:false)。 |
| -u | --user-agent † | 要使用的 User Agent,例如 `-u desktop mobile`。可选值:`desktop`、`mobile`、`set-top-boxes`、`game-console`。还有 `mobile-apple`、`mobile-android`、`mobile-windows`,它们是 `mobile` 的子集,可单独使用。 |
| -uc | --user-agent-custom † | 为所有请求使用自定义 User Agent 字符串。此选项会覆盖 `-u`/`--user-agent` 参数。适用于需要特定 User Agent 头来识别您的程序的情况。 |
| -insecure | † | 是否在请求时禁用 TLS 证书检查(默认:false)。 |
| -s429 | † | 当 >95% 的响应返回 429 Too Many Requests 时停止(默认:false)。 |
| -s403 | † | 当 >95% 的响应返回 403 Forbidden 时停止(默认:false)。 |
| -sTO | † | 当 >95% 的请求超时时停止(默认:false)。 |
| -sCE | † | 当 >95% 的请求出现连接错误时停止(默认:false)。 |
| -m | --memory-threshold | 内存阈值百分比。如果机器内存超过该阈值,程序将在耗尽内存前优雅停止(默认:95)。 |
| -mfs | --max-file-size † | 当 `-i` 为目录时,检查文件的最大大小(字节)。若文件大小超过该值,则被忽略(默认:500 MB)。设置为 0 表示不忽略任何文件,无论大小。 |
| -mrs | --max-response-size † | 下载的最大响应大小(MB)。大于此大小的响应将被跳过(默认:100 MB)。 |
| -fp | --forward-proxy † | 对 URL(或 URL 文件)进行主动链接发现时,通过代理(如 Burp 或 Caido)重放请求,例如 `http://127.0.0.1:8080`。 |
| -rp | --request-proxy | 请求使用的代理。可以是代理字符串(如 `http://user:pass@1.2.3.4:8000`、`socks5://host:port`)或包含代理列表的文件(每行一个,随机选择)。 |
| | --heap | 是否对访问过的 URL 进行堆快照并从浏览器内存中提取链接。这会耗时更长,但可能发现标准静态分析漏掉的动态生成链接(需要安装 Playwright)。 |
| -ro | --readable-only | 若传递,则在使用 BeautifulSoup 从 HTML 响应/文件中搜索链接前,仅提取可读文本。会排除 `