攻撃グループBlackTechが使用するマルウェアGh0stTimes

国内における攻撃グループBlackTechの活動が、2018年頃から継続的に確認されています。最近は、以前に比べると話題になることが少なくなりましたが、JPCERT/CCでは現在も引き続き攻撃活動を確認しています。今回は、攻撃グループBlackTechが使用したと考えられるマルウェアGh0stTimesの詳細を紹介します。

Gh0stTimesの概要

Gh0stTimesは、Gh0st RATをカスタマイズして作成したマルウェアで、2020年頃から複数の攻撃で使用されていることを確認しています。図1は、Gh0stTimesと、Gh0st RATのコードの一部を比較したものです。

Gh0stTimesとGh0st RATのコード(CFileManager)の比較
図1:Gh0stTimesとGh0st RATのコード(CFileManager)の比較
(左:Gh0stTimes 右:Gh0st RAT)

上記コードは、ファイル操作を行う関数ですが、本関数に関してはほぼ同じコードを使い回していることがわかります。Gh0stTimesはGh0st RATから大幅に変更が加えられていますが、このように一部のコードは全く同じものが使われています。以降では、次のGh0stTimesの特徴について説明します。

  • 通信方式
  • 命令によって実行されるコマンド
  • ダミーコード
  • C2サーバーのコントロールパネル

通信方式

Gh0stTimesは、Gh0st RAT同様に独自プロトコルでC2サーバーと通信をします。しかし、Gh0st RATとは、通信パケットのフォーマットが異なります。図2は、Gh0stTimesの通信の流れを示しています。

Gh0stTimesの通信の流れ
図2:Gh0stTimesの通信の流れ

Gh0stTimesは、最初のC2サーバーとの通信時に、認証ID(図2のAuth ID)と以降の通信で使用する暗号化キーを作成するためのデータ(図2のKey)を送信します。C2サーバー側では、認証IDの確認を行って、一致した場合のみ通信を受け付けるようになっています。図3は、Gh0stTimesに指定されていた認証IDの例です。

Gh0stTimesの認証IDの例
図3:Gh0stTimesの認証IDの例

認証に成功した以降の通信は、最初に送信した暗号化キーを使用して暗号化されています。 次の通信では、感染ホストの情報が送信されます。送信する感染ホストの情報には図4の通り、ホスト名、ユーザー名やプロセッサ名などが含まれています。

Gh0stTimesが送信する感染ホストの情報
図4:Gh0stTimesが送信する感染ホストの情報

感染ホストの情報を送信すると、コマンドの送受信が行われます。送受信データのフォーマットについて詳しくは、Appendix Aをご覧ください。コマンド送受信時のデータは、RC4で暗号化したのち、zlib圧縮されています。なお、Gh0stTimesのRC4は、カスタマイズされており、図5のように暗号化したデータを最終的にXOR 0xACする処理が加えられています。

Gh0stTimesのRC4暗号化を行うコードの一部
図5:Gh0stTimesのRC4暗号化を行うコードの一部

次にエンコードされた送受信データをデコードするためのPythonコードを示します。

import zlib

# Load keydata for first packet
with open(args[1], "rb") as fb:
    keydata = fb.read()

# Load encoded packet data
with open(args[2], "rb") as fb:
    data = fb.read()

comp_data = custom_rc4(data[12:], keydata[5:21])
dec_data = zlib.decompress(comp_data)

def custom_rc4(data, keydata):
    key = []
    key_1 = [0x98, 0x19, 0x3C, 0x56, 0xD9, 0xBB, 0xC7, 0x86, 0xFF, 0x3E]
    key_2 = [0] * 16
    key_3 = [0xAC, 0xBB, 0x30, 0x5E, 0xCC, 0xDD, 0x19, 0x23, 0xFC, 0xBD] 
    keybox = [7, 0, 2, 3, 9, 10, 4, 13, 14, 8, 1, 11, 5, 6, 12, 15]

    i = 0
    for i in range(16):
        key_2[i] = keydata[keybox[i]]

    key = key_1 + key_2 + key_3
    x = 0
    box = list(range(256))
    for i in range(256):
        x = (x + box[i] + key[i % len(key)]) % 256
        box[i], box[x] = box[x], box[i]

    x = 0
    y = 0
    out = []
    for char in data:
        x = (x + 1) % 256
        y = (y + box[x]) % 256
        box[x], box[y] = box[y], box[x]
        out.append((char ^ box[(box[x] + box[y]) % 256] ^ 0xAC).to_bytes(1, byteorder='little'))

    return b''.join(out)

命令によって実行されるコマンド

