2024年6月-7月DASCTF做题与复现

2024年6月-7月DASCTF做题与复现

MADISUN Lv2

2024.6 DASCTF x HDCTF

谐乐大典

题目链接:BUUCTF在线评测 (buuoj.cn)

image-20240725145433285

PASS=ROBIN得到了一个密码

回到原本binwalk的思路,发现了图片,binwalk提取不出来可以用foremost,但是以这种思路提取封面啥都发现不了,回到flac文件中,所有的信息都会在文件的二进制里。

  • 在010中运行flac模版,查看metadata,发现大多是jpg图片,可以分别在每个部分的FF D8处运行jpg模版,最终发现 METADATA_BLOCKS[4]数据块jpg后存在冗余数据,且开头为9E 97 BA 2A,是oursecret的加密特征,结合拿到的PASSROBIN解密
  • 把这个数据块提取出来

image-20240725161444581

  • oursecret解密,得到MXCD.png

image-20240725161354278

  • 放大图片后可以看见很多很明显的更改后的像素点,并且间隔大概为宽14,高8,但也不一定有的宽间隔是13,有的高间隔是9,所以不能利用间隔提取,而应该采用相似像素(近邻法)提取,这里参考大佬的写法。官方WP使用的是ps自带的近邻法提取,我懒得装PS了

image-20240726140820934

1
2
3
4
5
6
7
from itertools import product
from PIL import Image

for xy in product(range(400,415), range(370,385)):
img=Image.open("MXCD.png")
img = img.resize(xy, Image.NEAREST)
img.save(f"out_{xy[0]}_{xy[1]}.png")

DASCTF X HDCTF 2024 (6月赛) Writeup - shenghuo2’s Blog

Key Point in this code:

  • 近邻法图片缩放

  • Width range and height range:根据间隔大概算出来的尺寸。这一步是在猜测需要提取出来的图片的大小

  • 利用近邻法,生成不同尺寸的图像,爆破得到400x376

image-20240726163034365

丢个AI对于这个算法选取像素的解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
当使用 Image.NEAREST 方法缩小图像时,选取像素的过程基本原理相同,但会出现一些特殊情况。让我详细解释缩小图像时的像素选取过程:
1. 缩放比例计算:
与放大时一样,首先计算缩放比例:
scale_x = 新宽度 / 原宽度 (这里 scale_x < 1)
scale_y = 新高度 / 原高度 (这里 scale_y < 1)
2. 遍历新图像像素:
对新图像中的每个像素位置 (x_new, y_new) 进行处理。
3. 反向映射:
计算新像素对应到原图的位置:
x_old = x_new / scale_x
y_old = y_new / scale_y
4. 选择最近的像素:
x_source = round(x_old)
y_source = round(y_old)
5. 复制像素值:
将原图 (x_source, y_source) 位置的像素值赋给新图像的 (x_new, y_new) 位置。
  • 这个码Google搜索一下,结合图片名称MXCD.png,得到Maxicode
  • 找个在线网站扫了

image-20240726165644524

1
DASCTF{57aca8f8-5d8d-04ef-8061-609a0f09fa44}

2024.07 DASCTF 2024暑期挑战赛

png_master

  • zsteg查看,发现了末尾存在额外数据,一眼base64

image-20240801144121924

  • Base64解码得到第一段:flag1:DASCTF{2fd9e9ff-e27

image-20240801144248187

but the understanding of png is just beginning 估计有多个png隐写的考点

  • stegsolve看一下lsb隐写,发现Alpha通道,plane0-7开头都不相同,存在隐写,把数据提取出来

image-20240801145536449

  • stegsolve-Analyse-DataExtract,拿到第二个部分:d-5405-c5f5-

image-20240801145716140

  • pngcheck或者010editor运行模版可以看出有一个IDAT块的异常,未填满就出现了下一个3394长度的IDAT块

image-20240801150409151

  • 打开010看一下58674的块和3394的块,发现58674是正常的,而3394的块像是硬加上去的块,而且头尾填充了这些看似无意义的重复数据

image-20240801150704620

  • 提取数据后需要添加png头和尾,需要爆破宽高,但这里crc也是未知的,因此不是根据crc爆破

    ==修复宽高的方法:==

    • CRC正确,宽高数据错误,可以使用CRC爆破方法
    • CRC错误,宽高数据错误
      • 宽高一把梭(实现方式未知)
      • 把png转成data文件,用GIMP分析正确宽高

    Misc_PNG高宽详解_png图片宽高一把梭-CSDN博客

    博客中的转data脚本有点小问题,read后要加(),且zlib头可以去掉后两个字节,正确的脚本我会在下述中放出。

  • GIMP分析宽高之前,需要将png去头去尾,对中间的zlib数据解压

1
2
3
4
5
6
7
8
9
10
import re,os
import zlib
c=re.sub(b'........IDAT',b'',open('flag1.png','rb').read(),0,re.S)
#替换字符,去掉IDAT头这里的re.S表示让'.'特色字符匹配任何字符,包括换行符
c=re.sub(b'........IEND....',b'',c,0,re.S)
#替换字符,去掉IEND尾
zlibhead=b'x\x9c'#x即\x78
#zlib头,注意不要重复
for i in c.split(zlibhead)[1:]: #从1开始是为了丢弃png signature
open('flag1.data','wb').write(zlib.decompress(zlibhead+i))
  • 得到的flag1.data文件,放进GIMP中,我们的目的是得到正确的宽,高相对宽而言没有那么重要

于是我们会发现,当宽为500,此时这部分数据看起来最集中,因此500很有可能是正确的宽,为了对比,放出宽为501和499时的图像,可以自己变动宽高查看,500时很明显像素最集中

image-20240802131707485

  • 501:

    image-20240802131939485

  • 499:

    image-20240802132007000

  • 在010中把宽改成500,高可以随意点,不改也行,mac用户可以把修改宽高后的crc修改一下(运行一下模版,会在结果中告诉你正确的crc值),防止图像crc校验无法打开。

    ==记得修改colortype,这个图像从GIMP中可以看出是RGB,而不是RGBA,因此0806000000要把06改成02==

    image-20240802132555672

  • 得到最后一段flag:a19131f86216}

