记录我的一些生活写照、无聊的牢骚、内心世界的活动 注册 | 登陆

爱快软路由的深入研究(Docker)

爱快软路由的深入研究(Docker)

Ikuai Docker特权容器,macvlan配置  
此操作依赖ikuai的docker漏洞
1. 创建一个Docker(shinsenter/s6-ubuntu:20.04),把docker.sock挂载进去
容器列表--添加--高级设置--挂载目录  添加以下两个路径
原路径                                            目标路径
/../../var/run/docker.sock               /var/run/docker.sock
/../../                                                /host
其他设置按照正常操作来,创建一个Ubuntu或者Debian容器即可。以下以 ubuntu:20.04 为例操作。
解释:
第一行docker.sock是映射到容器中,从而使创建的容器和爱快的Docker有一样的权限
第二行是把主机根目录映射到容器的 /host 目录中,从而实现对爱快主机文件的查看和修改(修改后重启爱快失效,无法保存)
2.在容器中安装Docker
快捷安装:
apt update && apt-get install -y docker.io
安装完成后,即可使用爱快主机Docker的所有权限了。
因为docker.sock已经挂载,所以安装的Portainer已经可以管理爱快的所有容器,而不是仅能管理自己。
3. 创建使用host网络和特权的容器,为了方便顺带把磁盘也挂载了,选择shinsenter/s6-ubuntu:20.04镜像是该镜像可以方便的做服务
docker run -itd --name s6 --network=host --privileged -v /etc/disk:/etc/disk -v /etc/disk_user/:/etc/disk_user/ -v /var/run/docker.sock:/var/run/docker.sock --restart=always shinsenter/s6-ubuntu:20.04 /init
4. macvlan配置
先安装iproute2,docker
docker exec -it s6 bash
apt update && apt-get install -y docker.io iproute2
docker 创建macvlan网络
docker network create -d macvlan --subnet=192.168.9.0/24 --gateway=192.168.9.1 -o parent=lan1 macnet
ip link add macvlan1 link lan1 type macvlan mode bridge
ip addr add 192.168.9.1 dev macvlan1
ip link set macvlan1 up
ip route add 192.168.9.100 dev macvlan1
注意:新版爱快默认Lan IP为192.168.9.1,故设置192.168.9.X,如果你修改了根据Lan的IP自行修改IP地址。
创建一个macvlan的虚拟网卡并配置ip,将想要创建的docker的ip路由到虚拟网卡上
192.168.9.100这个是新创建的容器ip,让他可以联网。
解释:如果命令改成下面的
ip route add 192.168.9.0/25 dev macvlan1
则192.168.9.2-192.168.9.127这个IP范围的容器都可以默认上网。
192.168.9.0/24的macvlan1回车默认lan1冲突,故不能设置,如果lan1的子网大,不冲突,那么macvlan1的也可以增大
总之哪个ip在route里面就可以直接联网,否则没有网络。
5.创建docker 容器测试联网
开机配置macvlan,此时就需要用到s6镜像的init功能了,在host网络且有特权的容器创建脚本将macvlan的配置写进去
由于创建容器设置了restart=always,顾会开机执行,达到自动配置的效果,至此macvlan配置以完成。
开机启动脚本
/etc/cont-init.d/001-set-macvlan.sh
chmod +x /etc/cont-init.d/001-set-macvlan.sh
脚本如下:
XML/HTML代码
  1. #!/bin/bash
  2. ip link add macvlan1 link lan1 type macvlan mode bridge
  3. ip addr add 192.168.9.1 dev macvlan1
  4. ip link set macvlan1 up
  5. ip route add 192.168.9.100 dev macvlan1
也可以命令直接写入
XML/HTML代码
  1. echo '#!/bin/bash' > /etc/cont-init.d/001-set-macvlan.sh
  2. echo 'ip link add macvlan1 link lan1 type macvlan mode bridge' >> /etc/cont-init.d/001-set-macvlan.sh
  3. echo 'ip addr add 192.168.9.1 dev macvlan1' >> /etc/cont-init.d/001-set-macvlan.sh
  4. echo 'ip link set macvlan1 up' >> /etc/cont-init.d/001-set-macvlan.sh
  5. echo 'ip route add 192.168.9.100 dev macvlan1' >> /etc/cont-init.d/001-set-macvlan.sh
  6. chmod +x /etc/cont-init.d/001-set-macvlan.sh
