mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-22 15:10:43 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3bda20f2c | ||
|
|
be5a2089d2 | ||
|
|
9d2e8125d9 | ||
|
|
8964769be8 | ||
|
|
3acab6e620 | ||
|
|
5148414ca8 | ||
|
|
0b10a55f66 |
@@ -126,12 +126,24 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Download Boot Jar
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: boot
|
||||||
|
path: boot/build/libs
|
||||||
|
|
||||||
|
- name: Calculate SHA-256
|
||||||
|
id: calculate_sha256
|
||||||
|
run: |
|
||||||
|
sha256sum boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.jar > boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.sha256
|
||||||
|
|
||||||
- name: Release
|
- name: Release
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
name: ${{ needs.info.outputs.version }}
|
name: ${{ needs.info.outputs.version }}
|
||||||
tag: ${{ needs.info.outputs.version }}
|
tag: ${{ needs.info.outputs.version }}
|
||||||
body: ${{ needs.info.outputs.changelog }}
|
body: ${{ needs.info.outputs.changelog }}
|
||||||
|
artifacts: boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.jar,boot/build/libs/boot-${{ needs.info.outputs.version-without-v }}.sha256
|
||||||
|
|
||||||
deploy-northflank:
|
deploy-northflank:
|
||||||
name: Deploy to Northflank
|
name: Deploy to Northflank
|
||||||
|
|||||||
+15
-3
@@ -5,11 +5,23 @@ 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/),
|
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).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [v1.3.0](https://github.com/ReaJason/MemShellParty/releases/tag/v1.2.1) - 2025-02-20
|
## [v1.3.1](https://github.com/ReaJason/MemShellParty/releases/tag/v1.3.1) - 2025-02-20
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- 支持 Hessian、Hessian2, XSLT 反序列化 (#36) by @ReaJason
|
- 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
|
### Changed
|
||||||
|
|
||||||
@@ -21,7 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
- 修复 UI 在仅修改打包方式重新生成时,多选 payload 下拉框置空,且 payload 没有变为最新的。
|
- 修复 UI 在仅修改打包方式重新生成时,多选 payload 下拉框置空,且 payload 没有变为最新的。
|
||||||
|
|
||||||
**Full Changelog:** [v1.2.0...v1.2.1](https://github.com/ReaJason/MemShellParty/compare/v1.2.0...v1.2.1)
|
**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
|
## [v1.2.1](https://github.com/ReaJason/MemShellParty/releases/tag/v1.2.1) - 2025-02-19
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -58,7 +58,7 @@ public class Tomcat8DeserializeContainerTest {
|
|||||||
assertThat("Logs should not contain any exceptions", logs, doesNotContainException());
|
assertThat("Logs should not contain any exceptions", logs, doesNotContainException());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest(name = "{0}-expression|{1}{2}|{3}")
|
@ParameterizedTest(name = "{0}-deserialize|{1}{2}|{3}")
|
||||||
@MethodSource("casesProvider")
|
@MethodSource("casesProvider")
|
||||||
void test(String imageName, String shellType, ShellTool shellTool, Packers packer) {
|
void test(String imageName, String shellType, ShellTool shellTool, Packers packer) {
|
||||||
testShellInjectAssertOk(getUrl(container), Server.Tomcat, shellType, shellTool, Opcodes.V1_8, packer, container);
|
testShellInjectAssertOk(getUrl(container), Server.Tomcat, shellType, shellTool, Opcodes.V1_8, packer, container);
|
||||||
|
|||||||
@@ -92,8 +92,8 @@ export function MainConfigCard({
|
|||||||
}
|
}
|
||||||
form.resetField("bypassJavaModule");
|
form.resetField("bypassJavaModule");
|
||||||
form.resetField("shellTool");
|
form.resetField("shellTool");
|
||||||
|
form.resetField("shellType");
|
||||||
handleShellToolChange(form.getValues("shellTool"));
|
form.resetField("urlPattern");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -61,35 +61,42 @@ export function PackageConfigCard({
|
|||||||
</CardTitle>
|
</CardTitle>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<FormProvider {...form}>
|
{options.length > 0 ? (
|
||||||
<FormField
|
<FormProvider {...form}>
|
||||||
control={form.control}
|
<FormField
|
||||||
name="packingMethod"
|
control={form.control}
|
||||||
render={({ field }) => (
|
name="packingMethod"
|
||||||
<FormItem className="space-y-3">
|
render={({ field }) => (
|
||||||
<FormLabel className="h-6 flex items-center gap-1">{t("packageConfig.title")}</FormLabel>
|
<FormItem className="space-y-3">
|
||||||
<FormControl>
|
<FormLabel className="h-6 flex items-center gap-1">{t("packageConfig.title")}</FormLabel>
|
||||||
<RadioGroup
|
<FormControl>
|
||||||
onValueChange={field.onChange}
|
<RadioGroup
|
||||||
value={field.value}
|
onValueChange={field.onChange}
|
||||||
className="grid grid-cols-2 md:grid-cols-3"
|
value={field.value}
|
||||||
>
|
className="grid grid-cols-2 md:grid-cols-3"
|
||||||
{options.map(({ name, value }) => (
|
>
|
||||||
<FormItem key={value} className="flex items-center space-x-3 space-y-0">
|
{options.map(({ name, value }) => (
|
||||||
<FormControl>
|
<FormItem key={value} className="flex items-center space-x-3 space-y-0">
|
||||||
<RadioGroupItem value={value} id={value} />
|
<FormControl>
|
||||||
</FormControl>
|
<RadioGroupItem value={value} id={value} />
|
||||||
<FormLabel className="text-xs" htmlFor={value}>
|
</FormControl>
|
||||||
{name}
|
<FormLabel className="text-xs" htmlFor={value}>
|
||||||
</FormLabel>
|
{name}
|
||||||
</FormItem>
|
</FormLabel>
|
||||||
))}
|
</FormItem>
|
||||||
</RadioGroup>
|
))}
|
||||||
</FormControl>
|
</RadioGroup>
|
||||||
</FormItem>
|
</FormControl>
|
||||||
)}
|
</FormItem>
|
||||||
/>
|
)}
|
||||||
</FormProvider>
|
/>
|
||||||
|
</FormProvider>
|
||||||
|
) : (
|
||||||
|
<div className="flex items-center justify-center p-4 space-x-2">
|
||||||
|
<div className="h-4 w-4 animate-spin rounded-full border-2 border-primary border-t-transparent" />
|
||||||
|
<span className="text-sm text-muted-foreground">{t("loading")}</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
|||||||
+10
-9
@@ -26,6 +26,7 @@
|
|||||||
"title3": "Injector Class",
|
"title3": "Injector Class",
|
||||||
"usage": "Usage"
|
"usage": "Usage"
|
||||||
},
|
},
|
||||||
|
"loading": "Loading...",
|
||||||
"mainConfig": {
|
"mainConfig": {
|
||||||
"bypassJavaModule": "Bypass Java Module",
|
"bypassJavaModule": "Bypass Java Module",
|
||||||
"debug": "Debug Mode",
|
"debug": "Debug Mode",
|
||||||
@@ -49,6 +50,8 @@
|
|||||||
"Freemarker": "Freemarker",
|
"Freemarker": "Freemarker",
|
||||||
"Groovy": "Groovy",
|
"Groovy": "Groovy",
|
||||||
"GzipBase64": "GzipBase64",
|
"GzipBase64": "GzipBase64",
|
||||||
|
"Hessian2Deserialize": "Hessian2Deserialize",
|
||||||
|
"HessianDeserialize": "HessianDeserialize",
|
||||||
"JEXL": "JEXL",
|
"JEXL": "JEXL",
|
||||||
"JSP": "JSP",
|
"JSP": "JSP",
|
||||||
"JXPath": "JXPath",
|
"JXPath": "JXPath",
|
||||||
@@ -61,9 +64,7 @@
|
|||||||
"ScriptEngine": "ScriptEngine",
|
"ScriptEngine": "ScriptEngine",
|
||||||
"SpEL": "SpEL",
|
"SpEL": "SpEL",
|
||||||
"Velocity": "Velocity",
|
"Velocity": "Velocity",
|
||||||
"XxlJob": "XXL-JOB Executor",
|
"XxlJob": "XXL-JOB Executor"
|
||||||
"Hessian2Deserialize": "Hessian2Deserialize",
|
|
||||||
"HessianDeserialize": "HessianDeserialize"
|
|
||||||
},
|
},
|
||||||
"title": "Package Method"
|
"title": "Package Method"
|
||||||
},
|
},
|
||||||
@@ -111,19 +112,19 @@
|
|||||||
"tips": {
|
"tips": {
|
||||||
"controllerUrlPattern": "ControllerHandler type requires a specific URL Pattern, e.g., /hello_controller",
|
"controllerUrlPattern": "ControllerHandler type requires a specific URL Pattern, e.g., /hello_controller",
|
||||||
"decompileTip": "Decompilation is still under development, so the current only sees the base64 encoding format",
|
"decompileTip": "Decompilation is still under development, so the current only sees the base64 encoding format",
|
||||||
|
"download-jattach": "Download the Jattach tool (consider it directly encapsulated in Jar later)",
|
||||||
|
"execute-command": "Execute the command to inject: /path/to/jattach pid load instrument false /path/to/agent.jar",
|
||||||
|
"get-pid": "Get the process pid of the target jvm (use jps or ps)",
|
||||||
"handlerUrlPattern": "HandlerMethod/HandlerFunction type requires a specific URL Pattern, e.g., /hello_handler",
|
"handlerUrlPattern": "HandlerMethod/HandlerFunction type requires a specific URL Pattern, e.g., /hello_handler",
|
||||||
"jreTip": "Target JRE version, generally speaking, Java 6 is the default version for maximum compatibility, and Java high versions can load low version bytecode.",
|
"jreTip": "Target JRE version, generally speaking, Java 6 is the default version for maximum compatibility, and Java high versions can load low version bytecode.",
|
||||||
"jreTip2": "In specific cases, such as JDK8 being able to use lambda expressions, and JDK9 and above having module restrictions, a specific version is required.",
|
"jreTip2": "In specific cases, such as JDK8 being able to use lambda expressions, and JDK9 and above having module restrictions, a specific version is required.",
|
||||||
|
"move-to-container": "Move MemShellAgent.jar and jattach to the container (if the test environment uses a container deployment)",
|
||||||
"servletUrlPattern": "Servlet type requires a specific URL Pattern, e.g., /hello_servlet",
|
"servletUrlPattern": "Servlet type requires a specific URL Pattern, e.g., /hello_servlet",
|
||||||
"shellBytesEmpty": "Shell bytes is empty, please generate shell first",
|
"shellBytesEmpty": "Shell bytes is empty, please generate shell first",
|
||||||
"shellToolNotSelected": "Please select a shell tool type first",
|
"shellToolNotSelected": "Please select a shell tool type first",
|
||||||
"targetServerNotFound": "Target server not found?",
|
"targetServerNotFound": "Target server not found?",
|
||||||
"targetServerRequest": "Request",
|
"targetServerRequest": "Request",
|
||||||
"waitingForGeneration": "// Waiting for generation...",
|
"try-to-use-shell": "Try to use the memory shell",
|
||||||
"download-jattach": "Download the Jattach tool (consider it directly encapsulated in Jar later)",
|
"waitingForGeneration": "// Waiting for generation..."
|
||||||
"move-to-container": "Move MemShellAgent.jar and jattach to the container (if the test environment uses a container deployment)",
|
|
||||||
"get-pid": "Get the process pid of the target jvm (use jps or ps)",
|
|
||||||
"execute-command": "Execute the command to inject: /path/to/jattach pid load instrument false /path/to/agent.jar",
|
|
||||||
"try-to-use-shell": "Try to use the memory shell"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-9
@@ -26,6 +26,7 @@
|
|||||||
"title3": "注入器类",
|
"title3": "注入器类",
|
||||||
"usage": "使用方法"
|
"usage": "使用方法"
|
||||||
},
|
},
|
||||||
|
"loading": "加载中...",
|
||||||
"mainConfig": {
|
"mainConfig": {
|
||||||
"bypassJavaModule": "绕过 Java 模块限制",
|
"bypassJavaModule": "绕过 Java 模块限制",
|
||||||
"debug": "调试模式",
|
"debug": "调试模式",
|
||||||
@@ -49,6 +50,8 @@
|
|||||||
"Freemarker": "Freemarker",
|
"Freemarker": "Freemarker",
|
||||||
"Groovy": "Groovy",
|
"Groovy": "Groovy",
|
||||||
"GzipBase64": "GzipBase64",
|
"GzipBase64": "GzipBase64",
|
||||||
|
"Hessian2Deserialize": "Hessian2 反序列化",
|
||||||
|
"HessianDeserialize": "Hessian 反序列化",
|
||||||
"JEXL": "JEXL 表达式",
|
"JEXL": "JEXL 表达式",
|
||||||
"JSP": "JSP",
|
"JSP": "JSP",
|
||||||
"JXPath": "JXPath 表达式",
|
"JXPath": "JXPath 表达式",
|
||||||
@@ -61,9 +64,7 @@
|
|||||||
"ScriptEngine": "内置脚本引擎",
|
"ScriptEngine": "内置脚本引擎",
|
||||||
"SpEL": "SpEL 表达式",
|
"SpEL": "SpEL 表达式",
|
||||||
"Velocity": "Velocity",
|
"Velocity": "Velocity",
|
||||||
"XxlJob": "XXL-JOB Executor",
|
"XxlJob": "XXL-JOB Executor"
|
||||||
"Hessian2Deserialize": "Hessian2 反序列化",
|
|
||||||
"HessianDeserialize": "Hessian 反序列化"
|
|
||||||
},
|
},
|
||||||
"title": "打包方式"
|
"title": "打包方式"
|
||||||
},
|
},
|
||||||
@@ -111,19 +112,19 @@
|
|||||||
"tips": {
|
"tips": {
|
||||||
"controllerUrlPattern": "ControllerHandler 类型的需要填写具体的 URL Pattern,例如 /hello_controller",
|
"controllerUrlPattern": "ControllerHandler 类型的需要填写具体的 URL Pattern,例如 /hello_controller",
|
||||||
"decompileTip": "反编译还在开发中,因此当前仅能看到 base64 编码格式",
|
"decompileTip": "反编译还在开发中,因此当前仅能看到 base64 编码格式",
|
||||||
|
"download-jattach": "下载 Jattach 工具(后期考虑直接封装在 Jar 中)",
|
||||||
|
"execute-command": "执行命令进行注入:/path/to/jattach pid load instrument false /path/to/agent.jar",
|
||||||
|
"get-pid": "获取目标 jvm 的进程 pid (使用 jps 或 ps)",
|
||||||
"handlerUrlPattern": "HandlerMethod/HandlerFunction 类型的需要填写具体的 URL Pattern,例如 /hello_handler",
|
"handlerUrlPattern": "HandlerMethod/HandlerFunction 类型的需要填写具体的 URL Pattern,例如 /hello_handler",
|
||||||
"jreTip": "目标 JRE 版本,一般而言为了最大的兼容性,默认 Java 6 即可,Java 高版本能加载低版本的字节码。",
|
"jreTip": "目标 JRE 版本,一般而言为了最大的兼容性,默认 Java 6 即可,Java 高版本能加载低版本的字节码。",
|
||||||
"jreTip2": "特定情况下,例如 JDK8 才能使用 lambda 表达式,JDK9 以上存在模块限制时才需要选择特定的版本。",
|
"jreTip2": "特定情况下,例如 JDK8 才能使用 lambda 表达式,JDK9 以上存在模块限制时才需要选择特定的版本。",
|
||||||
|
"move-to-container": "将 MemShellAgent.jar 和 jattach 移动到容器中(如果测试环境使用容器部署)",
|
||||||
"servletUrlPattern": "Servlet 类型的需要填写具体的 URL Pattern,例如 /hello_servlet",
|
"servletUrlPattern": "Servlet 类型的需要填写具体的 URL Pattern,例如 /hello_servlet",
|
||||||
"shellBytesEmpty": "内存马字节码为空,无法下载, 请先生成内存马",
|
"shellBytesEmpty": "内存马字节码为空,无法下载, 请先生成内存马",
|
||||||
"shellToolNotSelected": "请先选择内存马工具类型",
|
"shellToolNotSelected": "请先选择内存马工具类型",
|
||||||
"targetServerNotFound": "找不到目标服务 ?",
|
"targetServerNotFound": "找不到目标服务 ?",
|
||||||
"targetServerRequest": "请求适配",
|
"targetServerRequest": "请求适配",
|
||||||
"waitingForGeneration": "// 等待填写参数生成中...",
|
"try-to-use-shell": "尝试利用内存马",
|
||||||
"download-jattach": "下载 Jattach 工具(后期考虑直接封装在 Jar 中)",
|
"waitingForGeneration": "// 等待填写参数生成中..."
|
||||||
"move-to-container": "将 MemShellAgent.jar 和 jattach 移动到容器中(如果测试环境使用容器部署)",
|
|
||||||
"get-pid": "获取目标 jvm 的进程 pid (使用 jps 或 ps)",
|
|
||||||
"execute-command": "执行命令进行注入:/path/to/jattach pid load instrument false /path/to/agent.jar",
|
|
||||||
"try-to-use-shell": "尝试利用内存马"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user