服务器突然变得卡顿,CPU占用率长期飙升至100%,风扇狂转,SSH登录反应极慢,这些现象十有八九意味着你的CentOS服务器已经沦为了挖矿肉鸡。不要慌,也不要急着重装系统。重装虽然彻底,但会丢失数据且中断业务。按照以下从应急响应到溯源加固的完整流程操作,能把木马清理干净并修复漏洞。
第一步:切断连接与保留现场登录服务器后,首要任务不是杀进程,而是限制网络连接,防止木马继续与矿池通信或下载后续载荷。但不要直接拔网线或关机,这会丢失内存中的关键取证信息。
使用iptables临时阻断所有出站流量,只保留你的SSH会话端口(假设是22端口):
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT iptables -P OUTPUT DROP
这样既断了木马与矿池的连接,又保住了你的管理通道。接着,使用script命令开启操作记录,所有后续操作都会被记录下来,方便复盘。
script -t 2>timing.log -a output.session第二步:精准定位挖矿进程
挖矿木马通常会伪装成系统进程,名字具有迷惑性,如[kworkerds]、[systemd-network]、bash、syslog等。直接用top或htop查看CPU占用最高的进程。
top -c -b -n 1 | head -20
注意观察进程的COMMAND列,特别是那些带有随机字符串目录、隐藏目录或tmp目录下执行的进程。比如进程路径显示为/tmp/.X11-unix/.rsync/cron,这就非常可疑。
使用ps命令进一步确认进程的详细信息,包括它的启动时间、父进程ID(PPID)和执行路径:
ps auxf --sort=-%cpu | head -20
重点排查以下几类异常:
1. 进程名和系统进程高度相似,但PID号很大,且由非root用户在非标准路径下启动。
2. 进程的启动命令中包含矿池地址或钱包地址,这是最直接的证据。可以用以下命令直接搜索:
ps -eo pid,cmd | grep -E 'stratum|pool|wallet|mining|cryptonight'
3. 查看/proc/[pid]/exe指向的可执行文件路径是否异常,以及/proc/[pid]/cmdline中的完整命令行。
第三步:彻底清除恶意进程与文件找到挖矿进程后,不能简单地kill了事。很多挖矿木马有守护进程或定时任务,一旦发现主进程被杀,会立刻重新拉起。
首先,使用kill -STOP [pid]暂停可疑进程,而不是直接杀死。这能让你有时间清理它的持久化机制,同时避免触发守护进程的复活逻辑。
接着,根据之前获取的进程路径,锁定恶意文件目录。挖矿木马通常隐藏在以下位置:
/tmp目录下的隐藏文件夹,如/tmp/.cache/、/tmp/.font-unix/
/var/tmp/下的可疑目录
/dev/shm/下的可执行文件
用户家目录下的隐藏目录,如~/.ssh/、~/.config/中不该出现的二进制文件
使用lsattr命令检查这些文件是否被设置了不可修改属性(i属性)或只追加属性(a属性)。如果有,先用chattr -ia [文件]去掉属性再删除。
chattr -ia /tmp/.X11-unix/.rsync/cron rm -rf /tmp/.X11-unix/.rsync/
删除后,再用find命令全盘扫描最近被修改过的文件,查找其他可能的后门:
find / -type f -newer /etc/passwd -mmin -120 2>/dev/null
这条命令会找出在过去120分钟内被修改过的文件,能帮你发现木马同时释放的其他组件。
第四步:清理持久化后门挖矿木马能长期驻留,靠的是各种持久化手段。必须逐一排查清理,否则前功尽弃。
1. 定时任务(Crontab)
检查系统级和所有用户级的定时任务:
cat /etc/crontab ls -la /etc/cron.d/ ls -la /etc/cron.hourly/ ls -la /etc/cron.daily/ cat /var/spool/cron/root cat /var/spool/cron/*
恶意任务通常会从远程下载脚本并执行,或者直接启动挖矿程序。注意那些包含base64编码、短链接、或者直接是IP地址的条目。清理时直接删除对应文件或用crontab -e编辑删除。
2. SSH免密登录
攻击者经常添加自己的公钥到authorized_keys中,实现免密登录:
cat ~/.ssh/authorized_keys cat /root/.ssh/authorized_keys
仔细检查每一条公钥末尾的注释,不认识的就整行删除。同时检查/etc/ssh/sshd_config是否开启了密码登录且允许root登录,建议修改为密钥登录并禁用root密码登录。
3. 系统服务(Systemd)
现代CentOS使用systemd管理服务,木马会创建伪装的服务单元:
systemctl list-units --type=service --state=running | grep -v 'loaded active' ls -la /etc/systemd/system/multi-user.target.wants/ ls -la /usr/lib/systemd/system/
寻找那些名称可疑、描述不清或最近被修改过的.service文件。用systemctl disable [服务名]停用,然后删除对应的服务文件。
4. 动态链接库劫持(LD_PRELOAD)
这是比较高级的手法。检查/etc/ld.so.preload文件,以及环境变量LD_PRELOAD是否被设置:
cat /etc/ld.so.preload echo $LD_PRELOAD
如果里面有指向恶意.so文件的路径,删除该文件并清空/etc/ld.so.preload。这类后门能劫持系统的读写函数,隐藏进程和文件,非常隐蔽。
5. 启动脚本和配置文件
检查/etc/rc.local、/etc/profile、~/.bashrc、~/.bash_profile等文件,看是否有被追加恶意命令。
cat /etc/rc.local cat /etc/profile cat ~/.bashrc
任何出现在末尾的、指向/tmp或其他非标准路径的可疑命令,都应该删除。
第五步:排查入侵源头与漏洞清理干净只是治标,找到入侵途径才能治本。挖矿木马最常见的入侵方式包括:SSH弱口令爆破、Web应用漏洞(如Redis未授权访问、Struts2 RCE、Log4j2漏洞)、以及第三方组件漏洞。
1. 检查SSH爆破痕迹
查看/var/log/secure日志,搜索Failed password记录:
grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | head -20
如果某个IP有数百次失败尝试,且之后出现了Accepted记录,说明SSH密码被爆破了。立即修改所有用户的密码为高强度密码,并修改SSH端口或部署fail2ban。
2. 检查Web应用漏洞
分析Web服务器日志,查找可疑的POST请求或命令注入特征:
grep -E 'wget|curl|chmod|/tmp/' /var/log/httpd/access_log grep -E 'eval|base64_decode|system' /var/log/nginx/access.log
如果发现大量包含下载命令或编码字符串的请求,说明Web应用存在远程代码执行漏洞。需要立即更新Web框架、CMS或相关插件到最新版本。
3. Redis等中间件未授权访问
检查Redis、MongoDB等数据库是否配置了密码认证和绑定IP:
netstat -tlnp | grep -E '6379|27017' ps aux | grep redis
如果这些服务监听在0.0.0.0且没有密码,攻击者可以直接写入SSH公钥或定时任务。立即为这些服务设置强密码,并限制监听地址为127.0.0.1或内网IP。
4. 内核漏洞提权
查看系统版本和内核版本,确认是否存在已知的本地提权漏洞,如Dirty Cow(脏牛):
uname -a cat /etc/redhat-release
如果内核版本过旧,普通用户可能利用漏洞获取root权限。执行yum update kernel -y升级内核,并重启服务器。
第六步:系统加固与监控部署清理和修复完成后,必须进行安全加固,防止二次入侵。
1. 修改所有用户密码,使用密码生成器创建16位以上的随机密码。禁用不必要的系统账户登录权限:
usermod -s /sbin/nologin nobody
2. 配置防火墙,严格限制开放端口。仅开放业务必须的端口,对SSH、数据库等管理端口设置IP白名单:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="你的管理IP" port protocol="tcp" port="22" accept' firewall-cmd --reload
3. 部署Auditd审计系统,监控关键目录和文件的变更。例如,监控/etc/crontab、/etc/ld.so.preload等文件的写入操作:
auditctl -w /etc/crontab -p wa -k crontab_modify auditctl -w /etc/ld.so.preload -p wa -k preload_modify auditctl -w /var/spool/cron/ -p wa -k cron_spool_modify
4. 安装并配置AIDE(高级入侵检测环境),对系统关键文件建立基线数据库,定期检查文件完整性,能及时发现被篡改的文件。
5. 限制/tmp和/dev/shm目录的执行权限。绝大多数挖矿木马都会利用这些可写可执行目录。在/etc/fstab中添加noexec挂载选项:
tmpfs /tmp tmpfs defaults,noexec,nosuid 0 0 tmpfs /dev/shm tmpfs defaults,noexec,nosuid 0 0
重新挂载后,即使木马被上传到这些目录,也无法直接执行,大大增加了攻击难度。
6. 关闭不必要的系统服务,减少攻击面。使用systemctl list-unit-files --state=enabled查看所有开机自启的服务,禁用掉不需要的。
7. 配置日志集中收集。将系统日志实时发送到远程日志服务器或云日志服务,这样即使服务器被攻破,日志也不会丢失,便于事后溯源。
完成以上所有步骤后,可以解除之前设置的iptables出站限制:
iptables -P OUTPUT ACCEPT
然后重启服务器,再次用top和ps命令确认没有异常进程启动,用netstat -antp确认没有异常外联。如果一切正常,说明清理工作已经完成。后续持续关注服务器资源使用情况,定期检查定时任务和系统日志,才能长久保持服务器的安全纯净。
