《信息安全工程》实验内容

来源:《信息安全工程》钟计东老师 课件

2024-05-09 ~ 06-07@Seymour


前置内容

前置内容有录制视频 虚拟机-前置内容

安装XP

网段

  • VMWare 支持多个网段
  • 每个网段相当于一个广播型的以太网络(Ethernet)

网段连接模式

  • VM网段设置有几种模式

    1. 桥接模式
    2. NAT模式
    3. 仅主机模式 host-only
    4. LAN模式
  • 区别主要在于和外部网络的连接方式,

    桥接模式和NAT模式可以访问外部网络,而后两种不能。

  • LAN访问不提供DHCP服务,提供更多网段

  1. 网段设置:在 VMware 的封面上方工具栏 | 编辑 | 虚拟网络编辑器
  2. 虚拟机网络设置:右键虚拟机 | 设置 | 网络适配器 | 自定义 | 选择网段

注:更换网络连接方式时,可以打开本地连接设置查看连接状态,发现“无效IP地址“可以点击修复,会清除缓存。

桥接模式

P2-4
  • 将主机和虚拟机放在主机所在的物理网络,虚拟机需要独立的IP地址。

  • 桥接模式下

    各个虚拟机都选择VMnet0

    • 各个虚拟机都可以互相 ping 通

    • 也都能和物理机互相 ping 通

    • 虚拟机都能正常接通外部网络(可以使用浏览器上网)

P2-4-1

NAT模式

P2-5-1
  • 虚拟主机通过内部地址映射成主机所具有的外部网络地址

  • NAT模式下

    1. 网段设置

      设置VMnet2 (WMFusion中进行偏好设置)

      网关 IP:192.168.142.2

      子网 IP:192.168.142.0/255.255.255.0

      去掉DHCP

      去掉将主机适配器添加到此网络,表示主机不连接在142网段

    2. 各虚拟机设置

      网络适配器:选择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 虚拟机
    • 虚拟机可以连接到外部网络(可以浏览器上网)
P2-5-2

仅主机模式 Host-only

P2-6
  • 虚拟机无法接通外部网络。(与物理主机不接通)

LAN模式(局域网)

P2-7
  • 虚拟机无法接通外部网络。(与物理主机不接通)
  • 而且没有DHCP服务(DHCP:动态主机地址分配服务)

我的配置备注

  • WinXP
1
2
3
4
5
6
Win XP Ghost 正在使用:
文件:XP_Ghost.iso

WinXP(取消):
镜像文件:zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_x14-80404.iso
产品密钥:G3B6Q-PDJCP-D638W-T9X6F-93VX3
  • 服务器 server1
1
2
3
4
5
6
7
8
9
10
11
IP: 192.168.142.200
HTTP服务 http://192.168.142.200/index.htm
FTP服务 ftp://192.168.142.200/
镜像文件:cn_win_srv_2003_r2_standard_with_sp2_cd1_X13-13927.iso
版本:server 2003 Standard
姓名:Seymour
单位:TJ
产品密钥:KKM7F-PB4GC-7DMH2-KKYXB-RG34M
计算机名称:Server1
管理员Administrator密码:admin
60天有效(2024-05-09--07-09)
  • RouterOS
1
2
3
4
5
6
7
RouterOS 正在使用:
mikrotik-6.49.13.iso
操作系统:其他
版本:其他
Loading System 等待时间很长,大概6-10min
账号:admin
密码:admin

开始实验

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
print

# 接口IP
ip address
add
print

# 路由
ip route
add
print

# 防火墙
ip firewall

# 添加NAT
ip firewall nat
add chain=srcnat out-interface=向外走的接口 action=masquerade

print
P2-8 P2-9 P2-10

注: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给下一跳路由器处理

    1. 判断是否本网络?(网段、子网掩码的设置)

      • 本网络内:主机发ARP请求(广播)直接询问所求ip的MAC地址
      • 非本网络:主机发ICMP请求给网关,由网关去做。(这里网关的MAC也需要ARP请求得到,一般肯定设置时就ARP请求过了,所以就不必再发ARP请求询问MAC地址了)
    2. 若没有设置网关?

      非本网络的ARP请求会因为没有网关而发不出去。

P7-4 P7-5

  • ARP高速缓存
  1. 静态表项:永不过期的表项

    人工,也更加安全

  2. 动态表项:有生命期的表项

    通过ARP协议学习

1
2
3
4
5
6
7
8
9
10
11
12
// 显示地址映射表项,[ ]为可选项
arp -a [inet_addr]

// 删除由inet_addr所指定的表项
n arp -d [inet_addr]

// 增加由inet_addr和phys_addr 指定的静态表项
n arp -s inet_addr phys_addr

