复现视频链接:https://www.ichunqiu.com/course/58895
如下内容为复现及笔记
Supervisord是使用Python 开发的进程管理程序,Supervisord能够将命令行进程或服务变为后台运行的deamon(守护进程)。Supervisord拥有监控进程状态的功能,在进程异常退出时能够自动重启进程。
Supervisord在配置了Web接口后,服务器会启动一个XMLRPC服务器,端口号为9001,利用本漏洞,在获取接口访问权限后,远程攻击者可利用发送一段精心构造的请求,导致可在服务器执行任意代码。
Supervisord 3.1.2 <= Version <= 3.3.2
Supervisord 3.3.3 、Supervisord 3.2.4 、Supervisord 3.1.4 、Supervisord 3.0.1
Supervisord的控制实际上就是一个C/S以RPC协议的通信的过程,而RPC协议(远程过程调用协议),顾名思义就是客户端通过RPC协议可以在服务端执行某个函数,并得到返回结果。那么,如果客户端执行了服务端预料之外的函数(如os.system),就会导致漏洞的产生。
一个安全的RPC协议,会有一个函数名的映射,客户端只能调用在白名单之中的部分函数,并且这个“函数”只是真正函数的一个映射。
3.3.2版本中Supervisord是如何处理RPC调用如下:
代码逻辑如下:
实际上这个函数最后达成的效果就是:初始ob对象下的任意public方法,包括它的所有递归子对象的任意public方法,都可以被调用。
ob对象即为self.rpcinterface
,官方开发者可能认为可调用的方法只限制在这个对象内部,所以未做特别严格的白名单限制。导致调用存在的其他对象的方法,可以执行任意命令。
1. 漏洞文件下载
2. 打开burpsuite工具,开启浏览器代理。
3. 访问目标地址
右击,选择Send to Repeater,将数据包发送至重放模块,点击Repeater查看本次需要修改的数据包。
4. 发包
发包执行成功
5. 使用POC查看命令是否执行
已经创建了hello文件,代码执行成功,
6. 漏洞复现完成
漏洞利用模块查找方向:在非下划线开头的属性中可利用的模块。
漏洞发现者找到的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
此为实验中的POC文档
基于上述构造的数据包Poc,可更换一个思路,将命令执行的结果写入log文件中,再调用Supervisord自带的readLog方法读取log文件,最终将结果显示出来。Poc代码如下图
漏洞形成条件:
Supervisord版本在受影响的范围内
RPC端口可被访问
RPC无密码或密码脆弱
默认安装的Supervisord,是只监听unix套接字的,所以外部IP无法访问,而且supervisord.sock
文件权限默认是0700
,其他用户是无法访问。但是如果开放了RPC端口,并且使用了默认密码或未设置密码,也是可以通过该漏洞进行利用的。对于一切漏洞我们都要做到防范于未然。
修复漏洞:
升级Supervisord
端口访问控制
设置复杂RPC密码