mod_securityで検知したログのURLデコードについて考えてみました。

■使用クライアントOS
Windows 7 64bit

■使用MUA
Windows Live メール

■説明

黒ぶちの環境ではmod_securityがアタックを検知したら管理者へメールを送信するようにしています。
メールの内容には、mod_securityのどのルールで検知したのか、検知した文字列などは分かるのですが1つ問題がありました。
それは、blogなどにポストされたコメントの内容がmod_securityのルールにひっかかって検知された場合、メールが管理人に送られます。その検知された文字列(コメント)がURLエンコードされていて人間にはさっぱり理解できない文字列でメールに記載されています。人間にはさっぱりな文字列なので、誤検知なのか正常検知なのか分からない時があります。
そこで、人間が読めるようデコードしてやる必要がありました。

■テストコメント
テストとして以下の内容をblogに投稿してみます。


簡単なクロスサイトスクリプティングです。
ぽちっと【コメントを送信】をクリックすると以下のログ内容がメールで送信されます。

■mod_securityのログについて

--95d7445e-A--
[08/May/2011:14:24:52 +0900] TcYpIn8AAAEAADoBOy8AAAAN 192.168.0.100 57068 192.168.0.90 80
--95d7445e-B--
POST /wp-comments-post.php HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://www.example.com/?p=1
Accept-Language: ja-JP
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; YTB730; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: www.example.com
Content-Length: 405
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: wp-settings-time-1=1304831575; comment_author_847310eb455f9ae37cb56962213c491d=%E3%83%86%E3%82%B9%E3%83%88; comment_author_email_847310eb455f9ae37cb56962213c491d=test%40test.com; wordpress_test_cookie=WP+Cookie+check

--95d7445e-C--
author=%E6%82%AA%E6%84%8F%E3%81%AE%E3%81%82%E3%82%8B%E4%BA%BA%E3%81%A7%E3%81%99%E3%82%88%EF%BD%9E&email=XSS@attack.kurobuti.com&url=&comment=%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%3Cscript%3Ealert%3C%2Fscript%3E&submit=%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E9%80%81%E4%BF%A1&comment_post_ID=1&comment_parent=0
--95d7445e-F--
HTTP/1.1 302 Found
X-Powered-By: PHP/5.1.6
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Last-Modified: Sun, 08 May 2011 05:24:51 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Pragma: no-cache
Location: http://www.example.com/?p=1#comment-3
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Set-Cookie: comment_author_847310eb455f9ae37cb56962213c491d=%E6%82%AA%E6%84%8F%E3%81%AE%E3%81%82%E3%82%8B%E4%BA%BA%E3%81%A7%E3%81%99%E3%82%88%EF%BD%9E; expires=Thu, 19-Apr-2012 10:44:52 GMT; path=/
Set-Cookie: comment_author_email_847310eb455f9ae37cb56962213c491d=XSS%40attack.kurobuti.com; expires=Thu, 19-Apr-2012 10:44:52 GMT; path=/
Set-Cookie: comment_author_url_847310eb455f9ae37cb56962213c491d=deleted; expires=Sat, 08-May-2010 05:24:51 GMT; path=/
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive

--95d7445e-E--

