中東の重要国家インフラへのサイバー侵入に使われたHavocサンプルを分析

文●フォーティネットジャパン 編集●ASCII

提供: フォーティネットジャパン

  • この記事をはてなブックマークに追加
  • 本文印刷

本記事はフォーティネットジャパンが提供する「FORTINETブログ」に掲載された「悪意のあるHavocサンプルを分析」を再編集したものです。

影響を受けるプラットフォーム:Microsoft Windows
影響を受けるユーザー    :Windowsユーザー
影響            :侵害されたコンピュータを完全にリモート制御
深刻度           :高

背景

 この分析は、中東の重要国家インフラ(CNI)を標的とする長期的なサイバー侵入を調査した、「中東の重要国家インフラへの侵入」(詳細なレポートはこちら)と呼ばれる、FortiGuardインシデントレスポンスチーム(FGIR)が主導する調査の続報です。

 レポートによると、攻撃者がシステムのタスクマネージャーにマルウェアの複数の断片を追加して永続性を維持していることが明らかになりました。悪意のあるHavoc亜種サンプルのひとつについて、詳細な分析を実施しました。

 Havocは、エクスプロイト後のコマンドアンドコントロール(C2)のバックドアフレームワークとして有名で、主にC++とGoで記述されています。ここでは、このHavoc亜種がDLLファイルから復号化され、新たに作成された「cmd.exe」プロセスで展開される様子、HavocデーモンとC2サーバーのやりとり、および侵害されたWindowsシステム上で実行される可能性のある悪意のある操作について詳しく説明します。

リモートインジェクター

 リモートインジェクター(conhost.exe)はシステムのタスクマネージャーによって開始され、以下のコマンドラインが使用されます。
 
C:\Windows\System32\drivers\conhost.exe -f conhost.dll -ER --ln --path cmd.exe

 Windows OSではWindows 7のリリース以降、コマンドラインインタフェースを処理するためにconhost.exe(Console Window Host)が導入されました。攻撃者は被害者を誤解させるために、リモートインジェクターをconhost.exeとして偽装します。

 フォーティネットの分析によると、このリモートインジェクターは複数の機能をサポートしており、コマンドラインパラメータを使用して制御されます。「-f」パラメータを付けて渡された「conhost.dll」には、暗号化されたHavocペイロードが含まれ、「--path」パラメータを付けて指定された「cmd.exe」は、Havocが注入され実行されるターゲットプロセスです。

図1:リモートインジェクターのヘルプ情報

 パラメータを付けずに偽のconhost.exeを実行するとヘルプ情報が表示され(図1)、リモートインジェクターの使用方法および利用可能なオプションの説明があります。

 リモートインジェクターが開始されるとAPI CreateProcessA()が呼び出され、「-- path」引数を付けて指定された「cmd.exe」プロセスが作成されます(図2を参照)。

図2:リモートインジェクターによって「cmd.exe」プロセスが作成される

 次に、このリモートインジェクターは、conhost.dllファイルに埋め込まれたシェルコードの断片を使用して、Havocフレームワーク内でHavocエージェントまたはデーモンとして参照されるHavocペイロードを復号化します。図3には、リモートインジェクターの復号化関数、復号化されたシェルコードの部分、およびデバッガーの下部のメモリには復号化されたHavocペイロードが表示されています。conhost.dllファイルの先頭の30Hバイトから、復号化キーおよび初期化ベクトル(IV)が生成されます。

図3:復号化されたconhost.dllペイロードのメモリビュー

 次に、リモートインジェクターは、復号化されたシェルコードとHavoc実行ファイルをプロセスに注入するために、新しく作成された「cmd.exe」のProcessHandleを使用して、ZwAllocateVirtualMemory()およびZwWriteVirtualMemory()の2つのAPIを呼び出します。

 最後に、ZwCreateThreadEx() APIを呼び出してリモートスレッドを作成します。新しく作成された「cmd.exe」プロセスに、ProcessHandleパラメータが再度設定され、lpStartAddressパラメータで、プロセス内に注入されたシェルコードのアドレスを参照します。

 このシェルコードの目的は、後続のHavocペイロード(DLLファイル)を「cmd.exe」プロセスに展開して実行することです。

