初心者によるAgentTeslaの解析

はじめに

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で解析する。

f:id:kataware8136:20200506233521p:plain
Fig1 Exeをdieで見た結果

dnspyで見てみるとResourceに画像ファイルがあることがわかり、このファイル名がf948c.pngというファイル名なので、このファイル名を利用しているところを探す。

f:id:kataware8136:20200506233914p:plain
Fig2 怪しい関数

xm8cgbhuvpdnjfika()関数でその文字列が見つかるのでそのあたりを見てみると

f:id:kataware8136:20200506234044p:plain
Fig3 Base64復号と新たなバイナリロードの部分

怪しい文字列とそれを復号しているのが読みとれる。最終的に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で見てみると次のようになる。

f:id:kataware8136:20200506234245p:plain
Fig4 書き出したファイルをdieで読み込ませた結果

smart assembly protectorと出る、ggrとどうやら難読化のソフトウェアを使っているらしい。

deobufusicatorでggrとd4dotというソフトウェアが出てくるので、これを使って難読化解除を試みる。

いくつかエラーがでるが無事難読化解除成功し、dnspyで読み込むことができた。

この実行ファイルのMain関数を見ると4つの引数を取得し実行する模様。これはStage2で読み込んでいる引数であり、 それぞれbd19e.resources,f948c.pngであり、Stage2のResourceにあるファイルと同一であることがわかる。

f:id:kataware8136:20200506234603p:plain
Fig5 Stage3のメインの実行部分

そして次の行で読み込んでいることから画像自体を読み込んで実行する、Cisco Talosのブログにある方式と同一であると読める。

gblogs.cisco.com

画像内を読み込んで処理をしてペイロード化し、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で見てみる。

f:id:kataware8136:20200506235919p:plain
Fig6 ReZer0V4

exeのファイル名がReZer0、オタクかな

f:id:kataware8136:20200507000042p:plain
Fig7 dnspyでの確認結果

この単語で検索するとReZe0V2というのがAny.runで見つかる、VTにも同様の検体がある。 このReZe0V2だがFirst Submissionが2020-04-03, Creation Timeが2020-03-07のことから比較的短時間でアップデートされていることが見て取れる。

この検体の名前がV4だとするとVはVersionと私は考えます。

OSINTするとこういうブログも見つかる。

blog.malwarebytes.com

この記事はここまで、GWの成果としてまとめるために中途半端だが解析結果を記載した。

遅くなったがここから継続、ReZer0V4.exeも解析検知除けが含まれているが、挙動としては上のブログにある、ReZer0V2.exeと同じであり、さらに実行するペイロードを含んでいる。

デバッグモードで動かしたり、コードを読んでいくとFig8に怪しいペイロードが格納されるのがわかる。で後はクロスリファレンスを参照するとFig9でアセンブリが実行されると思われる。

f:id:kataware8136:20200517005419p:plain
Fig8 ReZer0V4に含まれるペイロード

f:id:kataware8136:20200517005459p:plain
Fig9 ペイロードの実行部分

このバイトを書き出し、さらに解析を続ける。

Stage5 ReZer0V4から実行されるペイロード

PIEで見てみると、特に難読化はされていない.NETアプリケーションとわかるので、再びdnSpyで見てみる。

f:id:kataware8136:20200517005944p:plain
Fig10 ReZer0V4に含まれるペイロードのPIE

ではReZer0V4は何を送っているのかを解析する。

ReZer0V2と同じくsmtpのメソッドがあり、このメソッドは呼び出されているため、このメソッドによって呼び出されるものを確認すればそれが窃取する情報となる。

smtpのメソッド前はいろんなファイルやレジストリを探している。

f:id:kataware8136:20200523203057p:plain
Fig11 データ盗むところ

Fig11のList.AddRange(qbc.bg());のような形式のところである。関数内で情報を取得し、それをリストに格納している。

その情報でggrと下記の情報が出てくる。

InfoSec Handlers Diary Blog

指定のファイルがないと送信する部分にたどり着かないため、ダミーファイルを作成したが、ダミーファイル自体も正しいファイルが必要なため再現には時間がかかるためスキップした。

最後Smtp送信先はFig12にあった。

f:id:kataware8136:20200523203251p:plain
Fig12 SMTPの送信部分

それっぽい送信先を探すとmarella[@]copyrap.comというアドレスが見つかりここが送信先となる模様。

結論、ReZer0V4はブラウザの機密情報を窃取して送信するスパイウェアらしいという私の結論になります。実際の送信部分を確認できなかったのでらしいと付けました。余裕があればダミーファイルを実際のそれっぽいファイルに仕立てれば出そう。

補足

ReZer0V4ではnetshを使ったWlan Profileの情報窃取はないのかをブログの内容をもとに探す。Processクラスを参照しているメソッドを探し、そこからどういう動きかを確認すると、malwarebyteのブログにあるようにnetshを呼び出す部分が見つかる。

f:id:kataware8136:20200517011229p:plain
Fig13 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