# 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