HavocバックドアRAT

 Havocフレームワークは、典型的なRAT(リモートアクセス型トロイの木馬)で、GitHubで入手可能なオープンソースプロジェクトです。Golang、C、C++、Qt、Python、およびアセンブリ(ASM)など複数の言語で記述されています。このフレームワークは、C5piderによって開発され、2022年にリリースされました。

 Havocでは、コマンド&コントロール(C2)サーバーはチームサーバーと呼ばれ、チームサーバーとのやりとりに使用されるUIダッシュボードはクライアントと呼ばれます。Havocエージェントはデーモンとも呼ばれ、侵害されたデバイス上で実行されることで、C2サーバーからのコマンドを受け取り、システムの制御を可能にします。図4は、サーバー側のHavocクライアントを示しており、接続し制御しているアクティブなデーモンが表示されています。

図4:C2サーバーのダッシュボードのUI - クライアント

 Havocは、侵害されたデバイスとC2サーバー間でコマンドや結果を伝送するために、HTTP、HTTPS、およびSMBプロトコルをサポートしています。

 このサンプルでは、C2サーバーは「apps[.]gist[.]githubapp[.]net」としてハードコードされています。残念ながら、分析時、このサーバーは利用できませんでした。分析を続行するために、シミュレーション用のコマンド&コントロール(C2)サーバーをセットアップしました。また、プロトコルをHTTPSからHTTPに変更し、TLS暗号化を使用しないプレーンテキストでトラフィックをキャプチャし分析できるようにしました。

C2サーバーにデーモンを登録

 Havocデーモンは、侵害されたデバイス上で動作している間、侵害されたWindowsシステムおよびHavocプロセス自身に関するメタデータを収集します。このメタデータは、AESアルゴリズムを使用して暗号化された後、C2サーバーに送信されることで、侵害されたシステムがC2サーバー上に登録されます。図5の下部に示すように、収集されたメタデータには、さまざまなシステムやプロセスの詳細情報が含まれています。

図5:AESを使用してメタデータを暗号化

 メタデータ(サイズ:0xBA)の情報には、エージェントID(0x67C54600)、デーモンID(0x0F)、ホスト名、ユーザー名、ドメイン、IPアドレス、プロセス名(「C:\Windows\SYSTEM32\cmd.exe」)、プロセスID(0x1ED4)、親PID(0x2444)、プロセスのロードベースアドレス、OSバージョン情報、およびOSアーキテクチャなどの情報が含まれます(ただしこれに限らない)。

図6:デーモン初期化パケット

 図6は、前述のAESで暗号化されたメタデータを含むデーモン初期化パケットを示しています。このパケットは、被害者のシステムを登録するC2サーバーに、最初のパケットとして送信する必要があります。以下のテーブルは、パケットの各部分の内容を説明するために、パケットを色分けしたセクションに分けて分類したものです。

オフセット 備考
+00h データサイズ、0xFA
+04h マジック値、0xDEADBEEF
+08h エージェントID、0x67C54600
+0Ch コマンドID、0x63。DEMON_INIT
+10h リクエストID、0x0
+14h AESキー、20hバイト
+34h AES IV、10hバイト
+44h AESで暗号化されたメタデータ

 デーモン初期化パケットは、HTTP POSTリクエストの本文として送信されます。C2サーバーがパケットを受け取ると、マジック値を検証し、パケットに含まれるAESキーとAES IVを使用してメタデータを復号化して、登録プロセスを実行します。同時に、クライアントダッシュボードには、デーモン、および侵害されたシステムのメタデータが表示されます(図4を参照)。

 図7は、HTTP POSTリクエストを介して送信されたデーモン初期化パケットをキャプチャしたWiresharkのスクリーンショットを示しています。

図7:デーモン初期化パケットの表示

制御コマンド

 Havocは、侵害されたシステムを制御するために、幅広い制御コマンドを定義しています(以下を参照)。

