python-nmap 模块
简介
- nmap以下功能:
- 主机发现功能
- 端口扫描
- 服务器版本检测
- 操作系统检测
- 此外还有一些高级审计技术(伪造扫描段身份、绕过防火墙等)、脚本引擎NSE等。
- 安装python-nmap,须先安装nmap。
- Windows直接下载安装
- Linux需要如下命令:
sudo apt-get install nmap
sudo pip install python-nmap
- 安装之后打开终端,启动python,导入nmap。
基本用法
- python-nmap模块的核心PortScanner、PortScannerAsync、PortScannerError、PortScannerHostDict、PortScannerYield等5个类。
- python-nmap实例化
- 最常用的PortScanner类,实现Nmap工具功能的封装。
>>>import nmap
>>> nm = nmap.PortScanner()
- PortScannerAsync类,实现异步扫描。
>>> nm = nmap.PortScannerAsync()
- Python-nmap模块函数
- PortScanner类的函数:
scan()
:完整形式为sacn(self,host=‘127.0.0.1’,port=None,arguments=’-sV’,sudo=False),用来对指定目标进行扫描。参数hosts
的值为字符串类型,表示要扫描的主机,形式可以是IP地址或域名;参数ports
的值也是字符串类型,表示要扫描的端口,多个端口进行扫描时用逗号分隔开,连续扫描使用横线;参数arguments
的值也是字符串类型,这个参数就是Nmap扫描时使用的参数("-sP"对目标主机进行ping主机在线扫描,"-PR"对目标主机进行ARP主机在线扫描,"-sS"对目标主机进行TCP半开SYN类型的端口扫描,"-sT"对目标主机进行TCP全开类型的端口扫描,"-O"表示扫描目标的操作系统类型,"-sV"扫描目标所安装网络服务软件的版本)。
>>> nm = nmap.PortScanner()
>>> nm.scan('192.168.1.6','1-500','-sS')
all_hosts()
:返回一个被扫描的所有主机列表。
>>> nm.all_hosts()
['192.168.1.6']
command_line()
:返回在当前扫描中使用的命令行。
>>> nm.command_line()
'nmap -oX - -p 1-500 -sS 192.168.1.6'
csv()
:返回值是一个CSV(逗号分隔值文件格式)的输出。
>>> nm.csv()
'host;hostname;hostname_type;protocol;port;name;state;product;extrainfo;reason;version;conf;cpe\r\n192.168.1.6;win-ojspvlsmn7r;PTR;tcp;135;msrpc;open;;;syn-ack;;3;\r\n192.168.1.6;win-ojspvlsmn7r;PTR;tcp;139;netbios-ssn;open;;;syn-ack;;3;\r\n192.168.1.6;win-ojspvlsmn7r;PTR;tcp;445;microsoft-ds;open;;;syn-ack;;3;\r\n
>>> print(nm.csv())
host;hostname;hostname_type;protocol;port;name;state;product;extrainfo;reason;version;conf;cpe
192.168.1.6;win-ojspvlsmn7r;PTR;tcp;135;msrpc;open;;;syn-ack;;3;
192.168.1.6;win-ojspvlsmn7r;PTR;tcp;139;netbios-ssn;open;;;syn-ack;;3;
192.168.1.6;win-ojspvlsmn7r;PTR;tcp;445;microsoft-ds;open;;;syn-ack;;3;
has_host(self,host)
:检查是否有host的扫描结果,如果有则返回True,否则返回False。
>>> nm.has_host("192.168.1.6")
True
>>> nm.has_host("192.168.1.1")
False
>>> nm.scaninfo()
{'tcp': {'services': '1-500', 'method': 'syn'}}
>>> nm['192.168.1.6'].hostname()
''
>>> nm['192.168.1.6'].state()
'up'
>>> nm['192.168.1.6'].all_protocols()
['tcp']
>>> nm['192.168.1.6'].keys()
['status', 'hostnames', 'vendor', 'addresses', 'tcp']
>>> nm['192.168.1.6'].all_tcp()
[135, 139, 445]
>>> nm['192.168.1.6'].all_udp()
[]
>>> nm['192.168.1.6'].all_sctp()
[]
>>> nm['192.168.1.6'].has_tcp(135)
True
>>> nm['192.168.1.6']['tcp'][135]
{'product': '', 'state': 'open', 'version': '', 'name': 'msrpc', 'conf': '3', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': ''}
>>> nm['192.168.1.6'].tcp(135)
{'product': '', 'state': 'open', 'version': '', 'name': 'msrpc', 'conf': '3', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': ''}
>>> nm['192.168.1.6']['tcp'][135]['state']
'open'
- PortScannerAsync类的函数
scan()
:多一个回调函数,完整形式为scan(self,hosts=‘127.0.0.1’,port=None,arguments=’-sV’,callback=None,sudo=False),这里的callback是(host,scan_data)为参数的函数。
>>> nma = nmap.PortScannerAsync()
>>> nma.scan(hosts = "192.168.1.0/24",arguments = '-sP')
still_scanning()
:如果扫描正在进行,则返回True,否则返回False。
>>> sta = nma.still_scanning()
>>> sta
False
wait(self,time=None)
:表示等待时间
>>> nma.wait(5)