利于python脚本编写可视化nmap和masscan的方法
作者:Hunter网络安全 发布时间:2021-04-14 11:19:52
介绍
我编写了一个快速且带有斑点的python脚本,以可视化nmap和masscan的结果。它通过解析来自扫描的XML日志并生成所扫描IP范围的直观表示来工作。以下屏幕截图是输出示例:
由于缺少更好的词,我将从现在开始将输出称为地图。每个主机由一个彩色正方形表示。覆盖地图大部分内容的浅蓝色方块表示主机处于脱机状态(或仅未响应masscan的SYN。)其他彩色方块表示处于联机状态且具有开放端口的主机。正方形的颜色从蓝色到红色。正方形越红,表示主机上打开的端口越多。将鼠标悬停在每个方块上,将在工具提示中显示IP地址和打开的端口。
该工具非常有用,因为它使您可以大致了解IP范围,而不必在日志文件中拖网。它使您可以轻松查看扫描中的主机块。该工具可以从github下载,但是我将在下面描述代码的工作方式。
如何使用
首先,我要说这段代码没有经过优化。我已经针对/ 21的日志运行了代码,并花费了大约40秒钟来生成输出映射。
第一步是查找运行扫描的IP地址范围。由于扫描命令未保存在日志文件中,因此这真是一个痛苦。因此,我们必须根据最低和最高IP结果来计算范围。我们从扫描中解析XML文件,并将扫描到的每个IP地址附加到名为ipList的列表中
ipList = []
for event, element in etree.iterparse('output.xml', tag="host"):
for child in element:
if child.tag == 'address':
ipList.append(child.attrib['addr'])
然后,我们遍历ipList并将每个八位位组分成单独的列表,分别称为firstOctetRange,secondOctetRange,thirdOctetRang和forwardOctetRange。
firstOctetRange = []
secondOctetRange = []
thirdOctetRange = []
forthOctetRange = []
bitDelimeter = 0
startingIP = 0
endingIP = 0
for ip in ipList:
binaryOctet = ''
octets = ip.split('.')
firstOctetRange.append(int(octets[0]))
secondOctetRange.append(int(octets[1]))
thirdOctetRange.append(int(octets[2]))
forthOctetRange.append(int(octets[3]))
然后,我们将每个结果的每个八位位组与另一个结果的相同八位位组进行比较,以确定值发生变化的八位位组。例如。如果前两个八位位组始终相同。我们知道扫描的CIDR表示法将大于/ 16。我使用了变量bitDelimeter来存储CIDR表示法截取的八位字节的值。
if min(firstOctetRange) != max(firstOctetRange):
bitDelimeter = 0
elif min(secondOctetRange) != max(secondOctetRange):
bitDelimeter = 1
elif min(thirdOctetRange) != max(thirdOctetRange):
bitDelimeter = 2
elif min(forthOctetRange) != max(forthOctetRange):
bitDelimeter = 3
扫描的IP地址范围被添加到称为parsedServers的有序字典中。ip地址是使用一系列4个嵌套的FOR循环生成的,每个循环在0 – 256范围内循环。此范围开始的八位位组取决于bitDelimeter。例如。如果扫描了IP地址范围192.168.10.0/24。位定界符将为3,指示最后一个八位位组是更改其值的八位位组。因此,用于生成要放入parsedServers的IP地址的循环将固定前三个八位字节,并仅对最后一个八位字节循环范围为0 – 256。如果我们扫描/ 21,则位定界符将为2,因此生成IP地址的循环将固定前两个八位位组。将根据扫描的最小第三八位字节值和扫描的最大第三八位字节值的范围生成第三八位字节。第四个八位位组的范围是0 – 256。
if bitDelimeter == 0:
for one in range(min(firstOctetRange), max(firstOctetRange) + 1):
for two in range(0, 256):
for three in range(0, 256):
for four in range(0, 256):
ip = "%d.%d.%d.%d" % (one, two, three, four)
parsedServers[ip] = []
if bitDelimeter == 1:
one = min(firstOctetRange)
for two in range(min(secondOctetRange), max(secondOctetRange) + 1):
for three in range(0, 256):
for four in range(0, 256):
ip = "%d.%d.%d.%d" % (one, two, three, four)
parsedServers[ip] = []
if bitDelimeter == 2:
one = min(firstOctetRange)
two = min(secondOctetRange)
for three in range(min(thirdOctetRange), max(thirdOctetRange) + 1):
for four in range(0, 256):
ip = "%d.%d.%d.%d" % (one, two, three, four)
parsedServers[ip] = []
if bitDelimeter == 3:
one = min(firstOctetRange)
two = min(secondOctetRange)
three = min(thirdOctetRange)
for four in range(min(forthOctetRange), max(forthOctetRange) + 1):
ip = "%d.%d.%d.%d" % (one, two, three, four)
parsedServers[ip] = []
现在,我们有一个parsedServer排序的dict,其中包含我们扫描范围内的所有IP地址。下一步是将扫描中找到的打开端口添加到parsedServer字典中。
for event, element in etree.iterparse('output.xml', tag="host"):
for child in element:
if child.tag == 'address':
ipAddress = child.attrib['addr']
if child.tag == 'ports':
for subChild in child:
port = [subChild.attrib['portid']]
parsedServers[ipAddress].append(port)
现在,我们需要生成一个HTML页面,可用于可视化结果。这是使用Flask完成的。我们遍历包含所有数据的pasedServers字典。创建一个infoString,其中包含当前迭代的IP地址和端口。当光标悬停在地图上的正方形上时,将在工具提示中使用此功能。创建htmlBuffer并将其附加到parsedServers字典的每次迭代中。每次迭代都会添加HTML代码,以使用从colourRange列表中提取的颜色添加新的表格数据单元。范围中总地址的平方根表示何时需要在表中添加新行。这样可以使结果在页面上显示为正方形。
count = 0
htmlBuffer = Markup('')
for key, value in parsedServers.items():
infoString = str(key) + '<br>'
if value:
infoString += 'Ports:'
for portValue in value:
infoString += str(portValue) + ','
colourRange = ['94A5FF', '0024E5', '2422C5', '4821A6', '6D1F87', '911E67', 'B61C48', 'DA1B29', 'FF1A0A']
htmlBuffer += Markup('<td class="tooltip", bgcolor="' + colourRange[len(value)] + '"><span class="tooltiptext">' + infoString + '</span></td>')<br> count += 1<br> if count > math.sqrt(len(parsedServers)):<br> htmlBuffer += Markup('</tr><tr>')
count = 0
例如。我们正在parsedServers中进行迭代,地址为192.168.10.22,并且打开了3个端口。将使用工具提示中列出的IP地址和端口创建一个表格数据单元。单元格的背景颜色将从包含9个十六进制颜色代码的colourRange列表中提取。列表上的索引越高,颜色越红色。在此示例中,IP地址有3个开放的端口。因此,第三个索引中的颜色将设置为背景色,从而使数据单元格变为紫色。
最后,我们将模板传递给htmlBuffer。然后运行Web服务器。通过浏览至127.0.0.1:5000,可以找到输出。
@app.route('/')
def index():
return render_template('index.html', name=htmlBuffer)
if __name__ == '__main__':
app.run()
来源:https://blog.csdn.net/qq_25879801/article/details/110879474


