Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion .github/workflows/memshell-integration-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
- './github/workflows/memshell-integration-test.yml'
- '**/memshell/**'
- '**/packer/**'
- '**/dubbo/**'

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
Expand Down Expand Up @@ -52,6 +53,10 @@ jobs:
depend_tasks: ":vul:vul-struts2:war"
- middleware: "jenkins"
depend_tasks: ""
- middleware: "geronimo"
depend_tasks: ":vul:vul-webapp:war"
- middleware: "dubbo"
depend_tasks: ":vul:vul-dubbo:dubboProviderFatJars :tools:command:dubboClientClasspath"
runs-on: ubuntu-22.04
name: ${{ matrix.cases.middleware }}
steps:
Expand All @@ -71,10 +76,15 @@ jobs:
run: ./gradlew ${{ matrix.cases.depend_tasks }}

- name: Integration Test with gradle
if: matrix.cases.middleware != 'dubbo'
run: ./gradlew :integration-test:test --tests '*.memshell.${{ matrix.cases.middleware }}.*' --info

- name: Dubbo Integration Test with gradle
if: matrix.cases.middleware == 'dubbo'
run: ./gradlew :integration-test:dubboContainerTest --info

- name: Export Integration Test Summary
uses: mikepenz/action-junit-report@v5
if: success() || failure()
with:
report_paths: '**/build/test-results/test/TEST-*.xml'
report_paths: '**/build/test-results/*/TEST-*.xml'
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ RUN git clone --depth 1 https://github.com/ReaJason/MemShellParty.git . && \
# https://hub.docker.com/r/oven/bun
FROM --platform=$BUILDPLATFORM oven/bun:1.3.11 AS frontend

ARG ROUTE_ROOT_PATH="/"
ARG ROUTE_ROOT_PATH=""
ARG CONTEXT_PATH=""

WORKDIR /usr/src/web
Expand Down Expand Up @@ -56,4 +56,4 @@ ENV INTERNAL_JAVA_OPTS="\

EXPOSE 8080

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS $INTERNAL_JAVA_OPTS -jar app.jar $BOOT_OPTS"]
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS $INTERNAL_JAVA_OPTS -jar app.jar $BOOT_OPTS"]
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ MemShellParty 是一款专注于主流 Web 中间件的内存马快速生成工

### 使用前必看

