Linuxルーターを狙ったGo言語で書かれたマルウェアGobRAT

JPCERT/CCでは、2023年2月頃、国内のルーターにマルウェアを感染させる攻撃を確認しています。今回は、JPCERT/CCが確認した攻撃および使用されたマルウェアGobRATの詳細について解説します。

マルウェア実行までの攻撃の流れ

初めに攻撃者はWEBUIが外向けに開いているルーターを狙って脆弱性などを使用し、各種スクリプトを実行した後、最終的にマルウェアGobRATを感染させます。図1は、マルウェアGobRATがルーターに感染するまでの攻撃の流れです。

図1: 攻撃の流れ


Loader Script には主に次の機能があり、各種スクリプトの生成やGobRATのダウンロードを行うなど、ローダーの役割を担っています。なお、バックドア用と推測されるSSH公開鍵は Loader Script 内にハードコードされています。 Loader Script はcrontabを使って Start Script のファイルパスを登録し、永続化を行っているため、GobRATに永続化機能は備わっていません。

  • Firewall機能の無効化
  • マシンのアーキテクチャに合ったGobRATのダウンロード
  • Start Scriptの生成と永続化
  • Daemon Scriptの生成と実行
  • /root/.ssh/authorized_keysへのSSH公開鍵の登録

GobRATの実行を行う Start Script のコードを図2に示します。本スクリプトでは起動開始時の時刻を restart.log というファイルへ書き込む点が特徴的なところです。なお、本スクリプトではGobRATを apached というファイル名で実行しており、正規のプロセスに見せかける工夫を行っています。

図2: Start Script


Daemon Scriptのコードを図3に示します。本スクリプトでは予期せぬプロセスの終了に配慮してか、20秒ごとに Start Script の起動有無を判定し、起動する処理が確認できます。

図3: Daemon Script

GobRATの概要

GobRATは、C2サーバーとTLS通信を行い、各種コマンドを実行するGo言語で書かれたRATです。なお、UPXのversion4系でパックされており、ARM、MIPS、x86、x86-64などのさまざまなアーキテクチャの検体が確認されています。GobRATは起動時に次のチェックを行い、検体内にこれらの情報を保持しています。

  • 自身のIPアドレスとMACアドレス
  • uptimeコマンドによる稼働時間
  • /proc/net/devによるネットワークの通信状況

以降では、GobRATの通信方式、暗号化方式、実行されるコマンドについて紹介します。

通信方式

GobRATは、C2サーバーとTLSを使用し、データの送受信を行います。図4にC2サーバーとの通信内容の例を示します。先頭4バイトはデータのサイズを示し、それ以降はgob[1]のデータとなっています。gobはGo言語のみで使用可能なデータのシリアライズプロトコルです。GobRATはコマンドの受信やコマンドの実行結果の送信などにgobを使用しています。

図4: 通信内容の例


GobRATは検体内にてgobのデータをPACKAGE構造体として次のように定義しています。

type PACKAGE struct {
    Type uint8                  // CommandID
    BotCount uint16             // Parameter
    BotList []string            // Command Parameter
    ParamLength uint16          // Length of Param
    Param map[string]string     // Command Parameter
    Content []uint8             // Command Parameter, Command Execution Result, etc
}

コマンドの種類によって使用されるフィールドは異なり、さまざまな種類のパラメーターの受け渡しができるよう文字列配列、map、バイナリデータをサポートしています。また、PACKAGE構造体のContentにはバイナリデータが格納できますが、stringを要素に持つmapデータをjson.Marshal関数などでエンコードすることでバイナリデータに変換し、Contentへ格納する場合や、定義した構造体を同様の方法でバイナリデータに変換し、Contentへ格納する場合など、コマンドによってさまざまな形で利用されます。

暗号化方式

通信先やLinuxコマンドなどの文字列は暗号化され、検体内に保存されています。図5にGobRATの復号関数を示します。文字列の復号にはAES128のCTRモードが使用されており、鍵とIVは検体内にハードコードされています。なお、確認したすべての検体で同じ鍵(050CFE3706380723433807193E03FE2F)とIV("12345678abcdefgh")が使用されています。また、図6に示すとおり、本復号関数などの攻撃者が開発したと思われるコードは、aaa.com/bbb/me~となるフォルダー構成のものが確認できる点も特徴的です。

図5: 文字列の復号関数


図6: 特徴的なフォルダー構成


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

GobRATにはC2サーバーからの命令によって実行される22のコマンドがあり、次のようなコマンドを確認しています。ルーターをターゲットとしているため、frpcやsocks5、通信先の再設定など、通信に関係する機能が多いことが確認できます。コマンドの詳細についてはAppendix Aをご参照ください。

  • マシン情報の取得
  • リバースシェルの実行
  • 任意のファイルの読み書き
  • 新しい通信先、通信プロトコルの設定
  • socks5の起動
  • /zone/frpcというパスのファイルを実行
  • 別マシンで稼働しているsshd、Telnet、Redis、MySQL、PostgreSQLのサービスへのログイン試行

