大家可以来学习学习噢!!!
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)调用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格式。
socket 探测端口发送的不是完整的三次握手包如下,
A:192.168.70.142
B:192.168.0.143 开放端口3306
A接收到B返回的syn+ack数据包后,A把数据丢弃。
探测不开放端口
A发送syn,B没有开放33端口,所以返回RST数据包。
ef 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()
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
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
nmap 作为扫描端口的神器扫描出的结果比其他几种方式要详细。速度慢
.
如果追求效率的话,建议采用socket。不详细
各有千秋,跟自己选择
关注新零云博客,获取原创PDF!
更多原创教程请扫码关注博客
我将自己的原创技术系列文章,自学方法经验总结均已整理成带有目录的PDF,方便大家下载学习,且持续更新,可与我一起交流PDF上的内容,不仅能学习技术,更能一起交流学习方法!不断成长,尽在编码之外!可为大家免费提供教程视频!