Proxychains : proxyfier n'importe quelle connexion vers l'extérieur

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Ahhhh les proxy au taf ou à l'école !!! C'est pénible ! Bref, il arrive parfois que l'on souhaites vraiment avoir accès temporairement à l'extérieur. Quelles que soient les commandes que vous utilisez vous aurez ou non la possibilité de configurer l'utilisation d'un proxy en modifiant un fichier de configuration, une variable de d'environnement etc...

L'intérêt de proxychains est que la configuration ne se fait qu'une seule fois, dans son propre fichier de configuration. Ensuite vous utilisez la syntaxe proxychains <command> <args> et votre commande utilisera le proxy spécifié dans le fichier de configuration de proxychains !

Proxychains.png

2 Installation

2.1 Debian

Command aptitude
aptitude install proxychains

2.2 Mac OS X

Sur Mac OS X, ce n'est toujours pas dans MacPort alors il va falloir patcher des sources pour arriver à le faire fonctionner sur Mac. Copiez donc ce diff sur votre machine :

Configuration File proxychains-3.1_osx.diff
diff -ruN proxychains-3.1/proxychains/Makefile.in proxychains-3.1_resolv/proxychains/Makefile.in
--- proxychains-3.1/proxychains/Makefile.in	2006-03-15 10:16:59.000000000 -0600
+++ proxychains-3.1_resolv/proxychains/Makefile.in	2011-06-16 13:17:20.000000000 -0500
@@ -121,7 +121,7 @@
 LIBS = @LIBS@
 libproxychains_la_DEPENDENCIES = 
 libproxychains_la_OBJECTS =  libproxychains.lo core.lo
-CFLAGS = @CFLAGS@
+CFLAGS = @CFLAGS@ -arch x86_64 -arch i386 
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
diff -ruN proxychains-3.1/proxychains/core.c proxychains-3.1_resolv/proxychains/core.c
--- proxychains-3.1/proxychains/core.c	2006-03-15 10:16:59.000000000 -0600
+++ proxychains-3.1_resolv/proxychains/core.c	2011-06-16 13:17:19.000000000 -0500
@@ -35,12 +35,18 @@
 #include <fcntl.h>
 #include <time.h>
 #include <stdarg.h>
+#include <dlfcn.h>
 #include "core.h"
 
 extern int tcp_read_time_out;
 extern int tcp_connect_time_out;
 extern int proxychains_quiet_mode;
-
+extern connect_t true_connect;
+extern getaddrinfo_t true_getaddrinfo;
+extern freeaddrinfo_t true_freeaddrinfo;
+extern getnameinfo_t true_getnameinfo;
+extern gethostbyaddr_t true_gethostbyaddr;
+ 
 static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
 static void encode_base_64(char* src,char* dest,int max_len)
@@ -159,13 +165,14 @@
 
 	pfd[0].fd=sock;
 	pfd[0].events=POLLOUT;	
-	fcntl(sock, F_SETFL, O_NONBLOCK);
+	fcntl(sock, F_SETFL, O_NONBLOCK); 
   	ret=true_connect(sock, addr,  len);
