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>





  • 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 😞


Anmelden zum Antworten