起因是内部自用的一台低配置 ansible 发布机器在使用时,发现CPU使用率异常,同时htop命令并没有发现异常进程

关键在于
展开代码load average: 8.04 7.82 5.40 <- 系统繁忙 %CPU(s):100.0 us <- CPU 100%用户态 但是所有进程的 %CPU 几乎均是 0.0 <- 无进程认领
展开代码# 查看CPU占用进程 ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%cpu | head

没有发现高占用CPU的进程,所以这里可以再增加一点发现:ps命令看不到高CPU消耗进程
这里想到了既然这个服务是开机自启的同时ps命令也看不到高消耗进程,那么会不会是封装成了services服务?
展开代码# 查看系统服务 systemctl list-units --type=service --state=running
刚好还真是

展开代码该服务存在的疑点是: mem-tracker 伪装成内存跟踪工具 描述为"Example systemd service." 这个是未修改的模板描述 这个不是系统自带的服务(机器未增加过自启服务)
验证是否该服务问题
展开代码top -p $(systemctl show mem-tracker.service --property=MainPID --value)

展开代码# 进程号为8165,尝试kill该进程,观察CPU是否会被释放、 sudo kill 8165

杀死该进程后,CPU确实被释放了,不过很快就重新被占满,同时更换了进程号,这里就可以确定是该服务的问题。CPU重新被占满和开机CPU自动被占满的情况相同,应该是通过配置定时任务进行的

展开代码crontab -l

现在被攻击的路径很清晰
| 层级 | 持久化机制 | 执行文件 |
|---|---|---|
| 用户 crontab | 每周五23:00 | /home/user/dealer |
| 用户 crontab | 每周五23:00 | /home/user/.cfg/dealer |
| root crontab | 每月执行 | /home/user/.cfg/dealer |
| systemd | 开机自启 | mem-tracker.service |
为什么top看不到高CPU进程?
负载与CPU显示分离的原因:
R(运行)或D(不可中断睡眠)状态top看不到展开代码# 1. 停止所有恶意进程 sudo pkill -9 -f "dealer|mem-track|miner" # 2. 停止可疑服务 sudo systemctl stop mem-tracker.service # 3. 验证停止 ps aux | grep -E "dealer|mem-track" | grep -v grep
这里可以看到CPU已经完全被释放

展开代码#!/bin/bash # cleanup_malware.sh - 完整清理脚本 echo "=== 恶意软件清理脚本 ===" # 1. 删除恶意文件 echo "[1/5] 删除恶意文件..." sudo rm -f /home/user/dealer sudo rm -rf /home/user/.cfg/ sudo find /tmp -name "*miner*" -o -name "*dealer*" -exec rm -f {} \; 2>/dev/null # 2. 清理定时任务 echo "[2/5] 清理定时任务..." crontab -r # 清理用户任务 sudo crontab -r # 清理root任务 sudo rm -f /etc/cron.d/*backdoor* 2>/dev/null # 3. 清理systemd服务 echo "[3/5] 清理系统服务..." sudo systemctl stop mem-tracker.service 2>/dev/null sudo systemctl disable mem-tracker.service 2>/dev/null sudo rm -f /etc/systemd/system/mem-tracker.service sudo systemctl daemon-reload # 4. 检查其他隐藏项 echo "[4/5] 检查启动项..." sudo rm -f /etc/rc.local ls -la /etc/init.d/ | grep -E "dealer|miner|track" # 5. 验证清理 echo "[5/5] 验证..." echo "剩余可疑进程:" ps aux | grep -E "dealer|mem-track|miner" | grep -v grep || echo "✓ 无恶意进程" echo "定时任务:" crontab -l 2>/dev/null || echo "✓ 用户任务已清空" sudo crontab -l 2>/dev/null || echo "✓ root任务已清空"

执行脚本后,可以根据前面步骤检查是否完整清除
展开代码# 1. 修改所有密码 sudo passwd user sudo passwd root # 2. 审查SSH安全 cat ~/.ssh/authorized_keys # 删除未知密钥 last | head -20 # 查看最近登录 sudo cat /var/log/auth.log | grep "Accepted" | tail -20 # 3. 禁用root远程登录 sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config sudo systemctl restart sshd # 4. 安装防护工具 sudo apt install fail2ban -y sudo systemctl enable fail2ban --now # 5. 设置监控告警 # 创建CPU监控脚本 cat << 'EOF' | sudo tee /usr/local/bin/cpu_monitor.sh #!/bin/bash LOAD=$(cat /proc/loadavg | awk '{print $1}') if (( $(echo "$LOAD > 4" | bc -l) )); then echo "High load alert: $LOAD at $(date)" | logger # 可添加邮件/钉钉告警 fi EOF sudo chmod +x /usr/local/bin/cpu_monitor.sh echo "*/5 * * * * root /usr/local/bin/cpu_monitor.sh" | sudo tee /etc/cron.d/cpu-monitor
本文作者:zzz
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!