type
Post
status
Published
date
Apr 5, 2023
slug
6
summary
感觉出难了呜呜呜
tags
wp
category
MISC
icon
password
把学弟的wp拿来用,自己懒得写了 总的来说出题想法是想让做题人多动动手,主动查查一些资料,不过,最后一败涂地

致我那逝去的青春

这题是抄的去年NCTF2022的原题,当做签到题,要是没人做出来其他题就把这个放出来
下面直接放出脚本,注释都在上面了
import string # 读取卡组代码 # AAECAZoFKNAFhAeMBtIGngXIBrwFzgnmBpIJpgnSBrYH5gaSCaYJ0ga2B4IGugm2B9AF/gOIBPQIiAnQBb4GiAngA8wI8ge2B+oDvga2B6gFmgjyB+IJAAA= with open('hearthstone.txt','r') as f: tes = f.readline() # 生成base64索引表 box = list(string.ascii_uppercase+string.ascii_lowercase+string.digits+"+/") bin_arr = [] # 将代码四四分组 grouped_string = [tes[i:i+4] for i in range(0, len(tes), 4)] for line in grouped_string: # 将每组的每一位转为6位的二进制值 chres = '' for i in range(0,4): # =用000000填充 if line[i] == '=': chres += '000000' else: chres += format(box.index(line[i]), "06b") # 将4个6位的二进制值转为3个8位的二进制值 for i in range(0, len(chres), 8): # 省略最后一组8位都是0的情况 if chres[i:i+8] == '00000000' and line == grouped_string[-1]: continue else: bin_arr.append(chres[i:i+8]) # 将前面与卡牌内容无关的二进制值去除 bin_arr = bin_arr[7:] # 以两个为一组,去除一组中第一个值的第一位,去除一组中第二个值中前面无意义的0 for n in range(0,len(bin_arr),2): # bin(int(bin_arr[n+1], 2))[2:] 去除无意义的0 tmp = bin(int(bin_arr[n+1], 2))[2:] + bin_arr[n][1:] # 如果其ascii值大于255,则需要除10再转为字符,否则直接转为字符 if int(tmp,2) > 255: print(chr(int(tmp,2)//10),end='') else: print(chr(int(tmp,2)),end='') # HZNUCTF{WuwU_WuwU_My_H34rtHSt0ne_1S_Die}
另一种解法
python居然有一个库是hearthstone,可以一把梭
from hearthstone.deckstrings import Deck deck = Deck.from_deckstring('AAEDAZoFKIwGngXIBrwFzgnQBfIHygf0CIgJkAi+BogJ1gjMCPIHtgeeBeAD6AfyB7YHvgbgA+AD4AO2B7wFkgnMCMwI+ga2B/QImgi6BJAIiAn2BOIJAAA=') for card in deck.cards: flag_part = int(card[0] / 10) print(chr(flag_part), end='')

snake

