TCP/IP常見(jiàn)攻擊手段
這一篇主要和大家一起學(xué)習(xí)回顧關(guān)于 TCP/IP 的常見(jiàn)攻擊,至少有一個(gè)基本的認(rèn)識(shí)
前言

1 IP欺騙
IP是什么
在網(wǎng)絡(luò)中,所有的設(shè)備都會(huì)分配一個(gè)地址。這個(gè)地址就仿佛小藍(lán)的家地址「多少號(hào)多少室」,這個(gè)號(hào)就是分配給整個(gè)子網(wǎng)的,「室」對(duì)應(yīng)的號(hào)碼即分配給子網(wǎng)中計(jì)算機(jī)的,這就是網(wǎng)絡(luò)中的地址?!柑?hào)」對(duì)應(yīng)的號(hào)碼為網(wǎng)絡(luò)號(hào),「室」對(duì)應(yīng)的號(hào)碼為主機(jī)號(hào),這個(gè)地址的整體就是IP地址。
通過(guò)IP地址我們能知道什么?
通過(guò) IP 地址,我們就可以知道判斷訪問(wèn)對(duì)象服務(wù)器的位置,通過(guò)這個(gè) IP 地址就可以判斷訪問(wèn)對(duì)象服務(wù)器的位置,從而將消息發(fā)送到服務(wù)器。一般發(fā)送者發(fā)出的消息首先經(jīng)過(guò)子網(wǎng)的集線器,轉(zhuǎn)發(fā)到最近的路由器,然后根據(jù)路由位置訪問(wèn)下一個(gè)路由器的位置,直到重點(diǎn)
IP頭部格式

IP欺騙技術(shù)
騙唄,拐騙,誘騙!
IP 欺騙技術(shù)就是偽造某臺(tái)主機(jī)的 IP 地址的技術(shù)。通過(guò)IP 地址的偽裝使得某臺(tái)主機(jī)能夠偽裝另外的一臺(tái)主機(jī),而這臺(tái)主機(jī)往往具有某種特權(quán)或者被另外的主機(jī)所信任。
假設(shè)現(xiàn)在有一個(gè)合法用戶 (1.1.1.1) 已經(jīng)同服務(wù)器建立正常的連接,攻擊者構(gòu)造攻擊的 TCP 數(shù)據(jù),偽裝自己的 IP 為 1.1.1.1,并向服務(wù)器發(fā)送一個(gè)帶有 RSI 位的 TCP 數(shù)據(jù)段。服務(wù)器接收到這樣的數(shù)據(jù)后,認(rèn)為從 1.1.1.1 發(fā)送的連接有錯(cuò)誤,就會(huì)清空緩沖區(qū)中建立好的連接。
這時(shí),如果合法用戶 1.1.1.1 再發(fā)送合法數(shù)據(jù),服務(wù)器就已經(jīng)沒(méi)有這樣的連接了,該用戶就必須從新開(kāi)始建立連接。攻擊時(shí),偽造大量的IP地址,向目標(biāo)發(fā)送 RST 數(shù)據(jù),使服務(wù)器不對(duì)合法用戶服務(wù)。雖然IP地址欺騙攻擊有著相當(dāng)難度,但我們應(yīng)該清醒地意識(shí)到,這種攻擊非常廣泛,入侵往往從這種攻擊開(kāi)始。
2 SYN Flooding
SYN Flooding簡(jiǎn)介
拒絕服務(wù)攻擊(DDoS)從1970 年出現(xiàn)直到今天都依然在作祟,并給全球范圍內(nèi)的各大組織帶來(lái)了不可估量的損失。SYN Flood是互聯(lián)網(wǎng)上最經(jīng)典的DDoS攻擊方式之一,最早出現(xiàn)于 1999 年左右,雅虎是當(dāng)時(shí)最著名的受害者。SYN Flood攻擊利用了 TCP 三次握手的缺陷,能夠以較小代價(jià)使目標(biāo)服務(wù)器無(wú)法響應(yīng),且難以追查。
SYN flood 是一種常見(jiàn)的 DOS(denial of service拒絕服務(wù))和 DDos (distributed denial of serivce 分布式拒絕服務(wù))攻擊方式。這是一種使用TCP協(xié)議缺陷,發(fā)送大量的偽造的 TCP 連接請(qǐng)求,使得被攻擊方 CPU 或內(nèi)存資源耗盡,最終導(dǎo)致被攻擊方無(wú)法提供正常的服務(wù)。
TCP SYN Flood攻擊原理
TCP SYN Flood 攻擊利用的是 TCP 的三次握手(SYN -> SYN/ACK -> ACK),假設(shè)連接發(fā)起方是A,連接接受方是 B,即 B 在某個(gè)端口(Port)上監(jiān)聽(tīng)A發(fā)出的連接請(qǐng)求,過(guò)程如下圖所示,左邊是A,右邊是B。

