CVE-2023-36874 Analyze
type
status
date
slug
summary
tags
category
icon
password
前言
前段时间看到这洞是com+symlink相关知识的漏洞,很吸引我 所以来学习了
Exploit
由于已经有成品了,直接跟着exploit来学习;简直方便太多
一开始我提,咋都成功不了;后来听@t1ngtu0师傅说,本地管理员组的用户 没法提的
看下一开始定义的一些东西
然后就是创建指定目录,并写入文件
接下来就是重头戏了,com操作
根据
CoCreateInstance
的信息去寻找,clsid:0e9a7bb5-f699-4d66-8a47-b919f5b6a1db
iid:6620c14b-70ae-4d4e-a4f6-91a7dcc582c2
如果这个接口没出来,就等会;或者刷新下
我们根据关键字,去ida中去找虚表
所以pIErcLuaSupport->Proc3,也就是调用CErcLuaSupport::GetWerStoreFactory函数,参数是一个IWerStoreFactory
我们重点看下这个v2,在如下做了参数;根据参数感觉是调用的
CWerComStoreFactory::QueryInterface
QueryInterface就是根据某个给定的IID返回指向相应接口的指针
我们根据这个iid,来猜测返回的是IWerStoreFactory
我们去找IWerStoreFactory的虚表就好,这个虚表我是在上一步里的
CWerComStoreFactory::CWerComStoreFactory
看到的所以pIWerStoreFactory->Proc4,调的应该就是CWerComStoreFactory::GetAdminArchive
所以得看下
OpenWerStore
也就是根据IID_IWerStore,这个iid去找
在之前的那些虚表后面翻了翻 找到的
https://lise.pnfsoftware.com/winpdb/FA27589900E31668887C33DEB302E3DDCF851145DB47258E3A3B9C2E5214E5D1-wercplsupport.html
调的Proc3 也就是
CWerComStore::EnumerateStart
在这个函数里,看到了如此字样
但是在后边的析构函数里,会调RevertToSelf终止模拟
我们看pIWerStore->Proc6(report,&pIWerReport)
里面重点调用了
CWerComStore::_LoadReport
,在这个函数里会初始化pIWerReport
后边pIWerReport->Proc24(report, 1024,NULL,&data,&ret); 调的也就是CWerComReport::SubmitReport
可以看到 这里调了
CAutoImpersonate::ImpersonateUserHighestPrivs
会模拟调用的客户端;所以也就是从system→user,然后后续执行CreateProcess,利用symlink的操作 进行提权?
这里为什么管理员组的用户不能提呢:
- 因为默认是Elevation Type: 3 (Limited),而模拟后是最高的 也就是Elevation Type: 2 (Full)
- 上边的 我是从windbg复制的,正常说的应该是low, medium, high嘛
- token不同,这就导致了luid不同;所以在symlink的操作时 没有成功吧
那为什么普通用户可以提呢:
- 普通用户的完整性,最高也就是medium;模拟完客户端后,也就是这个完整性
普通用户:
管理员组用户:
管理员用户:
可以看上面三幅图不同的load image,
调用堆栈感觉就是这样
回归到exp中,要看symlink的部分了
知道了luid,我们去看下符号链接
也就是访问:C:\Windows\System32\test.exe,会到C:\test\System32\test.exe
那么为什么CreateProcess是system,而不是模拟后的user权限呢;
因为createprocess用的主令牌是当前进程,而不是当前模拟的线程
也就是在模拟过程中,创建一个进程,他不会继承模拟令牌,而仍然是父令牌
可以看下James Forshaw的《Process Failure Modes》演讲
Patch
此类漏洞修复,可以在https://y3a.github.io/2023/08/24/cve-2023-35359/找到答案。
杜绝了这类漏洞的发生。
感谢
特别感谢@t0师傅
好多看似简单的问题,但一开始都没搞懂 然后t0师傅的耐心解答 使我茅塞顿开