【Wordpres】不正ログインを防ぐためには、XML-RPCも対策しないといけない

  • 投稿 : 2016-09-20
  • 更新 : 2017-01-25
brute-force-attack01.png

・動作確認用のサイト
・wp-login.phpは、自IP以外は拒否
Limit Login Attemptsを導入して有効化

この状態で、Limit Login Attemptsで不正ログインでログインロックされたメールが来ました。どうも不正ログインしようとした人がいるらしい。しかし、「wp-login.php」はIP制限をかけてるのでおかしいな?と・・・。

検索でいろいろ調べて、レンタルサーバーのアクセスログをみると、どうもxmlrpc.php経由でログイン認証みたいなことができることが原因のようです。

同じサーバーにある運用しているブログのアクセスログをみると、確かに同じIPから攻撃があって、wp-login.php、xmlrpc.phpとも403返して拒否しています。運用しているブログの方は、xmlrpc.phpを国外IPからの拒否をしているから403を返します。で不正ログインの形跡もなし。

状況的に、どうも不正ログインを防ぐには「XML-RPC」も対策しないということのようです。

あと、これを見るがぎりでは、ログインをメールアドレスに変更しているパターンも想定しているので、まあ対策とイタチごっこなところがあると思う。

追記:2017/01/25
WordPressでxmlrpcを使ったブルートフォースアタックについて
WordPress brute force attack via wp.getUsersBlogs - SANS Internet Storm Center
xmlrpc.phpへのブルートフォースアタックでブログが使えなくなったので対策したよ!の巻 - TrippyBoyの愉快な日々

追記:2016/11/06
ログイン画面だけから、ログインするわけではなくて、xmlrpcからも、ログインされる可能性があるので、
add_filter('xmlrpc_enabled', '__return_false');
外部編集ツールなどを使っていないなら、使っていないなら、停止しておきましょう
WordPress login をちょっと工夫する - ミショニポー

xmlrpc.php に対して、ログイン試行を行うことが可能です。
トピック: [解決済] ログインページにIP制限をしているのにログイン試行されている « サポートフォーラム — WordPress

やはり、xmlrpcからもログインできるようです。

検索で調べた時のメモ

「wp-login.php ファイルをIPアクセス制限」したよね???

そもそもログインページにアクセスできないようにしたつもりなのに、なぜ「存在しないユーザーでログインしようとした」のログが記録されるのか??

すみません、調べてみたのですが、原因がわかりませんでした。
続報:不正ログインが止まらない? – 富山でWeb勉強会

IPすり抜けること可能なのかなぁと思って調べてたら、上記のようなものがヒットしました。これで、IPアドレスが分かってるんだから、アクセスログでどのファイルをアクセスしてるかを見るべきだということに気づけました。で、xmlrpc.phpが怪しい。

IP調べたらオランダ(Ecatel LTD)からの攻撃でした。

xmlrpc.phpに対して何をポストしているのかわかりませんが、
数時間にわたって1秒2回ほどポストし続けてくれやがります。

おそらく無理矢理ログインしようとしてきているのか、pingbackで他のサイトを攻撃しようとしているのかのどちらかだと思われます。
WordPressのxmlrpc.phpに対するブルートフォースアタックを防ぐ | ものづくりエクスペリメント

今回のログをみると、1秒に1回、xmlrpc.phpに何かしている形跡ありました。wp-login.phpは設定どおり拒否で来てました。

・管理画面へのログイン画面は、海外サイトからはアクセスできないようにする。
・間違ったIDとPASSが連続で入力されたら、そのIPアドレスはロックするようにする。

などが一般的によく設定される対策方法です。

ですが、今回調べたサイトではその両方の対策をやっているにも関わらず、なんと日本国内からの攻撃もあり、「おや?」と感じていました。
xmlrpc.phpを狙った攻撃だった
WordPressのxmlrpc.phpを狙った攻撃に注意

で、その路線でしらべたらビンゴの記事が・・・。


アクセスログ

blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:44 +0900] "POST / HTTP/1.1" 200 37773 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:46 +0900] "GET /libraries/caches.php HTTP/1.1" 500 29585 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:47 +0900] "POST /wp-content/plugins/Login-wall-etgFB/login_wall.php?login=cmd&z3=Y2FjaGVzLnBocA%3D%3D&z4=L3dwLWNvbnRlbnQvcGx1Z2lucy8%3d HTTP/1.1" 500 29710 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:48 +0900] "GET /wp-content/plugins/caches.php HTTP/1.1" 500 29622 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:49 +0900] "POST / HTTP/1.1" 200 37773 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:52 +0900] "GET /wp-content/uploads/caches.php HTTP/1.1" 500 29622 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:53 +0900] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 1 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:55 +0900] "GET /wp-content/plugins/revslider/temp/update_extract/caches.php HTTP/1.1" 500 29652 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:56 +0900] "GET /wp-content/plugins/revslider/caches.php HTTP/1.1" 500 29632 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:57 +0900] "POST /license.php HTTP/1.1" 500 29603 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:58 +0900] "GET /caches.php HTTP/1.1" 500 29575 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:58 +0900] "POST /uploadify/uploadify.php?folder=/ HTTP/1.1" 500 29624 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:22:59 +0900] "GET /caches.php HTTP/1.1" 500 29575 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:00 +0900] "POST /tiny_mce/plugins/tinybrowser/upload_file.php?folder=/&type=file&feid=&obfuscate=&sessidpass= HTTP/1.1" 500 29684 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:01 +0900] "GET /caches.php HTTP/1.1" 500 29575 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:02 +0900] "POST /sites/all/libraries/elfinder/php/connector.minimal.php HTTP/1.1" 500 29646 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:03 +0900] "GET /sites/all/libraries/elfinder/files/caches.php HTTP/1.1" 500 29610 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:03 +0900] "POST /wp-content/plugins/jquery-html5-file-upload/jquery-html5-file-upload.php HTTP/1.1" 500 29664 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:04 +0900] "GET /wp-content/uploads/files/guest/caches.php HTTP/1.1" 500 29634 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:05 +0900] "POST /wp-content/plugins/woocommerce-product-options/includes/image-upload.php HTTP/1.1" 500 29664 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:06 +0900] "GET /wp-content/uploads/2016/9/caches.php HTTP/1.1" 500 29629 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:07 +0900] "POST /modules/mod_simplefileuploadv1.3/elements/udd.php HTTP/1.1" 500 29641 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:07 +0900] "GET /modules/mod_simplefileuploadv1.3/elements/caches.php HTTP/1.1" 500 29617 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:08 +0900] "GET /readme.html HTTP/1.1" 200 10214 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:09 +0900] "GET /?feed=rss2 HTTP/1.1" 301 - "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:10 +0900] "GET /feed/ HTTP/1.1" 302 - "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:10 +0900] "GET /wp-login.php HTTP/1.1" 403 216 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:11 +0900] "POST /wp-login.php HTTP/1.1" 403 3558 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
blog.example.com 195.154.243.31 - - [20/Sep/2016:10:23:12 +0900] "POST /xmlrpc.php HTTP/1.1" 403 212 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"

こんな感じで、攻撃できそうなところを調べてから、攻撃してくる感じですね。

>POST /wp-login.php HTTP/1.1" 403
>POST /xmlrpc.php HTTP/1.1" 403

403なら攻撃をあきらめて、200なら、攻撃してくるとかのようです。今回、確認用のサイトが「xmlrpc.php」が使えるとがわかってという感じのようです。xmlrpcってリモート投稿用のAPIとかもあるので、そのときの認証がログインと同じなのかなぁと…。

スポンサーリンク