网上关于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意为可变的,也就是该数据模块需要变异的地方。笔者是对admin和password的值设置可变异。
构造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"> <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"> <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的值为可变。虽然仍然跑不出异常结果就对了。(当然很有可能是这道题的考点就不在这里)。以下是今天跑出的各类变异请求体。