关于 - v6.4
这是一个用于发现给定目标的端点(和潜在参数)的工具。它可以通过以下方式找到它们:
- 爬取单个目标(输入域名/URL)
- 爬取多个目标(输入包含域名/URL的文件)
- 搜索指定目录中的文件(输入目录名)
- 从Burp项目中获取(输入Burp XML文件的位置)
- 从OWASP ZAP项目中获取(输入ZAP ASCII消息文件的位置)
- 从Caido项目中获取(输入Caido导出的CSV文件位置)
- 处理waymore结果目录(搜索
waymore -mode R
的归档响应文件,并请求waymore.txt
中的URL和index.txt
中的原始URL - 参见waymore README.md)
这个Python脚本基于我的Burp扩展GAP的链接查找功能。 作为起点,我采用了Gerben Javado开发的出色工具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在隔离的Python环境中快速设置
pipx install git+https://github.com/xnl-h4ck3r/xnLinkFinder.git
使用方法
参数 | 长参数 | 描述 |
---|---|---|
-i | --input | 输入:URL、URL文本文件、要搜索的文件目录、Burp XML输出文件、OWASP ZAP输出文件或Caido CSV文件。 |
-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选项。 |
-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文件无效,因为它们可能非常大且消耗大量内存。建议使用-sp (--scope-prefix )参数,以确保可以尝试请求没有域名的链接。 |
-p | --processes † | 获取URL或URL文件请求时(不适用于Burp文件、ZAP文件或Caido文件)进行基本的多线程处理。此参数确定使用的进程(线程)数量(默认:25)。 |
-x | --exclude | 额外的链接排除项(除config.yml 中的列表外),以逗号分隔的列表形式,例如careers,forum 。 |
-orig | --origin | 是否在输出中包含链接的来源。在输出中显示为LINK-URL [ORIGIN-URL] (默认:false)。 |
-prefixed | 是否在输出中显示哪些链接被添加了前缀。在输出中的链接和来源后显示(PREFIXED) (默认:false)。 | |
-xrel | --exclude-relative-links | 默认情况下,结果中以./ 或../ 开头的任何链接都将被包含。如果使用此参数,这些相对链接将不会被添加。 |
-t | --timeout † | 等待服务器发送数据的最长时间(秒),超时后放弃(默认:10秒)。 |
-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表示不会忽略任何文件,无论大小如何。 |
-rp | --replay-proxy† | 对于使用URL(或URL文件)进行主动链接查找,通过此代理重放请求。 |
-ascii-only | 是否仅在链接和参数仅包含ASCII字符时添加它们。当你知道目标可能使用ASCII字符,并且由于某种原因从二进制文件中获得了许多误报时,这可能很有用。 | |
-mtl | --max-time-limit | 运行的最大时间限制(分钟)(默认:0)。如果传递0,则没有限制。 |
--config | YML配置文件的路径。如果未传递,将在默认目录(通常是~/.config/xnLinkFinder )中查找config.yml 文件。 | |
-nwlpl | --no-wordlist-plurals | 默认情况下,为目标特定词表找到单词时,如果有单数词的复数形式,或反之,则会添加新词。如果使用此参数,则不执行此过程。 |
-nwlpw | --no-wordlist-pathwords | 默认情况下,链接中发现的任何路径词都将被处理用于目标特定词表。如果使用此参数,则不会处理它们。注意:如果YAML配置中的respParamPathWords 值为True ,则此参数不会产生任何效果,除非同时传递了-nwlpm /--no-wordlist-parameters 。 |
-nwlpm | --no-wordlist-parameters | 默认情况下,链接中找到的任何参数都将被处理以生成目标特定的词表。如果使用此参数,则不会处理这些参数。 |
-nwlc | --no-wordlist-comments | 默认情况下,页面中的任何注释都将被处理以生成目标特定的词表。如果使用此参数,则不会处理这些注释。 |
-nwlia | --no-wordlist-imgalt | 默认情况下,任何图像的"alt"属性都将被处理以生成目标特定的词表。如果使用此参数,则不会处理这些属性。 |
-nwld | --no-wordlist-digits | 从目标特定的词表中排除包含数字的任何单词。 |
-nwll | --no-wordlist-lowercase | 默认情况下,添加任何包含大写字符的单词时,也会添加该单词的小写形式。如果使用此参数,则不会添加小写形式的单词。 |
-wlml | --wordlist-maxlen | 添加到目标特定词表的单词的最大长度,不包括复数形式(默认值:0 - 无限制) |
-swf | --stopwords-file | 一个包含额外停用词的文件(除了YML配置文件中的"stopWords"之外),用于从目标特定的词表中排除单词。停用词用于自然语言处理,不同的库中可以找到不同的列表。根据您的目标,您可能希望添加不同语言的单词。 |
-brt | --burpfile-remove-tags | 当使用-i 传递的输入是Burp文件时,会交互式地询问用户是否要从该文件中删除不必要的标签(有时Burp XML文件中存在问题,通常可以通过删除不必要的标签来解决,这也会使文件变小)。如果您在脚本中使用xnLinkFinder,您不希望中断以等待用户输入,因此可以通过传递此参数并设置为true 或false 来设置。注意:这是对文件的永久更改 |
-nb | --no-banner | 隐藏工具横幅。 |
-v | --verbose | 详细输出 |
-vv | --vverbose | 更详细的输出 |
--version | 显示当前版本号。 | |
-h | --help | 显示帮助信息并退出 |
† 对于输入目录、BURP XML文件、OWASP ZAP文件或CAIDO CSV文件不相关 |
config.yml
config.yml
文件(通常位于~/.config/xnLinkFinder/
)包含可以根据需要更新的键:
linkExclude
- 以逗号分隔的字符串列表(例如.css,.jpg,.jpeg
等),所有链接都会与之对比。如果链接包含任何这些字符串,则会被排除在输出之外。如果输入是目录,则文件名会与此列表对比。contentExclude
- 以逗号分隔的字符串列表(例如text/css,image/jpeg,image/jpg
等),所有响应的Content-Type
头部都会与之对比。任何具有这些内容类型的响应都将被排除,不会检查链接。fileExtExclude
- 以逗号分隔的字符串列表(例如.zip,.gz,.tar
等),在目录模式下所有文件都会与之对比。如果文件具有这些扩展名之一,则不会搜索链接。另外,在正常模式下,如果响应没有内容类型可供排除检查,它将检查URL末尾是否有这些扩展名,以决定是否搜索链接。regexFiles
- 以管道符分隔的文件类型列表(例如php|php3|php5
等)。这些用于链接查找正则表达式中,当发现不明显的链接但是有趣的文件类型时,你想要挑选出来。如果你添加到这个列表中,确保转义任何点以确保正确的正则表达式,例如js\.map
respParamLinksFound
† - 是否从响应中找到的链接获取潜在参数:True
或False
respParamPathWords
† - 是否将检索到的链接中的路径词添加为潜在参数:True
或False
respParamJSON
† - 如果响应的MIME类型包含JSON,是否将JSON键值添加为潜在参数:True
或False
respParamJSVars
† - 是否将用var
、let
或const
设置的JavaScript变量添加为潜在参数:True
或False
respParamXML
† - 如果响应的MIME类型包含XML,是否将XML属性值添加为潜在参数:True
或False
respParamInputField
† - 如果响应的MIME类型包含HTML,是否将任何INPUT字段的NAME和ID属性添加为潜在参数:True
或False
respParamMetaName
† - 如果响应的MIME类型包含HTML,是否将任何META标签的NAME属性添加为潜在参数:True
或False
wordsContentTypes
- 以逗号分隔的字符串列表(例如text/html,text/plain
),用于指定将搜索哪些响应内容类型以获取目标特定词表的单词。stopWords
- 以逗号分隔的字符串列表(例如then,this,that
),用于指定从目标特定词表中排除的单词。这个默认列表最初由英语限定词、并列连词和介词,以及来自Scikit-Learn(一个Python机器学习库)的停用词列表组成。
† 如果在配置文件中找不到这些,它们将默认为True
示例
从特定目标查找链接 - 基本
xnLinkFinder -i target.com -sf target.com
从特定目标查找链接 - 详细
理想情况下,提供带有主域(包括架构)的作用域前缀(-sp
),以及用于过滤结果仅包含相关域的作用域过滤器(-sf
)(这可以是文件或作用域内的域)。此外,你可以传递cookies和自定义头部,以确保只找到授权用户可用的链接。
指定用户代理(-u desktop mobile
)将首先使用桌面用户代理搜索所有链接,然后使用移动用户代理再次尝试。可能有与给定用户代理相关的特定端点。给出深度值(-d
)将继续向上一深度搜索中找到的链接发送请求,以查找更多链接。
xnLinkFinder -i target.com -sp target_prefix.txt -sf target_scope.txt -spo -inc -vv -H 'Authorization: Bearer XXXXXXXXXXXXXX' -c 'SessionId=MYSESSIONID' -u desktop mobile -d 10
从URL列表查找链接 - 基本
如果你有一个JS文件URL列表,你可以在这些文件中查找链接:
xnLinkFinder -i target_js.txt -sf target.com
从目录中的文件查找链接 - 基本
如果你有文件,例如JS文件、HTTP响应等,你可以在这些文件中查找链接:
xnLinkFinder -i ~/.config/waymore/results/target.com
注意:子目录也会被检查。可以指定-mfs
选项以跳过超过特定大小的文件。
从Burp项目查找链接 - 基本
在Burp中,通过高亮范围然后右键单击并选择Save selected items
来选择要搜索的项目。在保存之前确保勾选了base64-encode requests and responses
选项。
要从文件中获取所有链接(即使是巨大的文件,你也能获取所有链接):
xnLinkFinder -i target_burp.xml
注意:xnLinkFinder假设如果用-i
传递的文件的第一行以<?xml
开头,那么你正在尝试处理一个Burp文件。
从Burp项目查找链接 - 详细
理想情况下,提供带有主域(包括架构)的作用域前缀(-sp
),以及用于过滤结果仅包含相关域的作用域过滤器(-sf
)。
xnLinkFinder -i target_burp.xml -o target_burp.txt -sp https://www.target.com -sf target.* -ow -spo -inc -vv
从OWASP ZAP项目查找链接 - 基本
在ZAP中,通过高亮历史记录来选择要搜索的项目,点击菜单Export
并选择Export Messages to File...
。这将让你保存一个包含所有你想搜索的请求和响应的ASCII文本文件。
要从文件中获取所有链接(即使是巨大的文件,你也能获取所有链接):
xnLinkFinder -i target_zap.txt
注意:xnLinkFinder假设如果用-i
传递的文件的第一行格式为==== 99 ==========
(v2.11.1)或===99 ==========
(v2.12),那么你正在尝试处理一个OWASP ZAP ASCII文本文件。
从Caido导出的CSV文件查找链接 - 基本
在Caido中,转到History部分并选择Export选项。
如果你使用的是Caido Pro或Enterprise版本,选择Export current rows选项并选择As CSV。转到Exports部分并下载CSV文件。然后作为输入传递:
xnLinkFinder -i 2023-03-18-010332_csv_requests.csv
如果你使用的是Caido Community版本,你必须选择Export all选项并选择As CSV。转到Exports部分并下载CSV文件。由于你有完整的历史记录,你需要从CSV文件中删除任何不相关的内容。使用下面的示例,其中redbull
是你正在查看的目标域名的主要部分。
cat 2023-03-18-010332_csv_requests.csv | grep -E '^id|^[0-9]+,[^,]*redbull' > caido_redbull.csv
xnLinkFinder -i caido_redbull.csv
注意:xnLinkFinder假设如果用-i
传递的文件的第一行格式为id,host,method
,那么你正在尝试处理一个Caido导出的CSV文件。
从Waymore结果目录查找链接
waymore工具可用于从各种第三方API获取URL,并从archive.org(Wayback Machine)下载存档的响应。将waymore结果目录传递给xnLinKFinder
将搜索存档响应的内容,也会请求waymore.txt
中的URL以及index.txt
中的存档URL,并从这些响应中获取更多链接。
xnLinkFinder -i ~/Tools/waymore/results/target.com
注意:它作为普通目录传递,但xnLinkFinder会确定它是waymore结果目录并相应处理。这依赖于URL文件默认命名为waymore.txt
,并且该文件与存档文件在同一目录中(默认情况下就是这样)。
管道到其他工具
你可以将xnLinkFinder管道到其他工具。任何错误都会发送到stderr
,发现的任何链接都会发送到stdout
。输出文件仍然会创建,除了链接被管道到下一个程序。然而,潜在的参数不会被管道到下一个程序,但它们仍然会写入文件。例如:
xnLinkFinder -i redbull.com -sp https://redbull.com -sf rebbull.* -d 3 | unfurl keys | sort -u
您也可以通过stdin
而不是-i
传递输入。
cat redbull_subs.txt | xnLinkFinder -sp https://redbull.com -sf rebbull.* -d 3
注意:您不能通过管道传入Burp、ZAP或Caido文件,这些必须使用-i
传递。
建议和注意事项
- 始终使用域名前缀参数
-sp
。这可以是一个域名,也可以是包含多个域名的文件。 以下是使用的格式示例(不应包含路径,也不使用通配符。schema是可选的,但默认为http):
如果找到没有域名的链接,例如http://www.target.com https://target-payments.com https://static.target-cdn.com
/path/to/example.js
,那么传递-sp http://www.target.com
将会输出http://www.target.com/path/to/example.js
,如果深度(-d
)>1,则可以向该URL发出请求以搜索更多链接。如果使用-sp
传递了一个域名文件,则输出将包括每个域名后跟/path/to/example.js
,从而增加找到更多链接的机会。 - 如果您使用
-sp
但仍然希望在输出中额外返回原始链接/path/to/example.js
(不带域名),则传递参数-spo
。 - 始终使用域名过滤参数
-sf
。这将确保在输出中只返回相关域名,更重要的是,如果深度(-d
)>1,则不会搜索超出范围的目标链接或参数。这可以是一个域名,也可以是包含多个域名的文件。以下是使用的格式示例(不应包含schema或路径):
这仅用于过滤链接的域名。target.* target-payments.com static.target-cdn.com
- 如果您想以任何方式过滤最终输出,请使用
-ra
。建议始终使用https://regex101.com/ 检查您的正则表达式是否会达到预期效果。 - 使用
-v
选项可以更好地了解工具正在做什么。 - 如果遇到问题,请使用
-vv
选项,它可能会显示正在发生的错误,这些错误可能可以解决,或者您可以在github上提出问题。 - 在单引号中传递cookies(
-c
)、headers(-H
)和正则表达式(-ra
)值,例如-ra '/api/v[0-9]\.[0-9]\*'
- 设置
-o
选项为Links指定特定的输出文件名,而不是默认的output.txt
。如果您计划运行大深度的搜索,请先使用2和-v
选项来检查返回的内容。然后您可以增加深度,新的输出将附加到现有文件中,除非您传递-ow
。 - 设置
-op
选项为潜在参数指定特定的输出文件名,而不是默认的parameters.txt
。任何输出都将附加到现有文件中,除非您传递-ow
。 - 如果使用高深度(
-d
),要警惕一些网站使用动态链接,因此会不断找到新的链接。如果没有找到新链接,xnLinkFinder将停止搜索。还应该考虑提供停止标志(s429
、s403
、sTO
、sCE
)。 - 如果您发现大量链接,特别是如果深度(
-d
值)很高,并且资源有限,程序将在达到内存阈值(-m
)值时停止,并在被终止之前优雅地结束,保留完整数据。 - 如果您决定在运行过程中取消xnLinkFinder(使用
Ctrl-C
),请耐心等待,任何收集的数据都将在优雅结束之前保存。 - 使用
-orig
选项将显示找到链接的URL。这可能意味着如果在多个来源找到相同的链接,输出中会有重复的链接,但它会在方括号中附加原始URL。 - 在发出请求时,xnLinkFinder将使用当前组中的随机User-Agent,默认为
desktop
(除非使用了-uc
/--user-agent-custom
参数)。如果您有一个目标可能对不同的用户代理组有不同的链接,那么指定-u desktop mobile
(用空格分隔)。mobile
用户代理选项是mobile-apple
、mobile-android
和mobile-windows
的组合。可能的值有desktop
、mobile
、set-top-boxes
和game-console
。 - 当
-i
设置为目录时,将搜索该目录根目录中文件的内容以查找链接。不搜索子目录中的文件。任何超过-mfs
设置大小(默认:500 MB)的文件都将被跳过。 - 使用
-replay-proxy
选项时,有时请求可能需要更长时间。如果您开始看到更多Request Timeout
错误(如果使用-v
或-vv
选项,您会看到错误),那么考虑使用-t
来提高超时限制。 - 如果您知道目标只有ASCII字符的链接和参数,那么考虑传递
-ascii-only
。这可以消除有时从二进制数据返回的一些误报。 - 如果您传递一个waymore结果目录,建议传递
-d
/--depth
参数来搜索从URL请求中找到的任何额外链接,如果您认为可能找到不同的内容,还可以传递-u
/--user-agent
,例如-u desktop mobile
。 - 始终传递
-owl
/--output-wordlist
文件名以保存目标特定的单词列表。这个列表在模糊测试目标时非常有用。 - 目标特定单词列表的单词来自以下来源(任何3个字符或更多),但也由其他单词列表参数决定(请参阅上面的使用部分):
- 满足某些条件的所有响应:
- 只搜索YML配置
wordsContentTypes
部分中指定的内容类型的响应。默认值是text/html
、application/xml
、application/json
、text/plain
- 来自
<meta>
标签内容的单词,其中:Property
是og:title
或og:description
Name
是description
、keywords
、twitter:title
或twitter:description
- HTML注释中的单词
<img>
标签的alt
属性中的单词- 页面其余内部HTML中的单词,不包括
<style>
、<script>
和<link>
标签
- 只搜索YML配置
- 从找到的链接中的路径单词中找到的单词。
- 从响应和链接中找到的参数。
- 所有有效单词也将尽可能添加单数/复数版本到单词列表中。
- 如果原始单词有任何大写字符,也会添加小写版本
- 满足某些条件的所有响应:
- 如果目标特定单词列表的默认"停用词"不够好,请在YML配置文件中更改,或使用
-swf
/--stopwords-file
选项提供额外的停用词。您可能想包括其他语言的停用词,这取决于目标。停用词在自然语言处理(NLP)中使用,可以在网上找到许多适合不同需求的停用词列表。
问题
如果您遇到任何问题,或有改进的想法,请随时在Github上提出问题。如果有问题,提供您运行的确切命令和问题的详细描述会很有帮助。如果可能,请使用-vv
重现问题,并告诉我任何给出的错误消息。
待办事项
- 我似乎已经完成了最初的所有待办事项!如果您认为需要添加任何内容,请告诉我🤘
输出示例
对域名进行主动链接查找:
管道输入和输出:
祝你好运,猎取精彩! 如果您真的喜欢这个工具(或任何其他工具),或者它们帮助您找到了一个很棒的赏金,请考虑给我买杯咖啡! ☕ (我需要咖啡因!)