此文仅凭回忆,部分失真。并非时间顺序,中间有穿插。
四年前某个早晨,朋友公司的网站被入侵,你没看错我这个朋友网站经常被入侵。朋友的网站是做产品发布的,经常发布一些产品信息。
网站被植入暗链与问题内容,百度搜索页面时会搜到色情与博彩内容,没有迟疑,跟朋友以及他们系统运维开了个碰头会,简单介绍了下网络结构、应用结构、系统部署情况、以及异常现象。了解这些信息后开始着手计划这次事件可能出现问题的点。
先来介绍下系统情况。网络情况,网络的话,暂且认为服务器接入同一个大的接入层交换机,服务器间没有硬件防火墙,可随意相互访问,服务器全部内网ip,使用负载均衡来对外提供服务。
应用情况,应用可分为两种,第一种是产品发布应用,有数据库服务器、应用服务器、前端服务器,大致业务流程是应用服务器将数据保存到数据库,然后同时定期从数据库生成静态页面放到前端服务器,前端服务器与应用服务器通过共享存储来实现数据共享。正是这套系统出现了异常现象。第二种就是bbs以及一些小功能网站。接下来就是着手准备做溯源分析了,先说个结果,下面说的所有分析都没有结果,最后是通过流量镜像分析来判断黑客入侵过程的,最终也没找到入口,可疑的入口很多,但是并没有直接证据证明那就是黑客进来的入口。但是溯源就是这样,找不到黑客进来的入口,能找到所有可疑入口也可以,封锁所有入口也能实现有效防护,这一点比较难做。这是四年前的事,彼时我对安全事件处理的流程和想法都还比较稚嫩,跟大多数同学一样,先看日志。通过这次网络安全事件总结不少有用的应急技巧在之前的文章里有提到。下面是这次安全事件的具体应急过程。
由于出问题的是产品发布系统,查看了产品发布系统前端的访问日志,并没有发现问题,日志快看完才意识到这是台静态页面服务器,直接转向查看系统登录日志,特别是/var/log下面日志,并没有发现问题,而且这台服务器没有写共享存储权限。既然前端没有发现问题,那么做了个猜测,有可能是产品发布账号泄露导致发布了问题页面,但是经过与应用开发人员沟通,否定了这种猜测,问题页面的结构不符合产品发布页面的结构,那么问题页面有可能是直接放到服务器上的。能写共享存储的服务器就一种,就是产品发布服务器,有3台的样子。每一台都有可能将问题页面放到共享存储。这就存在一个问题,这种直接通过命令生成或直接下载到存储的页面根本没有日志记录,没有日志可看。而且这几台产品发布服务器/var/log 目录被清空。虽然日志被清空,但可以确定黑客通过ssh登录这些服务器。黑客以及获取了root密码。后来通过沟通,这几台root密码为弱密码,大概长的像123456这种,及其容易被猜测到。看了下这几台服务器的系统文件时间,并没有异常,文件修改时间比较统一,均为系统安装时的时间点。这一点后来经过证实,部分文件是被修改过的,只不过黑客伪造文件时间,至少看上去是发现不了异常。通知运维人员修改这几台服务器的所有密码包括数据库、发布账号密码、清除有问题的页面,但隔几天又出现问题页面。当再次出现问题时,第一怀疑的是产品发布应用有漏洞,但是查看日志后并没有发现异常。清除问题页面、修改账户密码后,产品发布系统就这么搁下一段时间。
接下来是bbs应用系统,这套系统用的是动态脚本写的。第一时间也是看访问日志,但套系统安全事件时的访问日志全部被清空,/var/log也被清空。没有日志可查,用webshellkill查了下webshell没有结果。但这套系统肯定是有问题。将系统升级成最新版本,使用安全防护库,针对web攻击添加各种过滤规则,设定web文件夹权限,使得文件具有可写的不可执行、可执行的不可修改的权限,同时修改所有密码。经过讨论又添加了iptables规则,当时这一点没有做到严格的设置规则,给后边埋下隐患,好在摸清黑客入侵路径后重新制定了严格的防火墙规则。
当做完所有防护措施,感觉已经是铜墙铁壁了。但第二天问题页面依旧出现。
最后朋友建议将这两套系统的所有流量镜像到某服务器、同时将问题页面删除,试图抓取黑客再次来的时候的流量。事实上正是这项措施,将黑客入侵路近给摸清了。通过分析流量包发现黑客通过前端系统nginx后门进来后登录产品发布系统直接下载问题页面到共享存储。这里说明了两点第一是nginx被修改、第二是ssh被修改,黑客用来登录ssh的密码不是root密码但确实能登录系统。
接下来就是后门分析了,通过分析后门,确定了后门关键字,通过关键字确定了系统影响范围,两套系统关键服务器均被植入后门。最终将相关系统重装,应用升级,开启主机防火墙并设置好严格规则做到访问权限最小化。经过一段时间观察,并没有发现再次被入侵的痕迹。
由于日志大部分日志被清空,并没有找到最初的入侵路径。下面是做的一个猜测,黑客通过bbs漏洞进入系统,通过扫描和破解的方式获取到了root密码(彼时为弱密码)通过种植ssh后门方式持续获取主机root密码,而且当时所修改的密码基本都有规律。然后通过nginx后门保持外界持续访问。
就写这些吧,这中间很多内容做了简化。
网友评论