初心者による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

Malware Traffic Analysis Exercise -STEELCOFFEEを解く

はじめに

malware-traffic-analysis.netで公開されているExerciseを解いてみたので、その解法を書きます。答え自体は下記のサイトにあるので解く手順を記載した感じです。

間違ってアクセスしないようにローカルアドレス以外のIPやドメインは意図的に空白をいれています。

またこのブログを見て悪意のあるドメインにアクセスしたことによって生じた結果について、私は一切責任を負いません。

またこういうのを書くのは初めてなので、何かまずいことあれば指摘いただけると幸いです。

問題ファイルは下記サイトにあるので、ぜひ自力で解いてみてください。

Malware-Traffic-Analysis.net - 2020-04-24 - Traffic analysis exercise - SteelCoffee

前提と問題

pcapファイルの前提となる環境と今回の問題についてです。

シナリオ

  • LANセグメント: 10.0.0.0/24 (10.0.0.0 through 10.0.0.255)
  • ドメイン: steelcoffee.net
  • ドメインコントローラのIP: 10.0.0.10
  • ドメインコントローラのPC名: SteelCoffee-DC
  • LANのゲートウェイ: 10.0.0.1
  • LANのブロードキャストアドレス: 10.0.0.255

問題

問題は全部で3つです。

  • Windowsホストの二つのPCはなにか、そしてそれに関連ずいているユーザアカウント名は何か?
  • 二つのPCのうち侵害されたPCはどちらか
  • PCを侵害したマルウェアの種類は何か。

解答

問1

渡されたpcapファイルをWiresharkで起動し、[メニュー] > [統計] > [解決したアドレス] を選択します。表示されたウィンドウのうちドメイン名を解決している部分までをコピーし、適当なテキストエディタに張り付けます。 テキストエディタの検索機能を用いて「10.0.0」を検索すると3件引っかかります。

10.0.0.167   DESKTOP-GRIONXA.steelcoffee.net
10.0.0.10        SteelCoffee-DC.steelcoffee.net
10.0.0.149  DESKTOP-C10SKPY.steelcoffee.net

このうち、10.0.0.10のものはシナリオにあるドメインコントローラなので‘Windowsホストの2つは、DESKTOP-GRIONXADESKTOP-C10SKPYになります。

続いてこのホストに結び付くユーザアカウント名を調べます。今度はWiresharkのフィルタでkerberos.CNameStringと入力し、フィルタをかけます。

フィルタをかけた後、下の画像にあるように、req-bodyのcname stringにユーザアカウント名があります。これを2つのホストを調べると答えになります。

f:id:kataware8136:20200427224449p:plain

  • GRIONXA:elmer.oben
  • C10SKPY:alyssa.fitzgerald

問2

問題にある画像のほうのファイルを見てみます。Sguilのキャプチャ画面のようです。

イベントIDを見ていくとET Malware Windows executable sent when remote host claims to send an image M3とあります。

f:id:kataware8136:20200427230124p:plain

これを見ると侵害を受けたのは10.0.0.167のように見えます。確実にするために実際にダウンロードされたマルウェアを見つけます。

画像からIPが119. 31. 234. 40でポート51132を使用していることから、Wiresharkのフィルタにip.addr == 119. 31. 234. 40 && tcp.port == 51132と入力することで通信を抽出します。 ついでに解決したアドレスからドメインalphapioneer. comを割り出しておきます。

/GET /spool/8888.pngというパケットが見えるので、このパケットを選択し、右クリック > [追跡] > [TCPストリーム] で見てみると、png画像をダウンロードしていますが、This program cannot be run in DOS modeという実行ファイル特有の文字が見えます。

f:id:kataware8136:20200427230856p:plain

このファイルが怪しいので、Wiresharkのメニューから [ファイル] > [オブジェクトをエクスポート] > [HTTP] を選択し、ホスト名alphapioneer. comのパケット番号7388のオブジェクトをエクスポートします。

このファイルのハッシュ値を取得すると次のようになります。

MD5: 2cf20a1dd3693b996de4a559f1067850
SHA1: 6483bb40a7e3817f93a3ae95c6caea01715a4946
SHA256: f6210da7865e00351c0e79464a1ba14a8ecc59dd79f650f2ff76f1697f6807b1

上のMD5ハッシュ値virustotalで検索すると、47エンジンで検知したと出るので、このファイルがマルウェア、侵害されたのは10.0.0.167のホストということになります。

VTに上記のMD5で検索した結果

問3

