0%

peach学习及在web领域的应用

网上关于peach框架的资料少的可怜。最后跟着一位博主的博客学了下来,不过学的是Fuzz Web Api。就是下面的博客。感谢大佬。

Peach原理简介与实战:以Fuzz Web API为例

接下来就简单记录一下今天下午对peach框架的粗浅尝试。

以下是工作文件夹和成果展示

用于构建peach数据、状态、配置模型的工作文件夹

终端上跑起来的效果

BurpSuite上收到的相应报文

以BUUCTF上的[HFCTF2020]EasyLogin作测试目标平台

1. 获取请求报文的模板作为login.bin

我们输入用户名和密码后,点击LOGIN按钮,此时客户端就会发送一个请求,在BurpSuite上我们便能拿到该请求模板,如下图。

我们新建一个文件夹,将该模板复制到 login.bin 里,如下图。(可以随意命名,保存为.bin文件即可

2. 根据.bin模板构造数据模型1-my_data.xml

创建一个1-my_data.xml,存放如下代码。

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<Peach xmlns="http://peachfuzzer.com/2012/Peach" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://peachfuzzer.com/2012/Peach ../peach.xsd">

<DataModel name="my_data_model">

</DataModel>

</Peach>

其中DataModel元素下放的便是各行的字符串或符号,需要区分开来。以前几行为例。token代表是否为特殊符号,像 ‘:’ ‘&’之类的都要进行区分。mutable意为可变的,也就是该数据模块需要变异的地方。笔者是对adminpassword的值设置可变异。

构造DataModel是一个比较费力的过程,还好Peach安装包里提供了校验DataModel是否与我们的.bin对应的工具Peach Validator,才让长时间的努力有了效率。

3. 构造配置模型2-my_xml.config

需根据目标端口进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<PitDefines>
<All>
<IPv4 key="TargetAddress"
value="848e59df-143b-4177-bf5b-c6b70a18e040.node4.buuoj.cn" />

<Range key="TargetPort"
value="81"
min="0"
max="65535" />

<Range key="Timeout"
value="5000"
min="0"
max="999999" />
</All>
</PitDefines>
</Peach>

4. 构建状态模型3-my_state.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<Peach xmlns="http://peachfuzzer.com/2012/Peach" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://peachfuzzer.com/2012/Peach ../peach.xsd">

<!-- 导入数据模型 -->
<Include ns="MyData" src="D:\\Fuzz——peach\\MyPeachPit\\1-my_data.xml" />
<StateModel name="My_State" initialState="state_one">
<State name="state_one">
<Action type="output">
<!-- 引用名为my_data_model的ModelData -->
<DataModel ref="MyData:my_data_model" />
<Data fileName="D:\\Fuzz——peach\\MyPeachPit\\login.bin" />
</Action>

<Action type="input">
<DataModel name="NULL">
<Blob />
</DataModel>
</Action>
</State>
</StateModel>

</Peach>

5. 构建综合模型4-my_integrate.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="utf-8"?>
<Peach xmlns="http://peachfuzzer.com/2012/Peach" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://peachfuzzer.com/2012/Peach ../peach.xsd">

<!-- 引入状态模型 -->
<Include ns="MyState" src="D:\\Fuzz——peach\\MyPeachPit\\3-my_state.xml" />

<Agent name="LocalAgent">
</Agent>

<Test name="Default">
<Agent ref="LocalAgent" />
<StateModel ref="MyState:My_State" />

<Publisher class="Tcp" name="tcp">
<!-- 为BurpSuite代理ip -->
<Param name="Host" value="127.0.0.1"/>
<Param name="Port" value="8080" />
<Param name="Timeout" value="5000" />
</Publisher>

<Logger class="File">
<Param name="Path" value="##LogPath##" />
</Logger>

</Test>
</Peach>

同时修改BurpSuite上的代理信息,ip和端口不用改,只需将其重定位至目标靶机,如下图。

6. 最后检验测试套是否正确

在其目录下输入以下命令peach 4-my_integrate.xml -1,出现下图就说明配置成功了。

7. 开始fuzz

输入命令peach 4-my_integrate.xml -range 1,150000

意为发送15w个变异报文,15w为官方推荐数量。

注:记得关掉 intercept 截听器,否则得一个个按forward发送请求报文,最后在Http History界面筛选异常报文即可。

总结

作为一名菜鸡二进制手,学到了挺多的web知识,也挺好。在实践中稍微熟悉了peach框架的构建流程。

不过也遇到了很多问题,就是”Content-Length”的值的问题,因为长度如果一直是固定的话发送的请求头该怎么进行长度变异?不过在检测报文时还是观察到某些请求报文的”Content-Length”是会改变的,不过是极少数,如下。

大部分是缺参数的,如下。

打算明天改进一下DataModel这样子。


隔天实践了一下,发现将bin中和datamodel中的”Content-Length”改大后,就例如我设置了1000,那么我的请求体的长度范围便是[0,1000],范围设置越大越好。如我所料,变异请求体的长度变化了很多,也印证了我前几天的思考。同时我还修改了参数authorization的值为可变。虽然仍然跑不出异常结果就对了。(当然很有可能是这道题的考点就不在这里)。以下是今天跑出的各类变异请求体。