Abusing Docker Socket for Privilege Escalation
Dockerソケットにアクセスできる場合があり、それを使用して権限を昇格したいと思うことがあります。いくつかのアクションは非常に怪しいかもしれませんので、避けたいと思うかもしれません。ここでは、権限を昇格するために役立つさまざまなフラグを見つけることができます:
マウントを介して
rootとして実行されているコンテナ内でファイルシステムの異なる部分をマウントし、それらにアクセスすることができます。 また、コンテナ内で権限を昇格するためにマウントを悪用することもできます。
-v /:/host
-> ホストファイルシステムをコンテナにマウントして、ホストファイルシステムを読むことができます。コンテナにいながらホストにいるように感じたい場合は、以下のようなフラグを使用して他の防御メカニズムを無効にすることができます:
--privileged
--cap-add=ALL
--security-opt apparmor=unconfined
--security-opt seccomp=unconfined
-security-opt label:disable
--pid=host
--userns=host
--uts=host
--cgroupns=host
**
--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined
** -> これは前述の方法と似ていますが、ここではデバイスディスクをマウントしています。その後、コンテナ内でmount /dev/sda1 /mnt
を実行し、/mnt
でホストファイルシステムにアクセスできます。マウントする
</dev/sda1>
デバイスを見つけるためにホストでfdisk -l
を実行します。-v /tmp:/host
-> 何らかの理由でホストのディレクトリをマウントすることしかできない場合、それをマウントして、マウントされたディレクトリにsuidを持つ/bin/bash
を作成し、ホストから実行してrootに昇格します。
/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ビットをサポートしていません。
また、/etc
や他の設定ファイルを含むフォルダをマウントできる場合、dockerコンテナ内でrootとしてそれらを変更し、ホストで悪用して権限を昇格することができます(例えば/etc/shadow
を変更することによって)
コンテナからの脱出
--privileged
-> このフラグを使用すると、コンテナからすべての隔離を取り除くことができます。rootとして特権コンテナから脱出するテクニックを確認してください。--cap-add=<CAPABILITY/ALL> [--security-opt apparmor=unconfined] [--security-opt seccomp=unconfined] [-security-opt label:disable]
-> 機能を悪用して権限を昇格するために、その機能をコンテナに付与し、エクスプロイトが機能するのを防ぐ可能性のある他の保護方法を無効にします。
Curl
このページでは、dockerフラグを使用して権限を昇格する方法について議論しました。curlコマンドを使用してこれらの方法を悪用する方法については、以下のページで見つけることができます:
pageAuthZ& AuthN - Docker Access Authorization PluginLast updated