目标网站:www.xxbet2024.com
(记住首页这个着装酷似中国电信的女客服网图,后面要考)
现在拿到的信息只有一个www门户的主站,这种就是平时各位看小电影的时候满屏幕飞的那种网址。前端基本上都是静态的美术资源,一个注册接口,一个APP的下载链接,没有其他什么交互的地方,遇到主站就不要干拉了,除非运气特别好能特中间件的nday其他时候基本上是找不到洞的。做一下信息搜集。
子域名admin.xxbo2025.com
扫描端口,开放端口8080(Tomcat AJP 协议)、9000(JMX 监控),没有开放其他的敏感端口。查询IP信息是境外IDC的云服务器,旁站的思路也不现实。并且光是拿到这个官网页面的服务器权限没啥用,如何突破到博彩厂家的生产环境呢?他的用户管理流水记录这些在哪。
老办法把网页上的博彩APP客户端下载下来,交给模拟器抓包分析相关的URL,对APP进行一顿拷打过后发现某关键业务服务器,用户数据交互和竞猜请求都是他在处理
HTTP Header:Server: Apache-Coyote/1.1(Tomcat 容器)
Cookie:JSESSIONID=xxxx(Java Web 应用)
试了一下历史漏洞,Apache Tomcat session反序列化(CVE-2020-9484),没有。
找到用户上传交易凭证的地方有个/upload接口,尝试文件上传,但是过滤很严谨
继续发现新的API 接口:xxxx/api/v1/transaction 接收 Base64 编码的请求参数,Burp抓包分析:
POST xxxxxx/api/v1/transaction HTTP/1.1
Content-Type: application/octet-stream
rO0ABXNyABFqYXZhLxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(省略很长一串)4cHcBAHh4
注意到请求体以的rO0开头,这是Java序列化的标志,rO0是Java序列化魔术头AC ED 00 05的 Base64 编码。改一下字段重发请求服务器返回500 Internal Server Error并且报java.io.InvalidClassException也证明了这里有反序列化过程。
通过互联侧查找这个xxxx/api/v1/transaction的接口想找到源码,找到好几套类似的但是其实都不是。这个时候我想起了开头说过的网站首页那个女客服的图片,感觉这图挺抽象的像是那种博彩源码自带的默认图片
求助TG神秘包网高手,根据几个关键的接口名和前端资源最终拿到了这套几年前的源码,很大一套,包括了官网、游戏接口、客服系统等等。这种代码量大的源码反而更容易出洞,即使是酷酷包网写多了人也总会发病的时候
关键代码定位:
反序列化入口:com.xxxxx.util.SerializationUtils#deserialize
publicstaticObjectdeserialize(byte[] data) {
try (ObjectInputStream ois = newObjectInputStream(newByteArrayInputStream(data))) {
return ois.readObject(); // 没做任何过滤
} catch (Exception e) {
throw new RuntimeException("Deserialization failed", e);
}
}
调用链:TransactionController#processRequest
("/xxxxxxxx")
publicResponseEntity<?> processTransaction( byte[] requestData) {
Object transaction = SerializationUtils.deserialize(requestData); // 直接反序列化用户输入
xxxxxx(后续业务逻辑代码)
}
就这么简单,最常规的Java反序列化,pom.xml检测依赖库包含commons-collections 3.2.1(存在已知 Gadget链子)
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
Gadget Chain 构造:
AnnotationInvocationHandler.readObject()
-> memberValues.entrySet().iterator()
-> LazyMap.get()
-> ChainedTransformer.transform()
-> InvokerTransformer.transform()
-> Runtime.exec()
链子也有了剩下就是ysoserial一把梭生成恶意序列化数据,然后发包
居然还是root,有点幽默了
甚至这套源码里另外一个接口存在和这个基本上完全一样的反序列化,有观众可能会问了,博彩生产环境就这么好打吗,包网商能有这么唐吗怎么漏洞如此简单,还真就这么简单(毕竟大部分打了半天没打穿的内容也不会出现到公众号上)本来这篇文章最开始想发在刘农TV板块的,后面想想还是算了,要是让我写几十万行代码我写到后面估计也跟余胜军附体了一样,人不是AI不可能每次反序列化都记得检查外部输入的。
拿到RCE过后还没完,服务器权限没用,要这个网站的用户数据和后台管理员密码。网站数据库配置是用的JDBC,好吧写个shell去扒拉tomcat的context.xml和web.xml文件找数据库账号密码
然后发现对面特么的拔线了
全剧终
原文始发于微信公众号(黄豆安全实验室):(水)打穿博彩后偶遇高手运维,拼尽全力也无法战胜
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论