DDoS攻擊:無(wú)限戰(zhàn)爭(zhēng) (續(xù)篇)

前情回顧:
經(jīng)過(guò)黑衣人和老周的合作,終于清除了入侵Linux帝國(guó)的網(wǎng)頁(yè)病毒,并修復(fù)了漏洞。不曾想激怒了幕后的黑手,一場(chǎng)新的風(fēng)雨即將來(lái)臨。詳情參見:一條SQL注入引出的驚天大案1
風(fēng)云再起
小Q是Linux帝國(guó)網(wǎng)絡(luò)部負(fù)責(zé)TCP連接的公務(wù)員。
一直以來(lái)工作都很輕松,加班也少,但自從小馬哥到Linux帝國(guó)開設(shè)了nginx公司,小Q的工作量一下就大了起來(lái),經(jīng)常加班,為此小Q背后沒少抱怨。
一大早,nginx按時(shí)啟動(dòng),綁定了80端口監(jiān)聽,開始了今天的營(yíng)生。
沒過(guò)多久,今天的第一個(gè)客戶來(lái)了。

小Q還是如往常一樣,收到這個(gè)帶有SYN標(biāo)記的數(shù)據(jù)包后,創(chuàng)建了一個(gè)連接請(qǐng)求塊,然后將其放入80端口歸屬的連接請(qǐng)求隊(duì)列中,回復(fù)了一個(gè)帶有SYN和ACK標(biāo)記的數(shù)據(jù)包后,開啟了一個(gè)定時(shí)器,等待第三次握手的完成。

沒等多久,這個(gè)客戶就發(fā)來(lái)了回信,三次握手完成。小Q把這個(gè)連接請(qǐng)求塊轉(zhuǎn)移到了80端口對(duì)應(yīng)的連接就緒隊(duì)列中,并按下了鈴鐺。
聽到鈴聲的nginx線程從epoll_wait函數(shù)中醒來(lái),調(diào)用accept函數(shù),從隊(duì)列中拿到了這個(gè)新來(lái)的客戶,開始服務(wù)。
這就是小Q的日常,他已經(jīng)干這份工作太久了,輕車熟路。

很快到了深夜,小Q準(zhǔn)備打個(gè)盹兒,這么晚估計(jì)是沒有活干了。
沒想到剛躺下,就來(lái)了一個(gè)連接請(qǐng)求,小Q揉揉惺忪的睡眼,準(zhǔn)備來(lái)處理,然后接著很快來(lái)了第二個(gè),第三個(gè),第四個(gè)······
奇怪的是,每一個(gè)客戶只發(fā)送了一個(gè)SYN就沒了音訊,眼看著連接請(qǐng)求隊(duì)列里的請(qǐng)求塊越來(lái)越多,最后實(shí)在沒有空間安放新的請(qǐng)求塊,小Q開始意識(shí)到情況不妙,拉響了帝國(guó)安全警報(bào)······

2
全軍出擊
十分鐘前······
“快醒醒,有消息來(lái)了“,還在sleep的阿D被喚醒了。
“上峰總算想起我了,我來(lái)到Windows帝國(guó)都快一個(gè)月了,一直沒有指示,只是讓我保持靜默,我都憋壞了。”,阿D伸了伸懶腰,起身調(diào)用recv函數(shù)取到了消息:
目標(biāo):222.230.189.34
端口:80
動(dòng)作:偽造源IP地址,發(fā)送SYN數(shù)據(jù)包
讀完消息后,阿D使用原始套接字構(gòu)造了一個(gè)TCP數(shù)據(jù)包,將SYN標(biāo)記點(diǎn)亮,偽造了一個(gè)源IP地址,將其發(fā)送了出去。
經(jīng)過(guò)一通路由轉(zhuǎn)發(fā),這個(gè)數(shù)據(jù)包終于來(lái)到Linux帝國(guó),卻遲遲沒有人來(lái)接待,側(cè)目望去,原來(lái),已經(jīng)有數(shù)不清的TCP包堵在門口,還有無(wú)數(shù)類似的TCP包正在源源不斷的涌入……

3
SYN Flood
此刻,帝國(guó)高層正在召開緊急會(huì)議。
防火墻:“現(xiàn)在有無(wú)數(shù)的網(wǎng)絡(luò)連接進(jìn)來(lái),為了帝國(guó)的安全,我只好先關(guān)閉了網(wǎng)絡(luò),把那些數(shù)據(jù)包擋在外面。”

小馬哥:“需要趕緊采取措施,恢復(fù)正常,我們nginx公司每秒鐘都在丟失大量的客戶,這是一筆巨額損失!”
帝國(guó)安全部長(zhǎng):“小Q,你把當(dāng)前的形勢(shì)介紹一下,大家一起來(lái)出謀劃策。”
小Q:“好的。TCP的三次握手想必諸位都有所了解,收到SYN數(shù)據(jù)包后,我需要準(zhǔn)備一個(gè)數(shù)據(jù)塊來(lái)存儲(chǔ)客戶端的信息,敵軍正是瞄準(zhǔn)了這一點(diǎn),給我發(fā)送大量SYN數(shù)據(jù)包,我就需要分配大量的數(shù)據(jù)塊,直到把帝國(guó)空間耗盡。”

