Python埠掃瞄程式原理解析

2021-08-09 20:11:56 字數 1916 閱讀 3270

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...