zoukankan      html  css  js  c++  java
  • 7.python实现高效端口扫描器之nmap模块

    对于端口扫描,使用的最多的就是nmap这个工具,不想python已经强大到,提供了nmap这个扫描端口的模块。

    本片文章主要介绍nmap模块的两个常用类:

    • PortScanner()类,实现一个nmap工具的端口扫描功能的封装;
    • PortScannerHostDict()类,实现存储与访问主机的扫描结果。

    安装:这里需要安装的是python-nmap模块,不是nmap模块,pip install python-nmap。

    PortScanner()类的一些常用方法:

    1. scan()方法:

    scan(self,host='127.0.0.1',ports=None,arguments='-sV')

    实现指定主机,端口,nmap命令行参数的扫描。

    参数说明:

    • hosts:字符串类型,表示扫描的主机的地址,格式可以用"scanme.nmap.org","127.0.0.1/24"表示;
    • ports:字符串类型,表示要扫描的端口,可以用"22,80,443-1000"表示;
    • arguments:字符串类型,表示nmap命令行参数,格式为"-sU -sX -sC"表示。
    import nmap
    #实例化
    nm = nmap.PortScanner()
    #端口扫描
    nm.scan('www.baidu.com','22,80,443','-sV')

    2. command_line(self)方法

    返回的扫描方法映射到具体的nmap命令行

    nm.command_line()

    3. scaninfo(self)方法

    返回nmap扫描信息,格式为字典类型

    nm.scaninfo()

    4. all_hosts(self)方法

    返回nmap扫描的主机清单,格式为列表类型

    nm.all_hosts()

     

    ------------------------------------------------------

    PortScannerHostDict()类的一些常用方法

    1. hostname(self)方法

    返回扫描对象的主机名

    nm['61.135.169.125'].hostname()

    2. state(self)方法

    返回扫描对象的状态,包括四种状态(up,down,unknown,skipped)

    nm['61.135.169.125'].state()

    3. all_protocols(self)方法

    返回扫描的协议

    nm['61.135.169.125'].all_protocols()

    4.all_tcp(self)方法

    返回TCP协议扫描的端口

    nm['61.135.169.125'].all_tcp()

    5.tcp(self,port)方法

    返回扫描TCP协议port的信息

    nm['61.135.169.125'].tcp(443)

    实践:实现高效的端口扫描

    实践代码采用scan()方法的arguments参数指定为 "-v  -PE  -p + 端口",-v表示启用细节模式,可以返回非up状态主机清单;-PE 表示采用TCP同步扫描(TCP,SYN)方式;-p指定扫描端口范围。程序输出部分采用了三个for循环体,第一层遍历扫描主机,第二层遍历协议,第三层遍历端口,最后输出主机状态。

    import sys
    import nmap

    scan_row=[]
    input_data = input('Please input hosts and port: ')
    scan_row = input_data.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(0)
    except:
        print("Unexpected error:", sys.exc_info()[0])
        sys.exit(0)

    try:
        #调用扫描方法,参数指定扫描主机hosts,nmap扫描命令行参数arguments
        nm.scan(hosts=hosts, arguments=' -v -sS -p '+port)
    except Exception as e:
        print("Scan erro:"+str(e))
        
    #遍历扫描主机
    for host in nm.all_hosts():
        print('----------------------------------------------------')
        #输出主机及主机名
        print('Host : %s (%s)' % (host, nm[host].hostname()))
        #输出主机状态,如up、down
        print('State : %s' % nm[host].state())
        for proto in nm[host].all_protocols():
            #遍历扫描协议,如tcp、udp
            print('----------')
            #输入协议名
            print('Protocol : %s' % proto)
            #获取协议的所有扫描端口
            lport = nm[host][proto].keys()
    #端口列表排序
           list(lport).sort()
    #遍历端口及输出端口与状态
            for port in lport:
                print('port : %s state : %s' % (port, nm[host][proto][port]['state']))

  • 相关阅读:
    JAVA语言基础
    JAVA程序 从命令行接受多个数字,求和之后输出结果
    构建之法阅读笔记02
    软件工程学习进度第三周
    软件工程个人作业02
    安装Linux
    软件工程学习进度
    软件工程个人作业01
    构建之法阅读笔记01
    登录界面
  • 原文地址:https://www.cnblogs.com/bmjoker/p/10574598.html
Copyright © 2011-2022 走看看