This post is also available in: English (英語)
概要
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月にコンパイルされました。以下の図は、実行後に復号化処理を受ける各種のファイルが初期ローダーに含まれている様子を表しています。
最初の難読化済みローダー(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}”
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<ime=%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()が呼び出されます。
コマンド ライン引数
第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”)で埋め込まれます。最後に、一時的に暗号化されたメイン ペイロードが再度復号化されます。
次に、メイン ペイロードがメモリ内で解凍されます。その後、中断状態の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<ime=%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の前のバージョンに関するレポートは、FireEyeとFortinetが発行しています。
前のバージョンと比べて、コンピュータ名、ユーザー名、インストール日、システム ドライブ ボリューム シリアル番号を使用して作成される文字列の、スキャン対象である部分文字列のリストは長くなりました。
- 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)
次のスクリーンショットは、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<ime=%s%d&token=%d&cn=%s&av=%s&dmn=%s&mitm=%u
一部の情報(ボットID、稼働時間、オペレーティング システム バージョン、ローカル タイムスタンプ、トークン、アンチウイルス ソフトウェア、ワークステーションのドメイン名、検出された中間者インターセプション)は動的に取得されるものの、ボット バージョンや攻撃活動名などの静的な値も送信されることが分かります。作成されたクエリ文字列は次のようになります。
botid=26C47136!A5A4B18A!F2F924F2&ver=1.759&up=18294&os=6110<ime=-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<ime=%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)) ########################### |