執筆者:Edmund Brumaghin、Earl Carter、Emmanuel Tacheau
サマリー
Google は世界で最も広く使用されている検索エンジンです。Google でちょっと検索すれば、知りたいことがすぐに見つかります。ただし、Google 検索によって返されるリンクが必ずしも安全とは限りません。今回のキャンペーンでは、攻撃者がここに目を付けました。バンキング型トロイの木馬「Zeus Panda」を拡散するため、検索エンジンの最適化(SEO)を駆使して悪意のあるリンクを検索結果に蔓延させたのです。これは特定の銀行関連キーワードで検索結果に不正リンクを表示させる(SEO ポイズニング)手口で、従来とは異なる方法で感染を効率的に拡大できます。
銀行関連キーワードを狙うことで、金融機関の Web サイトを頻繁に利用しているユーザに狙いを定め、クリックした際の感染率を最大限に高めています。これにより攻撃者は、銀行関連情報(クレデンシャル、クレジット カード情報など)を効率的に入手できます。ただし今回のマルウェアの配布で使用されたインフラの全体的な構成と動作は従来とは異なっており、興味深いものでした。これは、攻撃手口が継続的に改良されていることを示す一例であり、新たな脅威から防御し続けるのに脅威インテリジェンスが不可欠なことを裏付けています。
初期の攻撃ベクトル
感染プロセスの初期では、電子メールベース以外の攻撃ベクトルが使用されていると考えられます。今回のキャンペーンでは、Google などの検索エンジンで標的ユーザが検索しそうな特定の検索キーワード セットが狙われています。侵害された Web サーバを利用して、悪意のある検索結果が上位に表示されるように仕組むことで、標的ユーザがクリックする危険性が高められています。
ある例では、次の検索キーワードが狙われていました。
今回のキャンペーンでは、検索結果のトップページに複数の不正リンクを表示させることに成功しています。上図の例で標的にされたキーワードは「al rajhi bank working hours in ramadan」(ラマダン期間中の al rajhi 銀行の営業時間)です。以下の画像は、Google の検索結果で表示された不正リンクの例です。
検索結果で表示された評価数を見ても分かるように、評価やレビューが存在するビジネス Web サイトが侵害され利用されているため、ユーザにはそれらの不正サイトが正当なものに映ります。
幅広いキーワード グループが標的にされていますが、それらの大半は、標的ユーザが検索しそうな銀行・金融関連の情報に合わせてカスタマイズされていました。さらに、一部の地域は直接狙われていたようです。多くのキーワード グループでは、インドや中東の金融機関が具体的に言及されていました。このキャンペーンでターゲットとされていたキーワード検索の例をいくつか以下に記載します。
「nordea sweden bank account number」
「al rajhi bank working hours during ramadan」
「how many digits in karur vysya bank account number」
「free online books for bank clerk exam」
「how to cancel a cheque commonwealth bank」
「salary slip format in excel with formula free download」
「bank of baroda account balance check」
「bank guarantee format mt760」
「free online books for bank clerk exam」
「sbi bank recurring deposit form」
「axis bank mobile banking download link」
さらに、Talos が分析したすべてのケースでは、マルウェア感染経路となったページのタイトルにさまざまなフレーズが追加されていました。分析では「intitle:」検索パラメータを使用することで、悪意のあるペイロードに誘導する最初のリダイレクションに使用された不正ページを、数百件も断定できました。こうしたフレーズの例には、下記のようなものがあります。
「found download to on a forum」
「found global warez on a forum」
「can you download free on the site」
「found download on on site」
「can download on a forum」
「found global downloads on forum」
「info site download to on forum」
「your query download on site」
「found download free on a forum」
「can all downloads on site」
「you can open downloads on」
これらの侵害されたサーバでホストされているページを被害者が参照しようとすると、複数段階にわたるマルウェア感染プロセスが始まることになります。このプロセスについては次のセクションで詳しく説明します。
ウイルスに感染していることを画面上に表示して偽の電話番号(技術サポート)に誘導する従来と同じリダイレクション手口や関連インフラがここでも使用されていますが、その「ウイルス」が Zeus であるのはいかにも皮肉です。
感染プロセス
被害者が悪意のある Web ページにアクセスすると、侵害されたサイトは Javascript を使用して、中間サイトでホストされている Javascript にクライアントをリダイレクトします。
この結果、クライアントは document.write() メソッドで指定されたアドレスにある Javascript を取得して実行します。後続のページにも同様の機能があり、ここでは別のページへの HTTP GET リクエストが発生します。
次に、中間サーバが HTTP ステータス コード 302 で応答し、クライアントを別の侵害されたサイトにリダイレクトします。このサイトが、実際に悪意のある Word 文書をホストするために使用されます。その結果、クライアントはこのリダイレクションに従い、悪意のある文書をダウンロードします。これは一般に「302 Cushioning」と呼ばれる手法であり、エクスプロイト キットでよく使用されています。
リダイレクションに従うと、悪意のある Microsoft Word ドキュメントがダウンロードされます。
悪意のある Word ドキュメントがダウンロードされると、ファイルを開くか保存するかを尋ねるプロンプトがブラウザに表示されます。文書を開くと、下記のように、[編集を有効にする] をクリックしてから [コンテンツを有効にする] をクリックするよう求めるメッセージが表示されます。
これらの指示に従うと、Word ドキュメントに埋め込まれている悪質なマクロが実行されます。これらのマクロは PE32 実行ファイルをダウンロードして実行するため、これによってシステムが感染します。マクロ コード自体は、難読化された非常に基本的なものです。マクロ コードは、悪意のある実行可能ファイルをダウンロードし、「obodok.exe」などのファイル名でシステム上の %TEMP% ディレクトリに保存します。
悪意のある実行可能ファイルは、次の URL でホストされていました。
hXXp://settleware[.]com/blog/wp-content/themes/inove/templates/html/krang.wwt
マクロは以下の Powershell コマンドを使用して、このプロセスを開始します。
悪意のある実行可能ファイルをホストしているドメインについて DNS 関連情報を確認すると、2017 年 6 月 7 日と 2017 年 6 月 8 日の間に、ドメイン解決を試みる DNS 要求の急上昇が 2 度発生していたことが判明しました。
Settleware Secure Services, Inc. は、各種ドキュメントの電子署名(e-Signing)サービスを提供している企業です。e-Signing サービスは、不動産分野のエスクローなどでも使用されており、同社は eNotary サービスも提供しています。
マルウェアの動作
キャンペーンで使用された悪意のあるペイロードは、Zeus Panda の新しい亜種であると考えられます。Zeus Panda とは、銀行関連などの秘密情報を不正取得するためのバンキング型トロイの木馬です。Talos が分析したペイロードは多段階のペイロードでした。最初の段階では、分析をより困難にし、実行を長期化させて検出を回避するよう設計された、複数の分析対策手口が使用されていました。また、自動分析環境やサンドボックスで実行されることを回避するための手法も複数使用されていました。バンキング型トロイの木馬 Zeus Panda については、こちらでも詳しく説明されていますが、マルウェアが使用する第 1 段階のパッカーについて今回はより詳しく説明します。
マルウェアはまず、システムのキーボード マッピングを照会して、システムで使用されている言語を判別します。以下のキーボード マッピングのいずれかが検出された場合、実行を終了します。
- LANG_RUSSIAN
- LANG_BELARUSIAN
- LANG_KAZAK
- LANG_UKRAINIAN
マルウェアは、以下のハイパーバイザ環境またはサンドボックス環境内で実行されているかどうかを判断するためのチェックも行います。
- VMware
- Virtual PC
- VirtualBox
- Parallels
- Sandboxie
- Wine
- SoftICE
マルウェアの分析で広く使用されているツールやユーティリティが存在しないことも確認します。次の一覧表には、マルウェアが実行する環境チェックがすべて掲載されています。
環境チェックのいずれかに引っ掛かると、バッチ ファイルを %TEMP% ディレクトリに書き込み、それを Windows コマンド プロセッサから実行することでマルウェア自体を削除します。このバッチ ファイルを保存する際は、RDTSC により取得された時間ベースのファイル名が使用されます。元の実行可能ファイルが削除されると、バッチ ファイル自体も %TEMP% から削除されます。
悪意のあるペイロードの初期段階は、分析を妨害するために、無効なパラメータで呼び出される有効な API コールを何百種類も備えています。また、構造化例外処理(SEH)を利用して独自コードにパッチを適用しており、現在のカーソル位置を複数回照会して保存し、アクティビティを検出します。これにより、サンドボックスや自動分析環境で実行されている場合はそのことが特定されます。次の例では、無効なパラメータで有効な API コールを使用しています。この中では、カーソル位置を取得するコールは有効ですが、ScreentoClient へのコールには無効なパラメータが含まれています。
次の例は、マルウェアの分析時にアナリストの時間や労力を浪費させるための偽のコールです。逆アセンブラ対策で無効なオペコードが使用されることはよくありますが、今回はそれが何百個もの構造体の前にあるため、(ダミーでない)有効な変数の洗い出しが難しくなっています。
次のスクリーンショットは、IDA によって自動分析されたダミー構造体の一覧です。これらの対策はすべて、分析プロセスを妨げ、コード実行フローの特定を困難にする目的があります。
分析を進めると、点在する(ダミーでない)有効な命令が発見されました。以下の EAX レジスタは変数に格納された後、ヒープ メモリ チャンクを割り当てて独自のアンパック コードを起動するために再利用されます。
マルウェアはまた、数百のケース比較を作成するなど、他の手法も使用して分析を大幅に難しくしており、コードのトレースを非常に困難にしています。
次のプロセス例では、擬似コード内に複数の if 条件文が含まれており、コードの分析を妨げる仕組みを垣間見ることができます。
マルウェア コードを復号するために、例外ハンドラがインストールされます。この例外ハンドラは、実行を続けるために一部のメモリ バイトを解読します。
次の画面では、まさに SEH が初期化されたところを確認できます。
同じルーチン内で、以下のコードの復号ルーチンが実行されます。また一部のサンドボックスでは、自動分析を妨げるため多数の例外コールによりクラッシュが引き起こされることも確認されました。
データが復号され、割り当て済みバッファに格納されると、コールバック ルーチンの値をパッチ済みメモリに設定します。これにより、既知のメカニズム(EnumDisplayMonitor のコールバック ルーチン機能)を利用して winmain に戻り、実行を続行します。
実行中、マルウェアはパッチを適用し続け、実行を続行します。
文字列は XOR 値を使用して暗号化されます。ただし、すぐに検出されることを防ぐため、各文字列には別個の XOR 値が使用されています。以下に、文字列の復号に使用できる IDA Python コードをいくつか挙げます。
def decrypt(data, length, key): c = 0 o = '' while c < length: o += chr((c ^ ord(data[c]) ^ ~key) & 0xff) c +=1 return o def get_data(index): base_encrypt = 0x1251A560 key = Word(base_encrypt+8*index) length=Word(base_encrypt+2+8*index) data=GetManyBytes(Dword(base_encrypt+4+8*index), length) return key, length, data def find_entry_index(addr): addr = idc.PrevHead(addr) if GetMnem(addr) == "mov" and "ecx" in GetOpnd(addr, 0): return GetOperandValue(addr, 1) return None for addr in XrefsTo(0x1250EBD2, flags=0): entry = find_entry_index(addr.frm) try: key, length, data = get_data(entry) dec = decrypt(data, length, key) print "Ref Addr: 0x%x | Decrypted: %s" % (addr.frm, dec) MakeComm(addr.frm, ' decrypt_string return :'+dec) MakeComm(ref, dec) except: pass
これらのコードにより、IDA 上で復号・参照された文字列がコメント化されています。0x1250EBD2 は復号ルーチンを表しており、0x1251A560 は暗号化された文字列テーブルです。
コメントはマルウェアの各機能を説明するため逆アセンブラに挿入されています。
API コールでは、以下のアルゴリズムを使用する、広く知られたハッシュ API コールも使用されています。このコードも、IDA 内で API コールをコメント化するために使用されています。
def build_xor_api_name_table(): global table_xor_api if not table_xor_api: table_xor_api = [] entries = 0 while entries < 256: copy_index = entries bits = 8 while bits: if copy_index & 1: copy_index = (copy_index >> 1) ^ 0xEDB88320 else: copy_index >>= 1 bits -= 1 table_xor_api.append(copy_index) entries += 1 return table_xor_api def compute_hash(inString): global table_xor_api if not table_xor_api: build_xor_api_name_table() if inString is None: return 0 ecx = 0xFFFFFFFF for i in inString: eax = ord(i) eax = eax ^ ecx ecx = ecx >> 8 eax = eax & 0xff ecx = ecx ^ table_xor_api[eax] ecx = ~ecx & 0xFFFFFFFF return ecx
マルウェアは、以下の引数をとる一般的な関数を使用します。
- モジュールに対応する ダブルワード。
- (読み込まれていない場合)モジュールの暗号化文字列テーブルに対応するインデックス エントリ。
- API 自体のハッシュ値。
- API コール アドレスを格納するインデックス。
以下の擬似コードの例では、スナップショット リストを使用してメモリ内へのプロセス ルックアップを実行するためだけに API コールが実行されています。
マルウェアが完全に実行され始めると、以下のフォルダに実行可能ファイルをコピーし、
C:\Users\<Username>\AppData\Roaming\Macromedia\Flash Player\macromedia.com\support\flashplayer\sys\
以下のレジストリ エントリを作成して永続性を維持します。
HKEY_USERS\<SID>\Software\Microsoft\Windows\CurrentVersion\Run\extensions.exe
このレジストリ エントリのデータ値は、マルウェアが作成したパス/ファイル名に設定されます。このデータ値の例を以下に示します。
"C:\Users\<Username>\AppData\Roaming\Macromedia\Flash Player\macromedia.com\support\flashplayer\sys\extensions.exe"s\\0
このケースでは、感染ユーザのプロファイルにドロップされたファイルの名前は「extensions.exe」でしたが、実行可能ファイルの作成時にいくつかの異なるファイル名が使用されていることも確認しました。
バンキング型トロイの木馬 Zeus Panda の解凍後の動作に関する詳細は、こちらで公開されています。
まとめ
標的上でマルウェアを実行させてペイロードに感染させるため、攻撃者は新しい方法を常に模索しています。そのために多用される攻撃手法には、スパム、マルバタイジング、水飲み場型攻撃などがあります。Talos は、疑いを持たないユーザにバンキング型トロイの木馬 Zeus Panda を配布する、「SERP ポイズニング」の全体像を明らかにしました。この中で攻撃者は検索エンジンに特定の検索キーワードを登録し、検索結果で悪意のあるページが上位に表示されるようにします。
脅威状況は絶えず進化しており、攻撃者は常に新しい手口を探しています。階層化された堅固な多層防御戦略を実装することで、絶え間なく変化する脅威状況にも万全を期すことができます。しかしユーザ側も、リンクをクリックしたり、添付ファイルを開いたり、あるいは Google の検索結果をやみくもに信用したりする前に、用心する必要があります。
カバレッジ
お客様がこの脅威を検出してブロックできる別の方法を以下に記載します。
Advanced Malware Protection(AMP)は、これらの攻撃者によるマルウェアの実行の阻止に最適です。
CWS や WSA の Web スキャンは、悪意のある Web サイトへのアクセスを阻止し、それらの攻撃に使用されたマルウェアを検出します。
NGFW や NGIPS、および Meraki MX などのネットワーク セキュリティ アプライアンスは、今回のような脅威でも検出できます。
AMP Threat Grid は、悪意のあるバイナリを特定し、すべてのシスコ セキュリティ製品に保護機能を組み込みます。
シスコのセキュア インターネット ゲートウェイ(SIG)である Umbrella は、社内ネットワークの内外で悪意のあるドメイン、IP、URL への接続をブロックします。
オープンソース Snort サブスクライバ ルール セットをお使いであれば、Snort.org で購入可能な最新のルール パックをダウンロードすることで、システムを最新状態に維持できます。
IOC(侵入の痕跡)
今回のキャンペーンとの関連性が特定された侵入の痕跡を以下に示します。最初のリダイレクションを実行していたドメインの一部はすでに停止されていますが、キャンペーンの影響を判断できるよう、これらも IOC リストに含めています。
Maldoc の配布元ドメイン:
mikemuder[.]com
Maldoc の配布元 IP アドレス:
67.195.61[.]46
ドメイン:
acountaxrioja[.]es
alpha[.]gtpo-cms[.]co[.]uk
arte-corp[.]jp
bellasweetboutique[.]com
billing[.]logohelp[.]com
birsan[.]com[.]tr
bitumast[.]com
bleed101[.]com
blindspotgallery[.]co[.]uk
blog[.]mitrampolin[.]com
calthacompany[.]com
cannonvalley[.]co[.]za
coinsdealer[.]pl
corvettescruisingalveston[.]com
craigchristian[.]com
dentopia[.]com[.]tr
dgbeauty[.]net
dressfortheday[.]com
evoluzionhealth[.]com
gemasach[.]com
japan-recruit[.]net
jaegar[.]jp
michaelleeclayton[.]com
www[.]academiaarena[.]com
www[.]bethyen[.]com
www[.]bioinbox[.]ro
www[.]distinctivecarpet.com
www[.]helgaleitner[.]at
www[.]gullsmedofstad[.]no
usedtextilemachinerylive[.]com
garagecodes[.]com
astrodestino[.]com[.]br
中間リダイレクト ドメイン
dverioptomtut[.]ru
Word 文書のファイル名:
nordea-sweden-bank-account-number.doc
al-rajhi-bank-working-hours-during-ramadan.doc
how-many-digits-in-karur-vysya-bank-account-number.doc
free-online-books-for-bank-clerk-exam.doc
how-to-cancel-a-cheque-commonwealth-bank.doc
salary-slip-format-in-excel-with-formula-free-download.doc
bank-of-baroda-account-balance-check.doc
bank-guarantee-format-mt760.doc
incoming-wire-transfer-td-bank.doc
free-online-books-for-bank-clerk-exam.doc
sbi-bank-recurring-deposit-form.doc
Word 文書のハッシュ:
713190f0433ae9180aea272957d80b2b408ef479d2d022f0c561297dafcfaec2(SHA256)
PE32 配布 URL:
settleware[.]com/blog/wp-content/themes/inove/templates/html/krang.wwt
PE32 ハッシュ:
59b11483cb6ac4ea298d9caecf54c4168ef637f2f3d8c893941c8bea77c67868(SHA256)
5f4c8191caea525a6fe2dddce21e24157f8c131f0ec310995098701f24fa6867(SHA256)
29f1b6b996f13455d77b4657499daee2f70058dc29e18fa4832ad8401865301a(SHA256)
0b4d6e2f00880a9e0235535bdda7220ca638190b06edd6b2b1cba05eb3ac6a92(SHA256)
C2 ドメイン:
hppavag0ab9raaz[.]club
havagab9raaz[.]club
C2 IP アドレス:
82.146.59[.]228
本稿は 2017年11月2日に Talos Group のブログに投稿された「Poisoning the Well: Banking Trojan Targets Google Search Results」の抄訳です。