|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2003-06-02, 12:40 PM | #1 |
榮譽會員
|
代理獵手深度分析報告及欺騙手段
代理獵手是太陽風同志辛勤工作的成果,沒有太陽風一年多來的不斷耕耘,就沒有今天精彩的代理獵手,因此讓我們在文章的開始對太陽風同志表示真誠的問候!
首先要說的是以前我並沒用過該軟體,手頭的版本還是1998年出的1.1版。在寫作的後半段還是去下載了最新的2.8版。但結果還是一樣 --- 這篇文章的寫作目的是幫助ADM擺脫目前網上普遍存在的利用代理獵手進行的大量掃瞄活動。以及揭示了代理獵手的實現原理。由於手頭沒有關於代理伺服器的詳細資料,因此分析代理的實現花了較大的精力。希望在傳播本文時請盡量保持文章的完整性,謝謝! --- 代理獵手的實現: 由於沒有源碼,分析的開始使用的是netcat,利用它的hex dump 功能把獵手所發出的信息截獲。但netcat是一dos下的軟體,使用起來不太方便,於是又花了幾個小時寫了個for win的netcat.截獲的信息如下: 47 45 54 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6d # GET http://www.m 61 78 74 6f 72 2e 63 6f 6d 20 48 54 54 50 2f 31 # axtor.com HTTP/1 2e 31 0d 0a 48 6f 73 74 3a 20 77 77 77 2e 6d 61 # .1..Host: www.ma 78 74 6f 72 2e 63 6f 6d 0d 0a 41 63 63 65 70 74 # xtor.com..Accept 3a 20 2a 2f 2a 0d 0a 50 72 61 67 6d 61 3a 20 6e # : */*..Pragma: n 6f 2d 63 61 63 68 65 0d 0a 55 73 65 72 2d 41 67 # o-cache..User-Ag 65 6e 74 3a 20 50 72 6f 78 79 48 75 6e 74 65 72 # ent: ProxyHunter 31 2e 30 0d 0a 0d 0a # 1.0.... 基本上我們就知道了獵手對於server所發出的信息: GET htttp://www.maxor.com HTTP/1.1 Host: www.maxtor.com Accept: */* Pragma: no-cache User-Agent: ProxyHunter 1.0 也就是說,在發出了這樣一個指令序列後,如果對方是proxy server的話,獵手就會收到www.maxtor.com 的首頁,然後下來的應該是在主頁中搜尋預先定義在獵手中的KEYWORD,如果為真,則目標是代理伺服器,並且免費。於是我猜想如果直接的發KEYWORD給它,會不會通過它的檢驗了?答案是:ON!,不得以,只好上網(這個月的上網時間早已透支:)架上sniffer,找上一個真的代理,然後再找一個有限制的,測試完後趕緊斷開連接。下面是真代理伺服器的log: ------------------------------------------------- HTTP/1.1 200 OK Server: Microsoft-IIS/4.0 Content-location: http://www.maxtor.com/default.htm Date: Tue, 04 May 1999 04:53:14 GMT Content-type: text/html Accept-ranges: bytes Last-modified: Wed, 28 Apr 1999 16:42:38 GMT Etag: "cf6f51f9691be1:105fb" Content-length: 8558 Content-location: http://www.maxtor.com/default.htm Etag: "cf6f51f9691be1:105fb" Accept-ranges: bytes 快取-last-checked: Tuesday, 04-May-99 04:15:50 GMT Proxy-agent: Netscape-Proxy/2.5 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Maxtor Corporation - Creative Solutions for Information Storage</title> ------------------------------------------------------------------------- 肯定它還檢查了另外的特徵傳,但沒有什麼好的辦法,只好一個一個的試了。添入第一行,「HTTP/1.1 200 OK" 加上KEYWORD 一起發給獵手,OK!!! 通過了檢驗。看來獵手只是檢查了二個地方。(可能是為了加快速度)進一步的實驗表明,獵手檢查的方式如下: "HTTP/1.1 200"+WORDKEY (特徵傳) 也就是說,只要在連接是,你發給它以上的字串傳,獵手接受後就會認為驗證成功,至此我們已經找到了欺騙獵手從而通過驗證的方法。 而在驗證有限制的代理是LOG如下: ----- HTTP/1.1 404 ERROR ....... ----- 進一步的研究表明,僅發出"HTTP/1.1 404"的字串傳就可以欺騙從而通過驗證,獵手顯示」要密碼「 :) --- 2.8版的獵手中還增加的對socks的驗證, 但結果同上:) --- 至此,我們應該可以從分析的結果中找到代理的實現方法了,剩下就是通程序序來證明之。 但還有兩個方面值得注意: 1。在上面的第一個log中,我附帶了16進制的轉換, 這很重要!!早先我就是沒有仔細檢視它,走了很長的彎路。 請注意字串傳之間的分格符,"0x0d 0x0a"也就是c 中的」\n";行了嗎?且慢,最重要的 就是最後的8bits!!!!!!!!! "0x0d 0x0a 0x0d 0x0a" 連續的兩個"\n\n",當初我就是沒有看到它,始終得不到正確的答案。 (在程序通不過測試後,我只好手動的找尋答案也不行,最後再看了一邊log,才發現問題所在, 就像 linux 中 mail 指令以一個Enter鍵加上一個點代表信箋的結束一樣,send代理指令是 以連續的兩個Enter鍵結束. 下面是代理獵手的gnuC 實現,注意,本程序只是解釋了代理獵手的實現程序,沒有多IP 的掃瞄功能。 test on slackware 2.0.33 ---Cut Here---------------------------------------- /* this codez describe how to search a PROXY server * * by * * zer9 * ==== * zer9@21cn.com * * test on slackware 2.0.33 * cc proxyht.c -o proxyht.c */ #include <stdio.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <netdb.h> #include <sys/socket.h> #include <signal.h> #define DefaultProxyPort 8080 //default proxy port 8080 #define MSG1 "GET http://www.maxtor.com HTTP/1.1\n" //1 --change (1,2) #define MSG2 "Host: www.maxtor.com\n" //2 to search #define MSG3 "Accept: */*\n" // other site #define MSG4 "Pragma: no-cache\n" #define MSG5 "User-Agent: ProxyHT 0.01\n\n" #define KEYWORD "Maxtor Corp" // this is keyword #define TIMEOUT 30 void alarm_handler(int w) { alarm(0); printf("Time Out!\n"); } int main(int argc,char *argv[]) { struct in_addr Target; struct hostent *he; struct sockaddr_in sin; int s,ProxyPort; char recvbuf1[5000]; char recvbuf2[10000]; if(argc==2) ProxyPort=DefaultProxyPort; else if(argc==3) ProxyPort=atoi(argv[2]); else { printf("ProxyHT 0.01 by zer9 mail:zer9@21cn.com\n"); printf("usage: %s <proxy> [proxy_port]\n",argv[0]); return 0; } if((he=gethostbyname(argv[1]))!=NULL) bcopy(he->h_addr,(char *)&Target.s_addr,he->h_length); else Target.s_addr=inet_addr(argv[1]); if(Target.s_addr==-1) { perror("gethostbyname"); return -1; } printf("ProxyHT 0.01 by zer9 mail:zer9@21cn.com\n"); if((s=socket(AF_INET,SOCK_STREAM,0))<0) { perror("socket"); return -1; } sin.sin_family=AF_INET; sin.sin_port=htons(ProxyPort); sin.sin_addr.s_addr=Target.s_addr; if(connect(s,(struct sockaddr*)&sin,sizeof(sin))<0) { perror("connect"); return -1; } bzero(recvbuf1,sizeof(recvbuf1)); bzero(recvbuf2,sizeof(recvbuf2)); printf("%s start verifying... waiting a while please\n",argv[1]); signal(SIGALRM,alarm_handler); send(s,MSG1,strlen(MSG1),0); send(s,MSG2,strlen(MSG2),0); send(s,MSG3,strlen(MSG3),0); send(s,MSG4,strlen(MSG4),0); send(s,MSG5,strlen(MSG5),0); alarm(TIMEOUT); recv(s,recvbuf1,sizeof(recvbuf1),0); recv(s,recvbuf2,sizeof(recvbuf2),0); alarm(0); //if u want to debug , open follow two lines //printf("%s\n",recvbuf1); //printf("%s\n",recvbuf2); if(strstr(recvbuf1,"HTTP/1.1 200")) { if(strstr(recvbuf2,KEYWORD)) { printf("hahaha... there's something found! \n"); close(s); return 0; } } else { if(strstr(recvbuf1,"HTTP/1.1 404")) { printf("woo! I found one,but dont free...\n"); close(s); return 0; } } close(s); printf("sorry.dont hit me please,nexttime i *MUST* find one.\n"); return 0; } ---Cut Here-------------------------------------------------- ------------------ 代理獵手欺騙的實現: 一把槍在好人手上可以救人,但落在了壞人手上就。。。:) 代理獵手就是這樣的槍。 除開大量的利用獵手進行掃瞄而獲得非法的服務之後,近來還有不少人專門利用獵手多線程的特點找尋特定的連接阜(如finger(79),31337(BO),12345(BO).....在極有可能造成各種破壞性結果的同時,還佔用了大量的帶寬;使得網上的正常活動都受到的影響(反正我是非常的不爽啦:) (如何對付這些「好奇心非常強」的同志了?是給他們 [A].一個小小的教訓; 還是 .只讓他們空喜歡一場? 下面就是一個linux (gcc) 的Anti-Porxyht 的實現,本來win95 下的我還先做出來,但不好貼上來,而且也不利於大家的理解。總的說來,非阻塞模式的socket(win95)在寫daemon時要比阻塞模式下的socket(BSD4.3)容易的多,在win95下可以毫不費力的同時監聽多個port,而linux下則只有 以下幾個選項:1.多線程 2.截獲每個IP包,然後再根據包裡的PORT進行處理; 3.同時啟動多個副本:) 4.我就不知到了。。。 1&&2 我都不會,只好用3了。:) 不過一般只要listen to port 8080 就可以了,因為不論獵手怎麼掃,8080都不放過的。 同上面的一樣,本程序也只是為了向你展示如何欺騙獵手從而通過獵手的驗證,並沒有多餘的功能,在以後我可能會加上.在寫本軟體的同時我還花了一段時間測試看獵手是否有overflow 的弱點,在向他發字串傳時大小 <=256 我都測了, 好像有一次看現象應該是CPU load 100%,可能是我的愛機太「快」的問題,其餘(20-30次都沒有異常。可能與獵手是用 c++ 寫的用關,c++的串類很少有可能發生此類情況(overflow).如果你測試能夠通過發送某個字串串讓獵手當機,請告訴我喲!:) 儘管是這樣,你還是可以加上某個win95&win97&win98的漏洞,在 accept(ns,....) 後傳給對方。。。。。。:) (最好是先讓它通過檢驗,讓對方正「無比」高興的時候發給他:)))))))(怎麼一提到這上面我的興趣就來了;) test on slackware 2.0.33(maybe irix6.4) ./phs 8080 --> 表示監聽 8080連接阜,在遭掃瞄後欺騙對方通過 獵手的驗證 (顯示 :free ./phs -n 8080 --> 表示監聽8080連接阜,在遭掃瞄後欺騙對方通過 獵手的驗證 (顯示: 需密碼:) 同樣的,該程序的win95版我也寫出,可以監聽多個連接阜, 只是兄弟我一沒主頁,二沒ftp,也就無法共享了。 ---Cut Here------------------------------------------ /* Pr0xy_Spoofer (m4yb3 c4ll 1t: Anti-ProxyHunt * by zer9 * mail:zer9@21cn.com * pass on slackware2.0.33 * cc phs.c -o phs * usage: ./phs <-n> port & */ #include <stdio.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <signal.h> #include <sys/socket.h> #define MSG_OK "HTTP/1.1 200\n" #define MSG_NOFREE "HTTP/1.1 404\n" //u can join that u think the target for searching to use the keyword; #define MSG "yahoo china usa Maxtor Corp nease sohoo sina\ sina lycos cpcw 263 163 169 zg169 s3 \ \n" #define TIMEOUT 30 #define true 1 #define false 0 void alarm_handler(int w) { alarm(0); } void usage(void) { printf("Pr0xyHunt Sp00fer 0.01 by zer9 mail:zer9@21cn.com\n"); printf("usagehs -n [bindport] \n"); } int main(int argc,char *argv[]) { struct sockaddr_in server,client; int s,ns,clientlen,BindPort; int NO_FREE; char recvbuf[3000]; if(argc==1||argc>3) { usage(); return 0; } if(argc==2) { NO_FREE=false; if(!(BindPort=atoi(argv[1]))) { usage(); return -1; } } if(argc==3) if(strcmp(argv[1],"n")) { NO_FREE=true; if(!(BindPort=atoi(argv[2]))) { usage(); return -1; } } if((s=socket(AF_INET,SOCK_STREAM,0))<0) { perror("socket"); return -1; } bzero((char *)&server,sizeof(server)); bzero((char *)&client,sizeof(client)); bzero(recvbuf,sizeof(recvbuf)); server.sin_family=AF_INET; server.sin_port=htons(BindPort); server.sin_addr.s_addr=INADDR_ANY; if(bind(s,(struct sockaddr *)&server,sizeof(server))<0) { perror("bind"); return -1; } if(listen(s,5)!=0) { perror("listen"); return -1; } while(1) { clientlen=sizeof(client); if((ns=accept(s,(struct sockaddr *)&client,&clientlen))<0) { perror("accept"); close(s); return -1; } signal(SIGALRM,alarm_handler); alarm(TIMEOUT); recv(ns,recvbuf,sizeof(recvbuf),0); sleep(1); //if MSG_OK to MSG_FREE->something on proxyhunt: no free if(!NO_FREE) send(ns,MSG_OK,strlen(MSG_OK),0); else send(ns,MSG_NOFREE,strlen(MSG_OK),0); sleep(1); send(ns,MSG,strlen(MSG),0); alarm(0); close(ns); } close(s); close(ns); return 0; } ---Cut Here------------------------------------------------- 看完這段源程,有的讀者可能會問:獵手可以選項不同的字串傳 來驗證,我怎麼知道他會向那個網址發送信息,同時他手頭的 KEYWORD 是什麼了?ohhh,u're g00d b0y:)這個問題很關鍵, 測試表明,如果你發給獵手的字串傳中沒有KEYWORD 的話 (但打頭是"HTTP/1.1 200") ,獵手會顯示「超時」,如果連"HTTP/1.1 200"都沒有,只送一個 空字串傳,獵手顯示「無特徵串」,送亂串顯示「非proxy". 那我們如何解決KEYWORD的問題了?由於我們是伺服器方,因此 主動權在我們手中;有兩個方法: 1,構建一個大型資料庫,如上面程序中的 MSG 字串串,把 著名的主頁的TITLE都加入其中,我想只要包含有該廠商名字的串就可以了; 2。從對方發來的請求代理的指令中過濾出www.xxxx.xxx,再又發給它,這可通程序序來實現。最好是加上"Corp", "INC. ","LTD."...之類的通用串, (如果你猜密碼比較在行的話,這應該不成問題:) 1。2 不相矛盾,可結合使用。不過還有一種方法:(紙上談兵:) 如果遭攻擊時你在場,先發給他一個超時的(或需密碼的)信息,一般(我想)對方都會第二次來驗證的,這期間「跑去」真正的網站然後在第二次掃瞄時把真正的KEYWORD發給他。(再次申明:紙上談兵;) ----- 到此為止,這篇文章就要 over 了,衷心希望太陽風同志在看到這篇文章後能把獵手做得更加完美。 ---------- 這篇文章應該屬於入侵欺騙吧,或者屬於揭示軟體bug的那一類,不管怎樣劃分,我總算是為大家做了點貢獻了。」很久「以前就打算寫一個關於入侵欺騙的軟體,在遭到掃瞄時(不是獵手這樣的,而是nuess,sscan,...之類的scanner)遇到21port的連接請求時發一個仿wuftp 的界面給它。。。。。不過那時我還在linux下,多連接阜的監聽我還不會,最近轉到了c++builder門下, 發現可以輕而一舉的實現之,想一想,選〔A] 時整個win95在外部看來就是一個linux (redhat 5.2 apolllo)(對方肯定會用那個wuftp remote of 拚命的試:) is slackware 2.0.35 [C] is SUNOS 5.5 [D] is ..... ha....夠酷吧:)遇到finger @@localhost 時發個超大的passwd給它:)最好連shadow也一起發給他,讓他自個樂去吧!:)ohh,對了,再加上一個[E]bsd 0.0.18那祖傳3代的歷史書都要翻出來了:)))))) 任憑那些hacker(初級)用盡腦漿也想不到我這是一台win95.這個獵手欺騙只不過是嘗試一下,說不定幾天後就會有人(maybe me)寫出BO_SPoof,netspy_spoof...別忘了給我一份: |
送花文章: 3,
|