従業員3名の会社に1日4,812回
本編で扱うアクセスログは、従業員が3人の会社のものです。昨夜の日中に管理者ページにログインしようとしました 4,812番 入ってきました。会社規模が小さいので攻撃対象ではないと思われる場合が多いのですが、実際には規模と関係がありません。
管理者アドレス /wp-login.php私 /admin同様にデフォルト値のままにすると、1日にこの程度が入ってきます。攻撃する側では、人が確認するのではなく、プログラムがインターネット全体を盗みながら基本ルートを叩くからです。
ランダムではありません
ログに残った試みをアカウントとパスワードの組み合わせでまとめてみると、性格がはっきりと明らかになります。どんな文字列も入れてみるのではなく、 一般的なアカウント名に別のサイトから漏洩したパスワードのリストを順番に貼り付ける 方法です。
- アカウントは
admin,administrator、会社のドメインの前半で、代表名の英語の表記のように推測しやすい値が繰り返されます。 - パスワードは既に漏洩して公開されたリストから順に取り出して書き込みます。
- 試みが集まった区間の間隔は 0.4秒でした。人が手で入力する速度ではありません。
そのため、他のサービスで使用していたパスワードを管理者アカウントにそのまま使用している場合は、その組み合わせはすでにリストに含まれている可能性があります。
4,812回のうち1回だけ当たると終わります
ログには 401 回答が長く続き、302 回答が 1 行となります。認証に成功したという意味です。そして、その次の行からファイルアップロード要求が表示されます。
この時点から、ログイン試行の回数は意味を失います。管理者権限を取得した方はウェブシェルを上げ、そのウェブシェルでスパムページを作成し続けます。検索結果に見知らぬページがあふれる状態がどのように始まるか ホームページがハッキングされたか10秒で確認する方法で扱いました。
確認は一行です
アクセスログで管理者アドレスが何回呼び出されたかをカウントしてください。
grep -c "wp-login.php" /var/log/nginx/access.log
awk '/wp-login/{print $1}' access.log | sort | uniq -c | sort -rn
最初の行はコールの総数を数え、2行目はどのIPがどのくらい叩かれたかを多くの順序で表示します。 WordPressを使わないサイトなら wp-login.php 席に /admin, /manager同様に、実際に使用する管理者パスを入れておく必要があります。
一日の呼び出しが数百件を超える場合は、まだ開いていないだけで、すでに目標になっています。
すぐに適用するアクション4つ
- 管理者アドレスをデフォルト値で置き換えます。
/wp-login.phpと/adminを会社だけが知っている経路に移すと、自動化された試みのほとんどがその場に届かなくなります。 - 2段階認証をオンにします。 パスワードが当たってもその前でもう一度詰まります。
- 接続可能なIPを制限します。 オフィスとVPN帯域だけが管理者ページに届くと、残りの要求はサーバーから直接切断されます。
- 失敗回数で自動ブロックします。 5回失敗したIPを一定時間サーバーが直接拒否するように設定します。
4つを一緒に適用しなければ効果があります。パスワードだけを長く変更するアクションでは、試行回数は減りません。すでに漏洩したリストを代入する方式なので、長さを増やすことは成功確率だけを下げるだけで叩く行為自体を防ぐことはできません。