misc选手怎么能不会逆向呢?
下载后是一个python编程的exe文件,先将其反编译,使用pyinstxtractor工具
python .\pyinstxtractor.py D:\Security\CTF\杂\HZNUCTF校赛决赛\MISC\snake\snake.exe
notion image
得到的文件夹中有snake.pyc文件,我们再将其反编译为py文件,使用在线网站
打开得到的py文件,发现上面有flag的提示
notion image
将其格式转换一下
s = b"import hashlib \nimport string \nsalt_1 = 'xxxxxxxxxxx' \nsalt_2 = 'xxxxxxxxxxx' \nsalt_3 = 'xxxxxxxxxxx' \nsalt = salt_1 + salt_2 + salt_3 \ndata = 'HZNUCTF{xxxxx}' #5%e4%bd%8d ascii+digits+_ \nsalt_data = salt + data \ndata_sha = hashlib.sha256(salt_data.encode('utf-8')).hexdigest() \nprint(data_sha) #c08521f3c380906d05ee8afbc7fa2943afb3788d9cec94c1b86771ee35ca4738" print(s.decode())
得到
import hashlib import string salt_1 = 'xxxxxxxxxxx' salt_2 = 'xxxxxxxxxxx' salt_3 = 'xxxxxxxxxxx' salt = salt_1 + salt_2 + salt_3 data = 'HZNUCTF{xxxxx}' #5%e4%bd%8d ascii+digits+_ salt_data = salt + data data_sha = hashlib.sha256(salt_data.encode('utf-8')).hexdigest() print(data_sha) #c08521f3c380906d05ee8afbc7fa2943afb3788d9cec94c1b86771ee35ca4738
notion image
这里salt值还不知道,再去文件中找一下
发现salt_1和salt_2都是已知的,salt_3需要逆运算一下
print(''.join([chr(ord(c)-i) for i, c in enumerate('mhigexn|irlt')])) # mggdashuaibi
得到三个salt后再看代码,就是一个哈希爆破,一共有5位需要爆破,这里直接给出爆破脚本
import hashlib import string salt_1 = 'mxx307shuai' salt_2 = 'mxx407shuai' salt_3 = 'mggdashuaibi' salt = salt_1 + salt_2 + salt_3 box = list(string.ascii_letters+string.digits+"_") for a in box: for b in box: for c in box: for d in box: for e in box: data = "HZNUCTF{"+a+b+c+d+e+"}" salt_data = salt + data data_sha = hashlib.sha256(salt_data.encode('utf-8')).hexdigest() if data_sha == 'c08521f3c380906d05ee8afbc7fa2943afb3788d9cec94c1b86771ee35ca4738': print(data) exit(0)
notion image

babyLSB

一个小小魔改的LSB
hint: 写脚本,两个像素点一组,注意文件名
解压得到R0G2R1G2A2B3.png,这里根据提示的两个像素点为一组,可以猜测文件名中的R0G2R1对应第一个像素点,G2A2B3对应第二个像素点,而其中的字母表示通道,数字代表8位二进制的哪一位是插入点
因此这里编写解密脚本
import numpy as np from PIL import Image # 读取png图片 img = Image.open("R0G2R1G2A2B3.png") # 获取图像尺寸 width, height = img.size # 将图像转换为NumPy数组 img_arr = np.array(img) res = '' # 创建一个文本文件并写入RGBA通道值 for i in range(height): for j in range(0,width,2): # 两个为一组 rgb_1 = img_arr[i, j, :] rgb_2 = img_arr[i, j+1, :] # 根据文件名 R0G2R1G2A2B3 ,R0G2R1 是第一个的值,表示r通道的0位,g通道的2位,r通道的1位;G2A2B3 是第二个的值,表示g通道的2位,alpha通道的2位,b通道的3位 res += format(rgb_1[0],'08b')[-1] + format(rgb_1[1],'08b')[-3] + format(rgb_1[0],'08b')[-2] + format(rgb_2[1],'08b')[-3] + format(rgb_2[3],'08b')[-3] + format(rgb_2[2],'08b')[-4] #print(res) # 通过二进制转十六进制发现504b开头,猜测为zip文件,因此将二进制转为zip文件 int_list = [int(res[i:i+8],2) for i in range(0,len(res),8)] bytes_data = bytes(int_list) with open("output.zip", "wb") as f: f.write(bytes_data)
得到output.zip,解压后得到FLAG.txt,其中就是flag

蹦蹦炸弹

