m 文件 dll matlab 中调用_反病毒软件的漏洞分析和利用: K7 安全软件中的本地权限提升漏洞(CVE201916897)...

cca7a899dafe082b682617b185e51ac2.gif

53346bd115665a418823204dce23f338.png反病毒软件的漏洞利用

嘿,伙计们,好久没有发表文章了!在过去的几个月里,我一直在研究利用逻辑错误来攻击反病毒软件。我将以我在K7 杀毒软件中发现的漏洞为例,简要讨论对这些安全产品执行漏洞研究的方法。

负责声明:我并不声称知道关于漏洞研究或利用的一切,所以如果在这篇文章中有错误,请让我知道。

bafcf10db21d25813bdf416503b33326.png目标选择

像杀毒软件这样的安全产品是一个很有吸引力的目标(至少对我来说是这样),因为它们在作为驱动程序的内核和作为特权服务的用户环境中都是可信任和拥有特权的。这意味着它们能够促进特权的潜在升级或以其他方式访问特权功能。它们在操作系统的低特权空间中占有一席之地。例如,可能存在用户可以与之交互的UI组件,有时允许更改选项,如启用/禁用反病毒功能、添加目录或文件排除、扫描文件以查找恶意软件。反病毒软件还必须访问和执行操作系统对象的操作,以检测恶意软件,如读取文件、注册表项、内存等,以及能够执行特权操作,以保持系统在一个受保护的状态,无论情况如何。在这个受信任的高特权空间和不受信任的低特权空间之间,有趣的事情发生了。

bafcf10db21d25813bdf416503b33326.png攻击面分析

正如前面提到的,抗病毒软件存在于权限边界的两端,如下图所示:

84c776777302bbfc7e4000ababdb51ec.png

任何越过高特权和低特权之间的界限的都代表攻击面。

让我们看看如何解释这个图。用户界面与预期的服务流程共享公共操作。如果用户希望执行特权操作,则假定安全检查通过,服务将代表用户执行特权操作。如果用户希望更改设置,则打开用户界面并单击按钮。这是通过某种形式的进程间通信(IPC)传递给服务进程的,IPC将执行必要的操作,例如,杀毒软件将其配置存储在注册表中,因此,服务将打开相关的注册表项并修改一些数据。请记住,注册表项存储在HKEY_LOCAL_MACHINE 的hive 中,该hive位于高特权空间中,因此需要高特权进程修改其数据。因此,来自低权限的用户能够间接地修改高权限对象。

再举一个例子。用户可以通过用户界面扫描恶意软件(当然,如果不允许用户扫描恶意软件,那么反病毒软件对用户来说又有什么好处呢?) 。一个简单的,运行良好的软件,会出什么问题?由于执行恶意软件扫描是服务进程的职责,因此接口将信息传递给服务进程以锁定文件。为了执行扫描,它必须与文件进行交互,也就是说,它必须在磁盘上定位文件并读取其内容。如果在读取文件数据并扫描恶意软件时,反病毒软件没有将文件锁定在磁盘上,那么恶意软件就有可能被替换为一个指向高特权目录中的文件的符号链接(是的,这是可能的) ,让我们使用notepad.exe做个说明。当扫描完成并被确定为恶意软件时,服务进程可以删除该文件。然而,这个恶意软件已经被notepad.exe 的链接所替代!如果反病毒程序没有检测到并拒绝符号链接,它将毫无疑问地删除notepad.exe。这是一个时间检查到使用时间(TOCTOU)1竞争条件错误的示例。同样,来自低特权的用户能够间接修改高特权对象,因为服务进程充当了代理。

bafcf10db21d25813bdf416503b33326.png漏洞利用

该漏洞允许低权限用户通过反病毒设置修改(几乎)任意注册表数据。但是,低特权用户(非管理员)不能更改反病毒设置。

d0912c614d169fe55d55c37691c90c08.png

bafcf10db21d25813bdf416503b33326.png绕过管理检查

为了缩小管理检查的执行范围,可以在再次访问设置页面时使用procmon 标识操作系统活动。这将触发反病毒程序重新检查当前用户的管理状态,同时在记录时与操作系统进行交互。当然,由于我们是低权限的,并且procmon 需要高权限,因此在实际环境中是不实用的。但是,由于我们控制了测试环境,因此我们可以允许procmon 运行,因为我们可以访问管理员帐户。将promon 中设置为K7TSMain 作为进程名称的过滤器,将捕获由用户界面进程执行的活动。

d9ff19294d9cb2e376c562dc0672f7e3.png

当procmon 开始记录日志时,尝试再次访问UI 中的设置页面将触发procmon 立即显示结果:

92edc9314174cc7ca44b08d0f08738b9.png

procmon 捕获的管理检查

可以看到,反病毒程序将管理检查存储在注册表中的AdminNonAdminIsValid。查看事件属性窗口中的值,返回为0,这意味着不允许非管理员用户操作。但这里有个小问题。如果你能发现它,还有额外的加分。

现在我们知道了检查在哪里执行,下一步就是绕过它。Procmon 显示进程正在低权限空间中运行,正如用户指示的那样,中等完整性意味着我们拥有进程权限。如果它不受保护,我们可以简单地HOOK RegQueryValue 函数并修改返回值。

