中東の重要国家インフラへの侵入に使われたWebシェルスクリプトを詳細分析

文●フォーティネットジャパン 編集●ASCII

提供: フォーティネットジャパン

  • この記事をはてなブックマークに追加
  • 本文印刷

本記事はフォーティネットジャパンが提供する「FORTINETブログ」に掲載された「難読化されたWebシェルスクリプトに関する詳細分析」を再編集したものです。

影響を受けるプラットフォーム:Microsoft Windows
影響を受ける当事者     :Windowsユーザー
影響            :侵害されたコンピュータを完全にリモート制御
深刻度           :高

背景

 本分析は、FortiGuardインシデントレスポンスチーム(FGIR)が実施した、中東の重要国家インフラ(CNI)を標的とした長期的なサイバー侵入を調査した「中東の重要国家インフラへの侵入」に関する続報です(完全なレポートはこちら)。

 本レポートでは、侵害されたシステムに対して、脅威アクターが多数のWebシェルサーバーをインストールしていたことが明らかになりました。続報では、これらのWebシェルサーバーのひとつで、侵害されたシステムにMicrosoft IIS(Internet Information Services)サーバーを展開するUpdateChecker.aspxという名前のWebシェルサーバーについて詳細な分析を実施しました。

 このブログでは、Webシェルを保護するために使用される難読化の手法、制御コマンドの構造、JSON形式のフォーマット、および攻撃者がシステムを制御する際のコマンドトラフィックの概要について掘り下げます。また、侵害されたシステムを制御するためのWebシェルの機能について詳しく説明します。

難読化されたASPX Webページファイル

 このWebシェルは、高度に難読化された大量のC#コードを含むASPX Webページファイルである「UpdateChecker.aspx」を使用して制御されます。メソッド名、変数名、クラス名などの読み取り可能な要素がランダムに生成された後、Unicodeでエンコードされます。また、文字列や数値を含むすべての定数値も、暗号化またはエンコードされます。

図1:難読化されたC#コードを含むASPXファイルの内容を表示

 <%@ Page Language="C#" %>タグと<script runat="server">タグが示すように、このASPXファイルはC#言語で記述されており、Windows IIS(Internet Information Services)サーバーなどのサーバーサイドでのみ実行されます。

 Webシェルの分析をより効率的に行うためには難読化されたC#コードの解除に成功しました(図2を参照)。ランダムに生成された一部の名前は、より意味のある名前に置き換えられました。

図2:C#コードの難読化解除

 図3のPage_Load()関数は、C#スクリプトの入力関数として機能し、攻撃者がリモートからコマンドをWebページに送信する際に呼び出されます。

図3:入力関数の表示 - Page_Load()

トラフィック分析

Webシェルのコードを分析すると、制御コマンドは、HTTP POSTリクエストの本文で送信される必要があることが明らかになりました。
以下のC#コードスニペットにより、このWebシェルは、リクエストメソッドがHTTP POSTでない場合、またはリクエストのコンテンツタイプがapplication/octet-streamでない場合、エラーページを返すことがわかりました。

