H2003031282_基于半打開的端口掃描技術(shù)的實(shí)現(xiàn)_第1頁
H2003031282_基于半打開的端口掃描技術(shù)的實(shí)現(xiàn)_第2頁
H2003031282_基于半打開的端口掃描技術(shù)的實(shí)現(xiàn)_第3頁
H2003031282_基于半打開的端口掃描技術(shù)的實(shí)現(xiàn)_第4頁
H2003031282_基于半打開的端口掃描技術(shù)的實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、基于半打開的端口掃描技術(shù)的實(shí)現(xiàn) 摘 要 隨著互聯(lián)網(wǎng)的飛速發(fā)展,網(wǎng)絡(luò)入侵行為日益嚴(yán)重,網(wǎng)絡(luò)安全日益成為人們關(guān) 注的焦點(diǎn)。端口掃描技術(shù)是網(wǎng)絡(luò)安全掃描技術(shù)的重要技術(shù)之一。對(duì)目標(biāo)系統(tǒng)進(jìn)行 端口掃描,是網(wǎng)絡(luò)系統(tǒng)入侵者進(jìn)入目標(biāo)系統(tǒng)的第一步。本文對(duì)端口掃描技術(shù)的原 理和應(yīng)用進(jìn)行了闡述,并設(shè)計(jì)了一個(gè)簡(jiǎn)單的基于windows平臺(tái)上的端口掃描系統(tǒng)。 在論文中介紹了半打開掃描中的SYN探測(cè)技術(shù),分析了這種掃描技術(shù)實(shí)現(xiàn)的原理 和特點(diǎn)。實(shí)際設(shè)計(jì)中采用了掃描安全性和可行性較好的SYN探測(cè)技術(shù)來實(shí)現(xiàn)端口 掃描,并實(shí)現(xiàn)了端口列表自定義,掃描結(jié)果存儲(chǔ)等幾大模塊化功能。最后結(jié)合當(dāng) 前的實(shí)際情況對(duì)端口掃描的未來發(fā)展方向提出了一點(diǎn)個(gè)

2、人的看法。 關(guān)鍵詞:網(wǎng)絡(luò)安全;端口掃描;SYN 探測(cè) The Implementation of a Port-scanning Program Based on Semi-opened Port Technology Abstract With the quick development of the internet, network intrusion behavior becomes more and more serious; Network security becomes the focus which people pay attention to. Port-Scanning

3、 Technology is one of the most important technologies of the safe scanning on internet. The first step that network system intruders enter the target system is the port scanning of the system. This essay explains the principle and application of the port scanning technology, and then designs a simpl

4、e port-scan system which bases on the Windows platform. The paper introduces the SYN probe technology of the semi-open scan technologies, analyzes its implementing principle, approach and characters. In the real design it use the SYN probe technology which has a better scanning security and feasibil

5、ity to achieve the Port Scanning, then realize user-defined port list function, recording of the scanning result, and some other functional modules. At last, combined with the nowadays actual situation, the paper brings a few personal minds for the future direction of the development of the Port-Sca

6、nning. Key words: Network security;Port scanning;SYN probe 目 錄 論文總頁數(shù):22 頁 引言 . 1 1.1 端口掃描概述 . 1 1.2 端口掃描技術(shù)的國(guó)內(nèi)外研究現(xiàn)狀. 1 1.3 端口掃描原理 . 1 1.4 端口掃描技術(shù)概要 . 2 1.5 SYN 技術(shù)詳解 . 3 1.5.1 TCP 包探測(cè)原理 . 3 1.5.2 SYN 包探測(cè) . 4 1.5.3 分組時(shí)延 . 4 1.6 端口掃描實(shí)現(xiàn)方法 . 4 需求分析 . 4 2.1 端口掃描器的總體要求. 4 2.1.1 設(shè)計(jì)背景 . 4 2.1.2 用戶特點(diǎn) . 4 2.1.3

7、軟件開發(fā)及運(yùn)行環(huán)境. 5 2.2 端口掃描器的需求分析. 5 端口掃描器的實(shí)現(xiàn) . 5 3.1 功能模塊簡(jiǎn)介 . 5 3.2 程序?qū)崿F(xiàn)流程 . 6 3.3 SYN 探測(cè)的實(shí)現(xiàn) . 6 3.4 端口掃描功能模塊 . 15 3.4.1 端口選擇模塊 . 15 3.4.2 目標(biāo) IP 選取模塊. 16 3.4.3 終止掃描 . 17 3.4.4 掃描結(jié)果存儲(chǔ)模塊. 17 測(cè)試環(huán)境及結(jié)果 . 18 4.1 硬件環(huán)境 . 18 4.2 軟件環(huán)境 . 18 4.3 測(cè)試結(jié)果 . 18 端口掃描技術(shù)的發(fā)展方向和趨勢(shì). 19 論 . 19 1 2 3 4 5 結(jié) 參考文獻(xiàn) . 20 致 聲 謝 . 21 明

