tsocks buggy / DNS wrap?

Stefan `Sec` Zehl sec at 42.org
Wed Aug 3 01:41:10 UTC 2005


Hi,

I have just installed tor just to try it out.

I have noticed, that the supplied tsocks (called by torify) is somehow
buggy. For example my "ircii" fails to connect anywhere while running
under it.

While browsing the websites, i noticed a pointer to proxychains, which
seemed to work better for me.

While I don't really have problems with leaking DNS packets, i found it
unsatisfying not to be able to access *.onion sites easily, so I quickly
hacked some code into proxychains which wrapped getaddrinfo() to return
a 0.0.0.* address, and (socks5)-connect to translate these back into a
name before connecting.

The code is not very clean (tested only under freebsd 5.x), and misses a
few things (e.g. a wrapper for gethostbyname() ). I have successfully
tried it with "telnet" and "w3m" on FreeBSD.

Before I do that, I wanted to ask what you think of that idea. Do you
think its worthwhile to have, and might even be included?

CU,
    Sec

--- proxychains/core.c.orig	Wed Aug  3 03:36:46 2005
+++ proxychains/core.c	Wed Aug  3 03:37:26 2005
@@ -36,6 +36,8 @@
 #include <stdarg.h>
 #include "core.h"
 
+extern unsigned char hnum;
+extern char * hnames[MAXH];
 extern int tcp_read_time_out;
 extern int tcp_connect_time_out;
 extern int proxychains_quiet_mode;
@@ -335,13 +337,35 @@
      				buff[0]=5;       // version
 				buff[1]=1;       // connect
 				buff[2]=0;       // reserved
-				buff[3]=1;       // ip v4
 
+				int len;
+				if((ntohl(ip)<256)&&(ntohl(ip)>0)){
+					  if(ntohl(ip)>hnum){
+						    printf("Illegal Onion\n");
+						    return SOCKET_ERROR;
+					  };
+					  char * hostname=hnames[ntohl(ip)];
+					  len=strlen(hostname);
+					  if(len>250){
+						    printf("Hostname too long\n");
+						    return SOCKET_ERROR;
+					  };
+
+					  printf("Unresolving: %d to %s[%d]\n",
+						    ntohl(ip),hostname,len);
+					  buff[3]=3;       // DOMAINNAME
+					  buff[4]=(char)len;
+					  memcpy(&buff[5],hostname,len); // dest host
+					  len++;
+				}else{
+					  buff[3]=1;       // ip v4
 			 	memcpy(&buff[4],&ip,4); // dest host
-				memcpy(&buff[8],&port,2); // dest port
+					  len=4;
+				}
+				memcpy(&buff[4+len],&port,2); // dest port
 				
 
-			      if(10!=write_n_bytes(sock,buff,10))
+			      if((4+len+2)!=write_n_bytes(sock,buff,(4+len+2)))
 					return SOCKET_ERROR;
 		
 			      if(4!=read_n_bytes(sock,buff,4))
--- proxychains/core.h.orig	Wed Aug  3 03:36:52 2005
+++ proxychains/core.h	Wed Aug  3 03:37:26 2005
@@ -73,3 +73,6 @@
 
 
 #endif
+
+#define MAXH 5
+
--- proxychains/libproxychains.c.orig	Wed Aug  3 03:37:07 2005
+++ proxychains/libproxychains.c	Wed Aug  3 03:37:31 2005
@@ -32,6 +32,7 @@
 #include <sys/fcntl.h>
 
 
+#include <dlfcn.h>
 #include "core.h"
 
 #define     satosin(x)      ((struct sockaddr_in *) &(x))
@@ -41,6 +42,9 @@
 #define     SOCKFAMILY(x)     (satosin(x)->sin_family)
 #define     MAX_CHAIN 30*1024
 
+char * hnames[MAXH];
+unsigned char hnum=0;
+
 int tcp_read_time_out;
 int tcp_connect_time_out;
 chain_type proxychains_ct;
@@ -162,4 +166,67 @@
 	errno=ECONNREFUSED;
   return ret;
 }
+
+struct hostent* gethostbyname(const char *name){
+	  printf("gethostbyname: %s\n");
+	  return _gethostbyname(name);
+};
+
+int getaddrinfo(const char *hostname, const char *servname,
+		    const struct addrinfo *hints, struct addrinfo **res){
+
+	  int hlen=strlen(hostname);
+	  char *redir =".onion";
+	  int rlen=strlen(redir);
+
+	  struct addrinfo *ai;
+
+	  if ((hostname != NULL) && (hlen>=rlen)){
+		    if(strcmp(redir,hostname+hlen-rlen)==0){
+				printf("Captured Onion!\n");
+
+				/* New Onion */
+				hnum++;
+				if(hnum>=MAXH){
+					  printf("Onion cache full\n");
+					  return EAI_FAIL;
+				};
+				hnames[hnum]=malloc(strlen(hostname)+1);
+				strcpy(hnames[hnum],hostname);
+
+ai=malloc(sizeof(*ai));
+memset(ai, 0, sizeof(*ai));
+
+struct sockaddr_in * sin;
+sin=malloc(sizeof(*sin));
+memset(sin, 0, sizeof(*sin));
+sin->sin_len=sizeof(*sin);
+sin->sin_family=AF_INET;
+sin->sin_port=htons(atoi(servname));
+sin->sin_addr.s_addr=htonl(hnum);
+
+ai->ai_flags=0;    
+ai->ai_family=AF_INET;
+ai->ai_socktype=SOCK_STREAM;
+ai->ai_protocol=IPPROTO_TCP;
+ai->ai_addrlen=sizeof(*sin);
+ai->ai_canonname=NULL;
+ai->ai_addr=sin;
+ai->ai_next=NULL;
+
+
+				*res=ai;
+				return 0;
+		    };
+	  };
+	  printf("getaddrinfo: %s %s\n",hostname,servname);
+
+	  int (*libc_getaddrinfo)(const char *hostname, const char *servname,
+				const struct addrinfo *hints, struct addrinfo **res)=
+		    dlsym(RTLD_NEXT, "getaddrinfo");
+
+	  return libc_getaddrinfo(hostname, servname, hints, res);
+};
+
+// void freeaddrinfo(struct addrinfo *ai);
 
-- 
| Kevin Dalley on Melissa being Open Source:
While the Melissa license is a bit unclear, Melissa aggressively
encourages free distribution of its source code.



More information about the tor-dev mailing list