一、前言
注意: 本文相關教程僅供個人學習使用,切勿用於非法用途,否則造成的相關損失及影響,作者不承擔任何責任
林子大了什么鳥都有。網絡發達了,什么人都有。開源程序也是人開發的,漏洞在所難免。當不正當的人遇到開源程序的漏洞,那就會引發服務器入侵。
盡可能的避免此類事件的發生。一個企業或者說一個網絡管理員,需要知道自己提供服務的服務器上開放着哪些端口,提供着什么服務。這樣就能在漏洞發生的時候,及時修補,避免不必要的損失。
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)
三、實現過程
掃描器的基本流程圖及簡單的配置介紹如下:

四、代碼介紹如下:
- 啟動進程池:
python 接口給多進程應用程序提供了豐富的使用,這里給大家提供一個多進程的教程 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431927781401bb47ccf187b24c3b955157bb12c5882d000
使用如下的代碼初始化進程池:
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 搭建基本端口掃描器
注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權
