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

本文详细分析了STOPzilla反恶意软件中存在的多个内核漏洞,重点介绍了如何利用任意写入漏洞通过修改_SEP_TOKEN_PRIVILEGES结构获取SeCreateTokenPrivilege权限,并最终实现权限提升的技术细节。

利用STOPzilla反恶意软件任意写入漏洞使用SeCreateTokenPrivilege

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

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服务"交互式服务检测”(UI0Detect)最初设置为手动且未启动,但在调用WinStationSwitchToServicesSession()时启动。第一次实例会提示切换会话,之后由于服务已启动,将自动切换。

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

CreateProcessAsUser API并不总是按预期行为,偶尔返回1314错误,这意味着"客户端未持有所需权限”。多次运行漏洞利用最终会成功,但不确定具体原因。尝试在其他用户帐户的shell中运行漏洞利用(即不使用该帐户登录)似乎完全不起作用,总是返回1314错误,请注意这一点。

更新:我刚刚找出了1314错误的原因,由于CreateProcessAsUser API仍然由我们当前进程令牌调用,所以在任意写入后,有时会同时获得"SeAssignPrimaryTokenPrivilege"权限和"SeCreateTokenPrivilege"权限,从而使漏洞利用工作。因此,即使我们成功创建了提升的令牌,仍然需要额外的"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 设计