- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章利于python脚本编写可视化nmap和masscan的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
我编写了一个快速且带有斑点的python脚本,以可视化nmap和masscan的结果。它通过解析来自扫描的xml日志并生成所扫描ip范围的直观表示来工作。以下屏幕截图是输出示例:
由于缺少更好的词,我将从现在开始将输出称为地图。每个主机由一个彩色正方形表示。覆盖地图大部分内容的浅蓝色方块表示主机处于脱机状态(或仅未响应masscan的syn。)其他彩色方块表示处于联机状态且具有开放端口的主机。正方形的颜色从蓝色到红色。正方形越红,表示主机上打开的端口越多。将鼠标悬停在每个方块上,将在工具提示中显示ip地址和打开的端口.
该工具非常有用,因为它使您可以大致了解ip范围,而不必在日志文件中拖网。它使您可以轻松查看扫描中的主机块。该工具可以从github下载,但是我将在下面描述代码的工作方式.
首先,我要说这段代码没有经过优化。我已经针对/ 21的日志运行了代码,并花费了大约40秒钟来生成输出映射.
第一步是查找运行扫描的ip地址范围。由于扫描命令未保存在日志文件中,因此这真是一个痛苦。因此,我们必须根据最低和最高ip结果来计算范围。我们从扫描中解析xml文件,并将扫描到的每个ip地址附加到名为iplist的列表中 。
1
2
3
4
5
|
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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表示法截取的八位字节的值.
1
2
3
4
5
6
7
8
|
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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字典中.
1
2
3
4
5
6
7
8
|
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列表中提取的颜色添加新的表格数据单元。范围中总地址的平方根表示何时需要在表中添加新行。这样可以使结果在页面上显示为正方形.
1
2
3
4
5
6
7
8
9
10
11
|
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,可以找到输出.
1
2
3
4
5
6
|
@app
.route(
'/'
)
def
index():
return
render_template(
'index.html'
, name
=
htmlbuffer)
if
__name__
=
=
'__main__'
:
app.run()
|
到此这篇关于利于python脚本编写可视化nmap和masscan的文章就介绍到这了,更多相关python编写可视化nmap和masscan内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/qq_25879801/article/details/110879474 。
最后此篇关于利于python脚本编写可视化nmap和masscan的方法的文章就讲到这里了,如果你想了解更多关于利于python脚本编写可视化nmap和masscan的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!