・COMMAND_GET_JOB(0x1)
・COMMAND_INLINEEXECUTE_EXCEPTION(0x1)
・COMMAND_INLINEEXECUTE_SYMBOL_NOT_FOUND(0x2)
・COMMAND_INLINEEXECUTE_RAN_OK(0x3)
・COMMAND_INLINEEXECUTE_COULD_NO_RUN(0x4)
・COMMAND_INLINEEXECUTE(0x14)
・COMMAND_NOJOB(0xA)
・COMMAND_SLEEP(0xB)
・COMMAND_PROC_LIST(0xC)
・COMMAND_FS(0xF)
・COMMAND_JOB(0x15)
・COMMAND_INJECT_DLL(0x16)
・COMMAND_INJECT_SHELLCODE(0x18)
・COMMAND_SPAWNDLL(0x1A)
・COMMAND_PROC_PPIDSPOOF(0x1B)
・CALLBACK_OUTPUT(0x0)
・CALLBACK_FILE(0x2)
・CALLBACK_FILE_WRITE(0x8)
・CALLBACK_FILE_CLOSE(0x9)
・CALLBACK_ERROR(0xD)
・CALLBACK_OUTPUT_OEM(0x1E)
・CALLBACK_OUTPUT_UTF8(0x20)
・DEMON_INIT(0x63)
・DEMON_INFO(0x59)
・BEACON_OUTPUT(0x5E)
・COMMAND_TOKEN(0x28)
・COMMAND_OUTPUT(0x5A)
・COMMAND_ERROR(0x5B)
・COMMAND_EXIT(0x5C)
・COMMAND_KILL_DATE(0x5D)
・COMMAND_CHECKIN(0x64)
・COMMAND_EXCEPTION(0x98)
・COMMAND_SYMBOL_NOT_FOUND(0x99)
・COMMAND_NET(0x834)
・COMMAND_CONFIG(0x9C4)
・COMMAND_SCREENSHOT(0x9CE)
・COMMAND_PIVOT(0x9D8)
・COMMAND_TRANSFER(0x9E2)
・COMMAND_SOCKET(0x9EC)
・COMMAND_KERBEROS(0x9F6)
・COMMAND_MEM_FILE(0xA00)
・COMMAND_PACKAGE_DROPPED(0xA0A)
・COMMAND_PROC(0x1010)
・COMMAND_PS_IMPORT(0x1011)
・COMMAND_ASSEMBLY_INLINE_EXECUTE(0x2001)
・COMMAND_ASSEMBLY_LIST_VERSIONS(0x2003)

 ほとんどのコマンドには、機能を拡張するためのサブコマンドが付属しています。

 例えば、COMMAND_FS(0xF)には以下の10個のサブコマンドがあります。
 
 DEMON_COMMAND_FS_DIR(1)
 DEMON_COMMAND_FS_DOWNLOAD(2)
 DEMON_COMMAND_FS_UPLOAD(3)
 DEMON_COMMAND_FS_CD(4)
 DEMON_COMMAND_FS_REMOVE(5)
 DEMON_COMMAND_FS_MKDIR(6)
 DEMON_COMMAND_FS_COPY(7)
 DEMON_COMMAND_FS_MOVE(8)
 DEMON_COMMAND_FS_GET_PWD(9)
 DEMON_COMMAND_FS_CAT(10)

 攻撃者が、侵害されたシステム上に「test」という名前のフォルダを作成する必要があるとします。図8に表示されているパケットで「test」の文字を確認できます。

図8:DEMON_COMMAND_FSおよびDEMON_COMMAND_FS_MKDIRを含むパケット

 0x0Fは、DEMON_COMMAND_FSのコマンドIDで、0xA18D02ECはリクエストIDです。次の値は、暗号化されたサブコマンドのサイズとパラメータを示します。復号化されたサブコマンドデータ内の0x06は、DEMON_COMMAND_FS_MKDIRのIDで、後続のデータはフォルダ名を意味します(サイズ+データ)。

 また、Havocは、コマンドとサブコマンドのアプローチに加え、一般的にBOF(ビーコンオブジェクトファイル)と呼ばれるオブジェクトファイルのメモリ内実行もサポートしています。C2サーバーは、バイナリ形式のシェルコードの断片を含むコンパイルされたオブジェクトファイルを送信します。このファイルは侵害されたシステム上のデーモンプロセスのメモリ内で直接実行されます。

 Havocは、BOFを利用することで、デーモン自身を置き換えたり更新することなく、その機能を拡張することができます。

 図9は、最近復号化した、COMMAND_MEM_FILEコマンド(コマンドID:0xA00)のパケットで伝送されてきたオブジェクトファイルを示しています。このパケットは、クライアントUIで「enum_filter_driver」と入力した時に送信されました。

