目录

 

简介 什么是python-nmap?

基本用法 怎么用python-nmap模块?

PortScanner类

PortScannerAsync类

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


简介 什么是python-nmap?

python-nmap是一个可以帮助使用nmap功能的python模块文件。在pytrhon-nmap模块的帮助下,可以轻松地在自己地程序中使用nmap扫描地结果,也可以编写程序自动化地完成扫描任务。

笔者目前使用地python-nmap地版本为0.61,这个模块的作者的个人网站为http://xael.org/。如果希望在Python中正常使用python-nmap模块,必须先在系统中安装Nmap。因为这个模块文件会调用Nmap的一些功能。目前在kali的环境里面已经安装好了Nmap。然后这个模块的安装在linux下则需要使用如下命令:

sudo apt-get install nmap //安装nmap

然后安装python-nmap

 sudo pip install python-nmap

nmon python解析 python nmap模块_nmon python解析

安装成功后,打开一个终端,启动Python,然后导入Nmap模块

nmon python解析 python nmap模块_TCP_02

记录一下手动安装的过程:

https://pypi.org/project/python-nmap/下载后

在kali机子中解压,然后进入该文件内。

nmon python解析 python nmap模块_TCP_03

nmon python解析 python nmap模块_端口号_04

输入命令:python setup.py install

同样安装成功。

至此python-nmap模块的安装已经结束了。

nmon python解析 python nmap模块_TCP_05

 

基本用法 怎么用python-nmap模块?

PortScanner类

包含的函数如下:

scan()函数:这个函数的完整形式为

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

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

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

参数arguments的值也是字符串类型,这个参数实际上就是Nmap扫描使用的参数,如“-sP””-PR””-sS””-O””-sV”等。这里“-sP”表示对目标进行Ping主机在线扫描,“-PR”表示对目标进行一个ARP的主机在线扫描,“-sS”表示对目标进行一个TCP半开(SYN)类型的端口扫描,-sT”表示对目标进行一个TCP全开类型的端口扫描,“-O”表示扫描目标的操作系统类型。“-sV”表示扫描目标上所安装的网络服务软件版本。

加入要对192.168.0.1的1-65535端口进行一次TCP半开扫描,可以使用的命令:

import nmap

nm=nmap.PortScanner()

nm.scan(‘192.168.0.1’,’1-65535’,’-sS’)

all_hosts():返回一个被扫描的所有主机列表。

nm.all_hosts()

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

nm.command_line()

csv():返回值是一个CSV(逗号分隔值文件格式)的输出

nm.csv()输出文件的内容不太容易观看。

一般使用为print(nm.csv())

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

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

另外这个类还支持如下的操作:

nm[‘192.168.0.1’].hostname()//获取192.168.0.1的主机名,通常为用户记录。

nm[‘192.168.0.1’].state()//获取主机的状态(up|down|unknown|skipped)

nm[‘192.168.0.1’].all_protocals()//获取执行的协议包含(IP|TCP|UDP|SCTP)

nm[‘192.168.0.1’].[‘tcp’].keys()//获取TCP所有的端口号

nm[‘192.168.0.1’].all_tcp()//获取TCP所有的端口号并且按照端口号大小排序

nm[‘192.168.0.1’].all_udp()//获取UDP所有的端口号并且按照端口号大小排序

nm[‘192.168.0.1’].all_sctp()//获取SCTP所有的端口号并且按照端口号大小排序

nm[‘192.168.0.1’].has_tcp(22)//判断主机是否有关于22端口的任何信息。

nm[‘192.168.0.1’].[‘tcp’][22]//获取主机关于22端口的信息。

nm[‘192.168.0.1’].tcp(22)//获取主机关于22端口的信息

nm[‘192.168.0.1’].[‘tcp’][22][‘state’]//获取主机22端口的状态(open)

PortScannerAsync类

scan():与PortScanner类中的scan()函数基本一样,但是多了一个回调函数。完整的scan()函数格式为scan(self.host=‘127.0.0.1’,port=None,arguments=’-sV’,callback=None.sudo=False),这里的callback是以(host,scan_data)为参数的函数。

这个类使用了如下三个用来实现异步的函数

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

用例:

import nmap
nma = nmap.PortScannerAsync()
nma.scan(hosts=”192.168.0.151”,arguments=’-sV’)
sta=nma.still_scanning()
print(sta)

      

nmon python解析 python nmap模块_渗透测试_06

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

stop():停止当前的扫描。

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

现在已经了解了python-nmap的用法,接下来简单做一个端口扫描器。扫描从192.168.65.151开放从1-1000的那些端口。

import nmap
nm = nmap.PortScanner()
nm.scan('192.168.65.151','1-1000')
for host in nm.all_hosts():
    print('----------------------')
    print('Host : %s (%s)' % (host.nm[host].hostname()))
    print('State : %s' % nm[host],state())
    for proto in nm.all_protocols():
        print('---------------')
        print('Protocol : %s' %proto)
        lport = nm[host][proto].keys()
        lport.sort()
        for port in lport:
                    print('port : %s\tstate : %s' %(port,nm[host][proto][port]['state']))

      

 执行结果如图所示。

nmon python解析 python nmap模块_渗透测试_07

       再做一个主机状态扫描。

import nmap
nm = nmap.PortScanner()
nm.scan(hosts='192.168.65.0/24',arguments='-sP')
hosts_list = [(host1,nm[host1]['status']['state']) for host1 in nm.all_hosts()]
for host, status in hosts_list:
    print(host + " is " + status)

nmon python解析 python nmap模块_端口号_08

       最后再来一个异步扫描,边扫描边输出。

import nmap
nma = nmap.PortScannerAsync()
def callback_result(host,scan_result):
    print '----------------'
    print host,scan_result
nma.scan(hosts='192.168.65.0/24',arguments='-sP',callback=callback_result)

nmon python解析 python nmap模块_渗透测试_09

至此,python-nmap的基础和简单应用介绍到此为止。

这个模块介绍一共分三个,昨天的是socket模块,今天是python-nmap模块,明天更新Scapy模块,简单的基础介绍完毕之后,就开始正式的渗透测试中的python应用了。