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