# cheekin

公众号发 flag 获得一张图片,zsteg 一把梭

syc{s4y_he110_t0_syclover}

# ez_smilemo

是一道游戏题,给了 data.win,winhex 打开搜索 f1@g,找到上面的 base64

解码得到 flag

SYC{sm1le_1s@n1ce_g@me}

# DEATH_N0TE

根据提示,首先 zsteg 在下面这段 base64 中得到前半段 flag

SYC{D4@Th_N0t4_

接着放大图片查看像素点

能模糊看到有一些白色像素点围成的字母,猜测为后半段的密文,利用脚本提取白色像素点并且写入新的画布上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from PIL import Image, ImageDraw

image = Image.open('kamisama.png')
width, height = image.size
threshold = 200
new_image = Image.new('RGB', (width, height), (255, 255, 255))
draw = ImageDraw.Draw(new_image)

def bold_pixel(x, y):
for i in range(x - 1, x + 2):
for j in range(y - 1, y + 2):
draw.point((i, j), fill=(0, 0, 0))

for x in range(width):
for y in range(height):
pixel = image.getpixel((x, y))
if all(value > threshold for value in pixel):
bold_pixel(x, y)

new_image.save('output_image.png')

image.close()

得到

上网寻找白色像素点围成的字体,发现是死亡笔记中的一种字体,找到对照表进行对照解码

flag 最后一截有几个字母不是很明显,但是大致对照完能猜测到是出题人的名字,最后拼接得到 flag

SYC{D4@Th_N0t4_NAME_o2takuXX}

# 下一站是哪儿呢

SYC{CZ8579_Luzhou}

# Qingwan 心都要碎了

SYC {重庆中国三峡博物馆}

# xqr

下载附件不出意外是个 qrcode,但是扫码得到的是 wrong
flag,winhex 查看文件结构能发现还有一张图片拼接在该图片当中,手撕出来

修改图片尺寸和原图片一样大,使用 stegsolve 的 combiner 功能进行合并,将合并的图片导出后再次导入 stegsolve 进行 xor,扫码即可得到 flag

SYC{hOp3_u_h@ve_Fun}

# DEATH_N1TE

附件中拿到一个 webp 和一个 mp3 文件,mp3 文件听到后面发现是 sstv,使用工具扫描之后得到

前半段 flag,SYC {H4xr0t0r

接着打开 webp 文件,发现是个动图,上网搜了一下资料,需要使用命令 webpmux 进行分离帧的操作,暂时只知道一帧帧分离的语句,于是就写了个脚本进行循环执行分离

1
2
3
import os
for i in range(0,1000):
    os.system(f'webpmux -get frame {i} killer.webp -o frame{i}.png')

分离出来 881 张图片,根据图片的大小和张数利用 montage 和 gaps 进行调试拼图

1
2
montage \*.png -tile 40x22 -geometry +0+0 flag.png
gaps --image=flag.png --generations=40 --population=120 --size=48

最终得到

解码得到后半段 flag

SYC{H4xr0t0r_14_Ki114R}

# 窃听风云

拿到流量包追踪一下 tcp 流,结合题目可以知道

这是内网通信的流量,并且使用了 NTLM 验证身份的方式,上网搜索了一下该验证方式的工作流程,大致为

1
2
3
4
5
6
7
1.首先客户端在本地加密当前用户的密码成hash
2.客户端向服务端发送账号,这里进行了明文传输
3.服务端确认了NTLM认证方式,并随机生成了16位的字符串作为challenge发送给了客户端
4.客户端再用生成的hash加密该challenge发送回服务端作为response
5.服务端再把用户名,challenge和response发送给域控制器
6.域控制器用这个用户名在SAM密码管理库中找到这个用户的密码散列,并同样加密challenge
7.比较两个加密后的challenge,如果相同则认证成功

接下来回看这道题目,既然是截获了通讯流量那么也就是说客户端和服务端所进行的一些通信数据都直接被截获了,根据题目要求,要找到用户的密码。根据工作流程可以知道,hashcat 爆破用户密码所需要的一些字段信息都能被流量所捕获到

并且通过最后一个返回包中的对话信息可以知道密码字典为 rockyou,接下来寻找到需要的字段就可以开始进行爆破了,以下为需要寻找的字段:

1
username::domain:ServerChallenge:NTproofstring:modifiedntlmv2response 

过滤 ntlmssp.ntlmserverchallenge 能找到 challenge 字段信息

1
jack::WIDGETLLC:2af71b5ca7246268:2d1d24572b15fe544043431c59965d30:0101000000000000040d962b02edd901e6994147d6a34af200000000020012005700490044004700450054004c004c004300010008004400430030003100040024005700690064006700650074004c004c0043002e0049006e007400650072006e0061006c0003002e0044004300300031002e005700690064006700650074004c004c0043002e0049006e007400650072006e0061006c00050024005700690064006700650074004c004c0043002e0049006e007400650072006e0061006c0007000800040d962b02edd90106000400020000000800300030000000000000000000000000300000078cdc520910762267e40488b60032835c6a37604d1e9be3ecee58802fb5f9150a001000000000000000000000000000000000000900200048005400540050002f003100390032002e003100360038002e0030002e0031000000000000000000

将得到的字段值拼接利用 hashcat 进行爆破

1
./hashcat.exe -m 5600 1.txt rockyou.txt -o out.txt --force

在 out.txt 中得到爆破出的密码

SYC{iamjackspassword}

# extractMe

一眼丁真为 4byte 的 CRC32 爆破

先用 7-zip.exe 的参数输出压缩包信息,并用脚本批量提取压缩包中的 CRC32(脚本来自八神)

1
2
3
4
5
6
7
import subprocess, re

def getCRC(path: str):
tmp = subprocess.Popen(f'7z.exe l {path} -slt', stdout=subprocess.PIPE).communicate()[0].decode('gbk').replace('\r\n', '\n')
return [(i, j) for i, j in zip(re.findall(r'(?<=Path = ).*', tmp)[1:], re.findall(r'(?<=CRC = ).*', tmp))]

print(getCRC('extractMe.7z'))

输出:

1
[('flag0', '8712DE1D'), ('flag1', '06EACBD7'), ('flag2', '20A8E291'), ('flag3', '31EE3074'), ('flag4', '77AACF7F'), ('flag5', '35FB7C6C'), ('flag6', 'F978D5AA'), ('flag7', '016F7A0B')]

再利用 4byte 的脚本爆破就好

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 binascii
import string

def crack_crc():
print('-------------Start Crack CRC-------------')
crc_list = [0x8712DE1D, 0x06EACBD7, 0x20A8E291, 0x31EE3074, 0x77AACF7F, 0x35FB7C6C, 0xF978D5AA, 0x016F7A0B]
comment = ''
chars = string.printable
for crc_value in crc_list:
for char1 in chars:
for char2 in chars:
for char3 in chars:
for char4 in chars:
res_char = char1 + char2 + char3 + char4
char_crc = binascii.crc32(res_char.encode())
calc_crc = char_crc & 0xffffffff
if calc_crc == crc_value:
print('[+] {}: {}'.format(hex(crc_value),res_char))
comment += res_char
print('-----------CRC Crack Completed-----------')
print('Result: {}'.format(comment))

if __name__ == '__main__':
crack_crc()

输出:

1
2
3
4
5
6
7
8
9
10
11
-------------Start Crack CRC-------------
[+] 0x8712de1d: SYC{
[+] 0x6eacbd7: _cR@
[+] 0x20a8e291: ck_1
[+] 0x31ee3074: s_Us
[+] 0x77aacf7f: eful
[+] 0x35fb7c6c: _som
[+] 0xf978d5aa: etim
[+] 0x16f7a0b: e$_}
-----------CRC Crack Completed-----------
Result: SYC{_cR@ck_1s_Useful_sometime$_}

SYC{cR@ck_1s_Useful_sometime$}

# 时代的眼泪

取证大师一把梭

找到最近打开的图片

根据路径寻找到图片并打开,获得 flag

SYC{You_defeated_me_after_22_years}

# DEATH_N2TE

附件就是一个 mp4 文件,视频播放器打开能明显看到有像素点变化,并且每一帧都不一样,随着视频的播放有一个白色像素点的滚动效果

image-20231129131244854

如图所示,那么对应着视频的帧宽和帧高,利用脚本去提取它每一帧的像素数据去进行重新组合到新的画布当中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import cv2
import numpy as np

video = cv2.VideoCapture('kira.mp4')
fps = int(video.get(cv2.CAP_PROP_FPS))
frame_count = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
video_width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
video_height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))

start_pixel_x = 5
start_pixel_y = 5
block_size = 10

out_width = video_width // block_size
out_height = video_height // block_size

out = np.zeros((out_height, out_width, 3), dtype=np.uint8)

fps_count = 0
while True:
success, frame = video.read()
if not success:
break

for y in range((video_height - start_pixel_y) // block_size):
try:
pixel = frame[start_pixel_y + y * block_size, start_pixel_x + fps_count * block_size]
out[y, fps_count] = pixel
except Exception as e:
print(f"Error: {e}")

fps_count += 1

cv2.imwrite('out.png', out)

得到:

image-20231129132551340

SYC{we1c0m4_T0_Dc@tH_W0r1d}

# 窃听风云 - V2

这里不做过多的说明了,和 v1 差不多,smtp 邮件协议进行了 ntlm 认证,详细的过程在另一篇文章 NTLM 协议流量解密的例三中有写,可以移步观看