KDE框架漏洞的原因及研究过程中的一系列思路

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
使用以下有效载荷:
payload.directory
[Desktop Entry]
Type=Directory
Icon[$e]=$(echo${IFS}0>~/Desktop/zero.lol&)

实际测试
与任何漏洞一样,访问代码可以使我们的测试变得容易得多。实际测试中,我发现了几件事:
1. 漏洞实际上是KDE配置中的一个设计缺陷;
2. 可以通过查看一个文件或文件夹来触发漏洞。
显然漏洞存在于KConfig中,但是如果我们不能获得配置目录,就没有办法触发它。有了这些信息,我决定浏览KConfig和KConfigGroup的代码。此时,我会发现了一个名为readEntry()的函数。
kconfiggroup.cpp

我们可以看到它在做一些事情:
1. 检查密钥输入;
2. 如果存在expand ($e)键,则expandString()的值会被读取。
显然,现在我们需要找出expandString()在做什么。浏览文档时,我们发现kconfig.cpp中有这个功能。
kconfig.cpp

我们可以看到它在做一些事情:
1. 检查$字符;
2. 检查是否后缀();
3. 运行popen的值;
4. 返回值(必须删除该部分)。
基本上它的大部分工作原理就清楚了,但是我想根据代码找到readEntry(),然后再调用expandString(),并执行命令。
在github上搜索了很长一段时间后,我确定有一个特定于桌面文件的函数,这个函数名为readIcon(),位于KDesktopFile类中。
kdesktopfile.cpp

基本上,它只使用readEntry()函数并从配置文件中获取图标。知道了这个函数的存在后,我们就可以返回源代码并搜索readIcon()。
到目前为止,我只是在利用.directory文件,但是在阅读了更多的代码之后,我发现这个KDesktopFile类不仅仅用于.directory文件,它也用于.desktop文件。
因为KDE将.directory和.desktop文件视为KDesktopFile的文件,而且由于图标是从这个类中调用的,所以如果在其中注入命令,则将执行我们的命令。
触发触发过程
SMB分享方法
我们知道,如果我们可以让某人查看.directory或.desktop文件,就会调用readEntry(),从而执行我们的代码。我认为必须有更多的方法来触发readEntry。理想情况下,是完全远程的,交互较少,且不下载文件。
我想到的解决这个问题的方法是使用iframe中的smb:// URI来服务用户将连接到的远程共享,最终在他们连接时执行我们的.directory文件。
非常不幸的是,KDE与GNOME的不同之处在于,它不会自动挂载远程共享,而且如果文件系统上不存在.desktop/.directory文件,KDE也不会信任它们。
这实际上违背了让用户意外浏览远程共享并执行任意代码的目的,这很有趣,因为自动加载远程共享是KDE用户一直要求的功能。如果运行正常,这次攻击可能会更加危险。
不管怎样,我们不能自动挂载远程共享,但是KDE确实有一个客户端,它可以方便地处理在KDE用户中很常见的SMB共享,这个应用程序称为SMB4k。
使用SMB4k挂载共享后,就可以在Dolphin中对其进行访问。
如果我们可以对公共SMB共享进行写入访问(通过smb4k进行浏览),就可以植入一个恶意配置文件,当在Dolphin中查看时,该配置文件将显示如下内容,最终实现远程执行代码。

ZIP方法(嵌套配置)
当向某人发送.directory或.desktop文件显然会引起很多问题,对吗? 我会这样想。这就是大多数有关该主题的评论所建议的。为什么没关系?因为嵌套这些文件并伪造其文件扩展名是你可能想到的最简单的事情。
我们在这里有很多选择,第一个选择是创建一个嵌套目录,一旦打开父目录,它的图标就会被加载。这将执行代码,甚至不需要查看或知道目录的内容。例如,从Apache网站下载httpd。

网络安全小白用户不可能识别出其中一个目录中嵌套了一个恶意.directory文件,所以攻击就很容易发生。
嵌套目录有效载荷如下所示:
$ mkdir httpd-2.4.39
$ cd httpd-2.4.39
$ mkdir test; cd test
$ vi .directory
[Desktop Entry]
Type=Directory
Icon[$e]=$(echo${IFS}0>~/Desktop/zer0.lol&)
将档案文件压缩并发送出去,在文件管理器中打开httpd-2.4.39文件夹时,测试目录将尝试加载图标,从而执行命令。
ZIP方法(单独配置文件)
第二个选项是伪造文件扩展名,事实证明,当KDE不识别文件扩展名时,它会尝试自动分配一个mimetype。如果文件开头包含[Desktop Entry],则为该文件分配了application / x-desktop模仿类型,最终允许文件在加载时由KConfig处理。
知道了这一点,我们可以制作一个假冒的TXT文件,其字符非常类似于“ t”。为了演示隐藏文件的简便性,我再次使用了httpd包。

显然,伪造的图标出现了,但是,与拥有一个随机的.desktop / .directory文件相比,它更加谨慎。同样,一旦打开此文件夹,代码就会被执行。
拖放方法(单独配置文件)
说实话,这种方法没用,但我认为它在演示中会很酷,并为这个有效载荷的传播添加了一个潜在的社会工程载体。
在我分析KDE时,我意识到,实际上可以拖放远程资源,并具有文件传输触发器,这都是由KIO (kde输入/输出模块)实现的,这基本上允许用户拖放远程文件并将它们传输到本地文件系统。
简而言之,如果我们可以让用户拖放一个链接,文件传输将在文件加载到系统上的那一刻触发并最终执行任意代码。
 

上一页  [1] [2]