図9:復号化されたオブジェクトファイルのビュー

Havocのフル機能

 Havocは、先程紹介した制御コマンド、サブコマンド、およびBOFに加えて、幅広い機能が実装されています。これらの機能は、コマンドとモジュールの2つのタイプに分類され、各モジュールには複数のコマンドが含まれています。

 コマンド名を入力するか、モジュール名の後にコマンド名を入力すると、C2サーバーにより、対応するコマンドID、サブコマンドID、またはBOFを持つコマンドパケットが生成された後、デーモンに送信され、侵害されたシステムを制御します。

 Havocのすべての機能の一覧を以下のテーブルに示します。

コマンド名 タイプ  説明
adcs_enum    コマンド AD内のCAとテンプレートを列挙します
adcs_request コマンド 登録証明書をリクエストします
adduser コマンド 新しいユーザーをマシンに追加します
addusertogroup コマンド ユーザーを特定のグループに追加します
arp コマンド ARPテーブルを一覧表示します
bofbelt コマンド BOF(ビーコンオブジェクトファイル)を使用するSeatbeltポートです
cacls コマンド 特定のファイルのユーザーパーミッションを一覧表示します
cat コマンド 特定のファイルの内容を表示します
cd コマンド 特定のディレクトリに変更します
checkin コマンド チェックインリクエストをリクエストします
config モジュール デーモンセッションの動作を構成します
cp コマンド ファイルをコピーします
dcenum コマンド ドメイン情報を列挙します
dir コマンド ディレクトリを一覧表示します
dll モジュール DLLプロセスの生成および注入に関するモジュールです
domainenum コマンド 現在のドメインのユーザーアカウントを一覧表示します
dotnet モジュール .NETアセンブリを実行および管理します
download コマンド 特定のファイルをダウンロードします
driversigs コマンド 既知のEDRベンダー名のドライバをチェックします
enableuser コマンド 特定のユーザーアカウントを有効化します
enum_filter_driver コマンド フィルタドライバを列挙します
enumlocalsessions コマンド 現在アタッチされているユーザーセッションを列挙します
env コマンド 環境変数を出力します
exit コマンド クリーンアップして終了します
get-asrep コマンド 指定したドメインのASREPを持つユーザーアカウントを列挙します
get-delegation コマンド 指定したドメインの悪用可能なさまざまな種類のKerberos委任設定を列挙します
get-netsession コマンド リモートデバイスのセッションを列挙します
get-spns コマンド 指定したドメインのSPNを持つユーザーアカウントを列挙します
get_password_policy コマンド サーバーで構成されているパスワードポリシーを取得します
help コマンド 指定したコマンドのヘルプメッセージを表示します
inline-execute コマンド オブジェクトファイルを実行します
ipconfig コマンド ネットワーク構成の設定を表示します
job モジュール ジョブマネージャーです
jump-exec モジュール 水平方向の移動モジュールです
kerberoast コマンド 特定のSPNに対してKerberoasting攻撃を実行します
klist コマンド Kerberosチケットを一覧表示します
ldapsearch コマンド LDAPの検索を実行します
listdns コマンド DNSキャッシュエントリを取得します
locale コマンド サーバーのロケール情報を出力します
luid コマンド 現在のログオンIDを取得します
mkdir コマンド 新しいディレクトリを作成します
mv コマンド ファイルまたはフォルダを移動します
nanodump コマンド LSASSプロセスをダンプします
nanodump_ppl_dump コマンド PPLを迂回してLSASSをダンプします
nanodump_ppl_medic コマンド PPLを迂回してLSASSをダンプします
nanodump_ssp コマンド セキュリティサポートプロバイダ(SSP)をLSASSにロードします
net モジュール ネットワークとホストを列挙するモジュールです
netGroupList コマンド グループを一覧表示します
netGroupListMembers コマンド グループメンバーを一覧表示します
netLclGrpLstMmbrs コマンド ローカルグループメンバーを一覧表示します
netLocalGroupList コマンド ローカルグループメンバーを一覧表示します
netshares コマンド 共有フォルダを一覧表示します
netsharesAdmin コマンド 共有フォルダの詳細を一覧表示します
netstat コマンド リッスン中および接続中のネットワーク接続を一覧表示します
netuptime コマンド ブート時間情報を取得します
 
