Echo_driver Vulnerability Analyze
type
status
date
slug
summary
tags
category
icon
password
前言
是在7.15的时候,发现老外写了这个驱动的文章 发给了菊花哥;但当时并没空去学习,之前群里的师傅 有的蓝屏了 有的成功了,
我觉得就是offset的问题
;然后最近突然想到了这个洞 就跟着来学习了,在这篇记录中 可以看到的为何会蓝屏
但现在八月初,作者好像还在提交代码 并优化
基础知识
既然exploit已经出来了,就直接跟着代码来学习,
看下这个文件里的内容,这个文件里就是通过调用DeviceIoControl去跟驱动交互了
DriverInterface
先看
DriverInterface
类的构造函数连接驱动,然后ioctl 0x9e6a0594 去打交道
直接到驱动里去跟
有可能 显示是错误的 alt+y 选下别的结构就可以了
但由于Poc传过来的数据 都是空的,所以估计也没有意义;原文提到的是 “内部 BCrypt 操作设置输出缓冲区。如果没有这个调用,驱动程序就不会听我们的命令。”
get_handle_for_pid
接着看的是一个名为get_handle_for_pid的函数,这意思很明显了吧 通过pid获取句柄
先声明了个结构体
然后ioctl是0xe6224248 去打交道
这里的v7->Type off是0,也就是我们传过去结构体里的pid;也可以看
PsLookupProcessByProcessId
的函数原型嘛 来判断out的Process,就是指定pid的PEPROCESS
结构体然后调用
ObOpenObjectByPointer
函数,ObOpenObjectByPointer
函数打开一个由指针引用的对象并返回该对象的句柄也就是通过GENERIC_ALL获得对应的句柄
如果成功打开了,则调用ObDereferenceObject,释放Process对象的引用计数
然后会将句柄 再返回回来,就赋值到结构里的handle
read_memory_raw
这是个名为read_memory_raw的函数,名字看起来 就是读内存
看下驱动里 再结合起来 这个结构体 来看
根据提供的句柄,获取指向对象主体的相应指针;可以看到传递的是PsProcessType,那么获取到的类型就是PEPROCESS or PKPROCESS
然后又call了一个sub_140001B80函数,也跟进去看看
MmCopyMemory例程将指定范围的虚拟或物理内存复制到调用者提供的缓冲区中
函数将源进程中的源地址处开始的指定大小的内存数据拷贝到目标进程中的目标地址处。
根据函数原型 我们反推
SourceProcess 就是我们传入的句柄 来获取到的Process
SourceAddress 就是我们exp结构体里的fromAddress
TargetProcess 就是通过调用IoGetCurrentProcess 获取到的当前进程
TargetAddress 就是fromAddress下一个 也就是toAddress!
BufferSize 就是toAddress下一个的 length
model是0,也就是KernelMode把
所以解析下
fromAddress:源地址
buf:目标地址
len:大小
targetProcess:通过这个句柄 获取对应的EPROCESS结构
所以我们可以通过这个功能,来读写内核内存?
- 读:将内核的源地址 滥用MmCopyVirtualMemory函数 写入到 我们3环的内存里,这样就读到了内核空间里的内存
- 写:将三环的源地址 滥用MmCopyVirtualMemory函数 写入到 内核的内存中去,这样就可以写入到内核空间里了
这也就是原文中的
Exploit
最开始的这一块 就是遍历系统模块 找到ntoskrnl.exe的基址
看过内核提权洞的 应该对此不陌生
接着往下看
他这个偏移 跟我测试机的偏移 就不同了 EPROCESS token的偏移
取PID的offset也不一样
然后获取了
PsInitialSystemProcess
的offset,然后找到在内核模块里的PsInitialSystemProcess
的地址(realPsInitialSystemProcessAddr)PsInitialSystemProcess是Windows内核中的一个全局变量,它指向系统进程(System Process)的EPROCESS结构。
然后调
read_memory_raw
就是将system进程的EPROCESS结构,放到
PsInitialSystemProcessEPROCESS
里这里就是根据EPROCESS结构,找到PID和Token
创建一个cmd进程后,读取SYSTEM进程的
ActiveProcessLinks
,用于维护进程之间的关系和连接然后遍历出 我们刚才创建SHELL的EPROCES 结构
代码的含义 放到图片的红字里了,最后一个read_memory_raw 就是将activeProcessLinkList 换为下一个进程的
如果不大懂这个,可以看下gpt 给生成的代码
所以完整的token窃取 就完事了
如果按照我这个环境 直接使用作者提供的偏移 根据我上面的分析肯定是不行的
不出所料 直接蓝了,换成正确的再试
没毛病,原POC的代码 copy到vs里 编译 还得改下几处地方
如果想了解的细一些 就可以一点点调试嘛,比如怎么取的SYSTEM的EPROCESS那一块