1. 程式人生 > >python nmap模組掃碼埠

python nmap模組掃碼埠

作業系統: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埠
在這裡插入圖片描述