// 显示帮助
n arp /?

  • 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。

    • 优点:

      1. 主机可以不用配置默认网关
      2. 子网的变化对主机是透明的
    • 缺点:

      1. 增加了某一网段上ARP流量
      2. 需要更大的ARP 表来处理IP地址到MAC地址的映射
      3. 安全问题,比如ARP欺骗
  • 免费ARP

    免费 ARP (gratuitous ARP)是指主机发送ARP查找自己的MAC地址,但实际只是一种广而告之。

    通常,它发生在系统引导期间进行接口配置或更改IP地址的时候。

    • 特点:
      1. 报文中携带的源IP和目的IP地址都是本机地址
      2. 报文源MAC地址是本机MAC地址。目的MAC地址为全0
    • 作用:
      1. 查找相同IP地址
      2. 更新ARP缓存
    • 恶作剧:将对方的IP拿来构建的免费ARP包不停地发送,每两秒一次。对方不断提示IP地址冲突。
  • ARP欺骗

    “ ARP 欺骗”系列病毒自 06 年出现以来,一直难以根除。一旦感染此病毒,就会在局域网内发起攻击,导致其他用户不能上网,危害严重。电脑中毒后会向同网段内所有计算机发ARP欺骗包,导致网络内其它电脑因网关物理地址被更改而无法正常上网,被欺骗电脑的典型症状是刚开机能上网,几分钟之后断网,过一会又能上网,或者重启一遍电脑就可以上网,一会又不好了,如此不断重复,影响正常使用。

    • ARP 欺骗关键:缺乏身份认证,可以伪造MAC地址
      • ARP请求中的MAC地址伪造
      • ARP应答中的MAC地址伪造

3.1 Lab 欺骗主机

P7-1
  • 使 B 无法 PING C

    1. A构造ARP请求

      1
      2
      3
      4
      5
      6
      7
      8
      9
      MAC层
      目的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。

    2. B 去 ping C

      B 去ping C时,会发现 arp 缓存里有,就会按照这个错误的缓存来请求了,自然就请求不到数据。

      最终,Request timed out.请求超时。

      (可以 arp -a查看一下 B缓存的 IP-MAC对应关系,会发现 IP-C对应到MAC-A了)

    3. 恢复

      B 可以 arp -d 清除缓存,就抹去了错误信息。或者稍等一会,动态缓存会自动消失。

      再 ping C 就会正常了。(因为会重新发 arp请求询问 C 的mac,这时 C 会应答)

  • 使 B 无法访问外网

    1. A构造ARP请求

      1
      2
      3
      4
      5
      6
      7
      8
      9
      MAC层
      目的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。

    2. 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了)

    3. 恢复

      B 可以 arp -d 清除缓存,就抹去了错误信息。或者稍等一会,动态缓存会自动消失。

      再 ping baidu.com ,就会发现可以收到 Reply.

3.2 Lab 欺骗网关

P7-2
  • 使D 无法 PING 通 B

    1. A构造ARP请求

      1
      2
      3
      4
      5
      6
      7
      8
      9
      MAC层
      目的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 记录下来。

    2. 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)

    3. 恢复

      这时,是网关路由器 R1被欺骗,因此,需要 R1把 IP-B 对应的MAC 由 MAC-A改为 MAC-B。

      其实不用动,路由器很快会发现是错误的,立马重新发 arp 请求寻找正确的 MAC-B。

      这也就是为什么,你会发现前面 D ping B ,虽然前两次 请求超时,但是后面就会正确。

3.3 Lab 应答欺骗

P7-3
  • 伪造应答

    1. A清除数据并 ping B

      在 cmd 下 arp -d清除缓存,然后 ping IP-B

      发现能够正常收到 B 回应。

    2. C 伪造 ARP 应答

      1
      2
      3
      4
      5
      6
      7
      8
      9
      MAC层
      目的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)。

    3. 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个字节(可选,由代码决定)
    • 数据部分(可选,由代码决定)
    P9-6 P9-7
    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)

    P9-8
    • 路由器在转发过程中如果发现此选项,那么将其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
    13
    Record 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列表

    结果:

    1. A:发出去的流量包中的 record route 为8个 0.0.0.0

    2. B:同 A

    3. C:流量包中的 Record Route 有三条记录,如下:

      P9-9
    4. A:收到回复,Record Route 会有五条记录,如下:

      P9-10
  • 实验2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Record 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查看,如下:

    P9-16

    若是 A 发的请求,中途即便是因为R3分片了,也会在R3收集好再发出来。

    因此对A来说,分片是透明的,只看到一个请求、一个响应。

4.1 Lab 构建 ping 包记录