8、. 22 1 引言 1.1 端口掃描概述 網(wǎng)絡(luò)安全探測(cè)在網(wǎng)絡(luò)安全中起著主動(dòng)防御的作用,占有非常重要的地位。 網(wǎng)絡(luò)安全探測(cè)的所有功能都是建立在端口掃描的基礎(chǔ)上,所以對(duì)端口掃描技術(shù) 的研究有著非常重要的現(xiàn)實(shí)意義。 每一個(gè)網(wǎng)絡(luò)主機(jī)都相當(dāng)于一個(gè)"房間",黑客能否進(jìn)入"房間",取決于是否 發(fā)現(xiàn)了打開的"門窗"。也就是說,能否入侵網(wǎng)絡(luò)主機(jī),或者網(wǎng)絡(luò)主機(jī)是否安全, 關(guān)鍵在于能否查出網(wǎng)絡(luò)主機(jī)的系統(tǒng)信息。而端口是主機(jī)與外界通訊交流的數(shù)據(jù) 出入口,即是"門窗"。端口分為硬件端口和軟件端口,所謂硬件端口又稱為接 口,包括:USB 端口、

9、串行端口、并行端口等。軟件端口一般指網(wǎng)絡(luò)中面向連 接服務(wù)(TCP)和無連接服務(wù)(UDP)的通訊協(xié)議的端口。一個(gè)端口就是一個(gè)潛在的 通信通道,也就是一個(gè)入侵通道。對(duì)目標(biāo)計(jì)算機(jī)進(jìn)行端口掃描,能得到許多有 用的信息。通過端口掃描,發(fā)現(xiàn)系統(tǒng)的安全漏洞。它使系統(tǒng)用戶了解系統(tǒng)目前 向外界提供了哪些服務(wù),從而為系統(tǒng)用戶管理網(wǎng)絡(luò)提供了一種手段。 1.2 端口掃描技術(shù)的國(guó)內(nèi)外研究現(xiàn)狀 網(wǎng)絡(luò)的安全狀況取決于網(wǎng)絡(luò)中最薄弱的環(huán)節(jié),任何疏忽都可能引入不安全 的因素,最有效的方法是定期對(duì)網(wǎng)絡(luò)系統(tǒng)進(jìn)行安全性分析,及時(shí)發(fā)現(xiàn)并修正存 在的脆弱性,保證系統(tǒng)的安全。 國(guó)外安全掃描技術(shù)的歷史可以追溯到 20 世紀(jì) 90 年代,當(dāng)時(shí)因

10、特網(wǎng)剛剛起 步,但是在過去的十多年內(nèi),掃描技術(shù)飛速發(fā)展,迄今為止,其掃描技術(shù)己經(jīng) 非常完善,但是在全面性、隱蔽性和智能性上還有待提高。而安全掃描器從最 初專門為 UNIX 系統(tǒng)而編寫的一些只有簡(jiǎn)單功能的小程序發(fā)展到現(xiàn)在,己經(jīng)出 現(xiàn)了可以運(yùn)行在多個(gè)操作系統(tǒng)平臺(tái)上的、具有復(fù)雜功能的系統(tǒng)程序。 國(guó)內(nèi)的掃描技術(shù)是在國(guó)外掃描器基礎(chǔ)上發(fā)展起來的。其中有些專門從事安 全技術(shù)的公司包括綠盟科技、啟明星辰等等。這些公司的掃描器以硬件為主, 其特點(diǎn)是執(zhí)行速度快,不像軟件一樣受到安裝主機(jī)系統(tǒng)性能的限制。 然而對(duì)于更多的基于主機(jī)的端口掃描器而言,簡(jiǎn)單、實(shí)用、可靠才是它們 的長(zhǎng)處。 1.3 端口掃描原理 端口掃描通常指

11、用同一個(gè)信息對(duì)目標(biāo)主機(jī)的所有需要掃描的端口進(jìn)行發(fā)送 探測(cè)數(shù)據(jù)包即掃描,然后,根據(jù)返回端口的狀態(tài)來分析目標(biāo)主機(jī)端口是否打開, 是否可用。端口掃描通過與目標(biāo)主機(jī)的 TCP/IP 端口建立連接并請(qǐng)求某些服務(wù), 記錄目標(biāo)主機(jī)的應(yīng)答,收集目標(biāo)主機(jī)相關(guān)信息,從而發(fā)現(xiàn)目標(biāo)主機(jī)某些內(nèi)在的 第 頁 共 22 頁 1 安全弱點(diǎn),并且確定該端口什么服務(wù)正在進(jìn)行并獲取該服務(wù)的信息。端口掃描 也可以通過捕獲本地主機(jī)或服務(wù)器的流入流出 IP 數(shù)據(jù)包來監(jiān)視本地主機(jī)的運(yùn) 行情況,它僅能對(duì)接收到的數(shù)據(jù)進(jìn)行分析,幫助我們發(fā)現(xiàn)目標(biāo)主機(jī)的某些內(nèi)在 的弱點(diǎn),而不會(huì)提供進(jìn)入一個(gè)系統(tǒng)的詳細(xì)步驟。 1.4 端口掃描技術(shù)概要 端口掃描途徑主要

