Shifuは2015年に初めて発見されたバンキング型トロイの木馬であり、Zeusが使用している手法を取り込んだShizソースコードに基づいています。攻撃者はShifuを使用して世界中のオンライン バンキングのWebサイトに関する資格情報を盗み出します。標的となったWebサイトは当初ロシアのサイトでしたが、その後英国、イタリアなどのサイトに及んでいます。

Palo Alto NetworksのUnit 42のリサーチにより、Shifuの作成者が2016年にShifuを進化させたことが分かっています。また、Microsoft Windowsシステムを感染させ、検出を回避するための複数の新手法がShifuに取り入れられたことも分かっています。新手法の一部として以下のものがあります。

Microsoft Windowsの権限昇格の脆弱性であるCVE-2016-0167をエクスプロイトしてSYSTEMレベルの権限を取得。以前のバージョンのShifuはCVE-2015-0003をエクスプロイトして同じ目的を果たしました。

ホストが既にShifuに感染しているか確認するために、以前のバージョンで使用されていたミューテックスに加え、Windowsのアトムを使用。

関数呼び出しがマルウェアのアナリストに見つからないようにするため、“push-calc-ret”方式のAPI難読化を利用。

代替となるNamecoinの.bitドメインの使用

Shifuと他のツールとの間の新たな関連も突き止めましたが、これらの関連から、Shifuが単純にShizトロイの木馬に依拠したものではなくShizの最新の進化版であることはほぼ確実であると思われます。

本レポートの主たる目的は、他のマルウェアを分析しているが将来このトロイの木馬に遭遇する可能性のあるアナリストに、Shifuの新機能を紹介することです。以下のセクションでこの新機能について概要をお伝えします。終わりの方の付録にはShifuの機能の全般に関する技術的な詳細情報があります。

Shifuにおける新たな開発および機能

本分析で検討するShifuは数段階のペイロードから構成されており、2016年6月にコンパイルされました。以下の図は、実行後に復号化処理を受ける各種のファイルが初期ローダーに含まれている様子を表しています。

 

図1Shifuのファイル構造

最初の難読化済みローダー(x86版exe)には第2段階の暗号化済みインジェクター(x86版exe)が含まれています。最初のローダーは、後で次のレイヤー用にVirtualAlloc()によりメモリを割り当てることで、復号化用に3つのレイヤーを使用します。第2段階のインジェクターがメモリの中に復号化されると、元のローダー プロセスがこれで上書きされます。次にセクション フラグが調整され、IATアドレスが解決されます。最後の復号化レイヤーは第2段階のインジェクターの入り口点にジャンプします。

第2段階のインジェクターにはCVE-2016-0167用のエクスプロイトが2つ(x86/x64)含まれていますが、これらのコンパイル タイム スタンプは2016年2月です。このコンパイルの時点において、この脆弱性に対するパッチはまだ入手可能ではありませんでした。しかし、マルウェアのコンパイル タイム スタンプは2016年6月です。このことから、Shifuのこのバージョンの背後にいる人物たちがゼロデイ エクスプロイトを当時入手できる状態であったか、あるいはその後に入手したことが伺えると言ってもいいでしょう。エクスプロイトは、ロー ディスク ファイルをメモリにただコピーするだけのことを可能にする興味深い手法を使用しています。このファイルをメモリ内で実行可能なものにするため、2つのバージョンのエクスプロイトの末尾にPEオーバーレイとして追加された、特別仕様のPEローダー シェルコードを使います。このシェルコードは、必要となるあらゆる調整を行って適切な実行可能なメモリ イメージを取得し、エクスプロイトを実行します。そのようにすれば、ファイルをメモリ バッファーにコピーするだけでよく、あとは実行をシェルコードにまかせる必要があります。

また、私たちはスタンドアロン版(x86/64)であるエクスプロイトの別の亜種も複数発見しましたが、Shifuにおけるのと同様にインジェクターに埋め込まれたバージョンも発見しました。さらに、Vawtrakというバージョンを突き止めました。これには、コンパイル タイム スタンプによれば、2015年11月にまで遡る古いバージョンのエクスプロイトが含まれています。このVawtrakサンプル自身のコンパイル タイム スタンプは2016年1月ですから、このエクスプロイトを利用するマルウェアとしては私たちが知っている事実上最初のものです。

第2段階のインジェクターには、以前のバージョンと類似の分析対策トリックがいくつか含まれています。2個のコマンド ライン引数も含まれており、これらの引数にはマルウェアがまだ開発中のものであることを示す機能が備わっています。さらに、第2段階のインジェクターはアトムを使用してシステムが既に感染しているか確認します。つまり、今日の大部分のマルウェアがミューテックスを使っていますが、それとは違う方法です。アトムの使用は新しい手法ではないものの、まだそれほど広く普及はしていません。

メイン ペイロードは暗号化され、第2段階のインジェクターの.tlsセクション内に圧縮された状態で置かれます。これはまず復号化され、ついでaPLib圧縮ライブラリを使って解凍されます。永続性の方法として、メイン ペイロードは最初のローダーをAppDataフォルダーにコピーし、それを指し示すJscriptファイルをStartupフォルダー内に作成します。第2段階のインジェクターはメイン ペイロードをsvchostのx86版インスタンス内部にインジェクトし、そのAPI関数呼び出しに対して難読化手法を使ってパッチを当ててマルウェアに関する静的解析および動的解析をいっそう困難なものにします。

以前のバージョンのものに比べ、メイン ペイロードには更新がいくつか含まれています。その中には、被害者のシステム、ブラウザの標的のリスト、およびボット コマンドに関して検索を行うための文字列が含まれています。メイン ペイロードは.bitのトップレベル ドメインを使用してC&Cサーバと連絡を取ります。ドメイン名、ユーザー エージェント文字列、およびURL引数は改造されたRC4暗号化アルゴリズムを用いて暗号化されています。ドメイン名から、攻撃者がウクライナ在住であるか、あるいはウクライナで育ったかのいずれかである可能性が伺えます。

あいにく分析時にはC&Cサーバがどのコマンドに対しても応答しなかったため、標的にされた金融機関についてこれ以上分析を進めることはできませんでした。この情報は、通常であれば、被害者のディスクの設定ファイルにダウンロードされるでしょう。自身の一部の機能のために、メイン ペイロードはメイン ペイロード自身がインジェクトされているsvchost.exeプロセス内部にAPI関数をフックします。さらに、Webインジェクションを目的としてApache Webサーバを使用します。C&CサーバからApache Webサーバをダウンロードすることに成功すると、マルウェアはレイヤー化されたサービス プロバイダーを利用してWinsock APIにフックを仕掛けますが、その目的はインバウンドおよびアウトバウンドのインターネット トラフィックを傍受し、改ざんすることです。また、その他の多くのバンキング型トロイの木馬に見られるブラウザ ネットワーキング関数にフックを仕掛けるための、通常使用されるメソッドもマルウェアに含まれています。

第2段階のインジェクターとメイン ペイロードのどちらにも、決して使用されることのない文字列が大量に含まれています。このことから、作成者がマルウェアを大急ぎで構築したか、ずさんなやり方で開発が行われたかのいずれかであることが伺えます。

最新バージョン内に見られる“IntelPowerAgent6”という文字列ではなく、一度も使われることのない“IntelPowerAgent32”という文字列がこのサンプルの中に含まれています。システムが既に感染しているか確認するために第2段階のインジェクターが作成するアトムに加え、メイン ペイロードも名前付きのミューテックスを作成しますが、この名前はアトム用の名前を生成するための同じ手順に基づいています(付録を参照のこと)。しかし、ミューテックスは“DAN6J0-”というハードコーディングされた接頭辞を、アトム文字列用にも使用されるバイト シーケンスの前に使い、次のようになります。“{DAN6J0-ae000000d2000000e100}”

図2Shifuミューテックスおよび関連づけられたsvchostプロセス

Shifu、Shizおよびその他の関連ツール

