ICMP和重定向攻击

ICMP数据报格式

https://zhuanlan.zhihu.com/p/58662573
头部type,code,checksum ,4字节,扩展字段,4字节
icmp作为数据部分封装到ip数据报中
IPv4中的常用type,ipv6与之不同

  • 0:Echo Reply 回显应答,返回数据 ping
  • 3:Destination Unreachable 不可达
  • 5:Redirect (change route) 重定向
  • 8:Echo Request 回显请求,ping
  • 11:time Exceeded for a Datagram,超时
    struct icmp
    {
   
    u_int8_t icmp_type; /* type of message, see below */
    u_int8_t icmp_code; /* type sub code */
    u_int16_t icmp_cksum; /* ones complement checksum of struct tcp、icmp是全部的校验和,ip的只有头部*/
    union
    {
   
    u_char ih_pptr; /* ICMP_PARAMPROB */
    struct in_addr ih_gwaddr; /* gateway address */
    struct ih_idseq /* echo datagram */
    {
   
    u_int16_t icd_id;
    u_int16_t icd_seq;
    } ih_idseq;
    u_int32_t ih_void;

smurf攻击

冒充target ip 广播icmp回显请求,target会收到大量icmp回显回复,从而忙于处理icmp而拒绝服务。
如何防御?
使主机或路由器不响应ICMP请求或广播,或使路由器不转发目的是广播地址的数据包

ICMP重定向攻击

代码:icmpRedirect.c
重定向:若路由器收到一个数据报,并发现该数据报存在一个比自己更好的下一跳路由,就会向主机发送重定向报文,让其更新转发表。
重定向只支持对单个目标主机的重定向,所以不会改变路由表,但可以改变route cache, netstate -rn --cache。
在这里插入图片描述

sudo netwox 86 -g new_gateway_ip -i old_gateway_ip
也可以通过raw socket编程,手动实现重定向。

如何防御:使用防火墙过滤icmp或手动关闭icmp redirect

基于libpcap的sniffer

头文件 pcap.h
基于libpcap,编译时加入 -lpcap
编程步骤:

  • 查找设备
  • 打开设备,获得一个把手(handle是系统提供的一个用于交互的接口)
  • 设置、应用filter
  • 抓包,pcap_next (只抓一 次) , pcap_loop (循环)
  • 分析数据包
  • 结束
	char errBuf[PCAP_ERRBUF_SIZE], * devStr;
    /* 查找设备 */
    devStr = pcap_lookupdev(errBuf);
    /*捕获数据
    * 参数:设备名称,最大捕获量(字节),是否置于混杂模式(混杂即捕获设备收发的所有数据),超时时间(0表示没有超时等待),错误信息
    */
    pcap_t * handle = pcap_open_live(devStr, 65535, 1, 0, errBuf);    
    struct bpf_program filter;
    char filterstr[50]={
   0};
    sprintf(filterstr,"src host %s",Vic_IP); //将ip写入filterstr缓冲区

    //编译filter
    //参数:filter过滤器指针;filterstr过滤表达式; 1:表达式是否被优化;0:应用此过滤器的掩码
    if (pcap_compile(handle, &filter, filterstr, 1, 0) == -1) {
   
		 fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
		 return 0;
	 }
     //启用过滤器
     if (pcap_setfilter(handle, &filter) == -1) {
   
         fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));
         return 0;
     }
    //循环抓包
    //-1表示循环次数,getPacket是回调函数,用于解析数据包,最后参数一般置为null
    pcap_loop(handle, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值