🧙‍♂️

攻撃者が採用した「.htaccess」を改ざんして、任意の拡張子でPHPを実行する方法

2024/12/11に公開

みなさん、こんにちは。m(@the_art_of_nerd)です。
今回は私がWebサーバーをフォレンジック調査を担当した際に発見した、任意の拡張子からPHPを実行する方法について紹介します。

背景

Webサーバーが攻撃者によって侵害されたという事案で、フォレンジック調査を実施した際に発見したテクニックです。
Webサーバーの侵害のため、WebShellの設置を疑い、まず拡張子ベースで不審なファイル(改ざん・作成)が存在しないか調査していたところ、いくつか不審なファイルは発見されましたが、どうしてもWebShellのような機能を有するファイルだけ見つかりませんでした。

そこで、拡張子で見ていく調査から各ディレクトリごとに気になるファイルが存在しないかの調査に切り替えたところ、1つだけ明らかにWebサーバーのコンテンツとして違和感のある"ファイル名"が付けられたCSSファイルを発見しました。
当該ファイルを確認したところ、このCSSファイルは拡張子は「.css」であるものの、実態はPHPで記述し難読化されたWebShellでした。
当初、私はなぜCSSファイルでPHPが実行可能なのか不思議に思っていましたが、調査を進めるうちに同じディレクトリ内にある「.htaccess」ファイルに答えがありました。攻撃者は「.htaccess」ファイルにCSSファイル(中身はPHPのWebShell)を、PHPファイルとして解釈させるよう指示をしていたため、拡張子「.css」ファイルのまま悪意のあるPHPコードの実行に成功していました。

拡張子をCSSにすることのメリット

WebShell等の攻撃者が設置したファイルの拡張子をCSSに変更することで、一見無害なファイルに紛れることが可能です。アクセスログから不審なパスへの通信を確認する際も、拡張子が「.css」の場合、「.php」や「.js」などに比べて見落とされやすくなるめ、WebShellの秘匿性を高めることができます。
下図はWebShellにアクセスした際のアクセスログです。

WebShellへアクセスした際のアクセスログ

.htaccessの記述方法

以下を「.htaccess」に記述することで、同じディレクトリ内にある拡張子CSSファイルをPHPとして処理させる方法です。

<Files {対象のファイル名}>
ForceType application/x-httpd-php
SetHandler application/x-httpd-php
</Files>

以下は今回の検証で使用した設定例です。

<Files backdoor.css>
ForceType application/x-httpd-php
SetHandler application/x-httpd-php
</Files>

解説

3行の短い文ですが、行ごとに分けて解説します。

1行目

<Files webshell.css>

特定のファイル (webshell.css) に対して適用する設定を囲むブロックを定義することで、後述の設定が、webshell.cssという名前のファイルにだけ適用されます。

2行目

ForceType application/x-httpd-php

ファイルのMIMEタイプを強制的に「application/x-httpd-php」に設定します。
これにより、Apacheに対してこのファイルをPHPスクリプトとして処理するよう指示します。
そのため、通常、*.php拡張子を持つファイルがPHPとして処理されますが、この設定により、拡張子が .css であってもPHP として実行されます。

3行目

SetHandler application/x-httpd-php

1行目で指定したファイルに対してPHPハンドラー(application/x-httpd-php)を適用します。
これにより、指定されたファイルがPHPスクリプトとして処理されることを保証します。

検証

上記で説明した攻撃テクニックを実際に再現してみます。
まずは、Apacheを立ち上げPHPのWebShellを配置して動作を確認します。

下図では、WebShell経由でpwdコマンドを実行した様子です。

通常のPHP製WebShell

次に拡張子を「.php」から「.css」に変更した状態でアクセスすると、当然WebShellとしては機能しません。

CSSへ変更しただけのWebShell

では、先ほど紹介した「.htaccess」を作成し、CSSファイルをPHPとして解釈するように変更します。

.htaccessファイルの作成/設定変更

同じディレクトリ上に存在することを確認します。

指定したファイルをPHPとして動作するように指示する.htaccess

「.htaccess」を利用するには、Apacheの設定ファイルから「AllowOverride」を「All」に変更・追記しておく必要があります。
なお、実際にフォレンジック調査を行なった対象サーバーでは、既に「.htaccess」が利用されている環境だったため、攻撃者に改ざんされ悪用されていました。

AllowOverrideの設定
https://httpd.apache.org/docs/2.4/ja/mod/core.html#allowoverride

これにより拡張子が「.css」の状態でもPHPファイルを正しく読み込みました。

拡張子CSSでもWebShellが動作する様子

WebShell経由でwhoamiコマンドを実行した結果も問題なく動作しています。

拡張子CSSでもWebShellが動作する様子

今回の例ではCSS拡張子を指定しましたが、任意の拡張子で可能のため、「.txt」に変更した場合でも同じく動作します。

拡張子TXTでもWebShellが動作する様子

アクセスログから判別する方法

事後調査において、アクセスログから今回のようなケースを特定する方法として一例を紹介します。
例えば、通常POSTメソッドによるリクエストが発生する拡張子を(HTML・JS・PHPなど)をgrepコマンドで除外することで、拡張子が変更された今回のケースのようなWebShellなどを特定できる可能性が高まります。

grep 'POST ' {アクセスログのパス} | grep -Ev '\.(js|php|html)(\?| |$)'


grepによる識別

まとめ

今回は攻撃者がWebShellの永続化のために拡張子を変更して、秘匿性を高める手法を紹介しました。
この攻撃者はターゲットサーバーに進入後、「.htaccess」が有効になっていることに目を付け、悪用することでWebShellの秘匿化に成功していました。
このことから、攻撃者はターゲットの状況によって臨機応変に対応し、柔軟な考えを持って攻撃していることが分かりました。そのような攻撃者に対抗できるように日々、ブルーチーム側もスキルの研鑽を行わなければなりませんね。

Discussion