udp端口掃描-報告_第1頁
udp端口掃描-報告_第2頁
udp端口掃描-報告_第3頁
udp端口掃描-報告_第4頁
udp端口掃描-報告_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、 網(wǎng)絡協(xié)議分析利用UDP進行主機端口掃描專 業(yè): 班 級: 姓 名: 學 號: 日 期: 目 錄1. 任務題目及要求11.1 任務簡介11.2 任務要求12. 課題成員及分工13. 相關知識簡介23.1 課題的背景及意義23.2 關鍵技術23.3 關鍵API函數(shù)33.3.1. WSAStarup函數(shù)33.3.2. WSACleanup函數(shù)33.3.3. socket函數(shù)33.3.4. closesocket函數(shù)43.3.5. sendto函數(shù)43.3.6. recvfrom函數(shù)43.3.7. bind函數(shù)44. 系統(tǒng)設計64.1 主要目標64.2 開發(fā)環(huán)境及工具64.3 功能模塊與系統(tǒng)結構65

2、. UDP掃描的實現(xiàn)85. 1 基本原理85.2 計算效驗和95.3 發(fā)送UDP數(shù)據(jù)包95.4 接收ICMP數(shù)據(jù)包106. UDP掃描檢測137. 心得體會14參 考 文 獻151. 任務題目及要求1.1 任務簡介 UDP是TCP/IP協(xié)議族偉傳輸層設計的兩個協(xié)議之一,它在進程與進程的通信過程中,提供了有限的差錯校驗功能,是一種無連接的,不可靠的協(xié)議。UDP在一個較低的水平上完成進程之間的通信,在收到分組的時候沒有流量控制機制也沒有確認機制,適用于可靠性比較高的局域網(wǎng)。由于UDP采用無連接的方式,因此協(xié)議簡單,在一些特定的應用中協(xié)議運行效率高。本次課程設計的目的主要是了解UDP協(xié)議的網(wǎng)絡傳輸過

3、程中的一些原理。1.2 任務要求編寫一個簡單的主機端口掃描程序,要求能夠探測目的主機的端口狀態(tài)。具體要求:(1)要求用戶可以在參數(shù)中輸入需要掃描的目的主機的IP地址與端口,輸出端口的狀態(tài)信息。(2)要求使用UDP協(xié)議進行端口的掃描過程。(3)有良好的編程規(guī)范與注釋信息。2. 課題成員及分工本課題組員:周均負責全部工作。3. 相關知識簡介3.1 課題的背景及意義網(wǎng)絡中每臺計算機猶如一座城堡,這些城堡中,有些是對外完全開放的,有些卻是大門緊閉的。入侵者們是如何找到,并打開它們的城門呢?這些城門究竟通向何處?在網(wǎng)絡中,把這些城堡的“城門”稱之為計算機的“端口”。端口掃描是入侵者搜索信息的幾種常用方法

4、之一,也正是這一種方法最容易暴露入侵者的身份和意圖。一般說來,掃描端口有以下目的:判斷目標主機上開放了哪些服務判斷目標主機的操作系統(tǒng)如果入侵者掌握了目標主機開放了哪些服務,運行何種操作系統(tǒng),他們就能使用相應的手段實現(xiàn)入侵。而如果管理員先掌握了這些端口服務的安全漏洞,就能采取有效的安全措施,防范相應的入侵。計算機信息網(wǎng)絡的發(fā)展加速了信息化時代的進程,但是隨著社會網(wǎng)絡化程度的增加,對計算機網(wǎng)絡的依賴也越來越大,網(wǎng)絡安全問題也日益明顯。端口掃描技術是發(fā)現(xiàn)安全問題的重要手段之一。一個端口就是一個潛在的通信通道,也就是一個入侵通道。對目標計算機進行端口掃描,能得到許多有用的信息。掃描器通過選用遠程TCP

5、/IP不同的端口的服務,并記錄目標給予的回答,通過這種方法,可以搜集到很多關于目標主機的各種有用的信息,從而發(fā)現(xiàn)目標機的某些內(nèi)在的弱點。3.2 關鍵技術UDP 是User Datagram Protocol的簡稱, 中文名是用戶數(shù)據(jù)包協(xié)議,是 OSI 參考模型中一種無連接的傳輸協(xié)議,提供面向事務的簡單不可靠信息傳送服務,IETF RFC 768是UDP的正式規(guī)范。在大多數(shù)情況下,當向一個未開放的UDP 端口發(fā)送數(shù)據(jù)時,其主機就會返回一個ICMP不可到達(ICMP PORT UNREACHABLE)的錯誤,因此大多數(shù)UDP 端口掃描的方法就是向各個被掃描的UDP 端口發(fā)送零字節(jié)的UDP 數(shù)據(jù)包,

