MITRE ATT&CK フレームワーク[T1505.003]に含まれるように,ウェブシェルはウェブサーバのバックドアとして機能し,継続的かつ持続的なアクセスを提供します.ウェブシェルは,通常,攻撃者が設定不十分なウェブアプリケーション上のファイルアップロードのような脆弱性を 突いた後にインストールされます.コードは,単純なワンライナーから,リモートコマンドの実行,ファイルシステムの操作,データベースとのやりとり,権限の昇格など,一般的に使用される様々な機能を網羅する,より複雑なウェブシェルまで様々です.ASPXSpy,China Chopper,歴史的に有名なc99やr57は,最もよく知られたウェブシェルの一つです.
Agonizing Serpents / Agrius として知られるイランに関連した脅威行為者に関連する最近のthreat intelligence 出版物において,いくつかのウェブシェルが言及されていました.Nozomi Networks Labsチームは,これらのウェブシェルの1つが提供するコマンド実行,ファイル操作,データベースインタラクションなどの機能を調査・研究するために,インテリジェンスを分析しました.このブログでは,SHA-256ハッシュ:abfde7c29a4a703da2b8ad2637819147de3a890fdd12da8279de51a3cc0d96dで利用可能なウェブシェルサンプルを利用した私たちの方法論と研究を紹介します.
難読化
ウェブシェルは,.aspxファイル内の1行のC#として表示され,そのソースコードに難読化技術を示している.

これらの方法は,特定の変数名や関数名を異なる言語(韓国語,ギリシャ語など)の文字に置き換えて意味を曖昧にすることで,内部操作を隠すことを目的としている.

さらに,使用する文字列をわかりにくくするために,単純な難読化方法を採用している関数もあります.これらの関数は,文字列を直接使用する代わりに,テーブル内の特定の位置から文字列を取得する別の関数を呼び出します.CSSや画像アイコンのようなアセットはbase64でエンコードされます.

以下の図4は,難読化を解除した結果,より読みやすいコードになったことを示している.見てわかるように,攻撃者は分析を複雑にし,研究者を遅らせるために余計なことをしている.

認証
誰かが適切な認証なしにウェブシェルページにアクセスしようとすると,ページの読み込みをエミュレートするために10秒間待機した後,HTTP ERROR 404ページを表示します.この機能により,認証されていないユーザがウェブシェルを簡単に見つけられないようにし,目立たなくしてページが不要な注目を集める可能性を減らします.
シェルにアクセスするには,2つのステップがある:
- u クエリ値が URL の一部(GET リクエスト)である場合,Web シェルはこのパラメー タ値を受け取り,SHA256 ハッシュを計算し,定義済みの値(a9cf6f3aae163d7bf0cab956257eeb5ec8ab411007b552264fdebfb65c59bb6)と比較します.これらが一致すると,ウェブシェルは認証クッキーをセットし,404エラーメッセージを表示しなくなります.
- ウェブシェルは隠されたフォームからパスワード値を受け取り,その SHA256 ハッシュを計算し,このハッシュを別の定義済みの値(afb3410722da93d4fd63372e147456fd0630e09a241cb78be48a05295c853ab2)と比較します.ハッシュが一致すると,ウェブシェルはこのハッシュの値で passwd クッキーをセットし,ウェブシェル機能へのアクセスを許可します.
要するに,ウェブ・シェルにアクセスするためだ:
- URLに正しいuパラメータがあるか,一致する認証クッキーが必要です.
- また,ウェブシェルをうまく利用するには,送信された正しいパスワードの値,または一致するpasswdクッキーが必要です.

ウェブシェル機能
ウェブシェルの主なパワーはその柔軟性にある.私たちが見たウェブシェルは,ほとんどの本格的なシェルがそうであるように,便利な機能の数々を提供し,操作者にとって便利なものにしている.
ファイルマネージャー
ウェブシェルは広範な機能を提供し,ターゲットシステムのファイルシステムをブラウズする能力をユーザに与えます.さらに,ファイルやディレクトリに対するさまざまな操作を容易にし,脅威行為者がダウンロード,名前の変更,削除,コピー,圧縮,属性の変更などのタスクを実行できるようにすることで,侵害されたシステムをシームレスに制御できるようになります.

