2023」を開催しました。6ジャンルで問題を出題しました。3段階で出題しました。このうち、私はDFIRの作問、レビューを担当しました。DFIRというと、ディスクやメモリの解析などを想像される方も多いと思いますが、今回はログ解析にフォーカスしており、ネットワークトラフィックログやLinuxやWindows、アプリケーションのイベントログの解析に挑戦してもらいました。通常のCTFでは、ログ解析の問題はほとんど出題されないため*1、アンケートを読んでいると、そのような問題が出題されて良かったという参加者の意見が多かったのが印象的でした。ある「developer」の解法を紹介します。「developer」は約50名の参加者のうち競技期間中に4名が正解し、最初に正解があったのは競技開始から約3時間後です。問題は、以下のように「開発者が偽のインストーラを実行してしまい、パスワードが盗まれてしまった。盗まれたパスワードを特定して欲しい」という設定で始まります。*3開発者が使用していたクラウドサービスが侵害を受けて原因を調査していたところ、ある開発者が複数のサービスや開発端末で同じパスワードを使用していたことがわかりました。そこであなたはパスワードが漏えいした原因を調査するために、開発者の端末を回収して調査をすることにしました。開発者に不審な出来事がなかったかヒアリングしたところ、「そういえば、開発に使うソフトウェアをインストールするために、ISOファイルに入っていたインストーラを実行したが、何も表示されなかったなぁ。開発者がこの行動を行った大体の時間を聞いて、あなたはこの行動が行われた時間のトラフィックログとOSのイベントログを抽出しました。漏えいしたパスワードを調べてください。解析を行ってもらう問題ファイルは、pcapファイルとWindowsイベントログファイル(.evtx)です。ちなみに、ネットワークとエンドポイントのログ両方を出しましたが、これはネットワークとエンドポイント両方での解析が重要であることを理解してもらう狙いがありました。エンドポイント/ネットワークログの一方の解析では発生したイベントの解像度が低く、適切な調査が出来ないことがあります。この問題でも、ネットワークとエンドポイントいずれかのログを読むだけでは解くことができず、両方のログを行き来しながら読めないと解けないようになっています。解法pcapファイルの解析Wiresharkでpcapファイルを開きます。どのようなトラフィックがあるか確認するため、Conversationsを確認します。以下のことがわかります。通信は1ストリームしかありません。Streamで通信内容を確認します。以下のことがわかります。443/tcpは通常SSL/TLSを使用したHTTPSの通信に使われますが、SSL/TLS通信であれば、サーバのなりすましを確認するために証明書をダウンロードしたり、暗号化を行うために必要な鍵の交換などを行うハンドシェイクの通信が発生するはずです。今回はそのハンドシェイク通信がないため、HTTPSではない通信であることがわかります。人が読めるASCII文字列はなさそうです。この場合、何らかのバイナリデータか、何らかの方法で暗号化されているデータの可能性が考えられますが、この時点ではわかりません。いうファイルをアップロードしています。用いてファイルをアップロードしていることもわかります。ように計算できるので、このTCPポートを使って通信しているデータをExportします。続いてWindowsイベントログの解析を行います。イベントログの解析は参加者の中にはWindowsのイベントログを一つずつ見ていって、怪しいログを探していった人もいるかもしれません。Windowsイベントログは大量にあるため、当たりもつけずに見つけるのは時間がかかる作業であり非効率的です。機能を用いて、CSVのWindowsイベントログのタイムラインを作成します。含まれるルールにマッチしたものから作成されます。アラートが出てきます。ログ(プロセスの起動)から以下の3つのイベントを発見しています。名前を変更したLOLBINコマンドラインを見ると、powershell.exeをchrome.exeにrenameしていることがわかる。ため、ここからプロセスのメモリダンプが実行されたと思われるこのことから、PowerShellを実行していることがわかるので、このコードを解析していきます。PowerShellのコードの解析イベントログから見つかったコードHayabusaのアラートで見つかったBase64にエンコードされたPowerShellのコードをデコードしてみます。あるので、まずはこのログを見てみます。見てみると、先ほどよりも難読化が解除されたコードが残っています。命令の句切れなので、ここで改行して、ちょっと整形します。文字列が並び替えられたり、変数がわかりにくくなっており、やや読みにくいですが、このスクリプトでは以下の処理を実行しています。サーバに送信サーバから受信したデータをコマンドとして実行し、その後結果をサーバに返すのはリバースシェルの挙動です。いう関数に通しています。これらの関数は、このスクリプト内には存在しません。よって、一般的に定義されている関数でもないので、これらはダウンロードしてきたlibの中にこれらの関数があると考えられます。liblibの本体はpcapファイルに残っています。見てみると、ある程度難読化を解除されたコードが残っていることがわかります。見やすくなったので、この状態で各関数の処理を把握します。まとめると、各関数では、以下のことを行っています。CBCモードで復号する受信したデータの先頭16bytesをIVとする。PowerShell解析結果のまとめ以上より、PowerShellはサーバからAESで暗号化されたPowerShellのコードを受け取り実行、実行した結果をAESで暗号化して送信するリバースシェルのコードであるとわかりました。SHA256のハッシュ値で、IVは先頭16バイトに付与されています。暗号化されたトラフィックを復号できれば、攻撃者がどのような行動を行ったか把握できそうなので、これまでの解析結果を元にトラフィックを復号します。用いると、Pythonでは以下のように復号スクリプトを書けます。d(key,p["Raw"].load))これを実行すると、以下のように実行したコマンドが復号できます。コマンドの復号結果から、攻撃者は以下のコマンドを実行したことがわかります。libに含まれるE関数でAES暗号化。アップロードFTPで転送されたファイルの復号FTPでアップロードされていたファイルがAESで暗号化されたZIPファイルであることがわかったので、トラフィックを復号した時と同様のPythonスクリプトを書き、復号します。)が、WiresharkでエクスポートしたFTPでアップロードされていたファイルです。メモリダンプが入っています。あることがわかります。パスワードクラックあとは、このNTLMハッシュから元のパスワードかを特定します。