目录

BYOVD漏洞驱动分析思路

笔记前言

  1. 这篇笔记,主要是经验记录,因为实在没什么好写的,这玩意不是什么新鲜东西,就是逆向活,就没放实战相关的过程记录图文

开篇

  1. BYOVD全称:Bring Your Own Vulnerable(脆弱、易受攻击的) Driver
  2. BYOVD是最近几年逐渐为大众所熟知的一种提权方式,核心思路:利用正规厂商,例如金融、教育等等行业所开发的正规驱动的某些敏感功能,这些行业的驱动开发者可能安全意识不是特别强,再加上这些驱动往往都通过WHQL认证,导致很多杀软、EDR都会默认放入白名单放行
  3. 这里指的某些敏感功能,指的是任意内核读写漏洞:
    1. 这篇是万恶之源,非常著名kdmapper就是利用了intel的漏驱实现将无签驱动以Shellcode的形式加载到内核中
    2. 当然,简单的进程提权甚至都不用加载Shellcode驱动,而是修改EPROCESS.Token进程令牌权限,实现提权
  4. 一旦加载上自定义驱动后,此时我们的能力就提升到了跟操作系统、杀软相同的地步

确定漏驱通讯方式

  1. 确认该正规驱动采用的通讯方式,这些正规驱动往往有以下特征:
    1. 金融、教育、厂商设备(网卡、声卡)驱动往往不会有代码混淆、加壳行为
    2. 正规驱动,出于代码兼容性考虑,是不会采用一些奇技淫巧的通讯方式的,而是采用MSDN文档中推荐的IO通讯(基于设备对象、IRP的通讯)、FLT通讯(基于MiniFilter端口),由于Flt通讯可以很方便地实现端口双向通讯,所以比较现代化的驱动,都会优先采用Flt通讯

查看导入表

  1. 这个步骤是粗看,查看导入表中是否导入了内存操作相关的敏感函数,例如MmMapIoSpace、MDL、附加进程
  2. 如果确定了有敏感内存操作的API,就查看其交叉引用,看看调用链,确保能从通讯回调中调用过去

查看通讯派遣(IRP)

  1. 如果确定目标驱动是基于设备对象的通讯,那么我们看DispatchRead、Write、IoControl这3个常用回调函数(当然,主流是这3个,保不准用的是什么奇怪的回调来通讯)
  2. 跳过去看,一个个控制码分析

查看通讯回调(Flt)

  1. 由于Flt支持设置安全描述符,所以需要逆向Flt是如何创建的,因为安全描述符可以执行管理员进程才能访问Flt端口,会有一定限制
  2. 再查看MessageNotify回调,分析其中数据结构,是如何解析控制码、调用功能函数的。

笔者之前分析的一个漏驱,输入缓冲区第一个字节是功能号,再拿着功能号去查表、调用。这样的调用方式,会让IDA反汇编非常简单,看不到switch case代码结构,需要细心分析

分析驱动协议

  1. 在确定了漏驱的通讯方式、派遣函数后,此时要做的是分析驱动的通讯协议了,这里的通讯协议,就是还原出通讯结构体中各个字段的函数,我们再自己构造一个命令包下发,实现调用功能
  2. 某些具有一定安全意识的厂商,会将通讯数据包进行简单处理(常见为多轮异或加密、解密)

参考资料

  1. 在Git仓库中,搜索BYOVD关键字,找到相关代码仓库、图文
BYOVD 提权 逆向工程 Windows内核