ffuf进阶技巧

admin 2023年9月6日14:35:39评论99 views字数 11217阅读37分23秒阅读模式


FFUF是什么?

ffuf是Fuzz Faster U Fool的缩写,它是一个面向渗透测试人员(pentesters )的命令行实用程序(CLI ) 。

它主要是一个用于 Web 应用程序的文件和文件夹扫描程序。         
基本操作允许通过从常见文件和文件夹名称列表中进行查询来枚举 Web 应用程序上的现有内容。通过观察 HTTP 状态代码,应用程序可以确定有问题的资源是否存在。

还存在许多其他此类工具。那么ffuf有什么特别之处呢?

该流派的先驱之一是一种名为dirb 的工具,该工具很旧、缓慢且已贬值,但它是最早看到光明的工具之一。dirb仅限于之前定义的功能:列出 Web 资源。

另一种旧的且已弃用的此类工具称为 dirbuster,其功能与dirb非常相似,但使用图形界面 ( GUI )而不是命令行 ( CLI ) 。dirb是dirbuster的缩写,尽管这两个工具是不同的。两者本身都是Directory Buster的缩写(可能指的是电影Ghost Buster)。         

许多其他受dirb和dirbuster启发的工具因此被命名为prefix + buster:feroxbuster、Lulzbuster、Gobuster、rustbuster。除了rustbuster之外,这些后继者也仅限于枚举 Web 资源。这些工具的名称代表了它们的功能。

不过,提醒一下ffuf代表Fuzz Faster U Fool。如果ffuf没有被命名为bfuf(Bust Faster U Fool),那是有原因的。相同的逻辑适用于名为wfuzz的对应项。它们的名称中包含单词fuzz而不是buster,因为除了使用单词列表攻击枚举 Web 资源之外,这两种工具都能够进行模糊测试

但什么是模糊测试

我已经对工具的词源学进行了很多讨论,因此我将尝试简要介绍模糊测试的定义。

一般来说,模糊测试是一种通过将随机或目标数据注入程序的输入以观察其在意外情况下的行为来测试软件的技术。如果程序崩溃、生成错误或进入降低安全级别的状态,则存在需要修复的问题或漏洞。         
您不一定需要知道应用程序如何工作来对其进行模糊测试,但如果您有相关信息,则可以使用有针对性的测试用例。

仅枚举 Web 资源的ffuf对应项仅将测试集注入到一个位置:在 URL 之后,例如https://example.org/FUZZ_DATA。此外,不支持数据集生成器,只能指定一个文件,该文件将是每行一个字符串的字符串列表。

而ffuf可以在任何地方注入数据集:当然可以在 URL 之后,也可以在 GET 或 POST 参数中、HTTP 标头中等中。基本操作很简单,只需将关键字放在FUZZ要注入数据集的位置即可。但稍后,我们将看到并行使用多个数据集是可能的。

此外,ffuf不仅可以从文件中读取数据集,它还可以从标准输入(STDIN)或使用外部生成器Radamsa读取数据集。

高级用法

配置文件

ffuf有一个配置文件,允许您更改默认行为并创建快捷方式。

正如官方文档中所述,此默认配置文件的位置将$HOME/.ffufrc在 Unix 系统和%USERPROFILE%.ffufrcMicrosoft Windows 系统上。

注意:如果您想参与 Unix 系统读取规范化位置(XDG)配置文件的实现,请参考 https://github.com/ffuf/ffuf/issues/542。

让我们从一个简单的示例开始,默认情况下,标准输出 ( STDOUT )不启用着色。

ffuf -u http://ffuf.me/cd/basic/FUZZ -w /usr/share/seclists/Discovery/Web-Content/common.txt

ffuf进阶技巧


注意:帮助消息说默认情况下启用着色,但这是错误的。即使使用最新的公共版本 (1.5.0),如果 CLI 或配置文件中不存在该选项,也不会返回颜色代码(请参阅 参考资料colorize())。

