演练中,第一代webshell管理工具“菜刀”的攻击流量特征明显,容易被安全设备检测到,攻击方越来越少使用,加密webshell正变得越来越流行,由于流量加密,传统的WAF、WebIDS设备难以检测,给威胁监控带来较大挑战。这其中最出名就是“冰蝎”,“冰蝎”是一款动态二进制加密网站管理客户端,演练中给防守方造成很大困扰,本文将对“冰蝎”的加密原理、流量特征、检测方案进行探讨。
0x01 “冰蝎”介绍&加密原理
“冰蝎”项目地址:https://github.com/rebeyond/Behinder
“冰蝎”目前最新版本为v2.1,兼容性已经日益完善,加密不再依赖PHP openssl扩展功能,同时支持了简单的ASP。主体功能方面包括虚拟终端、socks代理、文件管理、反弹shell、数据库管理等等,功能强大。
加密原理方面,以PHP环境为例,
《利用动态二进制加密实现新型一句话木马之PHP篇》这篇文章对冰蝎的原理已经做了详细的分析,简要介绍一下加密流程:
首先客户端以Get形式发起带密码的握手请求,服务端产生随机密钥并写入Session。
客户端将源代码,如assert|eval("phpinfo();”)利用AES加密,发送至服务端,服务端收到之后先进行AES解密,得到中间结果字符串assert|eval("phpinfo();")。
服务端利用explode函数将拆分为一个字符串数据,索引为0的元素为字符串assert,索引为1的元素为字符串eval("phpinfo();")。
以可变函数方式调用索引为0的数组元素,参数为索引为1的数组元素,即为assert("eval(\"phpinfo;\")") 。
0x02 加密Webshell流量分析
通过wireshark进行抓包分析,流量如下:
按照流程,客户端首先get请求生产随机密钥,server返回生成的16位密钥:0x7037af5d95561f3d,对应的session ID为 466geshjq6hr15kbmd72ju24g5。
得到密钥后,客户端对需要执行的命令进行AES加密,加密后的通讯流量如下,没有任何攻击特征,安全设备难以根据特征进行检测:
我们用密钥对该信息进行解密:
发现解密后执行的命令被base64编码了,进一步进行base64解码后,得到执行的命令如下:
@error_reporting(0);
function getSafeStr($str){
$s1 = iconv('utf-8','gbk//IGNORE',$str);
$s0 = iconv('gbk','utf-8//IGNORE',$s1);
if($s0 == $str){
return $s0;
}else{
return iconv('gbk','utf-8//IGNORE',$str);