PracticalMalwareAnalysis Lab17-02.dll Full Analysis

Practical Malware Analysis (以後、PMA) Lab17-02.dll の詳細解析のメモ。

Lab 17-2 はアンチ・デバッグに焦点が当てられていたが、Lab17-02.dllには他にも多様な機能が実装されており、これらの機能の解析は読者への宿題として詳しくは触れられなかった。

PMAによると以下の機能を擁しているとのこと。

This malware is an extensive backdoor with considerable functionality, including keylogging, capturing audio and video, transferring files, acting as a proxy, retrieving system information, using a reverse command shell, injecting DLLs, and downloading and launching commands.

Lab17-02.dllの詳細な解析を試みてみた。

※自分は本職のマルウェア解析者ではないので、解析内容の正確性については留意されたし。

解析対象のファイルは以下の通り。

ファイル名ファイルの種類MD5ハッシュ値
Lab17-02.dll32ビット DLLD98B63A319AD92B6C3A8347ADE5A351A

解析に当たり、既知のアンチ・デバッグのコードは予めNOPした。(アンチ・デバッグについては後述する)

サマリ

Lab17-02.dllはXdoorバックドアまたはその亜種と思われる。

ファイルのメタデータにXdoorという文字列が散見された。

ファイルのInternalNameがX-doorcとなっている。

ファイルにxdoors_dというセクション名が存在している。

解析の結果、以下の機能を有していることが判明した。

  • 任意のプロセスへのDLLインジェクション
  • インストール先のシステム情報の収集
  • 実行中のプロセス情報の収集
  • HTTPやFTPを用いてのファイルのダウンロード及び実行
  • コマンドシェルの提供
  • リモートデスクトップの提供
  • スクリーンショットの撮影
  • マウスおよびキーボードの操作
  • 任意のプロセスの実行
  • ファイルシステムの操作
  • レジストリの操作
  • ビデオの録画
  • 音声の録音
  • 様々なカスタムDLLのロード及び実行。ロードされるDLLはDDOS攻撃を行うと推測されるもの、プロキシ化のモジュールと推測されるもの、キーロギングを行うと推測されるものなど、多岐に渡る。

Lab17-02.dllはWindowsサービスに自身をサービスDLLとして登録することで永続化を図る。

このマルウェアはバックドア・コマンドや各種メッセージなどが英語で記述されているのだが、文法や綴りの誤りが散見された (自分も人のことは言えないが) ことから、開発者は英語のネイティブ話者ではないことが推測できる。

エクスポート関数の解析

Lab17-02.dllには以下のエクスポート関数が実装されている。

  • InstallRT
  • InstallSA
  • InstallSB
  • PSLIST
  • ServiceMain
  • StartEXS
  • UninstallRT
  • UninstallSA
  • UninstallSB

InstallRT

マルウェア (Lab17-02.dll) をシステム・ディレクトリにコピーし、任意のプロセス (デフォルトではiexplore.exe)に対してLab17-02.dllをインジェクトする。

以下はrundll32.exeを使ってエクスポート関数を実行する際のコマンドの例。

rundll32.exe Lab17-02.dll,InstallRT <target process name>

InstallSA

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchostで定義されているWindowsサービスにマルウェアをサービスDLLとしてインストールすることができる。ただし、使用するWindowsサービスがすでにシステムに存在する場合はインストール出来ない。デフォルトではIrmonサービスが使用される。サービスの作成が完了すると、サービスの起動時にマルウェアがsvchost.exeに読み込まれることになる。

以下はrundll32.exeを使ってエクスポート関数を実行する際のコマンドの例。

rundll32.exe Lab17-02.dll,InstallSA <service name> <description>

サービス名に加えてdescription (サービスの説明文)を指定することが出来る。

InstallSB

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchostで定義されている既存のWindowsサービス (デフォルトではNtmsSvcサービス) のサービスDLLをマルウェアに置き換える。乗っ取られたWindowsサービスが起動すると、正規のサービスDLLではなく、マルウェアDLLがsvchost.exeに読み込まれることになる。

以下はrundll32.exeを使ってエクスポート関数を実行する際のコマンドの例。

rundll32.exe Lab17-02.dll,InstallSB <service name>

