Probleme beim Spoofing der IP-Adresse

751
srkmish

Ich habe einen Ubuntu-Computer und möchte gefälschte IP-Adresse (.212) an einen Windows-Computer senden. Ich verwende dafür ein Spoofing-Programm, das Raw-Sockets verwendet.

  • 192.168.1.185 - IP meines Rechners (Ubuntu)
  • 192.168.1.212 - Gefälschte IP (es ist eigentlich meine IPhone IP)
  • 192.168.1.213 - Ziel (Mein Windows-Tablet)

Immer wenn ich nun die Parameter (gefälschte IP-Adresse und Ziel) an die Ausgabe des Programms übergeben habe, sehe ich in Wireshark kein Paket von gefälschter IP-Adresse zum Ziel. Ich sehe nur ein Paket von einer unbekannten IP-Quelle (64.17.17.214) an die gefälschte IP-Adresse (.212). Ich kann nicht herausfinden, was unter Linux läuft.

Befehlsnutzung: ./rawudp <source hostname/IP> <source port> <target hostname/IP> <target port>

Mein Befehl: ./a.out 192.168.1.212 80 192.168.1.213 8080

Hier ist der Screenshot: http://tinypic.com/r/ofrfb5/8

Hier ist das Programm: http://pastebin.com/cT4TBsKU

Der Quellcode direkt:

// ----rawudp.c------ // Must be run by root lol! Just datagram, no payload/data  #include <unistd.h> #include <stdio.h> #include <sys/socket.h> #include <netinet/ip.h> #include <netinet/udp.h> # include <string.h> #include <stdlib.h>  // The packet length #define PCKT_LEN 8192  // Can create separate header file (.h) for all headers' structure // The IP header's structure struct ipheader { unsigned char iph_ihl:5, iph_ver:4; unsigned char iph_tos; unsigned short int iph_len; unsigned short int iph_ident; unsigned char iph_flag; unsigned short int iph_offset; unsigned char iph_ttl; unsigned char iph_protocol; unsigned short int iph_chksum; unsigned int iph_sourceip; unsigned int iph_destip; };  // UDP header's structure struct udpheader { unsigned short int udph_srcport; unsigned short int udph_destport; unsigned short int udph_len; unsigned short int udph_chksum; }; // total udp header length: 8 bytes (=64 bits)  // Function for checksum calculation. From the RFC, // the checksum algorithm is: // "The checksum field is the 16 bit one's complement of the one's // complement sum of all 16 bit words in the header. For purposes of // computing the checksum, the value of the checksum field is zero." unsigned short csum(unsigned short *buf, int nwords) { // unsigned long sum; for (sum = 0; nwords > 0; nwords--) sum += *buf++; sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); return (unsigned short) (~sum); }  // Source IP, source port, target IP, target port from the command line arguments int main(int argc, char *argv[]) { int sd; // No data/payload just datagram char buffer[PCKT_LEN]; // Our own headers' structures struct ipheader *ip = (struct ipheader *) buffer; struct udpheader *udp = (struct udpheader *) (buffer + sizeof(struct ipheader)); // Source and destination addresses: IP and port struct sockaddr_in sin, din; int one = 1; const int *val = &one;  memset(buffer, 0, PCKT_LEN);  if (argc != 5) { printf("- Invalid parameters!!!\n"); printf("- Usage %s <source hostname/IP> <source port> <target hostname/IP> <target port>\n", argv[0]); exit(-1); }  // Create a raw socket with UDP protocol sd = socket(PF_INET, SOCK_RAW, IPPROTO_UDP); if (sd < 0) { perror("socket() error"); // If something wrong just exit exit(-1); } else printf("socket() - Using SOCK_RAW socket and UDP protocol is OK.\n");  // The source is redundant, may be used later if needed // The address family sin.sin_family = AF_INET; din.sin_family = AF_INET; // Port numbers sin.sin_port = htons(atoi(argv[2])); din.sin_port = htons(atoi(argv[4])); // IP addresses sin.sin_addr.s_addr = inet_addr(argv[1]); din.sin_addr.s_addr = inet_addr(argv[3]);  // Fabricate the IP header or we can use the // standard header structures but assign our own values. ip->iph_ihl = 5; ip->iph_ver = 4; ip->iph_tos = 16; // Low delay ip->iph_len = sizeof(struct ipheader) + sizeof(struct udpheader); ip->iph_ident = htons(54321); ip->iph_ttl = 64; // hops ip->iph_protocol = 17; // UDP // Source IP address, can use spoofed address here!!! ip->iph_sourceip = inet_addr(argv[1]); // The destination IP address ip->iph_destip = inet_addr(argv[3]);  // Fabricate the UDP header. Source port number, redundant udp->udph_srcport = htons(atoi(argv[2])); // Destination port number udp->udph_destport = htons(atoi(argv[4])); udp->udph_len = htons(sizeof(struct udpheader)); // Calculate the checksum for integrity ip->iph_chksum = csum((unsigned short *) buffer, sizeof(struct ipheader) + sizeof(struct udpheader)); // Inform the kernel do not fill up the packet structure. we will build our own... if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, val, sizeof(one)) < 0) { perror("setsockopt() error"); exit(-1); } else printf("setsockopt() is OK.\n");  // Send loop, send for every 2 second for 100 count printf("Trying...\n"); printf("Using raw socket and UDP protocol\n"); printf("Using Source IP: %s port: %u, Target IP: %s port: %u.\n", argv[1], atoi(argv[2]), argv[3], atoi(argv[4]));  int count; for (count = 1; count <= 20; count++) { // Verify if (sendto(sd, buffer, ip->iph_len, 0, (struct sockaddr *) &sin, sizeof(sin)) < 0) { perror("sendto() error"); exit(-1); } else { printf("Count #%u - sendto() is OK.\n", count); sleep(2); } } close(sd); return 0; } 
1
Können Sie den Quellcode mit Pastebin oder ähnlichem verknüpfen, nur um sicherzustellen, dass wir denselben Code suchen. Können Sie auch den Befehl einfügen, den Sie zum Ausführen des Programms verwendet haben? Zokol vor 8 Jahren 0
Ein Abbild des Netzwerkverkehrs (wireshark oder tcpdump) wäre hilfreich, um zu sehen, was passiert. vor 8 Jahren 0
Könnten Sie Ihre Frage klären, indem Sie den beiden beteiligten Maschinen Namen (fiktive) geben, da deren @IP nicht als Weg verstanden werden kann, von wem Sie sprechen. Auf welcher Maschine betreiben Sie Wireshark? daniel Azuelos vor 8 Jahren 1
Nur eine Vermutung, aber versuchen Sie, Ihr Programm als root auszuführen. Verwenden Sie Wireshark auch lokal auf dem sendenden Gerät und auf dem empfangenden Gerät. Bleib sicher ;) BrunoMCBraga vor 8 Jahren 0
Hey Leute, danke für die Antwort. Ich habe dem ursprünglichen Beitrag mehr Details hinzugefügt srkmish vor 8 Jahren 0
hast du das herausgefunden jiggunjer vor 8 Jahren 0

0 Antworten auf die Frage