• 使用python-nmap 搭建基本端口扫描器


    代码地址如下:
    http://www.demodashi.com/demo/13255.html

    一、前言

    注意: 本文相关教程仅供个人学习使用,切勿用于非法用途,否则造成的相关损失及影响,作者不承担任何责任

    林子大了什么鸟都有。网络发达了,什么人都有。开源程序也是人开发的,漏洞在所难免。当不正当的人遇到开源程序的漏洞,那就会引发服务器入侵。

    尽可能的避免此类事件的发生。一个企业或者说一个网络管理员,需要知道自己提供服务的服务器上开放着哪些端口,提供着什么服务。这样就能在漏洞发生的时候,及时修补,避免不必要的损失。

    ok,必要性说完了,我们来说我们怎么做这件事儿。

    二、开发环境

    需要的环境简介:

    • python 2.7

    • 端口扫描,现在行业内比较通用的开源组件是: nmap , github 开源地址: https://github.com/nmap/nmap
      这个开源工具给大家提供了一个shell 使用环境。

    • 但是当服务器成千上万,服务也成千上万,就需要一定的结构来处理开放的相关的端口及服务了。 很庆幸的,开源社区还提供了 nmap 的python api
      https://bitbucket.org/xael/python-nmap
      当然有比较小白的安装方法: pip install python-nmap (注意是python-nmap 不是nmap)

    三、实现过程

    扫描器的基本流程图及简单的配置介绍如下:

    四、代码介绍如下:

    使用如下的代码初始化进程池:

    from multiprocessing import Pool
    p = Pool(4)  # 这里可以根据机器的性能状况设置进程池中的进程数
    
    • 获取IP 地址库:
      IP 地址库一般是企业内部的资产列表,可以是单个的机器,也可能是单个的网段。本实例为简单起见,用一个文本文件来充当相应的IP地址库, ip.txt 。其中,一行一个IP 资源 (IP 地址或者网段)。遍历文本文件即可:
     hosts = open(config.host_file)
        for host in hosts:
            print host 
    
    • 扫描单个项目,根据python-nmap的api 扫描单个的IP资源,简单代码如下:
    import nmap
    nm = nmap.PortScanner()
    ret = nm.scan(ip,config.scan_port_range,config.scan_options,config.scan_sudo)
    
    • 获取扫描结果:
      单个IP 条目的扫描结果如下:

    其中scan 属性对应的字典即是扫描结果,key 为IP , value 为扫描结果,value 中tcp 为对应的tcp 扫描条目。

    了解结构以后,我们就可以写遍历结果代码了。

        ret = nm.scan(ip,config.scan_port_range,config.scan_options,config.scan_sudo)
        scan_host_count = len(ret['scan'].keys())
        if scan_host_count != 0:
            for ip,result in ret['scan'].items():
                tcp_result = result.get('tcp')
                for port,detail in tcp_result.items():
                    gotOneResult(ip,port,detail)
    

    其中gotOneResult 为我们的最终处理结果,接收参数ip,port,detail ,
    detail 的情况如下:

    result sample : {'status': {'state': 'up', 'reason': 'echo-reply'}, 'hostnames': [{'type': '', 'name': ''}], 'vendor': {}, 'addresses': {'ipv4': ''}, '    tcp': {80: {'product': 'Apache httpd', 'state': 'open', 'version': '', 'name': 'http', 'conf': '10', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': 'cpe:/a:apache:http_se    rver'}, 443: {'product': 'OpenSSL', 'state': 'open', 'version': '', 'name': 'ssl', 'conf': '10', 'extrainfo': 'SSLv3', 'reason': 'syn-ack', 'cpe': 'cpe:/a:openssl:opens    sl'}}}
    
    • 注:本实例只关心tcp的端口扫描:

    • 简单封装我们的gotOneResult ,按照不同端口存储扫描结果,方便我们做进一步处理:

    def gotOneResult(ip,port,detail):
        if detail.get('state') == 'open':
            print ip,port,detail
            report_file = "reports/port_%d" % (int(port))
            open(report_file,"a").write("%s %d %s 
    " % (ip,int(port),detail))
    

    四、运行效果

    最后展示一下扫描结果

    demo 运行配置简介:

    • 扫描的是常见端口 : 22,80,21,6379,3306,443
    • ip地址 为随便掰的几个IP
    • 进程池4

    五、项目结构以及使用注意点

    项目结构图如下

    使用说明:

    修改一下ip.txt 放入自己的IP地址,app.py 修改 gotOneResult 为需要的处理方式就可以正常使用了。使用python-nmap 搭建基本端口扫描器

    代码地址如下:
    http://www.demodashi.com/demo/13255.html

    注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

  • 相关阅读:
    金融期货期权
    悲剧论——情感净化
    麻将
    后现代postmodern
    AlphaGo
    上帝已死——尼采
    牛顿迭代法
    浏览器访问homestead,由http自动转换为https
    Laravel框架原理(一)--Laravel中常用的PHP语法
    Android面试宝典(1)----android的基础知识
  • 原文地址:https://www.cnblogs.com/demodashi/p/9442924.html
Copyright © 2020-2023  润新知