当前位置: 首页 > article >正文

[网络协议篇] ICMP协议

文章目录

  • 1. 简介
  • 2.主要功能
  • 3. 报文格式
  • 4. 报文分类
  • 5. 常见ICMP类型和代码组合
  • 6. ICMP在网络安全中的应用
  • 7. 利用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()

http://www.kler.cn/news/367423.html

相关文章:

  • 从蚂蚁金服面试题窥探STW机制
  • 二进制方式部署k8s集群
  • Spring--2
  • 散列表:为什么经常把散列表和链表放在一起使用?
  • 鸿蒙开发初级证书考试答案
  • FCN深度学习语义分割开山之作——学习笔记
  • 4-petalinux2018.3 摸索记录 -linux 驱动 (交叉编译)
  • QHeaderView添加复选框以及样式
  • R语言机器学习算法实战系列(十四): CatBoost分类算法+SHAP值 (categorical data gradient boosting)
  • LeetCode练习-删除链表的第n个结节
  • 医院信息化与智能化系统(10)
  • Nuxt.js交流社区,欢迎加入!
  • 报表工具怎么选?山海鲸VS帆软,哪个更适合你?
  • “循环购模式:革新消费体验,解锁收益新篇章“
  • 单值集合总复习
  • MySQL-DQL练习题
  • 2024.10.27 直接插入排序 非递归后序遍历(复杂版)
  • 基于STM32的智能寝室控制系统设计(论文+源码)
  • Spring Boot环境下论坛网站的架构与优化
  • idea 无法输入中文 快速解决
  • 2024 BuildCTF 公开赛|MISC
  • 【好玩的经典游戏】Docker环境下部署网页小游戏网站
  • 媒小象 1.7.2 | 完全免费的内容创作二创工具
  • uniapp 发起post和get请求!uni.request(OBJECT)
  • PouchDB - 免费开源的 JavaScript 数据库,轻量易用,用于离线保存数据的场景
  • 联想笔记本电脑睡眠后打开黑屏解决方法