Shifuバンキング系トロイの木馬は主に、今日でもいまだに出回っている最古のバンキング系トロイの木馬の1つであるShiz/iBankソース コードに基づいています。Shizは2006年に初めて発見され、そのとき以来、いくつかの開発ステージを経てきました。それは、ロシアの金融機関のみを標的としたバンキング系トロイの木馬として始まりました。その後、イタリアの銀行も標的にされ始めました。これは、さらなる国際化を視野に入れた準備段階である可能性があります。過去5年間で追跡してきた内部バージョンは、第2世代から第4世代(2011年)および第5世代(2013/2014年)までの範囲に及びます。Shizの第5世代が、2014年に実世界で検出された最後の世代(最終内部バージョンは5.6.25)で、それはコーディング スタイルが第4世代とは異なっています。ソース コードが販売または共有されたことが特定できたため、別のプログラマによって開発されたようです。第5世代の一番最初のバージョンのC&Cサーバにアクセスするために使用されたクエリ文字列が、私たちの見解を裏付けています。

botid=%s&ver=5.0.1&up=%u&os=%03u&ltime=%s%d&token=%d&cn=reborn&av=%s

攻撃活動名に文字列“reborn”が含まれていることを確認できます。

Shifuは、2015年中盤に、出回っていることが初めて検出されました。これは、さらなる国際化を視野に入れた、Shizの第5世代の進化型だと確信しています。

私たちは、過去2年間にわたりShizバンキング系トロイの木馬を追跡してきただけでなく、同じ作成者から配布されたと見られるいくつかの追加のマルウェア ツールを検出しました。収集したサンプルは、作成者が一連の金融関連のマルウェア全体を開発したことを示しています。作成者がグループの一員として作業しているのか、またはマルウェアそのものを使用しているのかはわかりません。これらのツールは主に、Shizの第5世代のソース コードに基づいています。

これらのツールはすべて、同じルート フォルダを持つPDBパスを含んでいるため、それらを一緒にして関連付けています。

Z:\coding\…

さらに、コーディング スタイルと使用されているAPI関数が非常に似ているため、大半のツールがShizソース コードに基づいています。また、BinDiffでツール間のコードを比較すると、かなり類似していることがわかります。その上、ネットワーク機能を伴うそれらのツールには、C&Cサーバにアクセスするために、Shizで見られたものとよく似たクエリ文字列が組み込まれています。

同業者のFireEyeが昨年説明したとおり、Shifuで見つかったPDBパスは以下のとおりです。

Z:\coding\project\main\payload\payload.x86.pdb

私たちが特定したその他のツールには以下のPDBパスが含まれ、同じ作成者からのものと思われます。

Z:\coding\cryptor\Release\crypted.pdb

Z:\coding\malware\tests\Release\cryptoshit.pdb

Z:\coding\malware\RDP\output\Release\rdp_bot.pdb

Z:\coding\malware\ScanBot\Release\bot.pdb

内部的に“cryptor”と名付けられたマルウェアには、BIFITの財務ソフトウェアを攻撃することで知られている最初のマルウェア、BifitAgentの暗号化されたサンプルが含まれています。同じ人物がBifitAgentを開発している可能性がありますが、それを示す痕跡は見つかっていません。コンパイル タイム スタンプによると、大半のサンプルは2013年の10月/11月に作成されました。

“rdp_bot”という名前のマルウェアは、RDPプロトコルを使用してコンピュータへのフル アクセス権を取得する小さなボットです。この記事で説明したShifuバージョンと同じ改変されたRC4暗号化アルゴリズムを使用しています。このツールは、おそらくShizバンキング系トロイの木馬と一緒に使用されていました。それによって、攻撃者は被害者のコンピュータから直接、自身の不正行為を行うことができるからです。そうすることで、IPアドレス、ブラウザのフットプリント、またはキーボード レイアウトをチェックする銀行の詐欺対策システムを欺くことができます。ツールは、Alisa Esageによって実施されたRDPに関する調査に基づいています。サンプルの日付は、2013年6月から11月までです。

“cryptoshit”という名前のツールには、rdp_botの暗号化されたサンプルが含まれ、またもや、ここで説明したShifuバージョンと同じ改変されたRC4アルゴリズムが使用されています。コンパイル タイム スタンプによると、サンプルの日付は2013年9月/10月および2014年1月です。

内部名が“ScanBot”のマルウェアは、オペレータからのコマンドを介して被害者のコンピュータ内のファイルをスキャンするためにSuper Light Regular Expressionライブラリ(SRLE)を使用する小さなバックドアです。タイム スタンプによると、サンプルの日付は2013年6月です。

Shifu対策の保護

Palo Alto Networksのお客様は、次の方法でShifuから保護されています。

WildfireがShifuファイルを悪意のあるものとして分類し、署名は脅威防御に読み込まれます。

AutoFocusのお客様は、Shifuタグを使用してマルウェアを追跡できます。

Shifuによって使用されているコマンド アンド コントロール ドメインは、脅威防御を通じてブロックされます。

説明したサンプルのSHA256ハッシュ

初期の難読化されたローダー

d3f9c4037f8b4d24f2baff1e0940d2bf238032f9343d06478b5034d0981b2cd9
368b23e6d9ec7843e537e9d6547777088cf36581076599d04846287a9162652b
e7e154c65417f5594a8b4602db601ac39156b5758889f708dac7258e415d4a18
f63ec1e5752eb8b9a07104f42392eebf143617708bfdd0fe31cbf00ef12383f9

第2ステージのインジェクター

003965bd25acb7e8c6e16de4f387ff9518db7bcca845502d23b6505d8d3cec01
1188c5c9f04658bef20162f3001d9b89f69c93bf5343a1f849974daf6284a650

エクスプロイト インジェクター

e7c1523d93154462ed9e15e84d3af01abe827aa6dd0082bc90fc8b58989e9a9a

CVE-2016-0167エクスプロイト(x86)

5124f4fec24acb2c83f26d1e70d7c525daac6c9fb6e2262ed1c1c52c88636bad

CVE-2016-0167エクスプロイト(x64)

f3c2d4090f6f563928e9a9ec86bf0f1c6ee49cdc110b7368db8905781a9a966e

メインのペイロード

e9bd4375f9b0b95f385191895edf81c8eadfb3964204bbbe48f7700fc746e4dc
5ca2a9de65c998b0d0a0a01b4aa103a9410d76ab86c75d7b968984be53e279b6

付録 - 技術詳細

第2ステージのインジェクターの分析

第2ステージのインジェクターには、エクスプロイト インジェクター(x86 DLL)が含まれており、これはその後、CVE-2016-0167の2つの埋め込みエクスプロイト(x86/64 DLL)になります。また、第2ステージのインジェクターには、その.tlsセクションに、暗号化され、aPLibで圧縮されたメイン ペイロード モジュール(x86 DLL)も含まれています。復号化するには、.rsrcセクションに保存されているsalt値と改変されたバージョンのRC4暗号化アルゴリズムを使用します。第2ステージのインジェクターの.dataセクションにある有意義な文字列は、鍵0x8DでXORされ、即座に復号化されます。復号化された文字列:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

AddMandatoryAce

ADVAPI

Advapi32.dlladvapi32.dllws2_32.dll

WPUCloseEvent

WPUCloseSocketHandleWPUCreateEvent

WPUCreateSocketHandle

WPUFDIsSet

WPUGetProviderPath

WPUModifyIFSHandle

WPUPostMessage

WPUQueryBlockingCallbackWPUQuerySocketHandleContext

WPUQueueApc

WPUResetEvent

WPUSetEvent

WPUOpenCurrentThreadWPUCloseThread

WSPStartup

> %1\r\ndel %0

software\\microsoft\\windows\\currentversion\\run

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/echo

rundll32.exe shell32.dll, ShellExec_RunDLL %s

Microsoft\\Microsoft AntimalwareSoftware\\Coranti

Software\\risingSoftware\\TrendMicroSoftware\\Symantec

Software\\ComodoGroup

Software\\Network Associates\\TVD

Software\\Data Fellows\\F-SecureSoftware\\Eset\\Nod

Software\\Softed\\ViGUARD

Software\\Zone Labs\\ZoneAlarm

