安装nmap模块:
1 | pip install python_nma |
nmap模块说明:
python-nmap是一个帮助使用nmap端口扫描器的python库。它允许轻松操纵nmap扫描结果,并且将是一个完美的选择,为需要自动完成扫描任务的系统管理员提供的工具并报告。它也支持nmap脚本输出。
nmap模块类:
ET:Python的轻量级XML支持
PortScanner:端口扫描
PortScannerAsync:异步进行端口扫描
PortScannerError:nmap的异常错误类
PortScannerHostDict:用于存储和访问主机扫描结果的特殊小类
PortScannerYield:通过生成器使用Python中的nmap
Process:表示在单独的过程中运行的活动,应该是控制扫描进程之类的
convert_nmap_output_to_encoding:编码
csv:CSV操作模块
io:
nmap:
os:
re:
shlex:
subprocess:
sys:
看大概意思就知道,我们这里主要是用PortScanner、PortScannerError、PortScannerHostDict这三个类
PortScanner:普通端口扫描类
初始化PortScanner类,首先看看该模块的__init__构造函数说明。
检测系统和nmap版本上的nmap,如果在路径中找不到nmap,可能会引发PortScannerError异常
1 | __init__( self , nmap_search_path = ( 'nmap' , '/usr/bin/nmap' , '/usr/local/bin/nmap' , '/sw/bin/nmap' , '/opt/local/bin/nmap' )) |
如果你调用PortScanner模块异常,可能就是nmap_search_path默认路径里没找到你安装的nmap可执行文件,需要你手动修改此参数默认值即可。
该类里的方法说明:
123456789101112131415161718192021222324252627 | all_hosts():返回所有主机的排序列表 analyse_nmap_xml_scan(nmap_xml_output = None , nmap_err = ' ', nmap_err_keep_trace=' ', nmap_warn_keep_trace=' '):分析NMAP xml扫描输出 param nmap_xml_output:要分析的xml字符串 command_line():返回用于扫描的命令行 csv():将CSV输出作为文本返回 get_nmap_last_output():以原始文本返回nmap的最后文本输出 has_host(host):如果主机有结果则返回 True ,否则返回 False listscan(hosts = '127.0.0.1' ):不要扫描,但解释目标主机并返回一个主机列表 nmap_version():如果检测到返回nmap版本 scan(hosts = '127.0.0.1' , ports = None , arguments = '-sV' , sudo = False ):扫描指定的主机 如果nmap输出不是xml,可能会引发PortScannerError异常 hosts:需要扫描的IP或IP段 ports:扫描的端口 arguments:nmap的参数字符串 '-sU -sX -sC' sudo:是否使用sudo启动nmap scaninfo():返回scaninfo结构{ 'tcp' : { 'services' : '22' , 'method' : 'connect' }} scanstats():返回scanstats结构{ 'uphosts' : '3' , 'timestr' : 'Thu Jun 3 21:45:07 2010' , 'downhosts' : '253' , 'totalhosts' : '256' , 'elapsed' : '5.79' } |
实例演示:
>>> nm = nmap.PortScanner() #实例化普通端口扫描对象nm >>> nm.nmap_version() #看看当前系统nmap版本 ( 7 , 70 ) #当前版本为nmap7.7 >>> date = nm.scan( '127.0.0.1' , '22' , '-sV' ) #进行扫描,会弹出nmap cmd窗口,会一直等待扫描结束,然后返回json格式的扫描结果date { 'nmap' : { 'command_line' : 'nmap -oX - -p 22 -sV 127.0.0.1' , 'scaninfo' : { 'tcp' : { 'method' : 'syn' , 'services' : '22' }}, 'scanstats' : { 'timestr' : 'Fri Apr 13 10:43:29 2018' , 'elapsed' : '8.71' , 'uphosts' : '1' , 'downhosts' : '0' , 'totalhosts' : '1' }}, 'scan' : { '127.0.0.1' : { 'hostnames' : [{ 'name' : ' ', ' type ': ' '}], ' addresses ': {' ipv4 ': ' 127.0 . 0.1 '}, ' vendor ': {}, ' status ': {' state ': ' up ', ' reason ': ' localhost - response '}, ' tcp ': {22: {' state ': ' open ', ' reason ': ' syn - ack ', ' name ': ' ssh ', ' product ': ' Microsoft Windows IoT sshd ', ' version ': ' 1.100 ', ' extrainfo ': ' protocol 2.0 ', ' conf ': ' 10 ', ' cpe ': ' cpe: / o:microsoft:windows_10:::iot_core'}}}}} >>> nm.all_hosts() [ '127.0.0.1' ] >>> nm.command_line() 'nmap -oX - -p 22 -sV 127.0.0.1' >>> nm.csv() 'host;hostname;hostname_type;protocol;port;name;state;product;extrainfo;reason;version;conf;cpe\r\n127.0.0.1;;;tcp;22;ssh;open;Microsoft Windows IoT sshd;protocol 2.0;syn-ack;1.100;10;cpe:/o:microsoft:windows_10:::iot_core\r\n' >>> nm.get_nmap_last_output() '<?xml version="1.0" encoding="UTF-8"?>\r\n<!DOCTYPE nmaprun>\r\n<?xml-stylesheet href="file:///d:/Program Files (x86)/Nmap/nmap.xsl" type="text/xsl"?>\r\n<!-- Nmap 7.70 scan initiated Fri Apr 13 10:43:20 2018 as: nmap -oX - -p 22 -sV 127.0.0.1 -->\r\n<nmaprun scanner="nmap" args="nmap -oX - -p 22 -sV 127.0.0.1" start="1523587400" startstr="Fri Apr 13 10:43:20 2018" version="7.70" xmloutputversion="1.04">\r\n<scaninfo type="syn" protocol="tcp" numservices="1" services="22"/>\r\n<verbose level="0"/>\r\n<debugging level="0"/>\r\n<host starttime="1523587408" endtime="1523587409"><status state="up" reason="localhost-response" reason_ttl="0"/>\r\n<address addr="127.0.0.1" addrtype="ipv4"/>\r\n<hostnames>\r\n</hostnames>\r\n<ports><port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="ssh" product="Microsoft Windows IoT sshd" version="1.100" extrainfo="protocol 2.0" ostype="Windows 10 IoT Core" method="probed" conf="10"><cpe>cpe:/o:microsoft:windows_10:::iot_core</cpe></service></port>\r\n</ports>\r\n<times srtt="0" rttvar="5000" to="100000"/>\r\n</host>\r\n<runstats><finished time="1523587409" timestr="Fri Apr 13 10:43:29 2018" elapsed="8.71" summary="Nmap done at Fri Apr 13 10:43:29 2018; 1 IP address (1 host up) scanned in 8.71 seconds" exit="success"/><hosts up="1" down="0" total="1"/>\r\n</runstats>\r\n</nmaprun>\r\n' >>> nm.scaninfo() { 'tcp' : { 'method' : 'syn' , 'services' : '22' }} >>> nm.scanstats() { 'timestr' : 'Fri Apr 13 10:43:29 2018' , 'elapsed' : '8.71' , 'uphosts' : '1' , 'downhosts' : '0' , 'totalhosts' : '1' } >>> |
PortScannerHostDict类说明:
该类里的方法说明:
all_ip():返回ip端口列表 all_protocols():返回所有扫描协议的列表 >>> nm[ '127.0.0.1' ].all_protocols() [ 'tcp' ] all_sctp():返回sctp端口列表 all_tcp():返回tcp端口列表 >>> nm[ '127.0.0.1' ].all_tcp() [ 22 ] all_udp():返回udp端口列表 has_ip(port):如果ip端口具有info,则返回true,否则返回 False has_sctp(port):如果sctp端口有info,则为真,否则为 False has_tcp(port):如果tcp端口有info,则返回true,否则返回 False has_udp(port):如果udp端口有info,则返回true,否则返回 False hostname():返回用户记录或列表主机名的第一个主机名 hostnames():返回主机名列表 ip(port):返回信息的IP端口 sctp(port):返回信息的sctp端口 state():返回主机状态 tcp(port):返回tcp端口的信息 >>> nm[ '127.0.0.1' ].state() 'up' udp(port):返回udp端口的信息 uptime():返回主机状态 |