小馬哥:“抱歉,我打斷一下,你為何不及時(shí)把無(wú)效的數(shù)據(jù)塊釋放掉,騰出空間呢?”
小Q:“當(dāng)然有,我有一套超時(shí)機(jī)制,超時(shí)以后第三次握手還沒來(lái),我就會(huì)給釋放掉。但現(xiàn)在問(wèn)題是敵軍聲勢(shì)浩大,剛剛騰出的空間馬上又會(huì)被擠占。”

小馬哥:“那簡(jiǎn)單,你把超時(shí)時(shí)間調(diào)小一點(diǎn),盡快釋放無(wú)效的數(shù)據(jù)塊不就行了!”
小Q:“要是太小了,正常的用戶因?yàn)榫W(wǎng)絡(luò)原因,時(shí)延比較大的,這不就誤傷了嗎?”
小馬哥:“嗯,這個(gè)你們自己權(quán)衡一下,取一個(gè)合適的值,如今也沒有其他辦法,趕緊恢復(fù)生產(chǎn)才是!”
安全部長(zhǎng):“小Q,先這樣試試看”
小Q:“行吧,我這就去”
半小時(shí)后······小Q:“大人,我已經(jīng)按照指示執(zhí)行,不過(guò)網(wǎng)絡(luò)連接越來(lái)越多,這一招恐怕支撐不了太久,還是早做打算才是。”
安全部長(zhǎng):“WAF公司呢,你們有什么辦法沒有?”
WAF公司黑衣人:“大人,我們關(guān)注的業(yè)務(wù)在于web應(yīng)用安全,此次的SYN Flood,實(shí)非我等擅長(zhǎng)。”
現(xiàn)場(chǎng)陷入了久久的沉默……

良久,防火墻打破了沉默:“小Q,為何非得在收到第一次握手SYN數(shù)據(jù)包后就建立數(shù)據(jù)塊?如果把數(shù)據(jù)塊的建立時(shí)間放在第三次握手之后呢?”
小Q:“如果一開始不用建立數(shù)據(jù)塊占用空間,那確實(shí)解決了大麻煩!不過(guò),不建立數(shù)據(jù)塊,那如何把客戶端的信息保存起來(lái)呢?”
防火墻:“保存什么信息?”
小Q:“客戶端的IP、端口、序列號(hào)這些啊。”
防火墻:“這些信息在第三次握手來(lái)的數(shù)據(jù)包中也有啊,不用提前存起來(lái)嘛!”

防火墻:“有沒有什么辦法,不用提前存,也能做校驗(yàn)?zāi)兀俊?br />
小Q:“這,這怎么做?”
防火墻:“有了!第二次發(fā)給客戶端的序列號(hào),如果不是一個(gè)隨機(jī)值,而是根據(jù)客戶端信息和其他信息綜合計(jì)算出來(lái)的一個(gè)哈希值,收到第三次握手的時(shí)候,我們拿到客戶端答復(fù)的ACK,再重新計(jì)算一次哈希值,如果哈希值+1=ACK,那就能對(duì)得上,反之就是錯(cuò)誤的包,直接丟棄!”

還沒等小Q回過(guò)神,安全部長(zhǎng)起身鼓掌:“妙哉!這真是一個(gè)絕妙的點(diǎn)子!小Q,就按這個(gè)辦法,趕緊去辦!”
4
絕處逢生
小Q回到工作崗位,按照防火墻提供的思路修改了策略。隨后,通知防火墻重新打開網(wǎng)絡(luò)碼頭,但究竟效果如何,小Q心里還是捏了一把汗。


WAF黑衣人搶先發(fā)言:“我覺得這個(gè)方式關(guān)鍵點(diǎn)在于把校驗(yàn)信息的存儲(chǔ)從服務(wù)器放到了客戶端,有點(diǎn)類似web技術(shù)中的Cookie。要不咱們就叫做SYN Cookie吧!”
防火墻:“嗯,這個(gè)名字好,總結(jié)的很到位”
一個(gè)小時(shí)后,瘋狂的TCP SYN數(shù)據(jù)包潮水逐漸退去,Linux帝國(guó)終于恢復(fù)了往日的寧?kù)o,nginx公司的業(yè)務(wù)也恢復(fù)了正常。小Q抬頭一看,天邊已經(jīng)微亮,這漫長(zhǎng)的夜晚總算是熬過(guò)去了。

未完待續(xù)·······
彩蛋
“大人,Linux帝國(guó)有防火墻、WAF一幫人守衛(wèi),我們的攻擊沒有起到什么效果。”
“你以為他們真的是靠自己的本事勝利的嗎?這次只是給他們點(diǎn)教訓(xùn),我們的游戲才剛剛開始。”
欲知后事如何,請(qǐng)關(guān)注后續(xù)精彩......
原創(chuàng)不容易,別光看,轉(zhuǎn)發(fā)分享給更多人啊