Software\\Avg

Software\\VBA32

Software\\Doctor WebSoftware\\G DataSoftware\\Avira

Software\\AVAST Software\\Avast

Software\\KasperskyLab\\protected

Software\\Bitdefender

Software\\Panda SoftwareSoftware\\Sophos.bat\\\\.\\%C:

|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq

conhost

CreateProcessInternalW

ConvertStringSecurityDescriptorToSecurityDescriptorWContent-Type: multipart/form-data; boundary=--------------%s\r\n

Content-Type: application/x-www-form-urlencoded\r\n

Host: %s\r\n%d.%d.%d.%d

%d.%d.%d.%d.%x

 

%temp%\\debug_file.txt

 

[%u][%s:%s:%u][0x%x;0x%x] %sDnsFlushResolverCache

\\*.*

dnsapi.dll

DnsGetCacheDataTable.dll.exedownload.windowsupdate.com

vk.com

yandex.ru

HTTP/1.1https://http://%s

IsWow64Process

kernel

kernel32.dllLdrGetProcedureAddress

Microsoft

NtAllocateVirtualMemory

CLOSED

LAST_ACKTIME_WAIT

DELETE_TCB

LISTEN

SYN_SENTSYN_RCVDESTAB

FIN_WAIT1

FIN_WAIT2

CLOSE_WAIT

CLOSING

TCP\t%s:%d\t%s:%d\t%s\n

netstat\nProto\tLocal address\tRemote address\tState\n

ntdll.dll

NtResumeProcess

NtSuspendProcess\\\\?\\globalroot\\systemroot\\system32\\drivers\\null.sys

NtWriteVirtualMemoryopenRegisterApplicationRestart

RtlCreateUserThread

ResetSR

RtlComputeCrc32

rundll32SeDebugPrivilegeSystemDrive

\\StringFileInfo\\%04x%04x\\ProductName

software\\microsoft\\windows nt\\currentversion\\winlogon

shell

Sleep

srclient.dllSeShutdownPrivilege

\"%s\"

%d\t%s\ntaskmgr\nPID\tProcess name\nnet user\n

 

the computer is joined to a domain\n..

\\VarFileInfo\\Translation

%windir%\\system32\\%windir%\\syswow64\\POST*.exe

 

%SystemDrive%\\

 

*SYSTEM*%02x%s:Zone.Identifier

GetProcessUserModeExceptionPolicy

SetProcessUserModeExceptionPolicy

%ws\\%ws\n

 

WORKGROUP

HOMESoftware\\Microsoft\\Windows\\CurrentVersion\\Policies\\ExplorerDisableCurrentUserRun

%s.dat

 

software\\microsoft\\windows%OS%_%NUMBER_OF_PROCESSORS%

S:(ML;;NRNWNX;;;LW)D:(A;;GA;;;WD)

S:(ML;;NRNWNX;;;LW)D:(A;;GA;;;WD)(A;;GA;;;AC)

\\\\.\\AVGIDSShim

FFD3\\\\.\\NPF_NdisWanIpc:\\sample\\pos.exe

ANALYSERS

SANDBOX

VIRUS

MALWARE

FORTINETMALNETVMc:\\analysis\\sandboxstarter.exec:\\analysisc:\\insidetmc:\\windows\\system32\\drivers\\vmmouse.sys

c:\\windows\\system32\\drivers\\vmhgfs.sys

c:\\windows\\system32\\drivers\\vboxmouse.sys

c:\\iDEFENSEc:\\popupkiller.exe

c:\\tools\\execute.exe

c:\\Perlc:\\Python27api_log.dll

dir_watch.dll

pstorec.dll

dbghelp.dll

Process32NextW

Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zones\\3

1406.bitMiniDumpWriteDump

\r\nReferer: %s\r\n

\\Google\\Chrome\\User Data\\Default\\Cache

var %s = new ActiveXObject("WScript.Shell"); %s.Run("%s");

IntelPowerAgent32

%OS%_%NUMBER_OF_PROCESSORS%

 

%s\cmd.exe

 

ComSpec

ConsoleWindowClass

.exekernel32.dllntdll.dll

ZwQuerySystemInformationZwAllocateVirtualMemory

PsLookupProcessByProcessId

PsReferencePrimaryToken

Class

Window

open "%s" -q%windir%\\system32\\sdbinst.exe

/c "start "" "%s" -d"

%windir%\\system32\\sndvol.exe

 

"%s" -u /c "%s\\SysWOW64\\SysSndVol.exe /c "start "" "%s" -d""

%temp%\\%u

 

%u.tmp

 

Wow64DisableWow64FsRedirection

Wow64RevertWow64FsRedirection

runas.exe

%systemroot%\\system32\\svchost.exe

 

%systemroot%\\system32\\wscript.exe

 

snxhk.dll

sbiedll.dll

/c start "" "%s" " "

cmd.exe

runas

--crypt-test

It work's!

--vm-test


エクスプロイト インジェクターと埋め込みCVE-2016-0167エクスプロイト

エクスプロイト インジェクターは、感染されたホストのSYSTEM権限を取得するために使用されます。インジェクターには、x86システム用とx64システム用の両方の実際のエクスプロイトが含まれます。ファイル先頭のマジックPEバイト(“MZ”)は、それらが自動抽出されるのを阻止するため、nullバイトでパッチされます。

第2ステージのインジェクターは、現在のプロセスの整合性レベルとOSバージョンを確認します。プロセスの整合性レベルが低く、OSバージョンが6.1 (Windows 7/Windows Server 2008 R2)の場合、第2ステージのインジェクターは、エクスプロイト インジェクター ファイルをメモリに書き込みます。その後、PEオーバーレイの先頭をマークしているマジック値0x99999999をエクスプロイト インジェクター内で検索します。アドレスが見つかると、12バイトが追加され、第2ステージのインジェクターは、実際にはカスタムPEローダー シェルコードである、このアドレスにジャンプします。シェルコードの呼び出しは、以下のとおりです。

1

2

3

4

00401EF5   pusha

00401EF6   add esi, 0Ch

00401EF9   call esi   -> PE loader shellcode in overlay

00401EFB   popa

 

 

カスタムPEローダー シェルコード

最初にシェルコードの終わりを取得します。これは、後からエクスプロイト インジェクター ファイル内でマジックPE値(“MZ”)をスキャンするために使用されます。シェルコードの終わりを取得するコードは、以下のとおりです。

1

2

3

4

00077174   jmp short 00077178

00077176   pop eax

00077177   retn

00077178   call 00077176

 

 

次に、カスタムGetProcAddress()関数をハッシュ関数と一緒に使用して、VirtualAllocEx()のアドレスを検索します。その後、VirtualAllocEx()を呼び出し、適切なメモリ アライメントでエクスプロイト インジェクター セクションを書き込むことのできるフル アクセス権のあるメモリ バッファを割り当てます。必要なメモリ アドレスは再配置情報を用いて調整され、API関数アドレスが解決され、IATが埋められます。最後に、シェルコードが新たに作成されたエクスプロイト インジェクター モジュールのDLL入口点にジャンプします。

 

エクスプロイト インジェクター

最初に、文字列“kernel32.dll”、“LoadLibrary”、および“GetProcAddress”が作成されます。次に、kernel32.dllのイメージ ベース アドレスが検索され、LoadLibrary()およびGetProcAddress()の両アドレスが取得されます。これらのAPI関数を利用することで、エクスプロイト インジェクターのIATアドレスが解決され、IATが埋め込まれます。第2ステージのインジェクターによって処理はすでに実行されているため、この関数の目的は不明です。その後、API関数CreateThread()によって、新しいスレッドが作成されます。

このスレッドはまずIsWow64Process()を呼び出し、その結果に応じて、エクスプロイト ファイルの埋め込みx86バージョンまたはx64バージョンのいずれかがメモリ バッファに書き込まれます。次に、PEマジック値(“MZ”)がエクスプロイト ファイルの先頭に書き込まれます。続いて、エクスプロイトが後で使用する、“WaitEventX”というイベントが作成されます。その後、エクスプロイトをロードするメイン関数が呼び出されます。

