404 Not Foundとなったアクセスからわかる不正なアクセス




Laravelに移行したついでに404 Not Foundのページをログ出力して移行エラーを確認したことがきっかけで不正アクセスが頻繁に行われていることがわかったので共有します。

不正アクセス履歴

Laravelで検知した404 Not Foundエラーをログ出力した中で、ちょっと見ただけでも以下のように怪しいログがいくつもありました。
※怪しいログだけ抜き出し、ドメイン部分はexample.comに変更しています。

[2021-11-06 23:18:12] production.INFO: /wordpress,https://www.example.com/wordpress
[2021-11-06 23:18:12] production.INFO: /wp,https://www.example.com/wp
[2021-11-06 23:18:13] production.INFO: /old,https://www.example.com/old
[2021-11-06 23:18:13] production.INFO: /oldsite,https://www.example.com/oldsite
[2021-11-06 23:18:14] production.INFO: /new,https://www.example.com/new
[2021-11-06 23:18:15] production.INFO: /backup,https://www.example.com/backup
[2021-11-06 23:18:15] production.INFO: /test,https://www.example.com/test
[2021-11-06 23:18:16] production.INFO: /project,https://www.example.com/project
[2021-11-06 23:18:17] production.INFO: /demo,https://www.example.com/demo
[2021-11-06 23:18:17] production.INFO: /bc,https://www.example.com/bc
[2021-11-06 23:18:18] production.INFO: /www,https://www.example.com/www
[2021-11-06 23:18:18] production.INFO: /2021,https://www.example.com/2021
[2021-11-06 23:18:19] production.INFO: /newfolder,https://www.example.com/newfolder
[2021-11-06 23:18:20] production.INFO: /main,https://www.example.com/main
[2021-11-06 23:18:20] production.INFO: /old-site,https://www.example.com/old-site
[2021-11-06 23:18:21] production.INFO: /bk,https://www.example.com/bk
[2021-11-06 23:18:21] production.INFO: /bak,https://www.example.com/bak
[2021-11-06 23:18:22] production.INFO: /bac,https://www.example.com/bac
[2021-11-06 23:18:23] production.INFO: /site,https://www.example.com/site
[2021-11-06 10:26:52] production.INFO: /cgi-bin/mt/mt-atom.cgi,https://www.example.com/cgi-bin/mt/mt-atom.cgi
[2021-11-06 10:30:32] production.INFO: /browserconfig.xml,https://www.example.com/browserconfig.xml
[2021-11-06 09:29:57] production.INFO: /.well-known/traffic-advice,https://www.example.com/.well-known/traffic-advice
[2021-11-05 18:16:19] production.INFO: /.env,https://www.example.com/.env
[2021-11-05 14:41:52] production.INFO: /wp-content,https://www.example.com/wp-content
[2021-11-05 10:36:52] production.INFO: /.well-known/security.txt,https://g1-guide.com/.well-known/security.txt
[2021-11-05 10:36:53] production.INFO: /security.txt,https://www.example.com/security.txt
[2021-11-04 07:07:55] production.INFO: /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php,https://www.example.com/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
[2021-11-05 21:55:55] production.INFO: //blog/wp-includes/wlwmanifest.xml,//blog/wp-includes/wlwmanifest.xml
[2021-11-05 21:55:55] production.INFO: //web/wp-includes/wlwmanifest.xml,//web/wp-includes/wlwmanifest.xml
[2021-11-05 21:55:56] production.INFO: //wordpress/wp-includes/wlwmanifest.xml,//wordpress/wp-includes/wlwmanifest.xml
[2021-11-05 21:55:56] production.INFO: //website/wp-includes/wlwmanifest.xml,//website/wp-includes/wlwmanifest.xml
[2021-11-05 21:55:57] production.INFO: //wp/wp-includes/wlwmanifest.xml,//wp/wp-includes/wlwmanifest.xml
[2021-11-05 21:55:57] production.INFO: //news/wp-includes/wlwmanifest.xml,//news/wp-includes/wlwmanifest.xml
[2021-11-05 21:55:58] production.INFO: //2020/wp-includes/wlwmanifest.xml,//2020/wp-includes/wlwmanifest.xml
[2021-11-05 21:55:58] production.INFO: //2019/wp-includes/wlwmanifest.xml,//2019/wp-includes/wlwmanifest.xml
[2021-11-05 21:55:58] production.INFO: //shop/wp-includes/wlwmanifest.xml,//shop/wp-includes/wlwmanifest.xml
[2021-11-05 21:55:59] production.INFO: //wp1/wp-includes/wlwmanifest.xml,//wp1/wp-includes/wlwmanifest.xml
[2021-11-05 21:55:59] production.INFO: //test/wp-includes/wlwmanifest.xml,//test/wp-includes/wlwmanifest.xml
[2021-11-05 21:56:00] production.INFO: //wp2/wp-includes/wlwmanifest.xml,//wp2/wp-includes/wlwmanifest.xml
[2021-11-05 21:56:00] production.INFO: //site/wp-includes/wlwmanifest.xml,//site/wp-includes/wlwmanifest.xml
[2021-11-05 21:56:01] production.INFO: //cms/wp-includes/wlwmanifest.xml,//cms/wp-includes/wlwmanifest.xml
[2021-11-05 21:56:01] production.INFO: //sito/wp-includes/wlwmanifest.xml,//sito/wp-includes/wlwmanifest.xml

わかりやすく相対パスだけにすると以下となります。

