《信息安全工程》实验内容
《信息安全工程》实验内容
来源:《信息安全工程》钟计东老师 课件
2024-05-09 ~ 06-07@Seymour
前置内容
前置内容有录制视频 虚拟机-前置内容
安装XP
-
原PPT全文都挺干货的,请直接看PPT:02-IS-VM.pdf | 下载 - 文本类
-
下面摘要一些可能的知识点(不是必做实验)
网段
- VMWare 支持多个网段
- 每个网段相当于一个广播型的以太网络(Ethernet)
网段连接模式
-
VM网段设置有几种模式
- 桥接模式
- NAT模式
- 仅主机模式 host-only
- LAN模式
-
区别主要在于和外部网络的连接方式,
桥接模式和NAT模式可以访问外部网络,而后两种不能。
-
LAN访问不提供DHCP服务,提供更多网段
- 网段设置:在 VMware 的封面上方工具栏 | 编辑 | 虚拟网络编辑器
- 虚拟机网络设置:右键虚拟机 | 设置 | 网络适配器 | 自定义 | 选择网段
注:更换网络连接方式时,可以打开本地连接设置查看连接状态,发现“无效IP地址“可以点击修复,会清除缓存。
桥接模式
-
将主机和虚拟机放在主机所在的物理网络,虚拟机需要独立的IP地址。
-
桥接模式下
各个虚拟机都选择VMnet0
-
各个虚拟机都可以互相 ping 通
-
也都能和物理机互相 ping 通
-
虚拟机都能正常接通外部网络(可以使用浏览器上网)
-
NAT模式
-
虚拟主机通过内部地址映射成主机所具有的外部网络地址。
-
NAT模式下
-
网段设置
设置VMnet2 (WMFusion中进行偏好设置)
网关 IP:192.168.142.2
子网 IP:192.168.142.0/255.255.255.0
去掉DHCP
去掉将主机适配器添加到此网络,表示主机不连接在142网段
-
各虚拟机设置
网络适配器:选择vmnet2
修改网络连接的属性,设置相应的IP地址,网关地址和DNS地址
-
一台虚拟机:
IP:192.168.142.11, gateway:192.168.142.2, DNS:192.168.142.2
-
另一台虚拟机:
IP:192.168.142.111, gateway:192.168.142.2, DNS:192.168.142.2
-
下面我的实验采用 VMnet8
- 各个虚拟机可以互通 ping
- 虚拟机可以ping 通 物理主机(网关)
- 物理主机不能 ping 虚拟机
- 虚拟机可以连接到外部网络(可以浏览器上网)
-
仅主机模式 Host-only
- 虚拟机无法接通外部网络。(与物理主机不接通)
LAN模式(局域网)
- 虚拟机无法接通外部网络。(与物理主机不接通)
- 而且没有DHCP服务(DHCP:动态主机地址分配服务)
我的配置备注
- WinXP
1 | Win XP Ghost 正在使用: |
- 服务器 server1
1 | IP: 192.168.142.200 |
- RouterOS
1 | RouterOS 正在使用: |
开始实验
1 网络构建
(PPT-02)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 路由器:
接口MAC
interface ethernet
接口IP
ip address
add
路由
ip route
add
防火墙
ip firewall
添加NAT
ip firewall nat
add chain=srcnat out-interface=向外走的接口 action=masquerade
注:TTL的值在每次经过一站都会减一。若为0,则丢弃。
2 配置HTTP/FTP服务
(PPT-02)
- Win Server
3 ARP 欺骗
(PPT-07)
wireShark 过滤:
1 ip.addr == 192.168.142.11 or arp or icmp
3.0 理论知识
-
ARP
地址解析协议,(Address Resolution Protocol,RFC826),负责完成逻辑地址向物理地址的动态映射,将32位逻辑地址(IP地址)转化为48位物理地址(MAC地址)。
-
ARP 流程
查看arp缓存 – 本网络?发ARP请求 — 非本网络?发ICMP给下一跳路由器处理
-
判断是否本网络?(网段、子网掩码的设置)
- 本网络内:主机发ARP请求(广播)直接询问所求ip的MAC地址
- 非本网络:主机发ICMP请求给网关,由网关去做。(这里网关的MAC也需要ARP请求得到,一般肯定设置时就ARP请求过了,所以就不必再发ARP请求询问MAC地址了)
-
若没有设置网关?
非本网络的ARP请求会因为没有网关而发不出去。
-
- ARP高速缓存
-
静态表项:永不过期的表项
人工,也更加安全
-
动态表项:有生命期的表项
通过ARP协议学习
1 | // 显示地址映射表项,[ ]为可选项 |
-
A 使用 Xcap 构造 ARP广播寻找 B
(A/B/C 均同网段下) 然后各自查看
arp -a
- A:没有 B 的mac(因为不是系统发的,是Xcap 发的,不会被记录下来)
- B:有 A 的 mac (因为收到 A 的ARP请求,会记录)
- C:没有 A/B 的 mac (因为虽然广播,但是不是C的包,会被丢弃不处理)
-
直接添加 静态 arp
arp -s IP MAC
更安全
-
代理ARP
如果 ARP 请求是从一个网络的主机A发往另一个网络上的主机B,如果连接A的路由器知道如何去往B,那么它就可以回答该请求,此过程称作代理ARP (Proxy ARP)。这样对发起 ARP 请求的发送端是透明的,使它误以为路由器就是B,而路由器的实际功能相当于B的代理,负责把IP数据包转发到B。
-
代理ARP可用来产生划分子网的效应。
-
代理ARP可以代表一组主机的ARP。
-
优点:
- 主机可以不用配置默认网关
- 子网的变化对主机是透明的
-
缺点:
- 增加了某一网段上ARP流量
- 需要更大的ARP 表来处理IP地址到MAC地址的映射
- 安全问题,比如ARP欺骗
-
-
免费ARP
免费 ARP (gratuitous ARP)是指主机发送ARP查找自己的MAC地址,但实际只是一种广而告之。
通常,它发生在系统引导期间进行接口配置或更改IP地址的时候。
- 特点:
- 报文中携带的源IP和目的IP地址都是本机地址
- 报文源MAC地址是本机MAC地址。目的MAC地址为全0
- 作用:
- 查找相同IP地址
- 更新ARP缓存
- 恶作剧:将对方的IP拿来构建的免费ARP包不停地发送,每两秒一次。对方不断提示IP地址冲突。
- 特点:
-
ARP欺骗
“ ARP 欺骗”系列病毒自 06 年出现以来,一直难以根除。一旦感染此病毒,就会在局域网内发起攻击,导致其他用户不能上网,危害严重。电脑中毒后会向同网段内所有计算机发ARP欺骗包,导致网络内其它电脑因网关物理地址被更改而无法正常上网,被欺骗电脑的典型症状是刚开机能上网,几分钟之后断网,过一会又能上网,或者重启一遍电脑就可以上网,一会又不好了,如此不断重复,影响正常使用。
- ARP 欺骗关键:缺乏身份认证,可以伪造MAC地址
- ARP请求中的MAC地址伪造
- ARP应答中的MAC地址伪造
- ARP 欺骗关键:缺乏身份认证,可以伪造MAC地址
3.1 Lab 欺骗主机
-
使 B 无法 PING C
-
A构造ARP请求
1
2
3
4
5
6
7
8
9MAC层
目的MAC:FF:FF:FF:FF:FF:FF
源MAC:MAC-A
ARP:
源MAC: MAC-A
源IP: IP-C
目的MAC: 00:00:00:00:00:00
目的IP: IP-B实际上是A发的请求,但是在源IP处写了 IP-C ,这导致B收到时,把 IP-C 解析的 MAC 记作了 MAC-A。
-
B 去 ping C
B 去ping C时,会发现 arp 缓存里有,就会按照这个错误的缓存来请求了,自然就请求不到数据。
最终,Request timed out.请求超时。
(可以 arp -a查看一下 B缓存的 IP-MAC对应关系,会发现 IP-C对应到MAC-A了)
-
恢复
B 可以 arp -d 清除缓存,就抹去了错误信息。或者稍等一会,动态缓存会自动消失。
再 ping C 就会正常了。(因为会重新发 arp请求询问 C 的mac,这时 C 会应答)
-
-
使 B 无法访问外网
-
A构造ARP请求
1
2
3
4
5
6
7
8
9MAC层
目的MAC:FF:FF:FF:FF:FF:FF
源MAC:MAC-A
ARP:
源MAC: MAC-A
源IP: IP-R1
目的MAC: 00:00:00:00:00:00
目的IP: IP-B在源IP处写了 IP-R1 ,这导致B收到时,把 网关路由器R1- IP 解析的 MAC 记作了 MAC-A。
-
B 去 ping baidu.com
B 去ping baidu.com时,会需要网关R1。
向R1发数据,这时会发现 arp 缓存里有R1的MAC地址,就会按照这个错误的地址来请求了,自然就请求不到数据。
最终,could not find host找不到主机(因为在域名解析时就找不到网关R1)。
(可以 arp -a查看一下 B缓存的 IP-MAC对应关系,会发现 IP-R1 对应到 MAC-A了)
-
恢复
B 可以 arp -d 清除缓存,就抹去了错误信息。或者稍等一会,动态缓存会自动消失。
再 ping baidu.com ,就会发现可以收到 Reply.
-
3.2 Lab 欺骗网关
-
使D 无法 PING 通 B
-
A构造ARP请求
1
2
3
4
5
6
7
8
9MAC层
目的MAC:FF:FF:FF:FF:FF:FF
源MAC:MAC-A
ARP:
源MAC: MAC-A
源IP: IP-B
目的MAC: 00:00:00:00:00:00
目的IP: IP-D导致 网关路由器R1 收到时,把 IP-B 对应 MAC-A 记录下来。
-
D 去 ping B
B 去ping baidu.com时,会需要网关R1。
向R1发数据,R1正常收到了。
但是,这时R1会发现 arp 缓存里有 IP-B 的MAC地址,就会按照这个错误的MAC-A来请求了,自然就请求不到数据。
最终,Request timed out.请求超时。
(可以在路由器R1的 ip arp 下 print 查看是否 IP-B 对应着 MAC-A)
-
恢复
这时,是网关路由器 R1被欺骗,因此,需要 R1把 IP-B 对应的MAC 由 MAC-A改为 MAC-B。
其实不用动,路由器很快会发现是错误的,立马重新发 arp 请求寻找正确的 MAC-B。
这也就是为什么,你会发现前面 D ping B ,虽然前两次 请求超时,但是后面就会正确。
-
3.3 Lab 应答欺骗
-
伪造应答
-
A清除数据并 ping B
在 cmd 下
arp -d
清除缓存,然后ping IP-B
发现能够正常收到 B 回应。
-
C 伪造 ARP 应答
1
2
3
4
5
6
7
8
9MAC层
目的MAC:MAC-A
源MAC:MAC-C
ARP:
源MAC: MAC-C
源IP: IP-B
目的MAC: MAC-A
目的IP: IP-A应答时,单播(从 C 到 A ),为了欺骗,发ARP请求时,写上自己是 IP-B (源IP)。
-
A 再 ping B
由于A刚刚收到 C 发来的假冒 B 的arp响应,会更新缓存记录
IP-B 对应 MAC-C
那么再次 ping 时,也是发现有 arp 缓存有 IP-B的 MAC,那么就会把 MAC-C 贴上,发请求。
自然是收不到的 Request timed out. 请求超时。
-
提问:这里两次ping都是必须的吗?
实际上不是的。
提问:哪次是必须的?
第一次。
很意外吧?实际上是因为,若是只有第二次ping,那么在第二次ping前收到的reply是一个莫名其妙的reply,因为这个reply告知的IP,我们(A)并没有记录过,自然也不需要更新,采取的策略是“不处理”,因此不会记录下这个欺骗的报文。
只有当前面我们(A)自主ping过B,才会把B记录在ARP缓存里,之后收到欺骗,才会发现“哦,现在IP-B的MAC变了,那我更新一下ARP缓存”,这样子就被欺骗了。
(问:那是不是A按理说不更新更好?不是的,最初这样子设计的是因为有时候的确就是会发生变化,这是正确的做法,只是被有心人利用了)
4 路由记录
PPT-09
4.0 理论知识
-
IP选项
IP数据报选项字段是可选的,主要用于网络测试和调试
- 记录数据报经过的路由
- 记录数据报经过的路由和时间
- 源端指定必须经过的路由
- 路径MTU发现
在一个数据报中可以有多个选项,这些选项是连续出现的。
每个选项的长度取决于选项的类型,并且格式都不相同。
每个选项可以有三个部分组成:- 代码1个字节
- 长度1个字节(可选,由代码决定)
- 数据部分(可选,由代码决定)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[code字段选项(1字节)]
End of options list (code = 0) 只能用于所有选项后,指示选项已经结束
0 00 00000
No Operation (code = 1) 用于选项之间,用于将下一个选项起始字节对齐到4字节的倍数
0 00 00001
Record route (code = 7) 记录数据包在传输过程中所经过的路由器
0 00 00111
Source and Record Route (code = 0x83) 松散源路由
1 00 00011
Strict Source and Record Route (code = 0x89) 严格源路由
1 00 01001 -
Record route (code = 7)
- 路由器在转发过程中如果发现此选项,那么将其IP地址(转发端口所在的地址)拷贝到IP列表的最后(由POINTER指示),并且将POINTER增加4。
- 如果POINTER > length(已满),路由器只转发不记录路由;(可以发送ICMP Parameter,实际不发送,因为发送导致DOS攻击)
- 如果还有空间但不足,路由器认为报文出错而丢弃;这种情况下,路由器可以发送给源端发送 ICMP Parameter。
-
实验1
1
2
3
4
5
6
7
8
9
10
11
12
13Record route:实验1
目的:理解记录路由选项
主机:IP-A=192.168.142.11, IP- B=192.168.134.11, C = 192.168.140.11
设置:网络拓扑图(IS-VM.ppt)
操作:A发送数据到B
A:打开wireshark, filter: ip.addr == IP-A
B: 打开wireshark, filter: ip.addr == IP-A
C:打开wireshark, filter: ip.addr == IP-A
A: ping -r 8 192.168.134.11
A:查看发出的ICMP Request的记录路由选项的指针和IP列表
B: 查看记录的IP列表
C:查看记录的IP列表结果:
-
A:发出去的流量包中的 record route 为8个 0.0.0.0
-
B:同 A
-
C:流量包中的 Record Route 有三条记录,如下:
-
A:收到回复,Record Route 会有五条记录,如下:
-
-
实验2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Record route:实验2
目的:理解记录路由选项
主机:IP-A=192.168.142.11, IP- B=192.168.134.11, C = 192.168.140.11
设置:网络拓扑图(IS-VM.ppt)
操作:A发送数据到B,
A:打开wireshark, filter: ip.addr == IP-A
B:打开wireshark, filter: ip.addr == IP-A
C:打开wireshark, filter: ip.addr == IP-A
Router3: 将其位于134网段的接口MTU设置为420
A: 构建并发送一个Ping请求包去记录A到B之间的路径,数据部分为1000个字节
A:查看记录的IP列表
B:查看各个碎片的选项部分
C:查看记录的IP列表
A:将数据包pointer改成5并且只留两个IP地址列表,查看发送和接收情况结果:
略
-
分片
如果,我们要求R3 - 140网段是 MTU 为420。
先进入
ip address
查看print,找到 140网段的接口是ether2
。再进入
interface
设置set ether2 mtu=420
。最后查看是不是正确了,
interface ethernet
进行print查看,如下:若是 A 发的请求,中途即便是因为R3分片了,也会在R3收集好再发出来。
因此对A来说,分片是透明的,只看到一个请求、一个响应。
4.1 Lab 构建 ping 包记录
-
构建 ping 包,设置 Record Route
-
构建 Record Route 的 ICMP 包
1
2
3
4
5
6
7
8
9MAC层:
目的MAC:A的出口路由器对应接口的MAC
源MAC:MAC-A
IP层:
源IP:IP-A
目的IP:IP-B
类型:ICMP
Options:添加(7, Record Route),设置8个0.0.0.0在Address list中设置好了之后,发送。
(注:MAC层的目的MAC是 直接下一跳的MAC,不是最终目的MAC)
-
在B查看 Request
会看到 三条记录(R1-R3-B)。
-
在 A 查看 Reply
会看到 五条记录(R1-R3-B-R3-R1)。
如何控制经过R1还是R3?
答:设置好A的网关是R1还是R3即可。
-
-
解释 IP记录
根据网络拓扑解释即可。
最初主机A找到网关路由器(记录IP),网关路由器再走去下一个路由器(记录IP),路由器发现在直连网段下,因此直接发送到主机上。
主机B接收到,进行 Relpy 回复(回复时,继续加上自己的IP),再往回送(同样,两次记录路由器IP),到达主机A。
5 严格源路由
PPT-09
5.0 理论知识
-
源路由选项
-
本选项由于安全原因,路由器可能不支持。
-
用于规定数据包经过的路径,有两种方式:
-
严格源路由
包含一个IP地址序列,该序列指出了到达目的地的完整路径。
数据报必须沿着IP地址序列传输,路由器只是将数据包转发到指定的下一个IP地址,而不进行路由(下一个IP地址必须直接可达)。
-
松散源路由
包含一个IP地址序列,该序列指出了到达目的地的部分路径。
数据报必须沿着IP地址序列传输,但是允许表中相继两个地址之间相隔多个路由器或物理网络。
-
-
由于还同时记录经过的路径(记录路由),
所以它通常称为source and record route( SRR)和 strict source and record route( SSRR)。
-
记录路由方式和记录路由选项相似。
-
-
发送方的处理过程
-
假设主机A到B的路径为
A-X1-X2-X3-B
-
虽然A的目的地为B,但Destination IP一定要填下一站的地址,而非IP-B
-
将其他下一站地址依次填入选项数据内,最后一个IP地址为IP-B
-
严格源路由:下一站地址必须是直接可以到达。
例如,X2 必须是从 X1 直接能够到达,而不必再经过其他路由器。
-
松散源路由:下一站地址不必直接可以到达。
例如,X2 可以是从 X1 经过其他路由器间接到达。
-
-
-
转发或接收时的处理过程
-
主机A到B的路径为
A-X1-X2-X3-B
-
当接收到数据时, 检查 pointer < length 是否成立:
-
pointer >= length
IP地址序列已经用完,说明本站是最后一站(接受方),将数据交给上层协议
-
pointer < length
需要转发数据,将IP层的 Destination IP 换成 pointer 所对应的IP (即数据的下一站),将pointer所对应的IP换成转发时使用的接口IP,
pointer = pointer + 4
。
-
-
5.1 Lab 严格源路由
-
前提:
-
一般是默认不接收源路由记录的,因此需要手动开启 accept-source-route 。
登陆路由器,进入
ip settings
可以print看一下,第三行是accept-source-route
默认是no
设置开启:
set accept-source-route=yes
重启路由器:
system reboot
-
主机一般是不响应的,因此我们的最终目的IP 是路由器端口IP ,而不是主机IP。
-
为什么主机和路由器一般都不支持?
由下面实验可知源路由会造成流量放大效应,因此可以引起DOS攻击(消耗带宽和CPU)。
-
-
实验过程
1
2A=192.168.142.11, B = 192.168.140.99(路由器端口,winxp主机可能不响应)
A到B的路径为A-R1-R3-R4-R2-R1-R3-R4-R2-R1-B-
A 构建 严格源路由的ICMP 请求包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18MAC层:
目的MAC: R1对应142网段的接口MAC
源MAC: MAC-A
IP层:
源IP:IP-A
目的IP:R1对应142网段的IP(142.100)
类型:ICMP
Options:设置 (9, Strict Source Route),在 Address list 添加如下:
192.168.140.99
192.168.134.99
192.168.136.100
192.168.138.100
192.168.140.99
192.168.134.99
192.168.136.100
192.168.138.100
192.168.140.99构建好了之后,发送即可。
下面开始查看各自主机的wireshark监控流量情况。
-
A:一条请求、一条响应
可以看到请求的 IP 层 options 下的 Strict Source Route。
(当前 dst-IP 是 R1,next 是 R3)
-
140网段下的主机:三条请求、三条响应
由于会三次经过 140 网段,因此会发现有三条请求和响应。
可以打开看一下参数:
第一个:next 指向 第一个 134.99 (当前dst-IP为140.99)
第二个:next 指向 第二个 134.99 (当前dst-IP为140.99)
第三个:Pointer=40 大于 Length=39,next 没有指向 (当前dst-IP为140.99,最后一个了,已经填入 dst-IP )
-
136网段下的主机:两条请求、两条响应
同理,只不过 136 网段是经过两次,因此有两条请求和响应。
分析和前面一样。
-
6 ICMP 重定向
PPT-10
6.0 理论知识
-
ICMP报文分类
- 差错报文
- 回送 请求和应答
- 时间戳 请求和应答
- 地址掩码 请求和应答
- 路由器 询问和通告
- 查询
- 目标不可达
- 源点抑制
- 时间超时
- 参数问题
- 改变路由
- 差错报文
-
ICMP报文
ICMP报文特点
-
报告差错:
ICMP差错报文最根本的功能是反馈数据通信过程中遇到的问题,并非使IP传输更加可靠。
-
非必需:
即使数据在传输过程遇到问题,也可能不发送差错报文。
-
为防止报文的反复发送,不会对ICMP差错报文发送ICMP报文,但ICMP查询报文可能再次产生ICMP报文。
-
- 代码:提供相关报文类型的进一步信息
- 校验和:提供整个ICMP报文的校验和
- 数据:
- 差错报文:包括出错IP数据包头部及该数据包前8个字节的数据,前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及发送序号(对于TCP)
-
ICMP查询报文
-
回送请求与应答
ICMP回送请求与应答报文(ICMP Echo Request and Reply)目的:测试目的设备是否可以到达。
RFC1122要求每台设备必须响应ICMP回送请求,但可能考虑到安全因素,设备可能不会响应
-
应答报文中的数据和请求报文中的数据一致。
-
标识符和序号用于将收到的应答和发出的请求相匹配。
标识符可以像TCP端口一样使用,而序列号每发出一次请求增加1。
应答时使用和请求报文中相同的标示符和序列号。
实际中,
-
Linux每个PING进程使用不同的标示符,而序列号每次增加1。
-
WINDOWS使用一样的标识符(版本之间可能有所区别),序列号在重启时重置。
从PING数据可以从一定程度上推测发送方的操作系统。
-
-
-
实验1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36回送请求与应答:实验
目的:理解回应请求与应答报文
设置:[winxp A=192.168.142.11] [win server2003 B:192.168.142.111] [RouterOS R1: 192.168.142.100]
A:ping B
A: wireshark查看PING发出的ICMP Echo request and 收到的reply报文
特别是标识符是否一样(Identifier均为2)
序列号增加(Sequence number依次增加)
数据为abcd..... (Data内容)
应答与请求标识符、序列号和数据一致
A:PING B
A: wireshark查看和前一次PING发出的请求中的标识符是否一致
A: ping R1
A: wireshark查看PING发出的ICMP Echo request and 收到的reply报文
特别是标识符是否一样
序列号增加
数据为abcd..... n 应答与请求标识符、序列号和数据一致
R1: ping A
A: wireshark查看PING发出的ICMP Echo request and 收到的reply报文
标识符是否一样(Identifier不一样)
序列号增加(Sequence Number 增加)
数据本身没有规律
应答与请求标识符、序列号和数据一致
R1: ping A
A: wireshark查看和前一次PING发出的请求中的标识符是否一致
R1: ping A
R1: ping A
A: wireshark比较两次PING中发出的ICMP Echo request and reply报文
(标识符、序列号如何变化,不同PING之间数据也有一定规律)
从PING数据可以从一定程度上推测发送方的操作系统 -
时间戳请求与应答
-
标识和序列号用来关联响应与请求
- ST: 源时间戳(Originate timestamp)为请求方在请求发送之时的时间(源主机填)
- RR: 接收时间戳(Receive timestamp)为收到请求时的时间(目的主机填)
- RT: 传送时间戳(Transit timestamp)为接收方发回时间戳响应时的时间(目的主机填)
- SR: 源主机接收时间
时间均为格林威治标准时间。
1
2
3发送时间 = RR - ST
接收时间 = SR - RT
往返时间 = 发送时间 + 接收时间 = RR - ST +SR - RT = (SR- ST) - (RT - RR)注意:
只有当源点和终点的机器中的时钟同步,发送时间和接收时间的计算才能准确。
但是,即使两个时钟没有同步,往返时间的计算还是准确的。
1
2
3
4
5将设发送方时钟偏移x,接收方偏移为y。
往返时间
= 往所需时间 + 返所需时间
= (RR + y) - (ST + x) + (SR + x) - (RT + y)
= (SR - ST) - (RT - RR)
-
6.0.1 差错报文1-目的不可达
-
RFC规范用语
- MAY:可以(实现RFC规范时可以自由选择)
- SHOULD (SHOULD NOT):应该(强烈建议)
- MUST (MUST NOT):必需(必须实现)
-
目的
通知发送方目的地不可到达
-
终点不可达
分为:
- 网络不可达
- 主机不可达
- 协议不可达
- 端口不可达
- 需要分片
由code决定,当然code包含更多其他的错误。
-
Next-Hop MTU (RFC 1191)
-
和code = 4一起使用。
-
当路由器发现数据包的大小大于下一跳网络的MTU时,而且原始数据包不允许分片(DF置位)时, 路由器必须(MUST)发送一个ICMP差错报文,通知发送方需要允许分片,并且指出了NEXT- HOP的MTU。
-
-
网络不可到达(RFC 1812)
如果路由器无法找到去往目的网络的路由(包括默认路由),那么路由器必须(MUST)发送一个网络不可到达的ICMP差错报文。
1
2
3
4
5
6
7
8
9
10
11
12
13
14网络不可到达:实验
目的:理解终点不可到达/网络不可到达
设置:A发送数据到B,IP- A=192.168.142.11, IP-B=192.168.136.11
R1: disable其中去往B网络的路由
A:打开wireshark, filter:icmp
B: 打开wireshark, filter: ip.addr == IP-A
A:构建并发送一个去往B的ICMP Echo Request包(可以标注一下Sequence Number的DE/LE,用来后面识别)
A:查看ICMP差错报文:code = Network Unreachable, 发送方IP
会发现:
type: 3 (unreachable)
code: 0 (network unreachable)
还会发现 ICMP 里面夹杂着 ICMP(因为会把出错数据包复制过来,可以看看里面的DE/LE是不是前面设置的) -
主机不可到达 RFC 1812
如果路由器(通常最后一个路由器)无法将数据包转发到位于直连网络上的目的主机,那么路由器必须(MUST)发送一个主机不可到达的ICMP差错报文。
- 原因可能有:目的主机不存在、目的主机不响应ARP请求。
1
2
3
4
5
6
7
8
9主机不可到达:实验
目的:理解终点不可到达/主机不可到达
设置:A=192.168.142.11,B=192.168.136.11
A:打开wireshark, filter:icmp
B: 打开wireshark, filter: icmp or arp
A:构造一个PING请求发送给192.168.136.12
A:查看ICMP差错报文:code = Host Unreachable, 发送方IP
C: 查看ARP请求,无响应 -
协议不可到达
主机在以下情况下发送协议不可到达ICMP:
- RFC792:主机没有相应的协议处理模块,主机可以(MAY)发送协议不可到达消息
- RFC1122:主机应该( SHOULD)发送协议不可到达消息。
1
2
3
4
5
6
7
8协议不可到达:实验
目的:终点不可到达/协议不可到达
设置:A发送数据到B,IP-A=192.168.142.11, IP-B=192.168.136.11
A: 打开wireshark, 选择合适的过滤器
B: 打开wireshark, 选择合适的过滤器
A: 构建并发送一个包,类型选custom自定义,其中IP.protocol = 0,包的设置如后图
A: 查看ICMP差错报文:type = 3, code = Protocol Unreachable,发送方IP问:有什么用?
可以用来探测对方主机是否存在。
因为对方可能不会响应PING请求,但是,使用一个未知协议,对方可能就会响应协议不可到达。对方只要是响应了,那就说明存在。( Protocol 扫描)
-
端口不可到达
-
主机在以下情况下发送端口不可到达ICMP:
-
RFC792
在主机相应端口没有开启的情况下,主机可以(MAY)发送端口不可到达消息
-
RFC1122
在主机无法将数据上传 (demultiplex) 到相应的端口时并且没有其他机制来通知发送方时,主机应该( SHOULD)发送端口不可到达消息。
-
1
2
3
4
5
6
7
8端口不可到达:实验
目的:终点不可到达/端口不可到达
设置:A发送数据到B,IP- A=192.168.142.11, IP-B=192.168.136.11
A:打开wireshark, 选择合适的过滤器
B: 打开wireshark, 选择合适的过滤器
A:构建并发送一个包,其中IP.protocol = UDP, UDP.Destination Port = 11111,包的设置如后图
A:查看ICMP差错报文:type = 3, code = Protocol Unreachable,发送方IP -
-
需要分片
当路由器发现数据包的大小大于下一跳网络的MTU时,而且原始数据包不允许分片(DF)时,
路由器必须(MUST)发送一个ICMP不可到达的ICMP报文通知发送方,并且指出了NEXT-HOP的MTU
- 这个报文可以用于发现从源到接收端的最小MTU。
1
2
3
4
5
6
7
8
9需要分片:实验
目的:终点不可到达/需要分片
设置:A发送数据到B,IP- A=192.168.142.11, IP-B=192.168.136.11
A:打开wireshark, 选择合适的过滤器
B: 打开wireshark, 选择合适的过滤器
R1: 将路由器R1的138端口的MTU改为320
A:构建并发送一个ICMP Echo Request包,大小超过320, DF = 1
A:查看ICMP差错报文:发送方IP,type = 3, code,以及Next Hop
6.0.2 差错报文2-超时
-
超时(Time Exceeded)报文(可能)在以下两种情况下发送:
- 传输过程中TTL变为0
- 重组过程中超时
-
超时:实验
1
2
3
4
5
6
7目的:理解ICMP差错报文:超时
设置:A发送数据到B,IP- A=192.168.142.11, IP-B=192.168.136.11
A:打开wireshark, filter: icmp
B:打开wireshark, filter: ip.addr == IP-A
A:构建并发送一个包发送给B,其中TTL=2
A:查看ICMP差错报文:type = 11, code = 0,发送方IP- B收不到
- A收到一个超时报文
-
重组超时:实验
1
2
3
4
5
6
7
8
9
10
11
12目的:理解ICMP差错报文:超时
设置:A发送数据到B,IP- A=192.168.142.11, IP-B=192.168.136.11
A:打开wireshark, filter:ip.addr == IP-A
B: 打开wireshark, filter: ip.addr == IP-A
R1: 关闭NAT
A:构建并发送一个包发送给B(数据大于500),其中MF = 1, TTL=64
A:查看ICMP差错报文(需等待一段时间):type = 11, code = 1,发送方IP;
A:wireshark修改时间显示格式,比较ICMP请求和收到的ICMP差错报文时间间隔
A:XCAP修改构造的报文原地址,设置Action: Increase, Num: 1, Loop: 50,LOOP发送 , LIMIT:50
B:wireshark可以看到多个差错报文- B收到碎片,B会启动超时计时器,大概60s 超时后B发送超时报文
- A收到一个超时报文
MF=1
意为:后面还有碎片
6.0.3 重定向报文
-
ICMP Redirect重定向报文主要为了通知主机通过另一条(更优)的路径(新的网关由报文的Gateway IP Address指定)发送数据。
-
应由网关发送,主机不应发送。
-
报文格式
Code字段列出了重定向的原因:
-
前提
RFC792规定了ICMP Redirect报文发送的条件:
- 主机A、网关G1和G2三者位于同一网段,主机有数据发往网络N中的主机B
- 主机A的路由表中去往N的下一跳是G1
- G1通往N的下一跳为G2(实际上G1认为A应该选择G2,因为此路径更短)
- 主机A发送的报文中没有源路由选项
-
主机如何处理
-
RFC816
对主机的要求:
-
主机在收到 ICMP重定向消息后必须更新路由信息;
所有主机都必须随时接受和处理ICMP重定向消息。
-
路由信息的更新主要是路由缓存的更新(更新下一跳),
如果缓存路由表中没有目的地这一记录,增加一记录。
-
后续数据包通过新的网关发送。
-
主机对ICMP网络重定向的处理和对主机重定向的处理方式相同。
-
-
RFC1122
规定主机在收到 ICMP重定向消息后遇到以下情况应当(should)不处理:
-
A:新的网关和主机相关接口(收到ICMP的接口)不在同一网络上
原因:不在同一网络上表示不能直接到达
-
B:ICMP重定向报文发送者的地址不是(路由表中)去往相应目的地的一下跳地址
-
-
RFC1812
规定了路由器在满足以下情况下可以发送redirect报文,否则一定不能(must not)发送报文:
-
A:路由器(例子中的G1)的转发接口和接收接口一致
相当于报文沿原路返回
-
B:数据包中的源IP地址(例子中的IP-A)和路由器将要转发的下一跳地址(例子中的IP-G2)处于同一网络(意味着主机(例子中的A)和下一跳(例子中的G2)在同一网络)
意味着主机可以直接到达
-
C:数据包中不含源路由选项
-
-
RFC1812
如果路由器使用路由协议来获取路由信息,路由器不能(must not)使用重定向报文获悉的路由来转发数据
-
-
重定向:伪造报文要求
-
假设
-
主机A(待被欺骗)位于网络N1
-
G1和G2路由器位于网络N1
-
主机B位于网络N2
-
A中路由表中去往N2的下一跳为G1
-
-
C 如何冒充 G1 向 A 发送重定向报文,谎称去往目的 B 的网关应该为 G2?
-
伪造报文要求
-
-
重定向:实验1
1
2
3
4
5
6
7
8
9
10
11
12目的:理解重定向包在什么情况下发送
设置:A(192.168.140.11)向B(192.168.134.11)发送ICMP请求,A的默认网关为R1
A:ROUTE PRINT(确定去往B的路径)
A:打开Wireshark,filter:ICMP
R1:查看通往B的路由是否通过R3
A:PING B
A:查看Wireshark的ICMP REDIRECT包: type = redirect code = redirect for host, 和Gateway Address
A:wireshark可以看到在REDIRECT前的ICMP Echo request被捕获到两次(因为A→R1→R3),两次的TTL的区别;查看第一次ICMP请求的dst mac为R1路由器相应接口地址。)
A:wireshark可以看到在REDIRECT后的ICMP Echo request:dst mac 为R3相应接口地址
A:route print (查看是否多了一条去往B的路由)前后两次route print
可以发现 A 主机有一条
1
2dst mask gateway
192.168.134.11 255.255.255.255 192.168.140.99本来应该是A网关为 192.168.140.100,应该发给100,但是由于ping一次之后,会发现可以重定向到 99 更好。
因此,多了一条路由记录。
-
可以在wireshark看到有一个 ICMP 的 Redirect 包。(可以看到新的gateway,以及原始报文附录,方便知道哪个报文被重定向了)
-
同时可以看到两个请求
为什么?因为在这个网段是A->R1->R3,而A和R1都是同一个网段,他们的出发都会被这个网段下的主机收到,因此A两次看到同一个包(第一次是A自己发的,第二次是R1发的)
-
此后,若再次请求
就会按照route直接从A走向R3,而不需要走R1了。
-
route会老化,也可以自己删除
route delete
。 -
注:还可以使用
ping -r 8 192.168.134.11
来获取 ping 的路线查看
-
-
重定向:实验2
1
2
3
4
5
6
7
8
9目的:理解重定向包在什么情况下发送
设置:A=192.168.140.11 B=192.168.134.11
A:ROUTE PRINT(如果有去往B的路径,删除它)
A:打开Wireshark,filter:ICMP
R1:查看通往B的路由是否通过R3
A:构造一个从A到B的ICMP Echo Request,其中dst mac = R1相应接口地址;发送三次(ICMP序列号每次增加1);
A:Wireshark查看是否收到了ICMP REDIRECT包
A:route print (查看是否多了一条去往B的路由)-
发了三次,会产生三次重定向。打开Redirect 的 ICMP 包找到 gateway 是新的重定向网关,同时有附录原始报文。
-
在 route print 也可以看到多一条记录。
-
-
重定向:实验3
1
2
3
4
5
6
7
8
9目的:理解重定向包在什么情况下发送(重定向网关必须和源主机处于同一网路)
设置:A=192.168.140.11 B=192.168.134.11 C=192.168.138.11
A,C:ROUTE PRINT(如果有去往B的路径,删除它)
A, B, C:打开Wireshark,filter:ICMP
R1:查看通往B的路由是否通过R3
A:将前一个实验构造的包中的src ip改为 192.168.138.11;发送三次构造的包 ;
A,C:Wireshark查看是否收到了ICMP REDIRECT包(没有发生重定向)
A,C:route print (查看是否多了一条去往B的路由) -
重定向:实验4
1
2
3
4
5
6
7
8
9目的:理解重定向包在什么情况下发送(重定向网关必须和源主机处于同一网路)
设置:A=192.168.140.11 B=192.168.134.11 C=192.168.140.15
A,C:ROUTE PRINT(如果有去往B的路径,删除它)
A, B, C:打开Wireshark,filter:ICMP
R1:查看通往B的路由是否通过R3
A:将前一个实验构造的包中的src ip改为192.168.140.15;发送三次构造的包;
C:Wireshark查看是否收到了ICMP REDIRECT包
C:route print (查看是否多了一条去往B的路由)会产生重定向,多一条路由
-
重定向:实验5
1
2
3
4
5
6
7
8
9
10目的:理解主机在什么情况下被重定向(主机去往相应目的地的下一跳必须是重定包发送者)
设置:A=192.168.140.11 B=192.168.134.11 C=192.168.140.15
A,C:ROUTE PRINT
A, B, C:打开Wireshark,filter:ICMP
C: 将默认的网关设置为192.168.140.33
R1:查看通往B的路由是否通过R3
A:将前一个实验构造的包中的src ip依旧设置为192.168.140.15;发送三次构造的包;
C:Wireshark查看是否收到了ICMP REDIRECT包
C:route print (查看是否多了一条去往B的路由),重定向没有发生作用(由于C的去往B的下一跳不是R1)会收到重定向包,但是主机并不响应。
-
重定向:实验6
1
2
3
4
5
6
7
8目的:攻击同一网络内主机
设置:A(192.168.140.11)攻击同一网络内主机C(192.168.140.15),假设R1为C去往Z(192.168.136.11)的原始网关(伪造的网关为 R3=192.168.140.99)
C:route print(确定去往Z的原始路径)
C: ping -r 8 Z
A:构建一个ICMP Redirect包(可以用Wireshark 捕获的包为基础修改)
C:route print(增加了一条去往Z的路径)
C: ping -r 8 Z (比较和前一次PING的结果) -
重定向(RouterOS):实验7
1
2
3
4
5
6
7
8目的:攻击一台RouterOS
设置:routeos也接收重定向,不过需要将accept-redirects打开
R1:ip/settings/accept-redirects = yes
R1:system/reboot
发送一个欺骗包,使得去往192.168.134.11的下一跳改为192.168.140.33
/ping 192.168.134.11 无法PING通,WIRESHARK可以
看到R1的ARP 请求,请求192.168.140.33的MAC地址1
2
3
4
5
6
7
8
9
10
11MAC层
目的:140.100的MAC
IP层
源:192.168.140.99
目:192.168.140.100
ICMP层
附IPv4
源:192.168.140.100
目:192.168.134.11注意,成功欺骗,也可能在 route p 看不到(路由器的缓存看不到)。
但是,可以通过 ping 不通,知道成功欺骗。
路由器 ping 192.168.134.11
会出现timeout
,同时在同网段的wireshark 可以看到有ARP请求
Who has 192.168.140.33? Tell 192.168.140.100
。
6.1 Lab 重定向
1 | MAC层 |