nmap是一款強大的埠掃瞄工具,滲透測試中經常用到,其功能主要有主機發現,埠掃瞄,版本偵測,os偵測等。其中埠掃瞄是nmap的核心功能,埠掃瞄有syn掃瞄、tcp connect掃瞄、udp掃瞄、ack掃瞄等。為了了解nmap的埠掃瞄原理,現用python實現乙個簡單的埠掃瞄器,並用wireshark抓包分析。附上原始碼:
#python3環境下執行
#encoding: utf-8
from socket import *
import threading
lock = threading.lock()
opennum = 0
threads =
defportscanner
(host,port):
global opennum
try:
s = socket(af_inet,sock_stream)
s.connect((host,port))
lock.acquire()
opennum+=1
print('[+] %d open' % port)
lock.release()
s.close()
except:
pass
defmain
(): setdefaulttimeout(1)
ip = input('please enter your host: ')
for p in range(1,4000):
t = threading.thread(target=portscanner,args=(ip,p))
t.start()
for t in threads:
t.join()
print('[+] the scan is complete!')
print('[+] a total of %d open port ' % (opennum))
if __name__ == '__main__':
main()
上面原始碼用的socket模組下的socket函式,其中socket(af_inet,sock_stream)
中的sock_stream
代表tcp連線,如果是sock_dgram
則代表udp連線,上面程式還用到了多執行緒技術。程式執行結果如下:
下面就通過wireshark抓包工具來看看程式是如何識別開放與關閉的埠的:
埠1的tcp資料報
埠22的tcp資料報(中間兩行其他埠的被cut掉了)
執行程式後,在過濾器裡面直接輸入tcp,可以看到tcp資料報的傳輸過程,以埠1和埠22為例,由程式執行結果圖可知埠1是關閉的,埠22(ssh服務)是開放的。
掃瞄埠1時,客戶端先建立套接字,然後連線遠端伺服器ip和埠1,傳送標誌位syn,伺服器端口1並沒有開放,所以伺服器返回[rst,ack]
標誌位,rst代表復位,並強制關閉tcp連線。
掃瞄22埠時,客戶端傳送syn標誌位,伺服器端口22是開放的,伺服器會傳送乙個[syn,ack]
標誌位,然後客戶端傳送乙個ack標誌位,整個tcp三次握手完成,最後客戶端還會傳送乙個[fin,ack]
,fin標誌位代表連線斷開。
這是tcp埠掃瞄方式,其原理跟nmap中的tcp埠掃瞄方式一樣,這種連線方式的缺點是建立了三次握手,不夠隱蔽,是無法進行syn掃瞄的選擇,syn掃瞄沒有建立三次握手,隱蔽性較強。
埠掃瞄原理
埠掃瞄原理分類 1 全tcp連線 這種掃瞄方法使用三次握手,與目標計算機建立標準的tcp連線。但是這種掃瞄方式很容易被目標主機記錄,不推薦使用。2 半開啟式掃瞄 syn掃瞄 在這種掃瞄技術中,掃瞄主機自動向目標計算機的指定埠傳送syn資料段,表示傳送建立連線請求。a,如果目標計算機的回應tcp報文中...
埠掃瞄原理方法
埠掃瞄 埠掃瞄的目的 判斷目標主機上開放了哪些服務,判斷目標主機的作業系統。如果入侵者掌握了目標主機開放了哪些服務運用何種作業系統,他們就能夠使用相應的手段實現入侵。埠的基本概念 常見公認埠 埠掃瞄原理 tcp報文結構 tcp協議只定義了一種報文格式 建立 拆除連線 傳輸資料使用同樣的報文 tcp報...
C 埠掃瞄程式
工具 vs2017 新建c windows窗體應用,開啟介面設計,布局如下 其餘函式及控制項功能實現在form1.cs檔案中,源 如下 using system using system.collections.generic using system.componentmodel using sy...