seccamp 2022 C1 Writeup

はじめに

seccamp2022のC1の講義で実施されたCTF形式の演習のWriteupを復習がてら遺しておこうと思います。

問題設定

(演習用に用意された仮想の)ある企業で発生したインシデントに対してフォレンジック調査を行います。ドメインやWebサイトはこの講義独自のものです。

ネットワーク図 (講義スライドより引用)

社内環境

イベントの検知

  • 通知日時
    • 2022-06-12 21:00:00
  • 検知内容
    • 検知日時: 2022-06-12 18:18:41 (JST)
    • src ip: 172.30.42.53
    • dst ip: 51.68.21.186
    • protocol: TLS
    • 検知理由: 仮想通貨のマイニングプール(pool.minexmr.com)への通信

検知への対応

2022-06-13 09:00~

  • 172.30.42.53 -> L1458というPC名と判明
  • 対象社員の身に覚えがないためインシデントして対応
  • L1458にて原因と思われるプロブラム(diagmonu.exe)を確認
    疑わしいプログラム (スライドより引用)

2022-06-13 12:00~

  • diagmonu.exeはVirusTotal未登録
  • 別PCにおいても同様のイベントを確認
    • 2022-06-13 08:55:11 172.30.42.107 (L2807)
    • 2022-06-13 08:59:15 172.30.42.84 (O4347)

2022-06-13 15:00~

  • L2807, O4347でもdiagmonu.exeを確認
    • L2807内に他の不審なプログラムを確認
    • L2807ではイベントログが消去された形跡あり
  • L2807をフォレンジック調査へ

L2807の情報

以上を踏まえて、L2807のE01ファイルをAutopsyを用いて調査していく。

Writeup

Prep (Autopsyの操作)

Prep(1)
Prep(1)
解答
Prep(1) ans
以上より14509

Prep(2)
Prep(2)
解答
Prep(2) ans
以上より64424509440

Prep(3)
Prep(3)
解答
Prep(3) ans
以上よりWindows 10 Proと分かるので10

Prep(4)
Prep(4)
解答
Prep(4) ans
以上より2022-06-09 10:45:40 JST

/Users/Public/Documents下の怪しいファイル群を調べていく。(VirusTotalの使い方)

ハッシュ(1)
ハッシュ(1)
解答
ハッシュ(1) ans
c.exeのmd5ハッシュが9f5f35227c9e5133e4ada83011adfd63であるとわかり、これをVirusTotalで検索する。DetailsタブのNamesやFile Namesからcsvdeというプログラムであることがわかる。

ハッシュ(2)
ハッシュ(2)
解答 ハッシュ(1)と同じく、mi64.exeのmd5ハッシュはbb8bdb3e8c92e97e2f63626bc3b254c4と分かる。さらに、VirusTotalで検索すると、DetailsタブのSignature infoのSignersからBenjamin Delpyが署名者であると分かる。

ハッシュ(3)
ハッシュ(3)
解答 ハッシュ(1), (2)と同じく、pse.exeのmd5ハッシュはc590a84b8c72cf18f35ae166f815c9dfと分かる。VirusTotalのDetailsタブのSignature infoのFile Version Informationより、PsExec 2.34であると分かる。

永続メカニズムキー(ASEP)の調査 (Autopsy Autoruns Pluginを使います)

Registry Run Key
WOW6432Node/Microsoft/Windows/CurrentVersion/RunにてC:\Users\Public\Documents\diagmonu.exeが指定されており、diagmonu.exeの実行が永続化されている。他にASEPとして登録されているものを探す。

永続化(1)
永続化(1)
解答
永続化(1) ans
Data Artifacts > Scheduled Tasksを開き、CommandにてC:\Users\Public\Documents下の絶対パスが指定されているものを探すと、ldr_ie.exeがt2という名前でタスクとして登録されていることが分かる。

永続化(2)
永続化(2)
解答
永続化(2) ans
Scheduled Tasksをざっと眺めると永続化(1)で見つけたタスクt2と似た名前のt1というタスクが目に付く。このタスクではpowershellが呼ばれており、この時点で怪しすぎるわけだがさらにCommandを確認すると引数としてSet-MpPreference -DisableRealtimeMonitoring $Trueを渡して実行されている。Set-MpPreferenceはSet-MpPreference (Defender) | Microsoft Learnを確認すると分かるようにWindows Defenderを操作するコマンドであり、-DisableRealtimeMonitoringというパラメータに$False以外が渡されている場合はリアルタイムプロテクションが無効化されると書かれている。
永続化(2) ans2
Dumpの項目をさらに詳しく調べると、authorがRETRICKS\shizrikuとあるので、このタスクを作成したユーザ名はshizrikuである。

永続化(3)
永続化(3)
解答
永続化(3) ans
Data Artifacts > Servicesを開き、Image PathからC:\Users\Public\Documents下の絶対パスを探すとC:\Users\Public\Documents\ldr_od.exeがldr_odという名前でWin32_Own_Processというタイプのサービスとして登録されていることに気づく。キーの設定されたタイムスタンプは2022-06-12 14:06:14 JSTと特定できる。

C:\Users\Public\Documents下の各ファイルのタイムスタンプの解釈

タイムスタンプ(1)
タイムスタンプ(1)
解答
タイムスタンプ(1) ans
命名の類似性、およびAccess timeによるソートの結果より、mi.txtがmi64.exeによって作成されたと考えられる。

タイムスタンプ(2)
タイムスタンプ(2)
解答
タイムスタンプ(2) ans
CreatedとAccessdのタイムを確認すると、作成されてからアクセスされるまでの時間が短いのは自明にc.exeである。

タイムスタンプ(3)
タイムスタンプ(3)
解答
タイムスタンプ(3) ans
Created timestampがファイルの作成のタイムスタンプで、Modified timestampがファイルのデータが最後に更新された時刻。例えば、ファイルをあるディレクトリから別のディレクトリにコピーする場合、Createdは更新されますがModifiedは更新されない。さて、ここで各exeファイルのタイムスタンプはCreatedの後に、c.exeは即座に、他のexeは1, 2秒遅れでModifiedを更新しているので、ネットからダウンロードするとかzipから抽出するとかなどど、新しいファイルをデータ共々Documentsディレクトリに作成した時(つまりコピーとかではない)に、何かを原因として一部のファイルでは作成とデータの完全なるディスクへの書き込みの間にラグが発生している。この原因はファイルのサイズが大きいとディスクの書き込み処理に時間がかかるからだと考えられ、実際にラグが0秒のc.exeは最もファイルサイズが小さく2秒のdiagmonu.exeは最もサイズが大きいことがわかる。当日はextractだとかdownloadだとか書いてfailした記憶がありますが、この時点ではどのような方法でファイルを作成したのか判明していないことと、本質的な原因はファイルサイズであることを考えるとsizeと答えるのが適当。

SRUDB.datの解析

Autopsyを用いてSRUDB.datの存在するディレクトリsruを抽出する。GitHub - MarkBaggett/srum-dump: A forensics tool to convert the data in the Windows srum (System Resource Usage Monitor) database to an xlsx spreadsheet.を用いて、xlsxに落とし込み、libre Officeで解析していく。

SRUM(1)
SRUM(1)
解答
SRUM(1) ans
Application Resource UsageにCPU timeの値のカラムがある。Applicationのカラムにてdiagmonu.exeで条件を絞り、CPU time in Foregroundの8つの値を足し合わせて、12928803038240 が答えとなる。

SRUM(2)
SRUM(2)
解答
SRUM(2) ans
Network Data UsageにBytes Sentというカラムがある。SRUM(1)と同じくdiagmonu.exeで絞り、8つのBytes Sentの値を足し合わせ、48315 を得る。

SRUM(3)
SRUM(3)
解答
SRUM(3) ans
Application Resource UsageとNetwork Data UsageのApplicationカラムにてusers\publicで絞ると、前者では新たなexeファイルは見つからなかったが、後者ではdsq.exeというファイルが存在していたことがわかった。