既存のWindowsサービスを乗っ取るに当たり、正規のサービスDLLのバックアップを作成する。例えば、TermServiceを乗っ取る場合、正規のサービスDLL C:\Windows\system32\termsrv.dllC:\Windows\system32\termsrv.dll.obakとしてコピーしておく。

続いてマルウェアDLL (Lab17-02.dll)を正規のサービスDLLと置き換える。上記のTermServiceの例だと、C:\Windows\system32\termsrv.dllC:\Windows\system32\dllcache\termsrv.dllが(ファイル名はtermsrv.dllのまま) Lab17-02.dllに差し替えられる。

また、サービス本来のServiceMain関数をServiceMainbakとしてバックアップした上で、ServiceMain関数をマルウェアのものと置き換える。

さらにマルウェアDLL (Lab17-02.dll) のコピーが_ox.dllとしてシステム・ディレクトリに作成される。

サービスの乗っ取りが完了すると、サービスを起動してマルウェアDLLをsvchost.exeに読み込ませる。

加えて、svchost.exeが読み込んでいるモジュールを列挙して_ox.dllがロードされているか確認し、ロードされていなければ改めてsvchost.exeに_ox.dllをインジェクトする。

乗っ取り対象のWindowsサービスのHKLM\SYSTEM\CurrentControlSet\Services\<service name>\ParametersレジストリキーにServiceMainbak というエントリが存在していたり、_ox.dll という名前のサービスDLLが存在する場合は、システムはすでに感染済みと判断し、乗っ取りを中断する。

PSLIST

引数に渡されたプロセスのプロセスID、プロセス名、スレッド数をxinstall.dllに書き込み、さらに結果をサーバーに送信する。引数なしで実行された場合は実行中の全てのプロセスのプロセスID、プロセス名、スレッド数をxinstall.dllに書き込む。ただし、この場合は結果はサーバーに送信されない。

以下はrundll32.exeを使ってエクスポート関数を実行する際のコマンドの例。

rundll32.exe Lab17-02.dll,PSLIST <process name>

試しにrundll32.exe Lab17-02.dll,PSLIST notepad.exeというコマンドを実行したところ、以下がxinstall.dllに書き込まれた。

ServiceMain

この関数はServiceMainに相当する。

StartEXS

引数として受け取ったサーバーのIPアドレスに対してネットワーク通信を行い、サーバーから送られたコマンドを実行する。

以下はrundll32.exeを使ってエクスポート関数を実行する際のコマンドの例。引数にIPアドレスとポート番号を指定する。IPアドレスとポート番号はコロンで区切られていなければならない。

rundll32.exe Lab17-02.dll,StartEXS <IPv4 address>:<port number>

サーバーから受け取るコマンドは以下の通り。

Command in hexCommand in AsciiAddress of subroutineDescription
0x4FO0x10007BAFスクリーンショットを撮り、サーバーに送信する。
0x50P0x100078ACスクリーンショットを撮り、圧縮した後、サーバーに送信する。
0x5E^0x100076D5サーバーからのレスポンスに応じてマウスまたはキーボードの操作を行う。詳細は後述。
0x5F_0x10007D35ディスプレイ画面を再描画する。

上記のうち、^コマンドについて、もう少し詳しく解説する。

マルウェアは^というコマンドをサーバーから受信すると、更なるコマンドをソケットから読み込み、受信したコマンドに応じてマウスやキーボードを操作する。

以下はサーバーからの受信データを元にマルウェアが処理を実行する際のswitch文のコードである。

受信データから0x52減算した時の差が14 (0x0E)以下だった場合、受信したコマンドに応じた処理を行う。

有効なコマンドは以下の通り。

Command in hexCommand in AsciiAddress of eventDescription
0x52R0x10007711マウスの左ボタンを押す。
0x53S0x10007723マウスの左ボタンを離す。
0x54T0x10007735マウスの右ボタンを押す。
0x55U0x10007747マウスの右ボタンを離す。
0x56V0x10007759マウスの真ん中のボタンを押す。
0x57W0x1000776Bマウスの真ん中のボタンを離す。
0x58X0x1000777Dマウスの左ボタンを押して離す。
0x59Y0x100077B1マウスの右ボタンを押して離す。
0x60Z0x100077E5マウスの真ん中のボタンを押して離す。
0x5B[0x10007826マウスを移動する。
0x5C\0x10007857キーを押す。どのキーを押すのかは不明。
0x5D]0x1000785Cキーを離す。どのキーを離すのかは不明。
0x5F_0x1000783BWindow Stationsを呼び出し元のプロセスに割り当てる。これによりマルウェア・プロセスがデスクトップやクリップボードにアクセスできるようになる。