A 首先發(fā)送 SYN(Synchronization)消息給 B,要求 B 做好接收數(shù)據(jù)的準(zhǔn)備;B 收到后反饋 SYN-ACK(Synchronization-Acknowledgement) 消息給A,這個(gè)消息的目的有兩個(gè):
向 A 確認(rèn)已做好接收數(shù)據(jù)的準(zhǔn)備,
同時(shí)要求 A 也做好接收數(shù)據(jù)的準(zhǔn)備,此時(shí) B 已向 A 確認(rèn)好接收狀態(tài),并等待 A 的確認(rèn),連接處于半開(kāi)狀態(tài)(Half-Open),顧名思義只開(kāi)了一半;A 收到后再次發(fā)送 ACK (Acknowledgement) 消息給B,向 B 確認(rèn)也做好了接收數(shù)據(jù)的準(zhǔn)備,至此三次握手完成,「連接」就建立了,
大家注意到?jīng)]有,最關(guān)鍵的一點(diǎn)在于雙方是否都按對(duì)方的要求進(jìn)入了可以接收消息的狀態(tài)。而這個(gè)狀態(tài)的確認(rèn)主要是雙方將要使用的消息序號(hào)(SquenceNum),TCP 為保證消息按發(fā)送順序抵達(dá)接收方的上層應(yīng)用,需要用消息序號(hào)來(lái)標(biāo)記消息的發(fā)送先后順序的。
TCP是「雙工」(Duplex)連接,同時(shí)支持雙向通信,也就是雙方同時(shí)可向?qū)Ψ桨l(fā)送消息,其中 SYN 和 SYN-ACK 消息開(kāi)啟了A→B的單向通信通道(B 獲知了 A 的消息序號(hào));SYN-ACK 和 ACK 消息開(kāi)啟了B→A單向通信通道(A獲知了B的消息序號(hào))。
上面討論的是雙方在誠(chéng)實(shí)守信,正常情況下的通信。
但實(shí)際情況是,網(wǎng)絡(luò)可能不穩(wěn)定會(huì)丟包,使握手消息不能抵達(dá)對(duì)方,也可能是對(duì)方故意不按規(guī)矩來(lái),故意延遲或不發(fā)送握手確認(rèn)消息。
假設(shè) B 通過(guò)某 TCP 端口提供服務(wù),B 在收到 A 的 SYN 消息時(shí),積極的反饋了 SYN-ACK 消息,使連接進(jìn)入半開(kāi)狀態(tài),因?yàn)?B 不確定自己發(fā)給 A 的 SYN-ACK 消息或 A 反饋的 ACK 消息是否會(huì)丟在半路,所以會(huì)給每個(gè)待完成的半開(kāi)連接都設(shè)一個(gè)Timer,如果超過(guò)時(shí)間還沒(méi)有收到 A 的 ACK 消息,則重新發(fā)送一次 SYN-ACK 消息給A,直到重試超過(guò)一定次數(shù)時(shí)才會(huì)放棄。

B 為幫助 A 能順利連接,需要分配內(nèi)核資源維護(hù)半開(kāi)連接,那么當(dāng) B 面臨海量的連接 A 時(shí),如上圖所示,SYN Flood 攻擊就形成了。攻擊方 A 可以控制肉雞向 B 發(fā)送大量 SYN 消息但不響應(yīng) ACK 消息,或者干脆偽造 SYN 消息中的 Source IP,使 B 反饋的 SYN-ACK 消息石沉大海,導(dǎo)致 B 被大量注定不能完成的半開(kāi)連接占據(jù),直到資源耗盡,停止響應(yīng)正常的連接請(qǐng)求。
3 UDP Flooding
UDP 洪泛是也是一種拒絕服務(wù)攻擊,將大量的用戶數(shù)據(jù)報(bào)協(xié)議(UDP)數(shù)據(jù)包發(fā)送到目標(biāo)服務(wù)器,目的是壓倒該設(shè)備的處理和響應(yīng)能力。防火墻保護(hù)目標(biāo)服務(wù)器也可能因 UDP 泛濫而耗盡,從而導(dǎo)致對(duì)合法流量的拒絕服務(wù)。
UDP Flood攻擊如何工作?
UDP Flood 主要通過(guò)利用服務(wù)器響應(yīng)發(fā)送到其中一個(gè)端口的 UDP 數(shù)據(jù)包所采取的步驟。在正常情況下,當(dāng)服務(wù)器在特定端口接收到 UDP 數(shù)據(jù)包時(shí),會(huì)經(jīng)過(guò)兩個(gè)步驟:
服務(wù)器首先檢查是否正在運(yùn)行正在偵聽(tīng)指定端口的請(qǐng)求的程序。
如果沒(méi)有程序在該端口接收數(shù)據(jù)包,則服務(wù)器使用 ICMP(ping)數(shù)據(jù)包進(jìn)行響應(yīng),以通知發(fā)送方目的地不可達(dá)。
舉個(gè)例子。假設(shè)今天要聯(lián)系酒店的小藍(lán),酒店客服接到電話后先查看房間的列表來(lái)確保小藍(lán)在客房?jī)?nèi),隨后轉(zhuǎn)接給小藍(lán)。
首先,接待員接收到呼叫者要求連接到特定房間的電話。接待員然后需要查看所有房間的清單,以確??腿嗽诜块g中可用,并愿意接聽(tīng)電話。碰巧的是,此時(shí)如果突然間所有的電話線同時(shí)亮起來(lái),那么他們就會(huì)很快就變得不堪重負(fù)了。
當(dāng)服務(wù)器接收到每個(gè)新的 UDP 數(shù)據(jù)包時(shí),它將通過(guò)步驟來(lái)處理請(qǐng)求,并利用該過(guò)程中的服務(wù)器資源。發(fā)送 UDP 報(bào)文時(shí),每個(gè)報(bào)文將包含源設(shè)備的 IP 地址。在這種類(lèi)型的 DDoS 攻擊期間,攻擊者通常不會(huì)使用自己的真實(shí) IP 地址,而是會(huì)欺騙 UDP 數(shù)據(jù)包的源 IP 地址,從而阻止攻擊者的真實(shí)位置被暴露并潛在地飽和來(lái)自目標(biāo)的響應(yīng)數(shù)據(jù)包服務(wù)器。
由于目標(biāo)服務(wù)器利用資源檢查并響應(yīng)每個(gè)接收到的 UDP 數(shù)據(jù)包的結(jié)果,當(dāng)接收到大量 UDP 數(shù)據(jù)包時(shí),目標(biāo)的資源可能會(huì)迅速耗盡,導(dǎo)致對(duì)正常流量的拒絕服務(wù)。

