脅威リサーチ

DriveGuardからドライブを防御する:数ヵ月に及ぶイスラエルの組織に対するMoses Staffグループの攻撃

投稿者 Rotem Sde-Or | 2022年3月16日

FortiGuard Labs Research

影響を受けるプラットフォーム: Windows
影響を受けるユーザー:     Windowsユーザー
影響:             データの窃取と追加の不正ペイロードの実行
深刻度:            クリティカル

過去1年間に、FortiEDRは、Microsoft Exchangeサーバーのさまざまな脆弱性を悪用しようとした複数の攻撃を阻止しました。これらの脆弱性のいくつかは、こちらのブログですでに取り上げています。

これらの攻撃のうち、Moses Staffによって実行される攻撃を特定しました。Moses Staffは、地政学的動機に基づいた攻撃者グループであり、イラン政府の支援を受けていると疑われています。過去数ヵ月にわたってこの攻撃を追跡した後に、このグループは被害者に対する諜報活動を行うために、複数のコンポーネントからなるカスタムツールセットを使用していることが分かりました。

この攻撃は、イスラエルの組織のみを標的としています。詳しく調べたところ、このグループが活動を開始したのは1年以上前であることが明らかになりました。これは、当グループの存在が初めて公になった時期よりはるかに前であり、極力目立たないようにして気付かれずに活動を続けてきたことが伺えます。

このブログで紹介する内容は、Moses Staffによって使用されるTTP (戦術、技術および手順)と新しいバックドア、およびMoses Staffの活動に関する脅威インテリジェンスデータです。バックドアの目的は、ファイルをダウンロードしたり、ペイロードを実行したり、標的ネットワークからデータを盗み取ったりすることです。

感染経路

最初の侵入は、Microsoft Exchangeサーバー内のProxyShellエクスプロイトを利用して行われました。これにより、認証を受けていない攻撃者が公開されたHTTP\Sポートを通じて、これらのサーバー上で任意のコマンドを実行できるようになりました。その結果として、攻撃者は次の2つのWebシェルを投下できました。

  • C:/inetpub/wwwroot/aspnet_client/system_web/iispool.aspx
  • C:/inetpub/wwwroot/aspnet_client/system_web/map.aspx

これら2つのWebシェルはセットで使用され、一部の機能は重複しています。幾度にもわたって、map.aspxが使用されて、iispool.aspxによって実行されたコマンドの結果が確認されました。

感染後に、攻撃者は数日間かけて、PSTファイルなどの機密データを侵害されたサーバーから盗み取りました。次に、LOLBinを使用してlsass.exeのメモリダンプを作成することで、認証情報を盗もうとしました。最後に、バックドアコンポーネントを投下してインストールしました。

図1:lsass.exeのメモリをダンプするためのコマンドライン

実行チェーン

ローダーの場所はC:\Windows\System32\drvguard.exe. です。このローダーは、「-I」コマンドライン引数を使用して実行されると、DriveGuardという名前のサービスとしてインストールされます。

図2:DriveGuardサービスのプロパティ

ローダーの役割は、バックドアコンポーネントを実行してから、そのプロセスを監視して、バックドアコンポーネントが停止するたびにこのコンポーネントを再実行することです。さらに、ローダーサービスが停止することを防止するためのウォッチドッグメカニズムを起動します。次のフローチャートでは、このプロセスを図示しています。

図3:ローディングメカニズムの流れ

バックドアがディスク上に存在していない場合は、ローダーはC:\Windows\System32\rsc.datの内容を読み込んで、DOSヘッダーのマジック値を4D 5A 90.に戻すことで、バックドアを作成します。有効な実行可能ファイルがディスク上のC:\Windows\System32\broker.exeに書き込まれます。

図4:rsc.dat – ヘッダーにマジックバイトが含まれていないバックドア

