はじめに
Qakbotは10年以上前から存在するバンキング型トロイの木馬で、QBotまたはPinkslipbotとしても知られています。2007年に発見されて以来、継続的に開発・メンテナンスが行われてきました。
Qakbotは、世界でも主要なバンキング型トロイの木馬の1つになりました。Qakbotの主な目的はログイン情報やパスワードなどの認証情報を盗むことですが、金融業務をスパイし、自分自身を拡散し、ランサムウェアをインストールして、感染した組織からの収益を最大化する機能を有しています。
Qakbotは通常、被害者へ宛てたメールによって配信され、メール内のリンクまたはメールの添付ファイルのいずれかの形態を持ちます。メールの添付ファイルには、通常はQakbotのペイロードをダウンロードするドキュメントが含まれています。最近Menlo Labsでは、こういったQakbotのキャンペーンを複数確認しました。
このブログでは、さまざまなHEAT(Highly Evasive Adaptive Threat:高度に回避的で適応型の脅威)テクニックを使用するさまざまなQakbotキャンペーン、およびQakbotペイロードの仕組みについて、詳しく解説します。
Qakbotが使用するHEATテクニック
Menlo Labsが確認した、Qakbotキャンペーンで使用されるHEATテクニックは、以下のとおりです:
- ハイパーリンクを含むメールルアー
- Excel 4.0 マクロ
- Follinaエクスプロイト(CVE-2022-30190)
- HTMLスマグリング
これらのテクニックの例をそれぞれ紹介します。
ハイパーリンクを含むメールルアー
このキャンペーンでは、良性のドメインを侵害して悪意のあるペイロードをホストさせ、ペイロードへのリンクをメールで送信します。Qakbotは既存の防御策を回避するために、既知のHEATテクニックであるパスワード保護されたZIPファイルを使用しました。以下のスクリーンショットは、VT上でのこれらのパスワードで保護されたペイロードの検知が不十分であることを示しています。
以下のスクリーンショットは、Qakbotが既存の防御を回避するために使用するアクセス方法を示したものです。
この攻撃のキルチェーンは以下の通りです:
- 悪意のあるZIPファイルを指し示すURL(hxxp[://]zigmatravels[.]lk/inmo/Main3173988897[.]zip)を記載したメールが被害者に送信されます
- このZIPファイルはパスワードで保護されています(pwd - U523 md5 - afd1d504d88971e6f09d89e9dde8aeb8)
- このZIPファイル内には、PowerShellコマンドやJSを簡単に指定して実行できる機能を持ったリンクファイルが含まれています
- リンクファイル(md5 - 622D21C40A25F9834A03BFD5FF4710C1)を開くと、JSファイル(md5 - 76cd1dafc4d0fd89e228fe82a721f6)がダウンロードされ、JSファイルはQakbotペイロードをダウンロードします
以下のスクリーンショットは、悪意のある.lnkダウンロードJSファイルの1つです。
難読化されたJSファイルは実行時に復号化され、以下のようにC2からペイロードをダウンロードし、実行します。
Excel 4.0 マクロ
このキャンペーンでは、Excel 4.0マクロを使用してスプレッドシートのセルにコマンドを追加し、メールの添付ファイルを標的に送信します。
以下は、Excel 4.0マクロを使用してQakbotを配信する、添付ファイル付きメールの例です。
Excelファイルが添付されたメールです。
XLS文書を開くと、Excel 4.0のマクロを実行するためにマクロを有効にするかどうか尋ねられます。
XLSファイル内のこれらのコマンドは、C2からペイロードをダウンロードして実行します。
CVE-2022-30190
このキャンペーンでは、Follinaとも呼ばれるCVE-2022-30190の脆弱性を使用してQakbotが配信されました。これが実行されると、エクスプロイトを含むドキュメントはms-msdt URLプロトコルを使用してPowerShellコードを実行する外部HTMLファイルを呼び出します。
以下は、CVE-2022-30190を使用してQakbotを配信する添付ファイル付きメールの例です。
CVE-2022-30190 (md5 - 7a91b01a037ccbfe6589161643d0a65a) を使ったドキュメントでQakbotを配信する例を以下に挙げます。
ドキュメントを開くとHTMLファイルをダウンロードしようとし、さらにQakbotのペイロードをダウンロードします。
HTML (md5 - ea48f95ab4f3ca3b0c687a726cb00c49)
HTML スマグリング
このキャンペーンでは、特別に細工されたHTMLの添付ファイルやWebページが、ファイアウォールの内側でローカルにマルウェアを構築します。
以下は、HTMLスマグリングの添付ファイルを持つメールの例です。
このキャンペーンでは、以下のようにスパムメールにBase64でエンコードされたHTMLファイル(md5- 2881945BDF1DB34216CC565FEF4501D4)が添付されています。
「var text」関数は以下のように、Adobeのイメージとパスワード保護されたZIPファイル「Report Jul 14 71645.zip」(md5- 5F57C9BF0923DE15046CCB14E41CE0A6 pwd - abc444)でBase64エンコードされており、実行時に構築されます。
本攻撃の感染チェーンは、以下の図のようになります。
HTMLスマグリングの手法を用いたQakbot攻撃の感染チェーンは以下の通りです:
- 被害者がHTMLメールの添付ファイルを開きます
- HTMLファイルがBase64フォーマットをデコードしてペイロードを構築し、Adobeのイメージとパスワード保護されたZIPファイルを表示します
- このZIPファイルをパスワードで解凍すると、被害者のマシンにISOファイル「Report Jul 14 71645.iso」が投下されます
- Qakbotペイロードを含むISOファイルが被害者のマシンに進入します
Qakbotペイロードの解析
次に、ISOファイルを使ったQakbotペイロードの動作と、Qakbotの実行に関与する内部コンポーネントについて説明します。
Report Jul 14 71645.iso
アーカイブからダウンロードされたISOファイルには、7533.dll、calc.exe、Report Jul 14 71645.lnk、およびWindowsCodecs.dllが含まれています。
このファイルの機能および詳細は以下のとおりです。
- Report Jul 14 71645.lnk (md5 - 622D21C40A25F9834A03BFD5FF4710C1)
- ペイロードの実行に使用されるショートカットファイル
- Calc.exe (md5 - 60B7C0FEAD45F2066E5B805A91F4F0FC)
- Windows 7の正規の電卓アプリケーション
- Windows Codecs.dll (md5 - 21930ABBBB06588EDF0240CC60302143)
- calc.exeと共にDLLサイドローディングされる.dllで、regsrv.exeを実行し、7533.dllをロードします
- 7533.dll (md5 - 1FFFB3FDB0A4B780385CC5963FD4D40C)
- Qakbotペイロード
ISOファイルを実行すると、.lnkファイルはcalc.exeを実行し、.dll サイドローディングを使ってWindowsCodecs.dllをロードし、regsrv32.exeを使って7533.dll(Qakbot)をロードします。
Qakbotペイロードを起動させるために、DLLサイドローディング攻撃の回避テクニックが使用されます。以下に示すように、calc.exeはこのテクニックを使用して偽のWindowsCodecs.dllをロードし、さらにregsv32.exeを使用して7533.dllをロードします。
この最終的なペイロードは、最終的にその悪質なコードをwermgr.exeに注入します。
この.dllファイルをロードするためにregsrv32.exeを使用するQakbotペイロードは、ランタイムパッカーを使用してパックされています。このパッカーは、以下に示すように、QakbotをアンパックするためにXOR復号化を伴います。
アンパックされたペイロードは、2022年6月21日にコンパイルされた32ビットの.dllファイルです。
このアンパックされたバイナリは、リソースセクションRCDATA(3C91E639 - C2, 89210AF9- Botnet ID)にC2とBotnet IDを格納しています。
リソースセクションのC2とBotnet IDを復号化するためには、以下のようにRC4を使用します。
そこで私たちは、Botnet IDとC2をRC4で復号化するPythonスクリプト(Appendix参照)を作成しました。解析したバイナリは、Botnet ID「Obama 201」を使用していました。
QakBot から守る Menlo Security のサービス
Menlo Securityのサービスをご利用中のお客様は、初期のアクセスから保護され、エンドポイントへの感染を防ぐことができます。
Menlo Platformは、Qakbotマルウェアが使用する以下のHEATテクニックから保護します:
パスワードで保護されたZIPファイル
Menlo Platformは、インターネットからダウンロードされたすべてのドキュメントとアーカイブを、ユーザーのエンドポイントデバイスから離れたIsolation Core™で開きます。マルウェアは通常、セキュリティ防御を回避するために、悪意のあるペイロードをパスワードで保護しています。ダウンロードがパスワードで保護されている場合、Menlo Platformは、パスワードの入力をユーザーに促します。パスワードが入力されると、プラットフォームはファイルを検査し、ダウンロードしても安全であることを確認します。
Excel 4.0 マクロ
社外から受け取った添付ファイルは、Menlo Securityのメール関連製品によってラップされます。ラップされた添付ファイルをIsolation Core™ で開き、検査エンジンがファイルの良し悪しを判断しながら、ユーザーが閲覧可能な安全なバージョンに変換します。インターネットからダウンロードしたすべてのドキュメントを常に閲覧できるようにポリシーを設定したり、エンドポイントには安全なバージョンのドキュメントだけをダウンロードするようにポリシーを設定したりすることも可能です。Menlo SecurityのSafedoc機能は、アクティブなコンテンツをすべて削除することで、悪意を持つ部分を確実に除去することができます。
Follina エクスプロイト
Follinaは、Microsoft Diagnostic Toolsを利用してリモートコードを取得して実行するエクスプロイトです。Menlo Platformはインターネットからダウンロードされたすべてのドキュメントとアーカイブを、ユーザーのエンドポイントから離れたIsolation Core™で開きます。ドキュメントはユーザーが閲覧できる安全なバージョンに変換され、検査エンジンがファイルの良し悪しを判断します。インターネットからダウンロードしたすべてのドキュメントを常に閲覧できるようにポリシーを設定したり、エンドポイントには安全なバージョンのドキュメントだけをダウンロードするようにポリシーを設定したりすることも可能です。Menlo SecurityのSafedoc機能は、アクティブなコンテンツをすべて削除することで、悪意を持つ部分を確実に除去することができます。
HTML スマグリング
HTMLスマグリングの目的はHTML5/JavaScriptの機能を利用してファイルをダウンロードさせることであり、通常2種類の方法で行われます。
- データURL経由でクライアントデバイスにダウンロードさせる
- 適切なMIMEタイプでJavaScript blobを作成し、クライアントデバイスにダウンロードさせる
Qakbotはメールの添付ファイルを使ってHTMLスマグリングを行いますが、Menlo SecurityはHTMLスマグリングを使ったWeb経由の悪意のあるキャンペーンを多数確認しています。HTMLスマグリングでは、エンドポイントにダウンロードされる悪意のあるペイロードはブラウザー上で構築されるため、その前の段階のあらゆるネットワーク検査を回避することができます。Isolation Core™はブラウザー上で構築されるあらゆる種類のJSとペイロードを可視化できるため、Web経由で配信されるこの種の攻撃を検知して阻止することができます。
まとめ
このブログ記事では、私たちが分析したQakbotキャンペーンで使用されたさまざまなHEATテクニックをご紹介しまし
IOC
MITRE ATT&CK Technique
Appendix
Qakbot Config Decryption Code
—----------------------Config Decrptor—-----------------------------------
import hashlib
from arc4 import ARC4
import struct
import socket, sys
key = b"\\System32\\WindowsPowerShel1\\v1.0\\powershel1.exe"
key = hashlib.sha1(key).digest()
print(key.hex())
file_res = open(sys.argv[1],"rb+") # c2 data from resource section
file_data = file_res.read()
file_res.close()
rc4 = ARC4(key)
data = rc4.decrypt(file_data)
print(data)
if len(data) > 70:
data = data[20:]
out = ""
while data:
flag, ip, port = struct.unpack(">BLH",data[:7])
ip = socket.inet_ntoa(struct.pack('!L', ip))
data = data[7:]
out += "{}:{}\n".format(ip,port)
print(out)