12、是掃描器。掃描器是一種自動(dòng)檢測(cè)遠(yuǎn)程或本地主機(jī)安全 性弱點(diǎn)的程序,通過使用掃描器可以不留痕跡的發(fā)現(xiàn)遠(yuǎn)程服務(wù)器的各種 TCP 端 口的分配及提供的服務(wù)和它們的軟件版本。這就能讓我們間接的或直觀的了解 到遠(yuǎn)程主機(jī)所存在的安全問題。 掃描器通過選用遠(yuǎn)程 TCP/IP 不同的端口的服務(wù),并記錄目標(biāo)給予的回答, 通過這種方法,可以搜集到很多關(guān)于目標(biāo)主機(jī)的各種有用的信息。掃描器有三 項(xiàng)功能:發(fā)現(xiàn)一個(gè)主機(jī)或網(wǎng)絡(luò)的能力;一旦發(fā)現(xiàn)一臺(tái)主機(jī),有發(fā)現(xiàn)什么服務(wù)正 運(yùn)行在這臺(tái)主機(jī)上的能力;通過測(cè)試這些服務(wù),發(fā)現(xiàn)漏洞的能力。 為了理解掃描以及它的工作原理,首先應(yīng)對(duì) TCP 的三次握手機(jī)制有所了解。 TCP 的報(bào)頭包含一個(gè)序

13、列號(hào)和一些起著特殊作用的標(biāo)記位。這里僅提到其中的 四個(gè)標(biāo)記位:SYN(同步),ACK(確認(rèn)),RST(復(fù)位)和 FIN(完成)。它們四個(gè)的作 用與這里討論的主題密切相關(guān)。 當(dāng)系統(tǒng)間建立連接和釋放連接時(shí),就會(huì)用到所謂的握手機(jī)制。本文中所提 到的連接均指的是發(fā)生在兩個(gè) IP 地址間,有一定的端口號(hào)的連接。 它的工作原理大致如下:握手的第一步,一臺(tái)計(jì)算機(jī)首先請(qǐng)求和另外一臺(tái) 計(jì)算機(jī)建立連接,它通過發(fā)送一個(gè) SYN 請(qǐng)求來完成,也即前面提到的 SYN 標(biāo) 記位置位。兩臺(tái)計(jì)算機(jī)間每條信息都有一個(gè)由發(fā)送方產(chǎn)生的序列號(hào),序列號(hào)的 使用使得雙方知道他們之間是同步的,而且還可以起到丟失信息時(shí)或接收順序 錯(cuò)誤時(shí)發(fā)送

14、警告信息的作用。 握手的第二步,接收到 SYN 請(qǐng)求的計(jì)算機(jī)響應(yīng)發(fā)送來的序列號(hào),它會(huì)將 ACK 標(biāo)記位置位,同時(shí)它也提供自己的序列號(hào)。到現(xiàn)在為止,發(fā)起連接建立請(qǐng) 求的計(jì)算機(jī)認(rèn)為連接已經(jīng)建立起來,然而對(duì)方卻并不這樣認(rèn)為,對(duì)方還要等到 它自己的序列號(hào)有了應(yīng)答后才能確認(rèn)連接建立起來。因此現(xiàn)在的狀態(tài)稱為"半連 接"。如果發(fā)起連接請(qǐng)求的計(jì)算機(jī)不對(duì)收到的序列號(hào)做出應(yīng)答,那么這個(gè)連接就 永遠(yuǎn)也建立不起來,而正因?yàn)闆]有建立連接,所以系統(tǒng)也不會(huì)對(duì)這次連接做任 何記錄。 握手的第三步,發(fā)起連接請(qǐng)求的計(jì)算機(jī)對(duì)收到的序列號(hào)作出應(yīng)答,這樣, 兩臺(tái)計(jì)算機(jī)之間的連接才算建立起來。 兩臺(tái)計(jì)算機(jī)釋放連接時(shí)的

15、情況與此類似:當(dāng)一臺(tái)計(jì)算機(jī)說沒有更多的數(shù)據(jù) 第 頁 共 22 頁 2 需要發(fā)送了,它發(fā)送一個(gè) FIN 信號(hào)(將 FIN 標(biāo)記位置位)通知另一端,接收到 FIN 的另一端計(jì)算機(jī)可能發(fā)送完了數(shù)據(jù),也可能沒發(fā)送完,但它會(huì)對(duì)此作出應(yīng)答, 而當(dāng)它真正完成所有需要發(fā)送的數(shù)據(jù)后,它會(huì)再發(fā)送一個(gè)自己的 FIN 信號(hào),等 對(duì)方對(duì)此作出應(yīng)答后,連接才徹底解除。 1.5 SYN 技術(shù)詳解 1.5.1 TCP 包探測(cè)原理 高效的探測(cè)方法需要解決 3 個(gè)問題:(1)用幾個(gè)包判斷主機(jī)和端口狀態(tài);(2) 占用雙方的資源少;(3)準(zhǔn)確的分組時(shí)延計(jì)算方法。如果不建立完整的 TCP 連接, 直接用 TCP 包來檢測(cè) TCP 應(yīng)用