[Java 服务简介.md](web/content/docs/server-intro.mdx),用于了解 MemShellParty
[适配情况](https://party.mem.mk/ui/docs/compatibility),用于了解 MemShellParty
中针对各个服务适配的情况,针对不同的应用选择合适的服务类型。

探测马中探测服务类型已经做了一一对应,探测出来的服务类型,即是可生成内存马的服务类型(非中间件类型,例如 Apusic10 探测出来的结果为
Expand Down
2 changes: 1 addition & 1 deletion boot/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM eclipse-temurin:17.0.17_10-jre-noble
FROM eclipse-temurin:21.0.11_10-jre-noble

LABEL authors="ReaJason<reajason1225@gmail.com>"

Expand Down
7 changes: 2 additions & 5 deletions boot/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
plugins {
id("java")
id("org.springframework.boot") version "3.5.8"
id("org.springframework.boot") version "4.1.0"
id("io.spring.dependency-management") version "1.1.7"
}

Expand Down Expand Up @@ -31,11 +31,8 @@ dependencies {
exclude(group = "commons-logging", module = "commons-logging")
}
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
implementation("org.springframework.boot:spring-boot-starter-web") {
exclude(group = "org.springframework.boot", module = "spring-boot-starter-tomcat")
}
implementation("org.springframework.boot:spring-boot-starter-web")
implementation(libs.commons.lang3)
implementation("org.springframework.boot:spring-boot-starter-undertow")
compileOnly("org.projectlombok:lombok")
developmentOnly("org.springframework.boot:spring-boot-devtools")
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.reajason.javaweb.boot.controller;

import com.reajason.javaweb.boot.vo.CommandConfigVO;
import com.reajason.javaweb.boot.vo.PackerVO;
import com.reajason.javaweb.memshell.ServerFactory;
import com.reajason.javaweb.memshell.config.CommandConfig;
import com.reajason.javaweb.memshell.server.AbstractServer;
Expand Down Expand Up @@ -40,6 +41,21 @@ public List<String> getPackers() {
.map(Packers::name).toList();
}

/**
* 返回父/子 packer 层级结构,供前端在「父模式 / 子模式」之间选择。
* 单独新增端点而非修改 {@link #getPackers()},以避免破坏旧版本前端对返回值的依赖。
*/
@RequestMapping("/packers/tree")
public List<PackerVO> getPackerTree() {
return Arrays.stream(Packers.values())
.filter(packers -> packers.getParentPacker() == null)
.map(packers -> new PackerVO(
packers.name(),
Packers.getPackersWithParent(packers.getInstance().getClass())
.stream().map(Packers::name).toList()))
.toList();
}

@RequestMapping
public Map<String, Map<?, ?>> config() {
Map<String, Map<?, ?>> coreMap = new HashMap<>(16);
Expand Down
10 changes: 10 additions & 0 deletions boot/src/main/java/com/reajason/javaweb/boot/vo/PackerVO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.reajason.javaweb.boot.vo;

import java.util.List;

/**
* @author ReaJason
* @since 2026/6/27
*/
public record PackerVO(String name, List<String> children) {
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package com.reajason.javaweb.boot.controller;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.junit.jupiter.api.BeforeEach;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestClient;

import java.util.List;
import java.util.Map;
Expand All @@ -21,27 +22,45 @@
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ConfigControllerIntegrationTest {

@Autowired
private TestRestTemplate restTemplate;
@LocalServerPort
private int port;

private RestClient restClient;

@BeforeEach
void setUp() {
restClient = RestClient.builder()
.baseUrl("http://localhost:" + port)
.build();
}

@Test
public void testConfigEndpoint() {
ResponseEntity<Map> response = restTemplate.getForEntity("/api/config", Map.class);
ResponseEntity<Map> response = restClient.get()
.uri("/api/config")
.retrieve()
.toEntity(Map.class);
assertEquals(HttpStatus.OK, response.getStatusCode());
assertNotNull(response.getBody());
}

@Test
public void testConfigServersEndpoint() {
ResponseEntity<Map> response = restTemplate.getForEntity("/api/config/servers", Map.class);
ResponseEntity<Map> response = restClient.get()
.uri("/api/config/servers")
.retrieve()
.toEntity(Map.class);
assertEquals(HttpStatus.OK, response.getStatusCode());
assertNotNull(response.getBody());
}

@Test
public void testConfigPackersEndpoint() {
ResponseEntity<List> response = restTemplate.getForEntity("/api/config/packers", List.class);
ResponseEntity<List> response = restClient.get()
.uri("/api/config/packers")
.retrieve()
.toEntity(List.class);
assertEquals(HttpStatus.OK, response.getStatusCode());
assertNotNull(response.getBody());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@
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.BeforeEach;
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.boot.test.web.server.LocalServerPort;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestClient;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
Expand All @@ -25,8 +26,17 @@
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class MemShellGeneratorControllerTest {

@Autowired
TestRestTemplate restTemplate;
@LocalServerPort
private int port;

private RestClient restClient;

@BeforeEach
void setUp() {
restClient = RestClient.builder()
.baseUrl("http://localhost:" + port)
.build();
}

@Test
void generateShell() {
Expand All @@ -50,9 +60,12 @@ void generateShell() {
shellToolConfigDTO.setHeaderName("User-Agent");
shellToolConfigDTO.setHeaderValue("hello");
request.setShellToolConfig(shellToolConfigDTO);
ResponseEntity<MemShellGenerateResponse> response = restTemplate.postForEntity(
"/api/memshell/generate", request, MemShellGenerateResponse.class);
ResponseEntity<MemShellGenerateResponse> response = restClient.post()
.uri("/api/memshell/generate")
.body(request)
.retrieve()
.toEntity(MemShellGenerateResponse.class);
assertEquals(HttpStatus.OK, response.getStatusCode());
assertNotNull(response.getBody());
}
}
}
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ idea {
}
}

version = "2.7.2"
version = "2.8.0-SNAPSHOT"

tasks.register("publishAllToMavenCentral") {
dependsOn(":memshell-party-common:publishToMavenCentral")
Expand Down
Loading
Loading