はじめに
GWに何か解析を行おうと思い、適当にAgentTeslaの検体を入手して解析することにした。
AgentTeslaにした理由は.NETやVisual Basicであるので解析しやすいのではないかと思った次第。解析初心者なのでプロのブログは大いに頼ってます。
Stage1 ISO Image File
今回入手した検体はイメージファイルでVT投稿済みのもの。
VTでのFirst Submissionが2020/05/04
MD5 2aaef6c6296b5926c365b6f962764712 SHA-1 6b917df0d09349f65e7f695e4c8fd4e1c4db166d SHA-256 821bcfd2ee41f2b83c62d2dc65427002cd7e6a725c3d660efc0178e17f8e52db Vhash 0a47786bf1719395287a547ecd46178e SSDEEP 6144:N6x0K7aqFEI4LtzsBjhsP+lK0B/9qyEme7d/0yVIdnd5AAMLOeDi2QkrDJAtX9iJ:N6yxqFSsB+GwbmsF2dxKiw9M File type Macintosh Disk Image Magic UDF filesystem data (version 1.5) 'DESKTOP ' File size 1.19 MB (1245184 bytes)
dieで見てみると普通のISO Imageで、マウントするとExeのファイルが見つかる。
Stage2 DHL_Mar 2020 at 1.10_9B929_PDF[.]exe
Wordアイコンに偽造したexeファイル。
MD5 c13fc10e4aa37fa3e976b96c0f1a0dc2 SHA-1 e4846b2b6fd0e86d01a31d8f2725b685f5fea3a4 SHA-256 512081dd7ccc20821c4407ad3bf16a38a0ac1168515f45e34417a353b9044293 Vhash 2450367555110071f253020 Authentihash 0896c8d5794b063fe12f312a6a968f389bc000b7212db64e3d40fe75982c05c7 Imphash f34d5f2d4577ed6d9ceec516c1f5a744 SSDEEP 6144:T6x0K7aqFEI4LtzsBjhsP+lK0B/9qyEme7d/0yVIdnd5AAMLOeDi2QkrDJAtX9iJ:T6yxqFSsB+GwbmsF2dxKiw9M File type Win32 EXE Magic PE32 executable for MS Windows (GUI) Intel 80386 32-bit Mono/.Net assembly File size 398.50 KB (408064 bytes) PEiD packer .NET executable
VTのFirst Submissionは2020/05/04
dieで見ると、.NET executableの実行ファイルであることがわかるので、dnspyで解析する。
dnspyで見てみるとResourceに画像ファイルがあることがわかり、このファイル名がf948c.pngというファイル名なので、このファイル名を利用しているところを探す。
xm8cgbhuvpdnjfika()
関数でその文字列が見つかるのでそのあたりを見てみると
怪しい文字列とそれを復号しているのが読みとれる。最終的にBase64しているところが少し気になるので復号がめんどくさいのでデバッグモードで実行してBase64される前にどんなものがあるのかを見てみる。
ここの文を読むとAssemblyのLoadメソッドを呼び出しているように見える。 https://docs.microsoft.com/ja-jp/dotnet/api/system.reflection.assembly.load?view=netcore-3.1
base64をデコードし、ファイルに書き出してdieに読み込ませると、Smart Assemblyで保護された.NETのプログラムであることがわかる。
それ以降のコードを読んでみてもその部分が実行されている気配がない(コードの中にはMSのAccessのファイルを操作するっぽいコードはあるが)ので、書き出したファイルを調査する。
Stage3 CoreFunctions.dll
Stage2で書き出したファイルをdieで見てみると次のようになる。
smart assembly protectorと出る、ggrとどうやら難読化のソフトウェアを使っているらしい。
deobufusicatorでggrとd4dotというソフトウェアが出てくるので、これを使って難読化解除を試みる。
いくつかエラーがでるが無事難読化解除成功し、dnspyで読み込むことができた。
この実行ファイルのMain関数を見ると4つの引数を取得し実行する模様。これはStage2で読み込んでいる引数であり、
それぞれbd19e.resources
,f948c.png
であり、Stage2のResourceにあるファイルと同一であることがわかる。
そして次の行で読み込んでいることから画像自体を読み込んで実行する、Cisco Talosのブログにある方式と同一であると読める。
画像内を読み込んで処理をしてペイロード化し、Stage2と同様の手法で実行を行おうとしていることが読める。
具体的には画像内のbitmapを読み込み、Stage2で渡していた引数のうちBklOZ2wix
を鍵としてXORしている。一部無駄なデータを含めたりしている。
無理やり実行して楽しようと思ったらできなかったのであきらめてスクリプトを書くことにする。
ということでC#をめったに読まないので苦戦、そして汚いPythonコードですが解読するコードがこちら
from PIL import Image from hexdump import * import struct img = Image.open("f948c.png") pixels = img.load() pixList =[] width, height = img.size # Reverse Function for x in range(width): for y in range(height): cpixel = list(pixels[x,y]) a = [cpixel[3]] cpixel = cpixel[:-1] cpixel.reverse() cpixel += a for c in cpixel: pixList.append(struct.pack("B",c)) tmp = b'' for c in pixList[0:4]: tmp += c size = int.from_bytes(tmp,'little') payload=pixList[4:size+4] # array2 = payload # XOR_DEC function key=b"BklOZ2wix" d = int.from_bytes(payload[len(payload)-1],'little') ^ 112 dkey=b"" for i in range(len(key)): dkey += struct.pack(">h",key[i]) exe_bytes = [] for i in range(len(payload) -1 ): exe_bytes.append(((int.from_bytes(payload[i],'little')) ^ d ^ int(dkey[i % len(key)])).to_bytes(1,'little') ) with open("mal.exe",'wb') as f: for d in exe_bytes: f.write(d)
Stage4 ReZer0V4.exe
書き出したファイルを解析する。VTへの投稿はなし
MD5 0a758b06d7dc310482a2a66b65556bb3 SHA1 1a8807edd499bbedae9236ef8fd9eb8d90d2934d SHA256 2de6d0573556d5d7cadbbe4d7f376b738a20a810ada19c48bf73a508cf60526b
PEファイルをdieで確認すると当然のごとく.NETなのでこれもdnspyで見てみる。
exeのファイル名がReZer0、オタクかな
この単語で検索するとReZe0V2というのがAny.runで見つかる、VTにも同様の検体がある。 このReZe0V2だがFirst Submissionが2020-04-03, Creation Timeが2020-03-07のことから比較的短時間でアップデートされていることが見て取れる。
この検体の名前がV4だとするとVはVersionと私は考えます。
OSINTするとこういうブログも見つかる。
この記事はここまで、GWの成果としてまとめるために中途半端だが解析結果を記載した。
遅くなったがここから継続、ReZer0V4.exeも解析検知除けが含まれているが、挙動としては上のブログにある、ReZer0V2.exeと同じであり、さらに実行するペイロードを含んでいる。
デバッグモードで動かしたり、コードを読んでいくとFig8に怪しいペイロードが格納されるのがわかる。で後はクロスリファレンスを参照するとFig9でアセンブリが実行されると思われる。
このバイトを書き出し、さらに解析を続ける。
Stage5 ReZer0V4から実行されるペイロード
PIEで見てみると、特に難読化はされていない.NETアプリケーションとわかるので、再びdnSpyで見てみる。
ではReZer0V4は何を送っているのかを解析する。
ReZer0V2と同じくsmtpのメソッドがあり、このメソッドは呼び出されているため、このメソッドによって呼び出されるものを確認すればそれが窃取する情報となる。
smtpのメソッド前はいろんなファイルやレジストリを探している。
Fig11のList.AddRange(qbc.bg());のような形式のところである。関数内で情報を取得し、それをリストに格納している。
その情報でggrと下記の情報が出てくる。
指定のファイルがないと送信する部分にたどり着かないため、ダミーファイルを作成したが、ダミーファイル自体も正しいファイルが必要なため再現には時間がかかるためスキップした。
それっぽい送信先を探すとmarella[@]copyrap.com
というアドレスが見つかりここが送信先となる模様。
結論、ReZer0V4はブラウザの機密情報を窃取して送信するスパイウェアらしいという私の結論になります。実際の送信部分を確認できなかったのでらしい
と付けました。余裕があればダミーファイルを実際のそれっぽいファイルに仕立てれば出そう。
補足
ReZer0V4ではnetshを使ったWlan Profileの情報窃取はないのかをブログの内容をもとに探す。Processクラスを参照しているメソッドを探し、そこからどういう動きかを確認すると、malwarebyteのブログにあるようにnetshを呼び出す部分が見つかる。
この関数は2回呼び出され、一回目は引数としてwlan show profile
を、二回目はwlan show rofile name = $nus key = clear
をとり呼び出される。
また1回目と2回目を呼び出す間に、All User Profile
という文字を生成し、split関数を使ってることから、wlanの情報を窃取する関数はReZer0V2と同じく存在していることが確認できた。ただしクロスリファレンスで見たところ呼び出されるところがない。
マスタとなるファイルがあり、それをアレンジして新しいペイロードを生成していると予測される。
IOC
All hashes is MD5.
- FileImage
- 2aaef6c6296b5926c365b6f962764712
- AgentTesla
- c13fc10e4aa37fa3e976b96c0f1a0dc2
- First Payload
- 30ad5a86a53d39c6286d8c54f3f2cc1a (Obfusecated)
- 363c33a3d1674d82395de8b3fe86c2d0 (Defusecated)
- Rezer0V4
- 0a758b06d7dc310482a2a66b65556bb3
Payload contains in ReZer0V4
- 6d81a336c7ab80a01a63b6b982a40046
Mail:
- marella[@]copyrap.com
参考
How Analysing an AgentTesla Could Lead To Attackers Inbox - Part I | MrT4ntr4’s Blog
New AgentTesla variant steals WiFi credentials - Malwarebytes Labs | Malwarebytes Labs
https://malpedia.caad.fkie.fraunhofer.de/details/win.agent_tesla