マルウェア使いの匠:UNC2891の概要
Mandiant
※この投稿は米国時間 2022 年 3 月 16 日に、Google Cloud blog に投稿されたものの抄訳です。
Mandiant Advanced Practices チームは以前、UNC1945の脅威に関するブログ記事を公開し、この攻撃者 がマネージドサービスプロバイダーを侵害し、金融および専門コンサルティング業界の標的へのアクセスを獲得していたことについて概要を説明しました。
それ以来、Mandiant は、この攻撃者と関連があると思われる脅威クラスタ(現在 UNC2891 として追跡中)について調査し、いくつかの侵入を特定しました。これらの調査を通じて、Mandiant は、以前 UNC1945 によって使用されていた技術、マルウェア、およびユーティリティに加えて、新たに UNC2891 によって使用されている技術を発見しました。これらの脅威クラスタには大きな重複が確認されていますが、Mandiantはこれらが同一の攻撃者に帰属するとは結論づけていません。
- UNC2891の攻撃は、金銭的な動機によるものと見られ、場合によっては、攻撃者がまったく発見されないまま、数年に渡って行われたこともあります。
- UNC2891は、主にTINYSHELLとSLAPSTICKバックドアを使用してOracle Solarisベースのシステムを標的とし、UnixおよびLinux環境における卓越した専門知識を実証しています。
- Mandiantは、UNC2891が高度なOPSECで活動し、公的および私的なマルウェア、ユーティリティ、スクリプトを活用して証拠を消し、調査対応活動を妨げていることを確認しました。
- Mandiantは、UNC2891が被害組織内のネットワークに潜伏するために使用するOracle Solarisシステム用のこれまで知られていなかったルートキットを発見し、これをCAKETAPと名付けました。
- CAKETAPの1つのバリエーションは、被害組織のAutomatic Teller Machine(ATM)スイッチングネットワークを通過するメッセージを操作していました。これは、不正なバンクカードを使用して複数の銀行で不正に現金を引き出すための大規模な オペレーションの一部として利用されたと考えられています。
SLAPSTICKとTINYSHELLバックドアの大規模な使用
過去の UNC1945 の侵入と同様に、Mandiant は UNC2891 が SLAPSTICK として追跡しているプラグイン認証モジュール(PAM)ベースのバックドアを広範囲に使用して、認証情報の採取を容易にし、被害者ネットワーク内の感染マシンへのバックドア アクセスを提供していることを確認しました。以前のブログ記事で詳しく説明したように、SLAPSTICKは、ハードコードされた秘密のパスワードを使って、感染したシステムに持続的なバックドア・アクセスを提供し、認証試行と対応するパスワードを暗号化されたログ・ファイルに記録します。これは、UNC2891の認証情報の採取と水平展開に多大な貢献をしたことが予想されますが、Mandiantのインシデント対応担当者にも貴重な情報を提供しました。SLAPSTICKのログファイルはしばしばタイムストンプされていましたが、Mandiantはそれを解読し、バックドアから提供された秘密のパスワードを使用した攻撃者の水平展開のいくつかを追跡することができました。
図1:SLAPSTICKのデコードログ例(加工済み)
UNC2891は、SLAPSTICKと並んで、一般に公開されているTINYSHELLバックドアのカスタム亜種をしばしばインストールしました。UNC2891のTINYSHELLバックドアは、外部の暗号化された設定ファイルを活用し、一部の亜種には、基本認証でHTTPプロキシを介して通信する機能などの追加機能が含まれていました。UNC2891は、UnixおよびLinuxベースのシステムに精通していることから、systemd(SYSTEMD)、ネームサービスキャッシュデーモン(NCSD)、Linux atデーモン(ATD)など、捜査当局が見落とすような正規サービスを装った値でTINYSHELLバックドアに名前を付けて設定することがよくあります。
systemdの亜種の場合、UNC2891は、TINYSHELLバックドアを持続させるためにsystemdサービスユニットファイルを活用することもありました。
コンフィグレーションを分析してみると、UNC2891はTINYSHELLバックドアをマルチホップ構造で構成し、コマンド&コントロールのために、侵害された複数の内部サーバを利用していました。あるケースでは、攻撃者がネットワーク制限のあるネットワークセグメント内のサーバへのリモートアクセスを取得するために、異なるTINYSHELLの亜種を連結させていたことを示唆する証拠が見つかりました。
TINYSHELL接続のネットワークを隠すために、UNC2891は、ネットワーク接続関連のAPIからこれらの接続をフィルタリングするルートキットをインストールし、設定していました(CAKETAPルートキットの詳細については、このままお読みください)。UNC2891は、外部コマンド&コントロールチャネルにダイナミックDNSドメインを使用するTINYSHELLバックドアで、リモートアクセス可能なシステムを構成していました。これらのドメインはホストごとに作成され、複数回使用されることはなく、サブドメインは侵害されたマシンのホスト名に類似していることもあるとのことです。Mandiantは、これらのダイナミックDNSドメインのパッシブDNSデータを収集することができず、UNC2891がネットワークへのアクセスが必要な短時間の間、IPアドレス解決を有効にしていた可能性が高いことが示唆されました。ある被害組織では、これらのTINYSHELLバックドアは、ポート53および443上でTCPを使用して通信を行うように設定されていました。これは、送信ネットワーク保護をバイパスし、既存のトラフィックに紛れ込ませ、検知を回避する仕組みと思われます。
図2:UNC2891で使用されているTINYSHELLのコマンド・コントロールの例
STEELHOUND、STEELCORGI、環境変数キーイングについて
UNC2891は、しばしばSTEELCORGIインメモリドロッパーを使用し、実行時に取得した環境変数の値からChaCha20キーを導出することで埋め込みペイロードを復号化します。多くの場合、Mandiantは、埋め込まれたペイロードを復号化するために必要な環境変数を復元することができませんでした。しかし、解読できた限られたサンプルの中で、UNC2891は、SUN4MEという名前で開発されたと思われる広範なツールキットの異なるバージョンを展開していたことが判明しました。SUN4MEには、ネットワーク偵察、ホスト列挙、既知の脆弱性の悪用、ログ消去、ファイル操作、および一般的なシェルユーティリティのためのツールが含まれています。Yoroiは以前、UNC1945がSTEELCORGIを使用しているというブログ記事を掲載し、このツールキットに関する情報を公表しています。
Mandiant は、UNC2891 が、環境変数を使用して埋め込まれたペイロードを復号化する代わりに RC4 暗号に依存する同様のインメモリドロッパーを利用していることを発見し、これを STEELHOUND と名付けました。STEELHOUNDは、組み込みペイロードのドロッパーとして機能するだけでなく、ターゲットバイナリを暗号化し、自身のコピーとファイル終了時の設定と共にディスクに書き込むことで、新しいペイロードを暗号化することができます。
WINGHOOK と WINGCRACK
これらの調査の中で、Mandiantは、私たちがWINGHOOKとWINGCRACKと名付けたキーロガー・マルウェアのファミリーも発見しています。
- WINGHOOKは、LinuxおよびUnixベースのオペレーティングシステム用のキーロガーです。これは、ユーザー入力の処理に使用される2つの一般的な関数であるread関数とfgets関数をフックする共有ライブラリ(SOファイル)としてパッケージ化されています。キャプチャされたデータは、エンコードされた形式で、ディレクトリ /var/tmp/ に .zmanDw で始まるファイル名で保存されます。
- WINGCRACKは、WINGHOOKからエンコードされたkeylogデータを含むファイルの内容をデコードして表示することができるユーティリティです。マルウェアの作者は、これらの符号化されたファイルを「schwing」ファイルと呼んでいるようです。
観測されたユーティリティ
Mandiantは以前、UNC1945が侵入時に大量のパブリック/プライベートツールを使用していることを確認しており、これはUNC2891にも当てはまります。Mandiantは、UNC2891によって利用された追加のユーティリティを発見しました。
- BINBASHは、グループIDとユーザーIDを「root」または指定された値に設定した後にシェルを実行する、シンプルなELFユーティリティです。BINBASHは、ソースコードをコンパイルしたものと思われます。
- WIPERIGHT は、Linux や Unix ベースのシステムで、特定のログエントリをクリアする ELF ユーティリティです。これは、lastlog、utmp/utmpx、wtmp/wtmpx、およびpacctログ内の、特定のユーザに関連するエントリを削除することができます。利用可能なソースコードから生まれたと思われ、おそらくより新しいバージョンもあります。
- MIGLOGCLEANERは、LinuxやUnixベースのシステムでログを消去したり、ログから特定の文字列を削除するための別のELFユーティリティです。これは、GitHubで一般に公開されています。
UNC2891は、マルウェアのバイナリやホスト列挙スクリプトの出力を含むファイルなどのエンコードおよびデコードに、uuencodingスキームを頻繁に使用する脅威者として知られています。攻撃者はしばしば、uuencodingとuudecodingの機能を実行するシンプルなPerlのラッパースクリプトを利用していました。
CAKETAP
CAKETAPは、UNC2891がOracle Solarisを実行する主要なサーバーインフラに展開したカーネルモジュールルートキットです。CAKETAPは、ネットワーク接続、プロセス、およびファイルを隠すことができます。初期化中に、ロードされたモジュールリストから自身を削除し、以前ロードされたモジュールでlast_module_idを更新して、自身の存在を隠します。
ipcl_get_next_conn関数とipモジュールのいくつかの関数にフックがインストールされています。これにより、CAKETAPは、攻撃者が設定したIPアドレスまたはポート(ローカルまたはリモート)に一致するすべての接続をフィルタリングすることができます。
Solarisシステム上で動作するCAKETAPを識別する方法の1つは、このフックの存在を確認することです。以下に、フックされたipcl_get_next_conn関数を特定するためのコマンド例を示します(注:mdbコマンドは、システム上で特別なパーミッションを必要とする場合があります)。
root@solaris:~# echo 'ipcl_get_next_conn::dis -n 0 ; ::quit' | mdb -k
クリーンなSPARC Solarisシステムでの出力は、以下のようになります。
ipcl_get_next_conn: save %sp, -0xb0, %sp
フックした関数は、次のようにsethi命令で始まります(定数0x11971c00は、CAKETAPがロードされる場所によってインスタンスごとに変わります)。
ipcl_get_next_conn: sethi %hi(0x11971c00), %g1
フックした関数は、次のようにsethi命令で始まります(定数0x11971c00は、CAKETAPがロードされる場所によってインスタンスごとに変わります)。
ipcl_get_next_conn: sethi %hi(0x11971c00), %g1
追加のフックは、mkdirat (make directory at) と getdents64 (get directory entries) システムコールにインストールされています。CAKETAPは、シグナル文字列を含むパスからコマンドを受信するためにmkdiratフックを使用します。 コマンドには、ネットワークフィルタの設定、設定の表示や更新、自分自身の非表示などがあります。getdents64フックは、CAKETAPがシークレットシグナル文字列を含むファイルシステム上のファイルまたはディレクトリを隠すことを可能にします。表4は、CAKETAPフックのためのシグナル文字列を含んでいます。
mkdiratフックにより、UNC2891は、これらのシステムコールを活用したシェルコマンド(例:mkdiratのmkdir)を発行し、侵害されたサーバへの既存のバックドアアクセスを通じてCAKETAPを制御および設定することが可能になりました。シグナル文字列に付加された1文字が、どのコマンドが実行されるかを示していました。確認されたコマンドは以下の通り。
例えば、新しいネットワークフィルターを設定し、現在の設定を表示する場合、次のようなコマンドを使用します。
- mkdir /some/path/.caahGss187I192.168.1.10p80 - Add network filter for 192.168.1.10:80
- mkdir /some/path/.caahGss187S - Display current configuration
getdents64 にインストールされたフックは、ディレクトリのコンテンツにシグナル文字列が存在することを隠すために出力をフィルタリングしていました。
Mandiantは、UNC2891が/varディレクトリツリー内のどこかにしばしば存在する攻撃者が作成したディレクトリからipstatというモジュール名でCAKETAPをロードしているのを観測しました。
CAKETAP 不正取引について
ある被害組織のATMスイッチサーバーのメモリフォレンジックにより、ネットワークフッキング機能を追加したCAKETAPの亜種が発見され、カードとピンの認証に関する特定のメッセージを傍受していたことが判明しました。このCAKETAPの亜種は、不正な銀行カードを使用して不正な取引を行う作戦の一部として使用されたことを示す証拠です。
このCAKETAPの亜種は、Payment Hardware Security Module(HSM)宛ての特定のメッセージを標的にしていました。この追加的なネットワーク・フッキングは、いくつかの機能を実行しました。
- カード照合メッセージの操作:
CAKETAPは、カード照合機能を無効にするために、特定の送信メッセージのモードを変更しました。その結果、HSMは適切なカード照合を行わず、有効なレスポンスを生成することになりました。不正な銀行カードは、プライマリアカウント番号(PAN)およびCAKETAPの「マーカー」となるその他のパラメータを使用したカスタムアルゴリズムを使用して検証メッセージを生成しました。CAKETAPは送信されたメッセージを調べ、アルゴリズムと一致した場合、そのカードを不正カードとして識別し、次のステップで使用するためにPANをメモリに保存しました。 - PIN認証メッセージの再生:
CAKETAPは、送信されたPIN照合メッセージのうち、特定の条件に一致するものを調べ、プライマリアカウント番号(PAN)が不正カードを反映しているものを特定しました。不正カードでない場合は、ATMの正当なPIN照合を妨げないよう、メッセージを内部に保存し、修正せずに送信しました。しかし、不正カードであった場合、CAKETAPはメッセージの内容を以前に保存したメッセージのデータに置き換えて送信します。これは事実上、不正カードのPIN照合を回避するリプレイ攻撃となります。
Mandiantの調査結果によると、CAKETAPはUNC2891によってより大きな作戦の一部として活用され、不正な銀行カードを使用して複数の銀行のATM端末から不正な現金引き出しに成功したと考えられています。
結 論
UNC2891は、高いレベルのOPSECを維持し、検知を回避するためにいくつかのテクニックを使用しています。この攻撃者は、そのスキルと経験を活かし、UnixおよびLinux環境にしばしば存在する可視性の低下とセキュリティ対策を最大限に活用しています。Mandiantは、UNC2891が今後もこの点を利用し、これらのOSが動作するミッションクリティカルなシステムをターゲットに、金銭的利益を得るために同様の活動を行うことを予測しています。
UNC2891 と UNC1945 の間には、いくつかの重複が見られますが、これらの侵入を単一の脅威グループによるものと断定するには十分ではありません。例えば、UNC2891 と UNC1945 の活動のかなりの部分が、複数の攻撃者にとって共通のリソースであるエンティティによって実行されている可能性があり、それによって、例えば共通のマルウェア開発者や侵入パートナーなど、侵入目的における認識の違いを説明できる可能性があります。いずれにせよ、Mandiantは、この攻撃者に関する情報を公開することで、不正行為に対する認識を高め、防御者によるUNC2891のさらなる活動の摘発を支援します。
YARA
以下のYARAルールは、適切なパフォーマンスを確保し、誤検知のリスクを抑えるために、組織内部のテストプロセスで検証することなく、本番システムに使用したり、ブロッキングルールに使用したりすることを意図したものではありません。これらのルールは、サンプルを特定するためのハンティング活動の出発点となることを意図していますが、マルウェア・ファミリーが変化した場合には、時間の経過とともに調整が必要となる場合があります。
rule TINYSHELL
{
meta:
author = "Mandiant "
strings:
$sb1 = { C6 00 48 C6 4? ?? 49 C6 4? ?? 49 C6 4? ?? 4C C6 4? ?? 53 C6 4? ?? 45 C6 4? ?? 54 C6 4? ?? 3D C6 4? ?? 46 C6 4? ?? 00 }
$sb2 = { C6 00 54 C6 4? ?? 4D C6 4? ?? 45 C6 4? ?? 3D C6 4? ?? 52 }
$ss1 = "fork" ascii fullword wide
$ss2 = "socket" ascii fullword wide
$ss3 = "bind" ascii fullword wide
$ss4 = "listen" ascii fullword wide
$ss5 = "accept" ascii fullword wide
$ss6 = "alarm" ascii fullword wide
$ss7 = "shutdown" ascii fullword wide
$ss8 = "creat" ascii fullword wide
$ss9 = "write" ascii fullword wide
$ss10 = "open" ascii fullword wide
$ss11 = "read" ascii fullword wide
$ss12 = "execl" ascii fullword wide
$ss13 = "gethostbyname" ascii fullword wide
$ss14 = "connect" ascii fullword wide
condition:
uint32(0) == 0x464c457f and 1 of ($sb*) and 10 of ($ss*)
}
rule TINYSHELL_SPARC
{
meta:
author = "Mandiant"
strings:
$sb_xor_1 = { DA 0A 80 0C 82 18 40 0D C2 2A 00 0B 96 02 E0 01 98 03 20 01 82 1B 20 04 80 A0 00 01 82 60 20 00 98 0B 00 01 C2 4A 00 0B 80 A0 60 00 32 BF FF F5 C2 0A 00 0B 81 C3 E0 08 }
$sb_xor_2 = { C6 4A 00 00 80 A0 E0 00 02 40 00 0B C8 0A 00 00 85 38 60 00 C4 09 40 02 84 18 80 04 C4 2A 00 00 82 00 60 01 80 A0 60 04 83 64 60 00 10 6F FF F5 90 02 20 01 81 C3 E0 08 }
condition:
uint32(0) == 0x464C457F and (uint16(0x10) & 0x0200 == 0x0200) and (uint16(0x12) & 0x0200 == 0x0200) and 1 of them
}
rule SLAPSTICK
{
meta:
author = "Mandiant "
strings:
$ss1 = "%Y %b %d %H:%M:%S \x00"
$ss2 = "%-23s %-23s %-23s\x00"
$ss3 = "%-23s %-23s %-23s %-23s %-23s %s\x0a\x00"
condition:
(uint32(0) == 0x464c457f) and all of them
}
rule STEELCORGI
meta:
author = "Mandiant "
strings:
$s1 = "\x00\xff/\xffp\xffr\xffo\xffc\xff/\xffs\xffe\xffl\xfff\xff/\xffe\xffx\xffe\x00"
$s2 = "\x00\xff/\xffv\xffa\xffr\xff/\xffl\xffi\xffb\xff/\xffd\xffb\xffu\xffs\xff/\xffm\xffa\xffc\xffh\xffi\xffn\xffe\xff-\xffi\xffd\x00"
$sb1 = { FE 1B 7A DE 23 D1 E9 A1 1D 7F 9E C1 FD A4 }
$sb2 = { 3B 8D 4F 45 7C 4F 6A 6C D8 2F 1F B2 19 C4 45 6A 6A }
condition:
(uint32(0) == 0x464c457f) and all of them
}
Indicators of Compromise
MITRE ATT&CK
- Discovery:
- T1016:System Network Configuration Discovery
- T1018:Remote System Discovery
- T1049:System Network Connections Discovery
- T1082:System Information Discovery
- T1083:File and Directory Discovery
- T1135:Network Share Discovery
- Lateral Movement:
- T1021:Remote Services
- T1021.004:SSH
- Credential Access:
- T1003:OS Credential Dumping
- T1003.008:/etc/passwd and /etc/shadow
- T1110:Brute Force
- T1110.001:Password Guessing
- T1552:Unsecured Credentials
- T1552.003:Bash History
- T1552.004:Private Keys
- T1556.003:Pluggable Authentication Modules
- Command and Control:
- T1090:Proxy
- T1095:Non-Application Layer Protocol
- T1105:Ingress Tool Transfer
- T1572:Protocol Tunneling
- T1573.001:Symmetric Cryptography
- Execution:
- T1053.001:At (Linux)
- T1059:Command and Scripting Interpreter
- T1059.004:Unix Shell
- Collection:
- T1056.001:Keylogging
- T1560:Archive Collected Data
- T1560.001:Archive via Utility
- T1560.002:Archive via Library
- Defense Evasion:
- T1014:Rootkit
- T1027:Obfuscated Files or Information
- T1070:Indicator Removal on Host
- T1070.002:Clear Linux or Mac System Logs
- T1070.004:File Deletion
- T1070.006:Timestomp
- T1140:Deobfuscate/Decode Files or Information
- T1480.001:Environmental Keying
- T1548.001:Setuid and Setgid
- T1620:Reflective Code Loading
- Persistence:
- T1543.002:Systemd Service
- T1547.006:Kernel Modules and Extensions
-Mandiant, 作成者: Mathew Potaczek, Takahiro Sugiyama, Logeswaran Nadarajan, Yu Nakamura, Josh Homan, Martin Co, Sylvain Hirsch