---
# System prepended metadata

title: webshell 管理器设计

---

# webshell 管理器设计
[toc]

## 大致结构

[结构图](https://www.edrawsoft.cn/viewer/public/s/max/6a646537786128)
[模块具体功能](https://mm.edrawsoft.cn/map.html?sharecode=608a9e73565093a48920902)

https://hackmd.io/p3t8lE9nTradeOVn1cc6Yg
https://hackmd.io/ALaRqV-YQ2yembRGGChEbg
https://hackmd.io/m8JBJPy5S12scqOmqK0zmA?view

## Payload生成模块

### Payload生命周期
接收数据-》解密-》执行前阶段-》执行-》执行后阶段-》加密-》传回

预设命令：

可以执行的命令：功能加载，Test，（代码执行，命令执行，文件操作，文件上传下载，数据库操作，代理，等等等）

### Payload生成流程

选择基础模板（对反序列化漏洞选择链，内存马，普通马，不死马，用户自定义的马等等）→设置马儿的参数→设置执行前阶段需要执行的语句→选择功能加载方式→设置执行后阶段执行的语句→选择加密方式→选择数据传输方式（Cookie,Header,Body,websocket）→生成Payload





### 具体设计

找@Bubb1e 



```
loader{//反序列化入口点
    
    getContext // 回显初始化
    keep-alive(servlet,filter...){
        1 接收数据-》解密
        2 执行前阶段
        3 执行
        4 执行后阶段
        5 加密-》传回
    }

}
```

### module分类


流量处理
执行前阶段模块
基础模板
执行后阶段模块
回显


### 实现计划


先给所有的module分类->再设计多个module合成的类->不同的module的分类设计moduel->实现moduel->实现GO


### Module设计

--- 

每个找个自己类的demo（具体到代码实现），之后一起组合

文档：

找属于自己类的mod，不需要具体到代码，只需写需要配置的文档

如aes mod

| option | desc |
| ------ | ---- |
| key    | 密钥 |
| ...    | ...  |

--- 

### 类设计





## 会议记录5.1

### 今日汇报任务
各部分的demo代码提交
各部分文档（这个不急，未完成的可以继续做完）

**完成情况**
 


### 下次会议目的
1. 手动完成demo的组合方式
2. 改造ysoserial，来通过我们传入的配置信息实现这个构造方式



1. 交demo代码
2. 手动组合


## 分工


```

getContext  // bubb1e

public void toMemory(){}; //  everyone,min

public void encoder(int mode){} // atsap

public void exec(){};// ccreater

public void echo(){}; // bubb1e

cmdline interface // popko



```

结构：

## WebShell设计说明

Webshell说明：

```java
public class Webshell {
    static {
        System.out.println("TEST");
        new Webshell().run();
    }
    public Map<String,Object> data = new HashMap<>();
    public void run(){

    };
		public static String [] config = new String[]{};
		public static String get(String key){
        for(int i=0;i<Webshell.config.length;i+=2){
            if(key.equals(Webshell.config[i])){
                return Webshell.config[i+1];
            }
        }
        return null;
    }
}
```

```java

public class Webshell {
    static {
        System.out.println("TEST");
        new Webshell().run();
    }
    public Map<String,Object> data = new HashMap<>();
    public void run(){
			$0.encoder(0);$0.prepare();$0.exec();$0.after();$0.encoder(1);$0.echo();
    };
		public void encoder(int mode){}
		public void prepare(){};
		public void exec(){};
		public void after(){};
		public void echo(){};
}
```

参考

```java
loader{//反序列化入口点

    getContext// 获取上下文用于注册内存马
    webshell{
        1 接收数据-》解密
        2 执行前阶段
        3 执行
        4 执行后阶段
        5 加密-》传回
    }

}
```

getContext 和 webshell放在static block中

接着webshell的5个模块放在webshell.run()中

## Module设计说明

所有的模块都是以这个模板存在的除了Encoder

```java
public class Exec{
    public void run(){
        System.out.println("Exec run!!!");
    };
}
```

Encoder的模块设计

```java

public class Encoder{
    public void run(int mode){
        if(mode==1){
            //encode mode
            System.out.println("Encode");
        }else{
            //decode mode
            System.out.println("Decode");
        }
    };
}
```

Webshell调用流程：

```java

{$0.encoder(0);$0.prepare();$0.exec();$0.after();$0.encoder(1);$0.echo();}
```

关于参数传递：使用

```java
(Map<String,Object>)this.data.get("param").get("name")
```

关于执行结果存储：

```java
//ModuleName只能为以下五个值：Encoder,Prepare,Exec,After,Echo
this.data.put("ModuleName",result);//自行将ModuleName替换成对应的模块名，比如是Encoder模块就：this.data.put("Encoder",result);
```

关于公共参数的设计：

```java
this.data应该包含以下公共参数：ServletContext,ServletRequest,Result

```

在Webshell 的 static block中应该实现：

设置this.data 的 ServletContext,ServletRequest,ServletResponse,ServletSession 参数，如果没有请置为null

各个模块的功能：

Encoder:如果是**Decode Mode**,获取将请求的数据转化成Map放在**this.data.Encoder**中,如果是**Encode Mode**，将this.data.Result加密后转为字符串保存在**this.data.Encoder**

Prepare:

Exec: 从this.data.Encoder.function和this.data.Encoder.param中获取函数和参数，初始应该有test,load功能，将执行结果放在this.data.Result.exec

After:

Echo: 将this.data.Result传回去


```java
this.data.Encoder字段包含：function,param,password
function 是一个字符串
password 是一个字符串
其他参数自己定义
```

### 传递返回值

Result: 



```
0或1#0代表成功,1代表失败
key Base64EncodeValue
...
```







## 设计细节

### exec模块

使用的Post参数：functionName,bytecode
