利用 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 时递增,因此需要进行多次写入才能获得有用的权限。正常权限如下所示:
|
|
经过几次写入后,获得了 SeCreateTokenPrivilege 权限。这是大多数时候获得的权限之一。
|
|
对于 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