最新公告
  • 欢迎您光临悠哉网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • USB Fuzzing基础知识:从漏洞挖掘到漏洞报告

    USB Fuzzing基础知识:从漏洞挖掘到漏洞报告

    最近,我开始使用基于Facedancer的一种工具来挖掘USB主机堆栈中的漏洞。本文首先介绍我的Fuzzing测试方法,然后给出完整更新的Windows 8.1 x64中的漏洞的实际示例。本文的目的不是重新定义USB Fuzzing测试,也不是对我的Fuzzing测试架构进行完整描述,而是要叙述从Fuzzing测试到漏洞报告的完整步骤。

    0x01 Fuzzing 方法

    我的Fuzzing结构基于Facedancer和Umap工具,并向其中添加了一些功能:

    • · 在PCAP中为仿真设备捕获流量;
    • · 从已记录的PCAP重放流量;
    • · 基于Radamsa的数据包变异。

    0x02 USB基础
    本文的目的不是要详细描述USB的工作原理,但仍需要一些知识才能更好地理解USB Fuzzing。连接设备后,主机会向该设备发出标准请求,以检索有关该设备的信息(供应商ID,产品ID,可用功能等),这样做是为了对其进行配置并将适当的驱动程序加载到OS中,此信息称为 描述符。这些请求/描述符在特殊端点上交换:每个连接的新标准设备都必须响应发送给它的请求。端点是设备接口之间的逻辑链接和USB主机堆栈,接口由一个或多个端点组成,并提供类功能(HID,大容量存储等)或特定功能。

    0x03 Fuzzing的实例示例
    我模拟了USB大容量存储设备,并丢弃了交换的流量,然后,我决定Fuzzing配置描述符,尤其是bNumEndpoints字段。

    变异只是将这个字节替换为一个随机字节。一段时间后,我在Windows 8.1 x64上触发了BSOD。在这里,我的变异描述符以红色框的形式发送到主机。在使用变异描述符对数据包序列重放了几次之后,我推测主机在以橙色框发送设置配置请求后立即触发了BSOD 。

    USB Fuzzing基础知识:从漏洞挖掘到漏洞报告

    在Wireshark中,变异的描述符如下所示:

    USB Fuzzing基础知识:从漏洞挖掘到漏洞报告

    崩溃转储分析几乎没有用,因为内核池内存已被损坏:每次崩溃都在另一个位置。我继续注入数据包,并且在某个时候Windows BSOD给了我以下问题的位置:USBSTOR.sys。

    驱动程序名称是显式的:它是大容量存储驱动程序。

    0x04 逆向大容量存储驱动程序

    下载完USBSTOR.sys的符号后,我将其加载到IDA Pro中,幸运的是,这些符号很容易理解,我很快找到了有趣的函数: USBSTOR_SelectConfiguration()

    第一个基本块显示了对usbd.sys导出的调用: USBD_CreateConfigurationRequestEx(),该输出返回指向URB_FUNCTION_SELECT_CONFIGURATION结构的指针 。根据MSDN [6],此“例程分配并格式化URB以选择USB设备的配置”。URB是客户端驱动程序用来描述其要发送到设备的请求的结构[7]。

    第二个基本块调用USBSTOR_SyncSendUsbRequest(),并将先前创建的URB作为第一个参数。调用此函数后,请求将通过USB堆栈发送,然后从主机控制器物理发送到设备。如果我中断USBSTOR_SyncSendUsbRequest()调用,则会观察到不是此调用导致系统崩溃。

    USB Fuzzing基础知识:从漏洞挖掘到漏洞报告

    USBD_CreateConfigurationRequestEx()函数中,我看到它复制 bNumEndpoints(我设置为0的Fuzzing 空间)从USB_INTERFACE_DESCRIPTOR结构的 NumberOfPipes基于USBD_INTERFACE_INFORMATION结构。该USB_INTERFACE_DESCRIPTOR枚举过程结构初始化,并且不会在本文中进行研究。

    USB Fuzzing基础知识:从漏洞挖掘到漏洞报告

    现在,在调用USBD_CreateConfigurationRequestEx()之后,我回到USBSTOR.sys ,RDI指向:

    1. struct _URB_SELECT_CONFIGURATION { 
    2.   struct URB_HEADER  Hdr; 
    3.   PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; 
    4.   USBD_CONFIGURATION_HANDLE     ConfigurationHandle; 
    5.   USBD_INTERFACE_INFORMATION    Interface; 
    6. }; 

    R14指向:

    1.   USHORT                Length; 
    2.   UCHAR                 InterfaceNumber; 
    3.   UCHAR                 AlternateSetting; 
    4.   UCHAR                 Class; 
    5.   UCHAR                 SubClass; 
    6.   UCHAR                 Protocol; 
    7.   UCHAR                 Reserved; 
    8.   USBD_INTERFACE_HANDLE InterfaceHandle; 
    9.   ULONG                 NumberOfPipes; // Our bNumEndpoints = 0 is here ! 
    10.   USBD_PIPE_INFORMATION Pipes[1]; 
    11. } USBD_INTERFACE_INFORMATION, *PUSBD_INTERFACE_INFORMATION;[object Object] 

    USB Fuzzing基础知识:从漏洞挖掘到漏洞报告

    现在,将_USBD_INTERFACE_INFORMATION结构复制到RCX,我将此指针放回RAX中。

    USB Fuzzing基础知识:从漏洞挖掘到漏洞报告

    这些指令的伪代码为:

    1. ECX <- endpoint number                  If the number of endpoint is zero 
    2. ECX <- ECX-1                            ECX <- 0-1 = 0xffffffff 
    3. R8 (0xffffffff*3*8)+80 
    4. memset(@dest, 0x0, R8)                  memset(@dest, 0x0, 0x1800000038) 

    在这里,有一个memset,其大小等于0x1800000038,导致不可利用的内核池溢出。

    Windows 8.1 32位

    我看到了在64位模式下发生的情况,但没有看到32位模式下发生的情况。我将不再详细说明指令流,因为是完全相同的。

    以下代码段对应于先前代码段的32位等效:

    USB Fuzzing基础知识:从漏洞挖掘到漏洞报告

    在伪代码中,memset()的大小如下:

    1. EAX <- endpoint number                  If the number of endpoint is zero 
    2. EAX <- EAX-1                            EAX <- 0-1 = 0xffffffff 
    3. EAX (0xffffffff*0x14)+0x38 = 0x24 
    4. memset(@dest, 0x0, EAX)                 memset(@dest, 0x0, 0x24) 

    此处,由于结构中的指针大小不同,因此大小计算也不同。因为EAX只有32位长,所以结果0x1400000024不适合它,因此存储了0x00000024。_URB_SELECT_CONFIGURATION的大小为0x38字节,因此未初始化分配结构的20个字节,如果分配的空间紧随其后没有正确地用memcpy()填充,则在特定条件下可以利用该漏洞。

    0x05 参考文献

    1. [1] http://goodfet.sourceforge.net/hardware/facedancer21/ 
    2. [2] https://github.com/nccgroup/umap 
    3. [3] https://code.google.com/p/ouspg/wiki/Radamsa 
    4. [4] Universal Serial Bus Specification 2.0 page 250 
    5. [5] Universal Serial Bus Specification 2.0 page 260 
    6. [6] http://msdn.microsoft.com/en-us/library/ 
    7. [7] http://msdn.microsoft.com/en-us/library/windows/hardware/ff538923%28v=vs.85%29.aspx 

    本文翻译自:https://blog.quarkslab.com/usb-fuzzing-basics-from-fuzzing-to-bug-reporting.html如若转载,请注明原文地址:

    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,默认解压密码为"www.yoozai.net",如遇到无法解压的请联系管理员!
    悠哉网 » USB Fuzzing基础知识:从漏洞挖掘到漏洞报告

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    悠哉网 WWW.YOOZAI.NET
    悠哉网,用户消费首选的网站,喜欢你就悠哉一下。

    发表评论

    • 660会员总数(位)
    • 5141资源总数(个)
    • 157本周发布(个)
    • 12 今日发布(个)
    • 205稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情