简介
ICMP( Internet Control Message Protocol)互联网控制消息协议,和IP一层,但ICMP使用时必须增加IP报头。属于网络层协议,它用于TCP/IP 网络中发送控制消息,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。通过这些信息,网络管理者可以对所发生的问题作出诊断,然后采取适当的措施解决问题。攻击者也可以利用控制消息发送恶意数据包实现对主机的控制(ping是基于ICMP协议进行工作的)
报文格式
ping指令
ping (Packet Internet Groper),用于测试网络连接量的程序。Ping发送一个ICMP;回声请求消息给目的地并报告是否收到所希望的ICMP (ICMP回声应答)。它是用来检查网络是否通畅或者网络连接速度的命令。ping命令通常用来作为网络可用性的检查。ping命令可以对一个网络地址发送测试数据包,看该网络地址是否有响应并统计响应时间,以此测试网络。
ping是基于ICMP协议的,就是互联网控制报文协议,网络包在异常复杂的网络环境进行传输的时候,常常会遇到各种各样的问题,当遇到问题的时候,总要传出消息来,报告情况,这样才可以调整传输策略。
ICMP报文是封装在IP包里面的,因为传输的时候,肯定需要源地址和目标地址,它本身非常简单。ICMP报文有很多种类型,最常用的类型是主动请求为8,主动应答为0。
实现过程
假设主机A的IP地址是192.168.1.1,主机B的IP地址是192.168.1.2,当你在主机A上运行“ping 192.168.1.2”后,具体实现过程如下:
(1)ping命令执行的时候,源主机首先会构建一个ICMP请求数据包,ICMP数据包内包含多个字段。最重要的是两个,第一个是类型字段,对于请求数据包而言该字段为8;另一个是顺序号,主要用于区分连续ping的时候发出的多个数据包。每发出一个数据包,顺序号会自动加1,为了能够计算往返的时间,它会在报文的数据部分插入发送时间。
(2)由ICMP协议将这个数据包,连同地址192.168.1.2一起交给IP层,IP层将以192.168.1.2作为目的地址,本机IP作为源地址,加上一些其他的信息,构建一个IP数据包。
(3)接下来,需要加入MAC头,在本节ARP映射表中查找出IP地址192.168.1.2所对应的MAC地址,由数据链路层构建一个数据帧,还要加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。
(4)主机B收到这个数据帧后,先检查它的目的MAC地址,并和本机的MAC地址对比,如符合,则接收,否则就丢弃,接收后检查该数据帧,将IP包从数据帧中取出来,交给本机的IP层,同样,IP层检查后,将有用的信息提取出来后交给ICMP协议。
(5)主机B会构建一个ICMP应答包,应答数据包的类型字段为0,顺序号为接收到的请求数据包中的顺序号,然后再发送给主机A
ICMP流量分析例题
ctfhub-icmp_data
题目:ping 也可以携带数据?
下载附件,得到一个流量包,根据题目,直接过滤icmp流量,直接搜索flag发现没有
查看流量发现
发现data里面藏有字符串,依次点击产看,将其提取出来即可得到flag
或者编写脚本进行提取
import pyshark
cap = pyshark.FileCapture('icmp_data.pcap',display_filter='icmp && icmp.type== 8')
#cap 打开名字为 data的,然后过滤掉 icmp 和icmp中type 为 8 的
flag = ''
for i in range(0,25): #人工数出来flag有25长度 所以循环0到25
flag+=chr(int((cap[i].icmp.data_data)[24:26],16))
#打开cap中第i个,然后打开他icmp中data中data
# 数字为十进制 所以转换为16进制,并且占俩空,数一下能发现为24到26
# int(x,16) 是将x变为16进制,然后chr是把他进行ascii编码
print(flag)
cap.close()
运行得到flag ctfhub{c87eb99796406ac0b}
icmp_length
题目:ping 包的大小有些奇怪
下载附件,得到一个流量包,还是县过滤icmp流量,搜索一下flag没有搜到
根据题目那就查看一下长度
发现每段长度都是不一样的,将长度全部都记录下来:99 116 102 104 117 98 123 97 99 98 54 53 57 102 48 50 51 125
将其转ascii码得到 ctfhub{acb659f023}
同样我们可以编写脚本进行提取
import pyshark
cap = pyshark.FileCapture('icmp_len.pcap',display_filter='icmp && icmp.type==8')
#过滤icmp流量
flag = ''
for i in range(0,18):
flag+=chr(int(cap[i].icmp.data_len))
#访问的是第i个cap中icmp数据包的data中的len
print(flag)
同样得到flag
标签:ICMP,IP,ping,flag,icmp,数据包,CTFGHUB,技能 From: https://www.cnblogs.com/N0tsure-blog/p/17964171