P9-1 P9-2
  • 构建 ping 包,设置 Record Route

    1. 构建 Record Route 的 ICMP 包

      1
      2
      3
      4
      5
      6
      7
      8
      9
      MAC层:
      目的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)

    2. 在B查看 Request

      会看到 三条记录(R1-R3-B)。

    3. 在 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 理论知识

  • 源路由选项

    • 本选项由于安全原因,路由器可能不支持。

    • 用于规定数据包经过的路径,有两种方式:

      1. 严格源路由

        包含一个IP地址序列,该序列指出了到达目的地的完整路径

        数据报必须沿着IP地址序列传输,路由器只是将数据包转发到指定的下一个IP地址,而不进行路由(下一个IP地址必须直接可达)。

      2. 松散源路由

        包含一个IP地址序列,该序列指出了到达目的地的部分路径

        数据报必须沿着IP地址序列传输,但是允许表中相继两个地址之间相隔多个路由器或物理网络。

    • 由于还同时记录经过的路径(记录路由),

      所以它通常称为source and record route( SRR)和 strict source and record route( SSRR)。

    • 记录路由方式和记录路由选项相似。

    P9-11
  • 发送方的处理过程

    • 假设主机A到B的路径为 A-X1-X2-X3-B

    • 虽然A的目的地为B,但Destination IP一定要填下一站的地址,而非IP-B

    • 将其他下一站地址依次填入选项数据内,最后一个IP地址为IP-B

      • 严格源路由:下一站地址必须是直接可以到达。

        例如,X2 必须是从 X1 直接能够到达,而不必再经过其他路由器。

      • 松散源路由:下一站地址不必直接可以到达。

        例如,X2 可以是从 X1 经过其他路由器间接到达。

    P9-12
  • 转发或接收时的处理过程

    • 主机A到B的路径为A-X1-X2-X3-B

    • 当接收到数据时, 检查 pointer < length 是否成立:

      1. pointer >= length

        IP地址序列已经用完,说明本站是最后一站(接受方),将数据交给上层协议

      2. pointer < length

        需要转发数据,将IP层的 Destination IP 换成 pointer 所对应的IP (即数据的下一站),将pointer所对应的IP换成转发时使用的接口IP,pointer = pointer + 4

    P9-13 P9-14 P9-15

5.1 Lab 严格源路由

P9-3 P9-4 P9-5 P2-8
  • 前提:

    1. 一般是默认不接收源路由记录的,因此需要手动开启 accept-source-route 。

      登陆路由器,进入 ip settings可以print看一下,第三行是accept-source-route默认是 no

      设置开启:set accept-source-route=yes

      重启路由器:system reboot

    2. 主机一般是不响应的,因此我们的最终目的IP 是路由器端口IP ,而不是主机IP。

    3. 为什么主机和路由器一般都不支持?

      由下面实验可知源路由会造成流量放大效应,因此可以引起DOS攻击(消耗带宽和CPU)

  • 实验过程

    1
    2
    A=192.168.142.11, B = 192.168.140.99(路由器端口,winxp主机可能不响应)
    A到B的路径为A-R1-R3-R4-R2-R1-R3-R4-R2-R1-B
    1. A 构建 严格源路由的ICMP 请求包

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      MAC层:
      目的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监控流量情况。

    2. A:一条请求、一条响应

      可以看到请求的 IP 层 options 下的 Strict Source Route。

      (当前 dst-IP 是 R1,next 是 R3)

      P9-17
    3. 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 )

      P9-18
    4. 136网段下的主机:两条请求、两条响应

      同理,只不过 136 网段是经过两次,因此有两条请求和响应。

      分析和前面一样。

      P9-19

6 ICMP 重定向

PPT-10

6.0 理论知识

  • ICMP报文分类

    1. 差错报文
      • 回送 请求和应答
      • 时间戳 请求和应答
      • 地址掩码 请求和应答
      • 路由器 询问和通告
    2. 查询
      • 目标不可达
      • 源点抑制
      • 时间超时
      • 参数问题
      • 改变路由
  • ICMP报文

    ICMP报文特点

    • 报告差错:

      ICMP差错报文最根本的功能是反馈数据通信过程中遇到的问题,并非使IP传输更加可靠。

    • 非必需:

      即使数据在传输过程遇到问题,也可能不发送差错报文。

    • 为防止报文的反复发送,不会对ICMP差错报文发送ICMP报文,但ICMP查询报文可能再次产生ICMP报文。