エクスプロイトをロードする関数では、次のプロセス名が検索され、見つかった場合は、Trend Microセキュリティ ソフトウェアの一部である次の文字列のモジュール名も検索されます。

“uiSeAgnt.exe”

“PtSessionAgent.exe”

“PwmSvc.exe”

“coreServiceShell.exe”

これらのプロセスのいずれかが見つかった場合、中断状態のプロセスwuauclt.exeが作成されます。そうでない場合は、中断状態のプロセスsvchost.exeが作成されます。いずれの場合にも、コマンド ライン引数“-k netsvcs”が渡されますが、これはsvchost.exeでのみ使用できます。Trend Microインターネット セキュリティのx64バージョンがインストールされている場合、この機能は必ず失敗します。このコード(x86)はx64プロセスのCreateToolhelp32Snapshot()を呼び出すため、エラー(ERROR_PARTIAL_COPY)が発生します。さらに、コードは、保護されたTrend Microプロセスへのアクセスを試みるため、失敗します(ERROR_ACCESS_DENIED)。

次に、CreateFileMapping()およびMapViewOfFile()を使用してエクスプロイトのx86ファイルまたはx64ファイルがメモリにマッピングされ、そのメモリがエクスプロイトのバイトで埋め込まれます。最後に、ZwMapViewOfSection()を使用して、そのセクションが、中断状態のプロセスsvchost.exeまたはwuauclt.exeにマッピングされます。OSバージョンが5.2 (Windows Server 2003 / Windows XP 64ビット エディション)であるかどうかが確認され、そうである場合は関数が終了します。その後、2つのメモリ バッファが作成され、それぞれにシェルコードが書き込まれます。最初の難読化されたシェルコードは、マッピングされたエクスプロイト ファイルのステージャーである2番目のシェルコードを呼び出します。次に、エクスプロイトを実行するため、ResumeThread()を呼び出して、中断状態のプロセスを実行します。

第2ステージのインジェクターは、エクスプロイトに成功したかどうかを確認するために、その整合性レベルがSECURITY_MANDATORY_LOW_RIDのままであるかどうかをチェックします。そうでない場合、エクスプロイトが権限をSECURITY_MANDATORY_SYSTEM_RIDに昇格させたことになり、メイン ペイロードのインジェクションが継続されます。エクスプロイトが失敗した場合、SYSTEMユーザー アカウントでのWindowsコマンド ライン(cmd.exe)およびrunas.exeツールを使用した自身の実行が試みられます。

Atom文字列の構築

今日のほとんどのマルウェアのようにミューテックスを使用するかわりに、第2ステージのインジェクターはatomを作成し、Shifuのインスタンスがすでに実行されているかどうかを確認するためにグローバルのatom表をチェックします。

まず、API ExpandEnvironmentStrings()のテンプレート文字列“%OS%_%NUMBER_OF_PROCESSORS%”を使用して、Windowsバージョンとプロセッサ数を取得します。たとえば、1つのプロセッサで稼働するWindows 7の場合、結果は“Windows_NT_1”になります。この文字列は、次の初期値を持つRtlComputeCrc32()で、4つのCRC32ハッシュを計算するために使用されます。

0xFFFFFFFF

0xEEEEEEEE

0xAAAAAAAA

0x77777777

文字列“Windows_NT_1”で生成されるCRCハッシュは次のとおりです。

0x395693AE

0xB24495D2

0xF39F86E1

0xBAE0B5C8

次に、各CRCハッシュの最後のバイトが、スタック上のDWORD値として格納されます。

0xAE000000 (0x395693AEの一部)

0xD2000000 (0xB24495D2の一部)

0xE1000000 (0xF39F86E1の一部)

0xC8000000 (0xBAE0B5C8の一部)

ハッシュ バイト シーケンスを含むスタックは、次のようになります。

AE 00 00 00 D2 00 00 00 E1 00 00 00 C8 00 00 00

snprintf()関数を使用して、ハッシュ バイト シーケンスの最初の8バイトをASCII文字に変換することで、atom文字列が作成されます。この場合の結果は、次のとおりです。

“ae000000d2000000”

最後に、atomが存在するかどうかを確認するためにGlobalFindAtom() APIが呼び出され、存在しない場合は、GlobalAddAtom()が呼び出されます。

図3グローバルのatom表におけるShifu atom

コマンド ライン引数

第2ステージのインジェクターには2つのコマンド ライン パラメータが存在しますが、そのうちの1つのみが機能します。これらは将来の機能で使用されるパラメータか、削除し忘れたパラメータです。

–crypt-test

[It work’s!(機能します)]というテキストのメッセージ ボックスが表示されます。

–vm-test

機能はありません。

分析回避トリック

Sandboxie / Avast回避

Shifuは、自身のプロセス空間にsnxhk.dll (Avast)モジュールまたはsbiedll.dll (Sandboxie)モジュールがあるかどうかをチェックするために、GetModuleHandleA()を呼び出して無限のSleep()ループを実行し、ハンドルが返されるかどうかを調べます。

次の分析回避トリックはいずれも、Shifuが32ビットのWindowsマシン(Wow64プロセスではない)で実行される場合にのみ使用されます。

プロセス名の検出

実行中のプロセス名を列挙してから小文字に変換し、これらの名前のCRC32ハッシュを計算して、次のリストと比較します。

0x99DD4432 – ?

0x1F413C1F – vmwaretray.exe

0x6D3323D9 – vmusrvc.exe

0x3BFFF885 – vmsrvc.exe

0x64340DCE – ?

0x63C54474 – vboxtray.exe

0x2B05B17D – ?

0xF725433E – ?

0x77AE10F7 – ?

0xCE7D304E – dumpcap.exe

0xAF2015F2 – ollydbg.exe

0x31FD677C – importrec.exe

0x6E9AD238 – petools.exe

0xE90ACC42 – idag.exe

0x4231F0AD – sysanalyzer.exe

0xD20981E0 – sniff_hit.exe

0xCCEA165E – scktool.exe

0xFCA978AC – proc_analyzer.exe

0x46FA37FB – hookexplorer.exe

0xEEBF618A – multi_pot.exe

0x06AAAE60 – idaq.exe

0x5BA9B1FE – procmon.exe

0x3CE2BEF3 – regmon.exe

0xA945E459 – procexp.exe

0x877A154B – peid.exe

0x33495995 – autoruns.exe

0x68684B33 – autorunsc.exe

0xB4364A7A – ?

0x9305F80D – imul.exe

0xC4AAED42 – emul.exe

0x14078D5B – apispy.exe

0x7E3DF4F6 – ?

0xD3B48D5B – hookanaapp.exe

0x332FD095 – fortitracer.exe

0x2D6A6921 – ?

0x2AAA273B – joeboxserver.exe

0x777BE06C – joeboxcontrol.exe

0x954B35E8 – ?

0x870E13A2 – ?

ファイルの検出

次のファイルまたはフォルダがシステムに存在することを確認し、存在する場合は、無限のSleep()ループを実行します。

c:\sample\pos.exe

c:\analysis\sandboxstarter.exe

c:\analysis

c:\insidetm

c:\windows\system32\drivers\vmmouse.sys

c:\windows\system32\drivers\vmhgfs.sys

c:\windows\system32\drivers\vboxmouse.sys

c:\iDEFENSE

c:\popupkiller.exe

c:\tools\execute.exe

c:\Perl

c:\Python27

デバッガの検出

IsDebuggerPresent()を呼び出すことで、デバッグ中であるかどうかを確認します。また、ProcessDebugPortおよびProcessDebugObjectHandleを持つZwQueryInformationSystem()を呼び出すことで、デバッガの存在を確認します。デバッガが検出された場合は、無限のSleep()ループを実行します。

Wiresharkの検出

CreateFile()を使用して\\.\NPF_NdisWanIpのオープンを試み、オープンに成功した場合は、無限のSleep()ループに入ります。

自己サニティ チェック

自身のファイル名の長さが30文字を超えているかどうかをチェックし、超えている場合は、無限のSleep()ループを実行します。また、自身のプロセス名のCRC32ハッシュが、次のいずれかに一致するかどうかもチェックします。