-c 对输出进行着色。(默认值:true)

然后,您必须将-c选项添加到每个命令才能利用颜色。

ffuf -u http://ffuf.me/cd/basic/FUZZ -w /usr/share/seclists/Discovery/Web-Content/common.txt -c

ffuf进阶技巧

可以在配置文件中永久启用它,而不是在每个命令中指定此选项(例如~/.ffufrc):


[general] colors = true

注意:ffuf在解析器go-toml v2的帮助下使用TOML v1.0.0 格式的配置文件(请参阅源代码)。

现在无需使用该选项即可显示颜色。

ffuf -u http://ffuf.me/cd/basic/FUZZ -w /usr/share/seclists/Discovery/Web-Content/common.txt

ffuf进阶技巧


注意:ffuf没有提供此配置文件的任何文档,但它提供了一个示例文件:ffufrc.example。

现在我们已经掌握了概念,让我们尝试一些更有用的场景。

该-config选项允许您定义自定义配置文件,因此您可以为每个客户端定义一个配置文件以进行渗透测试(例如~/Projects/clientXYZ.ffurc.toml)

例如,客户端可能要求向每个请求添加 HTTP 标头,以避免向 SOC 发送错误的安全警报(例如X-SOC-Tag: clientXYZ-audit042)。在整个渗透测试期间,基本 URL 也将保持不变。最后,您可能希望记录通过代理发送的所有请求,以便进行跟踪,以便您了解应用程序上潜在故障的根源。

这给出了以下配置文件:


[http] headers = [ "X-SOC-Tag: clientXYZ-audit042", ] proxyurl = "http://127.0.0.1:8080" url = "http://ffuf.me/cd/basic/FUZZ"

以及以下命令:

ffuf -config ~/Projets/clientXYZ.ffurc.toml -w /usr/share/seclists/Discovery/Web-Content/common.txt

而不是没有配置文件的以下命令:

ffuf -u http://ffuf.me/cd/basic/FUZZ -w /usr/share/seclists/Discovery/Web-Content/common.txt -x "http://127.0.0.1:8080" -H "X-SOC-Tag: clientXYZ-audit042"

正可以为字典或命令指定自定义关键字,这允许您使用其中的多个。


# 2 dictionariesffuf -u 'http://ffuf.me/cd/param/DIR?PARAM=1' -w /usr/share/seclists/Discovery/Web-Content/common.txt:DIR -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:PARAM

然后可以在配置文件中指定字典。


[input] wordlists = [ "/usr/share/seclists/Discovery/Web-Content/common.txt:COMMON", "/usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:PARAM", ]# 2 dictionariesffuf -u 'http://ffuf.me/cd/param/COMMON?PARAM=1'


注意:ffuf 当前的行为非常烦人,因为当定义了字典但未使用字典时它会引发错误。通过CLI使用选项时,这种行为仍然可以接受,但使得wordlists在配置文件中使用该选项几乎毫无用处。

一旦修复了此行为,就可以使用别名定义大量字典,以避免输入字典路径。


[input] wordlists = [ "/usr/share/seclists/Discovery/Web-Content/common.txt:COMMON", "/usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:PARAM", "/usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt:SUBDOMAINS", "/usr/share/seclists/Discovery/Web-Content/quickhits.txt:QUICKHITS", "/usr/share/seclists/Discovery/Web-Content/raft-medium-files-lowercase.txt:MEDIUMFILES", "/usr/share/seclists/Discovery/Web-Content/raft-medium-directories-lowercase.txt:MEDIUMDIR", "/usr/share/seclists/Discovery/Web-Content/raft-medium-words-lowercase.txt:MEDIUMWORDS" ]


当指定多个字典时,可以定义应使用哪种操作模式。保留了与Burp Suite Pro Intruder相同的命名法。

-mode Available modes: clusterbomb, pitchfork, sniper (default: clusterbomb)

