ICMP
相信大家都会用ping命令测试联通性
这里给大家带来ping命令抓取的数据包来了解一下详细的格式
在了解这个数据包之前先来了解一下ICMP的报文格式
在这之前来了解一下进制
一个二进制为一位
八个二进制位一个字节
四个二进制为一个十六进制数
一个字节为两个十六进制数
下面这张表表示了ICMP的通用报文格式
中文版
我们再来看看wireshark是怎么描述的
可以看到,这里有了所开头所对应的type、code等
那么type后面的内容代表了什么意思呢?
其实它的意思为:用于ping操作,以检查特定连接是否可达。
为什么是这个?因为工程师在设计时用类型(type)字段值为0和8的,用于ping操作,以检查特定连接是否可达。
前面为什么会提进制的的知识呢?看下面这张图
这回理解了吧?
这时就会有细心的朋友门发现,不对啊,下面有东西对不上啊!
我只能说当然对不上,因为wireshark内的报文格式根本不是我上面那一张ICMP通用报文格式
下面这张才是
这个是:ICMP Echo Request/Reply消息格式
因为数据包是用ping命令抓取的,而它使用时用的就是这个格式
接下来我们来聊一下这些内容代表的含义
- 类型(Type):占1字节,标识ICMP报文的类型。目前定义了多种类型,取值范围在1到255之间。根据类型值,ICMP报文可以分为差错报文(1~127)和信息报文(128以上)。
- 代码(Code):占1字节,标识对应ICMP报文的代码。它与类型字段一起共同标识了ICMP报文的详细类型。
- 校验和(Checksum):占2字节,是对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错。其计算方法与IP报头中的校验和计算方法相同。
- 标识符(Identifier):占2字节,用于对每一个发送的数据报进行标识。
- 序列号(Sequencenumber):占2字节,用于对发送的每一个数据报文进行编号
这就是他们的含义
那么知道了这些,你会不会好奇Data字段呢?
其实啊,数据(Data)部分其实和类型(type)代码(code)字段密切相关
数据(Data)部分:数据部分的格式和内容取决于ICMP报文的类型(Type)。对于某些类型的ICMP报文,数据部分可能包含额外的信息,如IP头部和IP头部后面的8个字节(对于差错报文)或时间戳信息(对于时间戳请求与应答报文)等。
这里就是要结合上面的Type:8了,还记得上面说的吗?
这里来介绍详细的一些数字的含义:
-
差错报文:用于报告在IP数据报传输过程中发生的错误。常见的差错报文类型包括:
- 目的不可达:类型字段值为3,代码字段值为0~15,用于细分目的不可达的具体原因。例如,网络不可达、主机不可达、协议不可达等。
- 时间超时:类型字段值为11,代码字段值为0(TTL超时)或1(分片重组超时)。
- 参数问题:类型字段值为12,表示IP头部中的字段值出现了问题。
-
信息报文:用于提供有关网络通信的信息。常见的信息报文类型包括:
- 回显请求与应答:类型字段值分别为0和8,用于ping操作,以检查特定连接是否可达。
- 时间戳请求与应答:类型字段值分别为13和14,用于时间同步操作。
- 地址掩码请求与应答:类型字段值分别为17和18,用于请求和应答子网掩码信息。
那么到这里介绍就完毕了,其实ICMP的报文格式有很多种,如果有想深入了解的可以自己去查一下资料。
做一道题
接下来我给大家介绍一个CTF的数据包分析题目
这个题目给我干成人机了
因为他的flag藏在了ping包的长度中,这谁能想的到啊
来看数据包
第一件事肯定是看协议分级统计,主要是分析数据包的主要方向所提供的依据
感觉没什么特别的
第二步,看会话,查看发生于一特定端点的 IP 间的所有流量.
第三步,看端点,列出了 Wireshark 发现的所有 endpoints 上的统计信息
以上是一般正常查看数据包的流程
当然这主要是对数据包一个大体的查看
我们主要还是分析ICMP的协议包
依次查看每个数据包,发现除了一些没用的数据和正常的包头没什么特别的
上面说了,答案就在包长度上面,我们来看看
发现没有?非常有规律的数据包
可是它和flag有毛关系啊!其实要转码的
这个时候我们打开kali
写个py脚本
写个py脚本
a=[144,150,139,145,165,91,109,151,122,113,106,119,93,167]
for i in a:
len=chr(i-42)
print(len,end='')
在来一道
嘿嘿,眼熟不?就是最开始的数据包,这里面也藏着flag
这个flag藏在ICMP的data中
这个出去包头外,data中除了f就是点号了
再看第二个
这个data中是个l,在依次往下查看,就可以发现是个flag值了
我们用工具把它提取出来
先以纯文本的方式保存
查看一下
然后用这个命令
grep -E '[a-zA-Z0-9{}][.]{15}' ping.txt | awk '{print $NF}' | cut -c 1 | tr -d '\n'
成功