加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 服务器 > 安全 > 正文

端口扫描方式有哪一些,你知晓多少?

发布时间:2023-04-11 11:14:05 所属栏目:安全 来源:
导读: 这篇文章我们来了解端口扫描的相关内容,下文讲给大家介绍nmap探测端口、masscan探测端口、socket探测端口、telnet探测端口、nc探测端口这五种端口扫描方式。感兴趣的朋友就继续往下看吧!

事件原由

 这篇文章我们来了解端口扫描的相关内容,下文讲给大家介绍nmap探测端口、masscan探测端口、socket探测端口、telnet探测端口、nc探测端口这五种端口扫描方式。感兴趣的朋友就继续往下看吧!

    事件原由
 
    笔者在写一个小工具,针对渗透测试中需要搜集的信息,使用脚本自动化采集。而在这个模块中有个很难搞的部分就是端口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没有。
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!