Python-nmap模块 同步 异步 实例

Python-nmap模块 同步 异步 实例,第1张

目前Nmap已经具备如下的各种功能。

1.主机发现功能。向目标计算机发送信息,然后根据目标的反应来确定它是否处于开机并联网的状态。

2.端口扫描。向目标计算机的指定端口发送信息,然后根据目标端口的反应来判断它是否开放。

3.服务及版本检测。向目标计算机的目标端口发送特制的信息,然后根据目标的反应来检测它运行服务的服务类型和版本。

4. *** 作系统检测。

python-nmap

python-nmap是一个可以帮助使用Nmap功能的Python模块文件

python-nmap模块的帮助下,可以轻松地在自己的程序中使用Nmap扫描的结果,也可以编

写程序自动化地完成扫描任务。

模块的作者的个人网站为http://xaelorgl

如果希望在Python中正常使用python-nmap模块,必须先在系统中安装Nmap。因为在这个模块

文件中会调用Nmap的一些功能。

Windows *** 作系统下直接下载安装即可 Linux *** 作系统中则需要使用如下命令。

sudo apt-get install nmap

然后安装python-nmap

sudo pip install python-nmap

如果希望在Python中正常使用python-nmap模块,必须先在系统中安装Nmap。因为在这个模块文件中会调用Nmap的一些功能。

Windows *** 作系统下直接下载安装即可

Linux *** 作系统中则需要使用如下命令。

sudo apt-get install nmap

然后安装python-nmap

sudo pip install python-nmap

Kali需要使用如下命令:

安装成功之后,打开一个终端,启动Python,然后导入Nmap,如下图所示。

导入python-nmap模块

从图中可以看出已经成功导入Nmap模块,现在可以正常使用。

基本用法

python-nmap模块的核心就是

PortScarinerPortScannerAsyncPortScannerErrorPortScannerHostDictPortScannerYield

5个类,其中最为重要的是PortScanner类。

python-nmap模块类的实例化

最常使用的是PortScanner类,这个类实现Nmap工具功能的封装。对这个类进行实例化很简单只需要如下语句即可实现。

nmap.PortScanner()

执行的结果如图所示

PortScannerAsync类和PortScanner类的功能相似,但是这个类可以实现异步扫描,对这个类的实例化语句如下

nmap.PortScannerAslync()

执行的结果如图所示。

使用PortScannerAsync()实例化

python-nmap模块中的函数

首先看一下PortScanner类,这个类中包含如下几个函数。

scan()函数:

这个函数的完整形式为

scan(self,hosts = ’127.0.0.1',ports-None,arguments = ’sV’,sudo = False)用来对指定目标进行扫描,其中需要设置的三个参数包括hostsportsarguments

scan(self,hosts = ’127.0.0.1',ports-None,arguments = ’sV’,sudo = False)

参数hosts的值为字符串类型,表示要扫描的主机,形式可以是IP地址,例如“192.168.1.1”,也可以是一个域名例如“www.nmap.org”。

参数ports的值也是字符串类型,表示要扫描的端口。如果要扫描的是单一端口,形式可以为“80”。如果要扫描的是多个端口,可以用逗号分隔开,形式为“80,443,8080”。如果要扫描的是连续的端口范围,可以用横线,形式为“1-1000

参数arguments的值也是字符串类型,这个参数实际上就是Nmap扫描时所使用的参数。

如“-SP”“-PR”“-sS”“-sT"-O”“-sV”等。

-SP”表示对目标进行Ping三机在线扫描

-PR”表示对目标进行一个ARP的主机在结一程

-SS”表示对目标进行一个TCP半开(SYN)类型教端口扫描

-ST”表示对目标进行一个TCP全开类型的端口扫描

-O”表示扫描目标的 *** 作系纷类型

sV”表示扫描目标上所安装网络服务软件的版本

如果要对本机一个网段进行扫描 cmd-----ipconfig-------无线局域适配器WLAN 192.168.1.2

同步:

同步后可进行all_hosts()函数:

command_line()函数:

异步:

如果要对192.168.1.21500端口进行一次TCP半开扫描,可以使用如图所示的

 

all_hosts()函数:返回一个被扫描的所有主机列表—IP地址列表

command_line()函数:返回在当前扫描中使用的命令行

csv()函数:返回值是一个CSV(逗号分隔值文件格式)的输出,如图所示。显示一个比较工整的扫描结果

没有扫描到结果

对虚拟机上window10IP进行扫描

has_host(self, host)函数:检查是否有host的扫描结果,如果有则返回True,否则返回False

scaninfo()函数:列出一个扫描信息的结构

举例:

获取tcp所有的端口号

获取主机192.168.202.129关于135端口的信息

获取主机135端口的状态

PortScannerAsync类中最为重要的函数也是scan()

用法与PortScanner类中的scan()基本一样,但是多了一个回调函数。

完整的scan()函数格式为

         scan(self, hosts='127.0.0.1',ports=None, arguments='-sV', callback=None, sudo=False)

这里面的callback是以(host, scan_data为参数的函数

这个类中提供了以下三个用来实现异步的函数。

still_scanning():如果扫描正在进行,则返回True,否则返回False

stop():停止当前的扫描

wait(self, timeout=None):函数表示等待时间

使用python-nmap模块来编写一个扫描器

1:编写一个简单的端口扫描器。扫描192.168.202.0开放从11000的哪些端口,这里先使用命令行来完成这个程序。

nm.scan('192.168.202.0/24', '1-1000')
#
获取 该网段的主机IP地址---> IP 地址的列表
ip_list = nm.all_hosts()
# print(nm) 
for host in ip_list:
    print("-" * 50)
    print(f"Host:{host}({nm[host].hostname()})")  #
打印 IP地址和 host-name
    print(f'State:{nm[host].state()}')

    #
从获取到的一台主机当中,获取 主机的端口号
   
for protocol in nm[host].all_protocols():
        print("-" * 50)
        print(f'Protocol:{protocol}')
        l_port = nm[host][protocol].keys()
        # l_port.sort()
        print(l_port)
        for port in l_port:  #
遍历 主机的端口列表
           
print(f"port:{port}\t"
                  f"state:{nm[host][protocol][port]['state']}")

编写完后脚本放入虚拟机kali中去运行

运行结果:

例2:编写一个简单的扫描器,扫描192.168.202.0/24网段,有哪些主机
import nmap
nm = nmap.PortScanner()
nm.scan(hosts='192.168.202.0/24', arguments='-sP')
host_list = [(x,nm[x]['status']['state'])for x in nm.all_hosts()]
for host,status in host_list:
    print(host+" is "+status)

编写完后脚本放入虚拟机kali中去运行

运行结果:

使用一个异步程序:

在使用scan函数扫描的过程中会执行callback_result函数,可以一边扫描一边输出扫描的结果

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/727503.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存