P10-3 P10-4
  • 代码:提供相关报文类型的进一步信息
  • 校验和:提供整个ICMP报文的校验和
  • 数据:
    • 差错报文:包括出错IP数据包头部及该数据包前8个字节的数据,前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及发送序号(对于TCP)
  • ICMP查询报文

    • 回送请求与应答

      ICMP回送请求与应答报文(ICMP Echo Request and Reply)目的:测试目的设备是否可以到达。

      RFC1122要求每台设备必须响应ICMP回送请求,但可能考虑到安全因素,设备可能不会响应

    • 应答报文中的数据和请求报文中的数据一致。

    • 标识符和序号用于将收到的应答和发出的请求相匹配。

      标识符可以像TCP端口一样使用,而序列号每发出一次请求增加1。

      应答时使用和请求报文中相同的标示符和序列号。

      实际中,

      1. Linux每个PING进程使用不同的标示符,而序列号每次增加1。

      2. 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数据可以从一定程度上推测发送方的操作系统
  • 时间戳请求与应答

    P10-5
    • 标识和序列号用来关联响应与请求

      • 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):必需(必须实现)
  • 目的

    通知发送方目的地不可到达

  • 终点不可达

    分为:

    1. 网络不可达
    2. 主机不可达
    3. 协议不可达
    4. 端口不可达
    5. 需要分片

    由code决定,当然code包含更多其他的错误。

  • Next-Hop MTU (RFC 1191)

    • 和code = 4一起使用。

    • 当路由器发现数据包的大小大于下一跳网络的MTU时,而且原始数据包不允许分片(DF置位)时, 路由器必须(MUST)发送一个ICMP差错报文,通知发送方需要允许分片,并且指出了NEXT- HOP的MTU。

P10-6 P10-7
  • 网络不可到达(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
    P10-8

    问:有什么用?

    可以用来探测对方主机是否存在。

    因为对方可能不会响应PING请求,但是,使用一个未知协议,对方可能就会响应协议不可到达。对方只要是响应了,那就说明存在。( Protocol 扫描)

  • 端口不可到达

    • 主机在以下情况下发送端口不可到达ICMP:

      1. RFC792

        在主机相应端口没有开启的情况下,主机可以(MAY)发送端口不可到达消息

      2. 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
    P10-9
  • 需要分片

    当路由器发现数据包的大小大于下一跳网络的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)报文(可能)在以下两种情况下发送:

    1. 传输过程中TTL变为0
    2. 重组过程中超时
    P10-10
  • 超时:实验

    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指定)发送数据。

  • 应由网关发送,主机不应发送。

    P10-11
  • 报文格式

    Code字段列出了重定向的原因:

    P10-12
  • 前提

    RFC792规定了ICMP Redirect报文发送的条件:

    • 主机A、网关G1和G2三者位于同一网段,主机有数据发往网络N中的主机B
    • 主机A的路由表中去往N的下一跳是G1
    • G1通往N的下一跳为G2(实际上G1认为A应该选择G2,因为此路径更短
    • 主机A发送的报文中没有源路由选项
    P10-13
  • 主机如何处理

    1. RFC816

      对主机的要求:

      • 主机在收到 ICMP重定向消息后必须更新路由信息;

        所有主机都必须随时接受和处理ICMP重定向消息。

      • 路由信息的更新主要是路由缓存的更新(更新下一跳),

        如果缓存路由表中没有目的地这一记录,增加一记录。

      • 后续数据包通过新的网关发送。

      • 主机对ICMP网络重定向的处理和对主机重定向的处理方式相同。

    2. RFC1122

      规定主机在收到 ICMP重定向消息后遇到以下情况应当(should)不处理

      • A:新的网关和主机相关接口(收到ICMP的接口)不在同一网络

        原因:不在同一网络上表示不能直接到达

      • B:ICMP重定向报文发送者的地址不是(路由表中)去往相应目的地的一下跳地址

    3. RFC1812

      规定了路由器在满足以下情况下可以发送redirect报文,否则一定不能(must not)发送报文:

      • A:路由器(例子中的G1)的转发接口和接收接口一致

        相当于报文沿原路返回

      • B:数据包中的源IP地址(例子中的IP-A)和路由器将要转发的下一跳地址(例子中的IP-G2)处于同一网络(意味着主机(例子中的A)和下一跳(例子中的G2)在同一网络)

        意味着主机可以直接到达

      • C:数据包中不含源路由选项

    4. RFC1812

      如果路由器使用路由协议来获取路由信息,路由器不能(must not)使用重定向报文获悉的路由来转发数据

  • 重定向:伪造报文要求

    • 假设

      • 主机A(待被欺骗)位于网络N1

      • G1和G2路由器位于网络N1

      • 主机B位于网络N2

      • A中路由表中去往N2的下一跳为G1

    • C 如何冒充 G1 向 A 发送重定向报文,谎称去往目的 B 的网关应该为 G2?

      P10-14
    • 伪造报文要求

      P10-15 P10-16
  • 重定向:实验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
    2
    dst             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的结果)
    P10-17 P10-18
  • 重定向(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
    11
    MAC层
    目的: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 重定向

P10-1 P10-2
P2-8
1
2
3
4
5
6
7
8
9
10
11
MAC层
目的:142.100的MAC
源:142.11的MAC

IP层
源:192.168.136.100(R2)
目的:192.168.136.11(受害者)

Type: 5 Redirect
Code: 1
Gateway Internet Address: 192.168.136.99(R4)