Linux の「L」はラテラルムーブメントの「L」
はじめに
脆弱性の悪用に依存しない ラテラルムーブメント(横方向の移動) の手法として、攻撃者が利用できる正当なプロトコルやツールがたくさん取り上げられます。たとえば、PsExec、RDP、SSH、WMI などです。これらのほとんどは通常、Windows マシンでのみ使用できます。しかし、Linux マシンに関して思い浮かぶプロトコルは、SSH だけです。このブログ記事では、ラテラルムーブメントの実行(または実行支援)に使用される可能性がある Linux の他のプロトコルについて考えます。
もちろん、Linux は OS ではなく、単なるカーネルです。そのため正確には Linux ベースのオペレーティングシステム、または Linux ディストリビューションについて考えると言うほうが正確です複数のディストリビューションですぐに動作する共通のサービスやプロトコルを見つけることは、事実上不可能です(すべてのディストリビューションで SSH がすぐにインストールされるわけではありません)。そこで、Linux ディストリビューションを問わず、最も重要なプロトコルとサービスに着目します。
このブログ記事は、Linux ハッキングのガイドではなく、ネットワークに影響を及ぼす可能性のある潜在的な脅威についてネットワーク防御者に情報を提供することを目的としています。
SSH 以外に何ができるのか?
この記事で取り上げるプロトコルのすべてではないとしても、そのほとんどはすぐには利用できません。ラテラルムーブメントを実行するためにはプロトコルを特定の方法で設定する必要があります。 私たちは、この記事で取り上げるプロトコルを悪用するためのガイドを提供するつもりはありません。
私たちが目指しているのは、設定によって脆弱なポイントが生まれる可能性があるプロトコルに対して認識を高められるようにすることです。それらのポイントとは、攻撃者によって悪用される可能性があるものです。ハッキングを成功させるべく執拗に取り組む攻撃者は、私たちが言わずとも、この記事で取り上げるプロトコルを見つけて悪用する可能性があります。ブルーチームはそれに備えておくべきです。
私たちは、防御者をさらに支援するために社内の Infection Monkey チームと共同で取り組みました。Infection Monkey は、ネットワークに対して多くの一般的なラテラルムーブメントやネットワーク伝播技術のテストを行う、オープンソースの自動侵害および攻撃プラットフォームです。
開発チームは Akamai の調査結果を活用し、それを新しい悪用技術としてツール内に組み込みました。 防御者は、この記事で取り上げるリモート実行技術の一部に関して、Infection Monkey を使用し、ネットワークに対してテストを行うことができます。
候補の選択
[注:このセクションでは、興味深いラテラルムーブメントのターゲットを見つけるために使用した方法について説明します。方法論にご興味がなく、すぐにアクションについて知りたい方は、このセクションをスキップし、「 コードの即時実行を可能にするプロトコル」のセクションへお進みください。]
私たちはラテラルムーブメント・プロトコルとサービスを探しているため、OS の側面とネットワークの側面の両方を考慮して、潜在的な候補を探すことができます。つまり、Linux マシンで最も一般的なプロセスを探すことも、最も一般的なリスニングポートを探すこともできます。1 つのプロトコルを優先してその他のプロトコルを無視するべきではありません。なぜなら、同じプロトコル(異なるプロセス名、同じポート)の異なる実装が存在する可能性や、複数のポートまたは変化するポート(RPC のエフェメラルポートなど)を使用する単一のプロセスが存在する可能性があるからです。
Linux マシンとの通信に使用されている上位ポートを見てみると、SSH(ポート 22)がリストの多くを占めていることがわかりましたが、他にも調査対象として有望な候補がありました。それは、 FTP (ポート 21)、 SNMP (ポート 161)、 Sun RPC (ポート 111)です。
また、SSH とは何の関係もないにもかかわらず、 sshd (SSH デーモンプロセス)で処理されたポートがいくつかあります。それらは SSH トンネルで使用されていると考えられるため、調査の対象外となります。
たとえば、Windows の RPC および WinRM でそれぞれ使用されるポート 135 と 5985 です。特に sshd がこれらのポートをリッスンしている場合、Linux マシンではこれらのポートは想定されません。内部マシンにアクセスできるようにするために、外部から使用できる Linux マシンで SSH トンネルが開かれた可能性が高いと考えられます。SSH トンネルはトラフィックを別の受信者にリダイレクトするだけなので、トンネルのホストへのラテラルムーブメントについて考える際には、あまり重要ではありません。
今回の調査結果の中には、検討すべき興味深いプロセスが 2 つあります。それは、 xinetd と rpcbindです。これらはほとんどの場合、通信やポートを他のプロセスにマッピングするためのルックアップ操作に使用され、多くの機能を備えていないため、ラテラルムーブメントのターゲットとしては機能しません。その代わり、他の興味深いサービスを見つけるために使用することができます。
xinetd (およびその前身である inetd)はデーモンの制御と管理に使用されます。管理するデーモンのデフォルトリストを見ると、 rexec、 rlogin および rshがあり、それらはすべて Berkeley r コマンド スイートに含まれています。また、さまざまな FTP デーモン、 VNC および Telnetもあります。
rpcbind は、Sun RPC の RPC ポートマッパープロセスです。RPC サーバーはポートマッパーに登録され、クライアントはポートマッパーに問い合わせてサーバーのエフェメラルポートを見つけることができます。MS-RPC とは異なり、Sun RPC はプログラム番号を使用して特定の RPC サーバーを識別します。そのプログラム番号は Internet Assigned Numbers Authority (IANA)に登録されています。登録されたプログラムを見ると、 rexec や NFSなどの興味深い名前が見受けられます。
コードの即時実行を可能にするプロトコル
SNMP
テストした Linux マシンの 24%
簡易ネットワーク管理プロトコル(SNMP)は、監視のために使用されます。マシンは、DP ポート 161 経由の接続をリッスンするデーモンプロセス(通常は snmpdと呼ばれる)を実行します。SNMP は通常、マシンパラメーターと統計情報の照会に使用されますが、このプロトコルを使用してリモートで一部のパラメーターや設定を指定することもできます。また、以前のバージョンの SNMP(v1 および v2)には暗号化や認証があまりなく、ネットワークトラフィックからの窃盗や総当たり攻撃で取得可能なパスワード(「コミュニティーストリング」と呼ばれる)があれば十分でした。
さらに、実際のところ、SNMP エージェントの古いバージョンにデフォルトでロードされていた EXTEND プラグインを使用すれば、SMNP を通じて リモートコマンドを実行 することができました。このオプションは、やや関連のある CVEの後、新しいバージョンの SNMP(v5.8 以降)で無効化されていますが、いまだに脆弱なバージョンの SNMP がインストールされている環境が存在しています。また、独自の SNMP エージェントを構築して、EXTEND プラグインを有効にすることもできます(図 1)。
SNMP の組み込み機能にかかわらず、これも 攻撃者のターゲットであり、ルーターや IoT デバイスの SNMP 実装の脆弱性を利用してネットワークに侵入する攻撃者もいます。SNMP の悪用は、サイバーセキュリティ & インフラストラクチャ・セキュリティ・エージェンシー(CISA)が プロトコルに関する勧告をリリースするまでになっています。
この脅威に対するテストを支援するために、Akamai は Infection Monkey チームと協力して、SNMP リモート EXTEND プラグイン用のエクスプロイトプラグインを開発しました。Infection Monkey を実行することで、環境内におけるこの攻撃の様子を確認し、攻撃をはねのけるのに十分なセキュリティ体制が整っていることを検証できます。SNMP 攻撃は Infection Monkey の最新バージョンである v2.2.1で可能です
リモート・デスクトップ・プロトコル
テストした Linux 環境の 10%
私たちは、Microsoft 独自のリモート・デスクトップ・プロトコルである RDP に限った話をしているのではありません(ただし、このプロトコルについても取り上げますので、ご心配なく)。Linux マシン上で実行できる他のリモート・デスクトップ・プロトコルもありますが、Windows 環境よりはあまり一般的ではありません。なぜなら、それらはグラフィカルデスクトップを共有することを目的としており、ほとんどの Linux サーバーはデスクトップ環境なしでインストールされるからです。
しかし、そのようなプロトコルがいくつかのネットワークで使用されていることがわかったため、リストアップし、ここで取り上げます。
X Window System は Unix 用のデスクトップ・ウィンドウ・システムであり、リモート接続をリッスンすることもできます。これには、TCP ポート 6000 以降が使用されます(ポート 6000 から始まりますが、それ以降、実行中のデスクトップサーバーごとにポート番号の数字が増えていきます)。
VNC は、Remote Framebuffer(RFB)プロトコルに基づいており、TCP ポート 5900 以降を使用します(X と同様に、実行中のデスクトップサーバーごとにポート番号の数字が増えていきます)。
xrdp は、Windows 以外のマシンで使用できる Microsoft RDP プロトコルの実装です。RDP の実装として、ポート 3389 を使用します。
リモート・デスクトップ・プロトコルの中には、他のプロトコルよりも安全性が高いものもありますが、どれも攻撃者によって 悪用される可能性があります 。Linux には複数のプロトコルが実装されているため、ここではプログラム名ではなくポート番号で記載しています。
Telnet
テストした Linux 環境の 4%
SSH や rloginと同様に、Telnet もリモートコンソールと制御のためのプロトコルです。これは rloginと同様、セキュリティが確保されておらず、暗号化されていないため、傍受やパケットスニッフィング攻撃に対して脆弱です。私たちが調査したネットワークのうち、このプロトコルが確認されたのは約 4% のみでしたが、いまだに使用されており、ネットワークに影響を及ぼす可能性があります。このプロトコルは TCP ポート 23 または 2323 を使用します。
Berkeley r コマンド
テストした Linux 環境の 1%
Berkeley r コマンドは、ネットワーク内の複数のマシン間でリモート操作を可能にする一連のプログラムです。当初は BSD の一部として開発されましたが、SSH にほぼ取って代わられました。その主な理由は、これらのプロトコルのセキュリティ上の懸念です(暗号化がなく、認証が最小限、または存在しない)。
しかし、このスイートのデーモンのいくつかがあちこちにあることが確認されたため、完全に除外するのは早計すぎます。私たちがスポットライトを当てたいデーモンは、次の 3 つです。
rexec — リモートコマンド実行を提供(TCP ポート 512 を使用)
rlogin — リモートログインとコンソールを提供(TCP ポート 513 を使用)
rsh — rexec と似ていますが、認証は不要(TCP ポート 514 を使用)
備忘録:ファイル転送を可能にするプロトコル
リモート制御や実行を直接許可していなくても、ターゲットマシンにファイルを転送する機能があるだけで攻撃の展開に役立つ場合があります。たとえば、Windows ベースではありますが、一般的なラテラルムーブメント技術(およびツール)である PsExec を見てみましょう。
まずサービスバイナリーを SMB 経由でターゲットマシンにコピーし、続いてサービスマネージャーとリモートで通信してサービスを実行するだけです。そのため、私たちは攻撃者のツールやバイナリーをターゲットマシンに配置するためのさまざまな方法をマッピングすることも重要だと考えています。また、ツール転送を悪用してリモート実行を実現するいくつかの方法についても理論化しましたので、この記事で 後ほど 説明します。
FTP
テストした Linux 環境の 31%
File Transfer Protocol(FTP)は、従来のプロトコルの 1 つです(ネットワークの授業で最初に教えられるアプリケーション層プロトコル)。ファイル転送に使用されるテキストベースのプロトコルであり、クリアテキストを使用するためセキュリティが確保されていません。
Samba
テストした Linux 環境の 20%
Samba は、Windows の相互運用性を支援する一連のプログラムです。SMB プロトコル(TCP ポート 445)を実装し、ファイルサーバーをホストまたは操作できます。また、Active Directory と統合したり、ドメインコントローラー自体として機能したりすることもできます(図 2)。
SMB 自体はデータ転送プロトコルにすぎませんが、Active Directory と統合できるため、RPC サーバーとクライアントの複数の実装が見られる場合があり、これによってラテラルムーブメントの潜在的なパスがたくさん生み出されます。
幸い、私たちの調査では、Samba をラテラルムーブメントに悪用する明確な方法は見つかりませんでした。Samba は動作を重視しているため、多くの不要な RPC ロジックや機能が実装されておらず、アタックサーフェスは制限されていました。また、ソースコードの至るところにあるさまざまなコメントからわかるとおり、コードのチェックも少なくなっています。
Samba Active Directory を使用している場合は、明らかなラテラルムーブメント・パスがない場合でも、レッドチームにドメインコントローラーのセキュリティを確認させることをお勧めします。
NFS
テストした Linux 環境の 18%
NFS(Network File System)は、ファイルサーバーを作成するもう 1 つの方法であり、Sun RPC(TCP ポート 111)を介して構築されます。私たちが調べることができる RPC 関数は数多くありますが、それによって即座にリモートコマンドを実行する方法は見つかりませんでした。
rsync
テストした Linux 環境の 16%
rsync は、ネットワーク内のマシン間でのファイル転送と同期を行うためのユーティリティです。サービスまたはデーモンとして実行でき、専用プロトコル(TCP ポート 873)、 rsh 、 SSHを通じてファイルを転送できます。
ファイル転送によるリモート実行
私たちはあらゆるファイル転送について議論することはできますが、転送されたファイルを攻撃者が何らかの方法で実行できなければ、その議論にはあまり価値はありません。私たちは、ファイルを実行するようにユーザーを誘導する以外に、2 つの実行オプションを検討しました。そのどちらのオプションでも、何らかの設定ミスがあること、またはセキュリティ設定が(非常に)ゆるくなっていることが必要です。
リモート持続性
Linux ファイルシステムには持続性の足がかりをインストールするために使用できる正当な場所が多数ありますが、ラテラルムーブメントに関しては /etc/cron.hourly に着目しました。攻撃者が実行権限を持つファイルをそこにアップロードできる場合、次のラウンド時間でそれが実行され、単にそれだけで、その後、長期的なラテラルムーブメントを行えるようになります。
しかし、これを行うには sudo または root 権限が必要であり、これは簡単なことではありません。残念なことに、ファイルサーバーを安全でない方法で設定することでこのようなシナリオが可能になります(たとえば、 rsyncを参照)。セキュリティが十分に確保されていないサービスを設定する人がいるのはなぜでしょうか?それは、そのほうが便利で、簡単になるからです。皆さんはそのような人にはならず、防御対策を講じてください。
Web シェル
より妥当なシナリオは、/etc へのアクセスではなく、アクティブな Web サーバーの Web ルートフォルダへのリモートアクセスです。その場合、カスタム Web シェルをアップロードし、それを利用してリモートコマンドを実行することができます。オンラインには Web シェルの例 がたくさんあるため、攻撃者が作成する必要さえありません。
コンテナに穴があいていてはいけない
破壊される前に防御対策を講じる
ここまで、攻撃者がマシンに侵入する潜在的な方法について説明してきました。続いて、それらを阻止する方法について説明します。
可視性
すでに述べたとおり、ここで説明したプロトコルはどれもすぐには Linux にインストールされず、設定されません。誰かが明確にプロトコルをインストールする必要があります。そのため、最初にすべきことは、ネットワークで実行しているものと通信しているもの(または通信をリッスンしているもの)をよく把握することです。孫子は「彼を知り己を知れば百戦あやうからず」と述べています。
設定
ネットワークのインベントリを作成し、ここで説明したサービスのいずれかを特定したら、次はそれらのサービスの設定を確認します。たとえば、Kerberos 認証の SNMPv3 を使用するように設定された最新の SNMP エージェントは、全く問題ありません。SNMPv2 で、簡単に推測できるコミュニティーストリングを使用するのはどうでしょうか?あまり良くはありません。
曖昧さに対するセキュリティ
他のプロトコルやサービスはおそらく、r コマンドスイートや Telnet ではなく SSH を使用するなど、より新しくて安全なプロトコルに置き換えることができます。また、FTP や rsync などの一部のプロトコルは SSH を介してカプセル化することができ、これによって SSH による暗号化の恩恵が得られます。そして、言うまでもなく、PKI または簡単に破れない強力なパスワードを使用して SSH が正しく設定されていることを確認する必要があります。
セグメンテーション
すべての通信のセキュリティが確保されていても、すべての人がすべてのものにアクセスできてよいわけではありません。フラットネットワークでは攻撃者が簡単に伝播させることができますが、 セグメント化されたネットワーク ではハードルがはるかに高くなります(図 3)。
ネットワークに入るたびに複雑な手順を踏み、多くのリソースを消費する必要がある場合、費用対効果が高くないため、攻撃者は攻撃を断念する可能性があります。さらに、攻撃者がネットワーク内で実行する必要のあるアクションが増えるほど、侵害を検知してアラームが作動する機会が増えます。その後、インシデント対応手順を開始して、攻撃者を追い払い、侵害を阻止することができます。
まとめ
このブログ記事では、攻撃者がネットワークを横方向に移動しようとする際に利用できる、Linux マシンに共通のプロトコルやプログラムをいくつか取り上げました。この記事はブルーチーム向けであるため、具体的な例は挙げないようにしました。これらのプロトコルについての認識を高め、ネットワークの弱点を露出したままにしないようにしていただきたいと思います。
緩和や保護に関しては、この記事で取り上げた安全なバージョンのプロトコル(FTP ではなく SNMPv3、SFTP など)を使用することをお勧めします。また、可能な場合は、ネットワークセグメンテーション戦略を実行するとよいでしょう。
ここで説明したほとんどのプロトコルには、通常、クライアントまたはサーバープロセスの小さなサブセットと、固有のポート番号または範囲があります。そのため、ネットワークアクセスを必要とするサーバーのサブセットに対して特定のポートやプロセスをブロックすることで、通常のネットワーク運用に大きな影響を与えることなく、ネットワークアクセスを制限することができます。