3 Way Handshake
-
hi
ich bin gerade daran einen 3 way h zu realisieren, diesen code schickt schon mal ein syn packet ab, aber wie bekomme ich es jetzt hin dann kommt der client der ein syn und ack schickt, aber wie schaffe ich es jetzt noch ein ack zu schicken?
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/ip.h> #include <netinet/tcp.h> int main(int argc, char *argv[]) { int i; i = 1; int s, bytes, on = 1; char buffer[1024]; struct iphdr *ip; struct tcphdr *tcp; struct sockaddr_in to; struct in_addr addr; if (argc != 4) { fprintf(stderr, "%s <dest-addr> <port> <wait>\n", argv[0]); return 1; } s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP); if (s == -1) { perror("socket() failed"); return 1; } if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) == -1) { perror("setsockopt() failed"); return 2; } ip = (struct iphdr*) buffer; tcp = (struct tcphdr*) (buffer + sizeof(struct iphdr)); memset(ip, 0, sizeof(struct iphdr)); ip->version = 4; ip->ihl = 5; ip->tot_len = htons(sizeof(struct iphdr) + sizeof(struct tcphdr)); ip->id = random(); ip->ttl = 255; ip->protocol = IPPROTO_TCP; ip->saddr = inet_addr("192.168.13.253"); ip->daddr = inet_addr(argv[1]); memset(tcp, 0, sizeof(struct tcphdr)); tcp->source = htons(999); tcp->dest = htons(atol(argv[2])); tcp->seq = random(); tcp->doff = 5; tcp->syn = 1; tcp->window = htons(65535); to.sin_addr.s_addr = ip->daddr; to.sin_family = AF_INET; to.sin_port = tcp->dest; printf("Ziel: %s:%i\n", inet_ntoa(to.sin_addr), ntohs(tcp->dest)); addr.s_addr = ip->saddr; printf("Quelle: %s:%i\n", inet_ntoa(addr), ntohs(tcp->source)); for(;;) { bytes = sendto(s, buffer, ntohs(ip->tot_len), 0, &to, sizeof(to)); if (i == 1) { perror("sendto() failed"); return 1; } putchar('.'); fflush(stdout); sleep(atol(argv[3])); } return 0; }
<edit=kingruedi>bitte code-tags benutzen
sfds </edit>
-
wo ist genau dein Problem?
http://www.cs.panam.edu/~meng/Course/CS6345/Notes/chpt-6/node8.html
-
Also der Code oben schickt als erstes ein Syn, jetzt muss mein programm aber warten, bis ein syn & ack zurückkommt! und dann zum schluss noch mal ein ack senden! hat da wer nen code (der wirklich nur das macht und nicht mehr! also nicht zu kompliziert)! danke
-
Ich versuche so etwas auch in der Art nur zur Hälfte: ein SYN schicken und sobald der SYN/ACK kommt die Verbinfung schließen... als Port-scanner nur klappt das bei mir auch noch nicht.
Also erstmal kannst du die Zuweisung an ip->saddr weglassen, das füllt dann der Kernel mit der richtige IP aus. Vieleicht kommst du weiter wenn du evtl. die BSD header benutzt, da hast du nämlich ein Bitmuster in das flags wie SYN, ACK, RST etc. eingesetzt und ausgelesen werden können. Meine Quelle war: http://mixter.void.ru/rawip.html.
Mehr fällt mir auch nicht ein
Frage an dich hast: Hast du irgendwelche Tutorials darüber?
Mein thread: http://www.c-plusplus.net/forum/viewtopic.php?t=73237
-
nein sorry habe nicht mehr als du