Nmap结合vulscan和nmap-vulner扫描结果解析 – 作者:zeros123

工作需求

工作过程中遇到高危端口扫描的需求,客户要求对目标资产进行全端口扫描,并将开放的端口及该端口可能存在的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

./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

1625557640_60e40a88e0e4f2bdec81a.png!small?1625557641299

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

解析结果如下:

1625559333_60e41125e16788c7d90e0.png!small?1625559334325

xml2excel输出如下:

1625557566_60e40a3e7343ea39e711c.png!small

来源:freebuf.com 2021-07-06 16:19:01 by: zeros123

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论