使用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 \n" % (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大師代發,拒絕轉載,轉載需要作者授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM