#import "labtemplate.typ": *
#show: nudtlabpaper.with(title: "TCP 攻击实验",
  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)
    #set text(font: hei)
    #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()

= 实验目的
#para[
  TCP 协议是互联网的核心协议之一，其三次握手和连接管理机制虽然保证了传输的可靠性，但也引入了一些潜在的安全漏洞。本次实验旨在通过亲身实践，深入理解 TCP 协议的常见攻击方式及其背后的技术原理。具体目标包括：
]
- 理解 TCP SYN 泛洪（SYN Flood）攻击的原理，掌握使用 Scapy 和 C 语言实现该攻击的方法，并验证 SYN Cookies 防御机制的有效性。
- 掌握 TCP 重置（Reset）攻击的技术细节，学习如何通过伪造 RST 包来强制中断已建立的 TCP 连接。
- 实践 TCP 会话劫持（Session Hijacking）技术，理解如何通过监听和预测序列号在现有会话中注入恶意指令。
- 掌握利用会话劫持创建反向 Shell（Reverse Shell）的方法，理解该技术在实际渗透测试中的重要作用。
- 学习使用 libpcap 库和原始套接字（Raw Socket）在 C 语言中实现底层的数据包嗅探与伪造。

= 实验原理
== TCP 三次握手与 SYN 泛洪
#para[
  TCP 建立连接需要三次握手：客户端发送 SYN，服务器回复 SYN+ACK 并分配资源进入半连接（SYN-RECV）状态，最后客户端回复 ACK。SYN 泛洪攻击通过发送大量的 SYN 请求但不完成最后一步，使服务器的半连接队列（Backlog Queue）被占满，从而拒绝合法用户的连接请求。
]

== TCP 重置与会话劫持
#para[
  TCP 协议允许通过发送 RST 标志位的数据包来立即终止异常连接。如果攻击者能够获取或预测当前连接的端口号和序列号，就可以伪造一个 RST 包发送给其中一方，导致连接被强制断开。
]
#para[
  会话劫持则更进一步，攻击者不仅要断开连接，而是要在序列号步调一致的情况下注入自己的数据。通过伪造源地址和正确的序列号，接收方会认为这些数据来自合法的对端，从而执行注入的指令。
]

== 反向 Shell
#para[
  反向 Shell 是指被攻击者主动连接攻击者的监听端口，并将自己的 Shell（如 `/bin/bash`）的输入输出重定向到该连接上。这种方式常用于突破防火墙的入站限制。

= 实验环境
#align(center)[#table(
  columns: (auto, auto, auto),
  rows:(2em, 2em, 2em),
  inset: 10pt,
  align: horizon+center,
  table.header([*主机角色*], [*IP地址*], [*说明*]),
  "Attacker（攻击者）", "10.9.0.1 (host)", "运行攻击脚本，具有混杂模式权限",
  "Victim (受害者)", "10.9.0.5", "运行 telnet 服务的目标服务器",
  "User1 (合法用户)", "10.9.0.6", "实验中用于建立正常连接的主机",
)]

= 实验步骤及结果

== 任务集 1：SYN 泛洪攻击

=== 任务 1.1：使用 Python 发起攻击
#para[
  使用 Scapy 编写 `synflood.py`，循环发送随机源 IP、随机源端口的 SYN 包到受害者 10.9.0.5 的 23 端口。
]
#figure(
  caption: [请在此插入截图：展示运行 synflood.py 期间，Victim 上的 netstat -tna 输出，可见大量 SYN_RECV 状态],
)

=== 任务 1.2：使用 C 语言发起攻击
#para[
  C 语言实现相比 Python 具有更高的发包效率。通过静态编译并在攻击者容器中运行，可以观察到半连接队列被迅速填满。
]
#figure(
  caption: [请在此插入截图：展示 C 语言攻击下，Victim 的半连接队列几乎瞬间达到上限],
)

=== 任务 1.3：启用 SYN Cookie 防御
#para[
  通过 `sysctl -w net.ipv4.tcp_syncookies=1` 启用防御机制后，即使在攻击持续期间，合法用户仍能通过 telnet 成功登录。
]

== 任务 2：TCP 重置攻击
#para[
  编写 `reset_attack.py` 监听 User1 到 Victim 的流量，捕获到包后立即提取序列号并构造 RST 包发回 Victim。
]
#figure(
  caption: [请在此插入截图：User1 的 telnet 窗口显示 "Connection closed by foreign host"],
)

== 任务 3：TCP 会话劫持
#para[
  在会话劫持中，我们注入了 `touch /tmp/hijack_successful` 指令。
]
#figure(
  caption: [请在此插入截图：在 Victim 容器中查看 /tmp/hijack_successful 文件已成功创建],
)

== 任务 4：创建反向 Shell
#para[
  通过劫持 telnet 会话注入反向 Shell 指令，使 Victim 连接到攻击者的 nc 监听端口。
]
#figure(
  caption: [请在此插入截图：攻击者的 nc 窗口成功获得 Victim 的交互式 Shell 提示符],
)

== 任务集 2：基于 C 的嗅探与伪造
#para[
  本部分使用 libpcap 实现嗅探器，并使用 Raw Socket 实现伪造器。
]

=== 任务 2.1A：理解嗅探器工作原理
#para[
  *问题 1：必不可少的库调用序列*
  1. `pcap_open_live()`: 打开指定的网络接口进行捕获。
  2. `pcap_compile()`: 将字符串形式的过滤表达式编译为 BPF 程序。
  3. `pcap_setfilter()`: 将编译好的过滤器安装到捕获句柄。
  4. `pcap_loop()`: 进入捕获循环，对每个包调用回调函数。

  *问题 2：为何需要 Root 权限？*
  嗅探程序需要创建原始套接字并开启网卡的混杂模式，这些操作涉及到对硬件和底层网络栈的直接控制，为了安全起见，操作系统仅允许特权用户（Root）执行。如果非特权用户运行，`pcap_open_live()` 将返回权限错误。

  *问题 3：混杂模式（Promiscuous Mode）*
  在实验中，将 `pcap_open_live()` 的第三个参数设为 1 开启混杂模式，0 则关闭。开启后，攻击者可以捕获到局域网内任意两台主机（如 User1 和 Victim）之间的通信；关闭后，仅能捕获到发往本机或广播地址的流量。

=== 任务 2.2：基于 Raw Socket 的伪造
#figure(
  caption: [请在此插入截图：C 语言嗅探器成功捕获到由 spoofer.c 发出的伪造 ICMP 包],
)

= 实验总结
#para[
  本次实验全面覆盖了 TCP 协议层的经典攻击。通过 SYN 泛洪，我深刻理解了 TCP 资源管理中的脆弱性；通过重置攻击和会话劫持，我认识到 TCP 序列号在安全验证中的局限性。C 语言底层编程的实践则让我对网络协议栈的二进制结构有了更直观的把握。
]
