Reverse shell persistente en bash

Desde BASH podemos crear sockets TCP o UDP utilizando los archivos especiales ‘/dev/tcp/$IP/$PORT’ o ‘/dev/udp/$IP/$PORT’.  Con esto en el lado del cliente (a.k.a víctima) y un listener en el lado del servidor (a.k.a atacante) podemos crear una conexión inversa que nos devolverá una shell de bash con los privilegios del usuario que lo ejecute.

Para rizar un poco más el rizo, codificaremos nuestro ‘evil script’ en base64 y lo colgaremos en un gist de github (también podríamos utilizar un paste en pastebin o zerobin) accesible para todo el púbilico, de manera que se pueda descargar desde cualquier máquina con acceso a internet y algún programa con soporte para descarga http como wget o curl.  Los pasos que daremos son:

1) Creación del script que generará una shell reversa persistente.

2) Subir nuestro código del punto 1 (en base64) a un paste en gist.

3) Creación del script que instalará y configurará todo en el sistema objetivo e infectar máquina objetivo.

4) Ejecutar listener y obtener shell remota.


1) Creación del script que generará una shell reversa persistente:

El script consta de dos partes diferenciadas, en la definición de variables pondremos la dirección IP del listener (o static / dynamic DNS) y el puerto.  He elegido el 443 (uso común del protocolo https) para facilitar el “firewall bypass” de la conexión en caso de ser necesario.  Si el proceso se produce íntegro en una red LAN lo más seguro es que sirva cualquier otro puerto.  La segunda parte consiste en el bucle que permitirá que el proceso de intento de conexión se esté produciendo cada 10 segundos de forma infinita en segundo plano.


2) Subir nuestro código del punto 1 (en base64) a un paste en gist.

Gist (si, he dicho bien, aunque a mí también me suena raro) es un servicio de github para manejar lo que conocemos como ‘pastes’.  Crearemos un nuevo gist para nuestro script y lo subieremos codificado en base64 para que pase un poco desapercibido.  Para generar el script codificado debemos escribir en la terminal:

Y obtendremos un resultado similar a este:

Ahora copiaremos ese código en https://gist.github.com/ y guardaremos en ‘Create secret gist’ para que los motores de búsqueda no lo indexen, como se muestra en la siguiente imagen:

github_gist

Creación del gist

 

github_gist1

Ver el gist en RAW

 

github_gist2

Copiar la dirección en RAW para insertar en nuestro installer

 


3) Creación del script que instalará y configurará todo en el sistema objetivo.

Como se puede ver consta de cuatro funciones:

check_root: Hace que el script solo se pueda ejecutar como usuario root (UID=0).  (Prescindible en caso de que el usuario root no sea el objetivo)

install_bkdr: Es la función que proporciona la shell inversa mediante la descarga del anterior script subido a github (tendremos que cambiar la dirección de descarga de ‘curl’ por la de nuestro propio gist) y la edición de ‘/etc/rc.local’ para que se ejecute en cada inicio del sistema.  (Necesaria)

function_1: Sería el programa ‘lícito’, lo que queremos que haga, a parte de la infección.  (Prescindible)

restart: Creo que esta no hace falta explicarla.  (Recomendable)

Al final, la única función que es obligatorio insertar en alguna parte de nuestro script para infectar un PC objetivo, es ‘install_bkdr’.  Tras tener nuestro script, lo pasaremos a la máquina objetivo y ejecutaremos, o realizaremos un ataque de ingeniería social o lo que se os ocurra, eso lo dejo para vosotros.

Aunque en mi PoC tenía esta parte un poco más desarrollada, he decidido no complicarlo más.


4) Ejecutar listener y obtener shell remota.

Por último necesitamos la tercera parte del proceso, que es poner a escuchar a nuestro PC a la espera de la shell del equipo infectado.  En este caso utilizaremos NetCat en bucle como listener, dentro de un script.


Por último os dejo unos vídeos de la reverse shell funcionando:

En este vídeo se ve la infección mediante el script installer.sh del punto 3

 

En este último vemos como se ejecuta el listener, y tras una espera máxima de 10 segundos, recibe la shell con privilegios de root (que es como se ejecutan las órdenes establecidas en /etc/rc.local)

Como información adicional, he utilizado una máquina con Debian Wheezy (Linux debian 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux) en la parte que recibe la shell, o parte atacante, y la víctima se ejecuta en otra máquina virtual con Ubuntu 12.04.3 LTS (Linux ubuntuc 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed Aug 14 16:19:23 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux).

Tweet about this on TwitterShare on FacebookShare on Google+Email this to someone

También te podría gustar...

2 Respuestas

  1. Pando85 dice:

    Interesante post e interesante proyecto el de la web! animo con ella! por aqui tenéis un seguidorcillo

    • Marcos dice:

      Gracias Pando85, saber de gente que le guste el proyecto es muy importante para mantener la motivación de publicar. Un Saludo!!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *