2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【CyberDefenders】UnPackMe Lab【Walkthrough】

Last updated at Posted at 2024-11-03

はじめに

本記事は CyberDefenders(以下リンク参考)の「UnPackMe Lab」にチャレンジした際のWalkthroughになります

※本チャレンジについてはRed側のペネトレというよりはBlue側の分析力を問われるものになります。
※今回のチャレンジはMalware解析メインでしたね。

チャレンジ開始前

問題について

以下の画像の「Download Lab Files」に問題ファイルのリンクがあります。
アーカイブファイルで圧縮されているので仮想環境で解凍してください。
※ホストで解凍しないでください。中には本物のマルウェアが入ってたりします。

image.png

環境

この CyberDefenders を解く際には仮想環境でマルウェア解析やメモリフォレンジックを行う環境を用意する必要があります。
今回は以下のような環境を用意しました。

今回はWindows 10の環境を利用しました。
主にx64dbg, BinaryNinjaを利用しました。

Q1

Upon initiating your analysis of 'ShadowSteal,' understanding its obfuscation techniques is critical. One tell-tale sign is the file's entropy. Can you determine its value, which hints at whether the malware is packed?
Malwareの基本的な構成や簡易なPacking技術を判断するためにDiEへ食わせます。

die.png
エントロピー高めなので難読化はしっかり入ってそう。
4n4lDetectorにも食わせます。

1-4N4L.png
エントロピーはこれでわかります。pestudioとかでもわかるのでそっちでもいいですね。

Unpacking

実際に難読化されてる内容を見に行きます。
バイナリをBinaryNinjaに食わせます。
upack-0.png
.rsrcセクションに難読化されてそうな文字列が見えます。packing技術は先ほどのToolではわかりませんでした。一応パッキングでRC4などを利用してるケースも考えて簡易的にcapaも回します。

capa.png
特段そういったこともなさそうですね。

もう動的に動かしてunpackします。とりあえず直ぐにreversingしたいならこういった手法が有効ですね。
x64dbgを起動します。とりあえず以下のBreakpointを打ちます。
upack-1.png

  • VirtualAlloc
  • VirtualProtect
  • WriteProcessMemory

この辺りはmalwareが難読化解除したPayloadをメモリ上に展開するときよく利用するwinapiなので打っておいて損はないです。

  • CreateProcess
  • CreateProcessInternal

EvasionのためにPayloadをインジェクトするときによく使います。RemoteThreadに注入する際にはそのProcessに対してデバッカをアタッチしたいのでその前にBPで止めるようにします。

  • IsDebuggerPresent

アンチデバックのために使われるwinapiです。この関数の結果を改ざんするためにBP打っておきます。ScyllaHideとか入れておけばここら辺は省略してもいいかもですね。

それでは起動します。
upack-2.png
VirtualAllocに引っかかりました。returnまで回します。
upack-3.png
returnで帰ってきた(eaxレジスタ)のアドレスをfollow dumpしておきます。
upack-4.png
メモリ確保しただけなのでnullですね。回してみます。
upack-5.png
おそらくShellcodeでしょう。このタイミングで止まっているAdressはBPを打ったVirtualAllocなので再度returnで確保したメモリのアドレスを拾います。
upack-6.png
Follow Dumpします。
upack-7.png
まぁ先ほどと同様ですね。回します。
upack-8.png
4D 5Aが見えるのでPEファイルぽいことが確認できます。これが難読化解除後のMalware本体でしょう。
021F0000のアドレス領域をProcess Hackerからダンプします。まずは起動します。
upack-9.png
メモリを確認します。
upack-10.png
RWで書き込み可能なことが分かります。ここからVirtualProtectとかで実行可能にするんでしょうね。
この021F0000のメモリ領域をダンプしました。これでUnpacking成功です。

Q2

Before 'ShadowSteal' begins its data theft, it cleverly checks for a mutex to avoid duplicative data collection. This mutex includes a unique string combined with the computer's name. What is the hardcoded string that 'ShadowSteal' uses for this purpose?
先ほどUnpackingしたバイナリをBinaryNinjaに食わせます。そうすればMutexをいじるwinapiを利用しているFunctionを確認できます。
2-0.png
感染していた端末かどうかの確認でよく使われますね。
CreateMutexAのapiを確認します。

HANDLE CreateMutexA(
  [in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
  [in]           BOOL                  bInitialOwner,
  [in, optional] LPCSTR                lpName
);

第3引数を求めるためのsub_4324c4を解析出来れば答えが分かりそうです。
と言ってもこの関数の中身の解読は静的解析ではきつかったので動的解析を実施します。

適当に以下のようにBreakPointを打ちます。
2-1.png
24c4の関数実行直後まで回します。
2-2.png
returnで帰ってきてますね。

ここら辺の関数のチェックが終わったので後々の解析のしやすさのために名前を適当につけておきます。
2-3.png
この関数を呼び出している関数がMainぽかったのでそこも変更しておきます。
2-4.png

Q3

'ShadowSteal' employs base64 and RC4 algorithms to safeguard the stolen data and its communication with the control server. Dive into its code to find the RC4 encryption key. What is it?
とりあえずBinary NinjaでCryptscan回しておきます。
cryptscan.png
なるほど、capaも回しておきます。
capa2.png
難読化てんこ盛りぽい。難読化解除するときはここら辺のアルゴリズムを意識して読んでいくとサクサク読めることがあります。

Main関数を見ていると以下の不審な文字列が見えます。
3-0.png
まず初めの\x11\xca\xb4\xdc\x9d\x8e\x9a\x8b\x80\xb2\xae\x8c\xab\xd7\x98\x94\xbc\x00を解読する。
最初のビットを反転させ、そのバイトと各バイトをXORしているようにみえます。
まぁ、実際に動かしてみてどんな結果になるか確認してみる。適当に近場のAddressにBPを仕込んでx64dbgを起動する。
3-1.png
Follow Dumpした部分にそれっぽい文字列が出てきている。

こいつの復号化のコードも作成してみた。

encrypted_data = bytearray(b"\x11\xca\xb4\xdc\x9d\x8e\x9a\x8b\x80\xb2\xae\x8c\xab\xd7\x98\x94\xbc\x00")
print(len(encrypted_data))

# 最初のバイトをビット反転
not_b0 = ~encrypted_data[0] & 0xFF  
print(hex(not_b0))

# 最初のバイトのビット反転結果で各バイトをXOR
decrypted_data = bytearray()
for byte in encrypted_data[:17]: 
    decrypted_data.append(byte ^ not_b0)


key = bytes(decrypted_data)
print("decrypt:", key)

回したら同じ文字列を確認できる。これが答えのKeyっぽい。
実際にこのKeyを使ってその下のBase64文字列をどう復号しているのか確認してみた。

※この問題の解答欄はブラウザ経由だと正解を受けつけてくれないのでHTTPリクエストベースでBurpなど使い、インターセプトした後に解答を修正する必要があります。

C2 address

47fc辺りのアドレスの関数を回した後に復号結果が確認できる。ここら辺にRC4の関数があるようだ(再帰呼び出し多すぎて探るの面倒w)
3-2.png
ここへアクセスするようだ。この復号化の後にWinHttp周りのwinapiが呼び出されてるので飛ばしてみた。
3-4.png
まぁもう応答しないですよね

Q4

In its data collection phase, 'ShadowSteal' compiles a report which, among other things, reveals its version to the attacker. This detail is crucial for our threat intelligence. What version of 'ShadowSteal' are you analyzing?
Mutexの特徴的な単語で調べると以下の解析ブログが見つかります。

ここにバージョンが載ってます。

Q5

Part of ShadowSteal's reconnaissance involves scanning for installed software, a task it accomplishes by querying a specific registry key. Identify the registry key it uses for this purpose.
Binary Ninjaでそれっぽいレジストリが引っかかるようにString検索かけます。
5.png
ありますね。

Q6

'ShadowSteal' captures a screenshot of the current operating window as part of its information-gathering process. Which function address is responsible for this action?
それっぽい単語を先ほど同様にString検索かけます。
6-1.png
このデータを参照している関数を調べます。
6-2.png
これが正解ではないので、この関数の参照を調べます。
6-3.png
GetDesktopWindowSelectObjectがあるのでこれっぽいですね。

Q7

Once 'ShadowSteal' has fulfilled its mission, it removes all traces of its existence from the infected system. What command does it execute to delete itself?
flossを回すとそれっぽい値が出てきます。

floss.png

Q8

For a comprehensive threat analysis, knowing where 'ShadowSteal' originates from is key. This includes the full path to its build folder on the attacker's computer. Can you provide this path?
適当にBinary Ninja眺めてると出てきます。
8-1.png
8-2.png
これっぽいですね。

最後に

x64dbgBinary Ninjaの動的解析と静的解析を行き来する、いいMalware解析問題でした。
本当はここからもっと詰めて解析していく形になるのですが、ここまでで問題は終了です。(この検体の関数多すぎ。)
Malware解析時間溶ける。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?