关键不是找所有服务,而是聚焦非系统默认、非业务必需、行为异常的服务:先用systemctl list-unit-files --type=service --state=enabled筛选启用服务,对比发行版基线,重点检查名称含update/sync/backup等伪装词或乱码命名的服务;再通过systemctl cat、journalctl、ls -l /proc/[pid]/exe等命令验证其配置、日志、进程路径及执行逻辑是否一致,同时扫描关联的软链接、脚本调用和双重持久化痕迹。

排查 systemd 服务启动项中的隐蔽后门,关键不是“找所有服务”,而是聚焦非系统默认、非业务必需、行为异常的服务。攻击者常利用 systemd 的灵活性伪装成合法服务,但留有可识别痕迹。
查启用但非系统默认的服务
先筛出当前开机自启、但不属于发行版基础服务集合的项:
- 运行
systemctl list-unit-files --type=service --state=enabled,导出结果 - 对比标准基线:CentOS/RHEL 可参考
rpm -qa | grep -E "systemd|coreos"后关联的 service;Ubuntu/Debian 查apt list --installed | grep systemd - 重点关注名称含
update、sync、backup、log、monitor等常见伪装词,或纯数字/乱码命名(如svc1234.service)的服务
审服务单元文件内容与执行逻辑
对可疑服务,逐个检查其配置文件和实际调用路径:
- 用
systemctl cat 服务名.service查看完整 unit 文件,注意ExecStart=指向的二进制或脚本路径 - 若指向脚本(如
/usr/local/bin/start.sh),检查该脚本权限、修改时间、内容是否含nc、bash -i、python -c、wget、curl等敏感调用 - 若指向二进制,用
file /path/to/binary看类型,strings /path/to/binary | grep -E "(http|nc|bash|python)"提取硬编码线索 - 特别留意
Type=forking且无对应PIDFile=的服务——可能绕过进程监管
验服务行为与上下文一致性
静态分析之外,必须验证服务是否“言行一致”:
- 运行
systemctl status 服务名.service,看实际运行的 PID 和ExecStart是否匹配;若显示inactive (dead)却仍被启用,属高危信号 - 用
journalctl -u 服务名.service --since "2 hours ago"查日志,关注报错(如找不到命令)、空日志、或输出中混入 base64 编码段 - 检查该服务是否声明了不合理依赖,例如一个“日志清理服务”却
Wants=network.target且After=multi-user.target——网络依赖对纯本地任务通常不必要 - 用
ls -l /proc/$(systemctl show --value --property MainPID 服务名.service)/exe 2>/dev/null确认真实进程路径,防软链接跳转
扫残留痕迹与持久化交叉点
systemd 后门往往不是孤立存在,需同步排查关联入口:
- 检查
/etc/systemd/system/multi-user.target.wants/下的软链接,确认是否指向非标准路径的 unit 文件 - 运行
find /etc/systemd/system /usr/lib/systemd/system /lib/systemd/system -name "*.service" -exec grep -l "ExecStart.*bash\|python\|nc\|sh -c" {} \; 2>/dev/null快速定位带解释器调用的服务 - 核查该服务是否在
crontab -e或/etc/cron.d/中被二次调度,形成双重持久化 - 若服务以 root 权限运行,检查其
ExecStart脚本是否写入了/tmp、/dev/shm或用户家目录下的隐藏文件











