ニュース:
メンロセキュリティがGoogleとの戦略的パートナーシップを発表
Icon Rounded Closed - BRIX Templates

Qakbot キャンペーンで使用された HEAT テクニックとその詳細

アベイ・ヤダブ
|
August 28, 2022

はじめに

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が既存の防御を回避するために使用するアクセス方法を示したものです。

Diagram showing that clicking on a URL in an email leads to downloading a password protected ZIP file that downloads a JS payload, leading to 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つです。

screenshot of malicious .lnk download JS file

難読化されたJSファイルは実行時に復号化され、以下のようにC2からペイロードをダウンロードし、実行します。

screenshot of obfuscated JS file

Excel 4.0 マクロ

このキャンペーンでは、Excel 4.0マクロを使用してスプレッドシートのセルにコマンドを追加し、メールの添付ファイルを標的に送信します。

以下は、Excel 4.0マクロを使用してQakbotを配信する、添付ファイル付きメールの例です。

Diagram showing email with Macro 4.0 leads to Macro 4.0 leads to Qakbot

Excelファイルが添付されたメールです。

Examples of emails with attached excel files

XLS文書を開くと、Excel 4.0のマクロを実行するためにマクロを有効にするかどうか尋ねられます。

Screenshot of Excel document with warning asking to enable macros

XLSファイル内のこれらのコマンドは、C2からペイロードをダウンロードして実行します。

screenshot of code

CVE-2022-30190

このキャンペーンでは、Follinaとも呼ばれるCVE-2022-30190の脆弱性を使用してQakbotが配信されました。これが実行されると、エクスプロイトを含むドキュメントはms-msdt URLプロトコルを使用してPowerShellコードを実行する外部HTMLファイルを呼び出します。

以下は、CVE-2022-30190を使用してQakbotを配信する添付ファイル付きメールの例です。

email with cve-2022-30190 leads to cve-2022-30190 docx file leads to ms-msdt leads to qakbot

CVE-2022-30190 (md5 - 7a91b01a037ccbfe6589161643d0a65a) を使ったドキュメントでQakbotを配信する例を以下に挙げます。

screenshot showing document using CVE-2022-30190

ドキュメントを開くとHTMLファイルをダウンロードしようとし、さらにQakbotのペイロードをダウンロードします。

screenshot of file being opened in Microsoft Word

HTML (md5 - ea48f95ab4f3ca3b0c687a726cb00c49)

screenshot of code

HTML スマグリング

このキャンペーンでは、特別に細工されたHTMLの添付ファイルやWebページが、ファイアウォールの内側でローカルにマルウェアを構築します。

以下は、HTMLスマグリングの添付ファイルを持つメールの例です。

examples of emails with HTML smuggling attachments

このキャンペーンでは、以下のようにスパムメールにBase64でエンコードされたHTMLファイル(md5- 2881945BDF1DB34216CC565FEF4501D4)が添付されています。

screenshot of code

「var text」関数は以下のように、Adobeのイメージとパスワード保護されたZIPファイル「Report Jul 14 71645.zip」(md5- 5F57C9BF0923DE15046CCB14E41CE0A6 pwd - abc444)でBase64エンコードされており、実行時に構築されます。

screenshot of Adobe image and a password-protected ZIP file

本攻撃の感染チェーンは、以下の図のようになります。

Diagram showing email with html leading to html smuggling leading to password protected ZIP file leading to JSO leading to DLL leading to regsvr leading to DLL leading to Qakbot

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が含まれています。

screenshot of ISO file

このファイルの機能および詳細は以下のとおりです。

  • 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をロードします。

screenshot of calc.exe loading the masqueraded WindowsCodecs.dll to load 7533.dll using regsv32.exe

この最終的なペイロードは、最終的にその悪質なコードをwermgr.exeに注入します。

screenshot of files

この.dllファイルをロードするためにregsrv32.exeを使用するQakbotペイロードは、ランタイムパッカーを使用してパックされています。このパッカーは、以下に示すように、QakbotをアンパックするためにXOR復号化を伴います。

screenshot of XOR decryption getting the unpacked version of Qakbot

アンパックされたペイロードは、2022年6月21日にコンパイルされた32ビットの.dllファイルです。

