From fc80b4573c7df664bac0294845973f299579c9a6 Mon Sep 17 00:00:00 2001 From: david Date: Sun, 5 May 2013 10:43:53 +0000 Subject: [PATCH] Track proxy socklen and pass it on to targetlen. Patch by Joachim Henke. http://seclists.org/nmap-dev/2013/q1/413 --- ncat/ncat_core.c | 4 ++-- ncat/ncat_core.h | 4 ++-- ncat/ncat_main.c | 14 +++++++++++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/ncat/ncat_core.c b/ncat/ncat_core.c index c4d314388..6813bc728 100644 --- a/ncat/ncat_core.c +++ b/ncat/ncat_core.c @@ -118,8 +118,8 @@ size_t srcaddrlen; union sockaddr_u targetss; size_t targetsslen; -union sockaddr_u httpconnect; -union sockaddr_u socksconnect; +union sockaddr_u httpconnect, socksconnect; +size_t httpconnectlen, socksconnectlen; /* Global options structure. */ struct options o; diff --git a/ncat/ncat_core.h b/ncat/ncat_core.h index 96977818d..caee21abb 100644 --- a/ncat/ncat_core.h +++ b/ncat/ncat_core.h @@ -107,8 +107,8 @@ extern size_t srcaddrlen; extern union sockaddr_u targetss; extern size_t targetsslen; -extern union sockaddr_u httpconnect; -extern union sockaddr_u socksconnect; +extern union sockaddr_u httpconnect, socksconnect; +extern size_t httpconnectlen, socksconnectlen; struct options { unsigned short portno; diff --git a/ncat/ncat_main.c b/ncat/ncat_main.c index 59b80124a..084f17cea 100644 --- a/ncat/ncat_main.c +++ b/ncat/ncat_main.c @@ -118,7 +118,7 @@ static int ncat_connect_mode(void); static int ncat_listen_mode(void); /* Determines if it's parsing HTTP or SOCKS by looking at defport */ -static void parseproxy(char *str, struct sockaddr_storage *ss, unsigned short defport) +static size_t parseproxy(char *str, struct sockaddr_storage *ss, unsigned short defport) { char *c = strrchr(str, ':'), *ptr; int httpproxy = (defport == DEFAULT_PROXY_PORT); @@ -143,6 +143,8 @@ static void parseproxy(char *str, struct sockaddr_storage *ss, unsigned short de loguser("Did you specify the port number? It's required for IPv6.\n"); exit(EXIT_FAILURE); } + + return sslen; } /* These functions implement a simple linked list to hold allow/deny @@ -589,11 +591,11 @@ int main(int argc, char *argv[]) * colons in the IPv6 address and host:port separator). */ - parseproxy(proxyaddr, &httpconnect.storage, DEFAULT_PROXY_PORT); + httpconnectlen = parseproxy(proxyaddr, &httpconnect.storage, DEFAULT_PROXY_PORT); } else if (!strcmp(o.proxytype, "socks4") || !strcmp(o.proxytype, "4")) { /* Parse SOCKS proxy address and temporarily store it in socksconnect */ - parseproxy(proxyaddr, &socksconnect.storage, DEFAULT_SOCKS4_PORT); + socksconnectlen = parseproxy(proxyaddr, &socksconnect.storage, DEFAULT_SOCKS4_PORT); } else { bye("Invalid proxy type \"%s\".", o.proxytype); } @@ -754,12 +756,18 @@ int main(int argc, char *argv[]) */ if (httpconnect.storage.ss_family != AF_UNSPEC) { union sockaddr_u tmp = targetss; + size_t tmplen = targetsslen; targetss = httpconnect; + targetsslen = httpconnectlen; httpconnect = tmp; + httpconnectlen = tmplen; } else if (socksconnect.storage.ss_family != AF_UNSPEC) { union sockaddr_u tmp = targetss; + size_t tmplen = targetsslen; targetss = socksconnect; + targetsslen = socksconnectlen; socksconnect = tmp; + socksconnectlen = tmplen; } if (o.proto == IPPROTO_UDP) {