16、服務(wù)端口的狀態(tài),會(huì)有效地提高探測(cè)效率和準(zhǔn) 確性。對(duì)于問題(1)和(2),可以借鑒 TCP 端口掃描技術(shù),發(fā)送特殊 TCP 包解決。 對(duì)于問題(3),可以在仿照 Ping 的方式在 TCP 某些字段或選項(xiàng)中嵌入時(shí)間戳來 解決。 TCP 端口掃描技術(shù)通過發(fā)送一些特殊的 TCP 包判斷目標(biāo)主機(jī)和端口狀態(tài)。 端口掃描通過掃描目標(biāo)主機(jī)的大量端口,發(fā)現(xiàn)系統(tǒng)的漏洞。而服務(wù)器的地址和 端口一般都是公開的,如果只探測(cè)服務(wù)器的工作端口,不用探測(cè)其余的端口, 可以向工作端口發(fā)送特殊的 TCP 包,根據(jù)返回包判斷目標(biāo)狀態(tài)。絕大多數(shù) TCP/IP 協(xié)議棧的實(shí)現(xiàn)遵循以下原則: (1)當(dāng)一個(gè) SYN 或者 FIN 數(shù)據(jù)包到

17、達(dá)一個(gè)關(guān)閉的端口,TCP 丟棄數(shù)據(jù)包同 時(shí)發(fā)送一個(gè) RST 數(shù)據(jù)包。 (2)當(dāng)一個(gè)包含 ACK 的數(shù)據(jù)包到達(dá)一個(gè)監(jiān)聽端口時(shí),數(shù)據(jù)包被丟棄,同時(shí) 發(fā)送一個(gè) RST 數(shù)據(jù)包。 (3)當(dāng)一個(gè) SYN 數(shù)據(jù)包到達(dá)一個(gè)監(jiān)聽端口時(shí),正常的三階段握手繼續(xù),回 答一個(gè) SYN|ACK 數(shù)據(jù)包。 (4)當(dāng)一個(gè) FIN 數(shù)據(jù)包到達(dá)一個(gè)監(jiān)聽端口時(shí),數(shù)據(jù)包被丟棄。"FIN 行為"(關(guān) 閉的端口返回 RST,監(jiān)聽端口丟棄包),在 URG 和 PSH 標(biāo)志位置位時(shí)同樣要發(fā) 生。所有的 URG,PSH 和 FIN,或者沒有任何標(biāo)記的 TCP 數(shù)據(jù)包都會(huì)引起"FIN 行為"。一般 TC

18、P 端口掃描根據(jù)以上方式的發(fā)包收包來判斷主機(jī)與端口狀態(tài)。 因?yàn)?FIN 包不能直接探測(cè)監(jiān)聽端口,所以通常選擇使用 SYN 包或 ACK 包探測(cè) 監(jiān)聽端口。一些防火墻出于安全的考慮,將發(fā)現(xiàn)和攔截 ACK 與 FIN 探測(cè)包, 但不會(huì)攔截 SYN 包。通過網(wǎng)絡(luò)上別人的一些測(cè)試和實(shí)驗(yàn)發(fā)現(xiàn),對(duì) Internet 中發(fā) 布的 60 個(gè) HTTP 代理服務(wù)器進(jìn)行探測(cè)。其中,97%的服務(wù)器對(duì) SYN 包有應(yīng)答, 只有 53%的服務(wù)器對(duì) ACK 包有應(yīng)答。實(shí)驗(yàn)發(fā)現(xiàn)對(duì) SYN 包無應(yīng)答的主機(jī)對(duì)任何 TCP 包都無應(yīng)答。無論服務(wù)器有什么樣的安全處理規(guī)則,根據(jù)方式(1)(2),SYN 請(qǐng)求都會(huì)得到應(yīng)答,所以選擇 S

19、YN 包作為探測(cè)包。 第 頁 共 22 頁 3 1.5.2 SYN 包探測(cè) 第一步:客戶端向服務(wù)器的工作端口發(fā)送 SYN,服務(wù)器返回 SYN|ACK 包 或 RST 包。如果客戶端收到 SYN|ACK,則可以肯定服務(wù)器活動(dòng)和端口開啟。 收到 RST 包,則說明服務(wù)器活動(dòng)但端口關(guān)閉,客戶端不用執(zhí)行第二步。如果超 時(shí)無應(yīng)答,則認(rèn)為包丟失。 第二步:因?yàn)椴恍枰⒄5?TCP 連接,所以對(duì)應(yīng)答 ACK 包的服務(wù)器 發(fā)送 RST 包,保證服務(wù)器端關(guān)閉半連接。因?yàn)橹挥猩倭繄?bào)文對(duì)端口探測(cè),不會(huì) 引起安全系統(tǒng)的報(bào)警。使用 SYN 包探測(cè),可以檢測(cè)服務(wù)器和端口的狀態(tài)、分組 時(shí)延、丟包率,又可以穿透防火墻,符

