shell 启动文件
用户级启动文件(~/.bashrc、~/.bash_profile、~/.profile、~/.zshrc)在交互式或登录 shell 启动时被 source,是最常见的账号级持久化落点:可追加别名、函数、后台任务或环境变量劫持。核查重点是 mtime/ctime、尾部追加片段,以及是否存在覆盖常用命令的 alias 与函数。
基本信息
| 适用平台 | Linux / macOS 的 bash、zsh |
|---|---|
| 用户级文件 | ~/.bashrc、~/.bash_profile、~/.profile、~/.zshrc |
| 系统级文件 | /etc/profile、/etc/bashrc、/etc/profile.d/*.sh |
| 观察点 | mtime、ctime、尾部追加内容、base64 与远程下载语句 |
| 权限 | 属主可改,root 可读全部家目录 |
| 骨架对照 | /etc/skel/ 下的同名文件 |
典型使用场景
- 排查账号级持久化与命令劫持
- 确认排查过程中哪些 alias 或函数改变了命令行为
- 与该发行版镜像的默认文件做差异比对
- 与 cron、systemd timer 等其它持久化位置联动排查
- 在用户家目录时间线中定位改动时刻
最小示例
最小示例
ls -l --time-style=long-iso /home/*/.bashrc /root/.bashrc 2>/dev/null # 时间戳总览
tail -30 /home/alice/.bashrc # 重点看尾部追加片段
grep -nE 'alias |function |curl|wget|base64|/tmp/|/dev/shm/' /home/alice/.bashrc
diff /home/alice/.bashrc /etc/skel/.bashrc # 与骨架文件比差异
find /home -maxdepth 2 \( -name '.bashrc' -o -name '.profile' \) -exec ls -l --time-style=long-iso {} +
bash -n /home/alice/.bashrc # 只做语法检查,不执行观察项与信号
| 观察项 | 含义 | 异常信号 |
|---|---|---|
| mtime | 内容最后一次修改时间 | 晚于账号最后一次登录时间 |
| ctime | 元数据最后变更时间 | 与 mtime 明显背离,或早于 mtime |
| alias 行 | 命令别名覆盖 | 把 ls、ps、ss 指向自定义脚本 |
| 函数定义 | 同名命令被函数覆盖 | 函数体内含远程下载或编码解码 |
| 环境变量 | 影响后续所有子进程 | 设置 LD_PRELOAD、代理或 BASH_ENV |
阅读这些文件用 cat 或 less,不要 source 或执行;需要判断语法时用 bash -n 校验,避免排查动作重新触发持久化。
检查范围要覆盖 root 家目录、服务账号与容器内用户,只扫 /home 会漏掉 /root/.bashrc 等关键落点。
BASH_ENV 与 ENV 变量能让非交互式 shell 也加载指定脚本,是容易被忽略的持久化旁路,值得单独核对。
多个账号的启动文件 mtime 若集中在数秒内,通常来自同一次批量投递;结合 auditd 对文件的 watch 规则可以进一步定位写入进程。
除 bash 系列外还有 shell 专属文件:zsh 读 ~/.zshrc,fish 读 ~/.config/fish/config.fish;只按 bash 命名排查会漏掉这些落点。