如何緩解UDP洪水攻擊?
大多數(shù)操作系統(tǒng)部分限制了 ICMP 報(bào)文的響應(yīng)速率,以中斷需要 ICMP 響應(yīng)的 DDoS 攻擊。這種緩解的一個(gè)缺點(diǎn)是在攻擊過(guò)程中,合法的數(shù)據(jù)包也可能被過(guò)濾。如果 UDP Flood 的容量足夠高以使目標(biāo)服務(wù)器的防火墻的狀態(tài)表飽和,則在服務(wù)器級(jí)別發(fā)生的任何緩解都將不足以應(yīng)對(duì)目標(biāo)設(shè)備上游的瓶頸。
4 TCP 重置攻擊
在 TCP 重置攻擊中,攻擊者通過(guò)向通信的一方或雙方發(fā)送偽造的消息,告訴它們立即斷開(kāi)連接,從而使通信雙方連接中斷。正常情況下,如果客戶端收發(fā)現(xiàn)到達(dá)的報(bào)文段對(duì)于相關(guān)連接而言是不正確的,TCP 就會(huì)發(fā)送一個(gè)重置報(bào)文段,從而導(dǎo)致 TCP 連接的快速拆卸。
TCP 重置攻擊利用這一機(jī)制,通過(guò)向通信方發(fā)送偽造的重置報(bào)文段,欺騙通信雙方提前關(guān)閉 TCP 連接。如果偽造的重置報(bào)文段完全逼真,接收者就會(huì)認(rèn)為它有效,并關(guān)閉 TCP 連接,防止連接被用來(lái)進(jìn)一步交換信息。服務(wù)端可以創(chuàng)建一個(gè)新的 TCP 連接來(lái)恢復(fù)通信,但仍然可能會(huì)被攻擊者重置連接。萬(wàn)幸的是,攻擊者需要一定的時(shí)間來(lái)組裝和發(fā)送偽造的報(bào)文,所以一般情況下這種攻擊只對(duì)長(zhǎng)連接有殺傷力,對(duì)于短連接而言,你還沒(méi)攻擊呢,人家已經(jīng)完成了信息交換。
從某種意義上來(lái)說(shuō),偽造 TCP 報(bào)文段是很容易的,因?yàn)?TCP/IP 都沒(méi)有任何內(nèi)置的方法來(lái)驗(yàn)證服務(wù)端的身份。有些特殊的 IP 擴(kuò)展協(xié)議(例如 IPSec)確實(shí)可以驗(yàn)證身份,但并沒(méi)有被廣泛使用。客戶端只能接收?qǐng)?bào)文段,并在可能的情況下使用更高級(jí)別的協(xié)議(如 TLS)來(lái)驗(yàn)證服務(wù)端的身份。但這個(gè)方法對(duì) TCP 重置包并不適用,因?yàn)?TCP 重置包是 TCP 協(xié)議本身的一部分,無(wú)法使用更高級(jí)別的協(xié)議進(jìn)行驗(yàn)證。
5. 模擬攻擊
以下實(shí)驗(yàn)是在
OSX系統(tǒng)中完成的,其他系統(tǒng)請(qǐng)自行測(cè)試。
現(xiàn)在來(lái)總結(jié)一下偽造一個(gè) TCP 重置報(bào)文要做哪些事情:
嗅探通信雙方的交換信息。
截獲一個(gè)
ACK標(biāo)志位置位 1 的報(bào)文段,并讀取其ACK號(hào)。偽造一個(gè) TCP 重置報(bào)文段(
RST標(biāo)志位置為 1),其序列號(hào)等于上面截獲的報(bào)文的ACK號(hào)。這只是理想情況下的方案,假設(shè)信息交換的速度不是很快。大多數(shù)情況下為了增加成功率,可以連續(xù)發(fā)送序列號(hào)不同的重置報(bào)文。將偽造的重置報(bào)文發(fā)送給通信的一方或雙方,時(shí)其中斷連接。
為了實(shí)驗(yàn)簡(jiǎn)單,我們可以使用本地計(jì)算機(jī)通過(guò) localhost 與自己通信,然后對(duì)自己進(jìn)行 TCP 重置攻擊。需要以下幾個(gè)步驟:
在兩個(gè)終端之間建立一個(gè) TCP 連接。
編寫(xiě)一個(gè)能嗅探通信雙方數(shù)據(jù)的攻擊程序。
修改攻擊程序,偽造并發(fā)送重置報(bào)文。
下面正式開(kāi)始實(shí)驗(yàn)。
建立 TCP 連接
可以使用 netcat 工具來(lái)建立 TCP 連接,這個(gè)工很多操作系統(tǒng)都預(yù)裝了。打開(kāi)第一個(gè)終端窗口,運(yùn)行以下命令:
$ nc -nvl 8000
這個(gè)命令會(huì)啟動(dòng)一個(gè) TCP 服務(wù),監(jiān)聽(tīng)端口為 8000。接著再打開(kāi)第二個(gè)終端窗口,運(yùn)行以下命令:
$ nc 127.0.0.1 8000
該命令會(huì)嘗試與上面的服務(wù)建立連接,在其中一個(gè)窗口輸入一些字符,就會(huì)通過(guò) TCP 連接發(fā)送給另一個(gè)窗口并打印出來(lái)。

嗅探流量
編寫(xiě)一個(gè)攻擊程序,使用 Python 網(wǎng)絡(luò)庫(kù) scapy 來(lái)讀取兩個(gè)終端窗口之間交換的數(shù)據(jù),并將其打印到終端上。代碼比較長(zhǎng),下面為一部份,完整代碼后臺(tái)回復(fù) TCP攻擊,代碼的核心是調(diào)用 scapy 的嗅探方法:

這段代碼告訴 scapy 在 lo0 網(wǎng)絡(luò)接口上嗅探數(shù)據(jù)包,并記錄所有 TCP 連接的詳細(xì)信息。
iface : 告訴 scapy 在
lo0(localhost)網(wǎng)絡(luò)接口上進(jìn)行監(jiān)聽(tīng)。lfilter : 這是個(gè)過(guò)濾器,告訴 scapy 忽略所有不屬于指定的 TCP 連接(通信雙方皆為
localhost,且端口號(hào)為8000)的數(shù)據(jù)包。prn : scapy 通過(guò)這個(gè)函數(shù)來(lái)操作所有符合
lfilter規(guī)則的數(shù)據(jù)包。上面的例子只是將數(shù)據(jù)包打印到終端,下文將會(huì)修改函數(shù)來(lái)偽造重置報(bào)文。count : scapy 函數(shù)返回之前需要嗅探的數(shù)據(jù)包數(shù)量。
發(fā)送偽造的重置報(bào)文
下面開(kāi)始修改程序,發(fā)送偽造的 TCP 重置報(bào)文來(lái)進(jìn)行 TCP 重置攻擊。根據(jù)上面的解讀,只需要修改 prn 函數(shù)就行了,讓其檢查數(shù)據(jù)包,提取必要參數(shù),并利用這些參數(shù)來(lái)偽造 TCP 重置報(bào)文并發(fā)送。
例如,假設(shè)該程序截獲了一個(gè)從(src_ip, src_port)發(fā)往 (dst_ip, dst_port)的報(bào)文段,該報(bào)文段的 ACK 標(biāo)志位已置為 1,ACK 號(hào)為 100,000。攻擊程序接下來(lái)要做的是:
由于偽造的數(shù)據(jù)包是對(duì)截獲的數(shù)據(jù)包的響應(yīng),所以偽造數(shù)據(jù)包的源
IP/Port應(yīng)該是截獲數(shù)據(jù)包的目的IP/Port,反之亦然。將偽造數(shù)據(jù)包的
RST標(biāo)志位置為 1,以表示這是一個(gè)重置報(bào)文。將偽造數(shù)據(jù)包的序列號(hào)設(shè)置為截獲數(shù)據(jù)包的 ACK 號(hào),因?yàn)檫@是發(fā)送方期望收到的下一個(gè)序列號(hào)。
調(diào)用
scapy的send方法,將偽造的數(shù)據(jù)包發(fā)送給截獲數(shù)據(jù)包的發(fā)送方。
對(duì)于我的程序而言,只需將這一行取消注釋?zhuān)⒆⑨屵@一行的上面一行,就可以全面攻擊了。按照步驟 1 的方法設(shè)置 TCP 連接,打開(kāi)第三個(gè)窗口運(yùn)行攻擊程序,然后在 TCP 連接的其中一個(gè)終端輸入一些字符串,你會(huì)發(fā)現(xiàn) TCP 連接被中斷了!
進(jìn)一步實(shí)驗(yàn)
可以繼續(xù)使用攻擊程序進(jìn)行實(shí)驗(yàn),將偽造數(shù)據(jù)包的序列號(hào)加減 1 看看會(huì)發(fā)生什么,是不是確實(shí)需要和截獲數(shù)據(jù)包的
ACK號(hào)完全相同。打開(kāi)
Wireshark,監(jiān)聽(tīng) lo0 網(wǎng)絡(luò)接口,并使用過(guò)濾器ip.src == 127.0.0.1 && ip.dst == 127.0.0.1 && tcp.port == 8000來(lái)過(guò)濾無(wú)關(guān)數(shù)據(jù)。你可以看到 TCP 連接的所有細(xì)節(jié)。在連接上更快速地發(fā)送數(shù)據(jù)流,使攻擊更難執(zhí)行。
6 中間人攻擊
豬八戒要向小藍(lán)表白,于是寫(xiě)了一封信給小藍(lán),結(jié)果第三者小黑攔截到了這封信,把這封信進(jìn)行了篡改,于是乎在他們之間進(jìn)行搞破壞行動(dòng)。這個(gè)馬文才就是中間人,實(shí)施的就是中間人攻擊。好我們繼續(xù)聊聊什么是中間人攻擊。
什么是中間人
攻擊中間人攻擊英文名叫 Man-in-the-MiddleAttack,簡(jiǎn)稱(chēng)「MITM攻擊」。指攻擊者與通訊的兩端分別創(chuàng)建獨(dú)立的聯(lián)系,并交換其所收到的數(shù)據(jù),使通訊的兩端認(rèn)為他們正在通過(guò)一個(gè)私密的連接與對(duì)方 直接對(duì)話,但事實(shí)上整個(gè)會(huì)話都被攻擊者完全控制。我們畫(huà)一張圖:

從這張圖可以看到,中間人其實(shí)就是攻擊者。通過(guò)這種原理,有很多實(shí)現(xiàn)的用途,比如說(shuō),你在手機(jī)上瀏覽不健康網(wǎng)站的時(shí)候,手機(jī)就會(huì)提示你,此網(wǎng)站可能含有病毒,是否繼續(xù)訪問(wèn)還是做其他的操作等等。
中間人攻擊的原理
舉個(gè)例子,我和公司簽了一個(gè)一份勞動(dòng)合同,一人一份合同。不曉得哪個(gè)可能改了合同內(nèi)容,不知道真假了,怎么搞?只好找專(zhuān)業(yè)的機(jī)構(gòu)來(lái)鑒定,自然就要花錢(qián)。
在安全領(lǐng)域有句話:我們沒(méi)有辦法杜絕網(wǎng)絡(luò)犯罪,只好想辦法提高網(wǎng)絡(luò)犯罪的成本。既然沒(méi)法杜絕這種情況,那我們就想辦法提高作案的成本,今天我們就簡(jiǎn)單了解下基本的網(wǎng)絡(luò)安全知識(shí),也是面試中的高頻面試題了。
為了避免雙方說(shuō)活不算數(shù)的情況,雙方引入第三家機(jī)構(gòu),將合同原文給可信任的第三方機(jī)構(gòu),只要這個(gè)機(jī)構(gòu)不監(jiān)守自盜,合同就相對(duì)安全。
如果第三方機(jī)構(gòu)內(nèi)部不嚴(yán)格或容易出現(xiàn)紕漏
雖然我們將合同原文給第三方機(jī)構(gòu)了,為了防止內(nèi)部人員的更改,需要采取什么措施呢
一種可行的辦法是引入摘要算法。即合同和摘要一起,為了簡(jiǎn)單的理解摘要。大家可以想象這個(gè)摘要為一個(gè)函數(shù),這個(gè)函數(shù)對(duì)原文進(jìn)行了加密,會(huì)產(chǎn)生一個(gè)唯一的散列值,一旦原文發(fā)生一點(diǎn)點(diǎn)變化,那么這個(gè)散列值將會(huì)變化。
有哪些常用的摘要算法呢
目前比較常用的加密算法有消息摘要算法和安全散列算法(SHA)。MD5 是將任意長(zhǎng)度的文章轉(zhuǎn)化為一個(gè)128位的散列值,可是在2004年,MD5 被證實(shí)了容易發(fā)生碰撞,即兩篇原文產(chǎn)生相同的摘要。這樣的話相當(dāng)于直接給黑客一個(gè)后門(mén),輕松偽造摘要。
所以在大部分的情況下都會(huì)選擇SHA算法
出現(xiàn)內(nèi)鬼了怎么辦?
看似很安全的場(chǎng)面了,理論上來(lái)說(shuō)杜絕了篡改合同的做法。主要某個(gè)員工同時(shí)具有修改合同和摘要的權(quán)利,那搞事兒就是時(shí)間的問(wèn)題了,畢竟沒(méi)哪個(gè)系統(tǒng)可以完全的杜絕員工接觸敏感信息,除非敏感信息都不存在。所以能不能考慮將合同和摘要分開(kāi)存儲(chǔ)呢
那如何確保員工不會(huì)修改合同呢
這確實(shí)蠻難的,不過(guò)辦法總比困難多。我們將合同放在雙方手中,摘要放在第三方機(jī)構(gòu),篡改難度進(jìn)一步加大
那么員工萬(wàn)一和某個(gè)用戶串通好了呢
看來(lái)放在第三方的機(jī)構(gòu)還是不好使,同樣存在不小風(fēng)險(xiǎn)。所以還需要尋找新的方案,這就出現(xiàn)了數(shù)字簽名和證書(shū)
數(shù)字證書(shū)和簽名
同樣的,舉個(gè)例子。Sum 和 Mike 兩個(gè)人簽合同。Sum 首先用 SHA 算法計(jì)算合同的摘要,然后用自己私鑰將摘要加密,得到數(shù)字簽名。Sum 將合同原文、簽名,以及公鑰三者都交給 Mike

如果 Sum 想要證明合同是 Mike 的,那么就要使用 Mike 的公鑰,將這個(gè)簽名解密得到摘要x,然后Mike 計(jì)算原文的sha摘要Y,隨后對(duì)比x和y,如果兩者相等,就認(rèn)為數(shù)據(jù)沒(méi)有被篡改
在這樣的過(guò)程中,Mike 是不能更改 Sum 的合同,因?yàn)橐薷暮贤粌H僅要修改原文還要修改摘要,修改摘要需要提供Mike 的私鑰,私鑰即 Sum 獨(dú)有的密碼,公鑰即 Sum 公布給他人使用的密碼
總之,公鑰加密的數(shù)據(jù)只能私鑰可以解密。私鑰加密的數(shù)據(jù)只有公鑰可以解密,這就是非對(duì)稱(chēng)加密
對(duì)稱(chēng)與非對(duì)稱(chēng)加密
隱私保護(hù)?不是嚇唬大家,信息是透明的兄die,不過(guò)盡量去維護(hù)個(gè)人的隱私吧,今天學(xué)習(xí)對(duì)稱(chēng)加密和非對(duì)稱(chēng)加密。
大家先讀讀這個(gè)字"鑰",是讀"yao",我以前也是,其實(shí)讀"yue"
對(duì)稱(chēng)加密
對(duì)稱(chēng)加密,顧名思義,加密方與解密方使用同一鑰匙(秘鑰)。具體一些就是,發(fā)送方通過(guò)使用相應(yīng)的加密算法和秘鑰,對(duì)將要發(fā)送的信息進(jìn)行加密;對(duì)于接收方而言,使用解密算法和相同的秘鑰解鎖信息,從而有能力閱讀信息。

常見(jiàn)的對(duì)稱(chēng)加密算法
DES
DES使用的密鑰表面上是64位的,然而只有其中的56位被實(shí)際用于算法,其余8位可以被用于奇偶校驗(yàn),并在算法中被丟棄。因此,DES 的有效密鑰長(zhǎng)度為56位,通常稱(chēng) DES 的密鑰長(zhǎng)度為56位。假設(shè)秘鑰為 56 位,采用暴力破Jie的方式,其秘鑰個(gè)數(shù)為2的56次方,那么每納秒執(zhí)行一次解密所需要的時(shí)間差不多1年的樣子。當(dāng)然,沒(méi)人這么干。DES 現(xiàn)在已經(jīng)不是一種安全的加密方法,主要因?yàn)樗褂玫?6位密鑰過(guò)短。

IDEA
國(guó)際數(shù)據(jù)加密算法(International Data Encryption Algorithm)。秘鑰長(zhǎng)度128位,優(yōu)點(diǎn)沒(méi)有專(zhuān)利的限制。
AES
當(dāng)DES被破解以后,沒(méi)過(guò)多久推出了 AES 算法,提供了三種長(zhǎng)度供選擇,128 位、192 位和 256,為了保證性能不受太大的影響,選擇128即可。
SM1和SM4
之前幾種都是國(guó)外的,我們國(guó)內(nèi)自行研究了國(guó)密 **SM1 **和 SM4。其中S都屬于國(guó)家標(biāo)準(zhǔn),算法公開(kāi)。優(yōu)點(diǎn)就是國(guó)家的大力支持和認(rèn)可
總結(jié)下幾種

非對(duì)稱(chēng)算法
在對(duì)稱(chēng)加密中,發(fā)送方與接收方使用相同的秘鑰。那么在非對(duì)稱(chēng)加密中則是發(fā)送方與接收方使用的不同的秘鑰。其主要解決的問(wèn)題是防止在秘鑰協(xié)商的過(guò)程中發(fā)生泄漏。比如在對(duì)稱(chēng)加密中,小藍(lán)將需要發(fā)送的消息加密,然后告訴你密碼是123balala,ok,對(duì)于其他人而言,很容易就能劫持到密碼是123balala。那么在非對(duì)稱(chēng)的情況下,小藍(lán)告訴所有人密碼是123balala,對(duì)于中間人而言,拿到也沒(méi)用,因?yàn)闆](méi)有私鑰。所以,非對(duì)稱(chēng)密鑰其實(shí)主要解決了密鑰分發(fā)的難題。如下圖

其實(shí)我們經(jīng)常都在使用非對(duì)稱(chēng)加密,比如使用多臺(tái)服務(wù)器搭建大數(shù)據(jù)平臺(tái)hadoop,為了方便多臺(tái)機(jī)器設(shè)置免密登錄,是不是就會(huì)涉及到秘鑰分發(fā)。再比如搭建docker集群也會(huì)使用相關(guān)非對(duì)稱(chēng)加密算法。
常見(jiàn)的非對(duì)稱(chēng)加密
RSA(RSA 加密算法,RSA Algorithm)
優(yōu)勢(shì)是性能比較快,如果想要較高的加密難度,需要很長(zhǎng)的秘鑰。
ECC
基于橢圓曲線提出。是目前加密強(qiáng)度最高的非對(duì)稱(chēng)加密算法
SM2
同樣基于橢圓曲線問(wèn)題設(shè)計(jì)。最大優(yōu)勢(shì)就是國(guó)家認(rèn)可和大力支持。
三種對(duì)比

散列算法
這個(gè)大家應(yīng)該更加熟悉了,比如我們平常使用的MD5校驗(yàn),在很多時(shí)候,我并不是拿來(lái)進(jìn)行加密,而是用來(lái)獲得唯一性ID。在做系統(tǒng)的過(guò)程中,存儲(chǔ)用戶的各種密碼信息,通常都會(huì)通過(guò)散列算法,最終存儲(chǔ)其散列值。
常見(jiàn)的散列
MD5
MD5 可以用來(lái)生成一個(gè) 128 位的消息摘要,它是目前應(yīng)用比較普遍的散列算法,具體的應(yīng)用場(chǎng)景你可以自行 參閱。雖然,因?yàn)樗惴ǖ娜毕?,它的唯一性已?jīng)被破解了,但是大部分場(chǎng)景下,這并不會(huì)構(gòu)成安全問(wèn)題。但是,如果不是長(zhǎng)度受限(32 個(gè)字符),我還是不推薦你繼續(xù)使用 MD5 的。
SHA
安全散列算法。**SHA **分為 SHA1 和 SH2 兩個(gè)版本。該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉(zhuǎn)換成一段(通常更?。┟芪?,也可以簡(jiǎn)單的理解為取一串輸入碼(稱(chēng)為預(yù)映射或信息),并把它們轉(zhuǎn)化為長(zhǎng)度較短、位數(shù)固定的輸出序列即散列值(也稱(chēng)為信息摘要或信息認(rèn)證代碼)的過(guò)程。
SM3
國(guó)密算法SM3。加密強(qiáng)度和SHA-256想不多。主要是收到國(guó)家的支持。
總結(jié)

至此,總結(jié)下,大部分情況下使用對(duì)稱(chēng)加密,具有比較不錯(cuò)的安全性。如果需要分布式進(jìn)行秘鑰分發(fā),考慮非對(duì)稱(chēng)。如果不需要可逆計(jì)算則散列算法。因?yàn)檫@段時(shí)間有這方面需求,就看了一些這方面的資料,入坑信息安全,就怕以后洗發(fā)水都不用買(mǎi)。謝謝大家查看!
問(wèn)題還有,此時(shí)如果 Sum 否認(rèn)給過(guò) Mike 的公鑰和合同,不久gg了
所以需要 Sum 過(guò)的話做過(guò)的事兒需要足夠的信譽(yù),這就引入了第三方機(jī)構(gòu)和證書(shū)機(jī)制。
證書(shū)之所以會(huì)有信用,是因?yàn)樽C書(shū)的簽發(fā)方擁有信用。所以如果 Sum 想讓 Mike 承認(rèn)自己的公鑰,Sum 不會(huì)直接將公鑰給 Mike ,而是提供由第三方機(jī)構(gòu),含有公鑰的證書(shū)。如果 Mike 也信任這個(gè)機(jī)構(gòu),法律都認(rèn)可,那ik,信任關(guān)系成立