Application Resource UsageとNetwork Data UsageのApplicationカラムにてusers\publicで絞り、出てきた各怪しいexeの列を黄色で塗りつぶしておく。

Network Data Usage suspicious
Application Resource Usage suspicious

SRUM(4)
SRUM(4)
解答 Application Resource UsageとNetwork Data Usageに対してチェックしていく。User SIDをS-1-5-18で固定する。Applicationではexeを含むものに取り敢えず絞る。AutopsyでのC:\Users\Public\Documents下のexeの最も古いCreated timestampは2022-06-12 13:25:39 JST。よってこれより新しいという条件でフィルタする。ただし、srumの方はUTCであることに注意。

具体的には、「User SID = S-1-5-18 (systemprofile) AND Srum Entry Creation >= 2022-06-12 03:46:00 AND Application Contains exe」でフィルタする。Application Resource UsageではSystem32のexeが非常に多かったので、「AND Application Does not contain System32」という条件を追加。

NDU filter
ARU filter
iexplore.exeというexeが何度も呼ばれているのが目に付く。そこで次は「User SID = S-1-5-18 (systemprofile) AND Application Contains iexplore.exe」という条件でフィルタする。
NDU iexplore.exe filter
ARU iexplore.exe filter
するとものの見事に、2022-06-12 4:25:39以降であることが分かる。 よってiexplore.exe

SRUM(5)
SRUM(5)
解答 例えばldr_odというWindowsサービスは永続化(3)より2022-06-12 14:06:14 JST(2022-06-12 05:06:14 UTC)に作成されていると考えられるので、この直前にサービスを登録したプログラムが存在しているはずである。よってSrum Entry Creationのフィルタを前述の時間を含むEntryつまり、「2022-06-12 04:48:00 >=」の条件で絞ってみる。
SRUM(5) ans
C:\Users\Public\Documents下のexeが実行されているあたりから確認すると、C:\Windows\SysWOW64\schtasks.exeが実行されているのがわかる。まさに、Windowsのタスクを追加するコマンドなので、schtasks.exe

今回は永続化(3)のldr_odの永続化のためのコマンド(例えばsc.exe)などを探そうとして、結果的には、t2としてldr_ie.exeをscheduled tasksに追加するのに使ったschtasks.exeが見つかることとなった。もっとも、永続化(2)の方を探そうと思っても同じフィルタを適用して探していたことだろう。

プリフェッチの解析

NirSoftのView the content of Windows Prefetch (.pf) filesを用いてプリフェッチファイルを使った調査を行う。Autopsyを用いてC:\Windows\prefetchディレクトリをエクスポート。WinPrefetchViewのOptions > Advenced Optionsからエクスポートしたprefetchディレクトリを指定することで、解析対象のE01の中のプリフェッチファイルの解析を行える。

プリフェッチ(1)
プリフェッチ(1)
解答
プリフェッチ(1) ans
以上より、2022-06-12 13:37:57

プリフェッチ(2)
プリフェッチ(2)
解答
プリフェッチ(2) ans
IEXPLORE.EXE-7A9337F2の方の関連ファイルにIEXPLORE.EXEは二つ存在しており(もう片方は一つだけ)、こちらはC:\PROGRAM FILES\INTERNET EXPLORER\IEXPLORE.EXEというImage Pathが存在しているので、正しいPathは\VOLUME{01d6677c18ea2be0-dc1925ef}\PROGRAM FILES\INTERNET EXPLORER\IEXPLORE.EXE

プリフェッチ(3)
プリフェッチ(3)
解答
プリフェッチ(3) ans
よって\VOLUME{01d6677c18ea2be0-dc1925ef}\USERS\SHIZRIKU.RETRICKS\APPDATA\LOCAL\MICROSOFT\CLR_V4.0\USAGELOGS\LDR_IE.EXE.LOG

プリフェッチ(4)
プリフェッチ(4)
解答
プリフェッチ(4) ans
以上より、\VOLUME{01d6677c18ea2be0-dc1925ef}\USERS\SHIZRIKU.RETRICKS\DOWNLOADS\コンサルティング要件定義書\コンサルティング要件定義書.LNK

プリフェッチ(5)
プリフェッチ(5)
解答
プリフェッチ(5) ans
Autopsyのkeyword searchで「要件定義書」で調べると、コンサルティング要件定義書.zipというファイルのLNKファイルが見つかる。zipファイルを展開したプログラムを探すことになる。 そこでwin_prefetch_view上で「zip」と検索すると7-ZIP関係のプログラムが見つかる。
プリフェッチ(5) ans 7-zip
さらに、7ZG.EXE-D9AA3A0B.pfの関連ファイルを確認するとコンサルティング要件定義書.ZIPが見つかるので、\VOLUME{01d6677c18ea2be0-dc1925ef}\PROGRAM FILES\7-ZIP\7ZG.EXEがZIPファイルを展開したプログラムであると分かる。

win_prefetch_view上でのFindコマンドが関連ファイルのFilenameまでを検索対象としていないようで、「コンサルティング要件定義書」という文字列で検索しても引っ掛からなかった。

単にpfファイルをざっと確認しても、7-ZIPくらいしかファイルの展開に関連しそうなプログラムは見つからないので、適当に関連ファイルを確認していくだけでもコンサルティング要件定義書.ZIPを見つけられると思われる。

Analysis

これまで学んだ各種アーティファクトやツール、Autopsyのkeyword searchを駆使してフォレンジック解析を進めていく。

Analysis(1)
Analysis(1)
解答
Analysis(1) ans
プリフェッチ(5)と同様に、Autopsyのkeyword searchにて「要件定義書」と検索して見つけたコンサルティング要件定義書.zip.lnkファイルのAccessed タイムスタンプを確認する。 2022-06-12 13:25:11 JST

Analysis(2)
Analysis(2)
解答
Analysis(2) ans
Autopsyのkeyword searchにて「要件定義書.zip」と検索して見つかる、Web Downloads Artifact、Web History Artifact、places.sqlite、これらは全て、「C:/Users/shizriku.RETRICKS/AppData/Roaming/Mozilla/Firefox/Profiles/ni6148kl.default-release/places.sqlite」というファイルから得られる情報である。これはFirefoxに関連するアーティファクトであり、https://support.mozilla.org/ja/kb/profiles-where-firefox-stores-user-dataによると、places.sqlite

すべてのブックマーク、ダウンロードしたファイルと表示したページのリストが含まれています。

とのこと 例えばWeb Downloads ArtifactのData Artifactsを確認すると、https.://form.run/admin/api/v1/form_attachments/xi9XLyaqtUlCSxPlCsMMw9sE3q5QxHsJeES3k7y9というURLからダウンロードされたことが分かる。

Analysis(3)
Analysis(3)
解答 C:\Users\Public\Documents下のファイル群の中で最初に作られたファイルはldr_od.exeである。Autopsy上でこのldr_od.exeのCreatedのタイムスタンプを右クリックし、View File in TimelineからFile Created > Show Timelineを選択し、全てのタイムスタンプ上での流れを確認する。
Analysis(3) timeline
すると、最も直近に実行されたファイル、つまりEvent TypeにてProgram Runとなっているのはpowershell.exeであると分かる。このデータはプリフェッチファイルから得られている。

あるいは、プログラムが実行された時には基本的にpfファイルが作られるんだということで、win_prefetch_viewのLast Run Timeのカラムからタイムスタンプを精査しても良い。

Analysis(3) pf
ldr_od.exeが作られた2022-06-12 13:25:39 JSTの最直近のpfファイルのタイムスタンプは、POWERSHELL.EXEのタイムスタンプであり、関連ファイルのFilenameにもldr_od.exeやldr_ie.exeやa64.exeなどが存在することから、powershell.exeが直近に実行されたexeとして扱うに相応しいと分かる。

