"Cacher votre IP behind a BNC" ou/or "spoofez-vous" _________________ | | | | | | <- C'est un nain | | juif vieux de 106 | | ans cacher derriere |_________________| un cube blanc. Cette article est concacré pour les lecteurs possedant un access Shell sur une machine (root ou pas) d'ou vous pourriez compiler des codes sources et les executer ( et non , cela ne s'applique pas sur les shells gratuit ). Le sujet de cette article est de vous montrez comment changer votre Host(IP/DNS) via Internet. Utilisable a distance. Il s'agit d'un Bouncer (BNC) tres simple a installer.Creer dans votre home(shell) un sous repertoire nommez bnc et placer y les 2 fichiers suivant: --------------------------------------BNC.C-------------- #include #include #include #include #include #include #include #include #include #include #include #include #include extern h_errno; int pt,mu,dp,cu,po; char ps[20]; char vhostname[256] = ""; void child_killer(int s) { wait(NULL); cu--; signal(SIGCHLD, child_killer); } int do_connect(char *hostname, u_short port) { int s; struct hostent *he; struct sockaddr_in sin; s = socket(AF_INET, SOCK_STREAM, 0); if(s < 0) return -2; memset(&sin, 0, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = ( *vhostname ? inet_addr(vhostname) : INADDR_ANY ); if(sin.sin_addr.s_addr == -1 && *vhostname) { he = gethostbyname(vhostname); if(!he) return -1; memcpy(&sin.sin_addr, he->h_addr, he->h_length); } if(bind(s, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) < 0) { perror("bind"); exit(0); } memset(&sin, 0, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_port = htons(port); sin.sin_addr.s_addr = inet_addr(hostname); if(sin.sin_addr.s_addr == -1) { he = gethostbyname(hostname); if(!he) return -1; memcpy(&sin.sin_addr, he->h_addr, he->h_length); } if(connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { close(s); return -2; } return s; } server(int s) { int sock_c=-1; int maxfd = s+1; char buffer[1024]; char user[1024]; char nick[100]; char tm[2]; int u,n,p,up; fd_set rset; u_short myport; char *cmd, *server, *port,*nck,*pass,*spass; char myserver[1024]; char spast[30]; strcpy(tm," "); u=1; n=1; p=0; if(po) p=1; while((u+n+p)&&3){ memset(buffer,0,1023); while(tm[0]!='\n'||strlen(buffer)<=0){ memset(tm,0,2); if(read(s,tm,1) <= 0){ close(s); return; } strncat(buffer,tm,1); } if(!strncasecmp(buffer, "USER ", 5)){ strncpy(user, buffer,1023); u=0; } else if(!strncasecmp(buffer, "NICK ", 5)){ strncpy(nick,buffer,100); nck=NULL; strtok(nick," "); nck=strtok(NULL," \n\r"); if(nck) n=0; if(p=1){ sprintf(buffer, ":IGA!bnc@rcmp.org NOTICE %s :Enter the Correct Passcode = /quote AUTH \n",nck); write(s, buffer, strlen(buffer)); } } else if(!strncasecmp(buffer, "AUTH ", 5)){ strncpy(myserver,buffer,1023); pass=NULL; strtok(myserver," "); pass=strtok(NULL," \n\r"); if(pass){ if(!strncmp(pass,ps,strlen(ps))) p=0; } } } sprintf(buffer, ":IGA!bnc@rcmp.org NOTICE %s :Usager Authentifier\n",nck); write(s, buffer, strlen(buffer)); sprintf(buffer, ":IGA!bnc@rcmp.org NOTICE %s :Type /quote bounce \n",nck); sprintf(buffer, ":IGA!bnc@rcmp.org NOTICE %s :or type /quote vhost to use vhost\n",nck); write(s, buffer, strlen(buffer)); while(1) { FD_ZERO(&rset); FD_SET(s, &rset); if(sock_c >= 0) FD_SET(sock_c, &rset); if(sock_c > s) maxfd = sock_c + 1; else maxfd = s + 1; select(maxfd, &rset, NULL, NULL, NULL); memset(buffer, 0, 1024); if(FD_ISSET(s, &rset)) { if(read(s, buffer, 1023) <= 0) { close(s); close(sock_c); return; } if(sock_c >= 0) { write(sock_c, buffer, strlen(buffer)); } else { cmd = NULL; server = NULL; port = NULL; spass = NULL; up = 0; cmd = strtok(buffer, " "); if(!cmd) continue; if(!strcasecmp(cmd,"vhost")){ server = strtok(NULL, " \n\r"); if(!server) continue; strncpy(vhostname,server,256); sprintf(buffer, ":IGA!bnc@rcmp.org NOTICE %s :Vhost utilisé: %s\n",nck,vhostname); write(s,buffer,strlen(buffer)); continue; } if(strcasecmp(cmd, "bounce")) continue; server = strtok(NULL, " \n\r"); if(!server) continue; strncpy(myserver, server,1024); port = strtok(NULL, " \n\r"); if(!port) { myport=dp; } else myport = atoi(port); spass = strtok(NULL, " \n\r"); if(!spass) { up = 0; } else { up = 1; strncpy(spast,spass,29); } sprintf(buffer, ":IGA!bnc@rcmp.org NOTICE %s :Connecting to %s : %i...\n",nck,myserver,myport); write(s, buffer, strlen(buffer)); sock_c = do_connect(myserver, myport); if(sock_c < 0) sock_c = -1; if(up){ sprintf(buffer,"PASS %s\n",spast); write(sock_c,buffer,strlen(buffer)); } write(sock_c, user, strlen(user)); sprintf(buffer,"NICK %s\n",nck); write(sock_c, buffer, strlen(buffer)); memset(buffer, 0, 1024); read(sock_c, buffer, 1023); if(strlen(buffer) > 0) { write(s, buffer, strlen(buffer)); } continue; } } if(sock_c >= 0) { if(FD_ISSET(sock_c, &rset)) { memset(buffer, 0, 1024); if(read(sock_c, buffer, 1023) <= 0) { close(s); close(sock_c); return; } write(s, buffer, strlen(buffer)); } } } } loadconf(){ FILE *conf; char *confcmd,*confval; char line[100]; int howfar; if((conf=fopen("bnc.conf","r")) == NULL) { printf("** No configfile Found (bnc.conf).\n"); return 1; } howfar=0; while(!feof(conf)){ memset(line,0,100); fgets(line,100,conf); howfar++; if(!strlen(line)) continue; if(strncmp(line,"#",1)){ confcmd=NULL; confval=NULL; confcmd=strtok(line,":"); if(!confcmd) continue; confval=strtok(NULL,"\n"); if(!confval) continue; if(!strcasecmp(confcmd,"pt")) pt=atoi(confval); else if(!strcasecmp(confcmd,"mu")) mu=atoi(confval); else if(!strcasecmp(confcmd,"dp")) dp=atoi(confval); else if(!strcasecmp(confcmd,"ps")){ strcpy(ps,confval); po=1; } else if(!strcasecmp(confcmd,"vh")){ strcpy(vhostname,confval); } else printf("Config line %i rejected-what weirdo told you '%s' goes in my config file?\n",howfar,confcmd); } } fclose(conf); return 0; } int main(int argc, char *argv[]) { int a_sock = 0; int s_sock = 0; struct sockaddr_in sin; int sinlen; int mypid; pt=6667; mu=100; dp=6667; cu=0; po=0; strcpy(ps,"-NONE-"); printf("\nIrc Proxy v2.2.4 GNU project (C) 1997-98\n"); printf("Coded by someone -> [www.rcmp.org]\n"); if(loadconf()) { printf("***Using defaults(Not recommended)\n"); } printf("--Configuration:\n"); printf(" Daemon port......:%u\n Password.........:%s\n Maxusers.........:%u\n Default conn port:%u\n",pt,ps,mu,dp); s_sock = socket(AF_INET, SOCK_STREAM, 0); if(s_sock < 0) { perror("socket"); exit(0); } memset(&sin, 0, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_port = htons(pt); sin.sin_addr.s_addr = INADDR_ANY; if(bind(s_sock, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) < 0) { perror("bind"); exit(0); } if(listen(s_sock, 10) < 0) { perror("listen"); exit(0); } signal(SIGHUP, SIG_IGN); switch(fork()) { case -1: printf("fatal error: unable to fork()"); exit(-1); case 0: setsid(); break; default: exit(0); } close(0); close(1); close(2); signal(SIGCHLD, child_killer); while(1) { sinlen = sizeof(sin); close(a_sock); a_sock = accept(s_sock, (struct sockaddr *)&sin, &sinlen); if(a_sock < 0 && errno == EINTR) continue; if(a_sock < 0) { perror("accept"); continue; } cu++; if((cu>mu) && (mu>0)){ close(a_sock); cu--; continue; } switch(fork()) { case -1: close(a_sock); continue; case 0: close(s_sock); server(a_sock); exit(0); } } } --------------------------------------------------------EOF of bnc.c------ Cut-paster le tout dans un fichier en notepad et sauver sous Bnc.c Ce code-source n'a pas de copyright pour la simple raison qu'il a ete modifier par un peu tout le monde depuis son existence :-) Maintenant fabriquer un 2-eme fichier: --------------------------------------------------------bnc.conf----------- pt:33333 ps:sample mu:4 dp:6667 --------------------------------------------------------EOF of bnc.conf---- pt: port d'entré de votre vhost, c'est a dire, par ou on passe pour entrer sur le BNC a partir du shell que vous utiliser. ps: Password, remplacer sample par le mot-de-passe a utiliser mu: MaxUsers, nombre d'usager connecter en meme temps au maximum dp: DefaultPort: Le port IRC par defaut est 6667 --- Bon maintenant apres avoir tout bien configurer dans bnc.conf vous envoyez le tout en FTP sur votre shell acouunt. (bnc.conf & bnc.c) et placer les dans votre repertoire ~/bnc. Par la suite, compiler le tout : gcc bnc.c -o bnc-exe et executer le programmme compiler (ex: ./bnc-exe) il va vous afficher votre configuration et vous dire si oui ou non il fonctionne. Nb: Utiliser la commande :"ps x" pour voir la liste des progrmames qui run sur votre shell et tuer le Bnc pour le fermer avec: kill -9 le_pid . Donc par la suite ouvrez MIRC ou tout autre client irc et tapez: /server serverhost portchoisis vous devriez voir une demande de mot-de-passe: /quote auth lemotdepassechoisis et vous tapez: /quote vhost vhosthostmask [pour prendre un vhost disponible] ou/et: /quote bounce us.undernet.org 6667 Avec un peu de chance, vous vous retrouverez sur IRC avec le DNS du vhost/serv choisis. Le coté pratique de la chose est biensur de pas se faire tanner par un petit mec qui s'amuse avec ses jouets (nukes/trojans) et c'est bcoup plus stable qu'un wingate. PROBLEMES POSSIBLES: 2 problemes generales pourraient se retrouver, 1: Le OS ne compile pas le bnc.c, helas je n'ai pas tres utiliser tout les OS mais il fonctionne sous freebsd et linux toute distribution. Sur SunOS il doit etre modifier. 2: Le port que vous prenez (ex:33333) est deja utiliser par un autre service, changer le! J'espere vous avoir aider a optimiser l'utilisation de votre shell :-) So, quelquun qui a un LNPA ou un modemcable sous unix pourrait ouvrir un service de bnc comme tel sur leur machine et revendre 1-2$ l'utilisation :-) __2.chu.coller.la