攻撃グループLazarusが使用するマルウェアBLINDINGCAN

前回のJPCERT/CC Eyesでは、攻撃グループLazarus(Hidden Cobraとも言われる)がネットワークに侵入後に使用するマルウェアを紹介しました。他にも、この攻撃グループは複数のマルウェアを使用することが知られており、最近ではCISAでも別のマルウェアBLINDINGCAN[1]についての情報を公開しています。
今回は、JPCERT/CCにて確認したBLINDINGCANの詳細について紹介します。

BLINDINGCANの概要

BLINDINGCANは、ローダー(図1のLoader)がDLLファイル(図1のBLINDINGCAN)をロードすることで動作します。図1は、BLINDINGCANが動作するまでの流れを示しています。JPCERT/CC では、エンコードされたBLINDINGCAN がLoader によってデコードされた後、実行される場合もあることを確認しています。

BLINDINGCANの挙動
図1: BLINDINGCANの挙動

BLINDINGCANは、前回紹介したマルウェアと機能や通信のエンコード方法など、類似点が複数あります。以降では、BLINDINGCANの設定情報や通信方式などについて記載します。

設定情報

BLINDINGCANの設定情報(サイズ: 0xA84)の保存先には、以下の3パターンあることを確認しています。

  • マルウェア内部に含まれている
  • レジストリエントリに保存されている
  • ファイルとして保存されている

ファイルとして保存されている場合は、BLINDINGCANと同じフォルダに保存されています。また、レジストリエントリに保存されている場合は、以下に保存されている事例を確認しています。

Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
Value: "SM_Dev16[数字列]"

設定情報の暗号化にはXORエンコード、AESまたはRC4が使用されており、キーには固定値の他に、感染環境の固有の情報から作成されるパターンが存在します。
以下はJPCERT/CCで確認している暗号化キーのパターンです。

  • [ファイル名][Export関数名][サービス名]
  • [CPUID][コンピュータ名][プロセッサー名][物理メモリーサイズ]

図2は、デコードした設定情報の例です。通信先以外にもプロキシ情報などが含まれています。(設定情報について、詳しくはAppendix Aをご覧ください。)

設定情報の例
図2: 設定情報の例

文字列の難読化

BLINDINGCANは、一部の文字列を難読化しています。難読化にはRC4を使用しています。図3は、文字列難読化コードの例です。RC4キーは検体内にハードコードされています。

文字列の難読化
図3: 文字列の難読化

C2サーバーとの通信

以下は、BLINDINGCANが初めに送信するHTTP POSTリクエストのデータ例です。

POST /[PATH] HTTP/1.1
Connection: Keep-Alive
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) Chrome/28.0.1500.95 Safari/537.36
Host: [Server]
Content-Length: [Length]

id=d3Ztd3lod2t0Tqf42ux9uv3FGH+Y3oAc2w==&bbs=HA==&tbl=hzE4dlKcRq3gokgAGeMQug== &bbs_form=4GQAAA==

この送信データのフォーマットは以下の通りです。(RC4キー以外の各値は、RC4およびBase64エンコードされています。)なお、初めに送信するHTTP POSTリクエストのparam2のデータは、文字列"T1B7D95256A2001E"をエンコードしたものという特徴があります。

id=[RC4キー][param1:param2:param3]&[param1]=[ランダムな値(1000以上10000以下)]&[param2]=["T1B7D95256A2001E"]&[param3]=[ランダムなバイナリデータ]

また、POSTデータのパラメータ(param1param2param3)は以下からランダムに選択されます。

boardid,bbsNo,strBoardID,userid,bbs,filename,code,pid,seqNo,ReportID,v,PageNumber,num,view,read,action,page,mode,idx,cateId,bbsId,pType,pcode,index,tbl,idx_num,act,bbs_id,bbs_form,bid,bbscate,menu,tcode,b_code,bname,tb,borad01,borad02,borad03,mid,newsid,table,Board_seq,bc_idx,seq,ArticleID,B_Notice,nowPage,webid,boardDiv,sub_idxa

ここで使用されるRC4は通常のものとは異なり、キーストリームをC00h回分シフトさせる処理が入っています。以下はPythonで記載した、BLINDINGCANのRC4の処理です。なお、param3では通常のRC4が使用されており、このカスタムRC4は使用されていません。

def custom_rc4(data, key):
    x = 0
    box = list(range(256))
    for i in range(256):
        x = (x + int(box[i]) + int(key[i % len(key)])) % 256
        box[i], box[x] = box[x], box[i]

    x = 0
    for i in range(0xC00):
        i = i + 1
        x = (x + int(box[i % 256])) % 256
        wow_x = x
        box[i % 256], box[x] = box[x], box[i % 256]
        wow_y = i % 256

    x = wow_y
    y = wow_x
    out = []
    for char in data:
        x = (x + 1) % 256
        y = (y + box[x]) % 256
        box[x], box[y] = box[y], box[x]
        out.append(chr(char ^ box[(box[x] + box[y]) % 256]))

    return ''.join(out)

