modelConfig.getConfigValue(ESCAPE_URL) 用于从配置文件中读取免鉴权访问的路径白名单,并将该配置与当前请求的 URL 进行匹配判断。然而在匹配过程中,代码采用 indexOf 的方式进行字符串包含判断,而非严格的路径匹配。同时,请求 URL 的构造中包含了 `req.getQueryString()`,即将用户可控的请求参数一并纳入匹配范围。 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
PortalLogger.debug((String)LfwResBundle.getInstance().getStrByID("ds", "AbstractLfwLoginFilter-000000"));
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
WebContext webCtx = LfwRuntimeEnvironment.getWebContext();
String currentUrl = req.getRequestURI();
String loginURL = this.getLoginJspName();
if (webCtx != null) {
LfwRuntimeEnvironment.getWebContext().setResponse(res);
} 在上述逻辑下,攻击者可通过在请求参数中加入配置文件中定义的免鉴权路径关键字,使请求 URL 命中免鉴权规则,从而导致鉴权绕过。
经过搜索发现在以下配置文件中存在很多免鉴权的路径。
随便选取其中的一个路径构造请求包进行测试如 pt/oncelogin/getAuth ,500返回确实没有被鉴权拦截。
更换其他接口地址试一下320响应了,被鉴权拦截 上述接口确实为免鉴权路径。
接下来使用构造一个参数值为pt/oncelogin/getAuth的请求包进行测试确实绕过鉴权。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
内存解密远控木马
通过分析,发现shellcode成功加载后:
● 将在内存中解压缩PE文件;
● 解压缩PE文件的MD5是69CECFC2549EAF971FA04212EC4A121D,与笔者《金眼狗(APT-Q-27)滥用AWS S3存储桶分发最新恶意载荷》文章中释放的远控木马Hash相同;
● 解压缩后的PE文件是一款隶属于金眼狗组织的远控木马,具备检查运行环境、内置C2地址、判断管理员权限、创建服务、远控指令等功能;
letsvpn-latest.exe
文件名称:letsvpn-latest.exe
文件大小:23015744 字节
文件版本:3.16.4.0
MD5 :3D8F35E54A3DD41286738C8C2A9823BB
SHA1 :D8FE5C317D695733EC312C432CC39E861E46BF4B
SHA256:124E8F7CA958FD8CB2A3BAF91681513F93F73D9CFA4EFEA6F4A1F165D8CBC8D9
释放文件
通过分析,发现此样本运行后,将从文件资源段中提取载荷数据,并将载荷数据拆分成多个文件,释放至%APPDATA%\Crash目录中。
进一步分析,发现释放的文件均携带了数字签名,根据数字签名名称可确定与此次攻击活动相关的样本为libcurl.dll和qr.dll样本。
创建计划任务
通过分析,发现此样本将通过Windows Task Scheduler COM接口创建计划任务,计划任务将在用户登录时触发:
● MicrosoftEdgeUpdate_QR:C:\Windows\System32\rundll32.exe "C:\Users\admin\AppData\Roaming\Crash\qr.dll",StartQR
● MicrosoftEdgeUpdate_TenioDL:C:\Users\admin\AppData\Roaming\Crash\Crash.exe
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
通过分析,发现shellcode成功加载后:
● 将在内存中解压缩PE文件;
● 解压缩PE文件的MD5是69CECFC2549EAF971FA04212EC4A121D,与笔者《金眼狗(APT-Q-27)滥用AWS S3存储桶分发最新恶意载荷》文章中释放的远控木马Hash相同;
● 解压缩后的PE文件是一款隶属于金眼狗组织的远控木马,具备检查运行环境、内置C2地址、判断管理员权限、创建服务、远控指令等功能;
letsvpn-latest.exe
文件名称:letsvpn-latest.exe
文件大小:23015744 字节
文件版本:3.16.4.0
MD5 :3D8F35E54A3DD41286738C8C2A9823BB
SHA1 :D8FE5C317D695733EC312C432CC39E861E46BF4B
SHA256:124E8F7CA958FD8CB2A3BAF91681513F93F73D9CFA4EFEA6F4A1F165D8CBC8D9
释放文件
通过分析,发现此样本运行后,将从文件资源段中提取载荷数据,并将载荷数据拆分成多个文件,释放至%APPDATA%\Crash目录中。
进一步分析,发现释放的文件均携带了数字签名,根据数字签名名称可确定与此次攻击活动相关的样本为libcurl.dll和qr.dll样本。
创建计划任务
通过分析,发现此样本将通过Windows Task Scheduler COM接口创建计划任务,计划任务将在用户登录时触发:
● MicrosoftEdgeUpdate_QR:C:\Windows\System32\rundll32.exe "C:\Users\admin\AppData\Roaming\Crash\qr.dll",StartQR
● MicrosoftEdgeUpdate_TenioDL:C:\Users\admin\AppData\Roaming\Crash\Crash.exe
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
某远oa-xrdController.do后台-文件复制漏洞
漏洞复现
1.查看补丁
存在漏洞的Controller为xrdController首先看看补丁与漏洞代码有何不同 重点关注 checkIsSign 方法中的 fileName 参数 在有漏洞的版本之中直接通过接收 http的参数来拼接路径 (所以这个时候我们通过传入 ../../ 就能达到目录穿越的效果) 然而在补丁之中则是通过
2.漏洞分析
由下述代码可以得知 http 需要接受 两个参数 一个是 summaryId 另外一个参数则是 attList ( attList fildData[0] 则是我们需要传入的 fileid , fildData[1]则是我们传入的 filename 通过 $ 符号分割)
接着我们来看一下 创建文件夹 与 创建文件的 两个方法 createDir 与 decrypt 可以看到都是很耿直的方法没有经过任何过滤。
getFile 传入的就是fileid
所以这个时候理论上我们只需要再上传一个文件拿到fileid即可 这里我们采用 fileUpload.do 的 processUpload 方法上传 回包记录 fileid
3.构造POC
这个时候就可以开始构造最终POC 这里是有一点小鸡肋的 我们得知道 web的绝对路径 才可以写入web目录
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
漏洞复现
1.查看补丁
存在漏洞的Controller为xrdController首先看看补丁与漏洞代码有何不同 重点关注 checkIsSign 方法中的 fileName 参数 在有漏洞的版本之中直接通过接收 http的参数来拼接路径 (所以这个时候我们通过传入 ../../ 就能达到目录穿越的效果) 然而在补丁之中则是通过
fileName = (new File(Strings.getCanonicalPath(fileName))).getName(); 来获取 fileName 从而限制传参达到过滤的效果
2.漏洞分析
由下述代码可以得知 http 需要接受 两个参数 一个是 summaryId 另外一个参数则是 attList ( attList fildData[0] 则是我们需要传入的 fileid , fildData[1]则是我们传入的 filename 通过 $ 符号分割)
接着我们来看一下 创建文件夹 与 创建文件的 两个方法 createDir 与 decrypt 可以看到都是很耿直的方法没有经过任何过滤。
getFile 传入的就是fileid
/seeyon/xrdController.do?method=checkIsSign&summaryId=123&attList={fildData[0]}${fildData[1]}所以这个时候理论上我们只需要再上传一个文件拿到fileid即可 这里我们采用 fileUpload.do 的 processUpload 方法上传 回包记录 fileid
3.构造POC
这个时候就可以开始构造最终POC 这里是有一点小鸡肋的 我们得知道 web的绝对路径 才可以写入web目录
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
现代C2框架中Beacon级联机制深度解析:TCP与SMB协议下的树状代理网络构建
基础概念
1.1 级联协议
当然并非所有的通信协议协议都能承当级联网络的基底,在现代C2框架中常常将TCP、SMB作为Windows内网域中的级联协议。
TCP Beacon之所以成为通用选择,不仅因为其全双工特性,更在于它的协议无状态性为封装提供了最大自由度,充当着不同协议的通用胶合层,适用在不同的操作系统。具体体现为当父Beacon作为gateway,将Team Server的HTTP/DNS流量转换为内部私有协议,再通过TCP socket连接透传给子Beacon。除此之外,在AD域中也存在TCP+SMB的组合形成级联。
SMB Beacon(命名管道)的价值在于利用Windows域的信任基础设施,与TCP一样,SMB也可以充当着不同协议的通用胶合层,但它更多的是用在Windows上。在AD环境中,SMB流量比异常的TCP端口连接更"正常"——文件共享、组策略更新、认证票据交换都依赖445端口。更关键的是,SMB级联支持无端口监听:子Beacon通过连接父Beacon暴露的命名管道实现反向级联,这在主机层不留TCP监听端口,规避了端口扫描的风险。
由上面的两条规则很容易就构造出一个级联网络拓扑图出来。注意:在实际的C2服务器编写中,监听器(listener)才是与各个gateway保持着物理连接的角色,为了描述方便我下图中的拓扑结构忽略了监听器。
从图片中可以找到以下路径
1. 路径1:server<->getway1<->pivot1<->pivot4
2. 路径2:server<->getway1<->pivot2
3. 路径3:server<->getway2<->pivot3
4. 路径4:server<->getway3
其中路径1是非常典型的三级网络,路径3是典型的二级网络,下文将围绕这两条路径编写代码和运行过程的分析,不过在进行代码编写之前,有必要说几个定义:
(一)Gateway (网关节点):与 Teamserver 建立直连连接的 Agent,作为整个代理树的根锚点,所有来自子树的流量必须经过Gateway上报。
(二)Pivot (跳板节点):通过父节点间接注册到 Server 的 Agent,处于代理链中间层或末端
(三)寻路算法(路由算法):基于源路由 思想的逐跳封装,即从目标节点从下往上寻找父亲节点,直到寻找到Gateway节点
(四)连接上游(Upstream):维护与父节点的唯一连接(很好的体现了规则1),作为控制通道和数据出口,主要负责接收来自上游的数据、识别指令以及下行转发
(五)管理下游 (Children):维护到多个子节点的连接池(体现了规则2),实现代理链的纵向扩展,主要负责 上行封装 以及 本地自治
(六)级联网络(多级代理):一种基于树形拓扑构建的分层代理架构,通过严格遵循"单父多子"的约束规则,将原本直接暴露的C2通信链路重构为逐跳封装的代理链。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
基础概念
1.1 级联协议
当然并非所有的通信协议协议都能承当级联网络的基底,在现代C2框架中常常将TCP、SMB作为Windows内网域中的级联协议。
TCP Beacon之所以成为通用选择,不仅因为其全双工特性,更在于它的协议无状态性为封装提供了最大自由度,充当着不同协议的通用胶合层,适用在不同的操作系统。具体体现为当父Beacon作为gateway,将Team Server的HTTP/DNS流量转换为内部私有协议,再通过TCP socket连接透传给子Beacon。除此之外,在AD域中也存在TCP+SMB的组合形成级联。
SMB Beacon(命名管道)的价值在于利用Windows域的信任基础设施,与TCP一样,SMB也可以充当着不同协议的通用胶合层,但它更多的是用在Windows上。在AD环境中,SMB流量比异常的TCP端口连接更"正常"——文件共享、组策略更新、认证票据交换都依赖445端口。更关键的是,SMB级联支持无端口监听:子Beacon通过连接父Beacon暴露的命名管道实现反向级联,这在主机层不留TCP监听端口,规避了端口扫描的风险。
由上面的两条规则很容易就构造出一个级联网络拓扑图出来。注意:在实际的C2服务器编写中,监听器(listener)才是与各个gateway保持着物理连接的角色,为了描述方便我下图中的拓扑结构忽略了监听器。
从图片中可以找到以下路径
1. 路径1:server<->getway1<->pivot1<->pivot4
2. 路径2:server<->getway1<->pivot2
3. 路径3:server<->getway2<->pivot3
4. 路径4:server<->getway3
其中路径1是非常典型的三级网络,路径3是典型的二级网络,下文将围绕这两条路径编写代码和运行过程的分析,不过在进行代码编写之前,有必要说几个定义:
(一)Gateway (网关节点):与 Teamserver 建立直连连接的 Agent,作为整个代理树的根锚点,所有来自子树的流量必须经过Gateway上报。
(二)Pivot (跳板节点):通过父节点间接注册到 Server 的 Agent,处于代理链中间层或末端
(三)寻路算法(路由算法):基于源路由 思想的逐跳封装,即从目标节点从下往上寻找父亲节点,直到寻找到Gateway节点
(四)连接上游(Upstream):维护与父节点的唯一连接(很好的体现了规则1),作为控制通道和数据出口,主要负责接收来自上游的数据、识别指令以及下行转发
(五)管理下游 (Children):维护到多个子节点的连接池(体现了规则2),实现代理链的纵向扩展,主要负责 上行封装 以及 本地自治
(六)级联网络(多级代理):一种基于树形拓扑构建的分层代理架构,通过严格遵循"单父多子"的约束规则,将原本直接暴露的C2通信链路重构为逐跳封装的代理链。
beacon> help connect
Use: connect [target]
connect [target] [port]
Connect to a TCP Beacon and re-establish control of it. All requests for
connected Beacon will go through this Beacon.
Use 'unlink' to disconnect from a TCP Beacon.
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
CVE-2026-25049 仍可绕过:复现并发现新的对象解构变体
这里是在CVE-2026-25049出来后第一时间就进行了复现,但是这里快复现完了发现了貌似这里也没有完全修复好,所以进行了一定的构造和验证,经过证明是能稳定复现而且危害极大的,后面将漏洞的验证以及过程发给n8n团队,过完年后一看,n8n官方说的是n8n项目的v1.x版本后面会停止更新了,而这个漏洞主要是针对CVE-2026-25049修补后的v1.x这个分支,而v2.x分支影响就很小了,也是运气不好,最后没有提供cve编号
n8n 的核心功能之一是允许用户在节点参数里写表达式,例如 {{$json.foo}}。
原始利用逻辑
在 CVE-2025-68613 之前,这个表达式引擎的上下文隔离做得不够干净。攻击者可以通过访问对象的构造函数,一路摸到 Node.js 的全局环境。
这里就不自己去跟一遍了,毕竟不是最新的漏洞,网上有很多的分析文章,这里参考一位研究者的source-to-sink https://fatihhcelik.github.io/posts/n8n-RCEs-A-Tale-of-4-Acts/
那这里的关键点出错在哪儿
关键失败点是:表达式里跑了一个函数(IIFE),在非严格模式下,函数里的 this 会指向全局对象(global object)。Fatih 的复盘里把核心逻辑写得非常直白:IIFE 中 this = global object,而 global.process 是真实 Node.js process,不是放进 data 里的那个安全 proxy。
换句话说 n8n 以为自己把 data.process 换成了“安全版 process”,表达式执行时就只能看到它。但攻击者不从 data 取,而是用 IIFE 抓到真实 this,直接绕开 data 的代理,摸到 global.process。
●
●
这就演示了:你以为给了“安全 data”,但攻击者根本不看它,直接从 this/global 旁路拿真实东西。
执行后得到你本机的node环境(明明准备了一个“安全替身”,但代码照样能拿到“真实的 Node 环境”。),CVE-2025-68613 的核心就是:攻击者通过 JS 的语法/执行上下文特性(典型就是 this 或类似路径)绕开净化上下文,最终摸到真实 Node 能力(真实的process、模块加载、执行等)
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
这里是在CVE-2026-25049出来后第一时间就进行了复现,但是这里快复现完了发现了貌似这里也没有完全修复好,所以进行了一定的构造和验证,经过证明是能稳定复现而且危害极大的,后面将漏洞的验证以及过程发给n8n团队,过完年后一看,n8n官方说的是n8n项目的v1.x版本后面会停止更新了,而这个漏洞主要是针对CVE-2026-25049修补后的v1.x这个分支,而v2.x分支影响就很小了,也是运气不好,最后没有提供cve编号
n8n 的核心功能之一是允许用户在节点参数里写表达式,例如 {{$json.foo}}。
原始利用逻辑
在 CVE-2025-68613 之前,这个表达式引擎的上下文隔离做得不够干净。攻击者可以通过访问对象的构造函数,一路摸到 Node.js 的全局环境。
这里就不自己去跟一遍了,毕竟不是最新的漏洞,网上有很多的分析文章,这里参考一位研究者的source-to-sink https://fatihhcelik.github.io/posts/n8n-RCEs-A-Tale-of-4-Acts/
那这里的关键点出错在哪儿
关键失败点是:表达式里跑了一个函数(IIFE),在非严格模式下,函数里的 this 会指向全局对象(global object)。Fatih 的复盘里把核心逻辑写得非常直白:IIFE 中 this = global object,而 global.process 是真实 Node.js process,不是放进 data 里的那个安全 proxy。
换句话说 n8n 以为自己把 data.process 换成了“安全版 process”,表达式执行时就只能看到它。但攻击者不从 data 取,而是用 IIFE 抓到真实 this,直接绕开 data 的代理,摸到 global.process。
import subprocess
import textwrap
js = textwrap.dedent(r"""
// 这是一个“玩具环境”,只为了说明漏洞原理:
// 1) 准备了一个“安全 data.process”
// 2) 但攻击者在非严格函数里用 this 拿到真实 global,从而绕开 data
// 假装这是 n8n 准备的安全上下文
const data = {
process: { platform: "SAFE_PROXY_PLATFORM", version: "SAFE_PROXY_VERSION" }
};
// 真实 Node 全局
globalThis.__REAL_PLATFORM__ = process.platform;
globalThis.__REAL_VERSION__ = process.version;
// 攻击者表达式(概念化):利用非严格函数 this 指向全局对象
function attacker() {
// 非严格模式下,this 指向 globalThis(在很多场景里就是这样)
// 这里用“读版本”证明你拿到的不是 data.process
return {
safe_proxy_process: data.process,
leaked_real_process: { platform: this.__REAL_PLATFORM__, version: this.__REAL_VERSION__ }
};
}
console.log(JSON.stringify(attacker.call(globalThis), null, 2));
""")
out = subprocess.check_output(["node", "-e", js], text=True)
print(out)
●
safe_proxy_process 是你伪造的安全对象 ●
leaked_real_process 是从 globalThis 拿到的真实 Node 环境信息 这就演示了:你以为给了“安全 data”,但攻击者根本不看它,直接从 this/global 旁路拿真实东西。
执行后得到你本机的node环境(明明准备了一个“安全替身”,但代码照样能拿到“真实的 Node 环境”。),CVE-2025-68613 的核心就是:攻击者通过 JS 的语法/执行上下文特性(典型就是 this 或类似路径)绕开净化上下文,最终摸到真实 Node 能力(真实的process、模块加载、执行等)
docker pull ghcr.io/n8n-io/n8n:1.121.0
docker run -d --name n8n \
-p 5678:5678 \
-e N8N_LISTEN_ADDRESS=0.0.0.0 \
-e N8N_HOST=106.53.88.90 \
-e N8N_PROTOCOL=http \
-e N8N_PORT=5678 \
-e N8N_EDITOR_BASE_URL=http://106.53.88.90:5678/ \
-e WEBHOOK_URL=http://106.53.88.90:5678/ \
-e N8N_SECURE_COOKIE=false \
-v ~/.n8n:/home/node/.n8n \
ghcr.io/n8n-io/n8n:1.121.0
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
❤1👍1