次のステップは、バックドアを実行することです。その際に、ローダーはバックドアの親プロセスがsvchost.exeになるように偽装しようとします。このことを実現するために、CreateProcessが呼び出されて、親プロセスの属性(PROC_THREAD_ATTRIBUTE_PARENT_PROCESS)がシステム内で検出された1つ目のsvchost.exeプロセスに設定されます。親プロセスの偽装は、セキュリティ製品をかいくぐるのに役立つ可能性があります。一般にこの手法は、SYSTEM特権を取得するためにも使用されることがありますが、このケースでは、ローダーはシステムサービスとしてすでに実行されています。偽装に失敗した場合は、ローダーなしでバックドアが実行されます。

バックドアは、「-ser」というコマンドライン引数を使用して実行されます。

サービスウォッチドッグ

ローダーは、稼働状態を保つためにウォッチドッグも設定します。ウォッチドッグモジュール(lic.dll)は、新たに生成されたlsass.exeプロセスにインジェクションされます。

このインジェクションはinj.dll内で行われます。inj.dllはVirtualAllocExSetThreadContextを使用して、ターゲットプロセス内でシェルコードを実行します。このシェルコードはDLLをロードしてから、スレッドの直前の命令ポインタにジャンプして戻ります。

その後、lic.dllDriveGuardサービスの監視を開始して、このサービスが停止するたびにこのサービスを再開します。さらにlic.dllは、DriveGuardサービスが、システム始動時に自動的に開始するように常に構成されるようにします。

図5:inj.dllによってlsass.exeにインジェクションされたシェルコード

ブローカーバックドア

バックドアコンポーネントは、C2サーバーからのコマンドの受信と実行を監督します。バックドアコンポーネントは、「-ser」というコマンドライン引数を受信した場合のみに実行されます。それ以外の場合は、バックドアコンポーネントはゼロ除算例外を発生させます。その目的はおそらく、サンドボックスなどの自動セキュリティ製品による動的分析を阻止することです。

1つのバックドアインスタンスのみがシステム上で実行されるようにするために、バックドアは「Program event」という名前のイベントを作成します。

図6:バックドアによって作成されたイベント
構成

バックドアの構成は、暗号化されてC:\Users\Public\Libraries\cfg.datファイルに保管されます。使用される暗号化方式はXORベースであり、次のPythonコードによって復号化できます。ハードコードされた鍵は、我々が所有しているすべてのサンプルにわたって一貫しています。

def decrypt(encrypted):

key = '9c4arSBr32g6IOni'

result = ''

for i in range(len(encrypted)):

key_char ord(key[i%16]) 4

enc_char encrypted[i]

result_char (key_char enc_char) 4

result += chr(result_char)

return result

図7:構成ファイルの復号化ルーチンのPythonコード

復号化された構成には、2セットのC2 / URIアドレスが含まれているとともに、サーバーと通信する頻度を決定する時間間隔(秒単位)が含まれています。0~2秒の間のランダム値がこの間隔に追加されて、ジッターが引き起こされます。

構成ファイルがない場合は、実行可能ファイルにハードコードされたプレーンテキストの構成値が当マルウェアによって使用されます。我々のサンプルでは、これらの値は構成ファイル内のものとまったく同じです。

図8:復号化されたバックドア構成
「境界」の伝達

このマルウェアの主要部分は、サーバーとの通信を監督して、サーバーからの応答を解析して各種のコマンドを実行します。バックドアはまず、1台目の構成済みサーバーにPOST要求を送信します(図9を参照)。バックドアは、サーバーのステータスに応じて2台のサーバーと交互に通信します。すなわち、一方のサーバーが応答しない場合や空の応答を返す場合は、もう一方のサーバーに切り替えます。

図9:バックドアからC2に送信されたHTTP POST要求

この要求はエンコード済みのHTMLフォームデータのように見え、このデータはスペルが間違った「BoundrySign」という文字列を含んでいるように見える境界値で区切られています。この要求内の注目すべきフィールドは、tokendataです。

dataフィールドには、感染マシンに関する情報が含まれています。このマシンのタイムゾーンは、地域を偽装するために攻撃者によって選択されています。この文字列は、構成ファイルを暗号化するために使用されたのと同じアルゴリズムと鍵を使用して暗号化されています。

