Linux 服务器挖矿木马防护实战:快速切断、清理与加固20250114
Linux 服务器挖矿木马防护实战:快速切断、清理与加固
引言
挖矿木马作为一种常见的恶意软件,对服务器资源和安全构成严重威胁。据安全机构统计,2023 年全球约 45%的 Linux 服务器遭受过挖矿木马攻击,平均每台被感染服务器每月造成 300-500 美元的额外电费支出。
本文将围绕三个核心环节,详细讲解应对挖矿木马的完整防护方案:
- 快速响应:第一时间切断攻击路径
- 全面清理:系统性清除感染源
- 系统加固:建立长效防护机制
一、快速响应:切断攻击路径
1.1 网络层面阻断
💡 首要任务是切断攻击者的通信渠道,防止进一步的数据泄露和控制指令。
# 1. 识别可疑连接(常见矿池端口)
netstat -antp | grep -E ":(3333|14444|14433|3357)"
# 2. 阻断攻击IP(注意保存规则防止重启失效)
iptables -A INPUT -s <攻击IP> -j DROP
iptables -A OUTPUT -d <攻击IP> -j DROP
iptables-save > /etc/iptables/rules.v4
1.2 用户权限隔离
🔑 清理受感染账户的访问权限,防止攻击者重新登录。
# 1. 修改用户密码
passwd <用户名>
# 2. 清理SSH密钥(为什么要这样做?防止攻击者留下后门)
find / -name "authorized_keys" -exec rm -f {} \;
# 3. 限制SSH访问(仅允许特定IP)
echo "sshd: 192.168.1.0/24" >> /etc/hosts.allow
echo "sshd: ALL" >> /etc/hosts.deny
1.3 初步进程清理
⚡ 快速终止可疑进程,为后续深入清理争取时间。
# 自动化清理脚本(初步应急)
cat > /tmp/quick_clean.sh <<'EOF'
#!/bin/bash
# 清理常见挖矿进程
ps aux | grep -i "kswapd0\|kdevtmpfsi\|cryptonight\|minerd" | \
awk '{print $2}' | xargs -I {} kill -9 {}
# 清理可疑网络连接
netstat -antp | grep -E ":(3333|14444|14433|3357)" | \
awk '{print $7}' | cut -d'/' -f1 | xargs -I {} kill -9 {}
EOF
bash /tmp/quick_clean.sh
二、全面清理:系统性清除感染源
2.1 深度进程清理
🔍 通过多维度分析,确保不遗漏任何可疑进程。
# 1. CPU异常进程排查
ps aux --sort=-%cpu | head -10
# 2. 可疑进程溯源(进阶技巧)
for pid in $(ps aux | awk '$3>80.0{print $2}'); do
echo "=== PID $pid ==="
ls -l /proc/$pid/exe
ls -l /proc/$pid/cwd
strings /proc/$pid/cmdline
done
2.2 定时任务清理
⏰ 攻击者常用定时任务实现持久化,必须彻底清理。
# 综合清理脚本
cat > /usr/local/bin/cron_clean.sh <<'EOF'
#!/bin/bash
# 1. 清理用户定时任务
for user in $(cut -f1 -d: /etc/passwd); do
crontab -u $user -l 2>/dev/null | grep -v "wget\|curl" | crontab -u $user -
done
# 2. 检查系统定时任务
for cronfile in /etc/cron.d/* /etc/crontab /var/spool/cron/*; do
if [ -f "$cronfile" ]; then
cp "$cronfile" "$cronfile.bak"
sed -i '/wget\|curl/d' "$cronfile"
fi
done
EOF
chmod +x /usr/local/bin/cron_clean.sh
三、多服务器场景应急处理
3.1 通用应急脚本设计
🔄 面对多台服务器同时被攻击的情况,需要自动化工具提高响应效率。
malware_cleanup.sh
#!/bin/bash
# 普通用户清理木马脚本 (最终优化版)
# 功能:彻底清理恶意任务、文件和配置
set -euo pipefail
LOGFILE="$HOME/malware_cleanup_$(date +%Y%m%d%H%M%S).log"
log() {
echo "[INFO] $1" | tee -a "$LOGFILE"
}
# 查询模块
query_high_cpu_processes() {
log "查询 CPU 占用高的进程..."
ps -u "$USER" -o pid,comm,args,%cpu --sort=-%cpu | head -n 10 | tee -a "$LOGFILE"
}
query_crontab() {
log "查询用户 crontab..."
crontab -l 2>/dev/null | tee -a "$LOGFILE" || log "未设置 crontab 任务"
}
# 清理模块
backup_crontab() {
log "备份用户 crontab..."
crontab -l > "$HOME/crontab_backup_$(date +%Y%m%d%H%M%S).bak" 2>/dev/null || log "未发现 crontab 任务"
}
clean_crontab() {
log "清理用户 crontab 中的恶意任务..."
crontab -l | grep -vE "wget|curl|/tmp|/var/tmp|pwndns" | crontab - || log "crontab 清理完成"
log "清理后用户 crontab 内容如下:"
crontab -l 2>/dev/null | tee -a "$LOGFILE" || log "未设置 crontab 任务"
}
validate_and_terminate_process() {
local pid="$1"
log "验证进程 PID=$pid..."
# 检查进程运行命令路径
local cmdline=$(cat /proc/"$pid"/cmdline 2>/dev/null || echo "无法读取")
log "运行命令路径: $cmdline"
# 检查进程打开的文件和网络连接
log "检查进程 PID=$pid 的打开文件和网络连接..."
lsof -p "$pid" | tee -a "$LOGFILE" || log "无法获取 PID=$pid 的文件信息"
# 判断是否包含恶意路径
if [[ "$cmdline" =~ "/tmp" || "$cmdline" =~ "/var/tmp" || "$cmdline" =~ "-bash" ]]; then
log "确认 PID=$pid 是恶意进程,尝试终止..."
kill -TERM "$pid" 2>/dev/null || log "无法优雅终止 PID=$pid,尝试强制终止"
sleep 0.5
kill -9 "$pid" 2>/dev/null || log "无法强制终止 PID=$pid,请人工检查"
kill -0 "$pid" 2>/dev/null && log "PID=$pid 未成功终止" || log "PID=$pid 已成功终止"
else
log "PID=$pid 未检测到明显异常,但建议人工确认"
fi
}
terminate_high_cpu_process() {
log "获取当前用户 CPU 占用最高的进程..."
local pid=$(ps -u "$USER" -o pid --sort=-%cpu | awk 'NR==2 {print $1}')
if [ -z "$pid" ]; then
log "未找到高 CPU 占用的进程,退出清理。"
return
fi
validate_and_terminate_process "$pid"
}
clean_malicious_files() {
log "清理恶意文件和目录..."
for file in /tmp/.pwn /tmp/-bash /var/tmp/.update /var/tmp/.systemd; do
if [ -e "$file" ]; then
log "删除文件或目录 $file"
chattr -i "$file" 2>/dev/null || true
rm -rf "$file"
fi
done
}
clean_shell_configs() {
log "清理 shell 配置文件..."
for shell_file in "$HOME/.bash_profile" "$HOME/.bashrc" "$HOME/.profile"; do
if [ -f "$shell_file" ]; then
log "检查并清理 $shell_file"
sed -i '/\/tmp\/-bash/d' "$shell_file"
sed -i '/pw\.pwndns\.pw/d' "$shell_file"
sed -i '/cp -f -r/d' "$shell_file"
fi
done
}
main() {
case "$1" in
query)
query_high_cpu_processes
query_crontab
;;
clean)
backup_crontab
clean_crontab
terminate_high_cpu_process
clean_malicious_files
clean_shell_configs
;;
*)
log "用法: $0 {query|clean}"
exit 1
;;
esac
}
main "$@"
1.清理恶意进程:
•自动识别高 CPU 占用进程。
•使用 validate_and_terminate_process 验证命令路径是否包含恶意目录 /tmp 或 /var/tmp,并强制终止。
2.清理恶意文件:
•针对目录如 /tmp/.pwn 增加了 rm -rf 的处理逻辑。
3.清理 Crontab:
•先备份后清理,避免误操作。
•通过 grep -vE 排除常见恶意任务。
4.清理配置文件注入:
•针对 .bash_profile、.bashrc 等文件,删除可能的恶意代码行。
3.2 批量部署与执行
🚀 使用 Ansible 实现自动化部署和执行。
# playbook.yml
---
- hosts: all
become: yes
tasks:
- name: 复制应急脚本
copy:
src: cleanup_script.sh
dest: /tmp/cleanup_script.sh
mode: "0755"
- name: 执行清理脚本
shell: /tmp/cleanup_script.sh
register: cleanup_result
- name: 收集清理日志
fetch:
src: /var/log/malware_cleanup_*.log
dest: logs/
3.3 执行效果监控
# 批量检查清理结果
ansible all -m shell -a "grep 'cleaned' /var/log/malware_cleanup_*.log"
# 检查系统状态
ansible all -m shell -a "top -bn1 | head -5"
五、最佳实践与经验总结
5.1 核心经验
- 快速响应最关键
- 第一时间切断攻击者通信
#!/bin/bash
# 切断常见挖矿木马的通信端口和攻击者 IP
SUSPICIOUS_PORTS=("3333" "14444" "14433" "443")
for port in "${SUSPICIOUS_PORTS[@]}"; do
netstat -antp | grep ":$port" | awk '{print $7}' | cut -d'/' -f1 | xargs -I {} kill -9 {}
done
# 动态添加阻断规则(IP 示例)
iptables -A INPUT -s 192.168.1.100 -j DROP
iptables -A OUTPUT -d 192.168.1.100 -j DROP
iptables-save > /etc/iptables/rules.v4
- 保留必要的取证信息
#!/bin/bash
# 保存可疑进程、网络连接和关键文件信息
FORENSICS_DIR="/var/log/forensics"
mkdir -p $FORENSICS_DIR
# 保存可疑进程信息
ps aux | grep -E "kswapd0|kdevtmpfsi|cryptonight|minerd" > "$FORENSICS_DIR/suspicious_processes.log"
# 保存可疑网络连接
netstat -antp | grep -E ":(3333|14444|14433)" > "$FORENSICS_DIR/suspicious_connections.log"
# 保存近期修改文件信息
find / -type f -mtime -7 > "$FORENSICS_DIR/recently_modified_files.log"
- 清理必须彻底
- 检查所有可能的持久化途径
#!/bin/bash
# 检查定时任务、启动项和动态链接库的持久化方式
LOGFILE="/var/log/persistence_check.log"
echo "检查定时任务:" | tee -a $LOGFILE
for user in $(cut -f1 -d: /etc/passwd); do
crontab -u $user -l 2>/dev/null | tee -a $LOGFILE
done
echo "检查系统启动项:" | tee -a $LOGFILE
systemctl list-unit-files --type=service | grep enabled | tee -a $LOGFILE
echo "检查动态链接库预加载:" | tee -a $LOGFILE
cat /etc/ld.so.preload | tee -a $LOGFILE
- 使用自动化工具提高效率
#!/bin/bash
# 自动清理常见感染路径和文件
INFECTED_PATHS=(
"/tmp/.pwn"
"/tmp/-bash"
"/var/tmp/.system*"
"~/.bash_profile"
"~/.bashrc"
)
for path in "${INFECTED_PATHS[@]}"; do
if [ -e "$path" ]; then
chattr -i $path 2>/dev/null
rm -rf $path
echo "已清理: $path"
fi
done
- 预防胜于治疗
- 建立完善的监控体系:结合 rkhunter 和 auditd 等工具进行实时监控:
# 安装和配置 rkhunter
apt install rkhunter
rkhunter --update
rkhunter --check --sk
# 配置 auditd 监控关键文件
apt install auditd
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -w /etc/shadow -p wa -k shadow_changes
auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config_changes
# 定期生成审计报告
ausearch -k passwd_changes > /var/log/audit_passwd.log
ausearch -k ssh_config_changes > /var/log/audit_ssh.log
- 定期进行安全审计
借助 lynis 等工具进行全面安全检查:
# 安装 lynis
apt install lynis
# 执行安全审计
lynis audit system > /var/log/lynis_audit.log
# 检查审计报告
grep "VULNERABLE" /var/log/lynis_audit.log
5.2 常见误区
- ❌ 仅清理表面进程
- ❌ 忽略系统加固
- ❌ 未建立长期监控
5.3 未来建议
- 部署堡垒机集中管理
- 使用容器技术隔离应用
- 建立安全基线标准
参考资料
原文地址:https://blog.csdn.net/Narutolxy/article/details/145134468
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!