如上圖所示,Sum 將自己的申請(qǐng)?zhí)峤唤o機(jī)構(gòu),產(chǎn)生證書(shū)的原文。機(jī)構(gòu)用自己的私鑰簽名 Sum 的申請(qǐng)?jiān)模ㄏ雀鶕?jù)原文內(nèi)容計(jì)算摘要,再用私鑰加密),得到帶有簽名信息的證書(shū)。Mike 拿到帶簽名信息的證書(shū),通過(guò)第三方機(jī)構(gòu)的公鑰進(jìn)行解密,獲得 Sum 證書(shū)的摘要、證書(shū)的原文。有了 Sum 證書(shū)的摘要和原文,Mike 就可以進(jìn)行驗(yàn)簽。驗(yàn)簽通過(guò),Mike 就可以確認(rèn) Sum 的證書(shū)的確是第三方機(jī)構(gòu)簽發(fā)的。
用上面這樣一個(gè)機(jī)制,合同的雙方都無(wú)法否認(rèn)合同。這個(gè)解決方案的核心在于需要第三方信用服務(wù)機(jī)構(gòu)提供信用背書(shū)。這里產(chǎn)生了一個(gè)最基礎(chǔ)的信任鏈,如果第三方機(jī)構(gòu)的信任崩潰,比如被黑客攻破,那整條信任鏈條也就斷裂了
為了讓這個(gè)信任條更加穩(wěn)固,就需要環(huán)環(huán)相扣,打造更長(zhǎng)的信任鏈,避免單點(diǎn)信任風(fēng)險(xiǎn)

上圖中,由信譽(yù)最好的根證書(shū)機(jī)構(gòu)提供根證書(shū),然后根證書(shū)機(jī)構(gòu)去簽發(fā)二級(jí)機(jī)構(gòu)的證書(shū);二級(jí)機(jī)構(gòu)去簽發(fā)三級(jí)機(jī)構(gòu)的證書(shū);最后有由三級(jí)機(jī)構(gòu)去簽發(fā) Sum 證書(shū)。
如果要驗(yàn)證 Sum 證書(shū)的合法性,就需要用三級(jí)機(jī)構(gòu)證書(shū)中的公鑰去解密 Sum 證書(shū)的數(shù)字簽名。
如果要驗(yàn)證三級(jí)機(jī)構(gòu)證書(shū)的合法性,就需要用二級(jí)機(jī)構(gòu)的證書(shū)去解密三級(jí)機(jī)構(gòu)證書(shū)的數(shù)字簽名。
如果要驗(yàn)證二級(jí)結(jié)構(gòu)證書(shū)的合法性,就需要用根證書(shū)去解密。
以上,就構(gòu)成了一個(gè)相對(duì)長(zhǎng)一些的信任鏈。如果其中一方想要作弊是非常困難的,除非鏈條中的所有機(jī)構(gòu)同時(shí)聯(lián)合起來(lái),進(jìn)行欺詐。
中間人攻擊如何避免?
既然知道了中間人攻擊的原理也知道了他的危險(xiǎn),現(xiàn)在我們看看如何避免。相信我們都遇到過(guò)下面這種狀況:

