今天我們聊一聊網絡端口掃描那些事,以及Python如何助力於端口掃描。無論今後你是否從事網絡安全或者安全滲透測試一職,只要你在測試,測開領域行走著,奔跑著,“網絡端口掃描”將是你知識技能儲備中不可或缺的一角。
端口掃描可視為一種監控技術,用來依次定位某個指定主機上可用的,開放的端口。一般而言,這類技術常見於網絡管理員,滲透測試人員甚至黑客等人的日常工作實踐中。這類人員可以根據當前工作任務需求,配置端口掃描器,最大程度地獲取目標系統中的信息。
通常經過對目標主機端口掃描後,可以獲取的信息主要包括:
(1)目標主機上開放的所有端口
(2)在每個端口上運行的服務及其相關信息
(3)目標主機的操作系統和MAC地址信息
我們可以把端口掃描想象成一個小偷悄悄進入一間房子(目標主機可視為房子),檢查每個門窗是否關好(端口可視作門窗),看看哪些門窗是打開的(哪些端口是開放的)。
在互聯網中,用於通信的是TCP/IP協議,該協議套件由兩個協議組成,即TCP和UDP。這兩種協議都有0到65535個端口。這些端口按范圍可分為如下三類:
(1)系統或公認端口: 0 —— 1023
(2)用戶或注冊端口:1024 —— 49151
(3)動態或私有端口: 49151 —— 65535
可見系統服務器上的端口眾多,但實際上常用的端口才幾十個,由此可以看出未定義的端口相當多。為了安全起見,通常建議關閉系統中不必要的端口,不對外開放。如此一來,我們就有超過65000個端口需要關閉。
在上一篇文章中《測試人必會 —— Python帶你上手 Web Socket》,介紹了套接字相關知識。現在,我們將使用套接字構建一個簡單的端口掃描器。
使用套接字進行端口掃描器的構建,通過 Python 腳本實現如下:
from socket import *
import time
startTime = time.time()
if name == ‘main’:
target = input('需要掃描的主機: ')
t_IP = gethostbyname(target)
print('開始掃描主機: ', t_IP)
for i in range(100, 450):
print(‘當前正掃描端口號:’+str(i))
s = socket(AF_INET, SOCK_STREAM)
conn = s.connect_ex((t_IP, i))
if (conn == 0):
print(‘端口 %d: 處於開放狀態’ % (i,))
s.close()
print(‘掃描共花費的