Analysis(4)
Analysis(4)
解答 Analysis(3)のpowershell.exeのpfファイルの関連ファイルにldr_od.exeが存在しているので、powershellによってダウンロードされたのではという目処が立ち、よってダウンロード元のURLの情報はメモリ上に存在しているだろうという予測ができる。その上でAutopsy上で「ldr_od.exe」でキーワード検索する。 ldr_od.exeに関連するアーティファクトはかなりの数あるが、その中でもpagefile.sysの中に「107.173.166.18/ldr_od.exe」という文字列が散見され、このIPアドレスからダウンロードされていそうだなと予想できる。
Analysis(4) ans
特に、4486ページ目に決定的な証拠があり、http.://107[.]173[.]166[.]18/ldr_od.exeが答えであると分かる。(URLとして表示されないように[]や.を挿入している。)

あるいは、Autopsyのkeyword searchは正規表現で検索することができるので、「http(s)?://.*ldr_od.exe」と検索しても良い。

Analysis(4) reg exp search
そうすれば一発でURLがhttp.://107[.]173[.]166[.]18/ldr_od.exeであると分かる。

Analysis(5)
Analysis(5)
解答 Analysis(4)と同じように「http(s)?://.*ldr_ie.exe」で検索しすると、一つのアーティファクトC:\ProgramData\Microsoft\Windows Defender\Support\MpWppTracing-20220612-094419-00000003-ffffffff.binだけ見つかる。
Analysis(5) ans
以上よりhttp.://45[.]35[.]14[.]79/4n6/ldr_ie.exeと分かる。

ところでこのMpWppTracing-[0-9]{8}-[0-9]{6}-[0-9]{8}-ffffffff.binは、WPP Software Tracing - Windows drivers | Microsoft Learnにあるように、WPP Software Tracingという機能をドライバーが使えるイベントトレース機能関連のログのようで、今回のこのファイルはWindows Defender\Support下にあるように、Windows Defenderのトレースログのようである。

Analysis(5) MPLog
実際同じディレクトリに存在するMPLog How to Use MPLogs for Forensic Investigations | CrowdStrikeというアーティファクトに、WPP関連のイベントのログが存在し、そこでfilenameに上述の形式のbinファイルが明記されているので、間違いない。

もっともこのbinファイルにどのようなイベントが記録されるのかは謎で、Windows Defenderをrevするくらいしかなそう。Google Scholarでも一件だけ単にダウンロードされたファイルの名前が残っていたアーティファクトの紹介で載っているだけであり、Github上でもこのファイルから正規表現でdllやpdb等のファイル名を抜き出すpythonスクリプト一件しかヒットしない。 一つだけそれについて議論していそうなページSolved: MS Defender creating MsWppTracing files and hanging OS every 5 minutes. | Experts Exchangeを見つけたが、肝心なところから見えなくなっていて、Free Trialしたくないので(payment methodを要求されるので)閲覧できていない。

しかし、アーティファクトとして有用なのは間違いない。実際このbinファイルには他にもpowershellや各種コマンドの痕跡が残されている。例えばa64.exeも同じようにpowershell.exeを用いてダウンロードしていることが分かるし、永続化(2)と関連してcmd /c schtasksでpowershell Set-MpPreference -DisableRealtimeMonitoring $True /RU SYSTEM /SC ONSTARTがt1というタスクとして登録されているのが発見できる。

Analysis(6)
Analysis(6)
解答 ハッシュ(2)よりmi64.exeがmimikatz GitHub - gentilkiwi/mimikatz: A little tool to play with Windows securityであり、一連の流れでmi.txtがmi64.exeによって作られたと予想できる。
Analysis(6) pf
実際、mi64.exeのpfファイルの関連ファイルとしてmi.txtが存在する。 そして、mimikatzは平文パスワード、NTLMハッシュ、ピンコードやケルベロスチケットをメモリから抜き出す有名なソフトウェア。
Analysis(6) ans
このmi.txtには実際にshizrikuのNTLMハッシュが取得されており、a621b48e85488d38790fcbb8520e307e

Analysis(7)
Analysis(7)
解答 ldr_ie.exeはpfファイルを確認すると、4回実行されていることが分かる。これは、2022-06-12 13:37:59 JST、2022-06-12 13:44:05 JST、2022-06-12 13:49:26 JST、2022-06-12 13:58:29 JSTである。このタイムスタンプ全てにおいて、Autopsyのtimeline上で確認する。