题目描述: 解压密码:5ff0762eeabcd275c75c4b6e943097c518604493323a52488e67a5d595d108ce79c6d1539a3740f026c4d10d55085c9ec6b0b52a9b5892e1fbd85b671ed16d7a 大坏蛋mxx307入侵了我的系统,最后还想ssh将我的PPT偷走,不过聪明的可莉可是加密了PPT,诶,我忘记我的PPT的密码是啥了,好像是5位小写字母呢。 ssh为弱密码 flag有三部分,第一部分为用户密码 hint: 1. Linux取证 2. Ubuntu符号表(附件)
解压是一个dmp后缀的内存文件,直接用vol2跑会卡住,应该是没有对应镜像的内核
vol3看一下文件的版本号
python vol.py -f /root/temp/flag.dmp banners
notion image
得到结果
Linux version 4.15.0-20-generic (buildd@lgw01-amd64-039) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 (Ubuntu 4.15.0-20.21-generic 4.15.17)
题目中是直接提供符号表的,我也不想去自己去搞了,放一篇文章可以参考一下
(看我的祥云杯捏)
notion image
将下载的Ubuntu.zip放在kali的volatility的/volatility/plugins/overlays/linux/目录下
切换到vol2,通过以下命令查看是否成功载入
python2 vol.py --info | grep Ubuntu
notion image
然后就可以开始使用vol2做题了,以下链接中有vol2常用linux取证命令的解释

part1

根据题目描述中,第一部分为用户密码,一般用户密码存放在/etc/shadow中,通过以下命令找到该文件的地址
python2 vol.py -f /root/temp/flag.dmp --profile=LinuxUbuntux64 linux_enumerate_files | grep 'shadow'
notion image
找到地址后,通过以下命令将文件提取出来
python2 vol.py -f /root/temp/flag.dmp --profile=LinuxUbuntux64 linux_find_file -i 0xffff8b7ad779f3a8 -O shadow
打印提取出来的文件shadow,下面flag处是一个sha512crypt $6$, SHA512 (Unix)加密的哈希值
notion image
如何判断该类型哈希值呢?这里是通过hashcat攻击模式索引网站找到的
复制哈希值的特征$6$,去网页中ctrl+f搜索即可找到
notion image
找到对应的攻击值1800,我们采用hashcat来攻击(一般来说短时间的题目爆破结果都不会很复杂,这里直接使用kali自带的rockyou.txt字典爆破比较快)
hashcat -m 1800 -a 0 /root/temp/burte.txt /usr/share/wordlists/rockyou.txt
得到第一部分flag:admin
notion image

part2

然后我们再通过以下命令,查看linux内存文件的bash记录(类似于windows取证的cmd命令行,都是需要关注的敏感部分)
python2 vol.py -f /root/temp/flag.dmp --profile=LinuxUbuntux64 linux_bash
在bash记录中我们能找到一个连接ssh的记录
notion image
结合题目描述中的ssh为弱密码,尝试去爆破登陆,这里使用metasploit中的ssh爆破模块来爆破(这个工具一般来说,kali自带的)
在比赛前给toto做了一遍,然后他说123456是可以找到的,我忘记了,那就找找呗
# 启动msfconsole msfconsole # 查找爆破ssh登陆模块 search ssh_login # 利用模块 use auxiliary/scanner/ssh/ssh_login # 这里设置中ip,用户名,爆破密码字典是必须设置的 # 设置目标主机ip set RHOSTS 1.14.49.218 # 设置登陆用户名 set USERNAME ctfer # 设置密码爆破字典(因为是弱口令,还是用rockyou字典) set PASS_FILE /usr/share/wordlists/rockyou.txt # 设置线程 set THREADS 50 # 设置找到密码即停止 set STOP_ON_SUCCESS true
最后通过show options查看模块设置
notion image
再输入run开启爆破,最后找到结果为123456
notion image
然后获得第二部分flag有两种方式
方式一(非预期)
使用ssh直连bash
ssh -p 22 ctfer@1.14.49.218 # 输入密码123456(这里是无回显的)
进去后发现很多命令都不能使用了,只有ls可以使用,通过ls /可以看到根目录下有一个part2的文件
notion image
然后我问了mgg后才知道,是被删命令了,但是bash有两个自带命令是删不掉的,一个是for,一个是echo(这边不是删命令,也差不多,只给了ls的使用权限)
这里通过echo $(</part2)可以读取到part2的内容
通过提示$FLAG,我们再去通过echo $FLAG读取环境变量的内容,得到第二部分的flag:_L1nux_f0r3nsics_is_34sy_4nd_
这边听zysgmzb说,跟picoctf2023撞思路了
notion image
方式二
通过xftp连接ssh,可以直接跨越目录去读取part2文件
使用xftp连接后,到达根目录,右键用记事本打开即可得知flag在环境变量中,然后再使用echo $FLAG去打印flag(预期解是一样的,找环境变量那个文件,然后右键打开编辑就读取就好了)
notion image