図10:C2に送信された被害者情報のフォーマット

興味深いことに、非推奨のGetVersionExAPIが使用されているために、このマルウェアは正しいOSバージョンを取得できません。このAPIが使用されている場合は、更新されたマニフェストが適用されていない実行可能ファイルは、常にWindows 8の値を返します(実際にはこれより新しいオペレーティングシステムが実行されている場合でも)。

tokenフィールドは、ホスト名、ユーザー名、IDからなります。ホスト名とユーザー名はROT5 Caesar暗号化方式で暗号化されているため、各文字のASCII値に5が追加されます。これらを暗号化した結果が、IDの後ろに付加されます。

図11:C2に送信された固有識別子のフォーマット

IDはバイナリにハードコードされており、特定の標的組織の固有識別子となります。すなわち、バックドアのバイナリは標的ごとに特別にコンパイルされてから、脅威アクターによって投下されます。
バックドアは、サーバーに対してコマンドを繰り返し照会します。5回連続して正常に照会できなかった場合は、バックドアは照会先をバックアップサーバーに切り替えます。正常に照会できなかった原因は、次のいずれかと考えられます。

  • サーバーが応答していない
  • 解析された応答が0xAというバイトで始まる
  • 解析された応答が空である

サーバーの応答は最初の「]」という文字まで解析されて、それ以降の内容はすべて無視されます。「]」が含まれていない応答は、空の応答として扱われます。

解析されたサーバー応答が「on」である場合は、バックドアはバックアップサーバーに切り替えずに、同じサーバーに対して照会し続けます。他の応答はすべて、コマンドとして扱われます。したがって、この応答は前に指定したのと同じアルゴリズムと鍵を使用して復号化されます。復号化された応答データがselfである場合は、バックドアは実行を停止します。それ以外の場合は、次の書式を持つコマンドとして、復号化されたデータの解析を開始します。

図12:C2によって送信されるコマンドの書式
  • Type – コマンドのタイプ。これは、下記のコマンド表の”タイプ”列に記載された値のいずれかです。
  • Arg1~Arg4 – コマンドの引数。どのコマンドでもすべての引数が指定されるわけではありません。すべての引数が指定された場合は、それらの引数の値は「null」という文字列になります。
  • ID – 固有の識別子。このIDがコマンドの結果とともにサーバーに送信されて、それらの結果が実行されたコマンドと関連付けられます。

サポートされているコマンド

以下では、バックドアがサーバーから受信する可能性のあるコマンドを一覧表示しています。いくつかのコマンドでは、追加のDLLがサーバーからダウンロードされて実行されます。現時点では、これらのモジュールの機能は不明です。

タイプ

説明

fe

ディレクトリを一覧表示します(下層のサブディレクトリもすべて含む)。

ce

コマンドラインを実行します。

dw

ディスクからC2にファイルをアップロードします。

up

C2からファイルをダウンロードしてディスクに保存します。

sb

C2からDLLをダウンロードして、LoadLibraryを使用してこのDLLを実行して、このDLLの「mainfunc」エクスポートを呼び出します。

tlg

C2からDLLをダウンロードして、LoadLibraryを使用してこのDLLを実行して、このDLLの「mkb64」エクスポートを呼び出します。

rns

C2からDLLをダウンロードして、LoadLibraryを使用してこのDLLを実行して、このDLLの「mkb64」エクスポートを呼び出します。

int

構成内の間隔フィールドを更新します。

ki

CMDコマンドを使用してディスクから当マルウェアを削除します。

当マルウェア自体を完全に消去するために、このコマンドがselfコマンドと組み合わせて使用されることがあります。

upd

CMDコマンドを実行してディスク上の現在のモジュールをC2から受信したファイルに置き換えることで、当ツールを更新します。

ho*

構成内のC2フィールドとURIフィールドを更新します。

inf*

構成内容と当マルウェアのファイル名をC2に送信します。

cmprs*

ar.dllユーティリティとar.datユーティリティを使用して、7-zipで圧縮します。これらのユーティリティがディスク上にない場合は、当ツールによってこれらのユーティリティがC2からダウンロードされます。