GobRATの分析ツール

GobRATは通信にgobを使用するため、コマンドを確認するためにC2との通信をエミュレーションしようとすると、Go言語を使ってプログラムを作成する必要があります。今回、GobRATの分析をサポートするC2エミュレーションツールをGitHub上で公開していますので、分析する際は次のWebページからダウンロードしてご活用ください。

JPCERTCC/aa-tools/GobRAT-Analysis - GitHub
https://github.com/JPCERTCC/aa-tools/tree/master/GobRAT-Analysis

おわりに

近年では、Go言語を使用したマルウェアが散見されますが、今回確認されたGobRATはGo言語でのみ扱うことができるgobを通信に使用するマルウェアです。ルーターに感染しているマルウェアは本マルウェアに限らず発見が難しいことからも、引き続き注意が必要です。なお、今回紹介したマルウェアの通信先をAppendix B、スクリプトのハッシュ値をAppendix C、マルウェアのハッシュ値をAppendix Dに記載していますのでご確認ください。

インシデントレスポンスグループ 増渕 維摩

Appendix A: コマンド

表1: GobRATのコマンド一覧
内容
0x0 Update json data held in malware and acquire update results
0x1 Retrieve json data held in malware
0x3 Start reverse shell
0x4 End of reverse shell connection
0x6 Confirmation of reverse shell connection
0x7 Execute shell command for daemon
0x8 Execute shell command
0xD Read/write specified file
0x10,0x11 Read/write specified file
0x16 Obtain various machine information such as df command
0x17 Set new communication channel for TCP
0x18 Execute SOCKS5 proxy with specified port and password
0x19 Execute SOCKS5 proxy on specified port
0x1a New communication channel setting for UDP
0x1b Execute frpc after executing SOCKS5 proxy on port 5555
0x1f Check for the existence of the specified file
0x25 Login attempts for SSH, telenet, redis, mysql, postgres
0x27 Configuration of specified goroutine
0x2a Scan to HTTP/HTTPS service of specified IP
0x2D Dictionary attack to HTTP/HTTPS service of specified IP
0x30 C2 configuration related
0x31 DDoS attacks on SYN, TCP, UDP, HTTP, ICMP

Appendix B: 通信先

  • https://su.vealcat.com
  • http://su.vealcat.com:58888
  • https://ktlvz.dnsfailover.net
  • http://ktlvz.dnsfailover.net:58888
  • su.vealcat.com
  • ktlvz.dnsfailover.net
  • wpksi.mefound.com

Appendix C: スクリプトのハッシュ値

  • 060acb2a5df6560acab9989d6f019fb311d88d5511f3eda0effcbd9fc6bd12bb
  • feaef47defd8b4988e09c8b11967e20211b54e16e6df488780e2490d7c7fa02a
  • 3e44c807a25a56f4068b5b8186eee5002eed6f26d665a8b791c472ad154585d1
  • 60bcd645450e4c846238cf0e7226dc40c84c96eba99f6b2cffcd0ab4a391c8b3

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

  • a8b914df166fd0c94106f004e8ca0ca80a36c6f2623f87a4e9afe7d86b5b2e3a
  • aeed77896de38802b85a19bfcb8f2a1d567538ddc1b045bcdb29cb9e05919b60
  • 6748c22d76b8803e2deb3dad1e1fa7a8d8ff1e968eb340311fd82ea5d7277019
  • e133e05d6941ef1c2e3281f1abb837c3e152fdeaffefde84ffe25338fe02c56d
  • 43dc911a2e396791dc5a0f8996ae77ac527add02118adf66ac5c56291269527e
  • af0292e4de92032ede613dc69373de7f5a182d9cbba1ed49f589ef484ad1ee3e
  • 2c1566a2e03c63b67fbdd80b4a67535e9ed969ea3e3013f0ba503cfa58e287e3
  • 98c05ae70e69e3585fc026e67b356421f0b3d6ab45b45e8cc5eb35f16fef130c
  • 300a92a67940cfafeed1cf1c0af25f4869598ae58e615ecc559434111ab717cd
  • a363dea1efda1991d6c10cc637e3ab7d8e4af4bd2d3938036f03633a2cb20e88
  • 0c280f0b7c16c0d299e306d2c97b0bff3015352d2b3299cf485de189782a4e25
  • f962b594a847f47473488a2b860094da45190738f2825d82afc308b2a250b5fb
  • 4ceb27da700807be6aa3221022ef59ce6e9f1cda52838ae716746c1bbdee7c3d
  • 3e1a03f1dd10c3e050b5f455f37e946c214762ed9516996418d34a246daed521
  • 3bee59d74c24ef33351dc31ba697b99d41c8898685d143cd48bccdff707547c0
  • c71ff7514c8b7c448a8c1982308aaffed94f435a65c9fdc8f0249a13095f665e

参考情報

[1] Gobs of data
https://go.dev/blog/gob

≪ 前へ
トップに戻る
次へ ≫