screenshot of file details

このアンパックされたバイナリは、リソースセクションRCDATA(3C91E639 - C2, 89210AF9- Botnet ID)にC2とBotnet IDを格納しています。

screenshot of file data

リソースセクションのC2とBotnet IDを復号化するためには、以下のようにRC4を使用します。

screenshots

そこで私たちは、Botnet IDとC2をRC4で復号化するPythonスクリプト(Appendix参照)を作成しました。解析したバイナリは、Botnet ID「Obama 201」を使用していました。

screenshot

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

NameMd5
7533.dll1FFFB3FDB0A4B780385CC5963FD4D40C
Report Jul 14 71645.lnk622D21C40A25F9834A03BFD5FF4710C1
calc.exe60B7C0FEAD45F2066E5B805A91F4F0FC
WindowsCodecs.dll21930ABBBB06588EDF0240CC60302143
Report Jul 14 71645.ZIP5F57C9BF0923DE15046CCB14E41CE0A6
Report Jul 14 71645.ISO0C9164296949B72BF82EC1951AB7AC3B
C2
70.46.220.114:443
179.111.8.52:32101
208.107.221.224:443
176.45.218.138:995
24.158.23.166:995
24.54.48.11:443
89.101.97.139:443
24.55.67.176:443
24.139.72.117:443
120.150.218.241:995
174.69.215.101:443
38.70.253.226:2222
41.228.22.180:443
217.165.157.202:995
172.115.177.204:2222
173.21.10.71:2222
69.14.172.24:443
47.23.89.60:993
104.34.212.7:32103
66.230.104.103:443
81.158.239.251:2078
179.158.105.44:443
189.253.167.141:443
24.178.196.158:2222
174.80.15.101:2083
187.116.126.216:32101
100.38.242.113:995
74.14.5.179:2222
40.134.246.185:995
172.114.160.81:443
72.252.157.93:995
70.51.137.244:2222
82.41.63.217:443
197.89.11.218:443
37.34.253.233:443
67.209.195.198:443
67.165.206.193:993
93.48.80.198:995
111.125.245.116:995
1.161.118.53:443
76.25.142.196:443
148.64.96.100:443
217.128.122.65:2222
32.221.224.140:995
47.180.172.159:443
39.57.56.11:995
186.90.153.162:2222
37.186.58.99:995
86.97.10.37:443
39.44.116.107:995
182.191.92.203:995
86.98.78.118:993
117.248.109.38:21
39.52.44.132:995
1.161.118.53:995
91.75.85.128:1194
121.7.223.45:2222
39.41.90.210:995
46.107.48.202:443
190.252.242.69:443
187.172.31.52:443
72.252.157.93:993
72.252.157.93:990
47.145.130.171:443
63.143.92.99:995
197.92.136.122:443
45.46.53.140:2222
196.203.37.215:80
94.59.138.43:2222
92.132.132.81:2222
39.49.48.167:995
103.246.242.202:443
84.241.8.23:32103
94.59.15.180:2222
89.211.209.234:2222
94.36.193.176:2222
47.156.129.52:443
201.172.20.105:2222
109.12.111.14:443
85.6.232.221:2222
96.37.113.36:993
2.178.120.112:61202
193.136.1.58:443
103.133.11.10:995
120.61.3.142:443
182.52.159.24:443
78.100.219.38:50010
173.174.216.62:443
106.51.48.188:50001
67.69.166.79:2222
45.241.254.69:993
88.240.59.52:443
86.213.75.30:2078
24.43.99.75:443
101.50.67.155:995
108.56.213.219:995
5.32.41.45:443
39.53.139.2:995
80.11.74.81:2222

MITRE ATT&CK Technique

TacticTechnique IDTechnique Name
Initial AccessT1566SpearPhishing
Defense EvasionT1027.006Html Smuggling
Defense EvasionT1027Password Protected zip
ExecutionT1204User Execution
Defense EvasionT1574.002DLL Side-Loading
Defense EvasionT1055Process Injection
Command and ControlT1573.001RC4 Encryption

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)

Output Image

screenshot
ブログカテゴリー
linkedin logotwitter/x logofacebook logoSocial share icon via eMail