sc**

スクリーンショットを撮影して、C:\Users\Public\Libraries\tmp.binに保存してから、このスクリーンショットを暗号化せずにC2に送信します。

kl**

このコマンドの名前と動作はキーロガーの機能を示唆しています。

このコマンドが初めて受信されたときに、当マルウェアはC2からDLLをダウンロードして、LoadLibraryを使用してこのDLLを実行して、このDLLの「strt」エクスポートを呼び出します。それ以降にこのコマンドが受信されるたびに、C:\Users\Public\Libraries\async.datの内容がC2に送信されます。

このDLLの出力はおそらくこのファイルに書き込まれます。ただし、我々はこのDLLを所有していないため、このことを確認できません。

au**

次のコマンドを使用して、予約済みタスクの永続性を確立します。

SCHTASKS /CREATE /TN "Mozilla\Firefox Default Browser Agent 409046Z0FF4A39CB" /ST 11:00 /F /SC DAILY /TR “<CURRENT_EXECUTABLE>”

図13:サポートされているコマンドのリスト

* 新しいバージョンのみに存在するコマンド
** 古いバージョンのみに存在するコマンド

活動の履歴

VirusTotalのRetrohuntエンジン内のYaraルールを使用して、このバックドアの2つの旧サンプルを検知できました。どちらのサンプルも2020年12月末頃にアップロードされたため、この攻撃は1年以上にわたって実行されていると思われます。最近まで、これらの攻撃者は極力目立たないようにして気付かれずに活動を続けていました。

図14:旧バックドアバージョンのVirusTotalエントリ

これらのバージョン間の最も顕著な違いは、構成ファイルとコマンドです。

旧亜種では、構成ファイルの代わりに、バイナリにハードコードされた値がもっぱら使用されます。コマンドに関しては、これらのバージョンの間にいくつかの変更が加えられました。図13から分かるように、さまざまな新しいコマンドが最新のサンプルに追加されている一方で、他のコマンドは削除されています。いくつかのコマンドが削除されていますが、そのコードはサーバーから取得できるモジュールの1つに移動されたと判断しています。

一部の変更内容の目的は、秘匿性を高めて検知されにくくするためと思われます。たとえば、旧サンプルは「au」コマンドを受信して、バイナリにハードコードされたコマンドラインを使用して予約済みタスクを登録できました。その一方で、最近の攻撃では、バックドアによって投下された予約済みタスクのXMLファイルを通じてタスク登録が行われたことを確認できました。

バージョン間の最後の小さな違いは、イベントの名前です。旧バージョンでは、「program Event」という名前のイベントが作成されていました。この大文字 / 小文字の間違いは、最近のバージョンで修正されました。

FortiGuard Labsの脅威インテリジェンスシステムでC2のアドレスを検索すると、2021年4月にトラフィック量が大幅に急増していることが分かります。このことは、攻撃者グループが最初に公に知られた時期のはるか前から活動していたことを示します。不正なサーバー宛てのすべてのネットワークトラフィックは、イスラエルのIPアドレスから発信されていました。

図15:C2のIPアドレスに関するFortiGuard Labsの履歴データ

図16:C2のドメイン名に関するFortiGuard Labsの履歴データ

我々が調査を行っている最中の2022年1月初めに、techzenspace[.]comドメインを制御下に置いて、シンクホールを通じて無力化できました。その目的は、フォーティネットのお客様ではない追加の感染組織を特定するとともに、バックドアがしばらくの間は動作できないようにするためでした。

攻撃者の特定

過去の調査に基づいて、iispool.aspxというWebシェルはMoses Staffグループが用意したものであると判断できました。Webシェルのパスとコードはどちらも、以前に報告されたものとまったく同じです。前のセクションで紹介した別の最近の資料も、この判断を裏付けています。

すべての被害者は、さまざまな業界に属しているイスラエルの組織です。我々が特定した攻撃は破壊的段階に達しませんでしたが、このバックドアがその段階より前に使用されて、標的ネットワークからデータが盗み取られる可能性を排除できません。

