NCTF 2023 Slivery取证题WP
在今年NCTF上做的一道取证题。涉及到的是Sliver的这个红队工具的攻击取证。在这里简单写一下。
为什么又是取证?说好的看web呢?
题目给了一个内存镜像mem和pcap流量包dump.pcapng。很明显是要从内存镜像中取证来解密流量包中的流量。当然是要先从内存镜像下手。
用volatility3分析内存镜像。按照通常的步骤,先看看能看的东西。比如用pslist看一下进程。
python .\vol.py -f D:\Action\mem windows.pslist.PsList |
... |
题目名字就叫slivery,那当然要从这个slivery.exe开始分析了。用dumpfiles把这个进程的exe给dump下来先。
python .\vol.py -f D:\Action\mem windows.dumpfiles.DumpFiles --pid 8800 |
dump的过程中杀毒软件直接给报毒了。用virustotal把.exe.img扫一下,得到的结果就是sliver的木马,那直接按照这个来做就行。
具体有关sliver的攻击取证原理可以参考这篇bloghttps://www.immersivelabs.com/blog/detecting-and-decrypting-sliver-c2-a-threat-hunters-guide/
简单来说就是sliver的服务端和木马使用http或者dns进行通信,流量都经过ChaCha20Poly1305
对称加密,并用gzip/换表base/单词表等手段进行编码和混淆。对于这道题来说,我们有了抓取来的攻击的流量。而dump内存时木马还在运行,进行通信的密钥session key还可能留存在进程的内存中。想要解密payload就需要从内存中找到这个32字节的session key。而这个密钥在内存中存在有一个特定的规律:
00 00 [32 bytes key] ?? ?? ?? 00 C0 00 00
为了找到密钥,最简单的方法就是根据这个规律,用正则来把进程中的内存来扫一遍,把所有符合这个规律的32 bytes给找出来。ChaCha20Poly1305
算法自带校验,因此挨个试一试能不能解密就行了…
具体操作可以使用那篇blog配套的脚本https://github.com/Immersive-Labs-Sec/SliverC2-Forensics。包含两个简单的py,sliver_pcap_parser.py用pyshark将pcap流量包中的sliver流量并将body导出,sliver_decrypt.py实现了用正则从进程内存中找密钥并尝试解密流量的过程。
实际做的时候可能是由于pyshark版本的原因,流量的处理有点问题,脚本不能直接用,简单改一下就可以了。比赛的时候就主要就是因为调这个脚本浪费了点时间。
先用wireshark简单看一下pcap,可以发现攻击流量使用的是http的形式,服务端的ip大概就是另一个内网地址192.168.207.128
python .\vol.py -f .\mem windows.memmap.Memmap --pid 8800 # dump木马进程的内存 pid.8800.dmp |
这样就可以解密出流量了,一堆乱七八糟的东西,可能是因为脚本还是没完全调好。就先翻一翻看看吧。
... |
翻到两条可疑的流量。可以看到桌面上有个flag.zip,又echo了一个东西P@33w000000rd_U_GOT
,大概率就是密码了。
直接用foremost从进程内存中找zip。
foremost ./pid.8800.dmp |
用密码打开扫出来的zip,就能得到flag了。
NCTF{1d38c372-a636-430e-b47e-95f6136a9bb4}
还是一道很简单的题,直接就能按着blog用现成的脚本做。基本上能找到那篇blog就出了。可能是因为愿意做取证的人本来就不多,比赛上总共就两队交了这道题,咱还拿了个一血,给队伍白捡1000分。
做这道题确实没什么技术含量,但至少攻击取证的思路可以记录下来参考一下。