6、如果收到一個ICMP 不可到達的回應,那么則認為這個端口是關閉的,對于沒有回應的端口則認為是開放的??墒怯捎诖蟛糠窒到y(tǒng)都限制了ICMP 差錯報文的產(chǎn)生速度,所以針對特定主機的UDP 大量端口掃描速度緩慢,此外由于UDP 協(xié)議和ICMP 協(xié)議都是不可靠協(xié)議,所以未收到回應可能由于數(shù)據(jù)包未送達造成,所以掃描程序需要針對同一端口多次嘗試后才能確定其狀態(tài)。3.3 關鍵API函數(shù)3.3.1. WSAStarup函數(shù)WSAStarup函數(shù)的格式如下:int WSAStarup(WORD wVersionRequested, LPWSADATA lpWSAData ); 程序在使用Socket之前必須使用W

7、SAStarup函數(shù)。該函數(shù)的第一個參數(shù)wVersionRequested:一個WORD(雙字節(jié))型數(shù)值,指定了應用程序需要使用的Winsock規(guī)范的最高版本 ;第二個參數(shù)lpWSAData: 指向WSADATA數(shù)據(jù)結構的指針,用來接收Windows Sockets實現(xiàn)的細節(jié)。函數(shù)執(zhí)行成功后返回0.3.3.2. WSACleanup函數(shù)WSACleanup函數(shù)的格式如下:int WSACleanup(void);程序在完成對請求的Socket庫的使用后,要調用WSACleanup函樹來解除與Socket庫的綁定并且釋放Socket庫所占用的系統(tǒng)資源。3.3.3. socket函數(shù)socket函

8、數(shù)格式為:socket(int af,int type,int protocol)第一個參數(shù)指定應用程序使用的通信協(xié)議的協(xié)議族,對于TCP/IP協(xié)議族,該參數(shù)置AF_INET; 第二個參數(shù)指定要創(chuàng)建的套接字類型,流套接字類型為SOCK_STREAM、數(shù)據(jù)報套接字類型為SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不適用某種特定的協(xié)議去封裝它,而是由程序自行處理數(shù)據(jù)包以及協(xié)議首部); 第三個參數(shù)指定應用程序所使用的通信協(xié)議,此參數(shù)可以指定單個協(xié)議系列中的不同傳輸協(xié)議,在Internet通訊域中,此參數(shù)一般取值為0,系統(tǒng)會根據(jù)套接字的類型決定應使用的傳輸層協(xié)議。3.3.4.

9、 closesocket函數(shù) closesocket函數(shù)的格式為:closesocket( SOCKET s); closesocket函數(shù)用來關閉一個描述符為s的套接字。如果發(fā)生錯誤,則closesocket()返回0;否則的話,返回SOCKET_ERROR錯誤 。3.3.5. sendto函數(shù)sendto函數(shù)的格式為:sendto( SOCKET s, const char FAR* buf, int len, int flags,const struct sockaddr FAR* to, int tolen); sendto函數(shù)用來向某個端口發(fā)送數(shù)據(jù)。s:一個標識套接口的描述字;buf

10、:包含待發(fā)送數(shù)據(jù)的緩沖區(qū);len:buf緩沖區(qū)中數(shù)據(jù)的長度;flags:調用方式標志位;to:(可選)指針,指向目的套接口的地址;tolen:to所指地址的長度 。3.3.6. recvfrom函數(shù)recvfrom函數(shù)的格式為:recvfrom(int s,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen) recvfrom函數(shù)用來接收返回的ICMP包。s:標識一個已連接套接口的描述字;buf:接收數(shù)據(jù)緩沖區(qū);len:緩沖區(qū)長度;flags:調用操作方式;from:(可選)指針,指向裝有源

11、地址的緩沖區(qū);fromlen:(可選)指針,指向from緩沖區(qū)長度值。3.3.7. bind函數(shù)bind函數(shù)的格式為:int bind( SOCKET s, const struct sockaddr FAR* name,int namelen) bind函數(shù)用來給socket綁定一個IP地址和一個特定的端口號。s:標識一未捆綁套接口的描述字;name:賦予套接口的地址;sockaddr結構定義如下: struct sockaddr u_short sa_family; char sa_data14; ; namelen:name名字的長度。4. 系統(tǒng)設計4.1 主要目標本程序主要實現(xiàn)了:UD

