浅析端口扫描的几种方式

2019-01-21 33,827

事件原由

笔者在写一个小工具,针对渗透测试中需要搜集的信息,使用脚本自动化采集。而在这个模块中有个很难搞的部分就是端口banner 信息搜集,起初我尝试使用了python+nmap+多线程扫描,扫描20+的ip,等的花都谢了。。。而笔者目标是扫描200+的ip。下面我就针对端口扫描的技术进行分析。

1.nmap探测端口

nmap在扫描多个主机的时候可以设置参数 --min-hostgroup ,设置这个参数可以并行扫描多个主机,将这些主机划分成组,然后一次扫描一个组。

栗子

--min-hostgroup 50 nmap 以50个主机为一组,在扫描完50个主机之前不会显示结果,具体介绍参见nmap官网。

#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)

图片1.png

如图,运行10个ip需要318s。

安全脉搏:https://www.secpulse.com/archives/95604.html

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

图片2.png

探测未开放的端口

A->B syn

B->A rst

图片3.png

栗子

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格式。

安全脉搏:https://www.secpulse.com/archives/95604.html

3.socket探测端口

socket 探测端口发送的不是完整的三次握手包如下,

A:192.168.70.142

B:192.168.0.143 开放端口3306

A接收到B返回的syn+ack数据包后,A把数据丢弃。

图片4.png

探测不开放端口

A发送syn,B没有开放33端口,所以返回RST数据包。

图片5.png

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()

图片6.png

探测10个ip花费了26.3s差不多一个2.6s。

安全脉搏:https://www.secpulse.com/archives/95604.html

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

图片7.png

探测不存在端口,发送SYN数据包,然后RST包丢弃

图片8.png

如果有返回值,则说明端口开放,否则则端口关闭。

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

图片9.png

探测10个ip花费了27.8s差不多一个2.7s。

安全脉搏:https://www.secpulse.com/archives/95604.html

5.nc探测端口

nc探测端口采用完整的三次握手连接,使用命令 nc -v -w 1 -z ip port,发包过程和telent 探测一样。

探测开放端口的数据包

图片10.png

探测未开放端口的数据包

图片11.png

端口开放,返回值为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

图片12.png

备注:比如你想探测某个指定的端口开放情况,推荐使用nc。

安全脉搏:https://www.secpulse.com/archives/95604.html

总结

nmap 作为扫描端口的神器,扫描出的结果比其他几种方式要详细。如果追求效率的话,建议采用socket。相比于nmap,socket会存在漏报情况,笔者在测试某主机时,nmap扫出了8888端口,但是socket没有。

安全脉搏:https://www.secpulse.com/archives/95604.html

参考文章

http://www.4hou.com/tools/8251.html
https://nmap.org/book/man-performance.html

本文作者:crhua

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/95604.html

Tags:
评论  (0)
快来写下你的想法吧!

crhua

文章数:1 积分: 0

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号