使用此工具,您将能够检测:
对 COM 对象的不正确访问控制(LaunchPermission、AccessPermission) - LPE 通过可滥用的 COM 方法、DCOM 身份验证中继。这就是PermissionHunter
。
COM 对象的注册表权限不正确 - 通过 COM 劫持进行 LPE。那是ComDiver
。
找到新的海拔名字 - UAC 绕过。那是MonikerHound
。
获取有关特定 CLSID 的详细信息 - 检查 COM 对象以查找可滥用的 COM 方法。那是ClsidExplorer
。
代表低权限用户检查跨会话激活 - 尝试在其他人的 LPE 会话中实例化对象。那是ComTraveller
。
如果我们在几个月前(例如 2024 年春季)发布此工具,您就会发现 CVE-2024-38100 (FakePotato) 和 CVE-2024-38061 (SilverPotato)。
开始使用此工具,您可以找到更多在 Windows 系统上提升权限的方法。它就像一个自动化的 OleViewDotnet :)
PermissionHunter 是一个工具,允许您检查系统上所有 COM 对象的 LaunchPermission 和 ActivatePermission。
PS A:mzhmo> .PermissionHunter.exe -h ,`-。 .-' ,-"`````""-__ | / '-.._ _.-'` '-o, _>--:{{< ) |) .-'' '-.__ .-o` '-._____..-/` | ,-'/`-。 ` PermissionHunter - 寻找不正确的 LaunchPermission 和 ActivatePermission CICADA8 研究团队来自 Michael Zhmaylo (MzHmO)PermissionHunter.exe 小工具,允许您查找具有不正确的 LaunchPermission 和 ActivatePermission[OPTIONS]-outfile :输出文件名-outformat :输出格式的易受攻击的 COM 对象。接受 'csv' 和 'xlsx'-h/--help :显示此窗口
这里只有两个论据:
-outfile
- 带有权限报告的文件的名称;
-outformat
- 报告文件的格式,可以以 csv 和 xlsx 格式输出。最好以csv格式输出,因为如果没有Excel,就无法以xlsx格式输出。
例子:
PS A:mzhmo> .PermissionHunter -outfile 结果 -outformat xlsx ,`-。 .-' ,-"`````""-__ | / '-.._ _.-'` '-o, _>--:{{< ) |) .-'' '-.__ .-o` '-._____..-/` | ,-'/`-。 ` PermissionHunter - 寻找不正确的 LaunchPermission 和 ActivatePermission CICADA8 研究团队来自 Michael Zhmaylo (MzHmO)[+] 结果将在结果中,格式为 xlsx[+] 成功
之后您将获得一个文件 result.xlsx,其中列出了现有 COM 对象的所有权限。
我输出以下列:
ApplicationID
- 特定 COM 对象的 ApplicationID。例如: {69AD4AEE-51BE-439b-A92C-86AE490E8B30}
;
ApplicationName
- 特定 COM 对象的应用程序名称。例如: Background Intelligent Transfer Service
;
RunAs
- COM 对象的 RunAs 注册表项。例如: Interactive User
;
LaunchAccess
、 LaunchType
、 LaunchPrincipal
、 LaunchSid
- LaunchPermission 注册表项。 LaunchPrincipal 指定对 COM 对象具有 LaunchAccess 权限的用户。 LaunchType - ACE 类型:启用或禁用。 LaunchSID - LaunchPrincipal 的 SID。前任:
本地启动。远程启动。本地激活。允许远程激活访问 NT AUTHORITYSYSTEM S-1-5-18
这意味着系统对该COM对象具有LocalLaunch、RemoteLaunch、LocalActivation、RemoteActivation权限;
AccessAccess
、 AccessType
、 AccessPrincipal
、 AccessSID
- 字段与 LaunchPermissions 具有相同的含义,仅在 AccessPermission 的上下文中;
AuthLevel
、 ImpLevel
- 身份验证级别和模拟级别。默认情况下,它们设置为RPC_C_AUTHN_LEVEL_CONNECT
和RPC_C_IMP_LEVEL_IDENTIFY
;
CLSIDs
- COM 对象 CLSID。
例如,如果您发现可以代表低权限用户访问的 COM 对象,您可以按如下方式滥用它:
创建一个实例并调用该 COM 对象的方法,例如代表系统写入任意文件。 例如,您找到了一个带有DeployCmdShell()
方法的 COM 对象,该方法代表NT AUTHORITYSYSTEM
帐户运行,并且您拥有LaunchPermissions
和AccessPermissions
。您可以启动此 COM 对象,调用DeployCmdShell()
方法,并代表系统执行代码。您可以使用ClsidExplorer
查看可用的方法。
滥用 DCOM 身份验证。为此,请参阅 RemoteKrbRelay
有关 COM 对象的所有信息都在注册表中。但如果注册不正确怎么办?在这种情况下,我们有可能覆盖 COM 设置,例如劫持可执行文件。
该工具允许您检测此类漏洞,并根据搜索 COM 对象时查看的键的优先级来扫描注册表。通过这种方式,你甚至可以发现Shadow COM Hijacking。优先级如下:
1. HKCUSoftwareClasses(GUID)视为 2. HKLMSoftwareClasses(GUID)视为 3. HKCUSoftwareClasses(GUID)InprocServer32 4. HKLMSoftwareClasses(GUID)InprocServer32 5. HKCUSoftwareClasses(GUID)LocalServer32 6. HKLMSoftwareClasses(GUID)LocalServer32
因此,至少出现了两个特权升级的向量:
如果我们拥有HKCU...TreatAs
写入权限,并且原始 COM 可执行文件位于HKCU...LocalServer32
中,那么我们可以通过将可执行文件写入HKCU..TreatAs
来进行 Shadow COM 劫持。
如果 COM 对象位于HKCU..LocalServer32
中,并且我们可以写入HKCU..LocalServer32
,那么我们就可以进行 COM 劫持
让我们仔细看看该工具:
PS A:ssdgitrepoCOMThanasiaComDiverx64Debug> .ComDiver.exe -h / o ^ o / ( ) / ____________(%%%%%%%)____________ ( / / )%%%%%%%( ) (___/___/__/ ________) ( / /(%%%%%%%) ) (__/___/ (%%%%%%%) _____) /( ) / (%%%%%) (%%%) !------------ COM 驱动程序 -------------- [?] 检查 com 对象上不安全注册表和磁盘权限的小工具 [?] 参数 -h/--help <- 显示此消息 --from<- 从此 clsid 分析 CLSID --target <- 分析一个目标 clsid --no-context <- 不检查另一个 COM 服务器上下文。仅注册表分析。 --no-create <- 不创建目标 COM 对象。这是最快的模式
它接受以下参数:
--from
- Windows 系统上有很多 CLSID。如果您不希望该工具从第一个开始查看所有 CLSID,则可以指定以 CLSID 开头,例如--from {50FDBB99-5C92-495E-9E81-E2C2F48CDDA}
--target
- 分析特定的clsid;
--no-context
- 不检查代表其启动 COM 对象的用户名;
--no-create
- 不创建已检测到的 COM 对象。这限制了您可以获得的相关信息。然而,这是仅检查注册表权限的最快方法。
例子:
.ComDiver.exe --无创建
在这种情况下,我们可以看到 HKCU 内部没有密钥,并且我们对这些密钥具有写入权限。因此,如果我们将自己的值写入该路径,我们就会进行COM劫持。
如果您在工具输出中看到红色行,则这是滥用 COM 对象的潜在方法!您可以执行 COM 劫持(欺骗现有的可执行文件)或影子 COM 劫持(欺骗丢失的可执行文件)。在此处阅读有关 COM 劫持的更多信息
Windows 系统上有一种内置方法可以绕过 UAC,这是通过 Elevation Moniker 完成的。您可以在这里阅读更多相关信息。这种UAC绕过需要一种非标准的方式在注册表中注册COM对象,这相当容易追踪。所以你可以使用我的工具来寻找绕过UAC的新方法。
例子:
PS A:ssdgitrepoCOMThanasiaMonikerHoundx64Debug> .MonikerHound.exe ,_ _ _, oo/ ,(.-.), _/ |) (| _ /=-=/ ,| =/ |, _/ | / _ _!_/ MonikerHound - 找到您自己的 UAC 绕过! CICADA8研究团队 来自迈克尔·日梅洛 (MzHmO) [+] 发现了潜在的海拔名称 COM 服务器!名称:CEIPLuaElevationHelper CLSID:{01D0A625-782D-4777-8D4E-547E6457FAD5} LocalizedString: @%systemroot%system32werconcpl.dll,-351 已启用:1 图标参考:@%systemroot%system32werconcpl.dll,-6 激活:成功 PID:15800 DLL主机 [+]................................[+] [+] 发现了潜在的 COM 服务器,用于提升绰号!名称:CTapiLuaLib 类 CLSID:{03e15b2e-cca6-451c-8fb0-1e2ee37a27dd} LocalizedString: @%systemroot%system32tapiui.dll,-1 已启用:1 图标参考:@%systemroot%system32tapiui.dll,-201 激活:成功 PID:440 DLL主机 [+]................................[+]
一旦您发现了 UAC Bypass 的潜在候选者,您就可以开始检查它们。作为运行 Elevation Moniker 的绝佳模板,您可以采用此功能或此程序。
ClsidExplorer 允许您检索有关特定 CLSID 的信息。该程序输出以下数据:
AppID
- 特定 COM 对象的应用程序 ID;
ProgID
- 特定 COM 对象的 ProgID;
PID
- 此 COM 对象在其中运行的 PID;
Process Name
——PID进程的名称;
Username
- 代表其运行进程的用户的名称;
Methods
- COM 对象的可用方法。通过解析 TypeLib 制作。
PS A:ssdgitrepoCOMThanasiaClsidExplorerx64Debug> .CLSIDExplorer.exe -h CLSIDExplorer.exe - 通过clsid识别所有信息 用法: .CLSIDExplorer.exe --clsid“{00000618-0000-0010-8000-00aa006d2ea4}”
该程序只接受一个参数:
--clsid
- 要分析的目标 CLSID
PS A:ssdgitrepoCOMThanasiaClsidExplorerx64Debug> .CLSIDExplorer.exe --clsid“{00000618-0000-0010-8000-00aa006d2ea4}”[{00000618-0000-0010-8000-00aa006d2ea4}] 应用程序ID:未知 程序 ID:未知 PID:1572 进程名称: CLSIDExplorer.exe 用户名:WINPCMichael 方法: [0] __stdcall void QueryInterface(IN GUID*, OUT void**) [1] __stdcall 无符号长 AddRef() [2] __stdcall unsigned long Release() [3] __stdcall void GetTypeInfoCount(OUT unsigned int*) [4] __stdcall void GetTypeInfo(IN unsigned int, IN unsigned long, OUT void**) [5] __stdcall void GetIDsOfNames(IN GUID*, IN char**, IN unsigned int, IN unsigned long, OUT long*) [6] __stdcall void Invoke(IN long、IN GUID*、IN unsigned long、IN unsigned Short、IN DISPPARAMS*、OUT VARIANT*、OUT EXCEPINFO*、OUT unsigned int*) [7] __stdcall BSTR 名称() [8] __stdcall 无效名称(IN BSTR) [9] __stdcall RightsEnum GetPermissions(IN VARIANT,IN ObjectTypeEnum,IN VARIANT) [10] __stdcall void SetPermissions(IN VARIANT,IN ObjectTypeEnum,IN ActionEnum,IN RightsEnum,IN InheritTypeEnum,IN VARIANT) [11] __stdcall 无效 ChangePassword(IN BSTR, IN BSTR) [12] __stdcall 组* 组() [13] __stdcall 属性* 属性() [14] __stdcall _Catalog* ParentCatalog() [15] __stdcall 无效 ParentCatalog(IN _Catalog*) [16] __stdcall 无效 ParentCatalog(IN _Catalog*) [结尾]
该程序非常适合检查使用ComTraveller
或PermissionHunter
或MonikerHound
发现的 COM 类,以查找可能被滥用的有趣方法。
ComTraveller - 该工具允许您探索所有可用的 COM 对象。首先,它允许您快速识别具有有趣值(以交互用户身份运行)的 COM 对象、TypeLib 的可用性以及跨会话激活功能。因此,您可以快速检测可能在另一个用户会话中实例化的对象,从而导致权限升级。
PS A:SSDgitrepoCOMThanasiaComTravellerx64Debug> .ComTraveller.exe -h ,,_ zd$$??= z$$P? F:`c, _ d$$, `c'cc$$i ,cd$?R $$$$ cud$,?$$$i ,=P"2?z " $" " ?$$$, ?$$$。 ,-''`>, bzP 'cLdb,?$$,?$$$ ,h' "I$'J$P ... `?$$$,"$$,`$$h $$PxrF'd$"d$PP""?-,"?$$,?$h`$$,,$$'$F44 "?,,_`=4c,?=,"?hu?$`?L4$'? ' `""?==""=-"" `""-`'_,,,, .ccu? m?e?JC,-,"=? """=='?"ComTraveller - 用于解析和提取系统上所有已注册 CLSID 信息的小工具用法:--file
--file
- 将输出有关 COM 对象的信息的文件的名称;
--from
- Windows 系统上有很多 CLSID。如果您不希望该工具从第一个开始查看所有 CLSID,则可以指定以 CLSID 开头,例如--from {50FDBB99-5C92-495E-9E81-E2C2F48CDDA}
--session
- 尝试在其他人的会话中实例化一个对象
--target
- 仅分析一个目标 clsid
例子:
.ComTraveller.exe --文件rep.csv --会话1
之后,您将找到一个包含有关 COM 对象信息的rep.csv 文件。 这里有几个栏目:
CLSID
- COM 对象的 CLSID;
AppId
- COM 对象的 APPID;
ProgId
- COM 对象的 APPID;
RunAs
- RunAs 注册表中的值。如果值为The Interactive User
或NT AUTHORITYSYSTEM
,则可以尝试制作 LPE;
Username
- 代表其运行 COM 对象的用户名;
PID
- COM对象运行所在的PID;
ProcessName
- COM 对象正在其中运行的进程的名称;
HasTypeLib
- COM 对象是否具有 TypeLib。如果是的话,你可以把这个对象交给ClsidExplorer
来查看可用的方法;
canCrossSessionActivate
- 是否可以通过在其他人的会话中激活来滥用此 COM 类进行 LPE。如果值为+
或错误为ACCESS DENIED
,则这可能是 LPE 的潜在候选者。
例如,如果您应用过滤器,您将立即找到有趣的 COM 类:) 哇,这是一个可以跨会话激活并且代表系统工作的 COM 类吗?
需要注意的是,由于COM对象过多,程序可能会崩溃。在这种情况下,您可以像这样重新启动它:
.ComTraveller.exe --文件rep.csv --会话1 --来自“{0006F071-0000-0000-C000-000000000046}”