Nmap结合vulscan和nmap-vulner扫描结果解析
工作需求
工作过程中遇到高危端口扫描的需求,客户要求对目标资产进行全端口扫描,并将开放的端口及该端口可能存在的CVE漏洞进行格式化输出。由于目标较多,且客户无POC探测需求。
故使用nmap+vulscan+nmap-vulner+python脚本,基于软件版本进行扫描并编写python脚本将xml文档解析为excel格式输出
基本知识-nmap常用参数
复习一下nmap常见参数
-sS SYN半连接扫描,需root权限
-sT TCP三次握手扫描,较慢,不建议使用
-sV 探测端口服务banner信息
-Pn 不进行主机存活扫描,直接扫描指定端口
-v 在shell界面显示当前扫描过程
-oN/oX/oG 将nmap扫描结果输出为正常/XML/grep格式,建议格式为xml,扫描结果更完整,更易解析。
-iL file 读取文本内容作为扫描目标
--script xxx 使用内置脚本进行扫描
NSE内置脚本下载安装
nmap-vulner和vulscan都是为了增强Nmap的版本检测,为特定服务(如SSH,RDP,SMB等)生成相关的CVE信息。
nmap-vulner脚本下载
进入到nmap内置脚本目录下
cd /usr/share/nmap/script/
下载脚本
git clone https://github.com/vulnersCom/nmap-vulners.git
更新脚本库
nmap --script-updatedb
vulscan脚本下载
进入到nmap内置脚本目录下
cd /usr/share/nmap/script/
下载脚本
git clone https://github.com/scipag/vulscan.git
更新漏洞库
cd vulscan/utilities/updater/
chmod+x updateFiles.sh
扫描
命令:
结合vulscan和nmap-vulners两个脚本进行扫描
nmap --script nmap-vulners/ --script-args vulscandb=scriptvuldb.csv -sV -Pn 10.211.55.7 10.211.55.3 -v -p1-65535 -T4 --oX nmap.xml
XML解析
Python解析脚本如下:
# -*- coding: UTF-8 -*- # @Time :2021/7/5 10:08 上午 # @File :nmap_parser.py import xml.dom.minidom as xmldom import openpyxl firstline_list=["IP地址","开放端口","应用软件","软件版本","CVE漏洞编号"] info_list=[] with open("nmapxml.xml", "r", encoding="utf-8") as f: dom = xmldom.parse(f) # 读取xml文件 root = dom.documentElement # 获得xml文件中的元素对象 a = root.childNodes # 获得所有子节点 # def ip_info(): # global ip_list # for i1 in a: # if i1.nodeName=="hosthint": # ip=i1.getElementsByTagName("address") # for i2 in ip: # if i2.getAttribute("addrtype") == "ipv4": # host=i2.getAttribute("addr") # ip_list.append(host) # else: # pass def port_info(): host=root.getElementsByTagName("host") for i1 in host: a=i1.childNodes for i2 in a: if i2.nodeName=="address": if i2.getAttribute("addrtype")=="ipv4": # ip_list.append((i2.getAttribute("addr"))) host=i2.getAttribute("addr") # ip_list.append(host) # print("存活主机:",host) #输出ip地址 if i2.nodeName=="ports": # print(host) b=i2.childNodes for i3 in b: x=0 x=x+1 if i3.nodeName=="port": c=i3.childNodes for i4 in c: if i4.nodeName=="service": # print("port") #有几个开放端口就有几个ip地址 # sheet.cell(row=1, column=i + 1).value = i3.getAttribute("portid") # port_info=i3.getAttribute("portid")+i4.getAttribute("product")+i4.getAttribute("version") # port_list.append(i3.getAttribute("portid")) # version_list.append(i4.getAttribute("product")) # version_list.append(i4.getAttribute("version")) portid=i3.getAttribute("portid") a=i4.getAttribute("product") product=a.replace(" ","") version=i4.getAttribute("version") info=host+" "+portid+" "+product+" "+version info_list.append(info) print("存活主机:",host,"开放端口:",portid,"banner:",product,version)#输出端口banner if i4.nodeName=="script": d=i4.childNodes for i5 in d: if i5.nodeName =="table": e=i5.childNodes for i6 in e: if i6.nodeName == "table": f=i6.childNodes cve=' ' for i7 in f: if i7.nodeName == "elem" and i7.getAttribute("key") == "id" and str(i7.firstChild.data).startswith("CVE"): # name1 = str(i7.firstChild.data) # # print(name1) # if name1.startswith("CVE"): # vul_info=name1 cve=i7.firstChild.data # vul_list.append(i7.firstChild.data) # print("CVE编号:",cve) info = host + " " + portid + " " + product + " " + version+" "+cve info_list.append(info) def data2excel(): book = openpyxl.Workbook() sheet = book.active index=0 for i in range(len(firstline_list)): sheet.cell(row=1,column=i+1).value=firstline_list[i] for i1 in info_list: index +=1 listA=i1.split(" ",6) sheet.append(listA) book.save('nmap2excel.xlsx') if __name__ == '__main__': port_info() data2excel()
解析结果如下:
xml2excel输出如下:
