- 2023/10/13
- 脅威分析レポート
【脅威分析レポート】大蛇を箱から出す-メッセージングサービスの内部に潜むPythonで書かれたインフォスティーラーの分析
Post by : Cybereason Global SOC Team
Cybereason Security Servicesでは、影響力のある新たな脅威に関する情報をお客様に提供するために、脅威分析レポートを発行しています。本レポートは、そのような脅威を調査した上で、それらの脅威から身を守るための実践的な推奨事項を提供するものです。
今回の脅威分析レポートでは、プログラミング言語Pythonで書かれたインフォスティーラー(「Python Credential Harvester」という呼び方もありますが、本レポートでは以下これを「Pythonインフォスティーラー」と呼びます)について詳しく説明します。Pythonインフォスティーラーとは、GitHubやGitLabを通じて配信されるマルウェアであり、最終的にTelegram Bot APIやその他のよく知られたプラットフォーム経由で認証情報を流出させるものです。
主な調査結果
- 正規サイトの悪用:多くの脅威アクターは、正規の公開リポジトリやメッセージングアプリケーションをコマンド&コントロール(C2)インフラの一部として使用することで、多くのユーザーがこれらのサイトやサービスに寄せている評判や暗黙の信頼を利用しています。GitHubやGitLabのような、正規のWebベースリポジトリの悪用を検知することは困難です。なぜなら、そのようなリポジトリはすべてのユーザーが容易に利用できるからです。このことから、悪意ある目的のために同リポジトリを利用する脅威アクターが増えています。
- 狡猾なウサギ(ヘビ)は巣穴を3つ持つ:脅威アクターは3つの異なるPythonインフォスティーラーの亜種を保持しています。これらのインフォスティーラー間の大きな違いとして、バリアント1とバリアント2が通常のPythonスクリプトであるのに対して、バリアント3はPyInstallerにより作成された実行可能ファイルであることが挙げられます。
- 収集された認証情報は正規のプラットフォーム経由で送信される:疑うことを知らないユーザーから収集された認証情報は、Discord、GitHub、Telegramなどの各種のプラットフォームへと送信されます。Telegram Bot APIやDiscordのような正規のメッセージングアプリケーションを悪用する行為は、そのアクセスのしやすさと利便性から、さまざまな脅威アクターの間で著しく増加しています。
分析
ここでは、Pythonインフォスティーラーの感染ライフサイクルを紹介します。本分析は、次の4つのセクションから構成されています。
- Pythonインフォスティーラーの2段階の分析
- 3種類のPythonインフォスティーラーバリアントの分析
- Pythonインフォスティーラーバリアントの比較分析
- インフォスティーラーのユーザー/開発者に関する可能性のある帰属先
▲Pythonインフォスティーラーの感染チェーン
感染チェーン
X(旧Twitter)やStackOverflowでセキュリティ研究者が指摘しているように、感染は攻撃者からのFacebookメッセンジャーのダイレクトメッセージから始まります。
▲Pythonインフォスティーラーに関するツイート(作成者:@idclickthat)
Facebookのメッセージは被害者を欺くことで、RARファイルやZIPファイルなどのアーカイブファイルをダウンロードさせます。これらのアーカイブされたファイルには2つのダウンローダーが含まれており、最後のダウンローダーが目的に合ったPythonインフォスティーラーのバリアントを導入します。
バリアントの感染チェーンの多くは類似しています。しかし、下記に示す「ステージ1」および「ステージ2」で紹介する感染プロセスは、バリアント1の最新手法に特有のものです。
■ステージ1
アーカイブされたファイルには、感染チェーンを開始する最初のダウンローダーであるBATスクリプトが含まれています。このBATスクリプトは、cURLコマンドを使用してZIPファイルのダウンロードを試みます。そして、そのダウンロードに成功した場合、同ファイルをディレクトリC:\Users\Publicの下にmyFile.zipとして配置します。続いて、このBATスクリプトはPowerShellコマンドであるExpand-Archiveを実行することで、同ZIPファイルからCMDスクリプトvn.cmdを展開し、感染を進めます。
▲ステージ1のプロセスツリー
■ステージ2
CMDスクリプトvn.cmdは、Pythonインフォスティーラーをダウンロードし実行するためのメインのスクリプトです。
▲vn.cmdの内容:Pythonインフォスティーラーのダウンロードと実行
このスクリプトの冒頭には、変数を特定の文字に設定する各種のsetコマンドが含まれています。これは通常、実行時にコードの難読化を解除するためのものですが、このバージョンでは難読化は行われていないように見えます。一方、このダウンローダーvn.cmdの異なるバージョンでは、同スクリプトはこの難読化を利用しています。これは、難読化の使用がバージョンに依存していることを示しています。
▲難読化解除を準備するためのsetコマンド
vn.cmdスクリプトはGoogle Chromeを開き、中国のEコマースサイトであるAlibabaのホームページにアクセスします。そしてGitLabから3つのファイルをダウンロードした後、それらを次のように名前変更します。
- WindowsSecure.bat:スタートアップフォルダにダウンロードされたBATスクリプトです。ユーザーがログインするたびにproject.pyを実行することで、被害者の端末における永続性を維持します。
▲WindowsSecure.batの内容 - Document.zip:バンドルされたPythonパッケージを含んでいるアーカイブファイルです。これにより、被害者の端末に必要なPythonパッケージがインストールされていない場合でも、project.pyを実行できるようになります。
▲展開されたDocument.zip - Project.py:各種のブラウザから認証情報を収集するための難読化されたPythonスクリプトです。
ダウンロードが完了すると、vn.cmdスクリプトは、Document.zipから展開されたPythonモジュールを使ってproject.pyを実行します。
▲Pythonインフォスティーラーのプロセスツリー
Pythonインフォスティーラー
■バリアント1
▲難読化されたPythonスクリプトproject.py
バリアント1は、前節で紹介したPythonスクリプトproject.pyです。このスクリプトにはネスト化された難読化が含まれており、16進数値がさまざまな手法で圧縮されています。難読化解除のフローは次のとおりです。
▲project.pyの難読化解除処理フロー
▲難読化解除されたproject.pyの断片
この難読化解除されたPythonスクリプトは、まずipinfo[.]io(IPアドレスを関連する地理的位置と関連付けるIPデータプロバイダ)へのHTTP(S)リクエストを作成することで、被害者の端末が置かれている場所を特定します。ipinfo[.]ioの応答から、main()関数は、端末のIPアドレスだけでなく国名も取得します。この2つの情報により、脅威アクターは被害者の端末が置かれている場所をよりよく理解することができ、より効果的なソーシャルエンジニアリング戦術の開発に必要なコンテキストを提供できるようになります。さらに、よく練られたソーシャルエンジニアリング手法を通じて、脅威アクターは、被害者の知人のような潜在的な標的をさらに悪用できます。
同スクリプトが被害者の端末が置かれている場所を取得すると、スクリプトの実行フローはmain()関数へと移り、認証情報の収集を開始します。main()関数はまず、被害者の端末内に存在するブラウザの関連ディレクトリパスを特定します。同スクリプトは、具体的には7つの異なるブラウザを見つけようとします。このスクリプトが標的とするブラウザは次の通りです。
- Brave
- Coc Coc Browser
- Chromium
- Google Chrome Browser
- Microsoft Edge
- Mozilla Firefox
- Opera Web Browser
続いてmain()関数は、ブラウザから関連情報をディスクにダンプした後、その情報を3つの異なるファイルへとコピーします。
main()関数に含まれている情報のダンプ先となるファイルの場所
クッキーと認証情報以外にも、project.pyは、Facebookに特有のクッキー情報であるcookiefb.txtをディスクにダンプします。この振る舞いは、脅威アクターが被害者のFacebookアカウントを乗っ取り、感染を拡大する可能性があることを意味しています。
同スクリプトは、ダンプされた情報を<国名>+
main()関数は、Telegram Bot APIのsendDocumentを介してアーカイブされたファイルを送信しようと試みます。main()関数は2つのsendDocument API呼び出しを含んでいるように見えますが、どちらも異なるボットトークンと異なるチャットIDを持っており、これは情報が2つの異なるチャットルームへと送信されていることを示しています。また、このPOSTリクエストの実行方法も異なっています。
- 難読化:Telegram Bot API リクエストは、base64 難読化コードである関数 Compressed() により呼び出されます。
▲難読化されたTelegram Bot API呼び出し - プレーンテキスト:Telegram Bot APIリクエストは、難読化なしでmain()関数内で呼び出されます。
▲プレーンテキストのTelegram Bot API呼び出し上記のことから分かるように、Telegram Bot APIは認証情報の収集だけを目的に使用されます。これは、完全なC2通信のためにAPIを利用する他の脅威アクターとは異なっています。
■バリアント2
▲Pythonインフォスティーラーのバリアント2の実行フロー
別のPythonスクリプトのバリアントも確認されています。このバリアントも、被害者のブラウザに保存されている情報を収集するという同じ目標を達成しようとするものです。バリアント2では、Pythonインフォスティーラーをダウンロードするまでの感染フローはバリアント1と類似しており、最終的なBATスクリプトのペイロードにより次の3つのファイルがダウンロードされます。
- Lib-jae.py:難読化されたPythonインフォスティーラースクリプト
- Python39.zip:Pythonモジュールパッケージ
- WindowsSecure.bat:永続性用のBATスクリプト(スタートアップフォルダに配置される)
ただし、バリアント2のPythonスクリプトには、バリアント1と比較して、スクリプトの構造に関して大きな違いがあります。
■スクリプト内容の違い
バリアント1とは異なり、バリアント2のPythonスクリプトの内容はオブジェクト指向プログラミング(OOP)ベースのコードとなっています。バリアント2は、関連するブラウザに含まれている認証情報の収集を準備し実施するために、RitCuckiクラスを利用しています。
▲バリアント2のRitCuckiクラス
このコードの内容は、インスタンスメソッドの多くや変数名が直感的でないため、バリアント1と比較すると、意図的にぼかされているように見えます。これは、脅威アクターにより利用されているコード難読化手法である可能性が高いと思われます。
▲RitCuckiクラスのインスタンスメソッドcroscritの断片
■標的となるブラウザ
バリアント1のPythonスクリプトとは異なり、バリアント2は、次の3種類のブラウザだけを見つけようとします。
- Coc Coc Browser
- Google Chrome
- Microsoft Edge
■段階的なペイロード
バリアント2の初期ペイロードは段階的であり、実行はC2インフラストラクチャであるGitHubまたはGitLabリポジトリからの最終的なbase64ペイロードのフェッチへと進みます。フェッチに成功すると、実行は最終的なbase64ペイロードをデコードした後、RitCuckiクラスの実装へと進みます。
▲段階的なPythonペイロードの断片
また、PythonクラスRitCuckiは、ファイルscriptcallに格納されている文字列のセットにも依存しています。同スクリプトは、最終的なPythonペイロードと同じGitHubリポジトリからscriptcallをフェッチします。
▲呼び出される文字列のセット
この難読化ステップの追加により、ファイルが1つでも欠落していると、解析に支障をきたす可能性があります。最終段階のペイロードであっても、一連の文字列を含むファイルがなければ、アナリストがスクリプトの意図を判断することは難しくなります。
■バリアント3
バリアント1およびバリアント2と同様に、バリアント3は、Pythonインフォスティーラーを展開するために複数のダウンローダーを利用します。しかし、バリアント1およびバリアント2とは異なり、バリアント3はPython実行ファイルです。
バリアント3はPyInstallerで作成されているように見えます。PyInstallerで作成された実行ファイルのサイズは平均的な実行ファイルより大きくなりますが、バリアント3のサイズは13MBより大きくなっています。
▲PyInstallerで作成されたPython実行ファイル
デコンパイルされたメインスクリプトは、バリアント2の段階的なペイロードと同じであり、RitCuckiクラスを含むPythonスクリプトをダウンロードしようと試みます。これは、バリアント3がバリアント2の実行可能バージョンであるという可能性を示唆しています。
これは、RitCuckiクラスのcritduplicatetzzインスタンスメソッド内のコードからも明らかです。このインスタンスメソッドには、このPythonインフォスティーラーの実行可能バージョンの環境内で永続性を確立するための、コメントアウトされたコードが含まれています。
▲コメントアウトされたcritduplicatetzz インスタンスメソッド(難読化解除後)
バリアント2の開発者は、脅威アクターがスクリプト形式か実行ファイル形式かを選択できるようにすることを意図していたと思われます。
比較分析
■インフォスティーラーバリアントの比較
3種類のPythonインフォスティーラーの最終目標は、いずれも標的となるブラウザに保存されている情報を取得することです。しかし、これら3つのバリアントには、下記の表に示すように、いくつかの重要な違いがあります。
▲インフォスティーラーバリアントの比較表
公開されている情報によれば、バリアント2が最初に発見されたのは2023年2月であるのに対して、バリアント1が最初に発見されたのは2023年6月です。このことから、最初のバージョンは実際にはバリアント2であり、バリアント1はPythonインフォスティーラーのバリアントの最新バージョンであった可能性があります。これが、バリアント1で標的となるブラウザの数が増加した理由だと思われます。
感染チェーンの違い
Pythonインフォスティーラーの導入方法にはさまざまなアプローチがあります。注目すべきプロセスの違いを、下記に紹介します。
- GitHubやGitLab以外の選択肢:Pythonインフォスティーラーが使用する主要なC2ロケーションの選択肢は、一般的でない非ファイル共有ドメインです。ただし、脅威アクターはGoogle Workspaceも悪用しています。
- その他のダウンローダーのファイル形式:Pythonインフォスティーラーのダウンローダーの多くはBATやCMDスクリプトですが、実行ファイル、悪意あるMicrosoftドキュメント、悪意あるMSIファイル、VBScriptなど、さまざまなバリエーションもあります。
- Telegram Bot API以外の選択肢:最近のPythonインフォスティーラー(特にバリアント1)は、Telegram Bot APIを悪用していますが、すべてのインフォスティーラーのバリアントが窃取した認証情報をTelegramに送信しているわけではありません。インフォスティーラーが窃取した認証情報をDiscordに送信していることも確認されているほか、GitLabやGitHubに保存されているホストファイルに記載されているその他のC2サーバーに送信していることも確認されています。
- 証拠除去スクリプト: 変種バリアント1では、Pythonインフォスティーラー関連スクリプトの削除がPythonスクリプト自体に組み込まれています。一方、異なるバージョンでは、ファイル削除専用の別のPythonスクリプトであるrmv.pyをダウンロードしています。バリアント2とバリアント3は、現時点では証拠の除去を行っていないようです。
- ダウンローダーの数:前節で示したように、より新しいバージョンは、実際のPythonインフォスティーラーのペイロードをダウンロードする前に、2つのダウンローダーBATスクリプトを使用しています。しかし、バージョンによっては、ステージ2のみを使用して、Pythonインフォスティーラーを直ちにダウンロードしようとするものもあります。
■可能性のある帰属先
Pythonインフォスティーラーの開発者またはアフィリエイトがベトナム語の話者であることを示唆するいくつかの指標があります。
■コメント
分析で観察されたBATスクリプトの中には、ベトナム語が含まれているものがあります。たとえば、“sau khi gi”(英訳すれば”“After what”)というコメントがありますが、これはベトナム語のスラング“sau khi ghi”(英訳すれば“After written”)である可能性があります。このコメントは「後に書かれている」ので、その方が理にかなっています。
▲BATスクリプト内のコメントに“sau khi gi”という文字列がある
さらに、インジケーターを削除するPythonスクリプトであるrmv.pyには、「消去」や「削除」を意味する「Xoa」というコメントも含まれているようです。
▲Pythonスクリプトrmv.pyの内容
■命名規則
脅威アクターは、ベトナム語との密接な結びつきを示唆するような命名規則を使用しています。観測されたベトナム語を使った命名規則には、次のものがあります。
- 関数名:このスクリプトは、ベトナム語を話す脅威アクターにより作成された可能性があります。スクリプト内では、関数demso()のようなフレーズが確認されています。これはカウンタとして機能するものです、demsoにはベトナム語で「数を数える」という意味があります。
▲Pythonスクリプトproject.py内のdemso()関数 - アカウントエイリアス:GitHubやGitLabのリポジトリ名やアカウント名の中には、ベトナム語の命名規則を使っているものがあります。たとえば、GitLabのアカウントエイリアスの1つとして「Khoi Nguyen」がありますが、これはベトナムでよく見られる名前であり、コミュニティ内でよく使われるエイリアスのようです。
▲GitLabアカウントエイリアス「Khoi Nguyen」 - ファイル名:Pythonインフォスティーラーのファイル名には、ベトナム語の一般的な名前を使用しているものがあります。例としては、hoang.exeやhoangtuan.exeなどが挙げられます。
■標的とするブラウザ
すべてのバリアントはCoc Coc Browserを標的としています。Coc Coc Browserはベトナム人コミュニティで広く使われている有名なベトナム製のブラウザです。このようなブラウザの選択も、ある時点でベトナム人コミュニティを標的にする需要があったことを示しています。特にバリアント2とバリアント3は、初期のバリアントであると推測されており、Coc Coc Browserを含む3つのブラウザだけを標的としています。
Cybereason MDRによる推奨事項
Cybereason Defense Platformを使うと、Pythonインフォスティーラーに関連する攻撃で観測されるポストエクスプロイト活動を、検知した上で実行防止できます。サイバーリーズンでは、次の措置を実施することを推奨しています。
- アプリケーションコントロールを有効にして、悪意あるファイルの実行をブロックする。
- ダウンロードされたペイロードの検知モードでファイルレス保護機能を有効にする。
- Cybereason 振る舞いベースのファイル実行防止(Behavioral Execution Prevention)において実行防止モードで亜種実行防止機能(VPP)を有効にする。
- 信頼できないソースからファイルをダウンロードするリスク、特に企業ネットワーク内にいながらソーシャルメディアプラットフォーム経由でファイルをダウンロードするリスクについて、ユーザー教育を確実に実施する。
著者について
Kotaro Ogino(主席セキュリティアナリスト、Cybereason Global SOC)
Cybereason SOC チームの主席セキュリティアナリスト。脅威ハンティング、SOAR(Security Orchestration, Automation, and Response)システムの管理、XDR(Extended Detection and Response)の管理に従事。情報科学の理学士号取得。
サイバーリーズンが検知したサイバー攻撃の最新情報 〜2023年1月から4月に多く検知されたMalOpは?〜
サイバーリーズンのグローバルSOC(GSOC)は、主に米国、APAC、EMEAの3拠点にSOCを構え、グローバル規模で世界中の脅威を検知・分析することを目的とした組織であり、24時間×365日体制で世界中のサイバーリーズン製品から上がってくるMalOp※(Malicious Operations)の検知・分析に当たっています。
本資料では、2023年1月から4月にかけて世界中で検知されたMalOpの内容を紹介するとともに、サイバーリーズン合同会社 CISO(Chief Information Security Officer) 本城 信輔による、2023年1月から4月におけるサイバー攻撃の傾向分析と考察をご紹介します。
ご自身が所属する組織におけるサイバーセキュリティ対策の検討にお役立てください。
https://www.cybereason.co.jp/product-documents/survey-report/10894/