20、合網(wǎng)絡(luò)對(duì)安全的要求。 1.5.3 分組時(shí)延 假如用定時(shí)器來計(jì)算分組往返的時(shí)間,大量的定時(shí)器會(huì)造成資源極大消耗。 雖然 TCP 協(xié)議規(guī)定了時(shí)間戳選項(xiàng)(類型 8),用該選項(xiàng)中嵌入時(shí)間戳,服務(wù)器返 回包的選項(xiàng)部分含有發(fā)送的時(shí)間戳。然而,在具體 TCP/IP 協(xié)議實(shí)現(xiàn)中,有些 TCP/IP 協(xié)議棧會(huì)忽略該選項(xiàng),或者選項(xiàng)值置 0,無法得到往返時(shí)間。如果能像 Ping 一樣保證某一字段的數(shù)據(jù)在往返中不改變,就可以像 Ping 一樣嵌入時(shí)間戳。 但 TCP 的各字段不能保證往返數(shù)據(jù)一致??梢钥紤]用一種變通的方式嵌入時(shí)間 戳。對(duì)于客戶機(jī)發(fā)送的 SYN 報(bào)文,設(shè)序號(hào) x,則服務(wù)主機(jī)返回報(bào)文的確認(rèn)序號(hào) 等于 x+

21、1。利用發(fā)送序號(hào)和確認(rèn)序號(hào)的關(guān)系來傳遞時(shí)間戳。設(shè)置 SYN 包的發(fā)送 序號(hào)為時(shí)間戳,收到的 SYN|ACK 包或 RST 包的確認(rèn)序號(hào)減 1 即可得到發(fā)送包 的時(shí)間戳。用收到包的時(shí)間減去發(fā)送時(shí)間戳即得到分組時(shí)延。 1.6 端口掃描實(shí)現(xiàn)方法 本文通過對(duì)基于半打開的端口掃描技術(shù)的實(shí)現(xiàn)來介紹了現(xiàn)在一些主流的端 口掃描技術(shù),通過對(duì)程序的開發(fā)加深了對(duì)端口掃描技術(shù)的認(rèn)識(shí)。經(jīng)過對(duì)端口掃 描技術(shù)的了解和認(rèn)識(shí),本文采用隱蔽性較好基于主機(jī)的 SYN 刺探技術(shù)來實(shí)現(xiàn)。 2 需求分析 2.1 端口掃描器的總體要求 2.1.1 設(shè)計(jì)背景 該端口掃描器是面向普通用戶使用,以期成為一個(gè)普通用戶用來檢測(cè)端口 網(wǎng)絡(luò)主機(jī)端口并有

22、效地保護(hù)自己。在采用 SYN 刺探方式進(jìn)行掃描的基礎(chǔ)上成為 一個(gè)基于半打開的實(shí)用、簡(jiǎn)單、方便的端口掃描工具。 2.1.2 用戶特點(diǎn) 由于該端口掃描系統(tǒng)是一個(gè)基于半打開的端口掃描器,其面向的是普通的 對(duì)于端口掃描有需求的用戶,因此需要提供一個(gè)簡(jiǎn)潔、方便、高效的界面和功 第 頁 共 22 頁 4 能。 2.1.3 軟件開發(fā)及運(yùn)行環(huán)境 系統(tǒng)開發(fā)工具:Visual C+ 6.0 2.2 端口掃描器的需求分析 端口掃描器的一般需求: (1)隱蔽性需求 作為掃描的一方來說,端口掃描除了要能掃出目標(biāo)主機(jī)的端口信息以外, 還需要能有一定的隱蔽性,以最大的可能不在目標(biāo)主機(jī)留下訪問信息。如果仍 然采用基于 TCP

23、 connect()的掃描則將很容易被目標(biāo)主機(jī)記錄,因此從隱蔽性上 考慮 SYN 半打開掃描或者 FIN 掃描會(huì)是很好的選擇。 (2)端口選擇需求 當(dāng)我們?cè)谑褂脪呙柢浖?duì)目標(biāo)主機(jī)進(jìn)行掃描的時(shí)候,有的時(shí)候是有目的性 地掃描目標(biāo)主機(jī)的某一個(gè)端口,然而在大部分時(shí)候卻需要掃描批量端口或者是 一些重要的指定端口。這個(gè)時(shí)候需要端口掃描系統(tǒng)具有自定義端口列表的功能。 (3)掃描結(jié)果存儲(chǔ)需求 在進(jìn)行完一次端口掃描之后,需要對(duì)結(jié)果進(jìn)行保存。無論是攻擊還是檢測(cè), 端口掃描器是需要與其他的一些工具配合到一起使用的,所以要求端口掃描器 一定要具有存儲(chǔ)結(jié)果的功能,以將掃描得到的目標(biāo)主機(jī)端口信息保存下來。 3 端口掃描器

24、的實(shí)現(xiàn) 3.1 功能模塊簡(jiǎn)介 所完成的端口掃描器的界面如圖 1 所示,相關(guān)功能介紹如下: 圖1 端口掃描器功能界面 目標(biāo) IP 范圍選擇模塊:選擇起始 IP 和結(jié)束 IP 以確定目標(biāo) IP 的范圍。 第 頁 共 22 頁 5 端口范圍選擇模塊:自定義起始端口和結(jié)束端口以確定掃描范圍。 掃描結(jié)果存儲(chǔ)模塊:自定義掃描結(jié)果的顯示方式,或?qū)呙杞Y(jié)果保存下來。 自定義默認(rèn)端口列表模塊:對(duì)默認(rèn)的重要端口進(jìn)行添加或刪除以更符合掃 描需要。 3.2 程序?qū)崿F(xiàn)流程 程序?qū)崿F(xiàn)的流程如圖 2 所示: 開始 Scanstart 主函數(shù) 填充本地 IP 列 讀取 IP 和端口 本地 IP? 否 是 獲得掃描結(jié)果 獲得掃

