端口掃描有哪幾種方式

端口掃描有哪幾種方式

事件原由

(推薦教程:web服務器安全

筆者在寫一個小工具,針對滲透測試中需要搜集的信息,使用腳本自動化采集。而在這個模塊中有個很難搞的部分就是端口banner 信息搜集,起初我嘗試使用了python+nmap+多線程掃描,掃描20+的ip,等的花都謝了。。。而筆者目標是掃描200+的ip。下面我就針對端口掃描的技術進行分析。

1、nmap探測端口

nmap在掃描多個主機的時候可以設置參數 –min-hostgroup ,設置這個參數可以并行掃描多個主機,將這些主機劃分成組,然后一次掃描一個組。

舉例:

–min-hostgroup 50 nmap 以50個主機為一組,在掃描完50個主機之前不會顯示結果。

#coding=utf-8 import?nmap? from?queue?import?Queue from?threading?import?Thread def?portscan(ip): ????portlist?=?[] ????nm?=?nmap.PortScannerYield() ????for?r?in?nm.scan(ip,ports='1-10000',arguments='-sS?--min-hostgroup'): ????????m?=?r[1]['scan'][ip]['tcp'] ????????for?p?in?m: ????????????temp?=?str(p)?+?"----"?+m[p]['state'] ????????????portlist.append(temp) ????print(portlist) class?Consumer(Thread): ????def?__init__(self,?q): ????????Thread.__init__(self) ????????self.q?=?q ????def?run(self): ????????while??not?self.q.empty(): ????????????ip?=?self.q.get() ????????????try: ????????????????portscan(ip) ????????????except?Exception?as?e: ????????????????print(e) ????????????????continue def?producer(ip_list): ????num?=?10 ????threads?=?[] ????q?=?Queue() ????for?i?in?ip_list: ????????print(i) ????????q.put(i) ????threads?=?[Consumer(q)?for?i?in?range(0,int(num))] ????for?t?in?threads: ????????t.start() ????for?t?in?threads: ????????t.join() ip_list?=['120.78.207.76',?'120.78.207.231',?'120.78.207.18',?'120.78.207.233',?'120.78.207.165',?'120.78.207.48',? '120.78.207.112',?'120.78.207.27',?'120.78.207.51',?'120.78.207.8'] producer(ip_list)

端口掃描有哪幾種方式

如圖,運行10個ip需要318s。

2、masscan探測端口

(1)調用python masscan

默認情況下,masscan 發送的是syn數據包,如果目標主機返回ack+syn,則說明端口開放。具體流程如下

A:192.168.70.142

B:192.168.0.143 開放端口3306

(1)A->B syn

(2)B->A syn+ack

(3)A->B RST

端口掃描有哪幾種方式

探測未開放的端口

A->B syn

B->A rst

端口掃描有哪幾種方式

舉例:

def?portscan(ip): ????mas?=?masscan.PortScanner() ????mas.scan(ip,ports='1-65535') ????print(mas.scan_result)

使用系統命令探測

使用方法

掃描掃描443端口的B類子網 Masscan?10.11.0.0/16?-p443 掃描80或443端口的B類子網 Masscan?10.11.0.0/16?-p80,443 掃描100個常見端口的B類子網,每秒100,000個數據包 Masscan?10.11.0.0/16??--top-ports?100?-rate?100000  結果輸出 -oX?filename:輸出到filename的XML。 -oG?filename:輸出到filename在的grepable格式。 -oJ?filename:輸出到filename在JSON格式。

3、socket探測端口

socket 探測端口發送的不是完整的三次握手包如下,

A:192.168.70.142

B:192.168.0.143 開放端口3306

A接收到B返回的syn+ack數據包后,A把數據丟棄。

端口掃描有哪幾種方式

探測不開放端口

A發送syn,B沒有開放33端口,所以返回RST數據包。

端口掃描有哪幾種方式

def?portscan(ip,port): ????try: ????????s?=?socket.socket(socket.AF_INET,socket.SOCK_STREAM) ????????s.settimeout(0.2) ????????status?=?s.connect_ex((ip,port)) ????????if?status?==?0: ????????????temp_str?=?str(ip)?+?"---"?+?str(port)?+?"---open" ????????????port_list.append(temp_str) ????????else: ????????????pass ????except?Exception?as?e: ????????pass ????finally: ????????s.close()

端口掃描有哪幾種方式

探測10個ip花費了26.3s差不多一個2.6s。

4、telnet探測端口

telnet 探測端口采用完整的三次握手連接,使用命令 telnet ip port?,發包流程如下

A:192.168.70.142

B:192.168.0.143 開放端口3306

telnet 192.168.0.143 3306

過程如下:

使用TCP三次握手建立連接: SYN -> SYN+ACK + ACK

端口掃描有哪幾種方式

探測不存在端口,發送SYN數據包,然后RST包丟棄。

端口掃描有哪幾種方式

如果有返回值,則說明端口開放,否則則端口關閉。

def?portscan(ip,port): ?????try: ?????????t?=?telnetlib.Telnet(ip,port=port,timeout=0.2) ?????????if?t: ?????????????temp_str?=?str(ip)?+?'---'?+?str(port) ?????????????port_list.append(temp_str) ?except?Exception?as?e: ?????print(e) ?????pass

端口掃描有哪幾種方式

探測10個ip花費了27.8s差不多一個2.7s。

5、nc探測端口

nc探測端口采用完整的三次握手連接,使用命令 nc -v -w 1 -z ip port,發包過程和telent 探測一樣。

探測開放端口的數據包

端口掃描有哪幾種方式

探測未開放端口的數據包

端口掃描有哪幾種方式

端口開放,返回值為0,可以依此作為判斷依據。

def?portscan(ip,port): ?????command?=?'nc?-v?-w?1?-z?{0}?{1}'.format(ip,port) ?????m?=?os.system(command) ?????if?m?==?0: ?????????temp_str?=?str(ip)?+?"---"?+?str(port) ?????????port_list.append(temp_str) ?????else: ?????????pass

端口掃描有哪幾種方式

備注:比如你想探測某個指定的端口開放情況,推薦使用nc。

總結

nmap 作為掃描端口的神器,掃描出的結果比其他幾種方式要詳細。如果追求效率的話,建議采用socket。相比于nmap,socket會存在漏報情況,筆者在測試某主機時,nmap掃出了8888端口,但是socket沒有。

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享