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
notion image
 
iid:6620c14b-70ae-4d4e-a4f6-91a7dcc582c2
notion image
如果这个接口没出来,就等会;或者刷新下
 
我们根据关键字,去ida中去找虚表
notion image
 
所以pIErcLuaSupport->Proc3,也就是调用CErcLuaSupport::GetWerStoreFactory函数,参数是一个IWerStoreFactory
 
我们重点看下这个v2,在如下做了参数;根据参数感觉是调用的CWerComStoreFactory::QueryInterface
QueryInterface就是根据某个给定的IID返回指向相应接口的指针
 
我们根据这个iid,来猜测返回的是IWerStoreFactory
notion image
 
 
我们去找IWerStoreFactory的虚表就好,这个虚表我是在上一步里的CWerComStoreFactory::CWerComStoreFactory看到的
notion image
 
所以pIWerStoreFactory->Proc4,调的应该就是CWerComStoreFactory::GetAdminArchive
notion image
 
所以得看下OpenWerStore
 
也就是根据IID_IWerStore,这个iid去找
notion image
 
 
在之前的那些虚表后面翻了翻 找到的
https://lise.pnfsoftware.com/winpdb/FA27589900E31668887C33DEB302E3DDCF851145DB47258E3A3B9C2E5214E5D1-wercplsupport.html
 
notion image
 
调的Proc3 也就是CWerComStore::EnumerateStart
在这个函数里,看到了如此字样
notion image
但是在后边的析构函数里,会调RevertToSelf终止模拟
 
我们看pIWerStore->Proc6(report,&pIWerReport)
里面重点调用了CWerComStore::_LoadReport,在这个函数里会初始化pIWerReport
 
notion image
 
notion image
后边pIWerReport->Proc24(report, 1024,NULL,&data,&ret); 调的也就是CWerComReport::SubmitReport
可以看到 这里调了CAutoImpersonate::ImpersonateUserHighestPrivs
 
notion image
会模拟调用的客户端;所以也就是从system→user,然后后续执行CreateProcess,利用symlink的操作 进行提权?
 
 
这里为什么管理员组的用户不能提呢:
  • 因为默认是Elevation Type: 3 (Limited),而模拟后是最高的 也就是Elevation Type: 2 (Full)
    • 上边的 我是从windbg复制的,正常说的应该是low, medium, high嘛
  • token不同,这就导致了luid不同;所以在symlink的操作时 没有成功吧
 
那为什么普通用户可以提呢:
  • 普通用户的完整性,最高也就是medium;模拟完客户端后,也就是这个完整性
 
普通用户:
notion image
 
管理员组用户:
notion image
 
管理员用户:
notion image
可以看上面三幅图不同的load image,
 
调用堆栈感觉就是这样
 
回归到exp中,要看symlink的部分了
 
notion image
知道了luid,我们去看下符号链接
notion image
也就是访问: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师傅的耐心解答 使我茅塞顿开
 
 

© muxue 2021-2025