站在巨人的肩头才会看见更远的世界,这是一篇来自技术牛人的神总结,运用多年实战经验总结的CTF取证方法,全面细致,通俗易懂,掌握了这个技能定会让你在CTF路上少走很多弯路,不看真的会后悔!
本篇文章大约6千字,阅读时间需20分钟,希望大家耐心看完!
取证
在CTF(Capture The Flag,中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式)中,取证的挑战可能包括文件格式分析,隐写术,内存转储分析或网络数据包捕获分析等。检查和处理静态数据文件,而不是可执行程序或远程服务器的隐藏信息,这其中任何挑战都可以被认为一个取证挑战,除非它涉及密码学,在这种情况下它可能属于Crypto类别。
取证是一个非常宽泛的CTF类别概念,因为这个叫法不能很好对应到安全行业中的特定工作角色,尽管一些挑战模拟了事件响应(IR)中看到的任务种类,即使在IR工作中,计算机取证通常是执法人员为了寻求证据数据和归属而做的事,很少有人是为了预防被攻击或仅仅是为了恢复系统完整性的商业行为。
与大多数CTF取证挑战不同,现实世界的计算机取证任务几乎不会涉及解开巧妙编码的字节、隐藏数据、文件夹中的mastroshka文件或其他复杂的问题。通常人们不会通过仔细重新组装损坏的PNG文件来破坏刑事案件的分析,揭示QR码的照片,该QR码解码为包含NES rom的zip存档的密码。
但是,现实世界的取证通常要求取证人找到间接的恶意证据,比如系统中的攻击者的痕迹或内部威胁行为的痕迹。实际的计算机取证主要在于对日志,内存,文件系统或注册表以及相关的文件和文件系统元数据中找到犯罪的线索。此外,网络(数据包捕获)取证更多的涉及元数据分析,而不是内容分析,因为现在大多数网络会话都在端点之间进行TLS加密。
之所以会在CTF进行这个脱离实践的挑战游戏,就是为了提高此项赛事的观赏性和难度。
为了解决这个挑战,你需要具备以下三个基本技能:
1、了解脚本语言,例如Python;
2、知道如何处理该语言的二进制数据(字节级操作);
3、识别格式、协议、结构和编码。
当然,像大多数CTF一样,理想的环境是一个Linux系统。如果你愿意使用Windows系统也行,不过不建议用Mac系统。
在Python中处理二进制数据
假设你已经选择了一些Python编程,你仍然可能不知道如何有效的处理二进制数据。像C这样的低级语言可能更适合这个任务。
以下是使用Python中的二进制数据的一些示例。
以二进制方式写入或读取文件:
f = open(‘Reverseit’, “rb”)s = f.read()f.close()f = open
(‘ItsReversed’, “wb”)f.write(s[::-1])f.close()bytearray类型是一个可变的字节序列,可以在Python 2和3中使用:
你还可以从十六进制表示的Unicode字符串中定义一个bytearray:
bytearray类型具有与Python str或list大致相同的方便方法split(), insert(), reverse(),extend(),pop(),remove()等。
将一个文件读入一个字母进行处理:
data = bytearray(open(‘challenge.png’, ‘rb’).read())
常见取证概念和工具
文件格式识别和魔术字节
几乎所有的取证挑战都将涉及一个文件,通常会在没有任何上下文的环境中让你猜测这个文件是干什么的。 Filetype作为用户熟知的概念,历史上已被指定为filetype扩展名,例如,MarkDown的readme.md,MIME类型,如Web上Content-Type头文件,或者存储在文件系统中的元数据(as在MacOS中使用mdls命令)。在CTF中,比赛的一部分就是使用启发式方法来自己识别文件。