/wordpress
/wp
/old
/oldsite
/new
/backup
/test
/project
/demo
/bc
/www
/2021
/newfolder
/main
/old-site
/bk
/bak
/bac
/site
/cgi-bin/mt/mt-atom.cgi
/browserconfig.xml
/.well-known/traffic-advice
/.env
/wp-content
/.well-known/security.txt
/security.txt
/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
/blog/wp-includes/wlwmanifest.xml
/web/wp-includes/wlwmanifest.xml
/wordpress/wp-includes/wlwmanifest.xml
/website/wp-includes/wlwmanifest.xml
/wp/wp-includes/wlwmanifest.xml
/news/wp-includes/wlwmanifest.xml
/2020/wp-includes/wlwmanifest.xml
/2019/wp-includes/wlwmanifest.xml
/shop/wp-includes/wlwmanifest.xml
/wp1/wp-includes/wlwmanifest.xml
/test/wp-includes/wlwmanifest.xml
/wp2/wp-includes/wlwmanifest.xml
/site/wp-includes/wlwmanifest.xml
/cms/wp-includes/wlwmanifest.xml
/sito/wp-includes/wlwmanifest.xml

不正アクセスの内容

ざっと見て以下に分けることができます。

(1)WordPressやMovable Typeへの攻撃

以下のようによく使われていそうなディレクトリパスをベースとしてターゲットファイルにアクセスを試みています。

/wordpress
/wp
/cgi-bin/mt/mt-atom.cgi
/wp-content
/blog/wp-includes/wlwmanifest.xml
/web/wp-includes/wlwmanifest.xml
/wordpress/wp-includes/wlwmanifest.xml
/website/wp-includes/wlwmanifest.xml
/wp/wp-includes/wlwmanifest.xml
/news/wp-includes/wlwmanifest.xml
/2020/wp-includes/wlwmanifest.xml
/2019/wp-includes/wlwmanifest.xml
/shop/wp-includes/wlwmanifest.xml
/wp1/wp-includes/wlwmanifest.xml
/test/wp-includes/wlwmanifest.xml
/wp2/wp-includes/wlwmanifest.xml
/site/wp-includes/wlwmanifest.xml
/cms/wp-includes/wlwmanifest.xml
/sito/wp-includes/wlwmanifest.xml

(2)バックアップファイルへの攻撃

サイトを運営していてgit管理していないと更新するたびにバックアップファイルやディレクトリを作成しているのをよく見かけます。
このようなファイル名やディレクトリ名を想定して攻撃をしています。
簡単な名前にすると以下のような不正アクセスでバックアップファイルの存在に気づかれてしまい、非公開にしたはずの情報や公開したくない情報が取得されてしまう可能性があります。
バックアップファイルは基本的にサーバー上には置かないのが一番です。
どうしてもおく必要がある場合は推測されにくいファイル名やディレクトリ名にしないと危険にさらされてしまいます。

/old
/oldsite
/backup
/bc
/2021
/old-site
/bk
/bak
/bac

(3)準備中のディレクトリや環境ファイルへの攻撃

サイトリニューアル前に一時的にnewとかtestというような名前のディレクトリを作って動作確認をするということがあるかもしれません。
こういったディレクトリを推測して攻撃される可能性を常に意識したほうがよさそうです。
今回、new,test,project,demo,siteなどよくありそうなパスへのアクセスが確認できましたので要注意です。
このようなディレクトリを使う場合、格納する情報の機密性によって認証は変わりますが少なくともベーシック認証で基本的にアクセスはブロックすることで基本的には不正アクセスを防ぐことができます。
また、ドットファイルなどの隠しファイルへのアクセスもいくつかあったのでパーミッションを厳しくしたり、危険なファイルはアクセスがあった場合はリダイレクトするなど対策を入れると良さそうです。

/new
/test
/project
/demo
/www
/newfolder
/main
/site

(4)環境ファイルや設定ファイルへの攻撃

.envファイルは基本公開ディレクトリには存在していないと思いますが、攻撃対象になっているので要注意ですね。
また、怖いのはphpunitのeval-stdin.phpへのアクセス。
セキュリティホールがあるのでアクセスされると実際の攻撃に移る可能性が考えられます。

/.well-known/traffic-advice
/.env
/.well-known/security.txt
/security.txt
/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php

不正アクセスに対する対策

不正アクセスの内容からほとんどヒューマンエラーに分類される内容になるので、以下を対策するだけでかなり効果が期待できます。

(1)WordPressやMovable Typeのインストールディレクトリは可能な場合は公開ディレクトリ外にする。
 利用しているサーバーの仕様上難しいようであれば推測されにくいディレクトリ名でインストールする。
 公開ディレクトリ直下、wpやwordpressなどへのインストールは危険。
 推測されにくいディレクトリにしても画像ファイルやテーマファイルのパスなどですぐわかってしまいますが、単純な不正アクセスは防ぐことが多少できるようになります。

(2)公開ディレクトリ上にバックアップファイルを残さない。
 どうしても残したい場合は推測されにくい文字列にする。

(3)不要な設定ファイルは公開ディレクトリには置かない。

(4)WAFを導入する。
 ホスティング会社のサービスでWAFが利用できるようであれば導入することも対策のひとつです。
 この場合、既存アプリケーションの動作に影響がないかをチェックすることは導入前に重要です。

まとめ

不正アクセスについては防ぐことができません。
ただ、ヒューマンエラーに対する攻撃は対策できることができます。
ウェブサイト運営上基本的な内容になるので基本をしっかり理解して対策することが重要なことをあらためて考えさせられました。