有點惱殘的我,身邊伴著一台小筆電。我覺得在機櫃上找太辛苦,不只要半蹲著(說到這...為什麼每個機櫃的螢幕高度都那麼適中,站著用太矮,坐著用太高),還要把頭伸進去,於是我就要求把他們的Log 資料夾複製一份給我。
我拿著我的小筆電開心的找著,不時會有公司裡的人走過來問我找到沒。一開始,我用Dreamweaver 來找,因為他裡面有個"搜尋整個資料夾原始碼"的功能,但可能因為附檔名(.log)的關係,一樣徒勞無功。我開始腦殘了...打開Notepad++
請你記住一句名言:人,要作有挑戰性的事;任何重複的事,就交給電腦做!!
我檢視了一下Log 的格式,發現:
2005-12-16 01:29:43 192.168.1.5 GET /Default.htm - 80 - 192.168.1.101 Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.1) 200 0 0
這是查詢/Default.htm 這個網頁的記錄檔,可以看到來源IP是192.168.1.101,使用的瀏覽器是IE6.0,作業統是XP(Windows NT 5.1)
2005-12-16 03:40:23 192.168.1.5 GET /Search.asp q=FUNction's%20Blog 80 - 192.168.1.102 Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.1;+SV1) 200 0 0
這裡多了一個"q=FUNction's%20Blog",是他的查詢字串,由於前一筆資料中沒有查詢字串,所以用一槓"-"代替
好了...這很有規律
- 檔案名稱以日期編號
- 來源IP 在每筆資料中第九個位置
- 瀏覽時間在每筆資料中的第二個位置
- 查詢字串在每筆資料中的第六個位置
找到這樣的規律,只要寫個簡單的程式,就可以把所有記錄當中查詢某個特定字串的IP找出來囉 ^__^ 由於小弟學藝不精,程式語言會的不多,剛好手上有環境(小筆電裡有Apache+PHP),就用現成的環境寫寫看。
以下列出程式碼,短短66 行:
<?php
$findStr = $_GET['q'];
$fileFolder = "C:/Windows/system32/LogFiles/W3SVC1/";
//這裡指定存放Log 的資料夾
$handle = opendir($fileFolder); //開啟資料夾
echo "<h1>Query String: ".$findStr."</h1>\n";
while ($filename = readdir($handle)) {
//依序將資料夾內每個元素(檔案、資料夾)名稱取得
$fullfilename = $fileFolder.$filename;
//組合成完整檔案路徑
if(is_file($fullfilename)){
//如果是檔案的話
$fd = fopen ($fullfilename, "r"); //開啟檔案
$contents = fread($fd, filesize($fullfilename));
//將所有資料傾印到變數$contents 裡
fclose($fd);
//關閉檔案
$times = substr_count($contents, $findStr);
//計算$contents 裡出現多少次要查詢的字串
if($times > 0){ //如果出現一個以上就要查詢他的IP
echo "<h3>".$filename."</h3>\n";
//輸出檔案名稱
getIISLogIp($contents, $findStr);
//列出該檔案中有查詢的IP
}
}
}
closedir($handle); //關閉資料夾
#讀取其中一日的記錄,標明哪些IP 有送出我們要追聰的查詢
function getIISLogIp($contents, $findStr){
$lineArr = explode("\r\n", $contents);
//使用換行切開檔案(每筆記錄一行)
$iptmp;
$output;
foreach($lineArr as $line){ //逐行檢查
$tmp = explode(" ", $line);
//使用空白" "切開每一行的資料
$time = $tmp[1]; //時間在第二個位置
if($tmp[8] != null){
$ip = $tmp[8]; //IP在第九個位置
$sub = strstr($tmp[5], $findStr);
//查詢字串在第六個位置
//strstr(文字, 查詢目標)
if($sub){//如果有找到
if($iptmp[$ip] == null){
//這裡是優化,如果這個IP 不是曾經查過的,則進行反解
$hostName = gethostbyaddr($ip);
//使用類似nslookup 查詢該IP的主機名稱
$iptmp[$ip] = $hostName;
//將該IP 為key ,把主機名稱存入優化陣列
$output[$ip] = $hostName." (".$ip.") - ".$time;
//建立要輸出字串
}else{
//如果曾經反解過,就不要在查了...反解超浪費時間
$output[$ip] .= ", ".$time;
//將時間接在輸出字串之後
}
}
}
}
//如果有輸出字串,則對輸出字串的ISP 做分析
if(sizeof($output) > 0) getISPColor($output);
}
#針對普遍的ISP,進行輸出變色
function getISPColor($ipArray){
echo "<ul>";
foreach($ipArray as $ipData){
if(strstr($ipData, "hinet")){
//中華電信為紅色
echo "<li><span style=\"background-color:#FF0000; color: #FFFFFF;\">".$ipData."</span></li>\n";
}elseif(strstr($ipData, "seed")){
//Seednet為綠色
echo "<li><span style=\"background-color:#00FF00;\">".$ipData."</span></li>\n";
}elseif(strstr($ipData, "giga")){
//Giga網路為藍色
echo "<li><span style=\"background-color:#0000FF;\">".$ipData."</span></li>\n";
}elseif(strstr($ipData, "tfn")){
//TFN網路為黃色
echo "<li><span style=\"background-color:#FFFF00;\">".$ipData."</span></li>\n";
}elseif(strstr($ipData, "apol")){
//亞太電信為亮藍色
echo "<li><span style=\"background-color:#00FFFF;\">".$ipData."</span></li>\n";
}elseif(strstr($ipData, "so-net")){
//So-Net為紫色
echo "<li><span style=\"background-color:#FF00FF;\">".$ipData."</span></li>\n";
}else{
echo "<li>".$ipData."</li>\n";
}
}
echo "</ul>";
}
?>
這隻程式可以檢查整個資料夾裡的IIS Log ,以"每日"為單位將當日送出某查詢字串的IP 與要求時間列出來,此外,還有將幾個主流的ISP 所提供的IP 標上顏色(例如中華電信是紅色),以方便閱讀。 但是...因為DNS反查非常的浪費時間...3XX MB的Log 檔配合8M/640的網路加上Intel 雙核心處理器會花將近20 分鐘執行的時間,所以如果Log 檔案多的時候,記得要先調整機器上的php.ini 喔。
程式執行結果:
查出IP 之後,就要去電信公司查該時段該IP的使用者是誰了,但是據說中華電信會保護顧客隱私,不一定會有結果...接下來已經不關我的事了,但是其實我也很想知道中華電信到底會不會給呢。經歷這件事,讓我覺得我還是比較喜歡當"系統工程師",雖然人家都說程式設計師比較有前途,但是系工還是比較有成就感啊!! :-)
下篇:某公司網站的駭客事件(三)
讀者回應 ( 4 意見 )
訂閱張貼留言 (Atom)
wow....u r really amazing.....
謝謝你:)
不過我也只會這些阿,唉... Q__Q
只在高中寫過一點點C語言程式...
只有前幾行和和面一點點看的懂
還有一些不能省略的符號...
其他,對我根本是張天書= =
你好神喔~
真的!!
感動耶 你居然去看程式碼><
光是這樣我就已經感謝萬分了...真的
我想應該沒多少人對這東西有興趣
謝謝你喔
張貼留言
如果沒有帳戶,建議使用「名稱/網址」留言喔^^