挖矿进程识别与处置
挖矿主机的特征很集中:CPU 长时间跑满、对外连接矿池地址、进程名仿冒系统组件、二进制与脚本藏在临时目录。但处置的关键不是杀死那几个进程,而是把启动链一起清掉:计划任务、systemd 单元、登录脚本、下载器脚本与守护进程都是它复活的途径。只要启动链还留着,几小时甚至几分钟后就会重新拉起,所以处置必须按「定位来源—清启动链—杀进程—复扫」的顺序做。
基本信息
| 资源特征 | top 或 ps 显示单进程长期接近满载,多核机器上按核数累加 |
|---|---|
| 网络特征 | 连接矿池地址,常见端口有 3333、5555、7777、14444 等,端口并不固定 |
| 进程特征 | 仿冒 kworker、java、systemd 等名字,参数里带钱包地址或线程数 |
| 落地位置 | /tmp、/dev/shm、/var/tmp 下的脚本与二进制 |
| 启动链 | cron、systemd 单元与定时器、登录脚本、下载器脚本、watchdog 父子结构 |
| 证据要求 | 处置前记录进程画像、连接、命令行与样本哈希 |
典型使用场景
- 云主机 CPU 告警后确认是否存在挖矿进程
- 清理挖矿后复查启动链,防止几十分钟后复发
- 与被投毒容器区分:区分宿主机进程与容器内进程
- 统计受影响主机数量,判断是否为批量入侵
- 评估资源损失与业务影响,为后续加固与说明提供依据
定位矿工进程与启动链
定位矿工进程与启动链
ps aux --sort=-%cpu | head -n 15 # 1 资源占用排名
top -b -n 1 -o %CPU | head -n 20 # 2 快照留档
sudo ss -antp | grep -E ':(3333|5555|7777|14444)' # 3 矿池连接
sudo ls -l /proc/1234/exe /proc/1234/cwd # 4 二进制与工作目录
sudo find /tmp /dev/shm /var/tmp -type f -mtime -7 -ls 2>/dev/null | head -n 20 # 5 落地文件
crontab -l 2>/dev/null; sudo ls -la /etc/cron.d/ # 6 计划任务
systemctl list-units --type=service --state=running | head -n 20 # 7 systemd 单元
sudo grep -rEn 'curl|wget' /etc/profile /etc/profile.d/ 2>/dev/null | head特征与判据
| 维度 | 正常表现 | 挖矿特征 |
|---|---|---|
| CPU 占用 | 随业务波动 | 长期贴近满载且曲线平滑 |
| 进程名与参数 | 与安装包一致 | 仿冒系统名,参数含钱包地址或线程限制 |
| 外连端口 | 443 与业务端口为主 | 连非常规高位端口,对端固定且长期保持 |
| 落地位置 | 安装目录 | 临时目录与内存文件系统中的随机文件名 |
| 启动链 | 有明确的服务定义 | 计划任务或单元里出现下载并执行类命令 |
| 守护结构 | 无 | 父子进程互为看门狗,杀掉一个另一个会拉起 |
只杀进程不挖入口,几天内必被重新拉起:先定位启动链并逐项清理,再终止进程,最后复扫确认。若不清启动链,等于每次都在给攻击者做重启测试。
要区分宿主机与容器:容器内的挖矿进程在宿主机上也可能可见,但资源限制与网络路径不同。排查时先看容器资源统计,再用命名空间视角确认进程归属,避免清错对象。