這近發現有人在大量存取網頁,不清楚遭到攻擊或是合法的讀取,所以只好去翻記錄檔,看看誰來我家,apache的log如果沒有修改的話,預設大概是長這個樣子:
118.166.205.237 - - [28/Jul/2013:00:10:31 +0800] "GET /index.php HTTP/1.1" 200 55397 "http://www.example.com/content.php?sn=6637" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; BTRS104192; GTB7.5; Foxy/1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; BRI/2)"
我目前想做的只是把資料列中的ip取出來統計看看每個ip有幾次記錄,單一ip超過100次我就懷疑它在攻擊。
所以我撰寫下面這個程式 ipcount.pl
#!/usr/bin/perl -w if( !$ARGV[0] ) {die "請指定檔案\r\n";} $fn= $ARGV[0]; open(FILE, $fn) or die "$!"; $cnt=0; $data=""; %ip =(); while( defined( $line = <FILE> )){ if($line =~ /^(\d+\.\d+\.\d+\.\d+)/){ $data .= $1 . "\n"; $ip{$1}++; $cnt++; } } print "[$fn]總共判斷:". $cnt."筆\n"; close( FILE); $res=""; # 由值排序 foreach $value (sort{$ip{$a} <=> $ip{$b}} keys %ip ) { $res .= "$value \t $ip{$value}\n"; } open( FILE, "> outZ.txt") or die "$!"; print FILE $res; close( FILE);</file>
執行
範例
[6667.txt]總共判斷:26339筆
結果檔會存在同目錄的 outZ.txt 內容為 不重覆ip 出現的次數
116.59.225.152 1
115.80.253.111 1
42.76.216.236 1
101.12.10.105 1
36.239.22.52 1
39.14.142.67 1
211.74.251.120 1
140.117.129.114 2
111.254.207.26 2
....
220.137.29.80 48
1.160.218.72 53
101.10.2.206 63
36.231.68.8 66
116.59.225.14 68
111.248.105.126 69
114.24.70.61 105
1.160.230.199 233
程式相當的快,以上例26339筆不到0.1s就統計完畢,最後幾筆是可疑的流量。
原文 2013-08-06 13:41:00