Echo_driver Vulnerability Analyze
type
status
date
slug
summary
tags
category
icon
password

前言

是在7.15的时候,发现老外写了这个驱动的文章 发给了菊花哥;但当时并没空去学习,之前群里的师傅 有的蓝屏了 有的成功了,我觉得就是offset的问题
然后最近突然想到了这个洞 就跟着来学习了,在这篇记录中 可以看到的为何会蓝屏
但现在八月初,作者好像还在提交代码 并优化
 

基础知识

既然exploit已经出来了,就直接跟着代码来学习,
看下这个文件里的内容,这个文件里就是通过调用DeviceIoControl去跟驱动交互了

DriverInterface

先看DriverInterface类的构造函数
notion image
连接驱动,然后ioctl 0x9e6a0594 去打交道
直接到驱动里去跟
notion image
有可能 显示是错误的 alt+y 选下别的结构就可以了
但由于Poc传过来的数据 都是空的,所以估计也没有意义;原文提到的是 “内部 BCrypt 操作设置输出缓冲区。如果没有这个调用,驱动程序就不会听我们的命令。”
 

get_handle_for_pid

接着看的是一个名为get_handle_for_pid的函数,这意思很明显了吧 通过pid获取句柄
notion image
先声明了个结构体
 
然后ioctl是0xe6224248 去打交道
notion image
这里的v7->Type off是0,也就是我们传过去结构体里的pid;也可以看PsLookupProcessByProcessId的函数原型嘛 来判断out的Process,就是指定pid的PEPROCESS结构体
 
然后调用ObOpenObjectByPointer函数,ObOpenObjectByPointer函数打开一个由指针引用的对象并返回该对象句柄
也就是通过GENERIC_ALL获得对应的句柄
如果成功打开了,则调用ObDereferenceObject,释放Process对象的引用计数
然后会将句柄 再返回回来,就赋值到结构里的handle
 

read_memory_raw

这是个名为read_memory_raw的函数,名字看起来 就是读内存
notion image
 
看下驱动里 再结合起来 这个结构体 来看
notion image
根据提供的句柄,获取指向对象主体的相应指针;可以看到传递的是PsProcessType,那么获取到的类型就是PEPROCESS or PKPROCESS
 
然后又call了一个sub_140001B80函数,也跟进去看看
notion image
 
MmCopyMemory例程将指定范围的虚拟或物理内存复制到调用者提供的缓冲区中
函数将源进程中的源地址处开始的指定大小的内存数据拷贝到目标进程中的目标地址处。
根据函数原型 我们反推
SourceProcess 就是我们传入的句柄 来获取到的Process
SourceAddress 就是我们exp结构体里的fromAddress
TargetProcess 就是通过调用IoGetCurrentProcess 获取到的当前进程
TargetAddress 就是fromAddress下一个 也就是toAddress!
BufferSize 就是toAddress下一个的 length
notion image
model是0,也就是KernelMode把
 
所以解析下
fromAddress:源地址
buf:目标地址
len:大小
targetProcess:通过这个句柄 获取对应的EPROCESS结构
 
所以我们可以通过这个功能,来读写内核内存?
  • 读:将内核的源地址 滥用MmCopyVirtualMemory函数 写入到 我们3环的内存里,这样就读到了内核空间里的内存
  • 写:将三环的源地址 滥用MmCopyVirtualMemory函数 写入到 内核的内存中去,这样就可以写入到内核空间里了
 
这也就是原文中的
notion image
 
Exploit
notion image
最开始的这一块 就是遍历系统模块 找到ntoskrnl.exe的基址
看过内核提权洞的 应该对此不陌生
 
接着往下看
notion image
他这个偏移 跟我测试机的偏移 就不同了 EPROCESS token的偏移
notion image
 
取PID的offset也不一样
notion image
 
notion image
 
然后获取了PsInitialSystemProcess的offset,然后找到在内核模块里的PsInitialSystemProcess的地址(realPsInitialSystemProcessAddr)
PsInitialSystemProcess是Windows内核中的一个全局变量,它指向系统进程(System Process)的EPROCESS结构。
 
然后调read_memory_raw
就是将system进程的EPROCESS结构,放到PsInitialSystemProcessEPROCESS
 
notion image
这里就是根据EPROCESS结构,找到PID和Token
 
notion image
创建一个cmd进程后,读取SYSTEM进程的ActiveProcessLinks,用于维护进程之间的关系和连接
然后遍历出 我们刚才创建SHELL的EPROCES 结构
notion image
代码的含义 放到图片的红字里了,最后一个read_memory_raw 就是将activeProcessLinkList 换为下一个进程的
 
如果不大懂这个,可以看下gpt 给生成的代码
 
所以完整的token窃取 就完事了
如果按照我这个环境 直接使用作者提供的偏移 根据我上面的分析肯定是不行的
notion image
 
不出所料 直接蓝了,换成正确的再试
notion image
 
notion image
没毛病,原POC的代码 copy到vs里 编译 还得改下几处地方
如果想了解的细一些 就可以一点点调试嘛,比如怎么取的SYSTEM的EPROCESS那一块
 

© muxue 2021-2025