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)は、監視のために使用されます。マシンは、UDPポート161経由の接続をリッスンするデーモンプロセス(通常はsnmpdと呼ばれる)を実行します。SNMPは通常、マシンパラメーターと統計情報の照会に使用されますが、このプロトコルを使用してリモートで一部のパラメーターや設定を指定することもできます。また、以前のバージョンのSNMP(v1およびv2)には暗号化や認証があまりなく、ネットワークトラフィックからの盗聴や総当たり攻撃で取得可能なパスワード(「コミュニティーストリング」と呼ばれる)があれば十分でした。
さらに、実際のところ、SNMPエージェントの古いバージョンにデフォルトでロードされていたEXTENDプラグインを使用すれば、SNMPを通じてリモートコマンドを実行することができました。このオプションは、やや関連のある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を使用している場合は、明らかなラテラルムーブメント・パスがない場合でも、レッドチームにドメインコントローラーのセキュリティを確認させることをお勧めします。
図2:SambaのソースコードのTODOコメント
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)。
ネットワークに入るたびに複雑な手順を踏み、多くのリソースを消費する必要がある場合、費用対効果が高くないため、攻撃者は攻撃を断念する可能性があります。さらに、攻撃者がネットワーク内で実行する必要のあるアクションが増えるほど、侵害を検知してアラームが作動する機会が増えます。その後、インシデント対応手順を開始して、攻撃者を追い払い、侵害を阻止することができます。
図3:侵害緩和戦略としてのセグメンテーション。左:セグメンテーションなし、右:セグメンテーションあり。
まとめ
このブログ記事では、攻撃者がネットワークを横方向に移動しようとする際に利用できる、Linuxマシンに共通のプロトコルやプログラムをいくつか取り上げました。この記事はブルーチーム向けであるため、具体的な例は挙げないようにしました。これらのプロトコルについての認識を高め、ネットワークの弱点を露出したままにしないようにしていただきたいと思います。
緩和や保護に関しては、この記事で取り上げた安全なバージョンのプロトコル(FTPではなくSNMPv3、SFTPなど)を使用することをお勧めします。また、可能な場合は、ネットワークセグメンテーション戦略を実行するとよいでしょう。
ここで説明したほとんどのプロトコルには、通常、クライアントまたはサーバープロセスの小さなサブセットと、固有のポート番号または範囲があります。そのため、ネットワークアクセスを必要とするサーバーのサブセットに対して特定のポートやプロセスをブロックすることで、通常のネットワーク運用に大きな影響を与えることなく、ネットワークアクセスを制限することができます。