マルウェア使いの匠:UNC2891の概要

Mathew Potaczek, Takahiro Sugiyama, Logeswaran Nadarajan, Yu Nakamura, Josh Homan, Martin Co, Sylvain Hirsch
Mar 16, 2022
5 min read
|   Last update Aug 19, 2022

Mandiant Advanced Practices チームは以前、UNC1945の脅威に関するブログ記事を公開し、この攻撃者 がマネージドサービスプロバイダーを侵害し、金融および専門コンサルティング業界の標的へのアクセスを獲得していたことについて概要を説明しました。

それ以来、Mandiant は、この攻撃者と関連があると思われる脅威クラスタ(現在 UNC2891 として追跡中)について調査し、いくつかの侵入を特定しました。これらの調査を通じて、Mandiant は、以前 UNC1945 によって使用されていた技術、マルウェア、およびユーティリティに加えて、新たに UNC2891 によって使用されている技術を発見しました。これらの脅威クラスタには大きな重複が確認されていますが、Mandiantはこれらが同一の攻撃者に帰属するとは結論づけていません。

  • UNC2891の攻撃は、金銭的な動機によるものと見られ、場合によっては、攻撃者がまったく発見されないまま、数年に渡って行われたこともあります。
  • UNC2891は、主にTINYSHELLSLAPSTICKバックドアを使用してOracle Solarisベースのシステムを標的とし、UnixおよびLinux環境における卓越した専門知識を実証しています。
  • Mandiantは、UNC2891が高度なOPSECで活動し、公的および私的なマルウェア、ユーティリティ、スクリプトを活用して証拠を消し、調査対応活動を妨げていることを確認しました。
  • Mandiantは、UNC2891が被害組織内のネットワークに潜伏するために使用するOracle Solarisシステム用のこれまで知られていなかったルートキットを発見し、これをCAKETAPと名付けました。
  • CAKETAP1つのバリエーションは、被害組織のAutomatic Teller MachineATM)スイッチングネットワークを通過するメッセージを操作していました。これは、不正なバンクカードを使用して複数の銀行で不正に現金を引き出すための大規模な オペレーションの一部として利用されたと考えられています。

SLAPSTICKTINYSHELLバックドアの大規模な使用

過去の UNC1945 の侵入と同様に、Mandiant UNC2891 SLAPSTICK として追跡しているプラグイン認証モジュール(PAM)ベースのバックドアを広範囲に使用して、認証情報の採取を容易にし、被害者ネットワーク内の感染マシンへのバックドア アクセスを提供していることを確認しました。以前のブログ記事で詳しく説明したように、SLAPSTICKは、ハードコードされた秘密のパスワードを使って、感染したシステムに持続的なバックドア・アクセスを提供し、認証試行と対応するパスワードを暗号化されたログ・ファイルに記録します。これは、UNC2891の認証情報の採取と水平展開に多大な貢献をしたことが予想されますが、Mandiantのインシデント対応担当者にも貴重な情報を提供しました。SLAPSTICKのログファイルはしばしばタイムストンプされていましたが、Mandiantはそれを解読し、バックドアから提供された秘密のパスワードを使用した攻撃者の水平展開のいくつかを追跡することができました。

Example SLAPSTICK decoded log (fabricated)
図1:SLAPSTICKのデコードログ例(加工済み)

UNC2891は、SLAPSTICKと並んで、一般に公開されているTINYSHELLバックドアのカスタム亜種をしばしばインストールしました。UNC2891TINYSHELLバックドアは、外部の暗号化された設定ファイルを活用し、一部の亜種には、基本認証でHTTPプロキシを介して通信する機能などの追加機能が含まれていました。UNC2891は、UnixおよびLinuxベースのシステムに精通していることから、systemdSYSTEMD)、ネームサービスキャッシュデーモン(NCSD)、Linux atデーモン(ATD)など、捜査当局が見落とすような正規サービスを装った値でTINYSHELLバックドアに名前を付けて設定することがよくあります。

1.観測されたTINYSHELLのファイルパス

TINYSHELLバックドアファイルパス

TINYSHELLコンフィグレーションファイルパス

/usr/lib/libhelpx.so.1

/usr/lib/systemd/systemd-helper

/usr/sbin/nscd

/usr/lib/libatdcf.so

/usr/lib/libnscd.so.1

/usr/lib/libsystemdcf.so

/var/ntp/ntpstats/1

2TINYSHELLの復号化設定例(systemdの亜種)

Example Decoded configuration                                                                                                                     

pm_systemd_mag <32-character string>