UninstallRT

プロセス・インジェクションの解除を行う。

この関数は引数としてプロセス名を受け取る。指定されたプロセス名にマルウェア (Lab17-02.dll) がインジェクトされていた場合は、これを解除する。

関数を引数なしで実行した場合は、デフォルトでiexplore.exeからマルウェアDLLを解除する。

以下はrundll32.exeを使ってエクスポート関数を実行する際のコマンドの例。

rundll32.exe Lab17-02.dll,UninstallRT <target process>

試しに引数なしで関数を実行してみた。

rundll32.exe Lab17-02.dll,UninstallRT

すると、xinstall.logに以下のログが書き込まれた。

[04/02/22 10:50:18]
The PID Of Process 'iexplore.exe' is '0'
Process 'iexplore.exe' Not Found,Uninject Failed

上記のログより、iexplore.exeへのDLLインジェクションの解除を試みたものの、iexplore.exeが実行されていなかったため、失敗したことが伺える。

続いて、引数にsvchost.exeを指定して関数を実行してみた。

rundll32.exe Lab17-02.dll,UninstallRT svchost.exe

すると、xinstall.logに以下のログが書き込まれた。

[04/02/22 10:55:31]
The PID Of Process 'svchost.exe' is '568'
Uninject 'Lab17-02.dll' From Process 'svchost.exe' Failed

上記のログより、svchost.exe (プロセスID: 568)からLab17-02.dllを排除しようとしたものの、失敗したことが伺える。失敗の理由は、該当のsvchost.exeLab17-02.dllをロードしていなかったため。

UninstallSA

マルウェアDLLの永続化用のWindowsサービスをアンインストールする。

この関数は引数として受け取ったWindowsサービスをアンインストールする。関数を引数なしで実行した場合は、デフォルトでIrmon というWindowsサービスをアンインストールする。

以下はrundll32.exeを使ってエクスポート関数を実行する際のコマンドの例。

rundll32.exe Lab17-02.dll,UninstallSA <service name>

試しに引数なしで関数を実行してみた。

rundll32.exe Lab17-02.dll,UninstallSA

すると、xinstall.logに以下のログが書き込まれた。

[04/03/22 09:11:34]
OpenService(Irmon) error 1060

Irmon というサービスを開こうとしたことが伺える。しかし、該当のサービスがインストールされていなかったため、エラーとなった。

続いて、引数にNtmssvcというサービス名を指定して実行してみた。(事前にInstallSA関数を実行して該当サービスをインストール済み)

rundll32.exe Lab17-02.dll,UninstallSA Ntmssvc

すると、xinstall.logに以下のログが書き込まれた。

[04/03/22 09:22:10]
DeleteService(Ntmssvc) SUCCESS.

Ntmssvcサービスを削除したことが伺える。servicesレジストリキーを確認したところ、確かにNtmssvcサービスが削除されていた。

UninstallSB

マルウェアDLLによって乗っ取られたWindowsサービスを元に戻す。

この関数は引数として受け取ったWindowsサービスの復元を行う。具体的にはサービスDLLをマルウェアDLLから正規のDLLに戻し、ServiceMain関数もマルウェアのものから正規のものに戻す。関数を引数なしで実行した場合は、デフォルトでNtmsSvc というWindowsサービスの復元を試みる。

以下はrundll32.exeを使ってエクスポート関数を実行する際のコマンドの例。

rundll32.exe Lab17-02.dll,UninstallSB <service name>

試しに引数なしで関数を実行してみた。

rundll32.exe Lab17-02.dll,UninstallSB

すると、xinstall.logに以下のログが書き込まれた。

[04/03/22 09:43:00]
MyStopService() -> OpenService() Error.
RegOpenKeyEx(NtmsSvc) KEY_SET_VALUE error 2.

