首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CVE-2018-19518:PHP imap_open函数任意命令执行漏洞复现

受影响版本

Ubuntu https://people.canonical.com/~ubuntu-security/cve/2018/CVE-2018-19518.html

Debian https://security-tracker.debian.org/tracker/CVE-2018-19518

Red Hat https://access.redhat.com/security/cve/cve-2018-19518

SUSE https://www.suse.com/security/cve/CVE-2018-19518/

描述

PHP 的imap_open函数中的漏洞可能允许经过身份验证的远程攻击者在目标系统上执行任意命令。该漏洞的存在是因为受影响的软件的imap_open函数在将邮箱名称传递给rsh或ssh命令之前不正确地过滤邮箱名称。如果启用了rsh和ssh功能并且rsh命令是ssh命令的符号链接,则攻击者可以通过向目标系统发送包含-oProxyCommand参数的恶意IMAP服务器名称来利用此漏洞。成功的攻击可能允许攻击者绕过其他禁用的exec 受影响软件中的功能,攻击者可利用这些功能在目标系统上执行任意shell命令。利用此漏洞的功能代码是Metasploit Framework的一部分。

分析

要利用此漏洞,攻击者必须具有对目标系统的用户级访问权限。此访问要求可以降低成功利用的可能性。

复现过程

环境搭建

系统Debian9

安装PHP及其他包(php7.0.30)

我们需要对PHP做一些安全的配置

比如说

SSH安装

strace工具安装

IMAP模块安装

什么是IMAP?

为什么我们要先了解这个?因为IMAP是在系统中执行任何命令的桥梁。Internet消息访问协议(IMAP)是电子邮件客户端用于通过TCP / IP连接从邮件服务器检索电子邮件的Internet标准协议。IMAP由Mark Crispin于1986年设计为远程邮箱协议,与广泛使用的POP(一种用于检索邮箱内容的协议)形成对比。目前,IMAP由RFC 3501定义规格。IMAP的设计目标是允许多个电子邮件客户端完全管理电子邮件收件箱。因此,客户端通常会在服务器上保留消息,直到用户明确删除它们为止。IMAP服务器通常侦听端口号143.默认情况下,为IMAP over SSL(IMAPS)分配端口号993。当然,PHP支持IMAP开箱即用。为了使协议的工作更容易,PHP有许多功能。在所有这些功能中,我们只对imap_open尽心讨论和探究。它用于打开邮箱的IMAP Stream。该函数不是PHP核心函数; 它是从华盛顿大学开发的UW IMAP工具包环境导入的,该库的最新版本大约在7年前于2011年发布。也许,IMAP在PHP中是这样调用的,比如说

使用mailbox参数来定义连接的服务器,比如说

IMAP允许您使用预先验证的ssh或rsh会话自动登录服务器。当您不需要使用该功能时使用的标志然后默认尝试使用该标志

可以看到tcp_aopen的工作原理及主要功能在tcp_unix.c被定义

我们看一下ssh和rsh的路径

可以看到,写到了如果没有定义SSHPATH,那么将尝试读取RSHPATH。其中部分代码将会帮你找到SSHPATH定义发生的位置代码示例如下:/imap-2007f/src/osdep/unix/env_unix.h:

/imap-2007f/src/osdep/unix/env_unix.c:

默认情况下它是空的,我们是无法控制它的,因为/etc目录没有写入权限。呐,我们跳转到RSHPATH。他在Makefile中。不同版本的发行版为其Makefile的路径都会不同。如果你不知道你的Makefile的路径,你可以在/usr/bin/rsh查看Makefile的路径。/imap-2007f/src/osdep/unix/Makefile:

我们cat一下tcp_appen返回都改变了什么

我们发现上述的代码示例生成一个命令,用于在远程服务器上执行rimapd二进制文件。让我们创建一个PHP脚本进行测试test1.php。

Poc地址

使用带有execve系统调用过滤的strace工具来观察脚本处理期间将执行的命令。

如回显,这里的x其实是执行命令的参数之一,这意味着我们可以在操作服务器地址参数时操纵命令行

命令成功执行,回显

这时我们不能直接将它转移到PHP脚本来代替imap_open服务器地址,因为在解析时,它将空格解释为分隔符和斜杠作为标志。但,你可以使用$ IFS shell变量来替换空格符号或普通选项卡(\ t)。还可以在bash中使用Ctrl + V热键和Tab键插入标签。要想绕过斜杠,你可以使用base64编码和相关命令对其进行解码,比如

我们也可以也hack bar里对其用base64进行解码开个题外话,刚还在群里问了大佬们用的firefox的hackbar多一点还是chrome的hackbar多一点呢,因为我感觉firefox的hackbar更舒服,但是更喜欢用chrome,很纠结,还是看习惯吧 呐,我们现在放到PHP进行测试 新建一个test2.php

现在再次使用strace执行它并观察命令行调用的内容。

被我们用红色框圈出来的,它们都正在远程服务器上运行。利用完成,文件创建成功。这些命令不是由PHP本身执行,而是由外部库执行,这意味着什么??意味着他们都不会阻止它执行,而不是事件disable_functions指令。现在我们放在简单的生产环境进行测试PrestaShop,PrestaShop是一种免费增值的开源电子商务解决方案,它是由php编写的,mysql数据库,官网给出的最低配置,我们简略的看一下

我们cd 到/var/www/html

访问192.168.169.128/install/index.php进行安装,并登陆管理面板我们也可以查看AdminCustomerThreads的源代码/prestashop-1.7.4.4/controllers/admin/AdminCustomerThreadsController.php

在这里你可以看到imap_open调用的url变量现在我们执行paylaod.php

终于能看见远程执行了,好了复现就到这里管理员可以做点什么?

大佬的帖子是这么写的,稍微搬一下,没怎么做翻译,说一下自己结合的理解,类似于PrestaShop这样的软件暂时没有更新版本解决这个安全问题。听说,PHP大佬已经发布了针对此问题的补丁,估计Linux发行版中的存储库和软件包也未必有这么快动作来更新安全补丁最后奉上CVE-2018-19518漏洞利用的。

有时间在搞,如何利用,相关图片我整理一下在上传,现在截稿已经4.34分……看着一堆大佬的英文帖子,搞出来的。

*本文原创作者:不分手的恋爱,本文属FreeBuf原创奖励计划,未经许可禁止转载

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190106B0SLFN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券