这对于查找基本身份验证的凭据很有用。


[input] inputmode = "clusterbomb" wordlists = [ "/usr/share/seclists/Usernames/top-usernames-shortlist.txt:USER", "/usr/share/seclists/Passwords/2020-200_most_used_passwords.txt:PASS" ]ffuf -u http://USER:[email protected]/ -config ~/Projets/clientXYZ.ffurc.toml

注意:pitchfork如果您已经构建了有效标识符列表,该模式会更有用。

最后,默认情况下,以下 HTTP 状态代码会触发匹配:

[matcher]    status = "200,204,301,302,307,401,403,405,500"

编辑此列表可能有助于避免漏报。例如,在此 PR之前,代码 500 未被保留。然而,当应用程序行为不正常时,经常会观察到代码 500,这对于审核员来说通常很有趣。

从标准输入(STDIN)读取

从标准输入读取数据集以便使用外部程序可能会很方便:

seq 0 1000 | ffuf -u 'http://ffuf.me/cd/pipes/user?id=FUZZ' -w -

甚至可以使用自定义关键字:

seq 0 1000 | ffuf -u 'http://ffuf.me/cd/pipes/user?id=INT' -w -:INT

用您喜欢的语言编写生成器可能会更舒服:


# With Rubyruby -e '(0..255).each{|i| puts i}' | ffuf -u 'http://ffuf.me/cd/pipes/user?id=FUZZ' -w -ruby -e 'puts (0..255).to_a' | ffuf -u 'http://ffuf.me/cd/pipes/user?id=FUZZ' -w -
# With bashfor i in {0..255}; do echo $i; done | ffuf -u 'http://ffuf.me/cd/pipes/user?id=FUZZ' -w -
# With cook - https://github.com/giteshnxtlvl/cookcook 0-255 | ffuf -u 'http://ffuf.me/cd/pipes/user?id=FUZZ' -w -

使用动态生成器立即变得更聪明,而不是必须生成大量不灵活且占用空间的字典。

注意:端点 http://ffuf.me/no/是虚构的并且不存在。


# For all integers from 0 to 999999 with a padding of 6 digits# replace> wc /usr/share/seclists/Fuzzing/6-digits-000000-999999.txt1000000 1000000 7000000 /usr/share/seclists/Fuzzing/6-digits-000000-999999.txt> ffuf -u 'http://ffuf.me/no/?id=FUZZ' -w /usr/share/seclists/Fuzzing/6-digits-000000-999999.txt# by> cook 0-9 0-9 0-9 0-9 0-9 0-9 | ffuf -u 'http://ffuf.me/no/?id=FUZZ' -w -

模糊十六进制很容易:

cook 0-9,a-f 0-9,a-f | ffuf -u 'http://ffuf.me/no/?hex=FUZZ' -w -

更好的是,模糊一些路径遍历,预制列表对此非常不利。


$ cook '../*1-10'../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../
$ cook '../*1-10' | ffuf -u 'http://ffuf.me?file=PTetc/passwd' -w -:PT -v...[Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 93ms]| URL | http://ffuf.me?file=../etc/passwd * PT: ../
[Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 59ms]| URL | http://ffuf.me?file=../../../../../etc/passwd * PT: ../../../../../
[Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 45ms]| URL | http://ffuf.me?file=../../../../../../../../../etc/passwd * PT: ../../../../../../../../../
[Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 44ms]| URL | http://ffuf.me?file=../../../../etc/passwd * PT: ../../../../
[Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 56ms]| URL | http://ffuf.me?file=../../../etc/passwd * PT: ../../../
[Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 56ms]| URL | http://ffuf.me?file=../../../../../../../etc/passwd * PT: ../../../../../../../
[Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 56ms]| URL | http://ffuf.me?file=../../etc/passwd * PT: ../../
[Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 56ms]| URL | http://ffuf.me?file=../../../../../../etc/passwd    * PT: ../../../../../../
[Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 76ms]| URL | http://ffuf.me?file=../../../../../../../../etc/passwd    * PT: ../../../../../../../../[Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 76ms]| URL | http://ffuf.me?file=../../../../../../../../../../etc/passwd