NtmsSvc というサービスを開こうとしたことが伺える。しかし、該当のサービスがインストールされていなかったため、エラーとなった。

続いて、引数にTermServiceというサービス名を指定して実行してみた。(事前にInstallSA関数やInstallSB関数を実行してTermServiceサービスにマルウェアDLLをインストールしようとしたが失敗した。)

すると、xinstall.logに以下のログが書き込まれた。

[04/03/22 09:47:45]
StopService 'TermService' Successfully
StartService 'TermService' Successfully
Service 'TermService' Do Not Need UnInstall.

TermServiceサービスを再起動し、TermServiceサービスのアンインストールは不要と判断したことが伺える。これは先述した通り、自分の解析環境ではTermServiceサービスの乗っ取りに失敗したため。

もしサービスが乗っ取られていた場合は、サービスDLLをマルウェアDLLから正規のDLLに戻し (正規のDLLは.obakという拡張子を付け足されてバックアップされている)、ServiceMain関数もマルウェアのものから正規のものに戻される (正規の関数はHKLM\SYSTEM\CurrentControlSet\Services\<service name>\ParametersレジストリキーのServiceMainbakというエントリーにバックアップされている)。

また、_ox.dll という名前のサービスDLLを見つけた場合も、正規のサービスDLLに差し替える。

DllEntryPointの解析

DllEntryPoint (0x1001516D)は、このマルウェアDLLのmain関数であり、プロセスがDLLをロードすると自動的に実行される。

サーバーから以下のコマンドを受け取って実行する。

CommandAddress of subroutineDescription
sethostinfo0x10004BCDレジストリキーHKLM\SOFTWARE\Microsoft\Windows\CurrentVersionHostInfoというエントリを作成する。HostInfoに設定する値はサーバーから送られる。値の型はstring型。
delhostinfo0x10004C23レジストリキーHKLM\SOFTWARE\Microsoft\Windows\CurrentVersionからHostInfoというエントリを削除する。
setgroupinfo0x10004C66レジストリキーHKLM\SOFTWARE\Microsoft\Windows\CurrentVersionGroupInfoというエントリを作成する。GroupInfoに設定する値はサーバーから送られる。値の型はstring型。
delgroupinfo0x10004CBCレジストリキーHKLM\SOFTWARE\Microsoft\Windows\CurrentVersionからGroupInfoというエントリを削除する。
exen0x10004A03任意のアプリケーション・プロセスを生成する。生成するプロセス名はサーバーから送られる。
exeh0x10004A03任意のアプリケーション・プロセスを生成する。生成するプロセス名はサーバーから送られる。
urln0x10004B01Internet Explorer (iexplore.exe) を起動する。この際、サーバーから指定された任意の引数をiexplore.exeに渡すことが出来る。
urlh0x10004B01Internet Explorer (iexplore.exe) を起動する。この際、サーバーから指定された任意の引数をiexplore.exeに渡すことが出来る。
suspendx0x1000F6B9マルウェアを実行しているスレッドを停止する。
uninstall+reboot0x1000F6DA, 0x10003B75マルウェアの永続化用のサービスをアンインストールし、システムを再起動するものと思われる。詳細は後述。
uninstall0x1000F6DAマルウェアの永続化用のサービスをアンインストールする。
startxcmd0x10010740サーバーに対してシェルを提供する。詳細は後述。
startxscreen0x1000834Eリモートデスクトップ・セッションを開始する。詳細は後述。
startxfile0x10009933ファイルシステムを操作する。詳細は後述。
startxreg0x1000A318レジストリを操作する。詳細は後述。
startxvideo0x1000ACE6ビデオ録画を開始する。フォーマットはMPEG-4またはDivX。
startxsound0x1000B6D8音声の録音を開始する。
startxprocess0x10006EE1プロセスを操作する。詳細は後述。
startxservices0x1000C251Windowsサービスを操作する。詳細は後述。
message0x10004738システムのシャットダウンや再起動を行うものと思われるが実際の挙動は不明。詳細は後述。
fgets0x1000399AHTTPまたはFTPを使用してサーバーから任意のファイルをダウンロードし、実行する。
reboot0x10003B75システムを再起動すると思われるが実際の挙動は不明。詳細は後述。
shutdown0x10003B75システムをシャットダウンすると思われるが実際の挙動は不明。詳細は後述。
logoff0x10003B75システムからログオフすると思われるが実際の挙動は不明。詳細は後述。
update0x100042DB既存のマルウェアDLLを新しいものにアップデートする。
plug_sys0x10001E88, 0x10001F14xsys.dllというDLLをロードしてPlug_Sys_Mainという関数を呼び出す。
plug_dev0x10001EB9, 0x10001F14xdev.dllというDLLをロードしてPlug_Dev_Mainという関数を呼び出す。
plug_acq0x10001EEA, 0x10001F14xacq.dllというDLLをロードしてPlug_Acq_Mainという関数を呼び出す。
plug_flood0x10001F3E, 0x1000202Dxflood.dllというDLLをロードしてPluG_Flood_Mainという関数を呼び出す。DDOS攻撃を行うためのモジュールか?
plug_stopflood0x10001FA0Plug_Flood_StopMainという関数を呼び出す。
plug_proxy0x10001FCC, 0x1000202Dxproxy.dllというDLLをロードしてPlug_Proxy_Mainという関数を呼び出す。プロキシ化のためのモジュールか?
plug_keylog0x10002005, 0x1000202Dxkey.dllというDLLをロードしてPlug_KeyLog_Mainという関数を呼び出す。キーロガーのモジュールか?

