イントロ
このメモはたぶん数時間後に役に立つと思うの。
目的
WordPressとか改ざんされやすいCMSで不正なコードを入れられたか検出したい。(悪いのはプラグインだという議論はとりあえず横に置いておくとして)
でもちょっとしたゲームで利用する目的なので大がかりなことはしたくない。どうせいろいろ制限されてるだろうし…
方法
正常時にWordPressインストールディレクトリ配下のファイルのMD5値を計算して保存しておく。uploadsディレクトリは除外しておく。
# find /path/to/wordpress \
-type d -wholename '/path/to/wordpress/wp-content/uploads' -prune -o \
-type f -print0 | xargs -0 md5sum > base.txt
3698b890560d117e206fa8e3cf6cddc3 /path/to/wordpress/wp-signup.php
e54cae70b7252c32c1f9c0c8c1a7d1a4 /path/to/wordpress/wp-comments-post.php
f440516a1e2260095e956529ed9e00d4 /path/to/wordpress/wp-login.php
(snip)
適当にファイルを書き換えて、その後に出力ファイル名を変更して再度MD5値を計算する。
# find /path/to/wordpress \
-type d -wholename '/path/to/wordpress/wp-content/uploads' -prune -o \
-type f -print0 | xargs -0 md5sum > modified.txt
diffを取るとどのファイルが書き換わったかとか、どこにどんなファイルが追加されたかとか分かる。
# diff base.txt modified.txt
813c813
< a3fc7848293b003dae941bb7c1cf339d /path/to/wordpress/wp-config.php
---
> bf5ce5421a5f6a0c1db77038bb306685 /path/to/wordpress/wp-config.php
1339a1340
> d41d8cd98f00b204e9800998ecf8427e /path/to/wordpress/evilcode.php
これだけだとuploadsディレクトリにPHPスクリプトが置かれたときに検出できないので問題がある。下記のように設定しておくことでたとえ不正なファイルを置かれたとしても実行されることはない。他のスクリプト言語が実行できるサーバ環境ならそれらにも対応しておく。
<FilesMatch \.php$>
SetHandler text/plain
</FilesMatch>
とりあえずこのメモは改ざん検出が目的であって改ざんされないようにアップデートや適切なパーミッション設定を行うことは別途必要ということはお忘れ無く。改ざんでもファイル書き換えを伴わないWordPress 4.7.1の脆弱性みたいなものは検出できない。
あと気が向いたらcronで自動的に実行するためのスクリプトを考えてみる。
cronで定期的に改竄チェック&メール通知
あとで書こうと思ってたら、すっかり忘れてたので今更ながら追記。このスクリプトを一日一回、cronで実行する。crontabに**MAILTO=**で通知先メールアドレスを記載しておいて、メール通知を行うことで、改竄されたファイルが確認できる。
このスクリプトでは、拡張子がphpのファイルしかチェックしていないが、必要に応じて適当に変更する。
#!/bin/sh
export LANG=C
# check WordPress dir
DIR=/var/www/wordpress
FILELIST=`find ${DIR}/* -name '*.php' -type f -print`
DATEID=`date '+%Y%m%d'`
PREVDATE=`date -d '1 days ago' '+%Y%m%d'`
FILENAME=/root/check_defacement/wordpress_${DATEID}.txt
PREVFILE=/root/check_defacement/wordpress_${PREVDATE}.txt
for FILE in $FILELIST
do
echo `md5sum ${FILE}`
done >> $FILENAME
DIFF=`diff ${FILENAME} ${PREVFILE}`
if [ "$DIFF" != "" ]
then
echo file changed in ${DIR}
fi