如果您想避免使用ffuf-scripts – ffuf_basicauth.sh生成基本身份验证:


# With cookcook fz-http_default_users.txt : fz-http_default_pass.txt -m b64e | ffuf -u 'http://ffuf.me/no/api/info' -w - -H "Authorization: Basic FUZZ" -fc 403# Without cookffuf -u http://USER:PASS@ffuf.me/api/info -w /usr/share/fuzzdb/wordlists-user-passwd/generic-listpairs/http_default_users.txt:USER -w /usr/share/fuzzdb/wordlists-user-passwd/generic-listpairs/http_default_pass.txt:PASS -fc 403

或者使用 md5 + base64 编码转换列表中的每个条目:


# With cookcook -f: /usr/share/fuzzdb/wordlists-user-passwd/generic-listpairs/http_default_users.txt f.md5.b64e | ffuf -u 'http://ffuf.me/no/api/user/FUZZ' -w -# Without pencodewhile read -r line; do echo -n $line | pencode md5 b64encode; echo ; done < /usr/share/fuzzdb/wordlists-user-passwd/generic-listpairs/http_default_users.txt

简而言之,你会明白,它可以让你做相当强大的事情。

避免漏报

默认情况下,ffuf仅考虑以下HTTP 状态代码:200,204,301,302,307,401,403,405,500。

这通常适合经典用途,但如果应用程序使用频率较低的其他代码进行响应,我们就有可能出现漏报的风险。例如,如果应用程序以201 Created、202 Accepted、203 Non-Authoritative Information、206 Partial Content等响应。我们会错过一些信息。

为此,可以覆盖默认列表并提供更完整的列表-mc(匹配代码),例如-mc 200,201,202,203,204,206,301,302,307,401,403,405,500。但是提供详尽的列表可能有点麻烦,并且不可能将代码添加到默认列表,而只能覆盖该列表。幸运的是,还有另一种解决方案。可以使用关键字all捕获所有代码,例如-mc all。然而,由于-mc all会捕获所有内容,因此如果不使用任何过滤器,您将什么也看不到。最低限度是消除不存在的资源:-mc all -fc 404. 如有必要,我们可以添加403,302应用程序是否因重写规则而产生误报。

我在ffuf TryHackMe room中讨论的另一个例子是使用正则表达式过滤器。         
事实上,保留403(禁止)代码很有趣,因为这对应于现有资源,但我们无权访问。例如,这可能表明我们可以尝试通过漏洞、绕过技术或一旦获得访问权限来访问感兴趣的资源/admin/。问题在于,某些代理可以定义会产生误报的重写规则。.在审核中,我们经常会收到所有以或开头的文件的 403 错误.ht,因此代理重写规则会产生数百个误报的 403 错误,从而污染我们的结果。

我们可以在ffuf TryHackMe room中包含的 DVWA 应用程序上看到这些误报。

但如果完全过滤掉所有 403 并错过一个/admin/或其他乐趣,那就太遗憾了。为此,您可以使用正则表达式过滤器-fr( filter regexp ),例如-fr '/..*'。

正则表达式的分解:

.从字面上匹配一个点.,需要用反斜杠转义它

.*匹配任何字符任意次

..*匹配一个点后跟任何内容,但这还不够,因为 of.php也index.php匹配这个正则表达式,所以有必要指示资源以点开头

^用于指示字符串的开头,但^..*不起作用并过滤所有内容,因为正则表达式必须应用于整个 URL 而不仅仅是来自字典的字符串

因此,我们将使用斜杠/来指示资源以点开头,因为斜杠是 URL 分隔符:/..*。

通过另外使用过滤器重播相同的命令,结果更具可读性:

ffuf进阶技巧


它可以让您找到wp-forum.phps如果您使用-fc 403.