try {
    if (httpRequest.HttpMethod != http_post || httpRequest.ContentType != _str_application_octet_stream) {   
       response_error_page(httpRequest, httpResponse);
        return;
    }

図4:攻撃者とWebシェル間のHTTP POSTトラフィック

 本分析によると、最初に本文が暗号化され、次にBase64でエンコードされています。シミュレートしたトラフィックをWiresharkでキャプチャすると、コマンドは、HTTP POSTの本文内で送信されていることがわかります(図4を参照)。その後、送信者は、レスポンスパケットの本文で、結果を受け取ります。

 Base64でエンコードされた本文データをデコードすると、暗号化されたバイナリデータが得られました(図5を参照)。

図5:Base64でエンコードされたPostの本文データ

 最初の16バイトは、Page_Load()メソッドで定義されているハードコードされたキーを使用して暗号化されています。このハードコードされたキーを使用すると暗号化を解除することが可能で、15バイトのキーと最後に1バイトのパディングを取得できます。復号化されたこの15バイトのキーを使用すると、後に続くコマンドデータを復号化できます。暗号化される前は、コマンドデータとコマンドの結果はどちらもJSON形式で記述されています。

図6:Webシェルのコマンドデータを解析したデバッガーのビュー

 図6はプレーンテキストのコマンドデータのインスタンスです(Baseモジュール、GetBasicServerApplicationInfoリクエスト)。JSONのキーと値が解析され、特別なクラスに格納されます(str_objに名前を変更)。

 制御コマンドのJSONでは、次の各キーおよび対応する値を必ず含める必要があります(ProtocolVersion(値は1.0)、ModuleName、RequestName、およびその他のオプションのパラメータ)。要求されるキーが欠落している場合、Webシェルはエラーメッセージを付けて返します。

モジュールおよび機能

 Webシェルの機能は、3つのモジュール(Base、CommandShell、およびFileManager)に分けられます。各モジュールには、複数の機能(RequestNameキーで指定)、およびいくつかのオプションパラメータが用意されています。

 以下のテーブルはすべての機能の一覧を示しています。

ModuleName RequestName パラメータ
Base GetBasicServerInfo
Base GetBasicServerApplicationInfo
CommandShell ExecuteCommand WorkingDirectory、Command
FileManager GetDrives
FileManager GetDriveInformation DriveName
FileManager GetWebRoot
FileManager GetFileSystemsList Path
FileManager CreateDirectory Path、DirectoryName
FileManager CopyDirectory SourcePath、DestinationPath、 DirectoryName、OverwriteAllow
FileManager SetDirectoryAttributes Path、Attributes
FileManager CreateFile Path、FileName
FileManager CopyFile SourcePath、DestinationPath、 OverwriteAllow、FileName
FileManager MoveFile SourcePath、DestinationPath、 OverwriteAllow、FileName
FileManager DeleteFile Path
FileManager GetFileContent Path
FileManager SetFileContent Path、FileContent、FileName
FileManager GetFileInformation Path
FileManager SetFileTime Path、CreationTimeUtc、 LastModifiedTimeUtc、 LastAccessTimeUtc
FileManager SetFileAttributes Path、Attributes
FileManager SearchByName Path, Keyword, MatchCase, MatchWord
FileManager SearchByContent Path、FileTypes、Keyword、 MatchCase
FileManager ReplaceFileContent Path、FileTypes、FindWhat、 ReplaceWith、MatchCase、 UseRegularExpression
FileManager GetPathSeparator

 攻撃者は、GetBasicServerInfoリクエストを使用して、Baseモジュールを通じて、侵害されたサーバーの基本情報を収集できます。結果パケットには、サーバーソフトウェア、サーバー名、サーバーIPアドレス、サーバーポート、OS名、マシン名、ユーザー名、ランタイム名、およびランタイムバージョンが含まれます。

 攻撃者は、CommandShellモジュールとExecuteCommandリクエストを介して、IISの特権を使用してWindowsコマンドを実行できます。

 FileManagerモジュールには、ファイルやディレクトリを管理するための包括的で幅広い機能が用意されており、これには、ファイルやディレクトリの作成および削除、指定したファイルやディレクトリの移動およびコピー、内容や名前でのファイル検索などが含まれます。

デモ

 当チームはテストを行うために、攻撃者によるWebシェルへのコマンド送信をシミュレートするPythonスクリプトを作成しました。このセクションでは、いくつかの制御コマンド例のデモを実施します。スクリプトの出力には、Webシェルに送信されたコマンドデータ、およびコマンドのレスポンス結果データの両方が表示されます。以下は、これらの機能の説明のために、プレーンテキストのコマンドと結果のみ表示しています。

 1. BaseモジュールとGetBasicServerApplicationInfoリクエストを使用して、サーバー情報を取得します。
 

 2. CommandShellモジュールとExecuteCommandリクエストを使用して、Windowsコマンドのwhoamiを実行します。

 3. FileManagerモジュールを使用して、ファイル操作を実施します。

・CreateDirectoryリクエストを使用して、testという名前のフォルダが「C:\」の下に作成されました。
・CreateFileリクエストを使用して、test.txtファイルが新しいフォルダ内に作成されました。
・SetFileContentリクエストを使用して、FileContentキーの値で送信された「Hi Fortinet!」(Base64でエンコード)が、このファイルに書き込まれました。
・次に、GetFileContentリクエストを使用して、test.txtファイルの内容を取得し、すべてが正しく作成されていることを検証します。
・最後に、作成されたファイルとフォルダを、対応するDeleteFileリクエストとDeleteDirectoryリクエストを使用して削除しました。

図7:リモートで作成されたテストフォルダとファイル

 図7は、作成されたフォルダ(C:\test)、およびファイル内容を含むファイル(test.txt)に関する詳細情報を示しています。ファイルの所有者はDefaultAppPoolで、これはIISサービスで使用されるIDです。

結論

 この追加分析により、UpdateChecker.aspxという名前のWebシェルが明らかにされました。このWebシェルは、高度な難読化技術を利用して、C#コードが分析されないように保護します。攻撃者とWebシェル間のトラフィックの詳細、および影響を受けたシステムを効果的に管理および操作するために、制御コマンドはJSONで構造化されていることについて説明しました。

 また、Pythonのカスタムスクリプトを使用してコマンド操作をシミュレートすることで、このWebシェルの各種機能(ファイルやディレクトリ操作、内容の操作、データ取得など)のデモを行いました。

フォーティネットのソリューション

フォーティネットのお客様は、FortiGuardアンチウイルスサービスによって、このマルウェアから以下のように保護されています。

 このASPXファイルは、次のアンチウイルスシグネチャで検知されます。

 ASP/WebShell.32BC!tr

 FortiGuardアンチウイルスサービスは、FortiGate、FortiMail、FortiClient、およびFortiEDでサポートされています。FortiGuardアンチウイルスエンジンは、各ソリューションに含まれています。その結果、最新の保護を備えたこれらの製品を利用するお客様はすでに保護されます。

 FortiWeb(フォーティネットが開発したWebアプリケーションファイアウォール)も、このWebシェルに対する保護を提供します。

 また、読者の皆様には、フォーティネットが無償で提供するNSEトレーニングNSE 1 – 情報セキュリティ意識向上を受講することをおすすめします。このトレーニングにはインターネットの脅威に関するモジュールが含まれ、エンドユーザーは各種のフィッシング攻撃を識別して自らを保護する方法を学習できます。
本件の脅威またはその他のサイバーセキュリティ脅威がお客様の組織に影響を与えていると思われる場合は、当社のグローバルFortiGuardインシデントレスポンスチームまでご連絡ください。

IOC(Indicators of Compromise:侵害指標)

該当サンプルのSHA-256:
[UpdateChecker.aspx]
A841C8179AC48BDC2EBF1E646D4F552D9CD02FC79207FDC2FC783889049F32BC

■関連サイト