VTで検索するとClamAVでQakbot、F-SecureでQbot、MicrosoftもQbot、Trend MicroでQBOT、SophosでQbotなのでこのマルウェアはQakbot(Qbot)の種類になることが予想できます。

Qakbot(Qbot)とは

以上で解答は終わりですが、解析初心者なのでQakbotについてまとめました。

まとめた元は下記のciscotalosのブログになるので、英語得意な方はどうぞ

blog.talosintelligence.com

Qbotはバンキング型のトロイの木馬で、2008年から観測されています。Qbotは銀行の資格情報をメインターゲットとしています。Qbotの主な感染経路はブラウザのエクスプロイトキットになります。QbotはFTPの資格情報を盗むことやSMBを用いてネットワーク全体に広がることもあります。またQbotは自身でアップデートを行います。

Qbotのまとめを読んで改めてpcapを見る。

ここからはどうでもいい考察になるので私の所感が気になる人は読んでください。ポエムです。

ブラウザのエクスプロイトキットが感染経路とあります。正規サイトを乗っ取ってマルウェアを配布するのかなと思い、問2のときにファイルのエクスポートで似たようなクエリが別のドメインに対して投げられているのを思い出して見直してみました。

見てみると一番上にあるドメインに対しても同じリクエストを投げています。ここで302リダイレクトを返してるのでここからリダイレクトしてマルウェアをホストしているサイトに飛ばしたのかなと思いました。が、これは普通にページがないのでトップページに戻される動きでした。

f:id:kataware8136:20200427233750p:plain

少し興味を持ってさらに調べます。atn24liveGoogle検索すると「もしかして: atm 24 live」とでます。なのでATMが24時間動いているところを検索しようとした人が誤ってタイポすることを狙ったのか、もしくは似たようなドメインとしてatn24live. com. cutestat. comというサイトがあるのでここにアクセスしようとしたユーザのタイポを狙ったのかというところです。

と考察したのですが、検索結果の一覧にANY.RUNのレポートがあるので見てみるとMalicious Activityとありました。私はPROライセンスは持っていないので、THREATSは見れなかったですが悪性と判断されているので、この問題のキャプチャ(およびany.run)では配布サーバとして生きていなかったのかと考えればいいのかなと思いました。

では逆にもともとのドメインは何なのかと思い、上の検索があったのならany.runでみれば安全ではと思い、検索すると見つかる。ANY.RUNのレポート

中身を見るとドメイン名がmalicious判定されている。正規サイトの改ざんではないのかなと思ったところで、OSINTはあんまり経験ないのでここまでにしておく。いろいろ楽しかったです。

ハニポのログ解析-20200105to20200113

はじめに

2020年になり一度からしたハニポを再開しモチベ維持のためブログを書くことにした 以上、次から解析結果

アクセス元と総数について

総アクセス数:404件

トップ3が下のような感じになる。 こういう時にどうするのがベストなのか不明なのでマスクする

IPアドレス 回数
xxx.37.213.98 60
xxx.101.0.209 21
xxx.186.19.221 11

多かった上二つはもうちょい解析する。 便宜上、上から①と②と③で使い分けることにする

Aguseにかけてみる

Aguseはブラックリスト判定を持つためその結果がどうなったかを記載する

IP 判定
中国 2つでCAUTION判定
ロシア 2つでCAUTION判定
中国 2つでCAUTION判定

CAUTION判定が出たものはいずれも同じブラックリスト(The spamhaus project,CBL)で判定された。

トップのアクセスのペイロードを確認する

基本的にはGETアクセスのためbotであると思われるが、一部長いペイロードがあり、それを確認するとApache Struts2への攻撃であった。

GET //#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)?(#req=@org.apache.struts2.ServletActionContext@getRequest(),#wr=#context[#parameters.obj[0]].getWriter(),#wr.println(#req.getRealPath(#parameters.pp[0])),#wr.flush(),#wr.close()):xx.toString.json?&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&pp=/ 
HTTP/1.1
Host: xxx.xxx.xxx.xxx
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.12.4
Content-type: application/x-www-form-urlencoded

Struts2でOGNLを用いた脆弱性は調べてみるとCVE-2016-3081やCVE-2017-5638,CVE-2018-11776があります。 CVE-2017-5638はContent-Typeにペイロードをいれ、CVE-201-11776はstrut2-showcaseがターゲットになるため これはCVE-2016-3081の攻撃とみていいと思う。

ggってみると下記の記事に出くわす。下記の記事のファイルアップロードと似ている。

Struts2 vulnerability analysis and how to prevent _java in advance

疲れたのでここまで。