工作需求
工作过程中遇到高危端口扫描的需求,客户要求对目标资产进行全端口扫描,并将开放的端口及该端口可能存在的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输出如下:
来源:freebuf.com 2021-07-06 16:19:01 by: zeros123
请登录后发表评论
注册