image-20240802132828865

1
DASCTF{2fd9e9ff-e27d-5405-c5f5-a19131f86126}

这道题还是学到了很多的,看wp,宽高一把梭真就一把梭了,除此之外,发现还有大佬是直接算出来的:DASCTF2024暑期挑战赛 | mumuzi的blog (mumuzi7179.github.io)

太牛了

image-20240802135235154

EZ_zip

  • 题目附件zip直接解压会出错,用010打开查看,发现里面的320应该也是个zip,但是由于Filenamelength被设置为03,因此只能读到320,正确的文件名是320.zip,即长度为7,因此修改0A 00 03 000A 00 07 00

image-20240805145740541

  • 提取320.zip,查看发现是加密的,里面有个319.zip,010查看发现注释是:just a byte,猜测密码就是一个byte,写脚本爆破了第一个密码为\x11,发现319里面是318.zip,猜测要一直爆破,所以加了一个while循环,一直提取然后爆破,加密算法使用的不是传统加密,只使用Zipfile会报错,因此要使用pyzipper,pyzipper支持AES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pyzipper
file_num = 321
while True:
file_num-=1
path = str(file_num)+'.zip'
with pyzipper.AESZipFile(path,'r',compression=pyzipper.ZIP_DEFLATED,encryption=pyzipper.WZ_AES) as flag:
for i in range(0,256):
try:
flag.extractall(pwd=i.to_bytes(1))
print(i.to_bytes(1))
except Exception as e:
# print(e)
continue

#以下是单独爆破320.zip的脚本

# with pyzipper.AESZipFile('320.zip','r',compression=pyzipper.ZIP_DEFLATED,encryption=pyzipper.WZ_AES) as flag:
# for i in range(0,256):
# try:
# flag.extractall(pwd=i.to_bytes(1))
# print(i.to_bytes(1))
# except Exception as e:
# print(e)
# continue
  • 到最后一层由于找不到zip会报错自动退出,每爆破出都会打印密码,最后提取的文件是AES-ECB.txt
1
2
3
64ZpNmbv2Hg4Jj9bH8Kv6D3OBliD9hgyI3vZWfMDJs2TcEwVnBmH/zkBtPBE3g8e

the key may be on your journey?

密文看起来应该是base64编码,key应该就在爆破的密码中

  • 查看爆破的密码发现规律,查找第一个爆破出的byte,发现存在10个,后面的byte也是出现10次,而且是循环出现。一共有320个zip,所以有32个byte按顺序循环出现了10次,而32byte长度的key也是AES-256的key长度