猜你喜欢
- 一、什么是用户体验?用户体验的名词解释用户体验(User Experience,简称UE)是一种纯主观的在用户使用一个产品(服务)的过程中建
- 数据库的启动过程(3个台阶)1.nomountshutdown --> nomountstartup nomountselect st
- 当需要定时修改数据库时,一般我们都选择起一个定时进程去改库。如果将这种定时任务写入业务中,写成一个接口呢,定时进程显得有些不太合适?如果需要
- 问题描述:一个父容器也是window的window下的comboBox在页面中点击无效,但是在控制台中查看它的store却是有值的,问题在于
- 本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下:官方文档 – https://docs.opencv
- 前言当前二维码的应用越来越广泛,包括疫情时期的健康码也是应用二维码的典型案例,最近需要通过一张二维码显示较多文本数据,也就是对二维码数据进行
- vue中为何方法要写在methods里面1.methods是什么?首先先来段代码,我们在template中设定一个按钮,在点击按钮的时候打印
- 一、修改密码1.1 创建修改密码控制器运行命令php artisan make:controller Auth/PasswordContro
- 第一题:ASP中,VBScript的唯一的数据类型是什么?第二题:在ASP中,VBScript有多种控制程序流程语句,如If…Then, S
- 本文为大家分享了js实现简单选项卡功能的具体代码,供大家参考,具体内容如下首先我们来写HTML代码,构建出整体结构代码如下:<!--导
- 以前写过一个刷校内网的人气的工具,Java的(以后再也不行Java程序了),里面用到了验证码识别,那段代码不是我自己写的:-) 校内的验证是
- 生成一个2000*5的表格,每个单元格的内容是行号+逗号+列号 方法一:使用createElement生成表格,使用insertRow和in
- PyQt5选项卡控件QTabWidget简介QTabWidget控件提供了一个选项卡和一个页面区域,默认显示第一个选项卡的页面,通过单击各选
- 很多网站都有“浏览历史”这个功能,通常都是显示在页面的一侧,特别是一些购物网站,这个功能会让用户使用网站的体验好一些;例如当当网或淘宝网都有
- 经常地我们需要编写跨平台的脚本,但是由于不同的平台的差异性,我们不得不获得当前所工作的平台(操作系统类型)。代码如下:import plat
- SQL Server的容灾功能一直弱于Oracle和MySQL,无法自动同步元数据(用户、登录名、权限、SQL 代理作业、链接服务器),导致
- 形参可以设置参数默认值,设置遵循从右至左原则例如:fun(x=0,y=1),fun(x,y=1),但不可以是fun(x=1,y)形参设置可以
- Python实现完整邮件先上效果:一、邮箱端设置首先,要对邮件进行一下设置,在邮箱端获取一个授权码。1、首先登录网页版126邮箱
- 感觉这个东西很常用,很多其它js框架里有,但是太大了,用不了太多,自己写了个。需要的朋友可以参考下。下面是html测试代码:<!DOC
- 这篇文章主要介绍了Python JSON编解码方式原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要