红明谷CTF-2023--个人Writeup

这比赛还是蛮可惜的,差一道题没交上,痛失一个线下面基师傅们的机会T_T

红明谷CTF-2023–个人Writeup

WEB

点击签到

img

连续点击即可获取flag:

flag{1efe5dac-692a-47b8-b32d-ff737af384a7}

Dreamer

访问管理员目录/admin

1
2
uername:wangjn
password:123456

栏目文章管理处,创建顶级栏目

img

设置栏目

img

目录穿越,任意文章读取

img

主页访问栏目flag

img

flag{9dce33c6-3a2b-4235-a35c-86401e8df9b2}

Dreamer_revenge

访问管理员目录/admin

1
2
uername:wangjn
password:123456

直接构造一个主题包,里面修改路径,可读所有文件

找到dreamer_cms-Previous_Releases_4.1.3/src/main/resources/db/dreamer-cms/templates文件夹

img

修改default_v2文件夹下的theme.json文件的themePath

img

改为…/…/…/…/…/…/…/…/…/…/…/…/…/…/,然后将default_v2压缩成zip包即可

imgimg

启用新主题,找flag的路径:

img

flag路径: /proc/1/environ

img

flag{bfd78316-a136-45e7-b04b-35af29af8313}

Misc

hacker

打开看见流量包

img

提取http流量url解密并审查shell.php,发现是dnslog注入

img

通过审计上面代码发现是将数据和admin的md5后的密码异或后再短域名拼接后发送

发现SQL注入泄露admin密码的MD5

img

再看DNS流量包

img

写脚本辅助解密

1
2
3
4
5
6
7
8
9
10
11
12
import binascii


enc_data = b""
enc_data += binascii.unhexlify(b'7b357226771575227a7372237677702573611f372570317b76727720762066')
key = "8a3e684c923b763d252cf1e8734a7a29"
for k in range(100):
dec_data = b''
for i, byte in enumerate(enc_data):
dec_data += bytes([byte ^ ord(key[(i+k) % len(key)])])
print(dec_data)

脚本解出部分flag,但部分包数据不可解密

img

其中报文有部分错误,通过爆破发现在3段满62字符长数据后都添加6就可以得到真实密文为

ACCAGTAAAACG{AATTCAACAACATGCTGC4CTACA-AACAAAAACAAT-TCATCAACAAAR-AACAACTGGTGA-TTCTTCTCATGATGAAA4AACTTCTTCTGCTGC}

魔改这个DNA解密脚本karma9874/DNA-Cipher-Script-CTF: A simple script to decode the genome DNA binary sequence (CTF Challenge) (github.com)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const mapping = { 'AAA': 'a', 'AAC': 'b', 'AAG': 'c', 'AAT': 'd', 'ACA': 'e', 'ACC': 'f', 'ACG': 'g', 'ACT': 'h', 'AGA': 'i', 'AGC': 'j', 'AGG': 'k', 'AGT': 'l', 'ATA': 'm', 'ATC': 'n', 'ATG': 'o', 'ATT': 'p', 'CAA': 'q', 'CAC': 'r', 'CAG': 's', 'CAT': 't', 'CCA': 'u', 'CCC': 'v', 'CCG': 'w', 'CCT': 'x', 'CGA': 'y', 'CGC': 'z', 'CGG': 'A', 'CGT': 'B', 'CTA': 'C', 'CTC': 'D', 'CTG': 'E', 'CTT': 'F', 'GAA': 'G', 'GAC': 'H', 'GAG': 'I', 'GAT': 'J', 'GCA': 'K', 'GCC': 'L', 'GCG': 'M', 'GCT': 'N', 'GGA': 'O', 'GGC': 'P', 'GGG': 'Q', 'GGT': 'R', 'GTA': 'S', 'GTC': 'T', 'GTG': 'U', 'GTT': 'V', 'TAA': 'W', 'TAC': 'X', 'TAG': 'Y', 'TAT': 'Z', 'TCA': '1', 'TCC': '2', 'TCG': '3', 'TCT': '4', 'TGA': '5', 'TGC': '6', 'TGG': '7', 'TGT': '8', 'TTA': '9', 'TTC': '0', 'TTG': ' ', 'TTT': '.' }
const data = "ACCAGTAAAACG{AATTCAACAACATGCTGC4CTACA-AACAAAAACAAT-TCATCAACAAAR-AACAACTGGTGA-TTCTTCTCATGATGAAA4AACTTCTTCTGCTGC}";
let flags = [];
for (const ra of ["A", "C", "G", "T"]) {
for (const rb of ["A", "C", "G", "T"]) {
const tmp = data.replaceAll("4", ra).replaceAll("R", rb);
const groups = tmp.split(/-|\{|\}/);
for (const datum of groups) {
const slices = [...(datum.matchAll(/[A-Z0-9]{3}/g))]
let flag_slice = "";
for (const slice of slices) {
flag_slice += mapping[slice[0]];
}
flags.push(flag_slice);
}
const flag = flags.join("-").replace(/flag-/, "flag{").replace(/-$/, "}");
if (new RegExp(/flag\{[a-f0-9\-]+\}/).test(flag)) {
console.log(flag);
}
flags = [];
}
}
1
2
3
4
flag{d1ee664e-babd-11ea-bb75-00155db0066}
flag{d1ee664e-babd-11eb-bb75-00155db0066}
flag{d1ee664e-babd-11ec-bb75-00155db0066}
flag{d1ee664e-babd-11ed-bb75-00155db0066}

爆破出来四个flag,依次提交,最后正确flag为:

flag{d1ee664e-babd-11ed-bb75-00155db0066}

阿尼亚

打开发现

img

图片名为netpixeljihad,猜测为pixeljihad加密,需要密码

010打开图片十六进制,在文件尾发现字符

img

1
6333383363333963633338326333616263333865633261616332613363326261633262636333623263326235633261356332623563333834633262316333613063333832633361623061

cyberchef开梭2次hex后直接爆破

img

找到密码为简答的编码,解密

img

得到压缩包密码

解压flag压缩包

img

密文为两种字符,尝试01,错误

dcode.fr开梭,发现为十位密码

img

得到flag

X光的秘密

PS逐帧查看图片发现最后三帧图片一样的,编写脚本按帧导出:

1
2
3
4
5
6
7
import pydicom
from PIL import Image

dcm = pydicom.dcmread('task.dcm')
for i, image in enumerate(dcm.pixel_array):
img = Image.fromarray(image)
img.save(f'Xray_{i}.png')

或者在线网站直接DCM转PNG也可以(https://products.aspose.app/imaging/zh-hans/conversion/dcm-to-png/)

然后,思路不知道怎么往下走的时候提取了最后三帧图片的RGB值,发现都是只有一个通道,编写脚本将三张图片的RGB通道提出来重新组成一张新的图片:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import cv2
import numpy as np

img1 = cv2.imread('task.dcm_p18.png')
r_channel = img1[:, :, 0]
img2 = cv2.imread('task.dcm_p19.png')
g_channel = img2[:, :, 1]
img3 = cv2.imread('task.dcm_p20.png')
b_channel = img3[:, :, 2]

new_img = np.zeros_like(img1)
new_img[:, :, 0] = b_channel
new_img[:, :, 1] = g_channel
new_img[:, :, 2] = r_channel

cv2.imwrite('flag123.png', new_img)

zsteg查看LSB隐写:

image-20230419221919826

提取出

image-20230419222237979

获取flag:

flag{43159cf6-ff7f-47fc-a199-d14df05b9975}