12、P掃描功能;能對單個指定的主機進行掃描或掃描指定網(wǎng)段內(nèi)的主機;能掃描特定的部分端口號或對指定的端口段內(nèi)的端口進行逐個掃描;4.2 開發(fā)環(huán)境及工具測試平臺:Windows XP Professional使用軟件:Visual C+ 6.0開發(fā)語言:C語言4.3 功能模塊與系統(tǒng)結構作為端口掃描程序,首先需要完成的功能就是對于系統(tǒng)操作系統(tǒng)的服務端口進行掃描,返回掃描結果。對于端口的掃描,包括對于本機系統(tǒng)服務端口,局域網(wǎng)內(nèi)目標機系統(tǒng),以及遠程IP的系統(tǒng)服務端口進行掃描。有些時候,用戶并不需要去掃描整個系統(tǒng)的所有端口,因為這樣的話不僅會浪費大量的時間,而且可能導致難以找到自己需要了解的端口的掃描結果。所

13、以,對于選擇性地對端口進行掃描也非常重要。這當然也是掃描程序需要實現(xiàn)的功能之一。用戶在等待掃描的時候,往往希望知道它的工作進度。這樣用戶可以更好地控制自己的操作。站在用戶的角度思考,設置進度是程序需要完成的,這樣就能知道程序掃描的進度。系統(tǒng)必須提供的服務是功能需求的基本,本著站在用戶角度思考的原則,做出如上敘述需求,從簡列舉如下:掃描功能;地址選擇功能;端口選擇功能;端口掃描程序功能模塊如下圖所示:圖1 系統(tǒng)功能模塊圖圖2 程序執(zhí)行流程圖5. UDP掃描的實現(xiàn)這種方法由于使用的是UDP協(xié)議。由于這個協(xié)議很簡單,所以掃描變得相對比較困難。這是由于打開的端口對掃描探測并不發(fā)送一個確認,關閉的端口也

14、并不需要發(fā)送一個錯誤數(shù)據(jù)包。幸運的是,許多主機在你向一個未打開的UDP端口發(fā)送一個數(shù)據(jù)包時,會返回一個ICMP_PORT_UNREACH錯誤。這樣就能發(fā)現(xiàn)哪個端口是關閉的。UDP和ICMP錯誤都不保證能到達,因此這種掃描就不那么可靠。而且這種掃描方法是很慢的,因為RFC對ICMP錯誤消息的產(chǎn)生速率做了規(guī)定,而且本程序的UDP掃描只支持單線程。5. 1 基本原理首先使用socket()函數(shù)創(chuàng)建套接字,再用bind()函數(shù)綁定套接字,然后向掃描的目的主機的目的端口發(fā)送UDP數(shù)據(jù)包,再等待目的主機的目的端口是否返回ICMP_PORT_UNREACH錯誤數(shù)據(jù)報,若收到返回的錯誤數(shù)據(jù)包,則說明該端口是關

15、閉著的,否則該端口是打開的,再將打開的端口保存進靜態(tài)數(shù)組中,以方便顯示結果。DoScanPort_UDP(LPVOID lp) / UDP port to scan sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if(bind(sockfd,(sockaddr *)&SOURCE_ADDR,sizeof(SOURCE_ADDR) = SOCKET_ERROR)if(retval = dlg.Send_UDPinfo(S_ADDRESS, inet_addr(D_ADDRESS), Source_Port, PortToScan) = SEN

16、D_FAULT) else if(retval = SEND_SET_ERROR)else if(retval = SEND_OK)if(retval=dlg.Get_ICMPinfo(sockfd,&DEST_ADDR)=1)str.Format(%d,PortToScan);showout_udp+=str+|;closesocket(sockfd);return 0;5.2 計算效驗和首先通過while循環(huán),將各位相加求和,若為奇數(shù)個字節(jié),則最后通過if循環(huán)將最后一個字節(jié)加完,再移位做位運算,最后取反得到效驗和,再返回給調用函數(shù)。/計算校驗和USHORT checksum(USHORT

17、*buffer, int size) unsigned long cksum = 0; while (size 1) cksum += *buffer+; size -= sizeof(USHORT); if (size) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum &0xffff); cksum += (cksum 16); return (USHORT)(cksum);5.3 發(fā)送UDP數(shù)據(jù)包先調用WSASocket()函數(shù)創(chuàng)建sock套接字,再調用setsockopt()函數(shù)設置套接字選項,再將UDP、IP頭部填充好,最后調