図4は、BLINDINGCANがC2との通信を開始して、命令を受信するまでの通信フローです。

BLINDINGCANの通信フロー
図4: BLINDINGCANの通信フロー

最初のリクエストのレスポンスとして、param3のデータのBase64エンコードされた値(図4の[ランダムナなバイナリデータ])がサーバーから受信できた場合は、次のリクエストを送信します。
次に送信するデータは、param2にはデータなし、param3にはサーバーへ命令をリクエストするコマンド(図4のコマンドリクエスト(0x2040))が含まれています(param3のフォーマットについて詳しくは、Appendix Bをご覧ください)。なお、param3のデータは、XORエンコードおよびRC4暗号化された後にBase64エンコードされています。
その後、BLINDINGCANはサーバーからコマンドを受信します(受信データのフォーマットは、param3と同じです。詳しくは、Appendix B をご覧ください)。なお、受信データもXORエンコードおよびRC4暗号化された後にBase64エンコードされていますが、文字列の”+”がスペースに変換されています。

コマンド

BLINDINGCANは、多機能で以下の機能があることを確認しています。(詳しくは、Appendix Cをご覧ください。)

  • ファイル関連(ファイルの一覧取得、削除、移動、作成時刻変更、コピー)
  • プロセス関連(プロセス一覧取得、実行、停止)
  • ファイルアップロード、ダウンロード
  • ディスク情報の取得
  • サービス一覧の取得
  • 任意のシェルコマンド実行

おわりに

今回は、前回に引き続き攻撃グループLazarusが使用するマルウェアについて紹介しましたが、これ以外にも様々なマルウェアが確認されています。新たなマルウェアが確認された際は、レポートしたいと思います。
なお、今回解説した検体の通信先に関しては、Appendix Dに記載していますので、アクセスしている端末がないかご確認ください。

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

参考情報

[1] CISA: Malware Analysis Report (AR20-232A)
https://us-cert.cisa.gov/ncas/analysis-reports/ar20-232a

Appendix A: 設定情報

表 A-1: 設定情報の一覧
オフセット 説明 備考
0x000 通信先数 最大5つ
0x004 通信先1
0x108 通信先2
0x20C 通信先3
0x310 通信先4
0x414 通信先5
0x518 プロキシ設定の有無
0x51C プロキシIPアドレス
0x520 プロキシポート番号
0x522 C2リプライフラグ
0x526 ドライブ情報フラグ
0x52A セッション情報フラグ
0x52E 設定情報保存
0x532 通信間隔
0x534 起動時間
0x53C seed 送信するランダムデータを作成する際に使用
0x59C ファイル名 コマンド"0x2039"で取得されるファイル名
0x5FC 不明
0x65C 不明
0x660 未使用
0x674 実行するファイル名 "c:¥windows¥system32¥cmd.exe"が含まれている
0x87C Tempフォルダ コマンド実行結果を保存するフォルダ

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

表 B: param3のデータフォーマットおよび受信データフォーマット
オフセット 長さ 内容
0x00 2 未使用
0x02 2 コマンド
0x04 4 未使用
0x08 4 パラメータの長さ
0x0C - パラメータ(Base64 + RC4)

Appendix C: コマンド

表 C: コマンド一覧
内容
0x2009 システム情報送信
0x2010 ドライブ情報取得
0x2011 ディレクトリ一覧取得
0x2012 コマンド実行(標準出力)
0x2013 ファイルアップロード(zlib圧縮)
0x2014 ファイルダウンロード
0x2015 任意のプロセス実行
0x2016 任意のプロセス実行(ユーザ指定)
0x2019 プロセス一覧取得
0x2020 プロセス停止
0x2021 ファイル削除
0x2022 疎通確認
0x2023 カレントディレクトリ変更
0x2027 ファイル作成時間変更
0x2028 C2サーバーとの通信間隔変更
0x2029 C2サーバーとのセッション終了
0x2030 アンインストール
0x2031 設定情報取得
0x2032 設定情報上書き
0x2033 ディレクトリ情報取得
0x2034 ドライブ空き容量取得
0x2037 -
0x2038 Sleep
0x2039 ファイル名取得
0x2046 ファイル書き込み
0x2048 ファイルコピー
0x2049 ファイル移動
0x2050 ファイル削除

Appendix D: 通信先

  • https://www.automercado.co.cr/empleo/css/main.jsp
  • https://www.curiofirenze.com/include/inc-site.asp
  • https://www.ne-ba.org/files/news/thumbs/thumbs.asp
  • https://www.sanlorenzoyacht.com/newsl/include/inc-map.asp

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

  • 8db272ea1100996a8a0ed0da304610964dc8ca576aa114391d1be9d4c5dab02e
  • 58027c80c6502327863ddca28c31d352e5707f5903340b9e6ccc0997fcb9631d
≪ 前へ
トップに戻る
次へ ≫