25、描結(jié)果 保存掃描結(jié)果 保存掃描結(jié)果 結(jié)束 結(jié)束 圖2 程序?qū)崿F(xiàn)流程圖 主函數(shù)首先創(chuàng)建一個(gè)偵聽線程以準(zhǔn)備獲得返回信息。然后調(diào)用 FillLocalIP 函數(shù)將本地 IP 寫入 IP 列表中,接著讀取要掃描的 IP 和端口,判斷是否是本地 IP,若是則調(diào)用函數(shù) scanlocal 對(duì)本地 IP 和端口發(fā)起連接并獲得掃描結(jié)果;如果 不是本地 IP 就調(diào)用 scan 函數(shù)對(duì)遠(yuǎn)程 IP 發(fā)送 SYN 包,并通過創(chuàng)建的套接字 rawsock 得到從系統(tǒng)中返回的信息,分析數(shù)據(jù)后得到掃描結(jié)果。最后將掃描的結(jié) 果插入結(jié)果樹中排序并可保存為文本文件。 3.3 SYN 探測(cè)的實(shí)現(xiàn) 定義了一個(gè)線程體 ScanStar

26、t 調(diào)用其他的函數(shù)來實(shí)現(xiàn)端口掃描。 (1)DWORD WINAPI ScanStart(LPVOID lpvoid) 第 頁 共 22 頁 6 CDWordArray& CPortList = *lpPortList; /為偵聽線程分配句柄空間 *handle = (HANDLE*)malloc(sizeof(HANDLE)*(numadapter-1); /為 LocalIP 分配空間 *lpLocalIP= (ULONG*)malloc(sizeof(ULONG)*numadapter); HANDLE* hListen=*handle; /創(chuàng)建偵聽線程 每塊網(wǎng)卡綁定一個(gè)線程 wh

27、ile (InforL.num >=0) hListenInforL.num=CreateThread(NULL,0,ListeningFunc,&InforL,NUL L,NULL); /創(chuàng)建一個(gè)嗅包的線程,分析接收到的包。 if ( hListenInforL.num = NULL ) AfxMessageBox("創(chuàng)建偵聽線程失敗!"); Sleep(500); InforL.num-; /Sleep 0.5s.使 ListeningFunc 線程初始化完畢. pProGressCtrl->SetRange32(0,(EndIP-StartIP+1

28、)*CPortList.GetSize(); / 設(shè)置顯示掃描進(jìn)度條的大小 / Fill LocalIP FillLocalIPList(*lpLocalIP);/獲取本地網(wǎng)卡的 IP /這是為了實(shí)現(xiàn)監(jiān)聽功能,接受返回的數(shù)據(jù)包 DWORD* lpLIP = *lpLocalIP; IPANDPORT lpInfor=0; lpInfor.hTree=lpTreeCtrl; int all=0; int k=1; int TEMP=StartIP; 在對(duì) IP 范圍是否符合規(guī)則進(jìn)行判斷以后,將端口列表中的端口信息循環(huán)讀 入到 lpInfor.PORT 中,為即將開始的掃描做準(zhǔn)備。 for (St

29、artIP <= EndIP ; StartIP+) /從第一個(gè) IP 到最后一個(gè) IP 第 頁 共 22 頁 7 lpInfor.NETIP=htonl(StartIP); int Num= CPortList.GetSize(); for ( int i=0 ; i<Num ; i+) /結(jié)束線程 if ( ! :OK ) CPortList.RemoveAll(); return 0; /清空端口列表 lpInfor.PORT=(USHORT)CPortListi; if ( k % 300 = 0 ) /等待監(jiān)聽線程 WaitForMultipleObjects(numad

30、apter-1,hListen,FALSE,DelayTime); k=1; else k+; 對(duì)本地 IP 和目標(biāo)(非本地)IP 的掃描方式是不同的,所以這里需要對(duì)獲取 的 IP 地址和本地 IP 地址作比較,通過函數(shù) IsLocalIP 來實(shí)現(xiàn)。 if ( IsLocalIP(lpInfor.NETIP, lpLIP,numadapter) ) scanlocal(&lpInfor); /對(duì)本地 IP 進(jìn)行掃描 else scan(&lpInfor); /對(duì)目標(biāo) IP,端口發(fā)送 SYN 包. all+; pProGressCtrl->SetPos(all); (2)掃

31、描程序在開始的時(shí)候?qū)?LocalIPlist 中的 IP 與 scanIP 對(duì)比,判斷待掃描 的 IP 是否是本地 IP。因?yàn)樵诔绦蛑袑?duì)目標(biāo) IP 和本地 IP 的掃描方式是不一樣的, 第 頁 共 22 頁 8 所以需要在這里作出一個(gè)判斷。 BOOL IsLocalIP(ULONG scanIP, ULONG* LocalIPlist, int num) for (int i=0; i<num ; i+) if (scanIP = LocalIPlisti) return TRUE; return FALSE; 圖 3 SYN 掃描連接示意圖 如圖 3 所示,在半打開掃描技術(shù)中,掃描主機(jī)

