当前位置:首页 > 焦点

ctf压缩包解密

CTF里最让人血压升高的缩包压缩包,不是解密那种直接告诉你密码的,而是缩包那种丢给你一个加密zip,里面躺着一个flag.txt,解密然后你对着密码框发呆的缩包。解密思路其实就那么几条,解密但坑往往在细节里。缩包

先看文件头。解密用十六进制编辑器打开压缩包,缩包或者直接跑`binwalk`,解密如果文件头是缩包`50 4B 03 04`,标准zip;如果是解密`52 61 72 21 1A 07`,那是缩包RAR。但很多题目会把压缩包伪装成图片或者别的解密什么,比如把zip后缀改成jpg丢给你。缩包这时候`file`命令一照妖,原形毕露。改后缀解压,里面可能还套着下一层。

真正的难点是加密。CTF里最常见的弱密码不是“123456”,而是题目描述里藏着的线索。有一道题,压缩包注释写着“生日”,压缩包时间戳显示1987年,密码就是19870123这种格式。还有一种更阴间的,把密码拆成几段,藏在图片的EXIF信息里、音频频谱图里、甚至PDF的元数据里。你得把整个附件当成一个犯罪现场,每一字节都可能是线索。

暴力破解是最后的办法,但不是拿字典硬怼。先试纯数字,再试小写字母,然后加长度限制。工具用`fcrackzip`或者`john`都行,但CPU跑得慢的话,可以先用`zip2john`提取hash,扔到GPU上跑hashcat。我见过一道题密码是8位小写字母,字典跑不出来,结果是用hashcat的mask攻击,`?l?l?l?l?l?l?l?l`,跑了二十分钟出了个“p@ssw0rd”的变体——大小写加数字替换,纯属出题人恶心人。

有些压缩包不按套路出牌。加密方式不是传统的ZipCrypto,而是AES-256。这时候`fcrackzip`直接罢工,得用`bkcrack`做已知明文攻击。前提是你得知道压缩包里某个文件的部分内容。比如压缩包里有个`readme.txt`,你知道它开头是“Hello”,那就能算出密钥。这招对付ZipCrypto特别管用,但AES加密的就别想了,老老实实找密码。

还有一种情况,压缩包不是加密,而是“伪加密”。文件头里有个标志位,第6和第7字节,如果第6字节是`09 00`,那就是加密标志。改成`00 00`,保存,重新打开,直接能解压。很多新手一上来就暴力破解,结果发现根本不用密码,纯粹是被出题人耍了。检查一下这个标志位,三秒钟的事,能省几个小时。

真遇到那种密码是随机生成、毫无规律可言的,别死磕。看看题目有没有别的提示,比如压缩包文件名是“hint.zip”,里面还有个“password.txt”,但那个txt本身也是加密的。循环嵌套,一层套一层,这时候得写脚本递归处理。我自己写过一次,用Python的`zipfile`库递归解压,每层尝试不同密码,最后在第五层才拿到flag。

解密这事儿,心态比技术重要。卡了半小时没思路,出去喝口水,回来重新看一遍题目描述,往往能发现之前忽略的关键词。有一次题目描述里写着“小明的生日”,但压缩包注释里写着“1998”,我试了19980101到19981231所有日期,结果密码是“19980229”——1998年根本没有2月29日,出题人故意玩梗,实际密码是“19980314”,白色情人节。你说气不气。

最后说个技巧,遇到加密压缩包先别急着解,看看压缩包本身能不能用`7z`列出文件列表。有时候加密只针对文件内容,文件名是明文。文件名本身可能就是提示,比如“password_is_here.txt”,那密码大概率就在压缩包外面某个不起眼的地方。翻翻网页源码、响应头、cookie,甚至题目给的图片的LSB隐写。压缩包解密从来不是孤立的,它是整个题目链条的一环。

分享到: