2024年セキュリティの現状:競争が激化するAIの活用
先進的なサイバーセキュリティ対策を推進する組織がどのように課題を克服し、AIを活用してイノベーションを推進し、デジタルレジリエンスを強化しているかをご確認ください。
さあ大変!ハッキングを受けてしまいました。社内のエキスパートに状況を調べてもらっています。ほどなくして、サイバーセキュリティ担当者からこう告げられます。「攻撃者がDNSを悪用して、感染したホストを操り、データを盗み出したようです」
後日振り返って、こう思うのではないでしょうか。「そもそも、こういう攻撃に対して勝ち目はあったのか?」
勝ち目はありました。Splunkを使えば、DNSを悪用したデータ窃取を検出し、対応できるのです。実は、DNSデータとSplunkを活用してネットワーク侵害の痕跡を見つけ出す方法は20年ほど前から使われています!
熱心な読者の皆様は「Splunkで脅威ハンティング:アクティブなハンターのためのハンズオンチュートリアル」をすでにお読みでしょう。それならば、良いハンティングは1~2個の仮説で始まることをご存知のはずです。さっそく仮説を立ててみましょう!この記事では、DNS悪用によるデータ窃取という積年の課題を取り上げ、その可視化、ハンティング、撃退方法について説明します。
(この記事は「Splunkで脅威ハンティング」シリーズの一部で、初稿はDerek Kingによって書かれました。お客様に最大限の価値を提供できるよう、その内容を最近更新しました。)
この記事で取り上げる「DNS悪用によるデータ窃取」とは、攻撃者がDNSプロトコルを悪用して、標的組織から盗み出したデータを自身のホストにトンネリングする(抜き出す)攻撃を指します。DNSを使う目的について2つの仮説を立てることができます。
適切な可視化とサーチ技法を使えば、正常時と比較して、または他のクライアントと比較して異常な動作をしているクライアントを見つけ出すことができます。
すでにDNSデータをSplunkに取り込んでいるならば準備完了です!まだ取り込んでおらず、私の同僚のRyan KovarとSteve Brantによる.confのプレゼンテーション「既知の未知を追跡する(DNS編)」(英語)をご覧になっていない場合は、ぜひ見てやってください。役に立つ情報が満載です。このプレゼンテーションがお気に召さなくても、この2人はあまり気にしないので大丈夫です。
いずれにしても、DNSデータのソースとしてお勧めするのは以下のログです。
これからご紹介するサーチをサンプルデータでお試しになりたい場合は、GitHubに用意されているBOTSv3データセットをご利用いただけます。ただし、以下のサーチはすべて、こちらから入手できるBOTSv1データセットを使ってテストされています。
DNS悪用によるデータ窃取の被害にあっているかどうかを調べるにはどうすればよいでしょうか?前述の仮説を裏付ける事象はたくさんあります。たとえば、ホストが侵害を受けている場合は、DNS通信に次のような変化が現れる可能性があります。
これらの攻撃手法は、stats、timechart、table、stdev、avg、streamstatsなどのコマンドを使ったSplunkサーチで検出できます(各コマンドの詳細については、それぞれのドキュメントを参照してください)。
以下のセクションでは、上記の痕跡を調べてDNSの悪用を検出する方法をいくつかご紹介します。
注:いつものように、サーチは共通情報モデル(CIM)に準拠して記述されています。必要な場合は、環境に合わせてソースタイプ/タグ/イベントタイプを変更してください。
クライアントのリクエスト数の急増や変化は、データ窃取の初期兆候である可能性があります。
tag=dns message_type="Query" | timechart span=1h limit=10 usenull=f useother=f count AS Requests by src
まずは、時系列での変化を検出するために役立つシンプルなサーチをご紹介します。1行目で目的の結果セットを取得してから、2行目のtimechartコマンドで1時間ごとのリクエスト数をグラフ化します。
他のクライアントと比較してリクエスト数が異常に多いクライアントは、DNS通信によるデータ転送に悪用されている可能性があります。
クライアントがリクエストするリソースタイプの変化は、C&C通信やデータ窃取が行われている可能性を示します。AレコードとTXTレコードを重点的に監視するのが一般的ですが、不意打ちで別のタイプのレコードが悪用される可能性も考慮しましょう。
tag=dns message_type="QUERY" | timechart span=1h count BY record_type
今回もシンプルに、先ほどと同じデータセットを使用し、timechartコマンドで、レコードタイプフィールド別に1時間ごとのリクエスト数をグラフ化します。前のサーチで検出したクライアントIPを対象としてこのサーチを実行すれば、仮説の検証にさらに役立つでしょう。
挙動の変化を早期に発見すれば、ホスト侵害の影響を軽減できる可能性が高まります。Splunkで過去のデータをサーチすることで、ホストが最初に侵害を受けた日時と、それ以降に通信した相手を特定することもできます。
パケットサイズが著しく大きいリクエストや大量のリクエストが発生している場合は、データの窃取が疑われます。
tag=dns message_type="QUERY" | mvexpand query | eval queryLength=len(query) | stats count by queryLength, src | sort -queryLength, count | table src queryLength count | head 1000
コマンドが急に増えましたね!1つずつ見ていきましょう。どれもとても便利なコマンドです。
まずは、これまでと同じ基本サーチでBOTSv1データセットからデータを取得した後、以下の操作を行います。
この散布図を見て、通常のパターンとは一致しないリクエストを特定できます。数が多いリクエストやパケットサイズが大きいリクエストは注意が必要です。
たとえば、通常は「www.bbc.co.uk」(13文字)や「www.facebook.com」(16文字)程度のリクエストがまばらに発生する中で、悪質なソフトウェアが5MBの機密文書を255バイトのパケットに分割してDNSリクエストとして送信しようとした場合、255バイトのパケットが大量に発生します。
次は少しレベルアップします。ここでは、C&Cインフラにビーコンを送信している可能性のあるクライアントを検出します。ビーコンアクティビティは、侵害されたホストがC&Cインフラに「照会」する際に発生します。こうしてビーコンを使って、次の指示や悪質なソフトウェアのアップデートを受け取る準備ができていることを知らせることがあります。
tag=dns message_type="QUERY" | fields _time, query | streamstats current=f last(_time) as last_time by query | eval gap=last_time - _time | stats count avg(gap) AS AverageBeaconTime var(gap) AS VarianceBeaconTime BY query | eval AverageBeaconTime=round(AverageBeaconTime,3), VarianceBeaconTime=round(VarianceBeaconTime,3) | sort -count | where VarianceBeaconTime < 60 AND count > 2 AND AverageBeaconTime>1.000 | table query VarianceBeaconTime count AverageBeaconTime
この例も基本はこれまでと同じですが、新しいコマンドがいくつか登場します。
この例では、クエリー間隔の分散が小さいクライアントを特定しています。このようなクライアントがある場合、ホストが、30秒間隔や5分間隔など、一定の間隔でC&Cインフラと通信している可能性があります。
特定のドメインと通信しているホスト数を特定することは、ボットアクティビティが行われている可能性や、すでに侵害されているホストの範囲を調べるために役立ちます。
tag=dns message_type="QUERY" | fields _time, src, query | streamstats current=f last(_time) as last_time by query | eval gap=last_time - _time | stats count dc(src) AS NumHosts avg(gap) AS AverageBeaconTime var(gap) AS VarianceBeaconTime BY query | eval AverageBeaconTime=round(AverageBeaconTime,3), VarianceBeaconTime=round(VarianceBeaconTime,3) | sort –count | where VarianceBeaconTime < 60 AND AverageBeaconTime > 0
このサーチには新しいコマンドは出てきません。ビーコンアクティビティを検出し、その通信を行っている個々のホスト数を調べています。これにより、侵害されているホストが複数あってもすばやく見つけ出すことができます。このサーチでは、statsコマンドで新しい関数を1つ使用しています。
この例は、前のビーコンアクティビティの例と比べて、一定の間隔で発生するリクエストを調べる点は同じですが、同じ動作をしているクライアントを1つにまとめている点が異なります。
エンコードされた情報はサブドメイン経由で転送されることがあります。1つのドメインで使用される異なるサブドメインの数を調べれば、コマンドアンドコントロール通信やデータ窃取を特定するために役立ちます。
tag=dns message_type="QUERY" | eval list="mozilla" | `ut_parse_extended(query, list)` | stats dc(ut_subdomain) AS HostsPerDomain BY ut_domain | sort -HostsPerDomain
ここでは、各ドメインについてリクエストされるサブドメイン数を調べています。この動作は、データ窃取やDGAが行われている可能性を示します。 URL Toolboxを使えば、ドメイン名を簡単に解析できます。詳しくは、ブログ記事「UTでスリザリン生のように狡猾にドメインを解析する」(英語)をご覧ください。
いつもどおり、DNSデータセットから対象のデータを取り込み、「mozilla」の値を持つフィールドを作成します。上記の記事をお読みになった方は、ここで何を行っているかおわかりでしょう。お読みになっていない場合は、とにかくURL Toolboxで必要な操作だとお考えください。;-)
「ut_parse_extended」の後は、すでにご紹介したコマンドを使用しています。statsコマンドで、ドメインごとの個々のサブドメイン数をカウントしてから、結果を降順にソートしています。
この例では、サブドメイン数が多いドメインを調べています。その結果から、問題ないと考えられる一般的なサイトをフィルタリングして取り除くと、もっと効率的に調査できます。
Splunkではこの作業を「Get shi stuff done! (汚れ仕事を片付ける)」と言っています。ここでうれしいお知らせです。上記のサーチはすべて、こちらのGitHubリポジトリからダウンロードできます。ぜひハンティングにご活用ください。
サーチ結果の品質を向上させるためのヒントをいくつかご紹介します。
Splunkはセキュリティチームをいつでも支援いたします。
この記事では、ドメイン名のランダムな変化の検出方法については説明を省きました。タイポスクワッティング(「typo squatting」の代わりに「typ0 5quatting」を使うなど)やその他の数学的なランダム性についてご興味がある場合は、以下の記事をご覧ください。
このブログはこちらの英語ブログの翻訳、阿部 浩人によるレビューです。
Splunkプラットフォームは、データを行動へとつなげる際に立ちはだかる障壁を取り除いて、オブザーバビリティチーム、IT運用チーム、セキュリティチームの能力を引き出し、組織のセキュリティ、レジリエンス(回復力)、イノベーションを強化します。
Splunkは、2003年に設立され、世界の21の地域で事業を展開し、7,500人以上の従業員が働くグローバル企業です。取得した特許数は1,020を超え、あらゆる環境間でデータを共有できるオープンで拡張性の高いプラットフォームを提供しています。Splunkプラットフォームを使用すれば、組織内のすべてのサービス間通信やビジネスプロセスをエンドツーエンドで可視化し、コンテキストに基づいて状況を把握できます。Splunkなら、強力なデータ基盤の構築が可能です。