端口扫描方式有哪一些
发布时间:2023-12-27 14:26:38 所属栏目:安全 来源:DaWei
导读: 这篇文章我们来了解端口扫描的相关内容,下文讲给大家介绍nmap探测端口、masscan探测端口、socket探测端口、telnet探测端口、nc探测端口这五种端口扫描方式。感兴趣的朋友就继续往下看吧!
这篇文章我们来了解端口扫描的相关内容,下文讲给大家介绍nmap探测端口、masscan探测端口、socket探测端口、telnet探测端口、nc探测端口这五种端口扫描方式。感兴趣的朋友就继续往下看吧! 下面我就针对端口扫描的技术进行分析。 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) 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没有。 现在大家对于的几种常见方式应该都有所了解了,希望大家阅读完这篇文章能有所收获。 (编辑:大连站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