#include #include #include #include #include #include #include #include #include #include #include /* gcc -c -o proxyshell_connect.o proxylib.c -fpic ld -shared -o proxyshell_connect.so proxyshell_connect.o -ldl */ #ifdef connect #undef connect #endif /* export LD_PRELOAD=/path/to/proxyshell_connect.so export SHELLPROXYHOST=192.168.1.16:1280 */ #define PROXYHOSTENV "SHELLPROXYHOST" #define DEFAULTPORT 1280 int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); static void* original(char* func); int (*real_connect)(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen) = NULL; int main (int argc, char *argv[]) { int sd, rc, i; struct sockaddr_in localAddr, servAddr; struct hostent *h; sd = socket(AF_INET, SOCK_STREAM, 0); localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = htonl(INADDR_ANY); localAddr.sin_port = htons(0); rc = connect(sd, (struct sockaddr *) &localAddr, sizeof(servAddr)); } int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen){ char *proxyhost,*tmphost,*tmpport; int retval; unsigned short port; struct sockaddr_in shellcodeaddr; if(!real_connect){ real_connect = original("connect"); } if(serv_addr->sa_family == 2){ if((proxyhost = getenv(PROXYHOSTENV))){ if(!(tmphost = calloc(1,strlen(proxyhost)+1))){ perror("call to calloc failed"); exit(-1); } strcpy(tmphost,proxyhost); if((tmpport = strstr(tmphost,":")) && strlen(tmpport)){ tmpport[0] = 0; tmpport++; port = (unsigned short)atoi(tmpport); }else{ port = (unsigned short)DEFAULTPORT; } }else{ perror("env variable PROXYHOSTENV was not found"); exit(-2); } shellcodeaddr.sin_family = 2; shellcodeaddr.sin_addr.s_addr = inet_addr(tmphost); shellcodeaddr.sin_port = htons(port); free(tmphost); if(!(retval = real_connect(sockfd, (struct sockaddr *)&shellcodeaddr,sizeof(shellcodeaddr)))){ send(sockfd,serv_addr,addrlen,0); } return retval; }else{ return real_connect(sockfd, serv_addr, addrlen ); } } static void* original(char* func){ void* libc_handle, *func_addr; if(!(libc_handle = dlopen("libc.so", RTLD_LAZY))){ if(!(libc_handle = dlopen("libc.so.6", RTLD_LAZY))){ if(!(libc_handle = dlopen("libc.so.5", RTLD_LAZY))) { fprintf(stderr, "Error ldopening libc!\n"); return NULL; } } } func_addr = dlsym(libc_handle, func); if(func_addr) return func_addr; fprintf(stderr, "Unable to locate %s\n", func); return NULL; } // milw0rm.com [2006-02-07]