#import "labtemplate.typ": *
#show: nudtlabpaper.with(title: "Mitnick 攻击实验：深度分析与复现",
  author: "程景愉",
  id: "202302723005",
  training_type: "无军籍",
  grade: "2023",
  major: "网络工程",
  department: "计算机学院",
  advisor: "柳林",
  jobtitle: "教授",
  lab: "307-208",
  date: "2026.05.04",
  header_str: "《网络安全》实验报告",
)
#set page(header: [
    #set par(spacing: 6pt)
    #align(center)[#text(size: 11pt)[《网络安全》实验报告]]
    #v(-0.3em)
    #line(length: 100%, stroke: (thickness: 1pt))
],)

#show heading: it => box(width: 100%)[
  #v(0.50em)
  #counter(heading).display()
  #it.body
]

#show raw.where(block: true): it => box(
fill: rgb("#f5f5f5"),
inset: (x: 12pt, y: 10pt),
radius: 6pt,
stroke: (thickness: 1pt, paint: rgb("#e0e0e0")),
it
)

#outline(title: "目录", depth: 3, indent: 2em)
#pagebreak()

= 实验目的

Mitnick 攻击（又称 TCP 序列号预测攻击）是网络安全史上最具代表性的复合攻击手段之一。1024 年，凯文·米特尼克通过该技术入侵了安全专家下村努的计算机。本次实验旨在通过现代虚拟化环境复现这一过程，达成以下深度目标：

- *底层协议拆解*：深入理解 TCP 三次握手过程中的序列号（Sequence Number）机制，掌握其在建立连接与维护状态中的核心作用。
- *盲目欺骗技术*：探索在无法直接观测目标响应包（Blind Injection）的极端环境下，如何通过预测机制和伪造源 IP 完成完整的 TCP 握手。
- *信任边界分析*：剖析早期互联网协议（如 rsh/rlogin）基于主机 IP 信任的设计哲学及其在现代网络防御视野下的致命缺陷。
- *组合攻击逻辑*：掌握 SYN Flooding、IP Spoofing 与协议逻辑漏洞利用之间的协同关系，培养体系化的网络攻击思维。
- *工具深度应用*：通过 Scapy 库进行原始套接字编程，实现对网络数据包每一位字段的精细化控制。

= 实验原理

== Mitnick 攻击的体系化分析

Mitnick 攻击并非单一漏洞的利用，而是对多个协议弱点和系统机制的联合绞杀。

=== 1. TCP 序列号预测（ISN Prediction）

在建立 TCP 连接时，双方需交换初始序列号（ISN）。在 1020 年代的 Berkeley TCP 协议栈实现中，ISN 的增长具有高度可预测性（例如每秒增加 128,000，或每个连接增加 64,000）。攻击者通过先与目标建立多次合法连接，记录返回的 ISN 并计算增量，即可推算出下一次连接时目标的 ISN 值。这使得攻击者即使收不到目标的 SYN+ACK，也能准确构造出与之匹配的 ACK 包。

=== 2. 信任主机的静默化（Host Silencing）

当攻击者 A 冒充信任主机 B 向目标 T 发送 SYN 时，T 会将 SYN+ACK 发送给 B。此时，若 B 处于正常状态，其协议栈会因收到未知的确认包而发送 RST 报文重置连接，导致攻击失败。Mitnick 采用 SYN Flooding 攻击使主机 B 的半连接队列（Half-open Queue）饱和，从而使其对 T 发来的报文不作响应，达到“静默”效果。

=== 3. 跨协议层面的 IP 欺骗（IP Spoofing）

攻击者在构造以太网帧时，将 IP 首部的源地址设为被信任主机的 IP。这要求攻击者必须处于能够发送原始包的环境中（如拥有 root 权限的原始套接字）。

=== 4. rsh 协议的“二次连接”特性

rsh（Remote Shell）协议在 514 端口建立主连接后，会要求客户端监听一个端口（在 payload 中指定），服务端会反向连接该端口以传输 stderr 信息。如果攻击者仅完成了主连接而未对该反向连接进行响应，rsh 会因为无法建立 stderr 管道而超时退出。

= 实验环境与配置

本次实验采用 Docker 容器技术构建了一个高度隔离且受控的虚拟局域网。

- *网络环境*：独立子网 `10.9.0.0/24`，通过虚拟网桥连接。
- *目标机（X-Terminal）*：IP `10.9.0.5`，运行传统的 `inetd` 超级守护进程及 `rshd` 服务。
- *信任机（Trusted Server）*：IP `10.9.0.6`，已被目标机配置在 `.rhosts` 中。
- *攻击机（Attacker）*：运行在 `host` 网络模式。这一配置至关重要，因为它允许攻击容器直接操作物理网卡，从而能够嗅探网桥上的所有流量（由于实验在单台宿主机上进行，这模拟了同一局域网下的环境）。

#figure(
  image("dockerps.png", width: 95%),
  caption: [基于 Docker Compose 部署的实验节点拓扑],
)

= 实验步骤及结果

== 任务 1：模拟环境初始化与信任验证