上記のうち、いくつかのコマンドの詳細を以下に記す。

uninstall+reboot

マルウェアの永続化用のサービスをアンインストールし、システムを再起動するものと思われる。ただし、このコマンドはマルウェア・サービスのアンインストール後にExitWindowsExを呼び出してシステムを操作するのだが、uFlagsの値がMSDNに記載されている値と一致しないため、実際にシステムを再起動するのかは不明。

startxcmd

サーバーに対してシェルを提供する。

以下のコマンドを受け取り実行する。実行結果はサーバーに送信される。

CommandAddress of commandDescription
quit0x100102C7シェルを終了する。
exit0x100102E5シェルを終了する。
cd0x10010302カレント・ディレクトリを変更する。
enmagic0x10010381システムが起動してからの経過時間をHEX形式で送信する。
idle0x100103DCシステムが最後に操作されてからの経過時間を取得して送信する。
uptime0x10010404システムが起動してからの経過時間を取得して送信する。
language0x10010428システムの言語設定を取得して送信する。
robotwork0x1001044CHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WorkTimeHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WorkTimes というレジストリ・エントリーの値を読み出して送信する。
mbase0x10010470マルウェアDLLにハードコードされているサーバーのホスト名、ドメイン名 (newsnews.practicalmalwareanalysis.com)、ポート番号 (80番ポート)などの情報をサーバーに送信する。
mhost0x10010497Masthostに関する設定情報をサーバーに送信する。Masthostが何を表しているのかは不明。
mmodule0x100104BEカレント・プロセスにロードされているモジュール名を取得して送信する。
minstall0x100104E5マルウェアのインストール形式を取得して送信する。InstallSA、InstallSB、InstallRSB、InstallPE、InstallRTのいずれのインストール形式が利用されたのか判別する。InstallSA、InstallSB、InstallRTの詳細は別項を参照。InstallRSBとInstallPEの詳細は不明。
inject0x1001050Ciexplore.exeまたは任意のプロセスに対してプロセス・インジェクションを行う。

サーバーからのレスポンスが上記のコマンドのいずれとも一致しなかった場合、サーバーから送られたデータをCreateProcessAで実行しようとする。

startxscreen

リモートデスクトップ・セッションを開始する。またサーバーから以下のコマンドを受け取って実行する。これらのコマンドはStartEXS関数で実行されるコマンドと同一である。

Command in hexCommand in AsciiAddress of subroutineDescription
0x4FO0x10007BAFスクリーンショットを撮り、サーバーに送信する。
0x50P0x100078ACスクリーンショットを撮り、圧縮した後、サーバーに送信する。
0x5E^
0x100076D5
サーバーからのレスポンスに応じてマウスまたはキーボードの操作を行う。詳細はStartEXSの項を参照。
0x5F_
0x10007D35
ディスプレイ画面を再描画する。
startxfile