0xE84126B8 – sample.exe

0x0A84E285 – ?

0x3C164BED – ?

0xC19DADCE – ?

0xA07ACEDD – ?

0xD254F323 – ?

0xF3C4E556 – ?

0xF8782263 – ?

0xCA96016D – ?

さらに、GFIサンドボックス内にある次のいずれかのモジュールが、自身のプロセス アドレス空間に存在するかどうかをチェックします。

api_log.dll

dir_watch.dll

pstorec.dll

未知の分析回避トリック

Shifuは、目的が不明の分析回避トリックを使用します。Process32NextW()のアドレスが取得され、その最初の5バイトがシーケンス0x33C0C20800と比較されます。これは、次のように逆アセンブルされます。

Shifuは、目的が不明の分析回避トリックを使用します。Process32NextW()のアドレスが取得され、その最初の5バイトがシーケンス0x33C0C20800と比較されます。これは、次のように逆アセンブルされます。

1

2

33C0  XOR EAX,EAX

C2 0800   RETN 8

このコードは32ビットのWindows XPに存在し、それより後のWindowsバージョンにはありません。その関数のUnicodeバージョンがまだ実装されていない可能性があるためです。このコード シーケンスが見つかった場合は、Shifuが32ビットのWindows XPで実行されたことを意味し、無限のSleep()ループが実行されます。

Windowsドメイン名のチェック

API関数NetServerGetInfo()およびNetWkstaGetInfo()を使用して、コンピュータのワークグループ名が“WORKGROUP”または“HOME”であるかどうかをチェックし、そうでない場合は、無限のSleep()ループを実行します。次に、“ANALYSERS”という名前を探し、見つかった場合は無限ループを実行します。

コンピュータ名とユーザー名のチェック

GetComputerName()およびGetUserName()を使用してコンピュータ名とユーザー名を取得し、次の文字列を探します。

SANDBOX

FORTINET

VIRUS

MALWARE

MALNETVM

いずれかの文字列が見つかった場合は、無限ループを実行します。

プロセス終了機能

Shifuの第2ステージのインジェクターは、実行中のすべてのプロセスを列挙してからそれぞれの名前を小文字に変換し、それらのCRC32ハッシュを計算して、次のものと比較します。

0xD2EFC6C4 – python.exe

0xE185BD8C – pythonw.exe

0xDE1BACD2 – perl.exe

0xF2EAA55E – autoit3.exe

0xB8BED542 – ?

一致するものが見つかった場合は、OpenProcess()とTerminateProcess()を使用して、プロセスをまず終了しようとします。終了に失敗した場合、ZwClose()のHANDLE_FLAG_PROTECT_FROM_CLOSEがフラグ付けされているときは、そのプロセスのメイン ウィンドウ ハンドルを閉じようとします。その後、完全なアクセス権限でプロセスを開き、ZwUnmapViewOfSection()を使用して、そのプロセスをメモリからマップ解除します。最後に、マップ解除されたプロセスのメイン ウィンドウ ハンドルを閉じます。

メイン ペイロードの復号化、解凍およびインジェクション

メイン ペイロードを復号化するために、第2ステージのインジェクターは、復号化アルゴリズムで必要とされるsalt値を.rsrcセクションから取得します。これは、改変されたRC4アルゴリズムを使用します。このアルゴリズムでは、salt値を使用して、先頭バイトに後続する256バイトの配列とのXORが実行されます。その後、暗号化された配列を使用して、.tlsセクション内のメイン ペイロードが復号化されます。復号化されたメイン ペイロードは、aPLib圧縮ライブラリと一緒に圧縮されます。

初期ローダーが中高の整合性レベルのプロセスとして実行される場合、atom文字列名を計算するルーチンが再度呼び出されます。今回は、“ae000000”などの文字列を構築するのに最初の4バイトのみが使用されます。次に、この文字列のCRC32ハッシュが計算され、0x0から0xFFの範囲内にある、256バイトの別の配列とのXORに使用されます。この暗号化された配列が、復号化されたメイン ペイロードの再暗号化に使用されます。生成された暗号化データは、持続性のためにレジストリに書き込まれます。その際には、“HKCU\software\microsoft\windows”キーの下のランダムなCRC32ハッシュ名(例: “f4e64d63”)として追加されます。また、文字列“ae000000”が名前の2番目の値が作成され、nullバイトと初期ローダーへのパス(例: “C:\ProgramData\7d5d6044.exe”)で埋め込まれます。最後に、一時的に暗号化されたメイン ペイロードが再度復号化されます。

図4Windowsレジストリに格納されている暗号化されたメイン ペイロードと初期ローダー パス

次に、メイン ペイロードがメモリ内で解凍されます。その後、中断状態のsvchost.exeプロセス(x86)が、親プロセスと同じ整合性レベルで作成されます。メイン ペイロードがプロセスにマッピングされ、PEマジック値(MZ)がパッチ適用されます。svchostプロセスが再開され、メイン ペイロードが実行されます。最後に、バッチ ファイルが作成され、%TEMP%フォルダで実行されます。元の実行済みの初期ローダーをランダムなバイト数で上書きすることで、その痕跡が隠蔽されます。ランダムなバイトの後には、常にスペース文字とCR LF制御文字が続きます。

メイン ペイロード分析

静的分析をより困難にするため、メイン ペイロード モジュールのIAT関数名と鍵0xFFとのXORが実行されます。.dataセクションにある有意義な文字列と鍵0x8DとのXORも実行され、即座に復号化されます。復号化された文字列は次のとおりです。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

AddMandatoryAce

ADVAPI

Advapi32.dlladvapi32.dllws2_32.dll

WPUCloseEvent

WPUCloseSocketHandleWPUCreateEvent

WPUCreateSocketHandle

WPUFDIsSet

WPUGetProviderPath

WPUModifyIFSHandle

WPUPostMessage

WPUQueryBlockingCallbackWPUQuerySocketHandleContext

WPUQueueApc

WPUResetEvent

WPUSetEvent

WPUOpenCurrentThreadWPUCloseThread

WSPStartup

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/echo

> %1\r\ndel %0

rundll32.exe shell32.dll, ShellExec_RunDLL %s

software\\microsoft\\windows\\currentversion\\run

Microsoft\\Microsoft AntimalwareSoftware\\Coranti

Software\\risingSoftware\\TrendMicroSoftware\\Symantec

Software\\ComodoGroup

Software\\Network Associates\\TVD

Software\\Data Fellows\\F-SecureSoftware\\Eset\\Nod

Software\\Softed\\ViGUARD

Software\\Zone Labs\\ZoneAlarm

Software\\Avg

Software\\VBA32

Software\\Doctor WebSoftware\\G DataSoftware\\Avira

Software\\AVAST Software\\Avast

Software\\KasperskyLab\\protected

Software\\Bitdefender

Software\\Panda SoftwareSoftware\\Sophos.bat|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnop

q

\\\\.\\%C:

conhost

CreateProcessInternalW

ConvertStringSecurityDescriptorToSecurityDescriptorWContent-Type: application/x-www-form-urlencoded\r\n

Content-Type: multipart/form-data; boundary=---------------------------%s\r\n

Host: %s\r\n%d.%d.%d.%d

%d.%d.%d.%d.%x

 

%temp%\\debug_file.txt

 

[%u][%s:%s:%u][0x%x;0x%x] %sDnsFlushResolverCache

\\*.*

dnsapi.dll

DnsGetCacheDataTable.dll.exedownload.windowsupdate.com

vk.com

yandex.ru

HTTP/1.1https://http://%s

IsWow64Process

kernel

kernel32.dllLdrGetProcedureAddress

Microsoft

NtAllocateVirtualMemory

CLOSED

LAST_ACKTIME_WAIT

DELETE_TCB

LISTEN

SYN_SENTSYN_RCVDESTAB

FIN_WAIT1

FIN_WAIT2

CLOSE_WAIT

CLOSING

TCP\t%s:%d\t%s:%d\t%s\n