part3(明文攻击可能是以后常考的一个考点了,freebuf那篇文章yyds)

我们通过查找桌面上的文件,找到存在一个flag.zip
python2 vol.py -f /root/temp/flag.dmp --profile=LinuxUbuntux64 linux_enumerate_files | grep 'Desktop'
notion image
还是将其提取出来先
python2 vol.py -f /root/temp/flag.dmp --profile=LinuxUbuntux64 linux_find_file -i 0xffff8b7b753b5e68 -O flag.zip
提取出来的flag.zip发现其中两个文件都被加密了,但是使用7-zip打开,发现他们的加密算法都是ZipCrypto,这里可以尝试明文爆破
zip明文攻击条件: 1. 至少已知明文的12个字节及偏移,其中至少8字节需要连续。 2. 明文对应的文件加密方式为ZipCrypto Store 知识扩展: ZIP的加密算法大致分为两种ZipCrypto和AES-256,各自又分Deflate和Store。 - ZipCrypto Deflate - ZipCrypto Store - AES-256 Deflate - AES-256 Store 只有使用ZipCrypto Deflate /Store才可以使用 ZIP已知明文攻击进行破解。
notion image
先创建已知明文hznuctf.pptx
echo -n "hznuctf.pptx" > ~/temp/flag.txt
进行明文攻击
./bkcrack -C ~/temp/flag.zip -c hznuctf.zip -p ~/temp/flag.txt -o 30 -x 0 504B0304
  • c 提取的密文部分p 提取的明文部分x 压缩包内目标文件的偏移地址 部分已知明文值C 加密压缩包o offset -p参数指定的明文在压缩包内目标文件的偏移量
得到密钥为9f08aab0 c1cab858 f800fdf2
notion image
通过密钥提取文件
./bkcrack -C ~/temp/flag.zip -c hznuctf.zip -k 9f08aab0 c1cab858 f800fdf2 -d ~/temp/hznuctf.zip
  • k 压缩包的密钥
  • d 提取文件的名称
提取出来的文件其中是一个加密的pptx文件,我们继续使用hashcat去爆破其密码
先要提取hznuctf.pptx的哈希值
office2john hznuctf.pptx >> office.txt
得到的office.txt中需要将其中的hznuctf.pptx:删掉
notion image
然后找到其在hashcat中哈希对应的值9600
这里wp中采用的是掩码爆破,因为在题目描述中提示了5位小写字母,但是我爆破半天没出来,后来发现其密码也是弱口令,通过rockyou字典可以找到
掩码爆破
hashcat -m 9600 -a 3 /root/temp/office.txt ?l?l?l?l?l --self-test-disable
字典爆破
hashcat -m 9600 -a 0 ~/temp/office.txt /usr/share/wordlists/rockyou.txt
notion image
得到密码为:fools
使用密码能打开pptx文件,flag有点难找,mgg给了一个trick,通过文件-信息-检查问题-检查文档可以发现pptx的注释中存在额外内容
notion image
notion image
最后在第一张ppt的注释中找到最后一部分flag:w3_n33d_bl4sting
notion image
最后完整的flag为
HZNUCTF{admin_L1nux_f0r3nsics_is_34sy_4nd_w3_n33d_bl4sting}
参考文章
阿里云CTFLinux内存取证出题记录