直接筛出已启用且非系统自带的systemd服务,重点检查execstart是否指向/tmp、/dev/shm等非常规路径或含curl|sh等远程加载指令,结合systemctl cat、strings分析及/proc/pid/exe验证真实路径,识别磁盘落盘或内存注入型后门。

直接看启用但非系统自带的服务,重点查 ExecStart 是否指向 /tmp、/dev/shm、/var/tmp 或含远程下载逻辑的命令——这是 systemd 后门最常见、最危险的落地方式。
怎么快速筛出可疑的已启用服务
别扫全部服务,只聚焦真正开机自启、又大概率不是系统或业务自带的项:
- 运行
systemctl list-unit-files --type=service --state=enabled,导出结果 - 排除发行版基础服务:
apt list --installed | grep systemd(Ubuntu/Debian)或rpm -qa | grep -E "(systemd|coreos)"(CentOS/RHEL),再比对服务名是否在其中 - 重点关注名称含
update、sync、backup、log、monitor、agent、helper、watch、svc1234、x86_64的服务,或纯数字、乱码命名(如a7b9c.service) - 用
systemctl is-enabled servicename再确认一次——有些后门只放 unit 文件,实际未启用,会干扰判断
怎么验证服务配置是否被恶意篡改
静态配置是第一道防线,但攻击者常在这里埋雷:
- 执行
systemctl cat servicename.service,重点看:ExecStart=是否指向/tmp、/dev/shm、/var/tmp、/root/.local/bin等非常规路径 - 检查是否含
curl -sL | sh、wget -qO- | bash、bash -c、python3 -c、nohup nc类远程加载或反弹 shell 指令 - 若使用
EnvironmentFile=,说明可能藏动态路径,需cat对应文件进一步分析 - 若
ExecStart指向脚本,用ls -l /path/to/script查权限和修改时间;若指向二进制,用file /path/to/binary确认类型,再strings /path/to/binary | grep -E "(http|nc|bash|python|base64)"提取硬编码线索
怎么确认进程真实执行路径是否一致
配置没问题,不代表运行时没被绕过。必须落到进程态验证“言行一致”:
- 运行
systemctl status servicename,记下Main PID;再用ps -fp PID看真实命令行、工作目录和父进程 - 执行
ls -l /proc/$(systemctl show --value --property=MainPID servicename.service)/exe 2>/dev/null,确认真实可执行文件路径——若显示(deleted)或指向临时目录,基本坐实为后门 - 特别注意:若该服务绑定了
DynamicUser=yes但没配RestrictAddressFamilies=或其他沙箱限制,也属高风险配置
怎么发现运行时注入而非磁盘落盘的后门
攻击者可能根本不写文件,而是通过 systemctl daemon-reload 把恶意 unit 直接加载进内存:
- 运行
systemctl show --property=FragmentPath servicename.service,若返回空或路径为/run/systemd/system/(而非/usr/lib/systemd/system/或/etc/systemd/system/),说明该服务是运行时注入的,极大概率是后门 - 对比
systemctl cat servicename输出与cat /etc/systemd/system/servicename.service(或对应路径)内容是否一致;不一致即存在篡改或覆盖 - 检查
systemctl show servicename | grep -E "(WantedBy|RequiredBy|BindsTo)",若绑定到非常规 target(如自定义 timer 或network-pre.target),需人工核验合理性
真正难排查的不是名字奇怪的服务,而是那些名字合规、配置看似干净、却在 ExecStartPost 或环境变量里做手脚的服务——务必查完整启动链,别只盯 ExecStart 一行。











