6379 - Pentesting Redis
加入 HackenProof Discord 服务器,与经验丰富的黑客和赏金猎人交流!
黑客见解 参与深入探讨黑客行为的刺激和挑战的内容
实时黑客新闻 通过实时新闻和见解及时了解快节奏的黑客世界
最新公告 了解最新的赏金计划发布和重要平台更新
加入我们的 Discord 并开始与顶尖黑客合作!
基本信息
根据文档:Redis 是一个开源(BSD 许可),用作数据库、缓存和消息代理的内存数据结构存储。
默认情况下,Redis 使用基于纯文本的协议,但您必须记住它也可以实现ssl/tls。了解如何在这里使用 ssl/tls 运行 Redis。
默认端口: 6379
自动枚举
一些自动化工具可以帮助获取来自 Redis 实例的信息:
手动枚举
横幅
Redis是一种基于文本的协议,您可以只需在套接字中发送命令,返回的值就可以被读取。还要记住Redis可以使用ssl/tls运行(但这很奇怪)。
在常规Redis实例中,您可以使用nc
进行连接,或者也可以使用redis-cli
:
您可以尝试的第一个命令是**info
**。它可能会返回Redis实例的信息,或者可能会返回类似以下内容的信息:
在这种情况下,这意味着您需要有效的凭据才能访问Redis实例。
Redis身份验证
默认情况下,Redis可以在没有凭据的情况下访问。但是,它可以被配置为仅支持密码,或用户名+密码。
可以在_redis.conf文件中使用参数requirepass
设置密码,或者在服务重新启动连接到它并运行config set requirepass p@ss$12E45
来临时设置密码。
此外,可以在redis.conf_文件中的参数masteruser
中配置用户名。
如果仅配置了密码,则使用的用户名是“default”。 另外,请注意外部无法找到Redis是仅配置了密码还是用户名+密码。
在这种情况下,您将需要找到有效的凭据才能与Redis交互,因此可以尝试暴力破解。 如果找到有效凭据,需要在与命令建立连接后进行身份验证的会话中进行身份验证:
有效凭据 将会得到以下回应:+OK
已认证枚举
如果 Redis 服务器允许匿名连接或者您已获得有效凭据,您可以使用以下命令启动服务的枚举过程:
请注意,实例的Redis命令可以在_redis.conf_文件中重命名或删除。例如,以下行将删除FLUSHDB命令:
更多关于如何安全配置Redis服务的信息请查看:https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04
您还可以使用命令monitor
实时监视执行的Redis命令,或者使用slowlog get 25
获取前25个最慢的查询。
在这里找到更多关于Redis命令的有趣信息:https://lzone.de/cheat-sheet/Redis
转储数据库
在Redis中,数据库是从0开始编号的数字。您可以在info
命令的输出中的"Keyspace"块中找到是否有任何数据库正在使用:
或者您可以使用以下命令获取所有keyspaces(数据库):
在这个例子中,正在使用数据库 0 和 1。数据库 0 包含 4 个键,数据库 1 包含 1 个。默认情况下,Redis 将使用数据库 0。要导出例如数据库 1,您需要执行:
在运行 GET <KEY>
时,如果出现 -WRONGTYPE 操作针对保存了错误类型值的键
错误,这是因为该键可能不是字符串或整数,需要使用特殊运算符来显示它。
要了解键的类型,请使用 TYPE
命令,以下是列表和哈希键的示例。
使用npm redis-dump 或python redis-utils 来转储数据库
加入HackenProof Discord 服务器,与经验丰富的黑客和赏金猎人交流!
黑客见解 参与深入探讨黑客行为的刺激和挑战的内容
实时黑客新闻 通过实时新闻和见解及时了解快节奏的黑客世界
最新公告 了解最新的赏金任务发布和重要平台更新
加入我们的Discord,立即开始与顶尖黑客合作!
Redis RCE
交互式Shell
redis-rogue-server 可以自动在Redis(<=5.0.5)中获取交互式Shell或反向Shell。
PHP Webshell
信息来自这里。您必须知道网站文件夹的路径:
模板 Webshell
就像在前面的部分中一样,您还可以覆盖一些将由模板引擎解释的 HTML 模板文件并获取 shell。
例如,根据此解析,您可以看到攻击者在由 nunjucks 模板引擎 解释的 HTML 中注入了 rev shell。
请注意,几个模板引擎会缓存模板在内存中,因此即使您覆盖它们,新模板不会被执行。在这种情况下,要么开发人员保留了自动重新加载功能,要么您需要对服务进行DoS攻击(并期望它将自动重新启动)。
SSH
示例来自这里
请注意**config get dir
的结果可能会在其他手动利用命令之后发生更改。建议在登录到Redis后立即运行它。在config get dir
的输出中,您可以找到redis用户的home**(通常为_/var/lib/redis_或_/home/redis/.ssh_),知道这一点后,您就知道可以在哪里写入authenticated_users
文件以通过ssh访问使用redis用户。如果您知道其他有效用户的主目录,并且具有可写权限,您也可以滥用它:
在您的计算机上生成ssh公钥-私钥对:
ssh-keygen -t rsa
将公钥写入文件:
(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
将文件导入到redis:
cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
将公钥保存到redis服务器上的authorized_keys文件中:
最后,您可以使用私钥ssh到redis服务器:ssh -i id_rsa redis@10.85.0.52
此技术在此处自动化:https://github.com/Avinash-acid/Redis-Server-Exploit
Crontab
最后一个示例适用于Ubuntu,对于Centos,上述命令应为:redis-cli -h 10.85.0.52 config set dir /var/spool/cron/
这种方法也可以用来赚取比特币:yam
加载Redis模块
按照https://github.com/n0b0dyCN/RedisModules-ExecuteCommand的说明,您可以编译一个Redis模块来执行任意命令。
然后需要某种方式上传编译好的模块
在运行时加载上传的模块:
MODULE LOAD /path/to/mymodule.so
列出已加载的模块以检查是否已正确加载:
MODULE LIST
执行 命令:
您可以随时卸载模块:
MODULE UNLOAD mymodule
LUA沙盒绕过
这里您可以看到Redis使用EVAL命令来执行Lua代码沙盒。在链接的帖子中,您可以看到如何使用dofile函数滥用它,但显然这已不再可能。无论如何,如果您可以绕过Lua沙盒,就可以在系统上执行任意命令。此外,从同一帖子中,您可以看到一些导致DoS的选项。
一些用于绕过LUA的CVE:
主从模块
主Redis的所有操作会自动同步到从Redis,这意味着我们可以将漏洞Redis视为从Redis,连接到我们自己控制的主Redis,然后我们可以在我们自己的Redis中输入命令。
SSRF 与 Redis 通信
如果你可以发送明文请求到 Redis,你可以与其进行通信,因为 Redis 会逐行读取请求,并只对其不理解的行作出错误响应:
因此,如果您在网站中发现了SSRF漏洞,并且可以控制一些标头(可能是通过CRLF漏洞)或POST参数,您将能够向Redis发送任意命令。
示例:Gitlab SSRF + CRLF 到 Shell
在Gitlab11.4.7中发现了一个SSRF漏洞和一个CRLF漏洞。SSRF漏洞出现在从URL功能导入项目中,当创建一个新项目时允许访问任意IP,形式为[0:0:0:0:0:ffff:127.0.0.1](这将访问127.0.0.1),而CRLF漏洞则是通过向URL添加**%0D%0A**字符来利用。
因此,可以利用这些漏洞与管理队列的Redis实例进行通信,并滥用这些队列来执行代码。Redis队列滥用的有效载荷是:
而利用SSRF和CRLF滥用URL编码请求执行whoami
并通过nc
发送输出的请求是:
由于某种原因(就像https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/的作者所述,这些信息来源于那里),利用使用git
方案而不是http
方案。
加入HackenProof Discord服务器,与经验丰富的黑客和赏金猎人交流!
黑客见解 参与深入探讨黑客行为的刺激和挑战的内容
实时黑客新闻 通过实时新闻和见解了解快节奏的黑客世界
最新公告 通过最新的赏金计划发布和重要平台更新保持信息更新
加入我们的 Discord 并开始与顶尖黑客合作!
最后更新于