目录
简介 什么是python-nmap?
基本用法 怎么用python-nmap模块?
PortScanner类
PortScannerAsync类
用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
安装成功后,打开一个终端,启动Python,然后导入Nmap模块
记录一下手动安装的过程:
在https://pypi.org/project/python-nmap/下载后
在kali机子中解压,然后进入该文件内。
输入命令:python setup.py install
同样安装成功。
包含的函数如下:
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)
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)
wait(self,timeout=None):函数表示等待时间
stop():停止当前的扫描。
现在已经了解了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']))
执行结果如图所示。
再做一个主机状态扫描。
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)
最后再来一个异步扫描,边扫描边输出。
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)
至此,python-nmap的基础和简单应用介绍到此为止。
这个模块介绍一共分三个,昨天的是socket模块,今天是python-nmap模块,明天更新Scapy模块,简单的基础介绍完毕之后,就开始正式的渗透测试中的python应用了。