排查systemd后门需重点检查启用但非默认的服务、可疑命名、非标准路径unit文件、ExecStart异常路径或动态加载行为、Type=oneshot+RemainAfterExit组合、EnvironmentFile指向临时目录、timer/socket/generator/drop-in等非常规持久化机制。

排查 systemd 服务类后门,关键在于识别“看起来像系统服务、实则由攻击者控制”的伪装项。这类后门不依赖 crontab 或 .bashrc,而是借 systemd 的自动加载与开机启动机制实现深度持久化,隐蔽性强、权限高、常规命令不易察觉。
检查启用但非系统默认的服务
攻击者常创建新 service 文件并设为 enabled,却不会出现在主流发行版的默认服务列表中。执行以下命令快速筛出异常:
- 列出所有启用的服务:systemctl list-unit-files --type=service | grep enabled
-
过滤掉已知合法服务名(以 CentOS/RHEL/Ubuntu 常见基线为准):
systemctl list-unit-files --type=service | awk '$2=="enabled"{print $1}' | grep -vE "(sshd|nginx|docker|cron|rsyslog|systemd-|dbus|getty|network|firewalld|polkit)" - 重点盯防名字含伪装词的服务:如 systemd-login(应为 systemd-logind)、sysmonitor、update-service、cache-manager 等看似合理但无对应软件包的服务
验证服务文件来源与内容真实性
即使服务名正常,其 unit 文件也可能被篡改。需逐个检查实际路径和内容逻辑:
- 定位 unit 文件位置:systemctl show -p FragmentPath | cut -d= -f2
- 确认是否来自标准路径:合法服务通常在 /usr/lib/systemd/system/;若落在 /etc/systemd/system/,需人工审查——该目录允许管理员覆盖,但也常被攻击者利用
- 检查 ExecStart 行是否可疑:禁止出现 /tmp、/dev/shm、/run/user/、/home/*/ 目录下的可执行路径;警惕 base64 解码、curl/wget 下载再执行、bash -c '...' 等动态加载行为
- 留意 Type=oneshot + RemainAfterExit=yes 组合:这种配置让服务“启动即退出但状态保持为 active”,常用于执行一次恶意操作后长期驻留标记,绕过进程监控
比对服务行为与运行时实际进程
有些后门服务本身不直接启动恶意进程,而是通过 ExecStartPre、ExecStartPost 或 EnvironmentFile 注入环境变量或预加载脚本,导致 ps 看不到关联进程:
- 查看完整启动上下文:systemctl cat && systemctl show
- 检查是否加载了外部环境文件:关注 EnvironmentFile= 行,若指向 /tmp/.env 或 /var/tmp/conf,立即检查该文件内容
-
查服务对应的真实 PID 及其子进程树:systemctl status -n0 后,用 pstree -ps
观察父/子关系;若主进程是 bash/python 且无业务逻辑关联,高度可疑 - 检查该服务是否以 UID 0 运行但用户名非 root:ps -eo uid,gid,comm,args | awk '$1==0 && $3 !~ /^(systemd|kthreadd)$/ {print}' —— 若输出中包含你的可疑服务名对应进程,基本可确认提权执行
扫描隐藏在 systemd 机制中的非常规持久化
高级攻击者会绕过传统 service 文件,利用 systemd 更底层的特性植入:
- 检查 timer 触发的 service:systemctl list-timers --all,排查那些触发频率异常(如每分钟)且对应 service 名称可疑的组合
- 检查 socket 激活型后门:systemctl list-sockets --all,关注监听非标端口(如 6010、54321)或绑定 0.0.0.0 的 socket 单元,其 associated service 很可能就是反弹 shell 入口
- 检查 generator 生成的临时单元:ls /run/systemd/generator*,攻击者可通过自定义 generator 在每次启动时动态注入恶意 unit
- 检查 drop-in 覆盖片段:systemctl show | grep FragmentPath 后,再查 /etc/systemd/system/.d/*.conf —— 攻击者常在此添加 ExecStartPre= 恶意指令,而不动原始 unit 文件


















