K7 Secrity防病毒软件本地提权漏洞(CVE-2019-16897)分析

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29

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

拦截进程间通信
在Windows中有多种进程间通信方法可用,如邮件槽、文件映射、COM和命名管道。我们必须弄清楚在产品中实现了什么才能分析协议。一种简单的方法是使用API Monitor来记录进程发出的选择函数调用,我们可以看到K7 杀毒软件对命名管道函数的引用:

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

首先,它看起来像是扩展名列表(.ocx,.exe,.com),用|分隔,其中有些具有通配符匹配。这可能是扫描恶意软件的扩展列表。如果我们查看防病毒软件存储配置的注册表,则可以在RTFileScanner项的ScanExtensions值下看到类似的内容:

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

看起来杀毒软件似乎是通过指定(特权)注册表项和它们的值的完整键路径来应用值。下一步显然是查看更改其中一个键及其值是否可以使用。这可以通过在x32dbg中的TransactNamedPipe函数上进行断点来完成:

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

如果可以更改此注册表项的值,则将强制高特权进程加载AppInit_DLL中列出的DLL,即我们控制的DLL。要启用此功能,还必须将LoadAppInit_DLLs值设置为1(默认情况下为0)。结果:

触发有效载荷
你可能已经注意到,注册表项在Wow6432Node内,它是注册表的32位副本(这款产品是32位的),因此Windows将自动重定向注册表更改。在64位Windows中,进程通常是64位的,因此通过appinit_dll加载有效负载DLL的可能性不大。一种可靠的方法是利用杀毒软件的特权组件。最简单的方法就是重新启动计算机,重新加载所有防病毒进程,这种方法并是很实用。在UI上单击,会显示更新函数在NT AUTHORITY/SYSTEM用户下运行K7TSHlpr.exe:

由于它是32位应用程序,因此Windows会将AppInit_DLLs DLL加载到进程空间中。

使用system(“cmd”)作为有效载荷,将通过UI0Detect服务在NT AUTHORITY/ system帐户上下文中提示用户一个交互式会话:

选择查看消息将显示以下内容:

接下来我们就获得了root权限。自动利用过程请详见GitHub

上一页  [1] [2] [3]  下一页