18、用sendto()函數(shù)將構造的數(shù)據(jù)包發(fā)送到目的IP地址的掃描的端口。/發(fā)送TCP協(xié)議數(shù)據(jù)/為了獨立性 協(xié)議的數(shù)據(jù)結構全部定義在內(nèi)部int SendUdpPacket(int Port, char *DestIp) if (sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED)=INVALID_SOCKET) if (Check_Ret = setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&FLAG,sizeof(FLAG) total_len,0,(struct

19、sockaddr *)&DEST_ADDR,sizeof(DEST_ADDR);closesocket(sock);return 0;5.4 接收ICMP數(shù)據(jù)包首先定義一個套接字集合,并將其清空,再把讀數(shù)據(jù)的套節(jié)字加入到套接字集合中,再通過select()函數(shù)檢查套節(jié)字是否可讀:1.如果沒有則返回1給主調函數(shù),表示沒有收到返回的ICMP_PORT_UNREACH錯誤數(shù)據(jù)報,則說明該端口是打開的。2.如果有可讀的套接字,就再通過FD_ISSET()函數(shù)檢查需要讀取的套接字是否在可讀的套接字集合中:(1)如果可讀的套接字中沒有需要讀取的套接字,則返回1給主調函數(shù),表示沒有收到返回的ICMP_POR

20、T_UNREACH錯誤數(shù)據(jù)報,則說明該端口是打開的。(2)如果可讀的套接字中有需要讀取的套接字,則調用recvfrom()函數(shù)從套接口上接收數(shù)據(jù),如果沒有數(shù)據(jù),則說明該套接口不是用來傳送數(shù)據(jù)的,則可以判斷為返回的ICMP_PORT_UNREACH錯誤數(shù)據(jù)報,則說明該端口是關閉的。/數(shù)據(jù)包解析/數(shù)據(jù)包解析int PacketUDPICMPAnalyzer(int Port, char *PacketBuffer) Ip_Header *pIpheader; int iProtocol, iTTL; char protocolstr100 = 0; char szSourceIP16, szDes

21、tIP16; SOCKADDR_IN saSource, saDest; pIpheader = (Ip_Header*)PacketBuffer; HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);/窗口緩沖區(qū)信息 CONSOLE_SCREEN_BUFFER_INFO bInfo;/獲取窗口緩沖區(qū)信息 GetConsoleScreenBufferInfo(hCon, &bInfo); iProtocol = pIpheader-Protocol;/check source IP saSource.sin_addr.s_addr = pIpheader

22、-SourceAddr; :strcpy(szSourceIP, inet_ntoa(saSource.sin_addr);/check dest ip saDest.sin_addr.s_addr = pIpheader-DestinationAddr; :strcpy(szDestIP, inet_ntoa(saDest.sin_addr);/ttl iTTL = pIpheader-TTL;/計算ip長度 int iIphLen = sizeof(unsigned long)*(pIpheader-Version_HLen &0x0f);/判斷是否是正確的返回數(shù)據(jù)包 if (pIphea

23、der-SourceAddr = inet_addr(DestIpAddr) /判斷是否是icmp協(xié)議數(shù)據(jù) if (iProtocol = IPPROTO_ICMP) /icmp頭部 Icmp_Header *icmp;/讀取icmp數(shù)據(jù) icmp = (Icmp_Header*)(PacketBuffer + sizeof(Ip_Header);/判斷是否是應答 if (icmp-i_type = 3) & (icmp-i_code = 3) /確定端口是關閉的 fprintf(output,Port %d Closen, Port);/返回1表示成功 return 1; else /端口開

24、放狀態(tài)未知 fprintf(output,Port %d Unknownn, Port); return 1; else if (iProtocol = IPPROTO_UDP) /如果返回的是udp報文,則端口是開放的 fprintf(output,Port %d Openn, Port);/能夠正確判斷 成功返回 return 1; else /既不是icmp數(shù)據(jù)包又不是udp數(shù)據(jù) 則表示不是想要的數(shù)據(jù)/返回錯誤 return 0; else /不是正確的返回數(shù)據(jù)包 return 0; /恢復原來的屬性 SetConsoleTextAttribute(hCon, bInfo.wAttrib

25、utes); return 1;6. UDP掃描檢測圖3 掃描結果圖由于UDP協(xié)議是非面向連接的,對UDP端口的探測也就不可能像TCP端口的探測那樣依賴于連接建立過程(不能使用telnet這種tcp協(xié)議類型命令),這也使得UDP端口掃描的可靠性不高。所以雖然UDP協(xié)議較之TCP協(xié)議顯得簡單,但是對UDP端口的掃描卻是相當困難的。下面具體介紹一下UDP掃描方案: 優(yōu)點:可以完成對UDP端口的探測。 缺點:需要系統(tǒng)管理員的權限。掃描結果的可靠性不高。因為當發(fā)出一個UDP數(shù)據(jù)報而沒有收到任何的應答時,有可能因為這個UDP端口是開放的,也有可能是因為這個數(shù)據(jù)報在傳輸過程中丟失了。另外,掃描的速度很慢。原因是在RFC1812的中對ICMP錯誤報文的生成速度做出了限制。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論