コマンドライン
コマンドラインツールにより,ユーザーはターゲットシステム上でカスタムコマンドを実行し,対応する出力にアクセスすることができる.さらに,net user,whoamiなど,あらかじめ定義された便利なコマンドも含まれており,マウスをクリックするだけで実行し,システム,ファイル,プロセスについて詳しく知ることができる.ユーザーは,各コマンドのタイムアウト時間を調整することもできる.

SQLマネージャー
SQLマネージャは,ユーザが提供する接続文字列を使用してSQLデータベースに接続し,データの挿入,削除,更新,エクスポートなどの操作を実行するためのインタフェースを提供します.この機能は,既存データの盗用や偽造を含む複数の目的に使用することができます.

ファイル/フォルダの作成とアップロード
ファイルやフォルダを作成したりアップロードしたりするための便利な機能もいくつか提供されている.攻撃者は,ユーザー・インターフェイスを使ってローカル・ファイルをターゲット・システムに簡単にアップロードすることができるし,テキスト・ボックスを使ってテキスト・コンテンツを提供することで,ゼロからファイルを作成することもできる.この機能を利用して,シェルスクリプトを素早く作成したり,被害者にメモを残すこともできる.


ポートスキャン
この機能により,ユーザーはIPアドレスとともにポートのコンマ区切りリストを入力してポートスキャンを実行し,各ポートのステータス(オープンまたはクローズ)を判断することができる.デフォルトのポート・リストには,telnet,SMTP,HTTP,POP3,各種データベース,リモート管理ソフトウェアなどのサービスのスキャンが含まれている.ポート・スキャン機能は,TcpClientクラスを使用する.この情報は,攻撃者がシステムに関するより多くの情報を収集するために,侵入後の段階で非常に貴重である.


ポートバインド
この機能は,指定されたポートにシェルをバインドし,侵害されたシステムに接続してコマンドを実行するために使用することができます.ポート・バインディングの成功は,特定のポートへの着信接続を防止または制限する強固なネットワーク・フィルタリングやセキュリティ対策がないことに依存していることに注意することが重要です.ネットワークに厳格なフィルタリングルールやファイアウォールが設置されている場合,攻撃者がこの方法を効果的に使用することは難しくなります.


コネクト・バック
このコマンドはコネクトバックまたはリバースシェル機能を提供する.具体的には,TcpClientを使用して指定されたアドレスとポートに接続し,隠しコンソールウィンドウを設定し,サーバーから行を読み込んでローカルコンソールで実行し,出力をサーバーにリダイレクトします.リバースシェルは,ファイアウォールやその他のセキュリティ対策によってホストがインバウンド接続を受け付けないような状況で有用である.

マステスト
Mass Testは,ディレクトリを繰り返し検査し,その中の各サブフォルダのパーミッションを検証する方法を提供し,侵害されたシステムの調査をスピードアップする.

マス・ディスフェイス
Mass Defaceは,置き換えるファイルや入力テキストを提供することで,ページを改ざんする方法を提供します.Defaceは,元のウェブサイトのコンテンツの代わりに表示される公的な声明を残すために攻撃者によって一般的に使用されます.

システムとユーザー情報
ドメイン,IP,OSバージョン,タイムゾーン,ディスク使用量,CPU詳細,パスワード情報など,バックドアされたシステムに関する情報を提供する.

検索
ファイルやフォルダの名前や内容に基づいてファイルシステムを検索する機能を提供する.こうすることで,攻撃者は興味のあるデータを素早く見つけることができる.

プロセス
実行中のプロセスのID,名前,スレッド数,優先度のリストを表示し,可能な場合はいつでも特定のプロセスを終了させることができる.

サービス
services 関数は,サービスの ID と名前,およびステータスのリストを表示します.サービスは,ServiceController.GetServicesと ManagementObjectSearcherクエリを使用して取得されます.この機能は,インストールされているサイバーセキュリティ製品の特定など,複数の目的に使用できます.