0bf2a78471d6c8e94202d686d7627a39.png

挂载到K7TSMain 进程

使用x32dbg 可以成功附加到K7TSMain.exe进程!当我们试图再次访问设置页面时,RegQueryValueExA上的断点已被设置。

f593db11dfcf978259dbadec58529a4a.png

触发RegQueryValueExA 断点

x32dbg在单击设置页面时捕获断点。被查询的值的名名称是ProductType,但是我们希望是AdminNonAdminIsValid,所以我们需要继续执行,触发下一个断点。

a38c1e5f74ecfbb242c94d95e7858f30.png

设置在AdminNonAdminIsValid 上的断点

现在我们可以看到AdminNonAdminIsValid。要修改返回值,可以允许函数一直运行到返回为止。但是,调用函数看起来像RegQueryValueExA的包装:

a40b33be2f8f11ad137e9a949d7384f7.png

因此继续执行,直到返回值显示执行检查的真正函数:

b21d26dc842c80a3de686788f7c38766.png

管理员检查函数

这里有一个值为1 的检查,但是注册表数据当前返回的值是0。这决定了这个函数的返回值,所以我们可以改变[esp+4]或改变返回值来绕过检查:

8879cd39e1ffbec921e6428520c6736a.png

绕过管理员检查

bafcf10db21d25813bdf416503b33326.png拦截行程间通讯

在Windows 上有多个行程间通讯的方法,比如mailslot、文件映射、COM 和命名管道。我们必须弄清楚哪些是在产品中实现的,以便能够分析协议。一个简单的方法是使用API Monitor 记录进程执行的选择函数调用。当我们这样做的时候,然后应用一个改变的设置,我们可以看到对命名管道函数的引用:

3926f4e65a3421cfb9c18020e514cb34.png

注意,调用模块是K7AVOptn.dll,而不是k7tsm.exe。如果我们看一下通过TransactNamedPipe传输的数据,我们可以看到一些有趣的信息:

810ae4a473609a212d9d5077f4c1ff6e.png

首先,它看起来像一个使用|符号分隔的扩展名列表(.ocx, .exe, .com),其中一些具有通配符匹配。这可能是扫描恶意软件的扩展列表。如果我们查看一下反病毒程序保存配置的注册表,我们可以在RTFileScanner键的值ScanExtensions下看到类似的东西:

6b82003260acaa7f81c0c6bf1e0a3e07.png

继续往下看,其中一个调用包含了一些非常有趣的数据:

115c2953382c3648364fd5b5960d99a1.png

看起来似乎反病毒软件是通过指定(特权)注册表项和它们的值的完整键路径来应用某个值。下一个明显的步骤是查看更改其中一个键及其值是否有效。这可以通过在x32dbg中的TransactNamedPipe函数上设置断点来实现:

834b64b84b47e9854bc0f4b5881cb725.png

在这里,定位第二个参数中的输入缓冲区,并修改数据以在HKEY_LOCAL_MACHINE 的 hive中添加或更改密钥,如下所示:

5020b0ddadfe3150c0f5a58f51e1a4cc.png

如果可以更改这个注册表项的值,高权限进程将被迫加载AppInit_DLLs 中列出的dll,即我们控制的dll。LoadAppInit_DLLs值也必须设置为1(默认为0)才能启用此功能。结果如下:

3f51843044093e59de3f913d2a36f19a.png

bafcf10db21d25813bdf416503b33326.png触发有效载荷

你可能已经注意到,注册表项驻留在Wow6432Node 中,该节点是注册表的32位副本。这是因为产品是32位的,所以Windows 会自动重定向注册表更改。在64位Windows 中,进程通常是64位的,因此通过AppInit_DLLs加载有效载荷DLL 的可能性不大。一个可靠的方法是使用杀毒软件,因为它是32位的,假设一个有特权的组件可以启动。最简单的方法是重新启动机器,因为它会重新加载所有的杀毒程序。在UI上单击,会显示更新函数在NT AUTHORITY\SYSTEM用户下运行K7TSHlpr.exe:

62d6846d3af4d521d6835ca330696036.png

因为它是一个32位应用程序文件夹,Windows 会将我们的AppInit_DLLs列表中的DLL 加载到进程空间中。

2103dcdb9243eeae1487a0c36623c052.png

使用系统的cmd.exe 作为有效载荷,将通过UI0Detect服务在NT AUTHORITY\ SYSTEM 帐户上下文中提示用户一个交互式会话:

3591cda49ab01625b503f9014e16104f.png

选择查看消息会出现以下结果:

2aef707ab933651b59dfc13c5ac89c59.png

我们得到了SYSTEM 权限。

bafcf10db21d25813bdf416503b33326.png自动化漏洞利用

请访问我的GitHub以获得建议和自动化漏洞利用细节

https://github.com/NtRaiseHardError/Antimalware-Research/tree/master/K7%20Security/Local%20Privilege%20Escalation/v16.0.0120

本文翻译自:https://0x00sec.org/t/anti-virus-exploitation-local-privilege-escalation-in-k7-security-cve-2019-16897/17655

c2929dac4b747eb26cc7109cad697307.png

d6c8add8c64a89393b1eec1a8bc0cbbb.png

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值