端口扫描有哪几种方式(internet的接入方式有哪几种)
事件原由
(推薦教程:web服務(wù)器安全)
筆者在寫一個小工具,針對滲透測試中需要搜集的信息,使用腳本自動化采集。而在這個模塊中有個很難搞的部分就是端口banner 信息搜集,起初我嘗試使用了python+nmap+多線程掃描,掃描20+的ip,等的花都謝了。。。而筆者目標是掃描200+的ip。下面我就針對端口掃描的技術(shù)進行分析。
1、nmap探測端口
nmap在掃描多個主機的時候可以設(shè)置參數(shù) --min-hostgroup ,設(shè)置這個參數(shù)可以并行掃描多個主機,將這些主機劃分成組,然后一次掃描一個組。
舉例:
--min-hostgroup 50 nmap 以50個主機為一組,在掃描完50個主機之前不會顯示結(jié)果。
#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)
登錄后復(fù)制
如圖,運行10個ip需要318s。
2、masscan探測端口
(1)調(diào)用python masscan
默認情況下,masscan 發(fā)送的是syn數(shù)據(jù)包,如果目標主機返回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)
登錄后復(fù)制
使用系統(tǒng)命令探測
使用方法
掃描掃描443端口的B類子網(wǎng) Masscan 10.11.0.0/16 -p443 掃描80或443端口的B類子網(wǎng) Masscan 10.11.0.0/16 -p80,443 掃描100個常見端口的B類子網(wǎng),每秒100,000個數(shù)據(jù)包 Masscan 10.11.0.0/16 --top-ports 100 -rate 100000 結(jié)果輸出 -oX filename:輸出到filename的XML。 -oG filename:輸出到filename在的grepable格式。 -oJ filename:輸出到filename在JSON格式。
登錄后復(fù)制
3、socket探測端口
socket 探測端口發(fā)送的不是完整的三次握手包如下,
A:192.168.70.142
B:192.168.0.143 開放端口3306
A接收到B返回的syn+ack數(shù)據(jù)包后,A把數(shù)據(jù)丟棄。
探測不開放端口
A發(fā)送syn,B沒有開放33端口,所以返回RST數(shù)據(jù)包。
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()
登錄后復(fù)制
探測10個ip花費了26.3s差不多一個2.6s。
4、telnet探測端口
telnet 探測端口采用完整的三次握手連接,使用命令 telnet ip port ,發(fā)包流程如下
A:192.168.70.142
B:192.168.0.143 開放端口3306
telnet 192.168.0.143 3306
過程如下:
使用TCP三次握手建立連接: SYN -> SYN+ACK + ACK
探測不存在端口,發(fā)送SYN數(shù)據(jù)包,然后RST包丟棄。
如果有返回值,則說明端口開放,否則則端口關(guān)閉。
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
登錄后復(fù)制
探測10個ip花費了27.8s差不多一個2.7s。
5、nc探測端口
nc探測端口采用完整的三次握手連接,使用命令 nc -v -w 1 -z ip port,發(fā)包過程和telent 探測一樣。
探測開放端口的數(shù)據(jù)包
探測未開放端口的數(shù)據(jù)包
端口開放,返回值為0,可以依此作為判斷依據(jù)。
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
登錄后復(fù)制
備注:比如你想探測某個指定的端口開放情況,推薦使用nc。
總結(jié)
nmap 作為掃描端口的神器,掃描出的結(jié)果比其他幾種方式要詳細。如果追求效率的話,建議采用socket。相比于nmap,socket會存在漏報情況,筆者在測試某主機時,nmap掃出了8888端口,但是socket沒有。
以上就是端口掃描有哪幾種方式的詳細內(nèi)容,更多請關(guān)注風君子博客其它相關(guān)文章!
總結(jié)
以上是生活随笔為你收集整理的端口扫描有哪几种方式(internet的接入方式有哪几种)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ socket线程池原理_Thre
- 下一篇: 自动化测试用java还是python_现