AlphaLeon HTTPボットのアルファテスト
投稿者:Dennis Schwarz
投稿アーカイブ:関心の高い調査、マルウェア、リバース・エンジニアリング、脅威分析
ASERTは2015年8月に、Deep & Dark Web インテリジェンス・プロバイダFlashpointによってAlphaLeonと名付けられた脅威が発生しているという最初の警告を受けました。この脅威は、新しい「BANKER」マルウェア・ファミリになる可能性があるため、注意深くその動向を監視してきました。このマルウェアの検体をネットワーク上で見つけるのに時間がかかりましたが、この投稿では、これまでに判明した詳細を説明します。マルウェア・アナリストがAlphaLeon HTTPボットの「アルファテスト」を行いました。
ローダー
この投稿用に最初に分析した検体は、次のハッシュを持ちました。
- 945e4455e1b553186768ef890a7d2c15 (MD5)
- 6043a9d69eee2994d330b891d29115e95d5466fb0673932e85c16a4c0232b81b (SHA256)
この検体は有効なPDB文字列(H:\Alpha\Bot\Release\Loader.pdb)を含んでおり、これはAlphaLeonのローダーであることを示しています。検体のPEヘッダーを分析して、最近(2016-02-06 03:00:08)コンパイルされたことが判明しました。このローダーは、最初に、大量のWindows関数をAPIハッシング経由で解決します。ハッシング・アルゴリズムのPythonスニペットを次に示します。
hash_val = 0
for b in api_name:
hash_val = ((ord(b) << 16) ^ (ord(b) + 257 * hash_val)) & 0xffffffff
print "%s: 0x%x" % (api_name, hash_val)
後で使用するために、これらのAPI名をハッシュ値にマッピングするファイルを、当社のGithubに登録する予定です。注目すべき点は、分析を妨害するためにさらに2つの手法が使われていることです。1つ目は、ローダー内のほとんどの文字列がbase64を使用して難読化されていることです。2つ目は、マルウェアが仮想マシン・チェックを行い、すべてのプロセス名を次の一覧に対して確認することです。
- vmwareuser.exe
- vmwareservice.exe
- vmwaretray.exe
- vboxservice.exe
- vboxtray.exe
- vmtoolsd.exe
これらのプロセス名のいずれかが存在すると、ローダーはバッチ・スクリプトを使用して自身を削除し、終了します。次に、ローダーはそのリソース・セクションからファイルを抽出します。このプロセスで、AlphaLeonはマルウェアの長い伝統に従って、調査ジャーナリストBrian Krebsに対する愛情を示します。
ビットマップとして表示すると、リソースは、Krebsの「Krebs on Security」サイトが大きく変形し、切り詰められたバナーのような外観を示します。DLLファイルを含んでいるため、イメージは大きく変形しています。非表示のDLLの境界は、「WELOVEBRIAN」タグでマーキングされ、ファイルは次のPythonスニペットを使用することにより抽出できます。
fp = open("loader_rsrc", "rb")
data = fp.read()
fp.close()
start = data.find("WELOVEBRIAN") + 11
end = data.rfind("WELOVEBRIAN")
fp = open("loader_rsrc.dll", "wb")
fp.write(data[start:end][::2])
fp.close()
内容は次のようなファイルに保存されます。
C:\Documents and Settings\Administrator\Local Settings\Application Data\Microsoft\45996078.dll
このファイル名の数値部分は、GetTickCount関数により生成されます。永続化するために、次の値のレジストリ・エントリ「InternetUpdate」が追加されます
C:\WINDOWS\System32\rundll32.exe C:\Documents and Settings\Administrator\Local Settings\Application Data\Microsoft\45996078.dll,Entry
レジストリ・キーは、次のRunキーに追加されます。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
次のコンポーネントに進む前に、ローダーはいくつかのシステム情報を収集し、次のキーの下の「Cancer」レジストリ・エントリにエンコードして格納します。
HKEY_CURRENT_USER\Software\Microsoft\Zodiac
データは、次の文字変換を経て、base64でエンコードされます。
- +は–に変換
- /は_に変換
- =は,に変換
システム情報の文字列は、次のようになります。
5|1|Service Pack 3|1|COMPUTER1|Administrator|x86|1
この文字列には次の情報が含まれます。
- Windowsのメジャー・バージョン
- Windowsのマイナー・バージョン
- サービス・パック
- Windowsの製品の種類
- コンピューター名
- ユーザー名
- アーキテクチャ
- トークンが昇格されるかどうか
コア
前述のローダーは次の検体をロードします。
- 6f07ae114652dffe767b03d4d67cb301 (MD5)
- 2085db7e7764e0693fe128fa7530338af8c8c598d1f3a85a2299991248ec553a (SHA256)
この検体(H:\Alpha\Bot\Release\Core.pdb)のPDB文字列は、これがAlphaLeonのコア・コンポーネントであることを示しています。さらに、埋め込まれている文字列は、バージョンが0.9.4.2であることを示しています。そのメタデータから、検体はローダーの少し前(2016-02-06 01:17:50)にコンパイルされていることがわかります。
ローダーの場合と同じく、ほとんどのWindows関数は、APIハッシング・テクニックを使用して解決されます。これらの解決手順のほとんどは前述と同じアルゴリズムを使用しますが、一部はCarberpのGetApiメソッドを使用します。
コア・コンポーネントのほとんどの文字列は難読化されていますが、ローダーとは異なり、base64ではなく、さらに強力なXORエンコーディングが使用されています。これらは、次のIDA Pythonスニペットを使用することによりデコードできます。
- key = "030e180c1a1f".decode("hex")
- start = ScreenEA()
- encstr = GetString(ScreenEA(), -1, ASCSTR_C)
- #encstr = GetString(start, -1, ASCSTR_UNICODE)
- plain = []
- for i in range(len(encstr)):
- plain.append(chr(ord(encstr[i]) ^ ord(key[i % len(key)])))
- print "".join(plain)
実行は次のミューテックスを使用して開始されます。
{3283326157}
ミューテックス用に使用される数値は、GetVolumeInformation関数により返される、ルート・ボリュームのシリアル番号です。次に、ローダーによりレジストリに格納されたシステム情報が、「Zodiac」キーから取得され、コマンド&コントロール(C2)サーバー(alpha[.]highclasssoftware[.]ru)にHTTP POSTされます。
「d」パラメータには、以前のレジストリと同じようにエンコードされたシステム情報が含まれます。「b」パラメータはボットIDで、ルート・ボリュームのシリアル番号の16進数のCRC32ハッシュで構成されます。C2サーバーへの送信後、AlphaLeonはそのWebブラウザ・フォーム・グラバーを開始し、コマンド・ポーリングのループに入ります。コマンド・ポーリングでは、基本機能のみのHTTP GETリクエストが使用されます。
「id」クエリ・パラメータには、ボットIDが含まれます。C2はコマンドをプレーンテキストで返します。次の2つのコマンドが使用されている可能性があります。
- $execute
– ダウンロードおよび実行 - $update
– 自身の更新
コマンドが成功したか失敗したかに応じて、次のコマンド・ポーリングではクエリ文字列に「&task=ok」または「&task=no」が追加されます。
フォーム・グラバー
Webブラウザ・フォーム・グラバーの機能は、いくつかのパーツにより構成されます。最初に、AlphaLeonは自身を「explorer.exe」に挿入し、次の手順を実行するスレッドを起動します。
- 「CreateProcessW」関数をフックします。
- 「\\.\pipe\zodiac」名前付きパイプを作成します。
- パイプからプロセスIDを読み込みます。
- AlphaLeonをプロセスに挿入します。
「CreateProcessW」関数フックは、次の手順を実行します。
- 新規プロセスがFirefoxの場合、ユーザーのFirefoxプロファイルでSPDY機能を無効にします。
- 正規の「CreateProcessW」を実行します。
- 新規プロセスがWebブラウザの場合、「zodiac」名前付きパイプを開きます。
- WebブラウザのプロセスIDをパイプに書き込みます。
Webブラウザ・プロセスは、次のプロセス名を検索して決定されます。
- iexplore.exe
- MicrosoftEdge.exe
- IEXPLORE.EXE
- firefox.exe
- mozilla.exe
Firefox内に侵入したら、AlphaLeonは「PR_Write」関数をフックします。ライブラリをフックするサードパーティ製関数が使用される可能性があります。この関数フックは正規の「PR_Write」関数を実行し、HTTPフォーム・データの署名が書き込みバッファに存在しないかどうかを検証します。見つかった場合、そのデータを取得して、次のようにC2に返します。
ここで、「bid」はボットID、「type」は「フォーム・グラバー」に対しては「fg」、「data」には、盗み出したフォーム・データが含まれます。前述と同じく、データはbase64を使用してエンコードされ、一部の文字は変換されます(ここでは、「+」と「/」の文字のみが変換されます)。次に、AlphaLeonにより追加された区切り文字を含むデコード例を示します。
----------FIREFOX_FGRAB----------
POST /html/action_page.php HTTP/1.1
Host: www.w3schools.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://www.w3schools.com/html/tryit.asp?filename=tryhtml_form_submit_id
Cookie: _ga=GA1.2.1186174243.1434549841; _gat=1; ASPSESSIONIDQSDTQADR=CIJPAHMDHLCGEPOIFFDFECGE
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 14
lastname=Mouse
----------FIREFOX_FGRAB_END----------
Internet Explorerの場合も、同様の処理が行われます。最初に、Firefoxフックに基づいて、Internet ExplorerのSPDYを無効にしようとしますが、「EnableSPDY3_0」内のコードのバグにより、レジストリ・エントリは無効を意味する「0」の代わりに「1」に設定されます。また、「TabProcGrowth」レジストリ・エントリがオフに設定されるので、ブラウザのタブは同じInternet Explorerプロセス内で実行します。次に、その「HttpSendRequestW」関数がフックされ、フォーム・データの検索と取得が行われます。
フォーム・グラバー・バージョン2
この調査の過程で、AlphaLeonのフォーム・グラバー・プラグイン(S:\Projects\AlphaLeon\Release\AlphaFGrab.pdb)の2つ目のバージョンが検出されました。
- 5df0e520286e14e5c093c67e9187519e (MD5)
- e8bddb5e77c354876de17db907c4686d53a0bea712a73d7a1eaae0c208563a43 (SHA256)
このバージョンは、前述の検体の約5か月前(2015-09-20 21:58:47)にコンパイルされており、スタンドアロンDLLとしてパッケージ化されています。そのローダーとコア・コンポーネントは見つかっていません。コーディングの分析から、別の開発者がこのコードを記述したように思われます。バージョン1との類似性もありますが(大半はフッキング・ライブラリと取得方法)、次に示す多くの相違があります。
-
Webブラウザに挿入されるかどうかは、次のプロセス名を検索することにより判断されます。
- iexplore.exe
- firefox.exe
- chrome.exe
-
Internet Explorerでは、さらに次の関数がフックされます。
- InternetReadFileExW – 正規関数の単なるラッパー
- InternetQueryDataAvailable – 正規関数の単なるラッパー
- InternetConnectW – 詳細は以降を参照
- HttpOpenRequestW – 詳細は以降を参照
- Firefoxでは、「PR_Read」もフックされますが、正規関数のラッパーになるだけです。
- Chromeに対するフッキングの詳細は、将来の調査に委ねられていますが、前述の「HttpSendRequestW」と「PR_Write」に対するフックと類似の機能であるように思われます。
- 取得したフォーム・データを「/krebsonsecurity/plugins_fg.php」に格納します。
-
データ取得で使用されるUser-Agentは次のとおりです。
- Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0)
最も興味深い相違点は、「BANKER」マルウェアの基盤となる、Web挿入コードの始まりのようなものを含んでいることです。これらスニペットの、具体的には機能しない「プレースホルダー」コードをより正確に呼び出します。1つ目のスニペットは、DLLに文字列としてハードコードされている、またはPEファイル・ソースに格納されているXMLに類似のデータを解析しようとします。この検体は、これらの場所のいずれにもデータを含んでいませんが、解析処理から判断して、Web挿入ルールは次のようになると考えられます。
<target url="$URL" uri="$URI"></target>
<old_source>$OLD_SOURCE</old_source>
<new_source>$NEW_SOURCE</new_source>
解析後に、データはどこからも使用または参照されません。2つ目のコード・スニペットはInternet Explorerフック関数にハードコードされており、次のように解釈可能なWeb挿入例となっています。
$OLD_SOURCEと$NEW_SOURCEはコード内でこの他には参照されていませんが、$URLと$URIはそれぞれ「InternetConnectW」関数フック内の「lpszServerName」、「HttpOpenRequestW」関数フック内の「lpszObjectName」と比較されます。それらが一致すると、グローバル・フラグが設定されます。
未完成で機能しないWeb挿入実装はまったく脅威ではありませんが、コードが今後どう進展するかを考える際のヒントになります。
結論
フォーム・グラバーのURL内の「plugins.php」と「plugins_fg.php」が示唆し、Flashpointのレポートが言及しているように、AlphaLeonはその他のプラグインをサポートします。しかしながら現時点では、ローダー、コア、および2つのフォーム・グラバー・コンポーネントしか明らかになっていません。これまでにリバース・エンジニアリングされた部品は依然として開発段階にあるように思われるので、将来において、新しい機能が見つかる可能性は極めて大きいと考えられます。ASERTは引き続きAlphaLeon脅威をモニタリングし、この脅威が引き続き発展し完全な「BANKER」に成長するのを注意深く見つめていきます。