Analysis(7) 2022-06-12 13:37:59 JST
Analysis(7) 2022-06-12 13:44:05 JST
Analysis(7) 2022-06-12 13:49:26 JST
Analysis(7) 2022-06-12 13:58:29 JST

ここで、候補となるexeファイルはiexplore.exeかielowutil.exeの二択であると分かる。一方で、a64.exeがldr_ie.exeの直前に実行されているので、例えばa64.exeからielowutil.exeが実行されている場合、時間軸上ではldr_ie.exeの直後に実行されていてもこれを「直後に実行されたexe」として答えて良いのかという問題がある。CTF的には両方提出すればどっちが答えである、でいいのだが、こちらの方が直後である、と納得したい。

さて、ielowutil.exeのpfファイルのタイムスタンプとldr_ie.exeのpfファイルのタイムスタンプはtimelineの表記上前後する時があり、iexplore.exeは必ずldr_ie.exeの後に実行されるというのが判断ポイントであると思いたいところだが、ielowutil.exeとldr_ie.exeのタイムスタンプ自体は1秒の単位までは完全に一致している。そして、Autopsyのpfファイルのタイムスタンプの順序を1秒より小さい時間の記録を元にtimeline上で整列しているのかは疑問である。というのも、今回の講義では扱わなかったがUsnJrnl$J上のpfファイルのcreateのタイムスタンプを比較すると全ての場合において、ldr_ie.exeのpfのタイムスタンプの方が、ielowutil.exeのpfのタイムスタンプより若かったからである。よって今回はこれは判断ポイントとして考慮しないことにする。

問題の趣旨として、ldr_ie.exeによって実行されるexeのことを聞こうとしているのは間違いない。ldr_ie.exeのバイナリの中にstringとしてiexploreは存在しているが、ielowutilという文字列は存在していないという点はまず、考慮に値する。しかし、ielowutilが実際に何をしているのかわからなかったこともあり、結局例えばiexplore.exeこそが直後であると決定づける証拠は見つからなかった。

答えは提出したところielowutil.exeではなかったのでiexplore.exeであった。しかし、後でざっと動的解析してみたところ*1ldr_ie.exeを実行してからiexplore.exeを実行されるまでの間に必ずielowutil.exeが実行されたので(a64.exeを実行しなくても実行された)、愚直に直後という言葉を文字通り捉えるのであればielowutil.exeの方が適当であるといえる。一方でこの問題自体はielowutil.exeを答えさせたい問題ではなく、恐らくldr_ie.exeはiexplore.exeというブラウザ経由で何かをするプログラムであるということを言いたいのであり、ielowutil.exeはiexplore.exeを起動する初期化的な役割をしているだけであってマルウェアの挙動の本質ではないことを考えるとiexplore.exeと解答してしかるべきとも言えそう。*2

例えばより捻くれた屁理屈として、「直後に実行された」という言葉に対してntoskrnl.exeとかも言えてしまうわけで、そういう解釈はさておき実際のインシデント調査を想定すると、ldr_ie.exeを実行直後にiexplore.exeが実行されていた、とまとめる方がAnalysisとしては意義のあることと考える。

Analysis(8)
Analysis(8)
解答
Analysis(8) ans
SRUMのNetwork Data UsageにてApplicationカラムでiexplore.exeで絞り、Bytes Sentの値を全て合計すると2143048となる。

まとめ

復習がてら調べていたらMPLog等のアーティファクトの存在に気づくことができたりと良かったです。

*1:Windows Defenderで検知されなかったが、このマルウェアはそれを狙って標準のiexplore.exeにコードを埋め込んで実行することで、検知を回避してC2サーバにアクセスしているらしい。

*2:iexplore.exeをウィンドウを開かないように実行するためにとしてActivator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.Application") )経由で呼び出すようにしたところ、ielowutil.exeがその前に実行されるようになってしまっていたとのこと。