Shifuバンキング型トロイの木馬の2016年の更新

By

Category: Unit 42

Tags: , , ,

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月にコンパイルされました。以下の図は、実行後に復号化処理を受ける各種のファイルが初期ローダーに含まれている様子を表しています。

図1 Shifuのファイル構造
図1 Shifuのファイル構造

最初の難読化済みローダー(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}”

図2 Shifuミューテックスおよび関連づけられたsvchostプロセス
図2 Shifuミューテックスおよび関連づけられた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され、即座に復号化されます。復号化された文字列:

エクスプロイト インジェクターと埋め込み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ローダー シェルコードである、このアドレスにジャンプします。シェルコードの呼び出しは、以下のとおりです。

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

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

次に、カスタム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
図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と比較されます。これは、次のように逆アセンブルされます。

このコードは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レジストリに格納されている暗号化されたメイン ペイロードと初期ローダー パス
図4Windowsレジストリに格納されている暗号化されたメイン ペイロードと初期ローダー パス

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

メイン ペイロード分析

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

APIの難読化

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

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

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

持続手法

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

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

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)

図5 77.66.108.93のNamecoin DNSサーバ情報
図5 77.66.108.93のNamecoin DNSサーバ情報

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

図6 Wiresharkで捕捉されたShifuネットワーク トラフィック
図6 Wiresharkで捕捉された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について次の情報を取得できます。

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

どちらのドメインも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”がどのように暗号化されるかを例証しています。