目录
BYOVD漏洞驱动分析思路
目录
笔记前言
- 这篇笔记,主要是经验记录,因为实在没什么好写的,这玩意不是什么新鲜东西,就是逆向活,就没放实战相关的过程记录图文
开篇
BYOVD全称:Bring Your Own Vulnerable(脆弱、易受攻击的) DriverBYOVD是最近几年逐渐为大众所熟知的一种提权方式,核心思路:利用正规厂商,例如金融、教育等等行业所开发的正规驱动的某些敏感功能,这些行业的驱动开发者可能安全意识不是特别强,再加上这些驱动往往都通过WHQL认证,导致很多杀软、EDR都会默认放入白名单放行- 这里指的某些敏感功能,指的是任意内核读写漏洞:
- 这篇是万恶之源,非常著名
kdmapper就是利用了intel的漏驱实现将无签驱动以Shellcode的形式加载到内核中 - 当然,简单的进程提权甚至都不用加载Shellcode驱动,而是修改
EPROCESS.Token进程令牌权限,实现提权
- 这篇是万恶之源,非常著名
- 一旦加载上自定义驱动后,此时我们的能力就提升到了跟操作系统、杀软相同的地步
确定漏驱通讯方式
- 确认该正规驱动采用的通讯方式,这些正规驱动往往有以下特征:
- 金融、教育、厂商设备(网卡、声卡)驱动往往不会有代码混淆、加壳行为
- 正规驱动,出于代码兼容性考虑,是不会采用一些奇技淫巧的通讯方式的,而是采用MSDN文档中推荐的IO通讯(基于设备对象、IRP的通讯)、FLT通讯(基于MiniFilter端口),由于Flt通讯可以很方便地实现端口双向通讯,所以比较现代化的驱动,都会优先采用Flt通讯
查看导入表
- 这个步骤是粗看,查看导入表中是否导入了内存操作相关的敏感函数,例如MmMapIoSpace、MDL、附加进程
- 如果确定了有敏感内存操作的API,就查看其交叉引用,看看调用链,确保能从通讯回调中调用过去
查看通讯派遣(IRP)
- 如果确定目标驱动是基于设备对象的通讯,那么我们看DispatchRead、Write、IoControl这3个常用回调函数(当然,主流是这3个,保不准用的是什么奇怪的回调来通讯)
- 跳过去看,一个个控制码分析
查看通讯回调(Flt)
- 由于Flt支持设置安全描述符,所以需要逆向Flt是如何创建的,因为安全描述符可以执行管理员进程才能访问Flt端口,会有一定限制
- 再查看MessageNotify回调,分析其中数据结构,是如何解析控制码、调用功能函数的。
笔者之前分析的一个漏驱,输入缓冲区第一个字节是功能号,再拿着功能号去查表、调用。这样的调用方式,会让IDA反汇编非常简单,看不到switch case代码结构,需要细心分析
分析驱动协议
- 在确定了漏驱的通讯方式、派遣函数后,此时要做的是分析驱动的通讯协议了,这里的通讯协议,就是还原出通讯结构体中各个字段的函数,我们再自己构造一个命令包下发,实现调用功能
- 某些具有一定安全意识的厂商,会将通讯数据包进行简单处理(常见为多轮异或加密、解密)
参考资料
- 在Git仓库中,搜索
BYOVD关键字,找到相关代码仓库、图文