一孕讳、常見端口掃描的原理
0、秘密掃描
秘密掃描是一種不被審計(jì)工具所檢測的掃描技術(shù)巍膘。
它通常用于在通過普通的防火墻或路由器的篩選(filtering)時(shí)隱藏自己厂财。
秘密掃描能躲避IDS、防火墻典徘、包過濾器和日志審計(jì)蟀苛,從而獲取目標(biāo)端口的開放或關(guān)閉的信息。由于沒有包含TCP 3次握手協(xié)議的任何部分逮诲,所以無法被記錄下來帜平,比半連接掃描更為隱蔽。
但是這種掃描的缺點(diǎn)是掃描結(jié)果的不可靠性會(huì)增加梅鹦,而且掃描主機(jī)也需要自己構(gòu)造IP包●伤Γ現(xiàn)有的秘密掃描有TCP FIN掃描、TCP ACK掃描齐唆、NULL掃描嗤栓、XMAS掃描和SYN/ACK掃描等。
學(xué)習(xí)Python過程中會(huì)遇到很多問題箍邮,可以到我們的 python學(xué)習(xí)交流群【七 三 五茉帅,九 三 四,八 四 一】锭弊,基礎(chǔ)堪澎,進(jìn)階。從企業(yè)招聘人才需求 到怎么學(xué)習(xí)python味滞,和學(xué)習(xí)什么內(nèi)容都有免費(fèi)系統(tǒng)分享樱蛤。希望可以幫助你快速了解Python,學(xué)習(xí)python
1剑鞍、Connect()掃描
此掃描試圖與每一個(gè)TCP端口進(jìn)行“三次握手”通信昨凡。如果能夠成功建立接連,則證明端口開發(fā)蚁署,否則為關(guān)閉便脊。準(zhǔn)確度很高,但是最容易被防火墻和IDS檢測到形用,并且在目標(biāo)主機(jī)的日志中會(huì)記錄大量的連接請求以及錯(cuò)誤信息就轧。
TCP connect端口掃描服務(wù)端與客戶端建立連接成功(目標(biāo)端口開放)的過程:
① Client端發(fā)送SYN证杭;
② Server端返回SYN/ACK田度,表明端口開放妒御;
③ Client端返回ACK,表明連接已建立镇饺;
④ Client端主動(dòng)斷開連接乎莉。
建立連接成功(目標(biāo)端口開放)
TCP connect端口掃描服務(wù)端與客戶端未建立連接成功(目標(biāo)端口關(guān)閉)過程:
① Client端發(fā)送SYN;
② Server端返回RST/ACK奸笤,表明端口未開放惋啃。
優(yōu)點(diǎn):實(shí)現(xiàn)簡單,對操作者的權(quán)限沒有嚴(yán)格要求(有些類型的端口掃描需要操作者具有root權(quán)限)监右,系統(tǒng)中的任何用戶都有權(quán)力使用這個(gè)調(diào)用边灭,而且如果想要得到從目標(biāo)端口返回banners信息,也只能采用這一方法健盒。
另一優(yōu)點(diǎn)是掃描速度快绒瘦。如果對每個(gè)目標(biāo)端口以線性的方式,使用單獨(dú)的connect()調(diào)用扣癣,可以通過同時(shí)打開多個(gè)套接字惰帽,從而加速掃描。
缺點(diǎn):是會(huì)在目標(biāo)主機(jī)的日志記錄中留下痕跡父虑,易被發(fā)現(xiàn)该酗,并且數(shù)據(jù)包會(huì)被過濾掉。目標(biāo)主機(jī)的logs文件會(huì)顯示一連串的連接和連接出錯(cuò)的服務(wù)信息士嚎,并且能很快地使它關(guān)閉呜魄。
2、SYN掃描
掃描器向目標(biāo)主機(jī)的一個(gè)端口發(fā)送請求連接的SYN包莱衩,掃描器在收到SYN/ACK后爵嗅,不是發(fā)送的ACK應(yīng)答而是發(fā)送RST包請求斷開連接。這樣膳殷,三次握手就沒有完成操骡,無法建立正常的TCP連接,因此赚窃,這次掃描就不會(huì)被記錄到系統(tǒng)日志中册招。這種掃描技術(shù)一般不會(huì)在目標(biāo)主機(jī)上留下掃描痕跡。但是勒极,這種掃描需要有root權(quán)限是掰。
端口開放:1、Client發(fā)送SYN 2辱匿、Server端發(fā)送SYN/ACK 3键痛、Client發(fā)送RST斷開(只需要前兩步就可以判斷端口開放)
端口關(guān)閉:1炫彩、Client發(fā)送SYN 2、Server端回復(fù)RST(表示端口關(guān)閉)
優(yōu)點(diǎn):SYN掃描要比TCP Connect()掃描隱蔽一些絮短,SYN僅僅需要發(fā)送初始的SYN數(shù)據(jù)包給目標(biāo)主機(jī)江兢,如果端口開放,則相應(yīng)SYN-ACK數(shù)據(jù)包丁频;如果關(guān)閉杉允,則響應(yīng)RST數(shù)據(jù)包;
3席里、NULL掃描
反向掃描—-原理是將一個(gè)沒有設(shè)置任何標(biāo)志位的數(shù)據(jù)包發(fā)送給TCP端口叔磷,在正常的通信中至少要設(shè)置一個(gè)標(biāo)志位,根據(jù)FRC 793的要求奖磁,在端口關(guān)閉的情況下改基,若收到一個(gè)沒有設(shè)置標(biāo)志位的數(shù)據(jù)字段,那么主機(jī)應(yīng)該舍棄這個(gè)分段咖为,并發(fā)送一個(gè)RST數(shù)據(jù)包秕狰,否則不會(huì)響應(yīng)發(fā)起掃描的客戶端計(jì)算機(jī)。也就是說案疲,如果TCP端口處于關(guān)閉則響應(yīng)一個(gè)RST數(shù)據(jù)包封恰,若處于開放則無相應(yīng)。但是應(yīng)該知道理由NULL掃描要求所有的主機(jī)都符合RFC 793規(guī)定褐啡,但是windows系統(tǒng)主機(jī)不遵從RFC 793標(biāo)準(zhǔn)诺舔,且只要收到?jīng)]有設(shè)置任何標(biāo)志位的數(shù)據(jù)包時(shí),不管端口是處于開放還是關(guān)閉都響應(yīng)一個(gè)RST數(shù)據(jù)包备畦。但是基于Unix(*nix,如Linux)遵從RFC 793標(biāo)準(zhǔn)低飒,所以可以用NULL掃描。 經(jīng)過上面的分析懂盐,我們知道NULL可以辨別某臺(tái)主機(jī)運(yùn)行的操作系統(tǒng)是什么操作系統(tǒng)褥赊。
端口開放:Client發(fā)送Null,server沒有響應(yīng)
端口關(guān)閉:1莉恼、Client發(fā)送NUll 2拌喉、Server回復(fù)RST
說明:Null掃描和前面的TCP Connect()和SYN的判斷條件正好相反。在前兩種掃描中俐银,有響應(yīng)數(shù)據(jù)包的表示端口開放尿背,但在NUll掃描中,收到響應(yīng)數(shù)據(jù)包表示端口關(guān)閉捶惜。反向掃描比前兩種隱蔽性高些田藐,當(dāng)精確度也相對低一些。
用途:判斷是否為Windows系統(tǒng)還是Linux。
4汽久、FIN掃描
與NULL有點(diǎn)類似鹤竭,只是FIN為指示TCP會(huì)話結(jié)束,在FIN掃描中一個(gè)設(shè)置了FIN位的數(shù)據(jù)包被發(fā)送后景醇,若響應(yīng)RST數(shù)據(jù)包臀稚,則表示端口關(guān)閉,沒有響應(yīng)則表示開放啡直。此類掃描同樣不能準(zhǔn)確判斷windows系統(tǒng)上端口開發(fā)情況烁涌。
端口開放:發(fā)送FIN苍碟,沒有響應(yīng)
端口關(guān)閉:1酒觅、發(fā)送FIN 2、回復(fù)RST
5微峰、ACK掃描
掃描主機(jī)向目標(biāo)主機(jī)發(fā)送ACK數(shù)據(jù)包舷丹。根據(jù)返回的RST數(shù)據(jù)包有兩種方法可以得到端口的信息。方法一是: 若返回的RST數(shù)據(jù)包的TTL值小于或等于64蜓肆,則端口開放颜凯,反之端口關(guān)閉。
6仗扬、Xmas-Tree掃描
通過發(fā)送帶有下列標(biāo)志位的tcp數(shù)據(jù)包症概。
URG:指示數(shù)據(jù)時(shí)緊急數(shù)據(jù),應(yīng)立即處理早芭。
PSH:強(qiáng)制將數(shù)據(jù)壓入緩沖區(qū)彼城。
FIN:在結(jié)束TCP會(huì)話時(shí)使用。
正常情況下退个,三個(gè)標(biāo)志位不能被同時(shí)設(shè)置募壕,但在此種掃描中可以用來判斷哪些端口關(guān)閉還是開放,與上面的反向掃描情況相同语盈,依然不能判斷windows平臺(tái)上的端口舱馅。
端口開放:發(fā)送URG/PSH/FIN,沒有響應(yīng)
端口關(guān)閉:1、發(fā)送URG/PSH/FIN,沒有響應(yīng) 2刀荒、響應(yīng)RST
XMAS掃描原理和NULL掃描的類似代嗤,將TCP數(shù)據(jù)包中的ACK、FIN缠借、RST干毅、SYN、URG烈炭、PSH標(biāo)志位置1后發(fā)送給目標(biāo)主機(jī)溶锭。在目標(biāo)端口開放的情況下,目標(biāo)主機(jī)將不返回任何信息符隙。
7趴捅、Dump掃描
也被稱為Idle掃描或反向掃描垫毙,在掃描主機(jī)時(shí)應(yīng)用了第三方僵尸計(jì)算機(jī)掃描。由僵尸主機(jī)向目標(biāo)主機(jī)發(fā)送SYN包拱绑。目標(biāo)主機(jī)端口開發(fā)時(shí)回應(yīng)SYN|ACK综芥,關(guān)閉時(shí)返回RST,僵尸主機(jī)對SYN|ACK回應(yīng)RST猎拨,對RST不做回應(yīng)膀藐。從僵尸主機(jī)上進(jìn)行掃描時(shí),進(jìn)行的是一個(gè)從本地計(jì)算機(jī)到僵尸主機(jī)的红省、連續(xù)的ping操作额各。查看僵尸主機(jī)返回的Echo響應(yīng)的ID字段,能確定目標(biāo)主機(jī)上哪些端口是開放的還是關(guān)閉的吧恃。
二虾啦、Python 代碼實(shí)現(xiàn)
1、利用Python的Socket包中的connect方法痕寓,直接對目標(biāo)IP和端口進(jìn)行連接并且嘗試返回結(jié)果傲醉,而無需自己構(gòu)建SYN包。
2呻率、對IP端口進(jìn)行多線程掃描硬毕,注意的是不同的電腦不同的CPU每次最多創(chuàng)建的線程是不一樣的,如果創(chuàng)建過多可能會(huì)報(bào)錯(cuò)礼仗,需要根據(jù)自己電腦情況修改每次掃描的個(gè)數(shù)或者將seelp的時(shí)間加長都可以吐咳。