Maison > Article > Opération et maintenance > Quelles sont les méthodes d'analyse des ports ?
Cause initiale de l'incident
(Tutoriel recommandé : Sécurité du serveur Web)
Le l'auteur écrit un petit outil qui utilise des scripts pour collecter automatiquement les informations qui doivent être collectées lors des tests d'intrusion. Il y a une partie difficile dans ce module, qui est la collecte d'informations sur la bannière de port. Au début, j'ai essayé d'utiliser python+nmap+analyse multi-thread pour analyser plus de 20 IP, et l'attente a été épuisée. . . L'objectif de l'auteur est d'analyser plus de 200 adresses IP. Ensuite, j'analyserai la technologie d'analyse des ports.
1. Port de détection nmap
nmap peut définir le paramètre --min-hostgroup lors de l'analyse de plusieurs hôtes. La définition de ce paramètre peut analyser plusieurs hôtes en parallèle et diviser ces hôtes en groupes. puis scannez un groupe à la fois.
Exemple :
--min-hostgroup 50 nmap utilise 50 hôtes en tant que groupe, et les résultats ne seront pas affichés tant que 50 hôtes n'auront pas été analysés.
#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)
Comme le montre l'image, il faut 318 secondes pour exécuter 10 IP.
2. Port de détection Masscan
(1) Appelez python masscan
Par défaut, masscan envoie des paquets de données syn si l'hôte cible renvoie ack+syn, alors indique que. le port est ouvert. Le processus spécifique est le suivant
A:192.168.70.142
B:192.168.0.143 Ouvrir le port 3306
(1)A->B syn
( 2)B->A syn+ack
(3)A->B RST
Détecter les ports non ouverts
A->B syn
B->A rst
Exemple :
def portscan(ip): mas = masscan.PortScanner() mas.scan(ip,ports='1-65535') print(mas.scan_result)
Utiliser la commande système pour détecter
Comment utiliser
扫描扫描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. Port de détection de socket
Le port de détection de socket envoie un paquet de poignée de main à trois voies incomplet comme suit,
A:192.168.70.142
B:192.168.0.143 Ouvrez le port 3306
Après que A ait reçu le paquet syn+ack renvoyé par B, A rejette les données .
Détection des ports non ouverts
A envoie la synchronisation, mais B n'ouvre pas le port 33, donc les paquets RST sont renvoyés.
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()
Il a fallu 26,3 secondes pour détecter 10 IP, soit près de 2,6 secondes.
4. Port de détection Telnet
Le port de détection telnet utilise une connexion complète à trois voies, utilisez la commande telnet ip port, le processus d'envoi de paquets est le suivant
A:192.168.70.142
B:192.168.0.143 Ouvrir le port 3306
telnet 192.168.0.143 3306
Le processus est le suivant :
Utiliser TCP poignée de main à trois pour établir une connexion : 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没有。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!