关键在于识别伪装成system、network等常规词的恶意systemd服务:先用systemctl list-unit-files --type=service | grep enabled筛选启用服务,再通过systemctl cat检查execstart路径、远程加载命令及文件真实性,结合systemctl status、ps、ss和lsof验证进程与网络行为,确认后停用禁用、删除unit文件及二进制,并重载配置。

排查并清理隐藏在系统服务名下的后门进程,关键在于识别“看似合法、实为伪装”的 systemd 服务单元。攻击者常将恶意程序注册为 enabled 服务,名称模仿 system、network、update、sync 等常规词汇,启动后驻留内存、监听端口或执行远程指令,但不暴露真实路径或行为。
检查异常启用的服务
先列出所有开机自启的服务,聚焦名称可疑、描述模糊、启动时间异常的条目:
- 运行 systemctl list-unit-files --type=service | grep enabled,筛出全部启用服务
- 重点关注含 update、check、sync、agent、helper、daemon、watch、monitor 等泛义词的服务(如 system-update.service、kernel-sync.service)
- 用 systemctl is-enabled servicename 验证是否真被设为启用;有些后门会伪造 unit 文件但未实际启用
验证服务单元文件真实性
每个服务背后都有一个 .service 文件,后门常篡改 ExecStart 或指向伪装路径:
- 执行 systemctl cat servicename 查看完整配置,重点检查:
– ExecStart= 是否指向 /tmp、/dev/shm、/var/tmp 下的可执行文件
– 是否包含 nohup curl -sL http://... | sh 或 wget -qO- ... | bash 类远程加载命令
– 是否使用 EnvironmentFile= 加载外部变量(可能藏有动态路径) - 若 ExecStart 指向二进制,用 ls -l /path/to/binary 和 file /path/to/binary 检查是否为 ELF 可执行文件,而非脚本或链接到 /dev/null
- 对比同名服务在干净系统中的原始 unit 内容(如从相同发行版 ISO 提取),确认 Description、After、WantedBy 是否被篡改
关联进程与网络行为验证
服务启用后必然生成进程,并可能建立网络连接。仅看 unit 文件不够,必须落地到运行态:
- 运行 systemctl status servicename,记下 Main PID;再用 ps -fp PID 查其完整命令行和工作目录
- 执行 ss -tunlp | grep :PORT 或 lsof -i -Pn -p PID,确认该进程是否监听非业务端口(如 31337、5555、65534)
- 检查进程打开的文件:ls -l /proc/PID/fd/,留意是否持有 socket:[*]、pipe:* 或指向 /tmp/.xxx 的文件句柄
- 若发现进程无对应 unit 文件,或 unit 文件存在但进程不在 systemctl list-processes 输出中,说明服务已被绕过或劫持
安全清除与加固
确认为后门服务后,清除需彻底,防止残留触发复活:
- 立即停用并禁用:systemctl stop servicename && systemctl disable servicename
- 删除 unit 文件:rm /etc/systemd/system/servicename.service(优先删此);若在 /usr/lib/systemd/system/ 下,说明可能来自恶意包,需进一步查 rpm/dpkg 来源
- 删除 ExecStart 指向的二进制或脚本,并用 find / -inum INODE_NUM -delete 2>/dev/null 清理硬链接残留(先用 stat 获取 inode)
- 重载配置并清理缓存:systemctl daemon-reload && systemctl reset-failed
- 最后执行 systemctl list-dependencies --reverse servicename,确认无其他服务依赖它,避免误删引发连锁故障











