[网络协议篇] ICMP协议

1. 简介

Internet Control Message Protocol 网络控制消息协议,TCP/IP中的一种子协议,位于网络层的协议,ICMP用于在IP主机、路由器之间传递各种差错和控制消息, 在收集网络信息、故障排除等方面起到非常重要的作用。

ICMP是基于IP协议工作的,它仍然是网络层协议而不是传输层协议。当IP数据报头的协议字段的type为1是,就是一个ICMP报文。

2.主要功能

  • 确认IP包是否成功到达目标地址。ping命令行工具本质就是使用这个ICMP协议进行主机可达性探测。
  • 进行网络故障的排除,通知发送方在发送过程中IP包被丢弃的原因。利用ICMP原理进行故障排除的应用程序traceroute

traceroute 命令是一个网络诊断工具,用于跟踪数据包在网络中从源地址到目标地址所经过的路由。它帮助用户了解数据在网络中传输的路径,常用于故障排查和网络性能分析。在windows上被称为tracert

3. 报文格式

ICMP报文包含在IP数据包中,IP报头在ICMP报文的最前面。一个ICMP报文包括: IP报头(至少20字节)、ICMP报文头(至少八字节)和ICMP报文(ICMP报文的数据部分)。

ICMP报头结构:

image.png

  • 类型:1个字节,标识ICMP报文的类型。
  • 代码:1个字节,标识对应ICMP报文的代码,与类型字段一起共同标识ICMP报文的详细类型
  • 校验和:2个字节,包括ICMP报文数据部分在内的整个ICMP数据报的校验和
  • Rest Of Header: 四个字节,内容根据ICMP类型和代码进行变化

4. 报文分类

  • 差错报文:报告IP层传输中出现的各种错误。
  • 信息报文:用于网络的探测和信息查询,常用于测试连通性或查询网络信息

常见报文

报文类型类型码代码说明差错报文0/信息报文1
Echo Reply00回显应答,表明目标主机在线1
Destination Unreachable30-15目标不可达,通知无法到达目标主机/网络0
Source Quench40通知源主机减少发送速率0
Redirect50-3重定向报文,通知源主机有更好路由0
Echo Request80回显请求,测试网络连通性1
Time Exceeded110-1超时,超过TTL最大生存空间0
Parameter Problem120-2参数问题,某些字段错误或不可处理0
Timestamp Request130时间戳请求,请求目标主机的时间戳,用于时间同步或延迟测量1
Timestamp Reply140时间戳应答,返回实现戳1
Information Request150信息请求,请求特定信息1
Information Reply160信息应答1
Adress Mask Request170地址掩码请求,请求目标主机的子网掩码1
Adress Mask Reply180地址掩码应答1

5. 常见ICMP类型和代码组合

  • type=8
    • code=0: Echo Request,常用于Ping请求。
  • type=0
    • code=0:Echo Reply,Ping响应。
  • type=3
    • code=0:网络不可达
    • code=1:主机不可达
    • code=3:端口不可达
  • type=11
    • code=0:TTL超时
    • code=1:片段重组超时

6. ICMP在网络安全中的应用

  • 信息收集: 利用ICMP的特性, 可以对目标网段的存活主机进行探测。
  • 网络攻击
    • ping flood攻击:攻击者通过会发送大量的ICMP Echo Request请求消耗目标系统资源,影响目标主机正常的业务请求。
    • Smurf Attack:攻击者伪造源地址并向广播地址发送 ICMP Echo Request,导致网络上的所有设备同时回复,从而对目标产生洪水效应。
  • 绕过防火墙:如果目标主机上防火墙策略有问题,可以利用ICMP隧道技术包裹其它协议的数据包来进行数据传输,达到将数据非法的传输出去。

7. 利用ICMP协议实现主机探活

原理: 向目标主机发送ICMP Echo Request,如果目标主机存活的情况下会返回ICMP Echo Reply应答响应的原理,如果目标ip主机不在线的情况下,则没有反应。通过发送数据包受否会收到应答响应(Echo Reply)的不同情况进行目标主机的存活性判断。如果目标主机设置了禁用ping请求,那这个主机探活方案将会实现,可以切换其它探活策略。

# coding: utf-8
from scapy.all import *
from scapy.layers.inet import IP, ICMP
from random import randint
from optparse import OptionParser
import nmap


def main():
    parser = OptionParser("Usage: %prog -i <target host> ")
    parser.add_option("-i", type="string", dest="IP",help="specify target host. example: single ip: 192.268.101.2, multi_ip: 192.168.102.2-13")
    options, args = parser.parse_args()

    # check
    if options.IP is None:
        parser.print_help()
        sys.exit(1)
    print("Scan report for " + options.IP + "\n")
    if "-" in options.IP:
        start = int(options.IP.split("-")[0].split(".")[3])
        end = int(options.IP.split("-")[1])
        ipPrefix = ".".join(options.IP.split(".")[:3])
        for i in range(start, end + 1):
            Scan(ipPrefix + "." + str(i))
    else:
        Scan(options.IP)


"""
# 使用icmp探测主机存活
"""


def Scan(ip):
    icmpId = randint(1, 65535)
    packet = IP(dst=ip, ttl=64) / ICMP(id=icmpId) / b"rootkit"
    result = sr1(packet, timeout=5, verbose=False)
    if result:
        scanIp = result[IP].src
        print(scanIp + " ---> Host is up")
    else:
        print(f"{ip} is down")


"""
使用nmap进行主机探测
"""


def NmapScan(targetIp):
    nm = nmap.PortScanner()
    try:
        result = nm.scan(hosts=targetIp, arguments="-sn -PE")
        state = result["scan"][targetIp]["status"]["state"]
        print("[{}] is [{}]".format(targetIp, state))
    except Exception as e:
        pass


if __name__ == "__main__":
    main()
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无限码力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值