メール
この関数は,SMTP サーバに接続し,From/To/Subject/Body フィールドに入力して電子メールを送信するメソッドを提供します.この関数は,System.Net.Mail.Mail のMailMessage,SmtpClient,およびMailAddressクラスを使用します.この機能により,攻撃者はネットワーク外部からアクセスできないローカルSMTPサーバーに接続できる可能性があります.

難読化解除後の関数は以下のようになる:

リモートダウンロード
リモートダウンロードは,インターネットから何かをダウンロードし,それをバックドアされたマシンに保存する方法を提供する.デフォルトのダウンロードリンクは,Windows用のパスワードダンプユーティリティであるfgdumpを指しています.この関数は,System.Net.WebClientが提供するWebClientクラスを使用します.


自己除去
シェルには,それ自身を削除する機能があります.ユーザーがシェルを削除したいことを確認すると,プログラムは自分自身の場所を決定し,自分自身のファイルでFile.Delete関数を呼び出して自分自身を削除するプロセスを開始します.
結論
この Web シェルを探ることで,現代の攻撃者がシステムを侵害する際に使い続けている機能に光を当てることができます.脅威の状況が進化し続ける中,警戒を怠らず,セキュリティのベストプラクティスを優先し,プロアクティブなセキュリティ文化を醸成することは,Web シェルやその他の巧妙なサイバー脅威がもたらすリスクを軽減する上で不可欠です.
検出
IoC
- abfde7c29a4a703daa2b8ad2637819147de3a890fdd12da8279de51a3cc0d96d
YARA
ルール unknown_webshell : ウェブシェル aspx
{
メタ
name = "不明なASPX - ウェブシェル"
説明 = "難読化された本格的な ASPX ウェブシェル"
author = "Nozomi Networks Labs"
日付 = "2023-11-27"
hash = "abfde7c29a4a703daa2b8ad2637819147de3a890fdd12da8279de51a3cc0d96d"
tlp = "クリア"
文字列:
$base_0 = "<%@ Import Namespace=\""
$base_1 = "スクリプト>"
$base_2 = "<html>"
s_1 = "server=localhost;UID=sa;PWD=1234;database=master;"
$s_2 = "21,25,80,110,1433,1723,3306,3389,4899,5631,43958,65500"
s_3 = "コマンド実行結果"
s_4 = "DllImport(\"kernel32.dll")"
s_5 = "DllImport(\"user32.dll")"
s_6 = "SQLのエクスポートに成功しました!"
s_7 = "ポートスキャン"
s_8 = "ポートバインド"
s_9 = "大量汚損"
s_10 = "システムとユーザー情報"
s_11 = "プログラムはエラーに直面した!"
s_12 = "ファイルもフォルダもありません!"
s_13 = "selectDeface"
s_14 = "secondLogin"
s_15 = "SELECT PROCESSID FROM WIN32_SERVICE WHERE"
s_16 = "サーバーに接続成功!"
s_17 = "リモートダウンロード"
s_18 = "SW_HIDE"
s_19 = "SW_SHOW"
s_20 = "GetConsoleWindow"
$s_21 = "System.Net.Mail.SmtpDeliveryMethod.Network"
s_22 = "killMe"
s_23 = "クエリー使用時にシングルクォートを使用する場合"
s_24 = "プロセスは正常に終了しました!"
s_25 = "Request.Cookies[\"auth"]"
System CurrentControlSet Terminal Server
s_27 = "サーバーの改ざんに成功しました!"
s_28 = "SqlCommand"
s_29 = "ディレクトリはすでに存在します!"
コンディション
($base_*)のすべてと($s_*)の6つ
}
スノート
#Nozomi Networks ラボ
alert http any any -> any $HTTP_PORTS (msg: "Detected HTTP headers associated with an ASPX web shell."; flow:to_server,established; content: "POST"; http_method; content: "Cookie:「http_header; content: "auth="; http_header; content: "passwd="; http_header; content: "limitLengthList="; http_header; content: "limitLengthSql="; http_header; content: "startLimitNumberList"; http_header; content: "directory="; http_header; sid:9000447; metadata: created_at 2023_11_27, tlp clear;)