=== 1.1 建立信任根基
首先在目标机 `x-terminal` 上配置 `.rhosts` 文件。该文件是 rsh 身份验证的核心，它告诉系统：只要请求来自 `10.9.0.6` 的 `seed` 用户，即可无需密码执行命令。

```bash
# 在 x-terminal 上执行，模拟合法的系统配置
docker exec x-terminal-10.9.0.5 bash -c "echo 10.9.0.6 > /home/seed/.rhosts"
```

=== 1.2 连通性测试
在实施攻击前，需确保合法的信任路径通畅。执行以下验证命令：
```bash
docker exec trusted-server-10.9.0.6 bash -c "su seed -c 'rsh 10.9.0.5 date'"
```
#figure(
  image("task1_trusted_verify.png", width: 85%),
  caption: [初始信任验证：信任服务器成功获取目标机日期],
)

=== 1.3 关键：静态 ARP 缓存注入
在真实攻击中，由于信任机已被静默，目标机在发送回包前会广播 ARP 请求查询其 MAC。如果无人响应，连接将由于物理层解析失败而中断。本实验通过设置静态 ARP 缓存来模拟攻击者在局域网内通过 ARP 欺骗（或利用目标机已有缓存）的情景：
```bash
docker exec x-terminal-10.9.0.5 arp -s 10.9.0.6 7a:2f:97:ea:52:7c
```
#figure(
  image("task1_arp_static.png", width: 85%),
  caption: [在目标机注入静态 ARP 记录，确保其数据包能正确发出],
)

== 任务 2：Mitnick 核心攻击实现

=== 2.1 多线程 Scapy 攻击逻辑
攻击脚本 `mitnick_final.py` 采用了多线程架构。主线程负责发送伪造的 SYN 包，嗅探线程则实时监控网桥上的回包。

核心交互逻辑分析：
- *Step 1*: 攻击者发送 `IP(src="10.9.0.6", dst="10.9.0.5")/TCP(sport=1023, dport=514, flags="S")`。
- *Step 2*: 目标机返回 SYN+ACK。攻击者通过嗅探获取其 `seq`。
- *Step 3*: 攻击者回复 ACK 完成主连接握手，随后立即发送包含 payload 的 PSH+ACK 包。
- *Step 4*: 目标机解析 payload 发现客户端要求反向连接 `1022` 端口，于是发起 SYN。攻击者回复相应的 SYN+ACK 完成第二次连接。

=== 2.2 运行攻击与日志分析
```bash
docker exec seed-attacker python3 /volumes/mitnick_final.py
```
#figure(
  image("task2_attack_execution.png", width: 90%),
  caption: [攻击脚本执行日志：清晰可见两次握手与数据注入过程],
)

*技术细节分析*：在运行脚本时，我们利用 `iptables` 规则阻断了宿主机内核自动发送的 RST 包。这是因为攻击者伪造了源 IP，宿主机内核收到针对该 IP 的回包时会认为是非法连接而尝试中断。通过 `iptables -t raw -A PREROUTING -p tcp --dport 1023 -j DROP` 解决了这一干扰。

== 任务 3：植入后门与权限持久化

=== 3.1 权限跨越：从单次利用到永久后门
攻击脚本注入的指令是 `echo + + > /home/seed/.rhosts`。这里的 `+ +` 含义极具破坏性：第一个 `+` 代表信任任何主机，第二个 `+` 代表信任任何用户。

```bash
docker exec x-terminal-10.9.0.5 cat /home/seed/.rhosts
```
#figure(
  image("task3_backdoor_success.png", width: 85%),
  caption: [攻击结果：.rhosts 文件已被成功篡改，系统防御彻底瓦解],
)

=== 3.2 最终效果验证
此时，攻击者已无需再进行任何复杂的序列号预测或 IP 欺骗，直接从本机 IP 即可访问目标：
```bash
docker exec seed-attacker timeout 5s rsh -l seed 10.9.0.5 date
```
#figure(
  image("task3_final_access.png", width: 90%),
  caption: [攻击闭环：攻击者获得持久化的无密码远程执行权限],
)

= 实验总结

本次 Mitnick 攻击复现实验是一次跨越协议栈多层的综合演练。通过对该经典案例的研究，可以得出以下结论：

1.  *协议安全的脆弱性*：TCP 协议早期的 ISN 生成算法缺乏随机性，是整个攻击链条的阿基里斯之踵。虽然现代操作系统已引入加密强度的随机 ISN，但这种“基于预测的攻击”思路在应用层协议中依然屡见不鲜。
2.  *信任链条的连锁反应*：IP 地址不应被视为身份认证的唯一凭证。rsh 这种基于 IP 信任的设计在面对 IP 欺骗时毫无抵抗力。
3.  *环境干扰的解决能力*：实验过程中发现宿主机内核的 RST 响应会破坏欺骗连接，通过 `iptables` 进行策略性拦截是网络攻防实验中的常用技巧。
4.  *纵深防御的重要性*：单点的安全防护（如仅仅保证 ISN 随机）是不够的，必须结合防火墙、加密协议（SSH 替代 rsh）以及严格的访问控制列表（ACL）才能构建稳固的防御体系。

通过本次实验，我不仅掌握了 Scapy 这一利器的使用，更对网络协议的精妙与风险有了从理论到实践的深刻认识。
