python3调用masscan+nmap实现目标精确扫描

Masscan与Nmap整合扫描
本文介绍了一个使用Python整合masscan与nmap进行高效精确网络扫描的小程序。该程序首先利用masscan进行快速的大范围扫描,然后通过多线程方式调用nmap对masscan发现的目标进行详细扫描,特别是针对HTTP服务进行深入分析。

          想搞一个同时调用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、最后实现的效果如下

代码不算特别复杂,主要涉及的模块挺多的,对于我这样一个初学者,还是挺有意义的,供大家参考

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值