利用SeCreateTokenPrivilege特权进行STOPzilla反恶意软件任意写入漏洞攻击

本文详细分析了STOPzilla反恶意软件驱动中一个任意写入漏洞(CVE-2018-15732)的利用过程。作者通过覆写内核的_SEP_TOKEN_PRIVILEGES结构,获得SeCreateTokenPrivilege权限,进而利用ZwCreateToken API创建特权令牌,实现在Windows 7和Windows 10系统上的权限提升。

利用 SeCreateTokenPrivilege 特权攻击 STOPzilla 反恶意软件任意写入漏洞

几个月前,我在一款名为 STOPzilla AntiMalware 的安全产品中发现了 9 个内核漏洞。由于供应商超过一个月未作回应,我现在将公开其中一个漏洞。所有漏洞都源于未验证输出缓冲区的地址,除了 ioctl 80002028 外,该漏洞还存在未验证输出缓冲区大小的问题。下表列出了相关的 ioctl、CVE ID 和漏洞类型:

IOCTL CVE ID 漏洞类型
0x8000204B CVE-2018-15729 拒绝服务
0x80002067 CVE-2018-15730 拒绝服务
0x8000205B CVE-2018-15731 拒绝服务
0x80002063 0x8000206F CVE-2018-15732 任意写入
0x80002028 CVE-2018-15733 空指针解引用
0x8000206B CVE-2018-15734 任意写入
0x8000205F CVE-2018-15735 任意写入
0x8000204F CVE-2018-15736 拒绝服务
0x80002043 CVE-2018-15737 拒绝服务

这里,我将通过覆写 _SEP_TOKEN_PRIVILEGES 结构来利用任意写入漏洞(CVE-2018-15732),以获取 SeCreateTokenPrivilege 权限。然后只需调用 ZwCreateToken API 来创建一个新的特权令牌。优秀的论文《滥用令牌权限进行本地权限提升》及其提供的源代码,对于利用此权限进行攻击提供了必要的帮助。

“what” 双字值从 1 开始,每次调用我们的 ioctl 时递增,因此需要进行多次写入才能获得有用的权限。正常权限如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
kd> dt nt!_SEP_TOKEN_PRIVILEGES fffff8a002f11060+40
+0x000 Present          : 0x6`02880000
+0x008 Enabled          : 0x800000
+0x010 EnabledByDefault : 0x800000

kd> !token fffff8a002f11060
.
.
19 0x000000013 SeShutdownPrivilege              Attributes - 
23 0x000000017 SeChangeNotifyPrivilege          Attributes - Enabled Default 
25 0x000000019 SeUndockPrivilege                Attributes - 
33 0x000000021 SeIncreaseWorkingSetPrivilege    Attributes - 
34 0x000000022 SeTimeZonePrivilege              Attributes - 
.
.

经过几次写入后,获得了 SeCreateTokenPrivilege 权限。这是大多数时候获得的权限之一。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
kd> dt nt!_SEP_TOKEN_PRIVILEGES fffff8a002e61a90+40
+0x000 Present          : 0x6`00000015
+0x008 Enabled          : 0x16
+0x010 EnabledByDefault : 0x800000

kd> !token fffff8a002e61a90
.
.
00 0x000000000 Unknown Privilege                Attributes - 
02 0x000000002 SeCreateTokenPrivilege           Attributes - Enabled 
04 0x000000004 SeLockMemoryPrivilege            Attributes - Enabled 
33 0x000000021 SeIncreaseWorkingSetPrivilege    Attributes - 
34 0x000000022 SeTimeZonePrivilege              Attributes - 
.
.

对于 Windows 7,我通过调用 WinStationSwitchToServicesSession() 切换到会话 0 来生成一个 shell。Windows 服务 “Interactive Services Detection”(UI0Detect)最初设置为手动且未启动,但在调用 WinStationSwitchToServicesSession() 时会启动。第一次会提示切换会话,之后由于服务已启动,会自动切换。

在 Windows 10(1803版)中,“Interactive Services Detection” 服务已被移除,在 1703 版上快速测试后我发现该服务无法启动。因此在 Windows 10 上,我只是将当前用户添加到本地管理员组。

CreateProcessAsUser API 并不总是按预期工作,偶尔会返回错误 1314,即"客户端未持有所需的权限"。多次运行漏洞利用程序后,最终会成功,所以不太确定这里到底发生了什么。尝试在另一个用户帐户的 shell 中运行漏洞利用程序(即不使用该帐户登录)似乎完全不起作用,总是返回错误 1314,请注意这一点。

更新: 我刚刚找出了 1314 错误背后的原因。由于 CreateProcessAsUser API 仍然由我们当前的进程令牌调用,所以在任意写入之后,有时除了获得 SeCreateTokenPrivilege 权限外,还会获得 SeAssignPrimaryTokenPrivilege 权限,这使得漏洞利用能够成功。因此,即使我们的提权令牌创建成功,我们还需要额外的 SeAssignPrimaryTokenPrivilege 权限才能使 CreateProcessAsUser API 成功。

STOPzilla AntiMalware 当前的易受攻击版本是 6.5.2.59,其驱动程序版本 szkg64.sys 是 3.0.23.0。漏洞利用程序可以从此处下载 [zip],如果您想试用该漏洞利用程序,这里是 StopZilla 网站上软件包的直链 [msi]。

@ParvezGHH

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计