systemd_nme <system id>

pm_systemd_adr <C2 IP address/domain>

pm_systemd_prt <443 or 53>

pm_systemd_tme 300

systemd_non1 none

systemd_non2 none

systemd_non3 none

systemd_non4 none

 systemdの亜種の場合、UNC2891は、TINYSHELLバックドアを持続させるためにsystemdサービスユニットファイルを活用することもありました。

3TINYSHELLの持続に使用するサービスユニットファイル

/usr/lib/systemd/system/systemd-helper.service                                                         

[Unit]

Description=Rebuild Hardware Database

 

[Service]

Type=forking

ExecStart=/lib/systemd/systemd-helper

 

[Install]

WantedBy=multi-user.target

コンフィグレーションを分析してみると、UNC2891TINYSHELLバックドアをマルチホップ構造で構成し、コマンド&コントロールのために、侵害された複数の内部サーバを利用していました。あるケースでは、攻撃者がネットワーク制限のあるネットワークセグメント内のサーバへのリモートアクセスを取得するために、異なるTINYSHELLの亜種を連結させていたことを示唆する証拠が見つかりました。

TINYSHELL接続のネットワークを隠すために、UNC2891は、ネットワーク接続関連のAPIからこれらの接続をフィルタリングするルートキットをインストールし、設定していました(CAKETAPルートキットの詳細については、このままお読みください)。UNC2891は、外部コマンド&コントロールチャネルにダイナミックDNSドメインを使用するTINYSHELLバックドアで、リモートアクセス可能なシステムを構成していました。これらのドメインはホストごとに作成され、複数回使用されることはなく、サブドメインは侵害されたマシンのホスト名に類似していることもあるとのことです。Mandiantは、これらのダイナミックDNSドメインのパッシブDNSデータを収集することができず、UNC2891がネットワークへのアクセスが必要な短時間の間、IPアドレス解決を有効にしていた可能性が高いことが示唆されました。ある被害組織では、これらのTINYSHELLバックドアは、ポート53および443上でTCPを使用して通信を行うように設定されていました。これは、送信ネットワーク保護をバイパスし、既存のトラフィックに紛れ込ませ、検知を回避する仕組みと思われます。

 

Example of TINYSHELL command and control used by UNC2891
図2:UNC2891で使用されているTINYSHELLのコマンド・コントロールの例

STEELHOUNDSTEELCORGI、環境変数キーイングについて

UNC2891は、しばしばSTEELCORGIインメモリドロッパーを使用し、実行時に取得した環境変数の値からChaCha20キーを導出することで埋め込みペイロードを復号化します。多くの場合、Mandiantは、埋め込まれたペイロードを復号化するために必要な環境変数を復元することができませんでした。しかし、解読できた限られたサンプルの中で、UNC2891は、SUN4MEという名前で開発されたと思われる広範なツールキットの異なるバージョンを展開していたことが判明しました。SUN4MEには、ネットワーク偵察、ホスト列挙、既知の脆弱性の悪用、ログ消去、ファイル操作、および一般的なシェルユーティリティのためのツールが含まれています。Yoroiは以前、UNC1945STEELCORGIを使用しているというブログ記事を掲載し、このツールキットに関する情報を公表しています。

Mandiant は、UNC2891 が、環境変数を使用して埋め込まれたペイロードを復号化する代わりに RC4 暗号に依存する同様のインメモリドロッパーを利用していることを発見し、これを STEELHOUND と名付けました。STEELHOUNDは、組み込みペイロードのドロッパーとして機能するだけでなく、ターゲットバイナリを暗号化し、自身のコピーとファイル終了時の設定と共にディスクに書き込むことで、新しいペイロードを暗号化することができます。

WINGHOOK と WINGCRACK

これらの調査の中で、Mandiantは、私たちがWINGHOOKWINGCRACKと名付けたキーロガー・マルウェアのファミリーも発見しています。

  • 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 ユーティリティです。これは、lastlogutmp/utmpxwtmp/wtmpx、およびpacctログ内の、特定のユーザに関連するエントリを削除することができます。利用可能なソースコードから生まれたと思われ、おそらくより新しいバージョンもあります。
  • MIGLOGCLEANERは、LinuxUnixベースのシステムでログを消去したり、ログから特定の文字列を削除するための別のELFユーティリティです。これは、GitHubで一般に公開されています。

UNC2891は、マルウェアのバイナリやホスト列挙スクリプトの出力を含むファイルなどのエンコードおよびデコードに、uuencodingスキームを頻繁に使用する脅威者として知られています。攻撃者はしばしば、uuencodinguudecodingの機能を実行するシンプルなPerlのラッパースクリプトを利用していました。

