python nmap模組掃碼埠
阿新 • • 發佈:2018-11-07
作業系統:centos7.4
官網地址: https://pypi.org/project/python-nmap/
漏洞網址: https://www.exploit-db.com/
一、安裝
#首先安裝nmap包
$ yum -y install nmap
#安裝模組
$ pip install python-nmap
備註:
此處安裝的是 python-nmap 模組,不是 nmap 模組
如果安裝了 nmap 模組,在例項化物件 [“nmap.PortScanner()”] 的時候會報以下錯誤
AttributeError: 'module' object has no attribute 'PortScanner'
二、用法
>>> import nmap >>> nm = nmap.PortScanner() #例項化物件 >>> nm.scan('127.0.0.1', '15-100') #掃描主機127.0.0.1,埠從15到50 >>> nm.command_line() #獲取用於掃描的命令列 'nmap -oX - -p 15-100 -sV 127.0.0.1' >>> nm.scaninfo() #獲取nmap掃描資訊 {'tcp': {'services': '15-100', 'method': 'connect'}} >>> nm.all_hosts() #獲得所有被掃描的主機 ['127.0.0.1'] >>> nm['127.0.0.1'].hostname() #為主機127.0.0.1獲取一個主機名 'localhost' >>> nm['127.0.0.1'].hostnames() #獲取主機127.0.0.1的主機名以列表格式輸出,裡面是一個個字典 [{'type': 'PTR', 'name': 'localhost'}] >>> nm['127.0.0.1'].state() #獲取主機狀態資訊 (up|down|unknown|skipped) 'up' >>> nm['127.0.0.1'].all_protocols() #在(ip|tcp|udp|sctp)中獲取所有掃描協議['tcp', 'udp'] ['tcp'] >>> nm['127.0.0.1']['tcp'].keys() #獲取tcp協議的所有埠 [80, 25, 443, 22, 111] >>> nm['127.0.0.1'].all_tcp() #獲取tcp協議的所有埠 [21, 22, 25, 83] >>> nm['127.0.0.1'].all_udp() #獲取udp協議的所有埠 [] >>> nm['127.0.0.1'].all_ip() #獲取ip協議的所有埠 [] >>> nm['127.0.0.1'].has_tcp(22) #主機127.0.0.1上是否有22/tcp埠的資訊 True >>> nm['127.0.0.1'].has_tcp(23) #主機127.0.0.1上是否有23/tcp埠的資訊 False >>> nm['127.0.0.1']['tcp'][22] #在主機127.0.0.1上獲取tcp埠22的資訊 {'state': 'open', 'reason': 'syn-ack', 'name': 'ssh'} >>> nm['127.0.0.1'].tcp(22) #在主機127.0.0.1上獲取tcp埠22的資訊 {'state': 'open', 'reason': 'syn-ack', 'name': 'ssh'} >>> nm['127.0.0.1']['tcp'][22]['state'] #在主機127.0.0.1上獲取埠22/tcp狀態 'open'
三、簡單掃描埠程式碼
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Mr Yang import nmap host= '192.168.16.191' nm = nmap.PortScanner() for port in range(20,25): result = nm.scan(host,str(port)) state = result['scan']['192.168.16.191']['tcp'][int(port)]['state'] print('[%s] port state: %s' %(port,state))
四、升級版本
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# author:Mr Yang
import nmap
import optparse
import sys
class INFO(object):
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
ARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
def scanport(host, port):
nm = nmap.PortScanner()
try:
result = nm.scan(host,port)
state = result['scan'][host]['tcp'][int(port)]['state'] # 多層字典巢狀取值
if state == 'open':
print(INFO.OKBLUE+'[*] '+host+ ' tcp/'+port+" "+state+INFO.ENDC)
else:
print(INFO.WARNING+'[*] '+host+ ' tcp/'+port+" "+state+INFO.ENDC)
except Exception as e:
pass
if __name__ == '__main__':
parser = optparse.OptionParser("usage args: -H host -p port1,port2,... or -p start_port - end_port ")
parser.add_option('-H', dest='Host', type='string', help='specify target host')
parser.add_option('-P', dest='Port', type='string', help='specify target port[s] separated by "-"'or ",")
options, args = parser.parse_args()
if options.Host ==None or options.Port==None:
print(parser.usage)
sys.exit()
host = options.Host
ports = options.Port
print(host,ports)
#如果是連續的埠
if '-' in ports:
ports_list = ports.split('-')
for p in range(int(ports_list[0]),int(ports_list[1])+1):
scanport(host, str(p))
#非連續埠
else:
ports_list = ports.split(',')
for p in ports_list:
scanport(host, p)
執行
#格式 python 指令碼名稱 -H 主機名 -P 埠
$ python test.py -H 192.168.16.191 -P 15-50
#也可以用逗號分隔指定埠,這樣是非連續埠
$ python test.py -H 192.168.16.191 -P 22,3306,80,8000 #掃描 22,3306,80,8000 埠
掃描 主機:192.168.16.191 的 15至50埠