使用原始请求文件

任何渗透测试人员都已经在 SQLmap 中使用过这种命令:

sqlmap -r req.txt --level 5 -p id --risk 3

事实上,-rSQLmap 的选项允许将原始格式的 HTTP 请求作为输入,正如我们在 Wireshark 或 Burp Suite 中看到的那样,这避免了必须指定一大堆选项来添加 cookie、标头、URL 等。

例如:


GET /cd/pipes/user?id=1 HTTP/1.1Host: ffuf.meUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:103.0) Gecko/20100101 Firefox/103.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateConnection: keep-aliveUpgrade-Insecure-Requests: 1


嗯, ffuf中也提供了相同的机制。

我们可以创建该req.txt文件并将FUZZ关键字直接放入其中,这样我们就不必重新定义 URL。

GET /cd/pipes/user?id=FUZZ HTTP/1.1Host: ffuf.meUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:103.0) Gecko/20100101 Firefox/103.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateConnection: keep-aliveUpgrade-Insecure-Requests: 1

然后您只需指定包含请求的文件,-request并且不要忘记-request-proto告诉 ffuf 使用 HTTP 而不是 HTTPS。否则默认使用HTTPS,请求不会成功。

cook 1-1000 | ffuf -request /tmp/req.txt -w - -request-proto http

否则,如果不想修改文件以更改关键字的位置FUZZ并测试不同的参数,则可以随时用参数覆盖 URL -u。在这种情况下,无需指定-request-proto。

cook 1-1000 | ffuf -request /tmp/req.txt -w - -u 'http://ffuf.me/cd/pipes/user?otherparam=FUZZ'

演示

ffuf可以使用外部有效负载突变器。变异器的作用是随机生成用于模糊测试的有效负载的变化。

例如,在这里,我使用Radamsa作为变异器来生成电子邮件地址的变体(有时有效,有时无效)。我要求-input-num生成 50 种变化。版本号将被导出到FFUF_NUM环境变量中。这使得它可以用作变异器的种子(seed),以便我们可以找出使用了哪个有效负载。

ffuf --input-cmd 'echo "noraj@hackceis.fr" | radamsa --seed $FFUF_NUM' -input-num 50 -u http://ffuf.me/no/ -H "Content-Type: application/json" -X POST -d '{"email":"FUZZ"}'

事实上,ffuf只会显示变体编号,但这足以找到所使用的有效负载。


1 [Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 57ms]2 [Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 59ms]3 [Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 68ms]4 [Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 79ms]10 [Status: 200, Size: 1495, Words: 230, Lines: 40, Duration: 49ms]$ echo "[email protected]" | radamsa --seed 2[email protected]@hacceis.fr.fr

Radamsa 还可以处理文件。例如,下面是一个 XML 文件 test.xml:


<note> <to>Toveto> <from>Janifrom> <heading>Reminderheading> <body>Don't forget me this weekend!body>note>

以同样的方式,我们将能够非常简单地生成 XML 文件变体。

ffuf --input-cmd 'radamsa --seed $FFUF_NUM test.xml' -input-num 50 -u http://ffuf.me/no/ -H "Content-Type: application/xml" -X POST -d 'FUZZ' -x http://127.0.0.1:8080

其他

当然ffuf具有限制发送请求数量、处理超时、递归、线程数量、从列表中删除注释、替换用作模板的列表中的关键字等选项,但这些都很容易学习通过阅读以下资源:

帮助ffuf --help页面

编码指南

(https://codingo.io/tools/ffuf/bounty/2020/09/17/everything-you-need-to-know-about-ffuf.html)

黑客文章指南

https://www.hackingarticles.in/comprehensive-guide-on-ffuf/


         

原文始发于微信公众号(红队笔记录):ffuf进阶技巧

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年9月6日14:35:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ffuf进阶技巧https://cn-sec.com/archives/2011400.html

发表评论

匿名网友 填写信息