1
2
#先简单处理一下数据,删除换行符得到一组bytes
\x11\xbb\x99X\x0ca:\x87\xc5N\x12H\n\xa7\xff\x8cy\x8fq\xad(\x0fk\xa6\x9dJD%"^N\xc6
  • 不难想到,解压是倒序解压的即从320->1,所以得到的bytes应该也要倒序才是正确的key,再用python处理一下得到hex
1
2
3
4
5
6
# reversed内置函数直接倒叙,bytes转换类型为bytes,bytes.hex()可以直接得到hex
>>> b = b'\x11\xbb\x99X\x0ca:\x87\xc5N\x12H\n\xa7\xff\x8cy\x8fq\xad(\x0fk\xa6\x9dJD%"^N\xc6'
>>> bytes(reversed(b))
b'\xc6N^"%DJ\x9d\xa6k\x0f(\xadq\x8fy\x8c\xff\xa7\nH\x12N\xc5\x87:a\x0cX\x99\xbb\x11'
>>> bytes(reversed(b)).hex()
'c64e5e2225444a9da66b0f28ad718f798cffa70a48124ec5873a610c5899bb11'
  • cyberchef

image-20240805153742006

1
DASCTF{514755c6-8280-463c-8378-a29702fc88df}

ServerMeM

  • 题目描述:公司的服务器遭受了黑客的攻击,经过勘察黑客为维持权限留下了后门,我们获取到了服务器的内存文件,请你分析黑客留下的痕迹

这题是一道Linux内存取证,完全没接触过,跟着大佬的wp复现一下,有两种做题方式:

  • 常规:通过虚拟机更换题目对应内核,编译dwarf文件,和system.map文件一起打包成profile,导入到/volatility/plugins/overlays/linux下(导入后可以通过vol --info查看),--profile链接所需符号表,再正常vol分析内存文件即可

以上是vol2的方式,vol3使用Symbols替代了Profile,vol3构造符号表:Linux内存取证总结 - 先知社区 (aliyun.com)

  • 除了这种方式,还可以直接手动分析内存文件,这道题由于flag的处理体现在Command中,因此手动分析是一种很快速的方式

常规方式(待复现)

手动分析

  • 先strings搜索一下常用文件类型,这里搜索到tar.gz,发现有个S3rCr3t.tar.gz,而且发现了几行关键命令
1
2
3
4
5
6
7
8
$ strings out.lime|grep ".tar.gz"     

shell-4.2# tar -czf - F14ggg | openssl enc -e -aes256 -out ./S3rCr3t.tar.gz
shell-4.2# cat S3rCr3t.tar.gz
S3rCr3t.tar.gz
shell-4.2# cat S3rCr3t.tar.gz
tar -czf - F14ggg | openssl enc -e -aes256 -out ./S3rCr3t.tar.gz
^C

F14ggg应该是flag,flag经过openssl aes256加密输出为S3rCr3t.tar.gz,而且在命令中发现了cat S3rCr3t.tar.gz,cat的结果应该在文件中可以找到,接下来我们只需要找到password,以及openssl的版本就可以了

  • strings out.lime|grep "openssl version" -A 1 -A 1 打印匹配结果之后的一行,成功找到openssl版本
1
2
3
4
$ strings out.lime|grep "openssl version" -A 1 

shell-4.2# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
  • 通过搜索命令,在openssl加密时应该会要求输入password,所以password应该会出现在命令后几行,同样的-A 4参数grep搜索tar -czf - F14ggg | openssl enc -e -aes256 -out ./S3rCr3t.tar.gz命令
1
2
3
4
5
6
7
8
9
$ strings out.lime|grep "tar -czf - F14ggg | openssl enc -e -aes256 -out ./S3rCr3t.tar.gz" -A 4

shell-4.2# tar -czf - F14ggg | openssl enc -e -aes256 -out ./S3rCr3t.tar.gz
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:

tar -czf - F14ggg | openssl enc -e -aes256 -out ./S3rCr3t.tar.gz
P@ssW0rdddd
P@ssW0rdddd

得到password:P@ssW0rdddd

  • 加密后的密文去010找方便一些,因为有些是不可见字符,搜索cat S3rCr3t.tar.gz就能找到,0D 0A是回车和换行,从0D0A后复制数据到0D0A就是密文,而且经典Salted__开头,可以直接保存为bin文件,我这里通过cyber存成了dat文件,都一样

image-20240808173008998

  • 我使用的是macos,brew只支持安装openssl1.1,为了方便,于是我安装了openssl1.1

⚠️需要注意:Openssl1.1将默认摘要从md5修改成了sha256,因此需要额外添加参数-md md5

关于openssl不同版本无法解密的问题 - 简书 (jianshu.com)

  • 这里还需要关注一个细节:根据命令tar -czf - F14ggg | openssl enc -e -aes256 -out ./S3rCr3t.tar.gz可以知道原加密逻辑是先将F14ggg进行tar打包,因此解密的逻辑是输出一个tar.gz文件,然后解压出F14ggg
1
2
3
$ /usr/local/opt/openssl@1.1/bin/openssl enc -d -aes256 -k P@ssW0rdddd -in ~/Downloads/cipher.dat -out flag.tar.gz -md md5
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.

输出到flag.tar.gz

1
2
3
4
5
$ tar -xzvf flag.tar.gz 
x F14ggg

$ cat F14ggg
DASCTF{c086cd55-b86a-4ee6-8933-c8bee578148a}
  • Title: 2024年6月-7月DASCTF做题与复现
  • Author: MADISUN
  • Created at : 2024-07-26 17:01:01
  • Updated at : 2024-08-08 18:54:42
  • Link: https://redefine.ohevan.com/2024/07/26/2024年6月-7月DASCTF做题与复现/
  • License: This work is licensed under CC BY-NC-SA 4.0.