結論

過去数ヵ月にわたって、我々はMoses Staffの活動を注意深く監視してきました。新しいTTPを分析して、新しいツールセット(バックドア、ローダー、Webシェルなど)はこのグループが準備したものであると判断しました。

このグループは意欲的で能力が高く、イスラエルの組織にダメージを与えようとしています。このグループは2020年の終わり頃から精力的に活動を続けていますが、その1年後になって初めて世間一般に認知されました。この時点で、このグループは初期侵入フェーズのためにワンデイエクスプロイトを引き続き利用していました。

我々が特定した攻撃は諜報を目的として行われていましたが、だからと言って、攻撃者が後で破壊的手段に向かう可能性が否定されるわけではありません。FortiEDRによってこの攻撃の早期段階がブロックされたため、ランサムウェアやワイパーは投下されていない可能性があると考えています。

フォーティネットのソリューション

FortiEDRは、事前知識や特別な構成を必要とせずに、デフォルトの状態でこれらの脅威を検知してブロックできます。そのために、FortiEDRは実行後防止エンジンを使用して、不正な活動を発見します。

図17:lsass.exeのメモリダンプ試行をブロックするFortiEDR

図18:バックドアの通信をブロックするFortiEDR

すべてのネットワークIOCは、FortiGuard Webフィルタリングブロックリストに追加されています。

FortiGuardアンチウイルスサービスエンジンは、フォーティネットのFortiGate / FortiMail / FortiClient / FortiEDRソリューションに含まれています。FortiGuardアンチウイルスは以下のウイルスをカバーしています。

ASP/Webshell.DW!tr
W64/Agent.AVV!tr
W32/Agent.UWN!tr
W32/Agent.UYS!tr
W64/Agent.AVS!tr
W64/Agent.AVU!tr

さらに、Cyber Threat Allianceのメンバーシップの一環として、この脅威の詳細情報が他のアライアンスメンバーとリアルタイムで共有されて、お客様の保護を強化することに役立てられました。

付録A:MITRE ATT&CK技法

ID

説明

T1190

一般ユーザーがアクセスできるアプリケーションの悪用

T1505.003

サーバーソフトウェアコンポーネント:Webシェル

T1083

ファイルとディレクトリディスカバリ

T1003.001

OS認証情報のダンプ:LSASSメモリ

T1005

ローカルシステム内のデータ

T1114

Eメールの収集

T1569.002

システムサービス:サービスの実行

T1480

実行のガードレール

T1134.004

アクセストークンの操作:親PIDのスプーフィング

T1055

プロセスインジェクション

T1140

ファイルや情報の難読化解除 / 復号化

T1071.001

アプリケーション層プロトコル:Webプロトコル

T1082

システム情報ディスカバリ

T1033

システム所有者 / ユーザーディスカバリ

T1573.001

暗号化されたチャネル:対称暗号方式

T1008

フォールバックチャネル

T1059.003

コマンドとスクリプティングのインタープリター:Windowsコマンドシェル

 T1113

スクリーンキャプチャ

T1053.005

予約タスク / ジョブ:予約タスク

T1041

C2チャネルを介したデータ窃取

付録B:IOC(Indicators of Compromise:侵害指標)


ファイルハッシュ(SHA256)
2ac7df27bbb911f8aa52efcf67c5dc0e869fcd31ff79e86b6bd72063992ea8ad (map.aspx)
ff15558085d30f38bc6fd915ab3386b59ee5bb655cbccbeb75d021fdd1fde3ac (agent4.exe)
cafa8038ea7e46860c805da5c8c1aa38da070fa7d540f4b41d5e7391aa9a8079 (calc.exe)

ファイル名
iispool.aspx
map.aspx
drvguard.exe
agent4.exe
calc.exe
inj.dll
lic.dll

イベント名
program Event
Program event

IP
87.120.8[.]210

ドメイン
techzenspace[.]com

URL
hxxp://87.120.8.210:80/RVP/index3.php
hxxp://techzenspace.com:80/RVP/index8.php