サーバーから受け取ったコマンドに応じてファイルシステムを操作する。

Command in hexAddress of subroutineDescription
0x160x100087A2ドライブの種類、ボリュームやファイルシステムの情報、ディスクの空き容量を取得してサーバーに送信する。
0x170x1000894Eサーバーから指定されたファイルやディレクトリを列挙してサーバーに送信する。
0x1F, 0x25~0x28, 0x300x10008FC2サーバーから指定されたファイルを実行する。
0x190x10008AEEサーバーから指定されたファイルに対して書き込みを行う。サーバーから書き込み用のデータが送られなかったり、ファイルの書き込みに失敗した場合はファイルを削除する。
0x180x10008BEFサーバーから指定されたファイルの属性、タイムスタンプ、サイズなどのメタデータおよびファイルの中身をサーバーに送信する。
0x1A0x10008F62サーバーから指定されたディレクトリを作成する。
0x1D0x10009309サーバーから指定されたファイルまたはディレクトリを削除する。ディレクトリを指定された場合は、該当ディレクトリ以下の全てのファイルとサブディレクトリを削除する。
0x200x100093B6サーバーから指定されたファイルをコピーする。
0x1E, 0x210x1000941Dサーバーから指定されたファイルまたはディレクトリを移動する。
0x290x100095CCディレクトリを列挙してサーバーに送信する。ディレクトリのみを送信の対象としており、ファイルの情報は送信しない。またSystem Volume Information フォルダは無視する。
0x2A0x10009668利用可能なドライブの一覧を取得し、各ドライブのファイルやディレクトリの一覧を送信する。
0x240x10008EE8ディレクトリを列挙してサーバーに送信する。ディレクトリのみを送信の対象としており、ファイルの情報は送信しない。サブルーチン0x100095CCとは異なり、System Volume Information は無視されない。またディレクトリ情報の送信後、1234567890という文字列をサーバーに送信する。
0x2B0x100097A9サーバーから指定されたファイルまたはディレクトリを検索する。
0x2D0x1000981Aサーバーから指定されたファイルのタイムスタンプを取得する。
0x2E0x100098A9サーバーから指定されたファイルにタイムスタンプを設定する。
startxreg

サーバーから受け取ったコマンドに応じてレジストリを操作する。

Command in hexAddress of subroutineDescription
0x0F0x10009F73サーバーから指定されたレジストリキーを開く、または作成する。
0x100x1000A01Fサーバーから指定されたレジストリキーを削除する。
0x110x1000A18Dサーバーから指定されたレジストリキーに値を設定する。
0x120x1000A0BAサーバーから指定されたレジストリキーから値を取得する。
0x150x10009B92サーバーから指定されたレジストリキーから値を列挙したり取得したりする。
0x140x10009DEAサーバーから指定されたレジストリキーのサブキーを列挙する。
0x130x1000A268サーバーから指定されたレジストリキーから値を削除する。
startxprocess

サーバーから受け取ったコマンドに応じてプロセスを操作する。

Command in hexAddress of subroutineDescription
0xB40x100062E9カレント・プロセスにロードされているモジュール (DLLやEXE)を列挙する。
0xB50x100069E1サーバーから指定されたプロセスを終了する。
0xB60x1000692Aサーバーから指定されたプロセスにロードされているモジュールを列挙する。
0xBA0x10006AB5サーバーから指定されたプロセスに対して任意のプライオリティ・クラスを設定する。
0xB80x10006BD5 サーバーから指定されたプロセスのスレッドを停止する。
0xB90x10006CA7サーバーから指定されたプロセスのスレッドを再開する。
0xB70x10006D79システムのプロセッサの数、起動時刻や現在時刻、物理メモリ及び仮想メモリの使用状況等を取得する。
startxservices

サーバーから受け取ったコマンドに応じてWindowsサービスを操作する。

