想搞一个同时调用masscan和nmap实现目标精确扫描的小程序,网上找了很多版本,大多都是python2基础上的,代码也没法拿过来直接用,各种报错,所以根据几位大佬的内容, 网上学了点,大致整理了下。
1、调用masscan扫描同一路径下的IP.txt,生成一份xml结果文件。之后再调用这份结果文件,将IP和端口分别写入组内。
import os
import xmltodict
import nmap
import threading
import requests
import chardet
import re
import urllib3
def masscan():#调用masscan程序函数
os.system("masscan -iL IP.txt --rate 2000 -p1-2000 -oX masscan.xml")#调用masscan扫描程序,扫描结果生成masscan.xml文档
def read_result(PATH1):#读取masscan扫描结果函数
####打开masscan的扫描结果文件
path_1=PATH1
IP_addr=[] #创建一个存放IP的list
ports=[] #创建一个存放端口的list
with open(path_1) as f:#打开扫描结果文档
xml_obj = xmltodict.parse(f.read())
host = xml_obj['nmaprun']['host']
for line in host:#逐行获取扫描结果
ip_add = line['address']['@addr']#ip地址
port_num = line['ports']['port']['@portid']#端口号
IP_addr.append(ip_add) #数值保存到list
ports.append(port_num)
return IP_addr,ports
2、创建一个多线程的类,毕竟nmap一个个扫描是在太慢了。
class Nmapscan(threading.Thread): #多线程
def __init__(self,a,b):
super(Nmapscan,self).__init__() #重构run函数必须写
self.a = a
self.b = b
def run(self):
n_nmap(self.a,self.b)
3、这是一个nmap扫描的函数,调用nmap,发现端口具体的协议,如果是HTTP协议,则做进一步分析。
def n_nmap(a,b):
global results #定义结果的全局变量
global lock
nm = nmap.PortScanner()
ip_add=a
port_num=b
nmap_result=""
ret = nm.scan(ip_add, port_num, arguments='-Pn') #调用nmap模块
service_name = ret['scan'][ip_add]['tcp'][int(port_num)]['name']
print('[*]主机 ' + ip_add + ' 的 ' + str(port_num) + ' 端口服务为:' + service_name)
if 'http' in service_name or service_name == 'sun-answerbook':
if service_name == 'https' or service_name == 'https-alt':
lock.acquire() #进程锁
results.append(ip_add + "\t" + str(port_num) + "\t" + service_name + "\n")
lock.release() #解锁
else:
Title(ip_add, str(port_num),service_name) #如果是HTTPS,去获取网页头
else:
lock.acquire()
results.append( ip_add+"\t"+str(port_num)+"\t"+service_name+"\n")
lock.release()
4、title函数,负责获得HTTP的标题和其他想要的数据。
def Title(IP_add,Port_num,service_name): #获得文件头函数
global lock
global results
scan_url_port = 'http://' + IP_add + ':' + Port_num #创建URL
r = requests.get(scan_url_port,timeout=3) #获得反馈包
#获取网站的页面编码
r_detectencode = chardet.detect(r.content)
l = r.content.decode('utf-8') #转成中文
response = re.findall('<title>(.*?)</title>', l,re.S) #获得网页标题
if response == []:
lock.acquire()
results.append(IP_add+"\t"+Port_num+"\t"+service_name+"\t"+"状态码:"+str(r.status_code)+"\n") #加入结果集
lock.release()
else:
res = response[0]
banner = r.headers['server']
lock.acquire()
results.append(IP_add+"\t"+Port_num+"\t"+service_name+"\t"+banner+"\t"+res+"\n")
lock.release()
6、主函数比较简单,主要是定义线程数量和写入内容。
lock=threading.Lock() #进程锁
masscan()
ipadd=[]
ports=[]
results=[]
ipadd,ports=read_result("masscan.xml")
threads = []
thread_count = 10 #进程数
n=0
k=len(ipadd)
for i in range(thread_count):
threads.append(Nmapscan(ipadd[n],ports[n])) #调用主函数
n=n+1
if n==k:
break
for t in threads:
t.start()
for t in threads:
t.join()
with open('result.txt', 'a') as ff:
for res in results:
ff.write(res) #结果集写入文件
ff.close()
6、最后实现的效果如下

代码不算特别复杂,主要涉及的模块挺多的,对于我这样一个初学者,还是挺有意义的,供大家参考
Masscan与Nmap整合扫描
本文介绍了一个使用Python整合masscan与nmap进行高效精确网络扫描的小程序。该程序首先利用masscan进行快速的大范围扫描,然后通过多线程方式调用nmap对masscan发现的目标进行详细扫描,特别是针对HTTP服务进行深入分析。
1989

被折叠的 条评论
为什么被折叠?



