Ursprüngliche Ursache des Vorfalls
(Empfohlenes Tutorial: Webserversicherheit)
Der Autor schreibt ein kleines Tool, um mithilfe von Skripten automatisch die Informationen zu sammeln, die während des Penetrationstests gesammelt werden müssen. Es gibt einen schwierigen Teil in diesem Modul, nämlich das Sammeln von Port-Banner-Informationen. Zuerst habe ich versucht, mehr als 20 IPs mit Python + NMAP + Multi-Thread-Scannen zu scannen, aber das Warten war erschöpft. . . Das Ziel des Autors ist es, mehr als 200 IPs zu scannen. Als nächstes werde ich die Port-Scan-Technologie analysieren.
1. nmap-Erkennungsport
nmap kann beim Scannen mehrerer Hosts den Parameter --min-hostgroup festlegen, um mehrere Hosts gleichzeitig zu scannen, diese Hosts in Gruppen aufzuteilen und dann jeweils eine Gruppe zu scannen.
Beispiel:
--min-hostgroup 50 nmap verwendet 50 Hosts als Gruppe und die Ergebnisse werden erst angezeigt, wenn 50 Hosts gescannt wurden.
#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)
Wie im Bild gezeigt, dauert es 318 Sekunden, um 10 IPs auszuführen.
2. Masscan-Erkennungsport
(1) Python-Masscan aufrufen
Standardmäßig sendet Masscan Syn-Datenpakete. Wenn der Zielhost Ack+Syn zurückgibt, bedeutet dies, dass der Port geöffnet ist. Der spezifische Prozess ist wie folgt: A: 192.168.70.142 B: 192.168.0.143 Offener Port 3306 3) A ->
Verwendungdef portscan(ip): mas = masscan.PortScanner() mas.scan(ip,ports='1-65535') print(mas.scan_result)
3. Der Socket-Erkennungsport
Socket-Erkennungsport sendet ein unvollständiges Drei-Wege-Handshake-Paket wie folgt:
A:192.168.70.142
B:192.168.0.143 Offener Port 3306
A empfängt B und kehrt zurück. Nach dem Syn+ack-Paket verwirft A die Daten.Erkennung ungeöffneter Ports
A sendet syn, B öffnet Port 33 nicht, daher werden RST-Pakete zurückgegeben.
扫描扫描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格式。
Es dauerte 26,3 Sekunden, fast 2,6 Sekunden, um 10 IPs zu erkennen.
4. Telnet-Erkennungsport: Der Telnet-Erkennungsport verwendet eine vollständige Drei-Wege-Handshake-Verbindung Öffnen Sie Port 3306telnet 192.168 0,143 3306
探测不存在端口,发送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没有。
Das obige ist der detaillierte Inhalt vonWelche Methoden gibt es zum Port-Scannen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!