CAKETAP

CAKETAPは、UNC2891Oracle 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フックのためのシグナル文字列を含んでいます。

4CAKETAPフックの観察された秘密

Secret                           

Usage                                                            

.caahGss187

mkdirat hook signal string

.zaahGss187

getdents64 hook signal string

mkdiratフックにより、UNC2891は、これらのシステムコールを活用したシェルコマンド(例:mkdiratmkdir)を発行し、侵害されたサーバへの既存のバックドアアクセスを通じてCAKETAPを制御および設定することが可能になりました。シグナル文字列に付加された1文字が、どのコマンドが実行されるかを示していました。確認されたコマンドは以下の通り。

5:観測されたCAKETAPコマンド

Command

Function

Empty

Add the CAKETAP module back to loaded modules list

M

Change the signal string for the getdents64 hook

I

Add a network filter (format <IP>p<PORT>)

i

Remove a network filter

P

Set the current thread TTY to not be filtered by the getdents64 hook

p

Set all TTYs to be filtered by the getdents64 hook

S

Displays the current configuration

例えば、新しいネットワークフィルターを設定し、現在の設定を表示する場合、次のようなコマンドを使用します。

  • 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 ModuleHSM)宛ての特定のメッセージを標的にしていました。この追加的なネットワーク・フッキングは、いくつかの機能を実行しました。

  1. カード照合メッセージの操作:
    CAKETAPは、カード照合機能を無効にするために、特定の送信メッセージのモードを変更しました。その結果、HSMは適切なカード照合を行わず、有効なレスポンスを生成することになりました。不正な銀行カードは、プライマリアカウント番号(PAN)およびCAKETAPの「マーカー」となるその他のパラメータを使用したカスタムアルゴリズムを使用して検証メッセージを生成しました。CAKETAPは送信されたメッセージを調べ、アルゴリズムと一致した場合、そのカードを不正カードとして識別し、次のステップで使用するためにPANをメモリに保存しました。
  2. PIN認証メッセージの再生:
    CAKETAPは、送信されたPIN照合メッセージのうち、特定の条件に一致するものを調べ、プライマリアカウント番号(PAN)が不正カードを反映しているものを特定しました。不正カードでない場合は、ATMの正当なPIN照合を妨げないよう、メッセージを内部に保存し、修正せずに送信しました。しかし、不正カードであった場合、CAKETAPはメッセージの内容を以前に保存したメッセージのデータに置き換えて送信します。これは事実上、不正カードのPIN照合を回避するリプレイ攻撃となります。

Mandiantの調査結果によると、CAKETAPUNC2891によってより大きな作戦の一部として活用され、不正な銀行カードを使用して複数の銀行の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

Malware Family

MD5

SHA1

SHA256

STEELCORGI

e5791e4d2b479ff1dfee983ca6221a53

e55514b83135c5804786fa6056c88988ea70e360

95964d669250f0ed161409b93f7a131bfa03ea302575d555d91ab5869391c278

STEELCORGI

0845835e18a3ed4057498250d30a11b1

c28366c3f29226cb2677d391d41e83f9c690caf7

7d587a5f6f36a74dcfbcbaecb2b0547fdf1ecdb034341f4cc7ae489f5b57a11d

STEELCORGI

d985de52b69b60aa08893185029bcb31

a3e75e2f700e449ebb62962b28b7c230790dc25d

cd06246aff527263e409dd779b517157882a1f5f74a84ad78b3b0c44d306bfc3

TINYSHELL

4ff6647c44b0417c80974b806b1fbcc3

fa36f10407ed5a6858bd1475d88dd35927492f52

55397addbea8e5efb8e6493f3bd1e99f9742ff4cfe0f0d3da7e92067904b5194

TINYSHELL

13f6601567523e6a37f131ef2ac4390b

4228d71c042d08840089895bfa6bd594b5299a89

24f459a2752175449939037d6a1da09cac0e414020ce9c48bcef47ec96e3587b

TINYSHELL

4e9967558cd042cac8b12f378db14259

018bfe5b9f34108424dd63365a14ab005e249fdd

5f46a25473b9dda834519093c66cced0e3630378c2a953ebd83f90f3777f2e19

STEELHOUND

a4617c9a4bde94e867f063c28d763766

097d3a15510c48cdb738344bdf00082e546827e8

161a2832baba6ff6f9f1b52ed8facfa1197cfc7947fe58152b3617a258cf52b0

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