2024年セキュリティの現状:競争が激化するAIの活用
先進的なサイバーセキュリティ対策を推進する組織がどのように課題を克服し、AIを活用してイノベーションを推進し、デジタルレジリエンスを強化しているかをご確認ください。
組織では、システムを社内ネットワークでつないで情報を保存、共有、管理しています。このようなエコシステムでは、組織内のさまざまなタイプのデータをやり取りするためのリポジトリとして、ネットワークファイル共有がよく使われます。しかし、権限が大きすぎたり、アクセスが適切に制限されていないなど、権限の問題で機密データをうっかりこれらのネットワーク共有に保存してしまうことが少なくありません。クラウドコンピューティングでファイル共有のための安全な方法が提供されているにもかかわらず、今でも多くの組織が従来のSMB (Server Message Block)ネットワーク共有に頼っているため、ネットワーク共有が廃れることは当分なさそうです。
レッドチームや攻撃者は、標的のネットワークに侵入し、権限の低いユーザーとして足場を固めた後、組織内のデータを探るために、ネットワーク共有検出のテクニック(T1135)をよく使用します。ファイル共有に放置されたシステム管理用のスクリプト、設定ファイル、バックアップ、その他の機密ファイルは、攻撃者にとって、権限を昇格するための有益な情報源です。これは、脅威グループのLapsus$によって2022年に使われた手口です。ネットワーク共有にある機密情報は脅迫にも使われます。攻撃者は組織に身代金の支払いを要求し、応じなければ機密情報を暴露すると脅します。
昨年、The DFIR Reportのチームが、複数の脅威を検出する方法について洞察に富んだブログ記事を公開しました。この記事では、脅威の検出を補完する手段として、ネットワーク共有の挙動をSplunkでプロアクティブに見つけ出すためのハンティングクエリーが紹介されています。このクエリーに加えて、Splunk脅威調査チーム(STRT)も、このテクニックについて詳しく理解することを目的とした新しいシミュレーションツールをリリースしました。
このテクニックのシミュレーションとハンティングクエリーの実行の様子を紹介する以下のビデオをぜひご覧ください。
IceID、Emotet、BumbleBeeマルウェアファミリーを使用する攻撃者や、UNC961、Conti、Mazeなど、さまざまな攻撃者が戦術としてネットワーク共有検出を取り入れているため、このテクニックに重要な攻撃ベクトルとして十分に注意する必要があります。異常なアクセスパターンや、ファイル共有アクティビティの異常な変化を検知することは、それに続く攻撃を阻止するための重要な機会のひとつと言えます。このブログで紹介するリソースを活用すれば、Windows Active Directoryネットワークを想定してシミュレートし、プロアクティブにハンティングできます。
効果的な脅威検出戦略を立てるために、私たちはまず、ラボ環境でこのテクニックをシミュレートしました。これによって挙動を観察し、生成されるテレメトリを収集して分析できます。数千のホストが接続するエンタープライズネットワークでは、攻撃者は検出プロセスを自動化せざるを得ません。The DFIR Reportのチームが指摘しているように、攻撃者はこのテクニックを実行するために、Invoke-ShareFinderと呼ばれるツールをよく使用します。しかし、別のツールを使用したり、独自のツールを開発したりする可能性も当然あります。
そこで私たちは、特定のツールに頼らず、カスタムコードを使って一般的な挙動をシミュレートすることにしました。これによってツールの特性に制限されることなくこのテクニックの基本的な仕組みを調査して理解できます。
SharpShareFinderは、Windows Active Directoryネットワークを対象としたネットワーク共有検出ツールで、最小限の機能のみを備えています。このツールはC#で作成されており、3つのステップによるプロセスを実行して目標を達成します。まず、NetApi32.dllによってエクスポートされるDsGetDcName関数を使って、ドメインコントローラー(DC)を特定します。次に、このDCを使って、LDAP (Lightweight Directory Access Protocol)でドメインに参加しているすべてのコンピューターを列挙します。このステップの実行には、Wldap32.dllによってエクスポートされるldap_initやldap_search_stなどの関数を使用します。
最後に、特定した各ホストで利用できるすべてのネットワーク共有を列挙し、出力します。その実行にもNetapi32.dllからエクスポートされるNetShareEnum API関数を使用します。この方法は、Invoke-ShareFinderなどの他のツールでも利用されています。
SharpShareFinderは、Windowsネイティブの関数やシステムDLLのみを使用することで、「すでにあるシステムリソースを利用する」という攻撃戦術をエミュレートします。現在のバージョンでは、特定したすべてのホスト上の共有を連続して列挙するという、直接的で大雑把なアプローチを採用しています。この「荒っぽい」挙動は、大胆な行動を取る攻撃者をシミュレートして検出することを想定して設計されています。SharpShareFinderでは、このような単純なアプローチによって実際の攻撃を模倣するだけでなく、今後のバージョンでステルス性の高い攻撃テクニックをシミュレートするための機能も組み込む予定です。
ネットワーク共有検出テクニックの調査に使用する小規模企業の環境を再現するために、私たちはSplunk Attack Rangeを使ってActive Directory (AD)ラボ環境を構築しました。この環境では、20のエンドポイントがドメインに参加し、それぞれWindows Server 2019、Windows Server 2022、Splunkサーバー、またはKali Linuxを実行しています。また、Splunk Attack Rangeを使ってすべてのエンドポイントにSplunkユニバーサルフォワーダーをインストールし、設定します。この環境で「セキュリティの甘い」ネットワーク共有を再現するために、CreateSharesOnDomainComputers.ps1という短いスクリプトを作成しました。このスクリプトは、PowerShellのリモート処理とNew-SmbShareコマンドレットを使って、ドメイン全体で利用できる共有フォルダを作成します。
このセクションでは、ネットワーク共有検出テクニックに関連する可能性のある挙動をSplunkで特定するためのハンティングクエリーをご紹介します。このクエリーは、ラボ環境でのシミュレーションと分析に基づいて開発されたため、妥当性と効果は保証されています。必要に応じた脅威ハンティングと継続的なセキュリティ監視のどちらでも使用できます。
このセクションで説明する手法を効果的に利用するには、特定のログ要件を満たす必要があります。ハンティングの際に、ドメインコントローラーとドメインに参加するエンドポイントに、以下のセキュリティ監査ポリシーのサブカテゴリを適用する必要があります。
このブログ記事で紹介するハンティング分析では、2つの強力なSplunkコマンド、statsとbucket (またはbin)を使用します。statsコマンドを使用すると、イベントに関するさまざまな統計を計算して、パターンや異常に関するインサイトを獲得できます。一方、bucketコマンドでは、データをさまざまな時間単位または間隔に分割して、特定の期間内のイベントを詳細に分析できます。
他のハンティングと同様に、ここで紹介する分析は、組織の環境の詳細情報を入手し、それを経時的に理解するために役立ちます。初期のイテレーションでは主に、予想される動作を確認します。たとえば、システム管理者が複数のサーバーにアクセスすることや、脆弱性スキャナーで週1回スキャンが実行されることなどを把握します。その後、データを分析し、既知のホストやユーザーを許可リストに追加しながら、予期しない動作や不審な挙動を重点的に識別していきます。
Active Directoryネットワークでは、サービスを利用するときに、Kerberosチケットのリクエストが必ず発生します。ネットワーク共有を列挙するときも例外ではありません。このテクニックをシミュレートしているときに、私たちは、攻撃者であるユーザーがServiceNameフィールドにターゲットコンピューターの名前を指定してKerberosサービスチケットをリクエストしていることを確認しました。このリクエストは、イベントコード4769として記録されます。さらに、このイベントのTargetUserNameフィールドとIpAddressフィールドを調べることで、ソースコンピューターを特定し、検出が実行されていることを確認できました。
攻撃者が大規模ネットワークでネットワーク共有の一覧を列挙するときは、短時間のうちに何度もKerberosチケットをリクエストすることになります。ユーザーがターゲットエンドポイントを変えながら大量のコンピューターサービスチケットをリクエストする状況を追跡すれば、不審なアクティビティの特定に役立つはずです。
Splunkのクエリー言語を活用することで、この挙動を見つけ出して表に出力できます。
index=win EventCode=4769 ServiceName="*$" TargetUserName!="*$" | bucket span=5m _time | stats dc(ServiceName) AS unique_targets values(ServiceName) as host_targets by _time, EventCode, IpAddress, TargetUserName
上記のクエリーでは、チケットに指定されているターゲットコンピューターの数(重複を含まない数)に基づいて異常な挙動を特定しています。このクエリーを少し変えれば、標準偏差と3シグマのルールなどの統計手法を使って外れ値を検出することもできます。
index=win EventCode=4769 ServiceName="*$" TargetUserName!="*$" | bucket span=5m _time | stats dc(ServiceName) AS unique_targets values(ServiceName) as host_targets by _time, EventCode, IpAddress, TargetUserName | eventstats avg(unique_targets) as comp_avg , stdev(unique_targets) as comp_std by IpAddress, TargetUserName | eval upperBound=(comp_avg+comp_std*3) | eval isOutlier=if(unique_targets >5 and unique_targets >= upperBound, 1, 0)
標的のドメインで利用できるすべての共有を列挙するには、SMBプロトコルを使ってNetShareEnum API関数でリモートのエンドポイントに対する認証を実行します。この認証に成功すると、各ターゲットエンドポイントで4624イベントが生成されます。すべてのWindowsコンピューターの認証イベントを取得していれば、この動作をハンティングに利用できます。4624イベントにもTargetUserNameフィールドとIpAddressフィールドが含まれるため、短時間のうちに大量のホストに認証されたソースを特定できます。
index=win EventCode=4624 LogonType=3 TargetUserName!="ANONYMOUS LOGON" TargetUserName!="*$" | bucket span=5m _time | stats dc(Computer) AS unique_targets values(Computer) as host_targets by _time, EventCode, IpAddress, TargetUserName
この場合も、クエリーを少し変えるだけで、標準偏差などの統計手法を使って外れ値を検出できます。
index=win EventCode=4624 LogonType=3 TargetUserName!="ANONYMOUS LOGON" TargetUserName!="*$" | bucket span=5m _time | stats dc(Computer) AS unique_targets values(Computer) as host_targets by _time, EventCode, IpAddress, TargetUserName | eventstats avg(unique_targets) as comp_avg , stdev(unique_targets) as comp_std by IpAddress, TargetUserName | eval upperBound=(comp_avg+comp_std*3) | eval isOutlier=if(unique_targets >5 and unique_targets >= upperBound, 1, 0)
このテクニックのテストと実行を通じて、私たちは、NetShareEnum APIが実際にMSRPC (Microsoft Remote Procedure Call)サービスを使ってNetShareEnumAll関数を呼び出し、共有を列挙していることを発見しました。この動作では、SMBプロトコルの通信で名前付きパイプが使われます。具体的には、下の図の例に示すように、クライアントとサーバー間の通信チャネルとして「srvsvc」という名前のパイプが使われます。
ネットワークから名前付きパイプに接続するには、IPC$管理共有を経由する必要があるため、特定のソースコンピューターが短時間のうちに複数のホストのIPC$共有にアクセスしていれば、攻撃者がNetShareEnum APIを利用して共有を列挙している可能性があると判断できます。この挙動を検出するには、イベントID 5140または5145を調べます。これらのイベントにもIpAddressフィールドとSubjectUserNameフィールドが含まれるため、次の例のように、列挙したソースを特定できます。
index=win EventCode=5140 OR EventCode=5145 ShareName="\\\\*\\IPC$" | bucket span=5m _time | stats dc(Computer) AS unique_targets values(Computer) as host_targets values(ShareName) as shares by _time, EventCode, IpAddress, SubjectUserName
前述のクエリーと同様に、ここでも標準偏差などの統計手法を使って外れ値を検出できます。
index=win EventCode=5140 OR EventCode=5145 ShareName="\\\\*\\IPC$" | bucket span=5m _time | stats dc(Computer) AS unique_targets values(Computer) as host_targets values(ShareName) as shares by _time, EventCode, IpAddress, SubjectUserName | eventstats avg(unique_targets) as comp_avg , stdev(unique_targets) as comp_std by IpAddress, SubjectUserName | eval upperBound=(comp_avg+comp_std*3) | eval isOutlier=if(unique_targets >5 and unique_targets >= upperBound, 1, 0)
リモートホスト上の共有を列挙するときは、前述のとおり認証が必須です。Windowsでは、ユーザーが高い権限でログオンすると、特別なアクセスを示すイベントID 4672が記録されます。攻撃者は、機密データを探すために権限を昇格することがよくあります。このイベントは、攻撃者が特権アクセスを取得した後でネットワーク共有を列挙した証拠となり得る重要な情報です。このシナリオでは、短時間のうちに異なるホストで複数の4672イベントが生成されます。このパターンを探せば、攻撃の検出に役立ちます。
4672イベントはローカルに記録されるため、攻撃に使われるソースコンピューターのIPアドレスは特定できません。ただし、イベントのSubjectUserNameフィールドに記録されるユーザー名を使えばソースを判別できます。
index=win EventCode=4672 AND NOT(SubjectUserName IN ("DWM-1","DWM-2","DWM-3","LOCAL SERVICE","NETWORK SERVICE","SYSTEM","*$")) | bucket span=5m _time | stats dc(Computer) AS unique_targets values(Computer) as host_targets values(PrivilegeList) as privileges by _time, EventCode, SubjectUserName
ここでも標準偏差を使って外れ値を検出できます。
index=win EventCode=4672 AND NOT(SubjectUserName IN ("DWM-1","DWM-2","DWM-3","LOCAL SERVICE","NETWORK SERVICE","SYSTEM","*$")) | bucket span=5m _time | stats dc(Computer) AS unique_targets values(Computer) as host_targets values(PrivilegeList) as privileges by _time, EventCode, SubjectUserName | eventstats avg(unique_targets) as comp_avg , stdev(unique_targets) as comp_std by SubjectUserName | eval upperBound=(comp_avg+comp_std*3) | eval isOutlier=if(unique_targets >5 and unique_targets >= upperBound, 1, 0)
サイバーセキュリティの状況が複雑さを増す今日、ネットワーク共有を検出する挙動を理解することはメリットがあるだけでなく、もはや必須です。この記事の目的は、セキュリティチームが、実用的なSplunkのハンティングクエリーと、独自のシミュレーションツールであるSharpShareFinderを使って、このテクニックに関する理解を深め、検出能力を強化できるようにすることです。
この記事でご紹介したハンティングクエリーを使えば、短時間で複数のエンドポイントに接続して認証された攻撃者を検出できます。この挙動は、ネットワーク共有を列挙する際に必ず発生するだけでなく、リモートエンドポイントでコードを実行するための戦術としてよく使われるラテラルムーブメントの兆候も示します。複数の目的に利用できるこれらのクエリーは、セキュリティツールとして大いに役立ちます。
最後に、このブログ記事でご紹介した分析などについては、Active Directory Privilege Escalation分析ストーリーの情報を参考にしました。Splunkの分析ストーリーについては、research.splunk.comをご覧ください。 最新の脅威ハンティング手法については、E-book『PEAK脅威ハンティングフレームワーク』をご覧ください。
Splunkプラットフォームは、データを行動へとつなげる際に立ちはだかる障壁を取り除いて、オブザーバビリティチーム、IT運用チーム、セキュリティチームの能力を引き出し、組織のセキュリティ、レジリエンス(回復力)、イノベーションを強化します。
Splunkは、2003年に設立され、世界の21の地域で事業を展開し、7,500人以上の従業員が働くグローバル企業です。取得した特許数は1,020を超え、あらゆる環境間でデータを共有できるオープンで拡張性の高いプラットフォームを提供しています。Splunkプラットフォームを使用すれば、組織内のすべてのサービス間通信やビジネスプロセスをエンドツーエンドで可視化し、コンテキストに基づいて状況を把握できます。Splunkなら、強力なデータ基盤の構築が可能です。