出現(xiàn)這個(gè)界面的很多情況下,都是遇到了中間人攻擊的現(xiàn)象,需要對(duì)安全證書(shū)進(jìn)行及時(shí)地監(jiān)測(cè)。而且大名鼎鼎的github網(wǎng)站,也曾遭遇過(guò)中間人攻擊:
想要避免中間人攻擊的方法目前主要有兩個(gè):
客戶端不要輕易相信證書(shū):因?yàn)檫@些證書(shū)極有可能是中間人。
App 可以提前預(yù)埋證書(shū)在本地:意思是我們本地提前有一些證書(shū),這樣其他證書(shū)就不能再起作用了。
7 DDOS
通過(guò)上面的描述,總之即好多種攻擊都是 DDOS 攻擊,所以簡(jiǎn)單總結(jié)下這個(gè)攻擊相關(guān)內(nèi)容。
其實(shí),像全球互聯(lián)網(wǎng)各大公司,均遭受過(guò)大量的 DDoS。
2018年,GitHub 在一瞬間遭到高達(dá) 1.35Tbps 的帶寬攻擊。這次 DDoS 攻擊幾乎可以堪稱(chēng)是互聯(lián)網(wǎng)有史以來(lái)規(guī)模最大、威力最大的 DDoS 攻擊了。在 GitHub 遭到攻擊后,僅僅一周后,DDoS 攻擊又開(kāi)始對(duì) Google、亞馬遜甚至 Pornhub 等網(wǎng)站進(jìn)行了 DDoS 攻擊。后續(xù)的 DDoS 攻擊帶寬最高也達(dá)到了 1Tbps。
那 DDoS 攻擊究竟是什么?
DDos 全名 Distributed Denial of Service,翻譯成中文就是分布式拒絕服務(wù)。指的是處于不同位置的多個(gè)攻擊者同時(shí)向一個(gè)或數(shù)個(gè)目標(biāo)發(fā)動(dòng)攻擊,是一種分布的、協(xié)同的大規(guī)模攻擊方式。單一的DoS攻擊一般是采用一對(duì)一方式的,它利用網(wǎng)絡(luò)協(xié)議和操作系統(tǒng)的一些缺陷,采用欺騙和偽裝的策略來(lái)進(jìn)行網(wǎng)絡(luò)攻擊,使網(wǎng)站服務(wù)器充斥大量要求回復(fù)的信息,消耗網(wǎng)絡(luò)帶寬或系統(tǒng)資源,導(dǎo)致網(wǎng)絡(luò)或系統(tǒng)不勝負(fù)荷以至于癱瘓而停止提供正常的網(wǎng)絡(luò)服務(wù)。
舉個(gè)例子
我開(kāi)了一家有五十個(gè)座位的重慶火鍋店,由于用料上等,童叟無(wú)欺。平時(shí)門(mén)庭若市,生意特別紅火,而對(duì)面二狗家的火鍋店卻無(wú)人問(wèn)津。二狗為了對(duì)付我,想了一個(gè)辦法,叫了五十個(gè)人來(lái)我的火鍋店坐著卻不點(diǎn)菜,讓別的客人無(wú)法吃飯。
上面這個(gè)例子講的就是典型的 DDoS 攻擊,一般來(lái)說(shuō)是指攻擊者利用“肉雞”對(duì)目標(biāo)網(wǎng)站在較短的時(shí)間內(nèi)發(fā)起大量請(qǐng)求,大規(guī)模消耗目標(biāo)網(wǎng)站的主機(jī)資源,讓它無(wú)法正常服務(wù)。在線游戲、互聯(lián)網(wǎng)金融等領(lǐng)域是 DDoS 攻擊的高發(fā)行業(yè)。
攻擊方式很多,比如 ICMP Flood、UDP Flood、NTP Flood、SYN Flood、CC 攻擊、DNS Query Flood等等。
SYN Flood進(jìn)行DDoS攻擊的實(shí)現(xiàn)原理**
SYN Flood 是一種利用 TCP 協(xié)議缺陷,發(fā)送大量偽造的 TCP 連接請(qǐng)求,從而使得被攻擊方資源耗盡(CPU滿負(fù)荷或內(nèi)存不足)的攻擊方式。
一次正常的建立 TCP 連接,需要三次握手:客戶端發(fā)送 SYN 報(bào)文,服務(wù)端收到請(qǐng)求并返回報(bào)文表示接受,客戶端也返回確認(rèn),完成連接。
SYN Flood 就是用戶向服務(wù)器發(fā)送報(bào)文后突然死機(jī)或掉線,那么服務(wù)器在發(fā)出應(yīng)答報(bào)文后就無(wú)法收到客戶端的確認(rèn)報(bào)文(第三次握手無(wú)法完成),這時(shí)服務(wù)器端一般會(huì)重試并等待一段時(shí)間后再丟棄這個(gè)未完成的連接。
一個(gè)用戶出現(xiàn)異常導(dǎo)致服務(wù)器的一個(gè)線程等待一會(huì)兒并不是大問(wèn)題,但惡意攻擊者大量模擬這種情況,服務(wù)器端為了維護(hù)數(shù)以萬(wàn)計(jì)的半連接而消耗非常多的資源,結(jié)果往往是無(wú)暇理睬客戶的正常請(qǐng)求,甚至崩潰。從正??蛻舻慕嵌瓤磥?lái),網(wǎng)站失去了響應(yīng),無(wú)法訪問(wèn)。
如何應(yīng)對(duì) DDoS 攻擊?
高防服務(wù)器
還是拿開(kāi)的重慶火鍋店舉例,高防服務(wù)器就是我給重慶火鍋店增加了兩名保安,這兩名保安可以讓保護(hù)店鋪不受流氓騷擾,并且還會(huì)定期在店鋪周?chē)策壏乐沽髅ヲ}擾。
高防服務(wù)器主要是指能獨(dú)立硬防御 50Gbps 以上的服務(wù)器,能夠幫助網(wǎng)站拒絕服務(wù)攻擊,定期掃描網(wǎng)絡(luò)主節(jié)點(diǎn)等,這東西是不錯(cuò),就是貴~
黑名單
面對(duì)火鍋店里面的流氓,我一怒之下將他們拍照入檔,并禁止他們踏入店鋪,但是有的時(shí)候遇到長(zhǎng)得像的人也會(huì)禁止他進(jìn)入店鋪。這個(gè)就是設(shè)置黑名單,此方法秉承的就是“錯(cuò)殺一千,也不放一百”的原則,會(huì)封鎖正常流量,影響到正常業(yè)務(wù)。
DDoS 清洗
DDos 清洗,就是我發(fā)現(xiàn)客人進(jìn)店幾分鐘以后,但是一直不點(diǎn)餐,我就把他踢出店里。
DDoS 清洗會(huì)對(duì)用戶請(qǐng)求數(shù)據(jù)進(jìn)行實(shí)時(shí)監(jiān)控,及時(shí)發(fā)現(xiàn) **DOS **攻擊等異常流量,在不影響正常業(yè)務(wù)開(kāi)展的情況下清洗掉這些異常流量。
CDN 加速
CDN 加速,我們可以這么理解:為了減少流氓騷擾,我干脆將火鍋店開(kāi)到了線上,承接外賣(mài)服務(wù),這樣流氓找不到店在哪里,也耍不來(lái)流氓了。
在現(xiàn)實(shí)中,CDN 服務(wù)將網(wǎng)站訪問(wèn)流量分配到了各個(gè)節(jié)點(diǎn)中,這樣一方面隱藏網(wǎng)站的真實(shí) IP,另一方面即使遭遇 DDoS 攻擊,也可以將流量分散到各個(gè)節(jié)點(diǎn)中,防止源站崩潰。
總結(jié)
計(jì)算機(jī)網(wǎng)絡(luò)涉及的知識(shí)點(diǎn)較多,文中也就算是提了一下,更深此的理解還需要大家去看相應(yīng)的書(shū)籍,感覺(jué)看了這一篇,當(dāng)面試官問(wèn) DDOS 或者 TCP 涉及哪些攻擊技術(shù)知識(shí)點(diǎn)的時(shí)候,能夠回答出來(lái)就好了,咋們下一篇再見(jiàn)!
不知不覺(jué)中這篇文章從素材的確認(rèn),關(guān)鍵字的過(guò)濾,上下文的銜接,畫(huà)圖,算下來(lái)差不多兩周,不過(guò)在這個(gè)過(guò)程確實(shí)學(xué)習(xí)了不少新的知識(shí)點(diǎn)。有點(diǎn)收獲不妨點(diǎn)贊,在看,轉(zhuǎn)發(fā),謝謝!
