介绍
Nmap大家都很熟悉,很强大的网络扫描工具,可以用来进行主机发现、端口扫描、服务及版本检测、操作系统检测等。而python-nmap是可以调用nmap的一个模块文件,安装命令如下:
pip install python-nmap
安装后即可使用import导入,如果没有安装则会提示没有找到该模块,如下图。
参数
Python-nmap模块中有一个portscanner类,它是nmap工具的封装,以下为常见函数说明:
scan:用来对目标进行扫描,其中需要传入三个参数,host(字符串表示要扫描的主机,可以是ip或域名),ports(字符串表示要扫描的端口,形式和nmap一样,可以用逗号和横线分隔),arguments(字符串即nmap扫描时所用的参数,例如sS对目标进行TCP半开放端口扫描,即SYN)。示例如下:
import nmap
nm = nmap.PortScanner()
nm.scan(‘192.168.1.111’,’1-500’,’-sS’)
all_hosts:返回一个被扫描的主机列表。
command_line:返回当前扫描所使用的命令行。
csv:返回一个csv格式的输出,可结合print使用,例如print(nm.csv())。
has_host:检查是否有host的扫描结果。
scaninfo:列出一个扫描信息的结构。
hostname:获取主机名。
state:获取状态(up,down,unknown,skipped)。
all_protocols:获取执行的协议。
keys:格式为nm[host][proto].keys,用来获取tcp所有端口号。或者直接使用all_tcp获取所有tcp端口号,all_udp可获取所有udp端口号。
tcp(port):获取port端口相关信息,或者[‘tcp’][port]形式,[‘tcp’][port][‘state’]可获取port端口的状态。
示例
例如扫描192.168.150.134的1-1000端口,相关代码如下:
import nmap
nm = nmap.PortScanner()
nm.scan('192.168.150.134', '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[host].all_protocols():
print('--------------------------------------------------')
print('Protocol : %s' % proto)
lport = sorted(nm[host][proto].keys())
for port in lport:
print('port : %s\tstate : %s' % (port, nm[host][proto][port]['state']))
运行结果如下:
问题总结
上面简单的扫描器虽然短短几行代码,但会有一些问题出现。
我这里是都没有解决,可能是哪里加载错误,如果都不行可以试试这个办法,去官网http://xael.org/pages/python-nmap-en.html下载python-nmap的包,下载后里面有一个example的示例文件,这个文件你会发现可以运行,而它就用到了nmap模块,所以这里可以直接把下载的python-nmap包里的nmap文件夹放到python的安装目录,这时候再执行即可。
lport = nm[host][proto].keys()
lport.sort()
Python3后,迭代对象不再支持sort函数了,这里可以把获取的端口列表给到sorded函数,也就是上面示例中的写法。