Command in hexAddress of subroutineDescription
0xBE0x1000B823サーバーから指定されたサービスの設定情報を取得する。
0xBF0x1000BB88サーバーから指定されたサービスを開始する。
0xC00x1000BC1Bサーバーから指定されたサービスを終了する。
0xC10x1000BCCDサーバーから指定されたサービスを停止する。
0xC80x1000BD79サーバーから指定されたサービスを再開する。
0xC20x1000BAD5サーバーから指定されたサービスを削除する。
0xC40x1000BF52サーバーから指定されたサービスの状態及び設定情報を取得する。
0xC50x1000C183サーバーから指定されたサービスを作成して起動する。
0xC30x1000BE25サーバーから指定されたサービスの起動条件を変更する。
サーバーからの応答データが1の場合はサービスの起動条件を自動実行 (システムの起動時に実行)に変更する。
サーバーからの応答データが2の場合はサービスの起動条件をマニュアル実行に変更する。
サーバーからの応答データが0の場合はサービスを無効にする。
message

サーバーから受けったコマンドに応じてシステムのシャットダウンや再起動を行うものと思われる。ただし、このmessageコマンドはExitWindowsExを呼び出してシステムを操作するのだが、uFlagsの値がMSDNに記載されている値と一致しないため、実際の挙動は不明。

CommandDescription
-rebootシステムを再起動する?
-shutdownシステムをシャットダウンする?
-stopWindow station を閉じる。
-erroメッセージボックスを生成した後、デスクトップ・セッションを終了する。
-warnメッセージボックスを生成した後、デスクトップ・セッションを終了する。
reboot

システムを再起動するものと思われる。ただし、このコマンドはExitWindowsExを呼び出してシステムを操作するのだが、uFlagsの値がMSDNに記載されている値と一致しないため、実際の挙動は不明。

shutdown

システムをシャットダウンするものと思われる。ただし、このコマンドはExitWindowsExを呼び出してシステムを操作するのだが、uFlagsの値がMSDNに記載されている値と一致しないため、実際の挙動は不明。

logoff

システムからログオフするものと思われる。ただし、このコマンドはExitWindowsExを呼び出してシステムを操作するのだが、uFlagsの値がMSDNに記載されている値と一致しないため、実際の挙動は不明。

アンチ・デバッグ

Lab17-02.dllには解析を阻害するためのアンチ・デバッグのコードが実装されていた。

以下は解析の過程で発見したアンチ・デバッグの解説。

VMの検知

InstallRT、InstallSA、InstallSB、それぞれのエクスポート関数内でサブルーチン0x10006196が呼び出されていた。このサブルーチンはVMwareがホストOS - ゲストOS間の通信に使用する仮想I/Oポートの状態を確認することでVMを検知する。

VMを検知した場合はFound Virtual Machine,Install Cancel.というメッセージをxinstall.logに書き込み、vmselfdel.batというバッチファイルを作成・実行してLab17-02.dllを削除する。vmselfdel.batも実行後に削除される。

rundll32.exe及びrundll64.exeの検知

サブルーチン0x10001000にてrundll32.exe及びrundll64.exeを検知するコードを発見した。このサブルーチンはシステムで実行中のプロセスを列挙し、 rundll32.exeまたはrundll64.exeを発見した場合はEAXに1という戻り値をセットする。

サブルーチン0x10001000は、Lab17-02.dllがサーバーとのHTTP通信 (サブルーチン0x10001074)、FTP通信 (サブルーチン0x10001365)、Command & Control通信 (サブルーチン0x10001656)を行う際に先んじて呼び出され、システムで実行中のプロセスの中にrundll32.exeまたはrundll64.exeを検知した場合はサーバーとの通信を行わない。

rundll32.exeまたはrundll64.exeによるマルウェアDLLのデバッグ行為を検知することが目的と思われる。

ネットワーク通信の解析

PMAによるとLab17-02.dllはエンコーディングされた通信を生成する模様。

To fully analyze this malware, analyze its export functions and static configuration options before focusing on the backdoor network communication capability. See if you can write a script to decode network traffic generated by this malware.

自分の解析ではStartEXSを引数つきで実行した場合のみ、ネットワーク通信が発生した。

以下はコマンドの例。

Lab17-02.dll,StartEXS 8.8.8.8:80

以下は生成された通信のキャプチャ。

そのほかの通信は生成出来ず、ネットワーク通信の詳細解析には至らなかった。

Leave a Reply

Your email address will not be published.