netstat\nProto\tLocal address\tRemote address\tState\n

ntdll.dll

NtResumeProcess

NtSuspendProcess\\\\?\\globalroot\\systemroot\\system32\\drivers\\null.sys

NtWriteVirtualMemoryopenRegisterApplicationRestart

RtlCreateUserThread

ResetSR

RtlComputeCrc32

rundll32SeDebugPrivilegeSystemDrive

\\StringFileInfo\\%04x%04x\\ProductName

software\\microsoft\\windows nt\\currentversion\\winlogon

shell

Sleep

srclient.dllSeShutdownPrivilege

\"%s\"

%d\t%s\ntaskmgr\nPID\tProcess name\nnet user\n

 

the computer is joined to a domain\n..

\\VarFileInfo\\Translation

%windir%\\system32\\%windir%\\syswow64\\POST*.exe

 

%SystemDrive%\\

 

*SYSTEM*%02x%s:Zone.Identifier

GetProcessUserModeExceptionPolicy

SetProcessUserModeExceptionPolicy

%ws\\%ws\n

 

WORKGROUP

HOMEsoftware\\microsoft\\windowsSoftware\\Microsoft\\Windows\\CurrentVersion\\Policies\\ExplorerDisableCurrentUserRun

%s.dat

 

%OS%_%NUMBER_OF_PROCESSORS%

 

S:(ML;;NRNWNX;;;LW)D:(A;;GA;;;WD)

S:(ML;;NRNWNX;;;LW)D:(A;;GA;;;WD)(A;;GA;;;AC)

\\\\.\\AVGIDSShim

FFD3\\\\.\\NPF_NdisWanIpc:\\sample\\pos.exe

ANALYSERS

SANDBOX

VIRUS

MALWARE

FORTINETMALNETVMc:\\analysis\\sandboxstarter.exec:\\analysisc:\\insidetmc:\\windows\\system32\\drivers\\vmmouse.sys

c:\\windows\\system32\\drivers\\vmhgfs.sys

c:\\windows\\system32\\drivers\\vboxmouse.sys

c:\\iDEFENSEc:\\popupkiller.exe

c:\\tools\\execute.exe

c:\\Perlc:\\Python27api_log.dll

dir_watch.dll

pstorec.dll

dbghelp.dll

Process32NextW

1406Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zones\\3

.bitMiniDumpWriteDump

\r\nReferer: %s\r\n

\\Google\\Chrome\\User Data\\Default\\Cache

var %s = new ActiveXObject("WScript.Shell"); %s.Run("%s");

GenuineIntelAuthenticAMDCentaurHauls7z

fnbqooqdaixfueangywblgabirdgvkewdyqgfqaioluesyrpryfkjerfsouemaxnavrkguxmcmhckwprunurmhehclermtufwiyjbqhwlunbun

uumeowfjmerxppxrgaxukyx

PowerManager_M5VKII_%d

[type=ftp]\n[botid=%s]\n[proc=%s]\n[data=%s]\n

[type=pop3]\n[botid=%s]\n[proc=%s]\n[data=%s]\n

%OS%_%NUMBER_OF_PROCESSORS%

 

[type=post]\n[botid=%s]\n[url=%s]\n[ua=%s]\n[proc=%s]\n[ref=%s]\n[keys=%s]\n[data=%s]\n

name=%s&ok=%s&id=%d&res_code=%d&res_text=%s_%x

name=%s&ok=%s&id=%d&res_code=%d&res_text=%s

botid=%s&ver=%s.%u&up=%u&os=%u&ltime=%s%d&token=%d&cn=%s&av=%s&dmn=%s&mitm=%u

java.exe|javaw.exe|plugin-container.exe|acrobat.exe|acrod32.exe

tellerplus|bancline|fidelity|micrsolv|bankman|vanity|episys|jack

henry|cruisenet|gplusmain|silverlake|v48d0250s1Root|TrustedPeople|SMS|Remote Desktop|REQUEST

TREASURE|BUH|BANK|ACCOUNT|CASH|FINAN|MONEY|MANAGE|OPER|DIRECT|ROSPIL|CAPO|BOSS|TRADEactive_bc

-----------------------------%s\r\nContent-Disposition: form-data; name=\"pcname\"\r\n\r\n%s!%s\r\n-----------------------------

%s\r\nContent-Disposition: form-data; name=\"file\"; filename=\"report\"\r\nContent-Type: text/plain\r\n\r\n%s\r\n--------------

 

---------------%s--\r\n

%domain%deactivebc

 

inject

kill_os

loadactive_sk

deactive_sk

wipe_cookiesmitm_modmitm_script

mitm_geterr

get_keylog

get_sols!active_bc\[(\d+)\] (\S+) (\d+)

!deactive_bc\[(\d+)\]

!inject\[(\d+)\] (\S+)

!kill_os\[(\d+)\]

!get_keylog\[(\d+)\]!load\[(\d+)\] (\S+)!update\[(\d+)\] (\S+)

!wipe_cookies\[(\d+)\]

!active_sk\[(\d+)\] (\S+) (\d+)

!deactive_sk\[(\d+)\]

!mitm_mod\[(\d+)\] (\S+) (\d+) (\S+)!mitm_script\[(\d+)\] (\S+)

!mitm_geterr\[(\d+)\]

!get_sols\[(\d+)\]

ATCASH

ATLOCAL

CERTCERTX

COLVCRAIF

CRYPT

CTERM

SCREEN

INTER

ELBALOCAL

ELBAWEB

ELBAWEB

ELBAWEB

PUTTY

VNCVIEW

MCLOCAL

MCSIGN

OPENVPN

PIPEK

PIPEK

PIPEK

PIPEK

POSTSAP

chrome.dll

mxwebkit.dlldragon_s.dlliron.dllvivaldi.dll

nspr4.dll

nss3.dllbrowser.dll

Advapi32.dllrsaenh.dll

kernel32.dllIprivLibEx.dll

cryptui.dll

crypt32.dll

ntdll.dll

ssleay32.dllurlmon.dll

user32.dll

Wininet.dll

Ws2_32.dll

PSAPI.dll

NzBrco.dll

VirtualProtect

LoadLibraryExW

ZwQuerySystemInformationWSARecv

WSASend

ZwDeviceIoControlFile

URLDownloadToCacheFileW

URLDownloadToFileW

TranslateMessageSSL_get_fd

SSL_write

PFXImportCertStore

CryptEncryptCPExportKey

CreateProcessInternalW

CreateDialogParamW

GetClipboardDatagetaddrinfo

gethostbyname

GetAddrInfoExW

GetMessageA

GetMessageW

DeleteFileA

GetModuleBaseNameW

bad port value

can't find plug-in path

can't get bot path

can't download file

can't encrypt file

can't save inject config to filecan't get temp file

file is not valid PEcan't delete original file

can't replace original file

can't close handle

can't protect file

original file not found

can't execute file

can't create directory

can't unzip file #1

can't unzip file #2

mitm_mod is inactivehttpd.exe is anactive

microsoft.com

dropbox.com

KEYGRAB

PasswordTELEMACOScelta e Login dispositivo

TLQ Web

db Corporate Banking WebSecureStoreCSP - enter PIN

google.com

Software\\SimonTatham\\PuTTYreg.txt

Software\\Microsoft\\Internet Explorer\\MainTabProcGrowth

Temp\\Low

crc32[%x]

ACCT

AUTHINFO PASS

AUTHINFO USER

Authorization

:BA:[bks]

%X!%X!%08X

 

btc_path.txtbtc_wallet.dat

bitcoin\\wallet.dat

%s%s\\%u_cert.pfx

 

cmdline.txt

1.3.6.1.5.5.7.3.3

CodeSign\n

Software\\Microsoft\\Windows NT\\CurrentVersion

[del]

Default

.exeELBA5\\ELBA_dataftp://anonymous:ftp://%s:%s@%s:%d\n

HBPData\\hbp.profileHH:mm:ssdd:MMM:yyyy

I_CryptUIProtect\\exe\\

infected.exx%s%s\\%u_info.txt

[ins]

InstallDate

