python-nmap实现高效端口扫描器

python struggling 5261次浏览 1个评论

下载 (1)

python-nmap是python的一个模块库,使用这个模块可以让python很方便的操作nmap扫描器来工作,它可以帮助管理员完成自动扫描任务和生成报告的工具,它还支持nmap的脚步输出。python-nmap模块有两个常用类,一个为PortScanner()类,实现一个nmap工具的端口扫描功能封装;另一个为PortScannerHostDict()类,实现存储于访问主机的扫描结果,下面介绍PortScanner()类的一些常用方法。

scan(self,hosts='127.0.0.1',port=None,arguments='-sV')方法,实现指定主机,端口,nmap命令行参数的扫描。

<code>
In [1]: import nmap
In [2]: nm = nmap.PortScanner()
In [3]: nm.scan('192.168.1.20','22,80')
Out[3]: 
{'nmap': {'command_line': 'nmap -oX - -p 22,80 -sV 192.168.1.20',
  'scaninfo': {'tcp': {'method': 'syn', 'services': '22,80'}},
  'scanstats': {'downhosts': '1',
   'elapsed': '0.66',
   'timestr': 'Sat Nov 21 23:21:15 2015',
   'totalhosts': '1',
   'uphosts': '0'}},
 'scan': {}}
</code>

command_line(self)方法,返回的扫描方法映射到具体nmap命令行,如:

<code>
In [4]: nm.command_line()
Out[4]: 'nmap -oX - -p 22,80 -sV 192.168.1.20'
</code>

scaninfo(self)方法,返回nmap扫描的主机清单,格式为列表类型,如:

<code>
In [5]: nm.scaninfo()
Out[5]: {'tcp': {'method': 'syn', 'services': '22,80'}}
</code>

all_hosts(self)方法,返回nmap扫描的主机清单,格式为列表类型,如:

<code>
In [8]: nm.all_hosts()
Out[8]: ['192.168.1.1', '192.168.1.62']
</code>

以下介绍PortScannerHostDictionary()类的一些常用方法。

hostname(self)方法,返回扫描对象的主机名,如:

<code>
In [9]: nm['192.168.1.1'].hostname()
Out[9]: 'feiyu'
</code>

state(self)方法,返回扫描对象的状态,包括四种状态(up,down,unknown,skipped),如:

<code>
In [15]: nm['192.168.1.1'].state()
Out[15]: 'up'
</code>

all_protocols(self)方法,返回扫描的协议,如:

<code>
In [12]: nm['192.168.1.1'].all_protocols()
Out[12]: ['tcp']
</code>

all_tcp()(self)方法,返回tcp协议扫描的端口,如:

<code>
In [13]: nm['192.168.1.1'].all_tcp()
Out[13]: [22, 80]
</code>

tcp(self,port)方法,返回扫描tcp协议port(端口)的信息,如:

<code>
In [14]: nm['192.168.1.1'].tcp(22)
Out[14]: 
{'conf': '10',
 'cpe': '',
 'extrainfo': 'protocol 2.0',
 'name': 'ssh',
 'product': 'OpenSSH',
 'reason': 'syn-ack',
 'state': 'open',
 'version': '5.3'}
</code>

下面是一个完整的示例,在python3下面进行测试过:

<code>
#!/usr/bin/python
#coding:utf-8
import sys
import nmap

'''
    高效端口扫描
    www.tianfeiyu.com
'''

scan_row = []
input_date = input('please input hosts and ports:')
scan_row = input_date.split(' ')

if len(scan_row)!=2:
    print('input errors,example "192.168.1.0/24 80,443,22"')
    sys.exit(0)

hosts = scan_row[0]     #接受用户输入的主机
port = scan_row[1]      #接受用户输入的端口

try : 
    nm = nmap.PortScanner()     #创建端口扫描对象
except nmap.PortScannerError :
    print('nmap not found',sys.exc_info()[0])   #!!
    sys.exit()
except :
    print('unexpected error:',sys.exc_info()[0])
    sys.exit()
    
try:
    #调用扫描方法,参数指定扫描主机hosts,nmap扫描命令行参数arguments
    nm.scan(hosts=hosts,arguments=' -v -sS -p '+port)
except Exception as e:
    print('scan error:'+str(e))
    
for host in nm.all_hosts():         #遍历扫描主机
    print('----------------------------------------------')
    print('Host : %s (%s)' % (host,nm[host].hostname()))        #输出主机及主机名
    print('State : %s' % nm[host].state())                  #输出主机状态信息,如up,down
    for proto in nm[host].all_protocols():                  #遍历扫协议,如tcp,udp
        print('---------------------------')
        print('Protocol : %s' %proto)                       #输入协议名
        
        lport = nm[host][proto].keys()          #获取协议的所有扫描端口,输出为字典形式
        sorted(lport)                           #端口列表排序
        for port in lport:          #遍历端口及输出端口与状态
            print('port : %s \tstate : %s' % (port,nm[host][proto][port]['state']))

</code>

运行结果如下:

<code>
[root@sta auto]# python port_scan.py 
please input hosts and ports:192.168.1.0/24 22,80
----------------------------------------------
Host : 192.168.1.0 ()
State : down
----------------------------------------------
Host : 192.168.1.1 ()
State : up
---------------------------
Protocol : tcp
port : 80 	state : open
port : 22 	state : open
----------------------------------------------
Host : 192.168.1.10 ()
State : down
----------------------------------------------
Host : 192.168.1.100 ()
State : down
----------------------------------------------
Host : 192.168.1.101 ()
State : down
----------------------------------------------
。。。。。。
。。。。。。


</code>

DevOps-田飞雨 》》转载请注明源地址
喜欢 (2)or分享 (0)
发表我的评论
取消评论
*

表情 贴图 加粗 链接 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 不错
    asdas2016-01-27 16:19 回复