From 04b9a0097bb4f0bbc37194233dad35f0bf9e0133 Mon Sep 17 00:00:00 2001 From: ruti <> Date: Mon, 16 Oct 2023 14:44:24 +0200 Subject: [PATCH] custom ttl option --- desync.c | 5 +++++ main.c | 59 +++++++++++++++++++++++++++++++++++--------------------- params.h | 1 + proxy.c | 10 +++++++++- 4 files changed, 52 insertions(+), 23 deletions(-) diff --git a/desync.c b/desync.c index e62c47b..4b9adc7 100644 --- a/desync.c +++ b/desync.c @@ -168,6 +168,11 @@ int desync(int sfd, char *buffer, } LOG(LOG_L, "split pos: %d, n: %ld\n", pos, n); + if (params.custom_ttl) { + if (setttl(sfd, params.def_ttl, fa) < 0) { + return -1; + } + } if (pos <= 0 || pos >= n || params.attack == DESYNC_NONE || (!type && params.de_known)) diff --git a/main.c b/main.c index da741e6..0b4c6e2 100644 --- a/main.c +++ b/main.c @@ -36,6 +36,7 @@ struct params params = { .attack = DESYNC_NONE, .split_host = 0, .def_ttl = 0, + .custom_ttl = 0, .mod_http = 0, .de_known = 0, @@ -61,11 +62,12 @@ const char help_text[] = { " -c, --max-conn Connection count limit, default 512\n" " -N, --no-domain Deny domain resolving\n" " -I --conn-ip Connection binded IP, default ::\n" - " -b, --bfs Buffer size, default 16384\n" - //" -L, --nodelay <0 or 1> Set TCP_NODELAY option\n" - " -S, --snd-buf Set SO_SNDBUF option\n" - " -R, --rcv-buf Set SO_RCVBUF option\n" + " -b, --buf-size Buffer size, default 16384\n" " -x, --debug Print logs, 0, 1 or 2\n" + //" -L, --nodelay <0 or 1> Set TCP_NODELAY option\n" + " -S, --snd-buf Set SO_SNDBUF option for out. conn.\n" + " -R, --rcv-buf Set SO_RCVBUF option for out. conn.\n" + " -g, --def-ttl TTL for all outgoing connections\n" // desync options " -K, --desync-known Desync only HTTP and TLS with SNI\n" #ifdef FAKE_SUPPORT @@ -95,7 +97,7 @@ const struct option options[] = { {"ip", 1, 0, 'i'}, {"port", 1, 0, 'p'}, {"conn-ip", 1, 0, 'I'}, - {"bfs", 1, 0, 'b'}, + {"buf-size", 1, 0, 'b'}, //{"nodelay", 1, 0, 'L'}, {"snd-buf", 1, 0, 'S'}, {"rcv-buf", 1, 0, 'R'}, @@ -113,7 +115,7 @@ const struct option options[] = { {"tls-sni", 1, 0, 'n'}, #endif {"mod-http", 1, 0, 'M'}, - {"global-ttl", 1, 0, 'g'}, // + {"def-ttl", 1, 0, 'g'}, {"delay", 1, 0, 'w'}, // {0} @@ -151,6 +153,7 @@ char *ftob(char *name, ssize_t *sl) return buffer; } + void daemonize(void) { pid_t pid = fork(); @@ -162,7 +165,7 @@ void daemonize(void) exit(0); } if (setsid() < 0) { - exit(1); + exit(1); } close(STDIN_FILENO); close(STDOUT_FILENO); @@ -173,6 +176,7 @@ void daemonize(void) dup(0); } + int get_addr(char *str, struct sockaddr_ina *addr) { struct addrinfo hints = {0}, *res = 0; @@ -193,6 +197,24 @@ int get_addr(char *str, struct sockaddr_ina *addr) } +int get_default_ttl() +{ + int orig_ttl = -1, fd; + socklen_t tsize = sizeof(orig_ttl); + + if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("socket"); + return -1; + } + if (getsockopt(fd, IPPROTO_IP, IP_TTL, + (char *)&orig_ttl, &tsize) < 0) { + perror("getsockopt IP_TTL"); + } + close(fd); + return orig_ttl; +} + + int main(int argc, char **argv) { struct sockaddr_ina s = { @@ -338,9 +360,11 @@ int main(int argc, char **argv) case 'd': params.attack = DESYNC_DISORDER; break; + #ifdef FAKE_SUPPORT case 'f': params.attack = DESYNC_FAKE; break; + #endif default: invalid = 1; } @@ -408,12 +432,14 @@ int main(int argc, char **argv) } break; - case 'g': // + case 'g': val = strtol(optarg, &end, 0); if (val <= 0 || val > 255 || *end) invalid = 1; - else + else { params.def_ttl = val; + params.custom_ttl = 1; + } break; case 'w': // @@ -466,21 +492,10 @@ int main(int argc, char **argv) fclose(file); } - if (!params.def_ttl) { - int orig_ttl, fd; - socklen_t tsize = sizeof(orig_ttl); - if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - perror("socket"); - return -1; - } - if (getsockopt(fd, IPPROTO_IP, IP_TTL, - (char *)&orig_ttl, &tsize) < 0) { - perror("getsockopt IP_TTL"); - close(fd); + if (!params.def_ttl && params.attack != DESYNC_NONE) { + if ((params.def_ttl = get_default_ttl()) < 1) { return -1; } - close(fd); - params.def_ttl = orig_ttl; } return listener(s); diff --git a/params.h b/params.h index 8e10b5e..3416e11 100644 --- a/params.h +++ b/params.h @@ -16,6 +16,7 @@ struct params { enum demode attack; char split_host; int def_ttl; + char custom_ttl; int mod_http; char ipv6; diff --git a/proxy.c b/proxy.c index 8ea7c62..1a358d5 100644 --- a/proxy.c +++ b/proxy.c @@ -272,6 +272,12 @@ int create_conn(struct poolhd *pool, if (params.baddr.sin6_family == AF_INET6) { map_fix(&addr, 6); + } else { + map_fix(&addr, 0); + } + if (addr.sa.sa_family != params.baddr.sin6_family) { + fprintf(stderr, "different addresses family\n"); + return -1; } int sfd = nb_socket(addr.sa.sa_family, SOCK_STREAM); if (sfd < 0) { @@ -408,7 +414,9 @@ static inline int on_accept(struct poolhd *pool, struct eval *val) continue; } #endif - if (setopts(c) < 0) { + if (setsockopt(c, IPPROTO_TCP, TCP_NODELAY, + (char *)¶ms.nodelay, sizeof(params.nodelay))) { + perror("setsockopt TCP_NODELAY"); close(c); continue; }