解题思路
解压,需要密码,那就先使用ARCHPR来爆破一下
爆破成功,密码:723456
解压后得到111.zip,这里继续解压后,我发现flag.zip可以直接解压,但是setup.sh显示压缩文件头部数据已经损坏,那么这里很有可能存在zip伪加密。那现在我想的是先将它拿到kali中binwalk检测一下。
发现其中有两个zip,一个是flag.zip而一个是装的是setup.sh;那很可能是flag.zip没有被加密,而setup.sh对应的那个zip被伪加密了所以才导致无法直接把setup.sh解压缩出来。此时可以考虑通过binwalk直接将它们分离,可能可以直接得到setup.sh文件。
成功得到了setup.sh文件,并且看到了其中的内容。setup.sh文件是一个shell脚本,其中的命令实现的功能如下:通过zip命令将flag文件打包至flag.zip中,并以当前创建flag.zip文件的unix时间戳为压缩包的密码。
那么像这种该如何得到作者当时创建这个压缩包时的unix时间戳呢,先将flag.zip传输到windows中,然后通过右键查看其属性:
可以看到其文件的创建时间是2019-5-17 16:40:15,那么可以通过以下python代码获得此时的unix时间戳:
import time
t_str = '2019-5-17 16:40:15'
t_tuple = time.strptime(t_str, "%Y-%m-%d %H:%M:%S")
t_unix = time.mktime(t_tuple)
print(t_unix)
# 输出结果:1558082415.0
通过上述我们得到了其创建flag.zip的时候对应时间的unix时间戳,但这不代表我们就获得了密码,现在目光需要重新回到setup.sh文件,在kali中执行其中的python代码,这是因为作者在创建flag.zip文件的时候一定是在linux中执行的setup.sh脚本:
python -c "print(__import__('time').time())"
可以看到在linux中通过python3执行后得到的unix时间戳的小数是在6-7位之间,但如果是python2呢?
可以看到通过python2执行后,获得的unix时间戳的小数位数都是两位,那么到底是python2还是python3呢,这里我觉得就只有凭经验判断了,在以前写的工具或者exp之类的东西大都是通过python2写的,所以这里可以优先考虑python2,python2不行再换python3。那么在确定python版本为2并且知道flag.zip创建时的unix时间戳后就可以通过掩码爆破的方式来尝试爆破出密码,但是在爆破前我们需要进一步确定unix时间戳的范围。我们可以以1558080000.00为开始,以1558089999.99为结束来进行掩码爆破,这样可以极大提高密码破解的效率。至于我怎么得到这个范围了,因为有误差所以只能靠猜了,因为以上两个时间分别对应的是2019.5.17 16.40.00和2019.5.17 17.00.00,它们对应的unix时间戳前半部分都是155808,所以我就让前半部分不变,然后对后面进行掩码爆破。
成功拿到密码,解压后通过记事本打开就可以拿到flag。
flag{fkjabPqnLawhvuikfhgzyffj}
相关知识点
1.python代码解析:
import time
t_str = '2019-5-17 17:00:00'
t_tuple = time.strptime(t_str, "%Y-%m-%d %H:%M:%S")
t_unix = time.mktime(t_tuple)
print(t_unix)
-t_str:是一个时间字符串
-time.strptime():将一个时间字符串按照指定的格式转换为struct_time对象(时间元组)
-time.mktime():将一个struct_time对象转换成其对应的unix时间戳
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%M 分钟数(00-59)
%S 秒(00-59)
更多的关于time.strptime()中格式控制的参数详见:https://www.runoob.com/python/att-time-strptime.html
2.关于掩码爆破
掩码爆破是一种密码破解的方式,它是在已知密码格式和其一部分的时候使用的,对于密码未知部分可以使用 ? 或者 * 来代替。相比于完全未知的暴力破解,掩码爆破可以大大提高密码破解的速度。