This post is also available in: English (英語)
概要
Hancitorダウンローダーは、2016年6月の大規模攻撃以降は比較的静かでした。しかし先週、Palo Alto Networks AutoFocusによって、調査をしたところ、Hancitorマルウェアファミリの大幅な配信増加を発見しました。これらはH1N1からPony実行可能ファイルおよびVawtrak実行可能ファイルの配信に移行していました。並行して、同様の活動を確認したというレポートをその他の企業およびセキュリティリサーチャーから受け取ったため、さらなる調査を実施しました。
これらの文書の配信方法は一般的な悪意のある電子メール攻撃と同じでした。最近の請求書に関する件名、または期限切れの請求書など被害者の気を引く事柄にトラップが仕掛けられていました。これらのトラップは我々の予想通り、添付された実際の文書にマルウェアをドロップするためのVisual Basic(VB)マクロに興味深い方法を発見しました。
このブログではドロップ技法を詳細に確認します。この技法は技術的には新しくありませんが、このような方法で使用されるのを確認したのは初めてでした。最終目標は、バイナリが埋め込まれた場所を特定することですが、この投稿ではマクロおよび埋め込まれたシェルコードも説明します。
ワード文書
このセッションでは、SHA256ハッシュ‘03aef51be133425a0e5978ab2529890854ecf1b98a7cf8289c142a62de7acd1a’を含むファイルを観察していきます。これは、「コンテンツを有効」にして悪意のあるマクロを実行するための標準的な策略を含む典型的なMS Office OLE2 Word文書です。
Visual Basicエディターを開くと、このサンプルの2つのフォームおよび1つのモジュールを確認できます。
悪意のあるマクロ
Visual BasicはMicrosoft Windows APIコールを直接実行できます。このため、数多くの興味深い関数、まさにこのVBコードが実行している関数を実行できます。
ここで分かるように、マクロには、これが実行されているシステムのアーキテクチャを判定するロジックが含まれていて、32ビットまたは64ビットのプラットフォームで正しく実行する機能があります。最も興味深いコールはVirtualAlloc()、RtlMoveMemory()、およびCallWindowProcA()です。
このサンプルを最初に観察し始めたとき、主にペイロードの格納場所に関心を寄せたため、マクロがどのように機能するかを理解するためのデバッグを始めました。問題のペイロードはbase64エンコードされていて、‘choline’テキストボックスの‘Text’フィールドの値としてVBProjectのフォーム内に埋め込まれています。
追記として、本当に興味深いのは、作者が独自のbase64デコーダを実際にVBで書き込む際に苦労していることです。読者が調査できるようにこれを演習として残しておきますが、これはbase-Nエンコードがどのように機能するかの有益な概要です。このマクロ内の‘maria’モジュール全体がbase64デコーダです。
マクロbase64は、ペイロードをローカルバイト配列にデコードし、最初のAPIコールであるVirtualAlloc()に到達します。
このコールは、読み取り、書き込み、および実行(RWX)権限のあるメモリの特定のページを0x59B0000でコミットします。
その後、VBマクロは引き続き次のコールをRtlMoveMemoryに設定し、前のコールのメモリの場所およびbase64デコードされたバイト配列を使用してコールします。
WINWORD.EXEプロセスのメモリのその領域をダンプし、転送されたバイトと比較することによって素早く検証できます。
これまでにコードが実行可能メモリにコピーされたため、マクロは最後のAPIコールCallWindowProcA()を設定します。このコールに指定する最初の値は、このコード内の関数ポインタであるメモリオフセットの+2214です。2番目の値は、ファイルへのパスの文字列で、ハンドル用です。これらのアクションによって、コード実行がシェルコードにリダイレクトされます。
シェルコード
WINWORD.EXEに接続し、シェルコードの入口であるメモリ位置+2214 (0x8A6)のオフセットで停止すると、プログラム実行がこのコード パスへ移行するのを確認できます。
ここから、シェルコードはプロセス環境ブロック(PEB)を列挙することで、LdrLoadDLL()関数(LoadLibraryEx()関数と同様)のアドレスを取得し、その後、kernel32.dll内で使用する関数を探し始めます。
探している関数の値は、その他の値とともにシェルコードに埋め込まれ、後で使用するためのスタック上に作成されます。
これらの符号化された名前のセットに続き、シェルコードが次のsyscallに関心を示していることがわかります。CloseHandle()、ReadFile()、GetFileSize()、VirtualFree()、VirtualAlloc()、およびCreateFileA()。APIコールごとに、関数のアドレスを検索し、それをスタックに保存します。
次に、シェルコードはWord文書上でCreateFileA()を呼び出し、戻されたハンドルを受信します。それは、ファイル サイズ用のGetFileSize()に渡され、その後続いてVirtualAlloc()に渡され、ファイル コンテンツ(0x2270000)用のメモリ セクションが作成されます。最後に、ファイルをそのメモリ位置に読み込み、ハンドルを閉じます。
コピーがメモリへロードされると、マジック バイト0x504F4C41のメモリを通じて探索プロセスが開始します。これは、新しいメモリ ページの0x022836F3にあることが確認できます。
この時点で、バイナリらしいものを見つけました。最終ステップでは、それをデコードするだけです。シェルコードを見ると、それが0x22836FFで始まる各バイトに0x3を追加することがわかります。ここでの例では、下に示すように、その後、それが0x13でXORされます。
カウンタが0x13AAC (80556)に達すると、各バイトを操作し、バイナリを復号化するための一連のサブルーチンが開始されます。復号化ルーチンの後にブレークポイントを設定し、メモリ位置を確認すると、バイナリが復号化されたことを確認できます。この時点で、さらに分析するためにダンプできます。次のダンプされたメモリ内で、MZヘッダとPEヘッダを確認できます。
このドロッパーを使用して実行されるこの特定の攻撃活動の場合は、バイナリを起動する前に、それを%TMP%ディレクトリに配置し、最終的にそれ自体を‘%SYSTEMROOT%/system32/WinHost.exe’に書き込みます。
この時点で、Hancitorダウンローダーは完全に被害者のマシンにロードされ、そこで、さらなる悪意のある活動の実行に進みます。
結論
マクロベースの手法は極めて一般的ですが、マクロ ドロッパーとともにここで使用されている手法は興味深いバリエーションです。マクロ内のエンコードされたシェルコードから、VBコード内でネイティブAPIコールを使用して実行権を渡し、Word文書からの埋め込まれたマルウェアを見つけて復号化しています。これは、新しいHancitorの使い方であり、今後も注意深く追跡する必要があります。
Palo Alto Networksのお客様は、このブログで詳解したドロッパーとそれに含まれるHancitorペイロードから保護されます。AutoFocus Hancitorタグを通じて、引き続きこの脅威を追跡できます。さらに、すべてのHancitorダウンローダー サンプルは、WildFireで悪意のあるものとして識別されます。Hancitorによって使用されるドメインも悪意のあるものとして分類されます。
謝辞
Hancitorペイロードの詳細な分析については、Minerva Labsによるこの記事を参照してください。
セキュリティ侵害の兆候
以下は、380,000を超えるセッションから、今週の最新の攻撃活動でもっとも一般的に観察された電子メールの件名とファイル名の一部です。パターンは、正規表現または表現によって置き換えられます。
電子メールの件名
<domain> invoice for <month>
levi.com invoice for august
<domain> bill
<domain> deal
<domain> receipt
<domain> contract
<domain> invoice
metlife.com bill
metlife.com deal
metlife.com receipt
metlife.com contract
metlife.com invoice
ファイル名
artifact[0-9]{9}.doc
bcbsde.com_contract.doc
contract_[0-9]{6}.doc
generic.doc
price_list.doc_[0-9]{6}.doc
report_[0-9]{6}.doc
さらに、分析中にこれらのC2コールが観察されました。これらは、境界で‘/(sl|zaopy)/gate.php’を使用することで検出できます。
hxxp://betsuriin[.]com/sl/gate.php
hxxp://callereb[.]com/zapoy/gate.php
hxxp://evengsosandpa[.]ru/ls/gate.php
hxxp://felingdoar[.]ru/sl/gate.php
hxxp://gmailsign[.]info/plasma/gate.php
hxxp://hecksafaor[.]com/zapoy/gate.php
hxxp://heheckbitont[.]ru/sl/gate.php
hxxp://hianingherla[.]com/sl/gate.php
hxxp://hihimbety[.]ru/sl/gate.php
hxxp://meketusebet[.]ru/sl/gate.php
hxxp://mianingrabted[.]ru/zapoy/gate.php
hxxp://moatleftbet[.]com/sl/gate.php
hxxp://mopejusron[.]ru/sl/gate.php
hxxp://muchcocaugh[.]com/sl/gate.php
hxxp://ningtoparec[.]ru/sl/gate.php
hxxp://nodosandar[.]com/ls/gate.php
hxxp://nodosandar[.]com/zapoy/gate.php
hxxp://ritbeugin[.]ru/ls/gate.php
hxxp://rutithegde[.]ru/sl/gate.php
hxxp://surofonot[.]ru/sl/gate.php
hxxp://uldintoldhin[.]com/sl/gate.php
hxxp://unjustotor[.]com/sl/gate.php
hxxp://wassuseidund[.]ru/sl/gate.php
以下のYaraルールを使用すると、このブログで説明した特定のドロッパーと手法を検出できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
rule hancitor_dropper : vb_win32api { meta: author = "Jeff White - jwhite@paloaltonetworks @noottrak" date = "18AUG2016" hash1 = "03aef51be133425a0e5978ab2529890854ecf1b98a7cf8289c142a62de7acd1a" hash2 = "4b3912077ef47515b2b74bc1f39de44ddd683a3a79f45c93777e49245f0e9848" hash3 = "a78972ac6dee8c7292ae06783cfa1f918bacfe956595d30a0a8d99858ce94b5a" strings: $api_01 = { 00 56 69 72 74 75 61 6C 41 6C 6C 6F 63 00 } // VirtualAlloc $api_02 = { 00 52 74 6C 4D 6F 76 65 4D 65 6D 6F 72 79 00 } // RtlMoveMemory $api_04 = { 00 43 61 6C 6C 57 69 6E 64 6F 77 50 72 6F 63 41 00 } // CallWindowProcAi $magic = { 50 4F 4C 41 } // POLA condition: uint32be(0) == 0xD0CF11E0 and all of ($api_*) and $magic } |