Login
(这题真就差一点,一点,就做出来了)
打开页面需要登录,无账号密码,唯一可疑的只有底下的获取实例,点击发现可以获取一个提示文档,并说按照文档向admin@birkenwald.cn
发送邮件即可获取账号。
提示文档是个zip压缩包,里面还有一个加密的压缩包,看到三个文件都被加密了,尝试用伪加密工具破解一下
解完后发现示例-副本
可以打开,其他打不开
同时看到示例与示例的CRC32是相同的,大小也一样,所以尝试明文攻击
得到密码qwe@123
,解压出password.zip,但打开还是加密的,密码也不一样
发现1.txt~2.txt的大小一样,都是6字节,于是想到CRC32碰撞
到这里就与官方wp有区别,脚本工具什么的
首先我用的脚本是三个文件一起爆破,速度很慢且结果只出来一个,常规来说CRC相同但里面内容有很多种
这里就导致最后没做出来
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import datetime
import binascii
def crack(crc_in):
crcs = set([crc_in])
r = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_1234567890~!@#$%^&*' # 压缩字符串
for a in r:
for b in r:
for c in r:
for d in r:
for e in r:
for f in r:
txt = a + b + c + d + e + f
crc = binascii.crc32(txt)
if (crc & 0xFFFFFFFF) in crcs:
return txt
if __name__ == "__main__":
s = [0x1028C889,0x4B8F7BE7,0x21137233]
password = ''
for x in s:
passw = crack(x)
password += str(passw)
print password
这个是爆破三个crc32的脚本
最后爆出来这个结果,当时发现最后一段很奇怪,即3.txt爆出来的内容
最后就卡在这里了,解压密码不正确也不会做
复盘:
当时在GitHub上也下载了crc32碰撞工具
但有一个点我做错了,就是命令输入crc32时没有加上0x
并且速度也是秒出的,不会像上面那个脚本爆破快四十分钟
很绝望就差这一步,前两个都爆破出来了
剩下的1.txt和2.txt也如图所示输入
python crc32.py reverse 0x21137233
最后筛选出得到密码welc0me_sangforctf
,解压得到.password.swp
文件
所知swp文件时vim编辑器不正常退出留下的
拉进kali进行读取
vim -r .password.swp
cat .password.swp
然后登录网站用bp抓包查看回显包就得到flag
Bridge
下载来是一张png图片
照常拉进kali进行binwalk分析,无果,进行zsteg查看
发现有zlib数据,以及在bgr通道有脏数据
在kali里进行pngcheck也证明有异常IDAT块
在010editor里查看异常IDAT块
将87改成78,并从78段开始提取为十六进制(78 9C是zlib的文件头)
用脚本将这段zlib数据压缩
import zlib
data = open("zlib_hex_data.txt", 'r',
encoding="utf-8").read().replace(" ", "").replace("\n",
"").strip()
data_dec = zlib.decompress(bytes.fromhex(data))
print(data_dec[:100])
with open("zlib_data.rar", 'wb') as wf:
wf.write(data_dec)
发现生成rar压缩包,打开压缩包提示寻找flag1
继续对bridge图片进行分析
在对bridge图片进行exif信息查询时发现一串字符
进行十六进制转ASCII码
得到dynamical-geometry
在前面zsteg发现的脏数据还没利用,用stegsolve工具查看
(在前面zsteg找到的脏数据是在BGR通道,当时在比赛时就是因为没有调到BGR所以没发现这段数据)
保存为png图片,发现打不开,在kali里进行foremost分离出png图片,得到一段色彩值混乱的图片,进行分析像素
from PIL import Image
image = Image.open(r'C:\Users\Aria\Desktop\ctf赛题\深育杯\00000000.png')
allpixels = []
for x in range(image.width):
for y in range(image.height):
allpixels.append(image.getpixel((x, y)))
print(len(allpixels))
print(allpixels[:4])
得到输出,取了前四段值,将第三列十六进制转十进制得到50 4B 03 04
,为zip压缩文件头
348100
[(40, 176, 80), (37, 181, 75), (1, 253, 3), (2, 252, 4)]
0x50 0x4B 0X03 0X04
批量提取并保存为zip压缩包
from PIL import Image
image = Image.open(r'C:\Users\Aria\Desktop\ctf赛题\深育杯\00000000.png')
allpixels = []
for x in range(image.width):
for y in range(image.height):
if image.getpixel((x, y)) == (0, 0, 0):
continue
allpixels.append(image.getpixel((x, y))[2])
hex_datalist = [str(hex(i))[2:].zfill(2) for i in allpixels]
print("".join(hex_datalist)[:100])
with open("outpur.txt", 'w') as wf:
wf.write("".join(hex_datalist))
将生成的txt文件里的内容用010editor粘贴生成zip,用前面转成ASCII码的字符dynamical-geometry
作为解压密码
百度搜索得知stl文件是3D文件,在微软商店搜索到3D软件读取器3D Builder
可以直接打开(自带的3D画图打不开)
同理得到之前压缩包的flag2也是stl文件格式,打开得到第二段flag