Linuxルーターを狙ったGo言語で書かれたマルウェアGobRAT
JPCERT/CCでは、2023年2月頃、国内のルーターにマルウェアを感染させる攻撃を確認しています。今回は、JPCERT/CCが確認した攻撃および使用されたマルウェアGobRATの詳細について解説します。
マルウェア実行までの攻撃の流れ
初めに攻撃者はWEBUIが外向けに開いているルーターを狙って脆弱性などを使用し、各種スクリプトを実行した後、最終的にマルウェアGobRATを感染させます。図1は、マルウェアGobRATがルーターに感染するまでの攻撃の流れです。
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 というファイル名で実行しており、正規のプロセスに見せかける工夫を行っています。
Daemon Scriptのコードを図3に示します。本スクリプトでは予期せぬプロセスの終了に配慮してか、20秒ごとに Start 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を使用しています。
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~となるフォルダー構成のものが確認できる点も特徴的です。
命令によって実行されるコマンド
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: コマンド
値 | 内容 |
---|---|
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