%02u.jpg%s\\%02d.jpgKEYLOG

 

%s\\keylog.txt

 

[TOKEN ON]

\n\n[%s (%s-%s) - %s (%s)]\n[pst]%s[/pst]

ltcd_path.txt

ltcd_wallet.dat

litecoind\\wallet.dat

ltc_path.txtltc_wallet.dat

litecoin\\wallet.dat\\MacromediaMultiCash@Sign

C:\\Omikron\\MCSign

[ML][MR]Global\\{4C470E-%08x-%08x-%08x}

Global\\{DAN6J0-%s}

noneopera.exe

PASS

password.txt\\\\.\\pipe\\%s

pop3://%s:%s@%s:%d\n%PROCESSOR_ARCHITECTURE%Referer

[ret]

%08x\\system32\\rstrui.exe

 

\\scrs\\send%s%s%s%d%s:%s

sysinfo.txt

[tab]

data.txt<unnamed>

<untitled>

update

USER

User-agent

vkeys

%x\r\n

 

\r\n%x%x%x.tmp

\\*.txt

%02x%2b

 

torrent

-config config.vnc

--config

config.ovpn

data.txt[type=post]\n

CreateFileW

pos.exe

bank.exePOS

secure.

.mozgoogle.com

CertVerifyCertificateChainPolicyCertGetCertificateChain

SSL_AuthCertificateHook

USERNAMESoftware\\ESET\\ESET Security\\CurrentVersion\\Info

C8FFAD27AE1BBE28BE24DDF20AF36EF901C609968930ED82CEFBC64808BA34102C4FABA0560523FB4CCBF33684F77C8401DFB

3A7D2D598E872DD78033E7F900B78A0C710CDF0941662FF7745A435D4BC18D5661E0582B21B2DB8FCA1C0CA3401D0FC9F051

85A558AB6A76A010F606CD77B35A480B6B7176F0903299B91F1BBD141B4D33615849C35557357DAB819BC3D4A8722BB433DE

B66C7A326BE859BD94930331B37DEE6EF4C475EA4B33DE4699FFDBCD34E196E19FE630E631D2C612705048620183BCF56709B

484A4380C4B00D8D94D131C31DB53AE6BCDCCC14131BAC99A68C59A604D0AE9116E9196F7FA3EA5F86F67E9B175CC09D3E17

997728B7D

10001

get=1

COMPNAMEAppDataDir

updfiles\\upd.ver

updfiles\\lastupd.ver

SYSTEM\\CurrentControlSet\\services\\Avg\\SystemValues

Local AppData

Avg2015

Avg2014

Avg2013

Avg2012

Avg2011

update

Software\\Microsoft\\Windows\\CurrentVersion\\explorer\\Browser Helper Objects\\{8CA7E745-EF75-4E7B-BB86-

8065C0CE29CA}

Software\\Microsoft\\Windows\\CurrentVersion\\explorer\\Browser Helper Objects\\{BB62FFF4-41CB-4AFC-BB8C-

2A4D4B42BBDC}

Software\\Microsoft\\Internet Explorer\\MainEnable Browser Extensions

httpd.exe

%s\\httpd.exe

 

connect

data\\index.php

logs\\error.log

error.log

<?\n';\n$bot_id = '

$bot_net = '$key_log_file = '

$process_file = '

127.0.0.1

Listen %s:%u\n

conf\\httpd.confSSL_PORT%u>\n

[type=post]\n

[type=screen]\n

[type=knock]\n

74??834E0440B832FFFFFF

74??834E04405F5EB832FFFFFF

DEBUG

memory.dmp

config.xml

php5ts.dll

zend_stream_fixup

zend_compile_file

index.php

config.php

content.php

iexplore.exe|firefox.exe|chrome.exe|opera.exe|browser.exe|dragon.exe|epic.exe|sbrender.exe|vivaldi.exe|maxthon.exe|ybr

owser.exe|microsoftedgecp.exe

InternetQueryDataAvailable

InternetReadFileInternetReadFileExA

InternetReadFileExW

InternetSetStatusCallbackA

InternetSetStatusCallbackW

HttpSendRequestAHttpSendRequestExA

HttpSendRequestExW

HttpSendRequestW\r\n0\r\n\r\n

.rdata

\r\n\r\nHTTP/1.

Transfer-Encoding

chunked

Content-Length

close

Proxy-ConnectionHostAccept-Encoding

x-xss-protectionx-content-security-policy

x-frame-options

x-content-type-options

If-Modified-Since

If-None-Match

content-security-policy

x-webkit-cspConnection

http://

https://NSS layer

Content-TypeBasic

PR_ClosePR_Connect

PR_GetNameForIdentity

PR_Read

PR_SetError

PR_WriteReferer:

Accept-Encoding:\r\n1406SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3

data_after\ndata_before\n

data_enddata_inject\n

set_url %BOTID%

%BOTNET%InternetCloseHandle

 

HTMLc:\\inject.txt

Dalvik/1.6.0 (Linux; U; Android 4.1.2; GT-N7000 Build/JZO54K)

xxx_process_0x%08x

Common.js

APIの難読化

メイン ペイロードは、Push-Calc-Ret難読化として知られるAPIの難読化手法を使用します。メイン ペイロードがsvchostプロセスに挿入された後、実際のAPI関数への呼び出しは第2ステージのインジェクターによってパッチ適用されます。Windows API関数を呼び出す必要が生じるたびに、実際の関数アドレスを計算する、トランポリン関数アドレスがかわりに呼び出されます。トランポリン関数アドレスはすべて、メモリ内の配列に格納されます。

たとえば、メイン ペイロードがCreateFile()を呼び出す際に、この呼び出しに対してパッチが適用されたとします。その場合、次のようなトランポリン関数が呼び出されます。

1

2

3

4

5

00846110   PUSH 2B464C25

00846115   PUSHFD

00846116   XOR DWORD PTR SS:[ESP+4], 5DB5E13F

0084611E   POPFD

0084611F   RETN

最初に、ある値がスタックにプッシュされます。次に、EFLAGSレジスタがスタックに保存されます。このレジスタは後続のXOR命令によって変更されるからです(OF、CFフラグはクリアされ、SF、ZF、PFフラグは結果に応じて設定されます)。続いて、以前にプッシュした値と別の値とのXORが実行され、実際のAPI関数アドレスが計算されます。最後に、EFLAGSレジスタが復元され、RETN命令を介して実際のAPI関数アドレスが呼び出されます。

持続手法

メイン ペイロードは最初の難読化済みローダー ファイルを%ProgramData%フォルダにコピーします。その際に、GetTickCount()を使用してランダム ファイルを取得します。続いて、現在のユーザーの起動フォルダに、“Common.js”という名前のJScriptファイルを作成します。このファイルには、システムの再起動後に最初のローダーを実行する次のコードが含まれています。

1

2

var yqvltidpue = new ActiveXObject("WScript.Shell");

yqvltidpue.Run("C:\\PROGRA~3\\930d4a6d.exe")

前のバージョンと比較したメイン ペイロードの更新

Shifuの前のバージョンに関するレポートは、FireEyeFortinetが発行しています。

前のバージョンと比べて、コンピュータ名、ユーザー名、インストール日、システム ドライブ ボリューム シリアル番号を使用して作成される文字列の、スキャン対象である部分文字列のリストは長くなりました。

TREASURE

BUH

BANK

ACCOUNT

CASH

FINAN

MONEY

MANAGE

OPER

DIRECT

ROSPIL

CAPO

BOSS

TRADE

更新されたコマンド リスト:

active_sk

deactive_sk

deactivebc

get_keylog

get_sols

inject

kill_os

load

mitm_geterr

mitm_mod

mitm_script

wipe_cookies

標的となるブラウザの更新されたリスト:

iexplore.exe

firefox.exe

chrome.exe

opera.exe

browser.exe

dragon.exe

epic.exe

sbrender.exe

vivaldi.exe

maxthon.exe

ybrowser.exe

microsoftedgecp.exe

