iAdd user-agent gathering for annna http-user-agent module. - 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
1commit e5dfc5fbfe93266da5edb1bb2e903734738296cf /scm/bitreich-httpd/commit/e5dfc5fbfe93266da5edb1bb2e903734738296cf.gph bitreich.org 70
1parent d0062f038d181b8d5eb150003ea7b50bcb5330f3 /scm/bitreich-httpd/commit/d0062f038d181b8d5eb150003ea7b50bcb5330f3.gph bitreich.org 70
hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70
iDate: Mon, 21 Aug 2023 22:17:11 +0200 Err bitreich.org 70
i Err bitreich.org 70
iAdd user-agent gathering for annna http-user-agent module. Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M bitreich-httpd.c | 89 ++++++++++++++++++++++++++++--- Err bitreich.org 70
i Err bitreich.org 70
i1 file changed, 82 insertions(+), 7 deletions(-) Err bitreich.org 70
i--- Err bitreich.org 70
1diff --git a/bitreich-httpd.c b/bitreich-httpd.c /scm/bitreich-httpd/file/bitreich-httpd.c.gph bitreich.org 70
i@@ -11,6 +11,7 @@ Err bitreich.org 70
i #include <sys/stat.h> Err bitreich.org 70
i #include <fcntl.h> Err bitreich.org 70
i #include <string.h> Err bitreich.org 70
i+#include <strings.h> Err bitreich.org 70
i #include <sys/socket.h> Err bitreich.org 70
i #include <netdb.h> Err bitreich.org 70
i #include <time.h> Err bitreich.org 70
i@@ -102,16 +103,48 @@ servefile(char *path, char *ctype, int sock) Err bitreich.org 70
i return 0; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i+char * Err bitreich.org 70
i+read_line(int fd, int *len, int maxread) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ char *buf; Err bitreich.org 70
i+ int r, rbytes; Err bitreich.org 70
i+ Err bitreich.org 70
i+ buf = xmalloc(maxread+1); Err bitreich.org 70
i+ memset(buf, 0, maxread+1); Err bitreich.org 70
i+ Err bitreich.org 70
i+ rbytes = 0; Err bitreich.org 70
i+ while (rbytes < maxread) { Err bitreich.org 70
i+ r = read(fd, &buf[rbytes], 1); Err bitreich.org 70
i+ if (r < 0) { Err bitreich.org 70
i+ free(buf); Err bitreich.org 70
i+ return NULL; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ if (r == 0) Err bitreich.org 70
i+ break; Err bitreich.org 70
i+ if (buf[rbytes] == '\n') { Err bitreich.org 70
i+ buf[rbytes] = '\0'; Err bitreich.org 70
i+ break; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ rbytes += r; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ Err bitreich.org 70
i+ *len = rbytes; Err bitreich.org 70
i+ return buf; Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i int Err bitreich.org 70
i main(int argc, char *argv[]) Err bitreich.org 70
i { Err bitreich.org 70
i- char *wwwbase, *wwwindex, request[512], *ctype, *path, *le_file, Err bitreich.org 70
i- *le_base, clienth[NI_MAXHOST], clientp[NI_MAXSERV], *zuccbase; Err bitreich.org 70
i+ char *wwwbase, *wwwindex, *request, *ctype, *path, *le_file, Err bitreich.org 70
i+ *le_base, clienth[NI_MAXHOST], clientp[NI_MAXSERV], *zuccbase, Err bitreich.org 70
i+ *requested, *header, *headerval, *hosthdr; Err bitreich.org 70
i int rlen; Err bitreich.org 70
i struct sockaddr_storage clt; Err bitreich.org 70
i socklen_t cltlen = sizeof(clt); Err bitreich.org 70
i time_t tim; Err bitreich.org 70
i Err bitreich.org 70
i+ hosthdr = NULL; Err bitreich.org 70
i+ Err bitreich.org 70
i wwwbase = "/bitreich/www"; Err bitreich.org 70
i wwwindex = "index.html"; Err bitreich.org 70
i Err bitreich.org 70
i@@ -130,11 +163,50 @@ main(int argc, char *argv[]) Err bitreich.org 70
i clienth[0] = clientp[0] = '\0'; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i- rlen = read(0, request, sizeof(request)-1); Err bitreich.org 70
i- if (rlen < 0) Err bitreich.org 70
i+ request = read_line(0, &rlen, 512); Err bitreich.org 70
i+ if (request == NULL) Err bitreich.org 70
i return 1; Err bitreich.org 70
i+ if (request[rlen-1] == '\r') Err bitreich.org 70
i+ request[rlen-1] = '\0'; Err bitreich.org 70
i Err bitreich.org 70
i- request[rlen] = '\0'; Err bitreich.org 70
i+ /* Header parsing. */ Err bitreich.org 70
i+ for (;;) { Err bitreich.org 70
i+ header = read_line(0, &rlen, 512); Err bitreich.org 70
i+ if (header == NULL) Err bitreich.org 70
i+ break; Err bitreich.org 70
i+ if (header[rlen-1] == '\r') { Err bitreich.org 70
i+ header[rlen-1] = '\0'; Err bitreich.org 70
i+ if (rlen == 1) { Err bitreich.org 70
i+ free(header); Err bitreich.org 70
i+ break; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } Err bitreich.org 70
i+ headerval = strchr(header, ':'); Err bitreich.org 70
i+ if (headerval == NULL) { Err bitreich.org 70
i+ free(header); Err bitreich.org 70
i+ continue; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ *headerval = '\0'; Err bitreich.org 70
i+ headerval += 2; Err bitreich.org 70
i+ if (headerval > (header + rlen)) { Err bitreich.org 70
i+ free(header); Err bitreich.org 70
i+ continue; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ if (!strcasecmp(header, "user-agent")) { Err bitreich.org 70
i+ asprintf(&path, Err bitreich.org 70
i+ "/home/annna/bin/modules/http-user-agent/add-user-agent.sh \"%s\"", Err bitreich.org 70
i+ headerval); Err bitreich.org 70
i+ system(path); Err bitreich.org 70
i+ free(path); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ if (!strcasecmp(header, "host")) { Err bitreich.org 70
i+ rlen = strlen(headerval); Err bitreich.org 70
i+ hosthdr = xmalloc(rlen+1); Err bitreich.org 70
i+ memset(hosthdr, 0, rlen+1); Err bitreich.org 70
i+ strncpy(hosthdr, headerval, rlen); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ free(header); Err bitreich.org 70
i+ } Err bitreich.org 70
i Err bitreich.org 70
i if (strncmp(request, "GET ", 4)) Err bitreich.org 70
i return 1; Err bitreich.org 70
i@@ -170,7 +242,7 @@ main(int argc, char *argv[]) Err bitreich.org 70
i } else if ((le_file = strstr(request, ".well-known/acme-challenge/"))) { Err bitreich.org 70
i /* Setup for Letsencrypt */ Err bitreich.org 70
i le_file += strlen(".well-known/acme-challenge/"); Err bitreich.org 70
i- char *requested = strtok(le_file, " "); Err bitreich.org 70
i+ requested = strtok(le_file, " "); Err bitreich.org 70
i if (strchr(requested, '/') != NULL) { Err bitreich.org 70
i /* Get Zucced, no path exploitation. */ Err bitreich.org 70
i asprintf(&path, "%s/zucc-job.webm", zuccbase); Err bitreich.org 70
i@@ -181,7 +253,7 @@ main(int argc, char *argv[]) Err bitreich.org 70
i ctype = "text/plain"; Err bitreich.org 70
i } Err bitreich.org 70
i } else { Err bitreich.org 70
i- if (strstr(request, "zuccless.org")) { Err bitreich.org 70
i+ if (strstr(hosthdr, "zuccless.org")) { Err bitreich.org 70
i tim = time(NULL); Err bitreich.org 70
i srandom(tim); Err bitreich.org 70
i wwwbase = zuccbase; Err bitreich.org 70
i@@ -199,6 +271,9 @@ main(int argc, char *argv[]) Err bitreich.org 70
i ctype = "text/html"; Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
i+ if (hosthdr != NULL) Err bitreich.org 70
i+ free(hosthdr); Err bitreich.org 70
i+ free(request); Err bitreich.org 70
i Err bitreich.org 70
i rlen = servefile(path, ctype, 1); Err bitreich.org 70
i free(path); Err bitreich.org 70
.
Response:
text/plain