--95d7445e-H--
Message: Warning. Pattern match "\< ?script\b" at ARGS:comment. [file "/etc/httpd/conf/mod_security.d/base_rules/modsecurity_crs_41_xss_attacks.conf"] [line "195"] [id "958051"] [rev "2.1.2"] [msg "Cross-site Scripting (XSS) Attack"] [data "<script"] [severity "CRITICAL"] [tag "WEB_ATTACK/XSS"] [tag "WASCTC/WASC-8"] [tag "WASCTC/WASC-22"] [tag "OWASP_TOP_10/A2"] [tag "OWASP_AppSensor/IE1"] [tag "PCI/6.5.1"]
Message: Pattern match "<(a|abbr|acronym|address|applet|area|audioscope|b|base|basefront|bdo|bgsound|big|blackface|blink|blockquote|body|bq|br|button|caption|center|cite|code|col|colgroup|comment|dd|del|dfn|dir|div|dl|dt|em|embed|fieldset|fn|font|form|frame|frameset|h1|head|h ..." at ARGS:comment. [file "/etc/httpd/conf/mod_security.d/base_rules/modsecurity_crs_41_xss_attacks.conf"] [line "555"] [id "973300"] [rev "2.1.2"] [msg "Possible XSS Attack Detected - HTML Tag Handler"] [data "<script>"]
Message: Pattern match "(?i:<script.*?>)" at ARGS:comment. [file "/etc/httpd/conf/mod_security.d/base_rules/modsecurity_crs_41_xss_attacks.conf"] [line "756"] [id "973331"] [rev "2.1.2"] [msg "IE XSS Filters - Attack Detected"] [data "<script>"]
Message: Warning. Operator GE matched 5 at TX:inbound_anomaly_score. [file "/etc/httpd/conf/mod_security.d/base_rules/modsecurity_crs_60_correlation.conf"] [line "36"] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 15, SQLi=, XSS=15): IE XSS Filters - Attack Detected"]
Apache-Handler: proxy-server
Stopwatch: 1304832290684288 1488556 (3103* 10217 -)
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.5.13 (http://www.modsecurity.org/); core ruleset/2.1.2.
Server: Apache/2.2.17 (Unix)

--95d7445e-Z--
1-2行目まで
検知時間(アクセス時間)やアクセス元IP、ポート、アクセス先IP、ポートなど

3-15行目まで
リクエストメソッドやパス、ヘッダ、クッキーなど

17-18行目まで
ここでは、ポストされたコメントの内容など

19-33行目まで
レスポンスヘッダ類

37-最後まで
mod_securityで検知した対象ルール、コメントなど

■URLデコード
それでは、17-18行目についてURLデコードを行ってみます。
[root@example ~]# echo "author=%E6%82%AA%E6%84%8F%E3%81%AE%E3%81%82%E3%82%8B%E4%BA%BA%E3%81%A7%E3%81%99%E3%82%88%EF%BD%9E&email=XSS@attack.kurobuti.com&url=&comment=%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%3Cscript%3Ealert%3C%2Fscript%3E&submit=%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E9%80%81%E4%BF%A1&comment_post_ID=1&comment_parent=0" | nkf --url-input -w
author=悪意のある人ですよ~&email=XSS@attack.kurobuti.com&url=&comment=クロスサイトスクリプティング<script>alert</script>&submit=コメントを送信&comment_post_ID=1&comment_parent=0
これで、デコードが出来て人間でも読めるようになりました。
注)OSの文字コードはUTF-8なのでnkfのオプションでは-w を指定しています。

■検知メールスクリプトに組み込んでみる
下記アドレスで作成したような検知メールスクリプトに組み込んでみます。
http://www.kurobuti.com/blog/?p=3766
#!/bin/sh
TMP_FILE=/tmp/mod_security.txt
LOG=/var/log/httpd/mod_security_audit.log
MAIL_ADD=root
read LOG_NUMBER

NAME=`echo $LOG_NUMBER | sed -e "s/--//g"`
NAME2=`echo $NAME | sed -e "s/A/Z/g"`
FIRST_NUM=`grep -n "$NAME" "$LOG" | tail -1 | awk -F : '{print $1}'`
END_NUM=`grep -n "$NAME2" "$LOG" | tail -1 | awk -F : '{print $1}'`

sed -n "$FIRST_NUM","$END_NUM"p "$LOG" > "$TMP_FILE"

if [ $? -eq 0 ] ; then
# add
egrep -n "\-\-[0-9a-zA-Z]+\-C" "$TMP_FILE" > /dev/null 2>&1
 if [ $? -eq 0 ] ; then
  FIRST_COMMENT_NUM=`egrep -n "\-\-[0-9a-zA-Z]+\-C" "$TMP_FILE" | awk -F : '{print $1}'`
  END_COMMENT_NUM=`egrep -n "\-\-[0-9a-zA-Z]+\-F" "$TMP_FILE" | awk -F : '{print $1}'`
  let END_COMMENT_NUM=END_COMMENT_NUM-1
  echo >> "$TMP_FILE"
  sed -n "$FIRST_COMMENT_NUM","$END_COMMENT_NUM"p "$TMP_FILE" | nkf --url-input -s >> "$TMP_FILE"
 fi
cat "$TMP_FILE" | mail -s "Detection mail" root
rm "$TMP_FILE"
else
echo "$TMP_FILE was not able to be deleted." | mail -s "error" "$MAIL_ADD"
fi

こうすると、受信メールの最終行に以下の行が追加されます。
--0fd8a23b-C--
author=悪意のある人ですよ~&email=XSS@attack.kurobuti.com&url=&comment=クロスサイトスクリプティング<script>alert</script>&submit=コメントを送信&comment_post_ID=1&comment_parent=0

しばらくはこれで様子見かなぁ。


便利ツール
1.  http://www.tagindex.com/tool/url.html


5月 8, 2011 at 3:08 pm by 黒ぶちメガネ
Category: Apache, Linux, mod_security