netuser コマンド 特定のユーザーに関する情報を取得します
netview コマンド ワークステーションとサーバーを一覧表示します
noconsolation コマンド PEをインラインで実行します
nslookup コマンド 侵害されたデバイスに対してDNSクエリを行います
pivot モジュール ピボッティング用モジュールです
 
powerpick コマンド 管理されていないPowerShellコマンドを実行します
powershell コマンド powershell.exeコマンドを実行します
proc モジュール プロセスを列挙したり管理します
 
ptt コマンド Kerberosチケットをログオンセッションにインポートします
purge コマンド Kerberosチケットを消去します
pwd コマンド 現在のディレクトリを取得します
quser コマンド quser.exeを簡単に実装します
reg_delete コマンド レジストリキーまたは値を削除します
reg_query コマンド レジストリ値をクエリするか、単一のキーを列挙します
reg_query_recursive コマンド キーを再帰的に列挙します
reg_save コマンド レジストリパスおよびすべてのサブキーをファイルに保存します
reg_set コマンド 特定のキーまたは値を作成または設定します
remove コマンド ファイルまたはディレクトリを削除します
resources コマンド メモリまたはディスクドライブの情報を一覧表示します
routeprint コマンド 経路情報を出力します
rportfwd モジュール リバースポートフォワードを行います
samdump コマンド SAM、SECURITY、およびSYSTEMの各レジストリをファイルにダンプします
sc_create コマンド 対象デバイス上にサービスを作成します
sc_delete コマンド 指定したサービスを削除します
sc_description コマンド 既存のサービスの説明を設定します
sc_enum コマンド サービスを列挙します
sc_qc コマンド 名前を指定して、BOF(ビーコンオブジェクトファイル)のサービスをクエリします
sc_qdescription コマンド サービスの説明をクエリします
 
sc_qfailure コマンド サービスの障害状態をクエリします
sc_qtriggerinfo コマンド サービスのトリガ条件をクエリします
sc_query コマンド BOF(ビーコンオブジェクトファイル)のサービスをクエリします
sc_start コマンド 指定したサービスを開始します
sc_stop コマンド 指定したサービスを停止します
schtasksenum コマンド スケジュールタスクを列挙します
schtasksquery コマンド スケジュールタスク内の指定したタスクをクエリします
screenshot コマンド スクリーンショットを撮影します
sessions コマンド ログオンセッションを取得します
setuserpass コマンド 指定したユーザーアカウントのパスワードを設定します
shell コマンド cmd.exeでWindowsコマンドを実行します
shellcode モジュール シェルコードを注入する方法を提供します
sleep コマンド スリープまでの遅延を設定します
socks モジュール socks5プロキシを管理します
task モジュール タスクマネージャーです
tasklist コマンド リモートデバイス上の実行中のプロセスを一覧表示します
tgtdeleg コマンド 現在のユーザーの利用可能なTGTを取得します
token モジュール トークンの操作および偽装を行います
transfer コマンド 転送モジュールをダウンロードします
upload コマンド ファイルをアップロードします
 
uptime コマンド システムのブート時間を一覧表示します
userenum コマンド ユーザーアカウントを一覧表示します
whoami コマンド BOF(ビーコンオブジェクトファイル)のログインユーザー情報を取得します
windowlist コマンド プログラムウィンドウのタイトルなど、表示されているウィンドウを一覧表示します
wmi_query コマンド wmiクエリを実行し、結果をCSV形式で表示します

 ここでは、制御コマンドをパケットにパッケージ化する方法を説明します。攻撃者の立場で、Havoc C2サーバー内に「pwd」コマンドを入力し、デーモンに送信すると、コマンド結果が画面に表示されました。