32、自動(dòng)向目標(biāo)計(jì)算機(jī)的指定端 口發(fā)送 SYN 數(shù)據(jù)段,表示發(fā)送建立連接請(qǐng)求。如果目標(biāo)計(jì)算機(jī)的回應(yīng) TCP 報(bào) 文中 SYN=1,ACK=1,則說明該端口是活動(dòng)的,接著掃描主機(jī)傳送一個(gè) RST 給目標(biāo)主機(jī)拒絕建立 TCP 連接,從而導(dǎo)致三次握手過程的失敗。如果目標(biāo)計(jì)算 機(jī)的回應(yīng)是 RST,則表示該端口為"死端口",這種情況下,掃描主機(jī)不用做任 何回應(yīng)。由于掃描過程中,全連接尚未建立,所以大大降低了被目標(biāo)計(jì)算機(jī)的 記錄的可能,并且加快了掃描的速度。 (3)在對(duì)目標(biāo) IP 進(jìn)行端口掃描的時(shí)候,一方面要考慮到在掃描的時(shí)候在目標(biāo) 主機(jī)上留下較少的掃描記錄,另一方面要能在較小的權(quán)限下對(duì)目標(biāo)

33、進(jìn)行掃描。 所以使用發(fā)送 TCP SYN 包的方式來對(duì)目標(biāo)進(jìn)行掃描。 DWORD WINAPI scan(LPVOID lp) SOCKET sock=NULL; SOCKADDR_IN addr_in=0; 第 頁 共 22 頁 9 IPANDPORT* lpInfor=(IPANDPORT*)lp; /設(shè)置 IP 地址屬性 USHORT port=lpInfor->PORT; /設(shè)置掃描的端口 addr_in.sin_family=AF_INET; addr_in.sin_port=htons(port); addr_in.sin_addr.S_un.S_addr=lpInfor-&

34、gt;NETIP; /設(shè)置 IP 地址 int ULONG iErr; ul=1; if(sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)=INVALI D_SOCKET) AfxMessageBox("Socket Setup Error!n"); /大多數(shù)掃描技術(shù)要發(fā)送原始套接字包來進(jìn)行探測(cè)。因?yàn)橹挥性继捉幼?支持對(duì) IP 報(bào)頭的設(shè)置,即構(gòu)造 IP 數(shù)據(jù)包。同時(shí),原始套接字也支持發(fā)送和接 收 IP 數(shù)據(jù)包。這樣,原始套接字接口實(shí)際上成為網(wǎng)絡(luò)層向上提供的接口。 iErr=ioctlsocket(sock,FIONBIO,(unsi

35、gned long*)&ul); /設(shè)置 sock 為非阻 塞 if(iErr=SOCKET_ERROR ) /等待錯(cuò)誤信息 AfxMessageBox("set socket FIONBIO falsen"); 在 Windows XP 中,程序使用原始套接字構(gòu)造和發(fā)送 SYN 包。TCP/IP 協(xié)議 棧中不會(huì)記錄該連接請(qǐng)求,所以對(duì)于服務(wù)器端返回的 SYN|ACK 包,TCP/IP 協(xié) 議棧會(huì)自動(dòng)發(fā)送 RST,不用在程序中實(shí)現(xiàn) SYN 探測(cè)的第二步。 connect(sock,(struct sockaddr *)&addr_in,sizeof(addr_

36、in); /發(fā)送 SYN 包 /在發(fā)送完 SYN 包以后立即關(guān)閉 SOCK 連接,因?yàn)槌绦驘o法直接收到返 回的信息,返回的數(shù)據(jù)是到達(dá)系統(tǒng)核心,然后通過嗅探抓包的方式獲得目標(biāo)主 機(jī)返回信息。 closesocket(sock); return 0; 第 10 頁 共 22 頁 (4)接著調(diào)用 scanlocal 函數(shù)對(duì)本地 IP 進(jìn)行掃描,由于對(duì)本地 IP 掃描的時(shí)候 不需要考慮到掃描的安全性,即不用擔(dān)心掃描的時(shí)候被主機(jī)留下掃描記錄。另 外一方面,對(duì)本地主機(jī)掃描的時(shí)候就不需要從監(jiān)聽的網(wǎng)卡上抓取返回的包,直 接設(shè)置等待連接成功后的信息既方便又快速。所以在掃描本地主機(jī)的時(shí)候不用 發(fā)送 SYN 包。

37、DWORD WINAPI scanlocal(LPVOID lp) SOCKET sock=NULL; SOCKADDR_IN addr_in=0; TCHAR SendBuf256=0;/設(shè)置緩沖變量 IPANDPORT* lpInfor=(IPANDPORT*)lp; USHORT port=lpInfor->PORT; CTreeCtrl* hTree=lpInfor->hTree; *省略部分代碼* if(sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)=INVALID_S OCKET) /建立 socket 的鏈接對(duì)象 fd_set