メイン ペイロードは、いずれかのC&CサーバからApache httpd.exeサーバ ファイルをダウンロードし、Webインジェクションを行うためにディスクに格納します。前のバージョンと比べて、Zend PHPフレームワーク向けの特定の機能を示す2つの文字列が、メイン ペイロードに追加されています。

zend_stream_fixup

zend_compile_file

Svchostでの関数のフック

前のバージョンと同様、マルウェアは、URLのリダイレクト、ネットワーク トラフィックやクリップボードの捕捉、キーストロークの記録を行うために、いくつかのAPI関数をフックします。このマルウェアは、インライン関数フックとして知られる技法を使用します。この技法では、ある関数の最初の5バイトが、マルウェアのフック ハンドラにジャンプするようパッチ適用されます。次の関数がフックされます。

NtDeviceIoControlFile (ntdll.dll)

ZwDeviceIoControlFile (ntdll.dll)

GetClipboardData (user32.dll)

GetMessageA (user32.dll)

GetMessageW (user32.dll)

TranslateMessage (user32.dll)

GetAddrInfoExW (ws2_32.dll)

gethostbyname (ws2_32.dll)

getaddrinfo (ws2_32.dll)

ネットワーク機能

Shifuのメイン ペイロードは、.bitのトップレベル ドメインを使用します。これは、Namecoinインフラストラクチャに基づいた一元化されていないDNSシステムです。マルウェアは、次のハードコーディングされたNamecoin DNSサーバに後で接続することで、そのドメインのIPアドレスを要求します。

92.222.80.28

78.138.97.93

77.66.108.93

C&Cドメイン名、ユーザー エージェント文字列、およびURLパラメータは、改変されたRC4暗号化アルゴリズムを用いて暗号化されています。復号化された文字列は次のとおりです。

klyatiemoskali.bit

slavaukraine.bit

Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; en-US; rv:1.9a1) Gecko/20061007 Minefield/3.0a1

L9mS3THljZylEx46ymJ2eqIdsEguKC15KnyQdfx4RTcVu8gCT

https://www.bing.com

/english/imageupload.php

/english/userlogin.php

/english/userpanel.php

1brz

暗号化された文字列は、.dataセクション内で次の形式で格納されます。

<LengthOfString><EncryptedString>

ドメイン文字列“klyatiemoskali“は、「モスクワ市民に災いを」というような意味です。2番目のドメイン文字列“slavaukraine”は、「ウクライナに栄光を」と訳せます。ここに含まれるRC4鍵“L9mS3THljZylEx46ymJ2eqIdsEguKC15KnyQdfx4RTcVu8gCT”を使用して、ネットワーク トラフィックが暗号化されます。

分析時には、実際のC&CサーバのIPアドレスに応答していたのは次のNamecoin DNSサーバのみでした。

77.66.108.93 (ns1.dk.dns.d0wn.biz)

図577.66.108.93のNamecoin DNSサーバ情報

次のスクリーンショットは、Shifuの動的分析時に捕捉されたネットワーク トラフィックを示しています。

図6Wiresharkで捕捉されたShifuネットワーク トラフィック

IPアドレスを取得するために、Shifuがドメイン名klyatiemoskali.bitのNamecoin DNSサーバを問い合わせたことが分かります。ネーム サーバの1つがC&CサーバのIPアドレスで応答すると、TLSハンドシェイクが実行されて暗号化されたネットワーク チャネルが開かれます。最後に、いくつかの暗号化されたデータが送信され、それに対する暗号化された応答が取得されます。ただし、分析時には、それ以外のネットワーク トラフィックは観察されなかったはずです。分析時には、ドメイン名klyatiemoskali.bitとslavaukraine.bitがいずれも、IPアドレス103.199.16.106に解決されたはずだからです。

.bitのトップレベル ドメインは、Bitcoinシステムに基づいたNamecoin暗号通貨に依存しているため、すべての取引を追跡することができます。つまり、Namecoinブロック エクスプローラを使用することで、.bitドメインがいつ登録され、どのIPアドレスに接続されているかを調べることができます。たとえば、Webサービスnamecha.inを使用する場合、klyatiemaskali.bitについて次の情報を取得できます。

slavaukraine.bitについても同様の情報を表示できます。

 

どちらのドメインも2016-06-03に登録されており、それらに割り当てられているのは1つのIPアドレスのみです。このIPアドレスは、捕捉されたネットワーク トラフィックにおけるNamecoin DNSサーバの応答に相当します。さらに、ドメインがまだアクティブである可能性が高いことも確認できます。

C&CサーバのURLクエリ文字列

メイン ペイロードには、被害者の情報をC&Cサーバに送信する際に使用されるクエリ文字列テンプレートが含まれます。

botid=%s&ver=%s.%u&up=%u&os=%u&ltime=%s%d&token=%d&cn=%s&av=%s&dmn=%s&mitm=%u

一部の情報(ボットID、稼働時間、オペレーティング システム バージョン、ローカル タイムスタンプ、トークン、アンチウイルス ソフトウェア、ワークステーションのドメイン名、検出された中間者インターセプション)は動的に取得されるものの、ボット バージョンや攻撃活動名などの静的な値も送信されることが分かります。作成されたクエリ文字列は次のようになります。

botid=26C47136!A5A4B18A!F2F924F2&ver=1.759&up=18294&os=6110&ltime=-8&token=0&cn=1brz&av=&dmn=&mitm=0

Shifuの内部バージョンは“1.759”で、当該の攻撃活動名は“1brz”であることが分かります。

Shifuのクエリ文字列を、2014年2月に追跡した最近のShizバージョンの1つ(内部バージョン5.6.25)と比較すると、これら2つのマルウェアには類似性があることが分かります。

botid=%s&ver=5.6.25&up=%u&os=%03u&ltime=%s%d&token=%d&cn=sochi&av=%s

改変されたRC4暗号化アルゴリズム

Shifuは、RC4暗号化アルゴリズムの改変されたバージョンを使用します。弊社はPythonでこのアルゴリズムを再構築することで、メイン ペイロードに存在するドメイン名“klyatiemoskali.bit”がどのように暗号化されるかを例証しています。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

import os

import binascii

 

###initial values##########

string = "klyatiemoskali.bit"

seed =

"fnbqooqdaixfueangywblgabirdgvkewdyqgfqaioluesyrpryfkjerfsouemaxnavrkguxmcmhckwprunurmhehclermtufwi

yjbqhwlunbunuumeowfjmerxppxrgaxukyx"

buffer = [0] * (len(string))

table_encr = [0] * 0x102

table_encr[0x100] = 1

table_encr[0x101] = 0

###########################

 

###string2buffer###########

i = 0

while (i<len(string)):

    char_1 = string[i]

    int_1 = ord (char_1)

    buffer[i] = int_1

    i += 1

###string2buffer###########

 

###encryption table########

i = 0

while (i < 0x100):

    table_encr[i] = 0x000000ff&i

    i += 1

 

i = 0

j = 0

while (i < 0x100):

    char_1 = seed[j]

    int_2 = ord (char_1)

    table_encr[i] ^= int_2

    i += 1

    j += 1

    if (j == len(seed)):

        j = 0

###########################

 

###encryption##############

size_1 = len(string)

i = 0

while (size_1 != 0):

    byte_buf = buffer[i]

    ind_1 = table_encr[0x100]

    ind_2 = table_encr[ind_1]

    ind_3 = 0x000000ff&(ind_2 + table_encr[0x101])

    ind_4 = 0x000000ff&(table_encr[ind_3])

    table_encr[ind_1] = ind_4

    table_encr[ind_3] = ind_2

    buffer[i] = 0x000000ff&(table_encr[0x000000ff&(ind_2 + ind_4)] ^ byte_buf)

    table_encr[0x100] = 0x000000ff&(ind_1 + 1)

    table_encr[0x101] = ind_3

    i += 1

    size_1 -= 1

 

i = 0

str_1 = ""

while (i < len(string)):

    str_1 = str_1 + chr(buffer[i])

    i += 1

###########################

    

###output##################

print ("Cleartext string: %s" % string)

print ("Encrypted: 0x%s" % binascii.hexlify(str_1))

###########################