ibitreich-httpd.c - bitreich-httpd - Bitreich HTTPD service Err bitreich.org 70 hgit clone git://bitreich.org/bitreich-httpd git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/bitreich-httpd URL:git://bitreich.org/bitreich-httpd git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/bitreich-httpd bitreich.org 70 1Log /scm/bitreich-httpd/log.gph bitreich.org 70 1Files /scm/bitreich-httpd/files.gph bitreich.org 70 1Refs /scm/bitreich-httpd/refs.gph bitreich.org 70 1Tags /scm/bitreich-httpd/tag bitreich.org 70 1README /scm/bitreich-httpd/file/README.md.gph bitreich.org 70 1LICENSE /scm/bitreich-httpd/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 ibitreich-httpd.c (8538B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 /* Err bitreich.org 70 i 2 * Copy me if you can. Err bitreich.org 70 i 3 * by 20h Err bitreich.org 70 i 4 */ Err bitreich.org 70 i 5 Err bitreich.org 70 i 6 #include Err bitreich.org 70 i 7 #include Err bitreich.org 70 i 8 #include Err bitreich.org 70 i 9 #include Err bitreich.org 70 i 10 #include Err bitreich.org 70 i 11 #include Err bitreich.org 70 i 12 #include Err bitreich.org 70 i 13 #include Err bitreich.org 70 i 14 #include Err bitreich.org 70 i 15 #include Err bitreich.org 70 i 16 #include Err bitreich.org 70 i 17 #include Err bitreich.org 70 i 18 #include Err bitreich.org 70 i 19 Err bitreich.org 70 i 20 void * Err bitreich.org 70 i 21 xmalloc(size_t size) Err bitreich.org 70 i 22 { Err bitreich.org 70 i 23 void *p; Err bitreich.org 70 i 24 Err bitreich.org 70 i 25 if (!(p = malloc(size))) { Err bitreich.org 70 i 26 perror("malloc"); Err bitreich.org 70 i 27 exit(1); Err bitreich.org 70 i 28 } Err bitreich.org 70 i 29 Err bitreich.org 70 i 30 return p; Err bitreich.org 70 i 31 } Err bitreich.org 70 i 32 Err bitreich.org 70 i 33 void Err bitreich.org 70 i 34 print404(void) Err bitreich.org 70 i 35 { Err bitreich.org 70 i 36 printf("HTTP/1.1 404 Google Broke The Web\r\n"); Err bitreich.org 70 i 37 printf("\r\n"); Err bitreich.org 70 i 38 } Err bitreich.org 70 i 39 Err bitreich.org 70 i 40 void Err bitreich.org 70 i 41 printheaders(char *ctype) Err bitreich.org 70 i 42 { Err bitreich.org 70 i 43 time_t t; Err bitreich.org 70 i 44 char fortunecookie[512]; Err bitreich.org 70 i 45 FILE *fcstdout; Err bitreich.org 70 i 46 int fclen = 0; Err bitreich.org 70 i 47 Err bitreich.org 70 i 48 bzero(fortunecookie, sizeof(fortunecookie)); Err bitreich.org 70 i 49 fcstdout = popen("/home/annna/bin/fortune-cookie", "r"); Err bitreich.org 70 i 50 if (fcstdout != NULL) { Err bitreich.org 70 i 51 fread(fortunecookie, sizeof(fortunecookie)-1, 1, fcstdout); Err bitreich.org 70 i 52 pclose(fcstdout); Err bitreich.org 70 i 53 fclen = strlen(fortunecookie); Err bitreich.org 70 i 54 if (fclen > 0) { Err bitreich.org 70 i 55 if (fortunecookie[fclen-1] == '\n') Err bitreich.org 70 i 56 fortunecookie[fclen-1] = '\0'; Err bitreich.org 70 i 57 } Err bitreich.org 70 i 58 } Err bitreich.org 70 i 59 Err bitreich.org 70 i 60 t = time(NULL); Err bitreich.org 70 i 61 if (t > 0) Err bitreich.org 70 i 62 printf("Date: %s", asctime(gmtime(&t))); Err bitreich.org 70 i 63 printf("X-Future: Gopher ftw!\r\n"); Err bitreich.org 70 i 64 if (fclen > 0) Err bitreich.org 70 i 65 printf("X-Fortune-Cookie: %s\r\n", fortunecookie); Err bitreich.org 70 i 66 printf("Content-Type: %s\r\n", ctype); Err bitreich.org 70 i 67 printf("X-Irritate: Be irritated.\r\n"); Err bitreich.org 70 i 68 printf("X-Use-Gopher: gophers://bitreich.org\r\n"); Err bitreich.org 70 i 69 printf("If-By-Whiskey: Terrorist\r\n"); Err bitreich.org 70 i 70 printf("X-Powered-By: love\r\n"); Err bitreich.org 70 i 71 printf("Permission-Policy: interest-cohort=()\r\n"); Err bitreich.org 70 i 72 printf("Fuck-Off: Google\r\n"); Err bitreich.org 70 i 73 printf("Server: bitreich-httpd/2.0\r\n"); Err bitreich.org 70 i 74 printf("X-Alarm: \r\n"); Err bitreich.org 70 i 75 printf("X-Goat-0: (_(\r\n"); Err bitreich.org 70 i 76 printf("X-Goat-1: /_/'_____/)\r\n"); Err bitreich.org 70 i 77 printf("X-Goat-2: \" | |\r\n"); Err bitreich.org 70 i 78 printf("X-Goat-3: |\"\"\"\"\"\"| \r\n"); Err bitreich.org 70 i 79 printf("Host: bitreich.org\r\n"); Err bitreich.org 70 i 80 printf("Connection: close\r\n"); Err bitreich.org 70 i 81 /* Have some fun with the websters. */ Err bitreich.org 70 i 82 printf("X-Fun-Begins: Yes!\r\n"); Err bitreich.org 70 i 83 printf("Content-Security: secure\r\n"); Err bitreich.org 70 i 84 printf("X-Cachwall-Reason: no reason\r\n"); Err bitreich.org 70 i 85 printf("X-Powered-By: binarysec\r\n"); Err bitreich.org 70 i 86 printf("X-Here-We-Match: squid\r\n"); Err bitreich.org 70 i 87 printf("aessecure-code: Kot\r\n"); Err bitreich.org 70 i 88 printf("X-CDN: jup\r\n"); Err bitreich.org 70 i 89 printf("X-Backside-Trans: ok\r\n"); Err bitreich.org 70 i 90 printf("X-dotDefender-denied: 1\r\n"); Err bitreich.org 70 i 91 printf("X-ASPNET-Version: got me\r\n"); Err bitreich.org 70 i 92 printf("X-Powered-By-360wzb: Of course!\r\n"); Err bitreich.org 70 i 93 printf("asp-id: here I am\r\n"); Err bitreich.org 70 i 94 printf("X-Not-Here: cloudfront\r\n"); Err bitreich.org 70 i 95 printf("WZWS-RAY: anyu yuuuuu\r\n"); Err bitreich.org 70 i 96 printf("Strict-Transport: Prussian\r\n"); Err bitreich.org 70 i 97 printf("X-Sucuri-Block: We are sucur!\r\n"); Err bitreich.org 70 i 98 printf("gladius_blockchain_driven_cyber_protection_network_session: oi!\r\n"); Err bitreich.org 70 i 99 printf("GW-Server: grey.wizard\r\n"); Err bitreich.org 70 i 100 printf("X-Cache: wt696969696969cdn\r\n"); Err bitreich.org 70 i 101 printf("X-Cache: YUNDUN\r\n"); Err bitreich.org 70 i 102 printf("X-Arrested: dosarrest\r\n"); Err bitreich.org 70 i 103 printf("X-Instart-Request-ID: dadadadada\r\n"); Err bitreich.org 70 i 104 printf("Via: 1.1 varnish\r\n"); Err bitreich.org 70 i 105 printf("X-Cachwall-Action: ACTION! SET!\r\n"); Err bitreich.org 70 i 106 printf("X-st8id33133: yeah\r\n"); Err bitreich.org 70 i 107 printf("X-Sucuri-ID: Curry is tasty.\r\n"); Err bitreich.org 70 i 108 printf("X-Varnish: 37337\r\n"); Err bitreich.org 70 i 109 printf("X-Powered-By: waf1337\r\n"); Err bitreich.org 70 i 110 printf("X-Instart-CacheKeyMod: ahahahahaha\r\n"); Err bitreich.org 70 i 111 } Err bitreich.org 70 i 112 Err bitreich.org 70 i 113 int Err bitreich.org 70 i 114 servefile(char *path, char *ctype, int sock) Err bitreich.org 70 i 115 { Err bitreich.org 70 i 116 struct stat st; Err bitreich.org 70 i 117 char *sendb, *sendi; Err bitreich.org 70 i 118 size_t bufsiz = BUFSIZ; Err bitreich.org 70 i 119 int len, sent, fd; Err bitreich.org 70 i 120 Err bitreich.org 70 i 121 fd = open(path, O_RDONLY); Err bitreich.org 70 i 122 if (fd < 0) { Err bitreich.org 70 i 123 print404(); Err bitreich.org 70 i 124 return 1; Err bitreich.org 70 i 125 } Err bitreich.org 70 i 126 Err bitreich.org 70 i 127 printf("HTTP/1.1 200 OK\r\n"); Err bitreich.org 70 i 128 printheaders(ctype); Err bitreich.org 70 i 129 Err bitreich.org 70 i 130 if (fstat(fd, &st) >= 0) Err bitreich.org 70 i 131 if ((bufsiz = st.st_blksize) < BUFSIZ) Err bitreich.org 70 i 132 bufsiz = BUFSIZ; Err bitreich.org 70 i 133 Err bitreich.org 70 i 134 printf("Content-Length: %ld\r\n", st.st_size); Err bitreich.org 70 i 135 printf("\r\n"); Err bitreich.org 70 i 136 fflush(stdout); Err bitreich.org 70 i 137 Err bitreich.org 70 i 138 sendb = xmalloc(bufsiz); Err bitreich.org 70 i 139 while ((len = read(fd, sendb, bufsiz)) > 0) { Err bitreich.org 70 i 140 sendi = sendb; Err bitreich.org 70 i 141 while (len > 0) { Err bitreich.org 70 i 142 if ((sent = write(sock, sendi, len)) < 0) { Err bitreich.org 70 i 143 free(sendb); Err bitreich.org 70 i 144 return 1; Err bitreich.org 70 i 145 } Err bitreich.org 70 i 146 len -= sent; Err bitreich.org 70 i 147 sendi += sent; Err bitreich.org 70 i 148 } Err bitreich.org 70 i 149 } Err bitreich.org 70 i 150 free(sendb); Err bitreich.org 70 i 151 Err bitreich.org 70 i 152 return 0; Err bitreich.org 70 i 153 } Err bitreich.org 70 i 154 Err bitreich.org 70 i 155 char * Err bitreich.org 70 i 156 read_line(int fd, int *len, int maxread) Err bitreich.org 70 i 157 { Err bitreich.org 70 i 158 char *buf; Err bitreich.org 70 i 159 int r, rbytes; Err bitreich.org 70 i 160 Err bitreich.org 70 i 161 buf = xmalloc(maxread+1); Err bitreich.org 70 i 162 memset(buf, 0, maxread+1); Err bitreich.org 70 i 163 Err bitreich.org 70 i 164 rbytes = 0; Err bitreich.org 70 i 165 while (rbytes < maxread) { Err bitreich.org 70 i 166 r = read(fd, &buf[rbytes], 1); Err bitreich.org 70 i 167 if (r < 0) { Err bitreich.org 70 i 168 free(buf); Err bitreich.org 70 i 169 return NULL; Err bitreich.org 70 i 170 } Err bitreich.org 70 i 171 if (r == 0) Err bitreich.org 70 i 172 break; Err bitreich.org 70 i 173 if (buf[rbytes] == '\n') { Err bitreich.org 70 i 174 buf[rbytes] = '\0'; Err bitreich.org 70 i 175 break; Err bitreich.org 70 i 176 } Err bitreich.org 70 i 177 rbytes += r; Err bitreich.org 70 i 178 } Err bitreich.org 70 i 179 Err bitreich.org 70 i 180 *len = rbytes; Err bitreich.org 70 i 181 return buf; Err bitreich.org 70 i 182 } Err bitreich.org 70 i 183 Err bitreich.org 70 i 184 int Err bitreich.org 70 i 185 main(int argc, char *argv[]) Err bitreich.org 70 i 186 { Err bitreich.org 70 i 187 char *wwwbase, *wwwindex, *request, *ctype, *path, *le_file, Err bitreich.org 70 i 188 *le_base, clienth[NI_MAXHOST], clientp[NI_MAXSERV], *zuccbase, Err bitreich.org 70 i 189 *requested, *header, *headerval, *hosthdr; Err bitreich.org 70 i 190 int rlen, i, user_agent_script_pid; Err bitreich.org 70 i 191 struct sockaddr_storage clt; Err bitreich.org 70 i 192 socklen_t cltlen = sizeof(clt); Err bitreich.org 70 i 193 time_t tim; Err bitreich.org 70 i 194 Err bitreich.org 70 i 195 hosthdr = NULL; Err bitreich.org 70 i 196 user_agent_script_pid = -1; Err bitreich.org 70 i 197 Err bitreich.org 70 i 198 wwwbase = "/bitreich/www"; Err bitreich.org 70 i 199 wwwindex = "index.html"; Err bitreich.org 70 i 200 Err bitreich.org 70 i 201 le_base = "/br/www/uacme"; Err bitreich.org 70 i 202 zuccbase = "/br/www/zuccless"; Err bitreich.org 70 i 203 Err bitreich.org 70 i 204 if (!getpeername(0, (struct sockaddr *)&clt, &cltlen)) { Err bitreich.org 70 i 205 if (getnameinfo((struct sockaddr *)&clt, cltlen, clienth, Err bitreich.org 70 i 206 sizeof(clienth), clientp, sizeof(clientp), Err bitreich.org 70 i 207 NI_NUMERICHOST|NI_NUMERICSERV)) { Err bitreich.org 70 i 208 clienth[0] = clientp[0] = '\0'; Err bitreich.org 70 i 209 } Err bitreich.org 70 i 210 if (!strncmp(clienth, "::ffff:", 7)) Err bitreich.org 70 i 211 memmove(clienth, clienth+7, strlen(clienth)-6); Err bitreich.org 70 i 212 } else { Err bitreich.org 70 i 213 clienth[0] = clientp[0] = '\0'; Err bitreich.org 70 i 214 } Err bitreich.org 70 i 215 Err bitreich.org 70 i 216 request = read_line(0, &rlen, 512); Err bitreich.org 70 i 217 if (request == NULL) Err bitreich.org 70 i 218 return 1; Err bitreich.org 70 i 219 if (request[rlen-1] == '\r') Err bitreich.org 70 i 220 request[rlen-1] = '\0'; Err bitreich.org 70 i 221 Err bitreich.org 70 i 222 /* Header parsing. */ Err bitreich.org 70 i 223 /* At max read 16 headers. Do not allow DDoS. */ Err bitreich.org 70 i 224 for (i = 0; i < 16; i++) { Err bitreich.org 70 i 225 header = read_line(0, &rlen, 512); Err bitreich.org 70 i 226 if (header == NULL || rlen == 0) Err bitreich.org 70 i 227 break; Err bitreich.org 70 i 228 if (header[rlen-1] == '\r') { Err bitreich.org 70 i 229 header[rlen-1] = '\0'; Err bitreich.org 70 i 230 if (rlen == 1) { Err bitreich.org 70 i 231 free(header); Err bitreich.org 70 i 232 break; Err bitreich.org 70 i 233 } Err bitreich.org 70 i 234 } Err bitreich.org 70 i 235 headerval = strchr(header, ':'); Err bitreich.org 70 i 236 if (headerval == NULL) { Err bitreich.org 70 i 237 free(header); Err bitreich.org 70 i 238 continue; Err bitreich.org 70 i 239 } Err bitreich.org 70 i 240 *headerval = '\0'; Err bitreich.org 70 i 241 headerval += 2; Err bitreich.org 70 i 242 if (headerval > (header + rlen)) { Err bitreich.org 70 i 243 free(header); Err bitreich.org 70 i 244 continue; Err bitreich.org 70 i 245 } Err bitreich.org 70 i 246 if (!strcasecmp(header, "user-agent")) { Err bitreich.org 70 i 247 user_agent_script_pid = fork(); Err bitreich.org 70 i 248 switch (user_agent_script_pid) { Err bitreich.org 70 i 249 case -1: Err bitreich.org 70 i 250 perror("fork"); Err bitreich.org 70 i 251 return 1; Err bitreich.org 70 i 252 case 0: Err bitreich.org 70 i 253 return execl("add-user-agent.sh", Err bitreich.org 70 i 254 "/home/annna/bin/modules/http-user-agent/add-user-agent.sh", Err bitreich.org 70 i 255 headerval, 0); Err bitreich.org 70 i 256 } Err bitreich.org 70 i 257 } Err bitreich.org 70 i 258 if (!strcasecmp(header, "host")) { Err bitreich.org 70 i 259 rlen = strlen(headerval); Err bitreich.org 70 i 260 hosthdr = xmalloc(rlen+1); Err bitreich.org 70 i 261 memset(hosthdr, 0, rlen+1); Err bitreich.org 70 i 262 strncpy(hosthdr, headerval, rlen); Err bitreich.org 70 i 263 } Err bitreich.org 70 i 264 free(header); Err bitreich.org 70 i 265 } Err bitreich.org 70 i 266 Err bitreich.org 70 i 267 if (strncmp(request, "GET ", 4)) Err bitreich.org 70 i 268 return 1; Err bitreich.org 70 i 269 Err bitreich.org 70 i 270 if (strstr(request, "s/bitreich.sh")) { Err bitreich.org 70 i 271 asprintf(&path, "%s/s/bitreich.sh", wwwbase); Err bitreich.org 70 i 272 ctype = "text/plain"; Err bitreich.org 70 i 273 } else if (strstr(request, "favicon.gif")) { Err bitreich.org 70 i 274 asprintf(&path, "%s/s/favicon.gif", wwwbase); Err bitreich.org 70 i 275 ctype = "image/gif"; Err bitreich.org 70 i 276 } else if (strstr(request, "deep-thinker.gif")) { Err bitreich.org 70 i 277 asprintf(&path, "%s/s/deep-thinker.gif", wwwbase); Err bitreich.org 70 i 278 ctype = "image/gif"; Err bitreich.org 70 i 279 } else if (strstr(request, "startup.mp3")) { Err bitreich.org 70 i 280 asprintf(&path, "%s/s/startup.mp3", wwwbase); Err bitreich.org 70 i 281 ctype = "audio/mpeg"; Err bitreich.org 70 i 282 } else if (strstr(request, "padme-hum.mp3")) { Err bitreich.org 70 i 283 asprintf(&path, "%s/s/padme-hum.mp3", wwwbase); Err bitreich.org 70 i 284 ctype = "audio/mpeg"; Err bitreich.org 70 i 285 } else if (strstr(request, "dickbutt")) { Err bitreich.org 70 i 286 asprintf(&path, Err bitreich.org 70 i 287 "/home/annna/bin/locate-cake-hater \"%s\" \"%s\"", Err bitreich.org 70 i 288 clienth, clientp); Err bitreich.org 70 i 289 system(path); Err bitreich.org 70 i 290 free(path); Err bitreich.org 70 i 291 asprintf(&path, "%s/s/dickbutt.jpg", wwwbase); Err bitreich.org 70 i 292 ctype = "image/jpeg"; Err bitreich.org 70 i 293 } else if (strstr(request, "bitreich.css")) { Err bitreich.org 70 i 294 asprintf(&path, "%s/s/bitreich.css", wwwbase); Err bitreich.org 70 i 295 ctype = "text/css"; Err bitreich.org 70 i 296 } else if (strstr(request, "neko.png")) { Err bitreich.org 70 i 297 asprintf(&path, "%s/s/neko.png", wwwbase); Err bitreich.org 70 i 298 ctype = "image/png"; Err bitreich.org 70 i 299 } else if (strstr(request, "yolo-css-")) { Err bitreich.org 70 i 300 /* We hate CSS in here. */ Err bitreich.org 70 i 301 sleep(1); Err bitreich.org 70 i 302 asprintf(&path, "%s/s/yolo-css.css", wwwbase); Err bitreich.org 70 i 303 ctype = "text/css"; Err bitreich.org 70 i 304 } else if ((le_file = strstr(request, ".well-known/acme-challenge/"))) { Err bitreich.org 70 i 305 /* Setup for Letsencrypt */ Err bitreich.org 70 i 306 le_file += strlen(".well-known/acme-challenge/"); Err bitreich.org 70 i 307 requested = strtok(le_file, " "); Err bitreich.org 70 i 308 if (strchr(requested, '/') != NULL) { Err bitreich.org 70 i 309 /* Get Zucced, no path exploitation. */ Err bitreich.org 70 i 310 asprintf(&path, "%s/zucc-job.webm", zuccbase); Err bitreich.org 70 i 311 ctype = "video/webm"; Err bitreich.org 70 i 312 } else { Err bitreich.org 70 i 313 /* Seems legit. */ Err bitreich.org 70 i 314 asprintf(&path, "%s/%s", le_base, requested); Err bitreich.org 70 i 315 ctype = "text/plain"; Err bitreich.org 70 i 316 } Err bitreich.org 70 i 317 } else { Err bitreich.org 70 i 318 if (hosthdr != NULL && strstr(hosthdr, "zuccless.org")) { Err bitreich.org 70 i 319 tim = time(NULL); Err bitreich.org 70 i 320 srandom(tim); Err bitreich.org 70 i 321 wwwbase = zuccbase; Err bitreich.org 70 i 322 switch (random() % 3) { Err bitreich.org 70 i 323 case 0: Err bitreich.org 70 i 324 asprintf(&path, "%s/zucc-job.webm", zuccbase); Err bitreich.org 70 i 325 break; Err bitreich.org 70 i 326 default: Err bitreich.org 70 i 327 asprintf(&path, "%s/zucc-meat.webm", zuccbase); Err bitreich.org 70 i 328 break; Err bitreich.org 70 i 329 } Err bitreich.org 70 i 330 ctype = "video/webm"; Err bitreich.org 70 i 331 } else { Err bitreich.org 70 i 332 asprintf(&path, "%s/%s", wwwbase, wwwindex); Err bitreich.org 70 i 333 ctype = "text/html"; Err bitreich.org 70 i 334 } Err bitreich.org 70 i 335 } Err bitreich.org 70 i 336 if (hosthdr != NULL) Err bitreich.org 70 i 337 free(hosthdr); Err bitreich.org 70 i 338 free(request); Err bitreich.org 70 i 339 Err bitreich.org 70 i 340 rlen = servefile(path, ctype, 1); Err bitreich.org 70 i 341 free(path); Err bitreich.org 70 i 342 Err bitreich.org 70 i 343 if (user_agent_script_pid != -1) { Err bitreich.org 70 i 344 if (waitpid(user_agent_script_pid, NULL, 0) < 0) { Err bitreich.org 70 i 345 perror("waitpid"); Err bitreich.org 70 i 346 return 1; Err bitreich.org 70 i 347 } Err bitreich.org 70 i 348 } Err bitreich.org 70 i 349 Err bitreich.org 70 i 350 return rlen; Err bitreich.org 70 i 351 } Err bitreich.org 70 i 352 Err bitreich.org 70 .