Gh0stTimesは、大きく5つのコマンド群が実装されています。次が実装されているコマンドグループ名です。

  • FileManager(コマンド番号0x1):ファイル操作関連のコマンド
  • ShellManager(コマンド番号0x28):リモートシェル実行
  • PortmapManager(コマンド番号0x32):C2サーバーリダイレクト機能
  • UltraPortmapManager(コマンド番号0x3F):プロキシ機能実行
  • 名前なし(コマンド番号0):通信終了

コマンド一覧
図6:コマンド一覧

ShellManagerおよびFileManagerは、Gh0st RATの既存機能がそのまま利用されています。なお、FileManagerには感染ホストのファイルを操作するための複数の機能があります(詳しくは、Appendix Bをご覧ください)。 PortmapManagerおよびUltraPortmapManagerは、Gh0stTimes固有の機能であり、本マルウェアは通信を中継する機能が強化されていることがわかります。

ダミーコード

攻撃グループBlackTechが使用するマルウェアには、コードの分析を困難にすることを目的にすると思われるダミーコードが含まれていることがあります。Gh0stTimesにも、図7のように、ダミーコードが多数含まれていますが、分析の難易度を上げるほどのものではありません。

Gh0stTimesに含まれるダミーコードの例
図7:Gh0stTimesに含まれるダミーコードの例

C2サーバーのコントロールパネル

調査の過程で、Gh0stTimesのコントロールパネルの存在を確認しました。図8は、コントロールパネル起動時のGUIです。確認したコントロールパネルは「Times v1.2」という名前が付けられていました。

Gh0stTimesのコントロールパネル
図8:Gh0stTimesのコントロールパネル

図9は、コントロールパネルから実行できるコマンドの一覧です。

Gh0stTimesのコントロールパネルから実行可能なコマンド一覧
図9:Gh0stTimesのコントロールパネルから実行可能なコマンド一覧

おわりに

攻撃グループBlackTechは、引き続き活動を続けており、今後も注意が必要です。今回解説した検体の通信先に関しては、Appendix Cに記載していますので、アクセスしている端末がないかご確認ください。
なお、今回紹介したマルウェアが発見されたサーバー上では、その他のマルウェア(ダウンローダー、バックドア、ELF Bifrose)や、攻撃ツールを確認しています。次にサーバー上で保存されている攻撃ツールを列挙します。これらのツールは、攻撃グループBlackTechによって利用されている可能性があることにご注意ください。

謝辞

本調査に協力いただいた@r3dbU7z氏に感謝申し上げます。

インシデントレスポンスグループ 朝長 秀誠

Appendix A:送受信データの内容

表 A-1:送信データのフォーマット
オフセット 長さ 内容
0x00 4 ID
0x04 4 データ長 xor 0x3A4BFDCC
0x08 4 0x0C以降の圧縮前のデータ長 xor 0x7C2E56D2
0x0C - 暗号化されたデータ(zlib + RC4)
表 A-2:受信データのフォーマット
オフセット 長さ 内容
0x00 4 ID
0x04 4 データ長 xor 0xC3A2B5D2
0x08 4 0x0C以降の圧縮前のデータ長 xor 0x68FC2AD3
0x0C - 暗号化されたデータ(zlib + RC4)

Appendix B:コマンド

表 B:FileManagerコマンドの一覧
内容
2 SendFilesList
3 UploadToRemote
4 CreateLocalRecvFile
5 WriteLocalRecvFile
7 SendFileData
8 StopTransfer
9 DeleteFile
10 DeleteDirectory
11 GetFileData
12 CreateFolder
13 MoveFile
14 OpenFile(SW_SHOW)
15 OpenFile(SW_HIDE)

Appendix C:通信先

  • tftpupdate.ftpserver.biz
  • 108.61.163.36
  • update.centosupdates.com
  • 107.191.61.40
  • osscach2023.hicloud.tw
  • 103.85.24.122
  • 106.186.121.154

Appendix D:マルウェアのハッシュ値

  • 01581f0b1818db4f2cdd9542fd8d663896dc043efb6a80a92aadfac59ddb7684
  • 18a696b09d0b7e41ad8ab6a05b84a3022f427382290ce58f079dec7b07e86165
  • 15b8dddbfa37317ccdfbc340764cd0f43b1fb8915b1817b5666c4816ccb98e7c
  • 849ec6055f0c18eff76170912d8500d3da7be1435a9117d67f2134138c7e70c3
  • f19ab3fcbc555a059d953196b6d1b04818a59e2dc5075cf1357cee84c9d6260b
  • 836b873ab9807fbdd8855d960250084c89af0c4a6ecb75991542a7deb60bd119
  • a69a2b2a6f5a68c466880f4c634bad137cb9ae39c2c3e30c0bc44c2f07a01e8a
  • bd02ca03355e0ee423ba0e31384d21b4afbd8973dc888480bd4376310fe6af71
≪ 前へ
トップに戻る
次へ ≫