Redis数据库未授权访问漏洞模拟实验

靶机中搭建了Redis数据库并存在未授权访问漏洞,要求选手找到此漏洞并利用此漏洞获取一定权限。—-出自不知道哪年的《信息安全管理与评估》赛题。

好吧,metasploitable2里边没有redis这玩意啊,咱自己装上模拟一遍吧。

Redis数据库未授权访问漏洞模拟实验

redis基本知识

1、Redis的数据类型:

字符串、列表(lists)、集合(sets)、有序集合(sorts sets)、哈希表(hashs)

2、Redis和memcache相比的独特之处:

(1)redis可以用来做存储(storge)、而memcache是来做缓存(cache)。这个特点主要是因为其有“持久化”功能

(2)存储的数据有“结构”,对于memcache来说,存储的数据,只有一种类型——“字符串”,而redis则可以存储字符串、链表、集合、有序集合、哈序结构

3、持久化的两种方式:

Redis将数据存储于内存中,或被配置为使用虚拟内存。

实现数据持久化的两种方式:(1)使用截图的方式,将内存中的数据不断写入磁盘(性能高,但可能会引起一定程度的数据丢失)

(2)使用类似mysql的方式,记录每次更新的日志

4、Redis的主从同步:对提高读取性能非常有益

5、Redis服务端的默认端口是6379

在metasploitable里边安装

1、第一步先下载redis

wget http://download.redis.io/releases/redis-stable.tar.gz

2、解压 tar zxvf redis-stable.tar.gz

3、进入目录cd  redis-stable 编译并安装

make install

4、启动并后台运行

redis-server &

5、输入 redis-cli 应该可以进入了

安装完成,因为加载的是默认配置文件,可以无认证从任何地方访问。

Redis未授权访问漏洞利用

Redis 未授权访问配合 SSH key 文件利用,利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接使用对应的私钥登录目标服务器。

在kali或其他系统装上客户端,也就是到上面步骤3中的编译并安装就行了。

1、首先在本地生产公私钥文件:

ssh-keygen

2、然后将公钥写入 foo.txt 文件

3、再连接 Redis 写入文件

这样就可以成功的将自己的公钥写入对方/root/.ssh 文件夹的 authotrized_keys 文件里,然后攻击者直接执行:

ssh root@192.168.1.11  即可远程利用自己的私钥登录该服务器,无需密码。

当然,写入的目录不限于 /root/.ssh 下的authorized_keys,也可以写入用户目录,不过 Redis 很多以 root 权限运行,所以写入 root 目录下,可以跳过猜用户的步骤。

安全加固建议

  1. 配置bind选项,限定可以连接Redis服务器的IP,修改 Redis 的默认端口6379
  2. 配置认证,也就是AUTH,设置密码,密码会以明文方式保存在Redis配置文件中
  3. 配置rename-command 配置项 “RENAME_CONFIG”,这样即使存在未授权访问,也能够给攻击者使用config 指令加大难度
  4. 好消息是Redis作者表示将会开发”real user”,区分普通用户和admin权限,普通用户将会被禁止运行某些命令,如config

附送redis配置文件详细说明

daemonize:如需要在后台运行,把该项的值改为yes

pdifile:把pid文件放在/var/run/redis.pid,可以配置到其他地址

bind:指定redis只接收来自该IP的请求,如果不设置,那么将处理所有请求,在生产环节中最好设置该项

port:监听端口,默认为6379

timeout:设置客户端连接时的超时时间,单位为秒

loglevel:等级分为4级,debug,revbose,notice和warning。生产环境下一般开启notice

logfile:配置log文件地址,默认使用标准输出,即打印在命令行终端的端口上

database:设置数据库的个数,默认使用的数据库是0

save:设置redis进行数据库镜像的频率

rdbcompression:在进行镜像备份时,是否进行压缩

dbfilename:镜像备份文件的文件名

dir:数据库镜像备份的文件放置的路径

slaveof:设置该数据库为其他数据库的从数据库

masterauth:当主数据库连接需要密码验证时,在这里设定

requirepass:设置客户端连接后进行任何其他指定前需要使用的密码

maxclients:限制同时连接的客户端数量

maxmemory:设置redis能够使用的最大内存

appendonly:开启appendonly模式后,redis会把每一次所接收到的写操作都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态

appendfsync:设置appendonly.aof文件进行同步的频率

vm_enabled:是否开启虚拟内存支持

vm_swap_file:设置虚拟内存的交换文件的路径

vm_max_momery:设置开启虚拟内存后,redis将使用的最大物理内存的大小,默认为0

vm_page_size:设置虚拟内存页的大小

vm_pages:设置交换文件的总的page数量

vm_max_thrrads:设置vm IO同时使用的线程数量

 

参考链接:

http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/

http://www.cnblogs.com/it-cen/p/4295984.html

 

转载请注明原作者,如果你觉得文章对你有帮助或启发,也可以来请我喝咖啡

点赞