1. 程式人生 > >Python之SYN資料包探測埠

Python之SYN資料包探測埠

本篇文章敘述的是運用TCP裡面的SYN來探測埠是否開放,如果開放則返回一個SYN+ACK包,是非常實用的小程式,因為在資訊收集中,幾乎都是需要探測埠號,之後便可以對該埠做些不可描述的事情。

程式碼區:
*********************************************************************************************************

from scapy.all import * #主要用來構造包(Windows系統需要安裝scapy模組,如果不懂安裝可以看https://blog.csdn.net/q759451733/article/details/84038114

def syn_scan_final(hostname,lport,hport):
    result_raw = sr(IP(dst = hostname)/   #目的的主機IP
                    TCP(dport = (int(lport),int(hport)),flags=2),#dport = (int(lport),int(hport))可以掃描指定的埠範圍,這也是scapy的一個好處,flags=2表示syn包(三次握手的第一個包)

                    timeout = 1,verbose = False)#sr是傳送三層資料包,timeout是定義超時時間,verbose如果不將該引數定義為False

    result_list = result_raw[0].res #表示接收到的資料包的第0層裡面的res全部賦值給result_list
    for i in range(len(result_list)):   #主要意思是將收到的每個包的下標賦值給i,如接收到了1024個包,那麼i就等於0、1、2、3...(如圖一、二)
        if result_list[i][1].haslayer(TCP): #在i層裡的1層中,有沒有TCP這一層,如果有執行
            TCP_Fields = result_list[i][1].getlayer(TCP).fields #在i層裡的1層中,將TCP層裡面的fields賦值出去

            if TCP_Fields['flags'] == 18:  #這個flags == 18,是指SYN+ACK包(如圖三、四)
                print('port:' + str(TCP_Fields['sport'])) #列印開放的埠

if __name__ == '__main__':
    host = '183.232.231.172'
    low = 1
    high = 1024
    syn_scan_final(host,low,high)

*********************************************************************************************************

(圖一)

(圖二)

如上圖,每迴圈一次增加1,如有1024個返回包,則迴圈1024次。

(圖三)

(圖四)

如下圖:18這個值來源是   10010(二進位制) == 18(十進位制),這個就是服務端(百度)發回的響應包。

在抓包過程中有個在傳送端(本主機)會自動傳送一個RST包,這個包會告訴服務端(百度),立即關閉連線,因為我們不需要後續的連線,所以就直接傳送了一個RST包。我們也來感受一下計算機發收包的速度有多快。從6.857175秒到6.880380秒,之間僅僅只需要了0.023205秒而已。

總結:多除錯多抓包,構造不同的TCP包,抓不同的返回包,這樣很有助於自己對包的理解,雖然程式碼看起來不難,但還是需要多敲多練。