図10:ハートビートおよび制御コマンドのパケット

 デーモンは通常、C2サーバーとの接続が確立した後、ハートビートパケットを約3秒ごと(乱数)にC2サーバーに送信し、デーモンが生きていることをC2サーバーに通知します。図10は、ハートビートパケットの構造を示しています。

 また、図10の下部には、C2サーバーによって生成された「pwd」コマンドのコマンドパケットも表示されています。制御コマンドデータは、ハートビートパケットに対する応答内で送信されます。

 制御パケットは、先頭がコマンドID(COMMAND_FSの場合は0x0F)で、その後にリクエストID(0xc5312b04)、暗号化されたデータのサイズ、暗号化されたデータ自身が続きます。暗号化されたデータ「51 7c 66 9c」は「00 00 00 09」に復号化されます。これは、コマンドID 0x0F(COMMAND_FS)の下のサブコマンドID 0x9(DEMON_COMMAND_FS_GET_PWD)を意味します。

結論

 本分析は、中東の重要な国家インフラを標的とした長期的なサイバー侵入に関与するHavoc亜種の詳細な調査となります。このリモートインジェクターは、偽装したconhost.exeプロセスを活用して、新しく作成されたcmd.exeプロセスにHavocペイロードを展開する様子が明らかになりました。

 Havocフレームワークはモジュール型の設計で、コマンド、サブコマンド、およびビーコンオブジェクトファイル(BOF)のメモリ内実行をサポートしており、攻撃者は、柔軟な方法で、リモートのデーモンプロセスを制御することができます。

 一般的に、リサーチャーは、パケットの構造、暗号化メカニズム、およびコマンド実行ワークフローを理解することで、この巧妙なRATフレームワークを検知し分析することができます。

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

 フォーティネットのお客様は、アンチウイルスサービス、FortiGuardのAnti-Botnetサービス、AntiSPAMサービス、およびWebフィルタリングサービスによって、このマルウェアから以下のように保護されています。

 FortiGuardのAnti-Botnetサービスは、C2サーバーのドメインへのDNSリクエストをブロックします。
 
 C2サーバーのドメインは、FortiGuard Webフィルタリングサービスにより「悪意のあるWebサイト」として識別されます。

 FortiGuardアンチウイルスサービスは、このリモートインジェクター、および暗号化されたHavoc DLLファイルを、次のアンチウルスシグネチャを使って検知します。

W64/Havoc.d16b!tr
Data/Havoc.e5b0!tr


 FortiGuard IPSサービスは、Havocのトラフィックをシグネチャ「Backdoor.Havoc.Agent」を使って検知します。

 FortiGate、FortiMail、FortiClient、およびFortiEDRは、FortiGuardアンチウイルスサービスをサポートしています。FortiGuardアンチウイルスエンジンは、各ソリューションに含まれています。その結果、最新の保護機能を備えたこれらの製品を使用するお客様はすでに保護されています。

 また、読者の皆様には、フォーティネットが無償で提供するNSEトレーニングNSE 1 – 情報セキュリティ意識向上を受講することをお勧めします。このトレーニングにはインターネットの脅威に関するモジュールが含まれ、エンドユーザーは各種のフィッシング攻撃を識別して自らを保護する方法を学習できます。

 お客様の組織が、この脅威やその他のサイバーセキュリティ脅威の影響を受けていると思われる場合、当社のFortiGuardグローバルインシデントレスポンスチームまでお問い合わせください。

IOC(Indicator of Compromise:侵害指標):

C2サーバー:
apps[.]gist[.]githubapp[.]net

関連するサンプルSHA-256:
[conhost.exe / リモートインジェクター]
22BD09FBAB54963D4B0234585D33571A47A2DF569DBAB8B40988415AB0A3C37B
[conhost.dll / シェルコードを含む暗号化されたHavocサンプル]
9208034AF160357C99B45564FF54570B1510BAF3BC033999AE4281482617FF5B

■関連サイト