然后重启爱快时候S6这个特权容器也跟着重启,然后开机自动启动上面的脚本,自己添加静态路由,就可以使其他容器都可以通过macvlan上网。
docker run -d --restart=always --name="portainer" --net=host -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce
不用映射直接使用路由的wan或者lan的ip端口9000直接访问。(在s6这个容器中启动)
简单分析:
通过爱快主机 /../../var/run/docker.sock 映射到容器ubuntu的 /var/run/docker.sock 中,从而使容器获取到了docker的完全管理权限,通过ubuntu建立的容器才有特权,可以直接读写物理机的文件,也可以创建host网络。但是ubuntu这个容器本身没有host网络,是在爱快中建立的网络,所有它本身不能控制爱快的docker网络设置,只能通过他建立一个s6的特权容器,使用host网络和docker.sock,s6就具有容器的最高完全权限,比如创建macvlan,桥接,自己建立静态路由使其他容器可以上网,也可以直接读取爱快系统的全部文件。
爱快 /etc/disk  /etc/disk_user 为数据分区挂载路径。  /etc/mnt 是挂载的配置文件保存分区。
简化版:
跳板:
使用向导建立容器Alpine,体积小,速度快,仅仅是利用docker.sock文件权限获取Docker权限
容器名称 Alpine
镜像 alpine:latest  7.43 MB使用它作为跳板,体积小速度快可以用完就删了
内存 64m或者128m都可以
网络接口使用自己建立的那个
IP随意或者不填
高级设置-挂载目录:(必填)
/../../var/run/docker.sock               /var/run/docker.sock
启动后进入控制台输入以下命令,建立特权容器:
XML/HTML代码
  1. apk add docker
  2. docker run -itd --name s6 --network=host --privileged -v /etc/disk:/etc/disk -v /etc/disk_user/:/etc/disk_user/ -v /var/run/docker.sock:/var/run/docker.sock --restart=always shinsenter/s6-ubuntu:20.04 /init
Alpine的跳板任务完成,可以删除。
中转:
Web找到s6这个特权容器,通过控制台输入以下命令:
XML/HTML代码
  1. apt update && apt-get install -y docker.io iproute2 net-tools
假设爱快Lan口的IP为192.168.0.1,建立的容器IP为192.168.0.100,使此容器可以正常上网。
XML/HTML代码
  1. docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=lan1 macnet
  2. ip link add macvlan1 link lan1 type macvlan mode bridge
  3. ip addr add 192.168.0.1 dev macvlan1
  4. ip link set macvlan1 up
  5. ip route add 192.168.0.100 dev macvlan1
设置开机启动脚本(实现爱快重启macvlan不丢失配置):
XML/HTML代码
  1. echo '#!/bin/bash' > /etc/cont-init.d/001-set-macvlan.sh
  2. echo 'ip link add macvlan1 link lan1 type macvlan mode bridge' >> /etc/cont-init.d/001-set-macvlan.sh
  3. echo 'ip addr add 192.168.0.1 dev macvlan1' >> /etc/cont-init.d/001-set-macvlan.sh
  4. echo 'ip link set macvlan1 up' >> /etc/cont-init.d/001-set-macvlan.sh
  5. echo 'ip route add 192.168.0.100 dev macvlan1' >> /etc/cont-init.d/001-set-macvlan.sh
  6. chmod +x /etc/cont-init.d/001-set-macvlan.sh
其他:
在s6的容器中创建portainer
使用http://192.168.0.1:9000登录
XML/HTML代码
  1. docker run -d --restart=always --name="portainer" --net=host -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce
使用http://192.168.0.100:9000登录
XML/HTML代码
  1. docker run -d --restart=always --name="portainer" --net=macnet --ip 192.168.0.100 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce
至此,关于爱快的Docker研究彻底完成,利用docekr.sock文件路径漏洞得到访问权限,从而进一步得到Docker的全部权限,包括网络和文件的全部权限,实现了macvlan,是容器可以和lan在一个ip段,也可以访问硬盘的数据存储分区权限,可以保存文件。
参考1  参考2

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):