38、 r,w; /設(shè)置 sock 為非阻塞 iErr=ioctlsocket(sock,FIONBIO,(unsignedlong*)&ul); if(iErr=SOCKET_ERROR ) printf("set socket FIONBIO falsen"); /套接字連接,以對(duì)本地 IP 端口進(jìn)行掃描 connect(sock,(struct sockaddr *)&addr_in,sizeof(addr_in); 在向本地 IP 發(fā)起建立連接后,設(shè)置 iErr=select(0, &r, &w, 0, &timeout) 等待接受

39、數(shù)據(jù)和同步函數(shù)。如果連接不成功則將返回錯(cuò)誤信息,連接成功則將 收到的數(shù)據(jù)插入結(jié)果樹中。 if(iErr!=SOCKET_ERROR) && (iErr!=0) /連接成功后返回連接信息 第 11 頁 共 22 頁 *省略部分代碼* /連接成功則將收到的數(shù)據(jù)插入結(jié)果樹中 InsertToTree (hTree,strIP,CSPort); closesocket(sock); return 1; (5)原始套接字包發(fā)送完后,就可以接收目標(biāo)主機(jī)的回應(yīng)。當(dāng)發(fā)送原始套接 字包時(shí)(如 TCP SYN 數(shù)據(jù)包),操作系統(tǒng)核心并不知道,也沒有此數(shù)據(jù)發(fā)送或者 連接建立的記錄。因此,當(dāng)遠(yuǎn)端主機(jī)回

40、應(yīng)時(shí),系統(tǒng)核心就把這些包都全部丟掉, 從而到達(dá)不了應(yīng)用程序上。所以,程序中不能簡(jiǎn)單地使用接收函數(shù)來接收這些 數(shù)據(jù)包。要達(dá)到接收數(shù)據(jù)包的目的,必須采用嗅探,接收所有通過的數(shù)據(jù)包, 然后進(jìn)行篩選,留下符合需要的。為此可以表示接收所有的數(shù)據(jù)。通過設(shè)置原 始套接字的 I/0 控制命令,便可以調(diào)用 SIO_RCVALL 接收返回的數(shù)據(jù)包,分析 是不是掃描程序返回的。 DWORD WINAPI ListeningFunc(LPVOID lpvoid) /定義套接字 rawsock,以連接應(yīng)用程序和監(jiān)聽的本地網(wǎng)卡 SOCKET rawsock; int settimeout = 500; SOCKADDR_

41、IN addr_in=0; INFORLISTEN* lp =(INFORLISTEN*)lpvoid; int num = lp->num; *省略部分代碼* if(rawsock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)=INVALID_SO CKET) /建立原始 IPPROTO_IP 套接字 AfxMessageBox("Socket Setup Error!n"); return false; addr_in.sin_family=AF_INET; 構(gòu)造 SYN 包,最好選用較大的端口號(hào)作為發(fā)送端口,以免和應(yīng)用程序正在 使用的端

42、口發(fā)生沖突。在這里我們選用的是 8288。另外在構(gòu)造 TCP 頭的時(shí)候, 第 12 頁 共 22 頁 還添加了 TCP 選項(xiàng) SACK,保證 TCP 連接請(qǐng)求被接受。 addr_in.sin_port=htons(8288); /設(shè)置接收的端口為 8288 addr_in.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /監(jiān)聽所有的本地 IP 地址 /對(duì) rawsock 綁定本機(jī) IP 和端口,當(dāng)系統(tǒng)收到目標(biāo)的返回信息時(shí),便 可以通過 rawsock 傳到應(yīng)用程序當(dāng)中。 int ret=bind(rawsock, (struct sockaddr *)&

43、addr_in, sizeof(addr_in); if(ret=SOCKET_ERROR) AfxMessageBox("bind false"); 程序使用兩次判斷來過濾 IP 包。 首先判斷 IP 頭部,要求目的地址是本機(jī)、協(xié)議號(hào)是 TCP 協(xié)議。然后再判 斷 TCP頭部,要求目的端口等于選用端口號(hào),控制標(biāo)志位為 SYN|ACK或者 RST。 因?yàn)楸O(jiān)聽套接字會(huì)接收到所有的 IP 包,要保證能盡快處理分組,如圖 4 所示。 圖4 返回 IP 包的接收及過濾 設(shè)置 SIO_RCVALL,包括延時(shí)和數(shù)據(jù)大小等信息,以接收所有的數(shù)據(jù)包。 在收到返回信息的時(shí)候接受并分析數(shù)據(jù)包是

44、否為應(yīng)用程序返回的信息。 setsockopt(rawsock,SOL_SOCKET,SO_RCVTIMEO, (char *)&settimeout, sizeof(int); DWORD lpvBuffer = 1; DWORD lpcbBytesReturned = 0; /設(shè)置一個(gè)套接口的模式,接受所有數(shù)據(jù) WSAIoctl(rawsock, SIO_RCVALL, &lpvBuffer, sizeof(lpvBuffer), NULL, 0, &lpcbBytesReturned, NULL, NULL); *省略部分代碼* char RecvBuf256=0; /接收數(shù)據(jù)包 第 13 頁 共 22 頁 ret=recvfrom(rawsock,RecvBuf,sizeof(RecvBuf),0,(struct sockaddr*)&from,&am

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論