-//	printf("\nconnect ret=%d\n",ret);fflush(stdout);
+//	printf("\nconnect ret=%d\n",ret); fflush(stdout);
+
   	if(ret==-1 && errno==EINPROGRESS)
    	{
     		ret=poll(pfd,1,tcp_connect_time_out);
-//      		printf("\npoll ret=%d\n",ret);fflush(stdout);
+//	     		printf("\npoll ret=%d\n",ret);fflush(stdout);
       		if(ret==1)
         	{
            		value_len=sizeof(int);
@@ -388,14 +395,18 @@
 				inet_ntoa(*(struct in_addr*)&pd->ip),
 				htons(pd->port));
 	pd->ps=PLAY_STATE;
+
 	bzero(&addr,sizeof(addr));
+
 	addr.sin_family = AF_INET;
 	addr.sin_addr.s_addr = pd->ip;
 	addr.sin_port = pd->port;
+
 	if (timed_connect (*fd ,(struct sockaddr*)&addr,sizeof(addr))) {
 		pd->ps=DOWN_STATE;
 		goto error1;
 	}
+
 	pd->ps=BUSY_STATE;
 	return SUCCESS;
 error1:
@@ -641,7 +652,7 @@
 			dup2(pipe_fd[1],1);
 			//dup2(pipe_fd[1],2);
 		//	putenv("LD_PRELOAD=");
-			execlp("proxyresolv","proxyresolv",name,NULL);
+			execlp("./proxyresolv","proxyresolv",name,NULL);
 			perror("can't exec proxyresolv");
 			exit(2);
 
diff -ruN proxychains-3.1/proxychains/core.h proxychains-3.1_resolv/proxychains/core.h
--- proxychains-3.1/proxychains/core.h	2006-03-15 10:16:59.000000000 -0600
+++ proxychains-3.1_resolv/proxychains/core.h	2011-06-16 13:17:19.000000000 -0500
@@ -66,29 +66,28 @@
 int proxychains_write_log(char *str,...);
 struct hostent* proxy_gethostbyname(const char *name);
 
+typedef struct hostent* (*gethostbyname_t)(const char *);
+static gethostbyname_t true_gethostbyname;
 
 typedef int (*connect_t)(int, const struct sockaddr *, socklen_t);
-connect_t true_connect;
-
-typedef struct hostent* (*gethostbyname_t)(const char *);
-gethostbyname_t true_gethostbyname;
+// connect_t true_connect;
 
 typedef int (*getaddrinfo_t)(const char *, const char *,
 		const struct addrinfo *,
 		struct addrinfo **);
-getaddrinfo_t true_getaddrinfo;
+// getaddrinfo_t true_getaddrinfo;
 
 typedef int (*freeaddrinfo_t)(struct addrinfo *);
-freeaddrinfo_t true_freeaddrinfo;
+// freeaddrinfo_t true_freeaddrinfo;
 
 typedef int (*getnameinfo_t) (const struct sockaddr *,
 		socklen_t, char *,
 		socklen_t, char *,
 		socklen_t, unsigned int);
-getnameinfo_t true_getnameinfo;
+// getnameinfo_t true_getnameinfo;
 
 typedef struct hostent *(*gethostbyaddr_t) (const void *, socklen_t, int);
-gethostbyaddr_t true_gethostbyaddr;
+// gethostbyaddr_t true_gethostbyaddr;
 
 int proxy_getaddrinfo(const char *node, const char *service,
 		                const struct addrinfo *hints,
diff -ruN proxychains-3.1/proxychains/libproxychains.c proxychains-3.1_resolv/proxychains/libproxychains.c
--- proxychains-3.1/proxychains/libproxychains.c	2006-03-15 10:16:59.000000000 -0600
+++ proxychains-3.1_resolv/proxychains/libproxychains.c	2011-06-16 13:17:19.000000000 -0500
@@ -32,7 +32,6 @@
 #include <sys/fcntl.h>
 #include <dlfcn.h>
 
-
 #include "core.h"
 
 #define     satosin(x)      ((struct sockaddr_in *) &(x))
@@ -57,6 +56,13 @@
 	unsigned int *proxy_count,
 	chain_type *ct);
 
+connect_t true_connect;
+getaddrinfo_t true_getaddrinfo;
+freeaddrinfo_t true_freeaddrinfo;
+getnameinfo_t true_getnameinfo;
+gethostbyaddr_t true_gethostbyaddr;
+
+
 static void init_lib()
 {
 //	proxychains_write_log("ProxyChains-"VERSION
@@ -291,7 +297,7 @@
 int getnameinfo (const struct sockaddr * sa,
 			socklen_t salen, char * host,
 			socklen_t hostlen, char * serv,
-			socklen_t servlen, unsigned int flags)
+			socklen_t servlen, int flags)
 {
 	int ret = 0;
 	if(!init_l)
diff -ruN proxychains-3.1/proxychains/proxychains proxychains-3.1_resolv/proxychains/proxychains
--- proxychains-3.1/proxychains/proxychains	2006-03-15 10:16:59.000000000 -0600
+++ proxychains-3.1_resolv/proxychains/proxychains	2011-06-16 13:17:20.000000000 -0500
@@ -1,9 +1,11 @@
 #!/bin/sh
 echo "ProxyChains-3.1 (http://proxychains.sf.net)"
+echo "Mod for OSX - using dylib"
 if [ $# = 0 ] ; then
 	echo "	usage:"
 	echo "		proxychains <prog> [args]"
 	exit
 fi
-export LD_PRELOAD=libproxychains.so
+export DYLD_FORCE_FLAT_NAMESPACE=
+export DYLD_INSERT_LIBRARIES=./.libs/libproxychains.3.0.0.dylib
 exec "$@"
diff -ruN proxychains-3.1/proxychains/proxyresolv proxychains-3.1_resolv/proxychains/proxyresolv
--- proxychains-3.1/proxychains/proxyresolv	2006-03-15 10:16:59.000000000 -0600
+++ proxychains-3.1_resolv/proxychains/proxyresolv	2011-06-16 13:18:51.000000000 -0500
@@ -11,6 +11,6 @@
 	exit
 fi
 
-
-export LD_PRELOAD=libproxychains.so
-dig $1 @$DNS_SERVER +tcp | awk '/A.+[0-9]+\.[0-9]+\.[0-9]/{print $5;}'
+export DYLD_FORCE_FLAT_NAMESPACE=
+export DYLD_INSERT_LIBRARIES=./.libs/libproxychains.3.0.0.dylib
+dig $1 @$DNS_SERVER +tcp | awk '/^[^;].+A.+[0-9]+\.[0-9]+\.[0-9]/{print $5;}'

Puis compilons la bête :

Command
wget -O proxychains-3.1.tar.gz "http://prdownloads.sourceforge.net/proxychains/proxychains-3.1.tar.gz?download"
tar -xzf proxychains-3.1.tar.gz
patch -p0 < proxychains-3.1_osx.diff
cd proxychains-3.1 
./configure
make
cd proxychains
sudo cp proxychains proxyresolv /usr/sbin/

3 Configuration

Vous pouvez utiliser votre fichier de configuration personnel dans '~/proxychains/proxychains.conf' ou celui pour la machine '/etc/proxychains' :

Configuration File ~/proxychains/proxychains.conf
strict_chain 
# Quiet mode (no output from library)
quiet_mode 
# Proxy DNS requests - no leak for DNS data
#proxy_dns 
# Some timeouts in milliseconds
tcp_read_time_out 15000
tcp_connect_time_out 8000
 
[ProxyList]
socks5 127.0.0.1 12345

Utilisez pour le socks, le port que nous allons ouvrir ensuite via SSH.

4 Utilisation

Pour arriver à faire fonctionner une application qui n'a pas d'options de proxy socks, qui utilise le protocole tcp et que vous voulez permettre l'accès vers l'extérieur, il va falloir dans un promier temps monter un proxy socks à l'aide d'SSH : Pour lancer une connexion SSH en ouvrant proxy socks, il vous suffit de lancer depuis le serveur A :

Command ssh
ssh -D <port> <user>@<destination>

soit par exemple :

Command ssh
ssh -D 12345 user@serverB

Puis faire sortir le traffic d'une application, en utilisant la commande proxychains :

Command proxychains
proxychains mon_appli

5 Ressources

http://proxychains.sourceforge.net/
http://lesdatabases.blogspot.com/2011/06/proxychains-ou-l-de-proxifier.html
http://chrootlabs.org/bgt/proxychains_osx.html