2024春秋杯冬季赛-Misc部分WP
推荐LovelyForm取证工具
ez_forennsics手搓搓不出来文件,LovelyForm一把梭,太强了!!!
See anything in these pics?
拿到一个类似于二维码的图片,根据文件名提示Aztec,想到Aztec 条码,在线网站解码拿到密钥
解压压缩包后拿到jpg文件可以发现文件尾不正常
foremost分离文件拿到黑白图片,
爆破宽高拿到flag
enc
根据题目提示,直接爆破异或,拿到flag
def xor_brute_force(ciphertext):
for i in range(256): # 遍历所有可能的 ASCII 字符
key = chr(i)
result = ""
for c in ciphertext:
# 对密文中的每个字符和密钥进行异或操作
result += chr(ord(c) ^ ord(key))
print(f"Key: {key}, Result: {result}")
# 密文
ciphertext = "ys~xdg/m@]mjkz@vl@z~lf>b"
xor_brute_force(ciphertext)
压力大,写个脚本吧
压缩包递归爆破,密码在password中,不过需要base64解码,同时还要注意文件名在变化,写个脚本
import zipfile
import base64
import os
def extract_zip(zip_path, password=None, extract_to='aaa'):
"""解压ZIP文件到指定目录"""
try:
# 确保解压目录存在,不存在则创建
if not os.path.exists(extract_to):
os.makedirs(extract_to)
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
# 如果提供密码,则尝试使用密码解压
if password:
zip_ref.setpassword(password.encode('utf-8'))
zip_ref.extractall(extract_to) # 解压到指定目录
print(f"成功解压: {zip_path} 到 {extract_to}")
except Exception as e:
print(f"解压失败: {zip_path}, 错误: {e}")
def decode_base64(password_file):
"""从文件中解码Base64密码"""
try:
with open(password_file, 'r') as f:
encoded_password = f.read().strip()
decoded_password = base64.b64decode(encoded_password).decode('utf-8')
return decoded_password
except Exception as e:
print(f"读取或解码密码失败: {password_file}, 错误: {e}")
return None
def main():
# 假设所有文件都在同一个文件夹下
current_dir = os.getcwd() # 获取当前工作目录
extract_to = os.path.join(current_dir, 'aaa') # 解压目标目录为当前目录下的 'aaa'
# 初始的ZIP文件为zip_100.zip
zip_file = os.path.join(current_dir, 'zip_100.zip')
while True:
print(f"正在检查文件: {zip_file}")
# 检查当前ZIP文件是否存在
if os.path.exists(zip_file):
print(f"正在处理文件: {zip_file}")
# 解压当前ZIP文件
if zip_file == os.path.join(current_dir, 'zip_100.zip'):
# zip_100.zip不需要密码直接解压
extract_zip(zip_file, extract_to=extract_to)
else:
# 获取对应的密码文件路径
password_file = zip_file.replace('.zip', '_99.txt')
if os.path.exists(password_file):
password = decode_base64(password_file)
if password:
extract_zip(zip_file, password, extract_to)
else:
print(f"跳过解压 {zip_file},因为无法获取密码")
break
else:
print(f"没有找到密码文件: {password_file}")
break
# 下一层压缩包的文件名为zip_xxx.zip,路径应当指向'aaa'目录
next_zip_file = os.path.join(extract_to, zip_file.replace('.zip', '_99.zip').split(os.sep)[-1])
# 打印调试信息,检查路径是否正确
print(f"下一文件: {next_zip_file}")
# 如果下一个ZIP文件不存在,退出
if not os.path.exists(next_zip_file):
print("没有找到下一个ZIP文件,解压结束。")
break
# 更新zip_file为下一个ZIP文件
zip_file = next_zip_file
else:
print(f"{zip_file} 文件不存在,解压结束。")
break
if __name__ == '__main__':
main()
拿到flag-hint
PASSWORD+PASSWORD.png
怀疑flag是把所有的密码合并到一起,写个脚本
import zipfile
import base64
import os
def extract_zip(zip_path, password=None, extract_to='aaa'):
"""解压ZIP文件到指定目录"""
try:
# 确保解压目录存在,不存在则创建
if not os.path.exists(extract_to):
os.makedirs(extract_to)
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
# 如果提供密码,则尝试使用密码解压
if password:
zip_ref.setpassword(password.encode('utf-8'))
zip_ref.extractall(extract_to) # 解压到指定目录
print(f"成功解压: {zip_path} 到 {extract_to}")
except Exception as e:
print(f"解压失败: {zip_path}, 错误: {e}")
def decode_base64(password_file):
"""从文件中解码Base64密码"""
try:
with open(password_file, 'r') as f:
encoded_password = f.read().strip()
decoded_password = base64.b64decode(encoded_password).decode('utf-8')
return decoded_password
except Exception as e:
print(f"读取或解码密码失败: {password_file}, 错误: {e}")
return None
def append_password_to_file(password, file_path="1.txt"):
"""将密码追加到1.txt文件"""
try:
with open(file_path, 'a') as f:
f.write(password + "\n") # 每个密码占一行
print(f"密码 {password} 已添加到 {file_path}")
except Exception as e:
print(f"写入密码到文件失败: {file_path}, 错误: {e}")
def main():
# 假设所有文件都在同一个文件夹下
current_dir = os.getcwd() # 获取当前工作目录
extract_to = os.path.join(current_dir, 'aaa') # 解压目标目录为当前目录下的 'aaa'
# 创建 1.txt 文件,如果已存在则清空
password_file_path = os.path.join(current_dir, "1.txt")
if os.path.exists(password_file_path):
os.remove(password_file_path)
# 初始的ZIP文件为zip_100.zip
zip_file = os.path.join(current_dir, 'zip_100.zip')
while True:
print(f"正在检查文件: {zip_file}")
# 检查当前ZIP文件是否存在
if os.path.exists(zip_file):
print(f"正在处理文件: {zip_file}")
# 解压当前ZIP文件
if zip_file == os.path.join(current_dir, 'zip_100.zip'):
# zip_100.zip不需要密码直接解压
extract_zip(zip_file, extract_to=extract_to)
else:
# 获取对应的密码文件路径,密码文件的命名规则是 'password_数字.txt'
current_number = int(zip_file.split('_')[1].split('.')[0]) # 获取当前zip文件的数字部分
password_file = os.path.join(extract_to, f'password_{current_number}.txt') # 构造密码文件的路径
if os.path.exists(password_file):
password = decode_base64(password_file)
if password:
# 将密码添加到1.txt
append_password_to_file(password, password_file_path)
extract_zip(zip_file, password, extract_to)
else:
print(f"跳过解压 {zip_file},因为无法获取密码")
break
else:
print(f"没有找到密码文件: {password_file}")
break
# 下一层压缩包的文件名为zip_xxx.zip,路径应当指向'aaa'目录
# 通过提取当前文件名中的数字部分递减
current_number = int(zip_file.split('_')[1].split('.')[0]) # 获取当前zip文件的数字部分
next_number = current_number - 1 # 递减数字
next_zip_file = os.path.join(extract_to, f"zip_{next_number}.zip") # 构造下一个ZIP文件的路径
# 打印调试信息,检查路径是否正确
print(f"下一文件: {next_zip_file}")
# 如果下一个ZIP文件不存在,退出
if not os.path.exists(next_zip_file):
print("没有找到下一个ZIP文件,解压结束。")
break
# 更新zip_file为下一个ZIP文件
zip_file = next_zip_file
else:
print(f"{zip_file} 文件不存在,解压结束。")
break
if __name__ == '__main__':
main()
发现png文件头,不过这里文件头反了,逆序一下
def reverse_lines(file_path):
"""将文件中的所有行逆序,但保持每行内容的顺序不变"""
try:
# 读取文件的所有行
with open(file_path, 'r') as f:
lines = f.readlines()
# 逆序所有行
reversed_lines = lines[::-1]
# 写回文件,覆盖原文件内容
with open(file_path, 'w') as f:
f.writelines(reversed_lines)
print(f"文件 {file_path} 中的所有行已被逆序。")
except Exception as e:
print(f"操作失败: {e}")
# 调用函数,传入文件路径
file_path = '1.txt' # 你要处理的文件路径
reverse_lines(file_path)
拿到二维码,扫描拿到flag
简单镜像提取
拿到流量包,分离文件得到俩个压缩包,解压拿到img镜像文件
可能是非预期了,直接在记事本打开拿到flag
flag{E7A10C15E26AA5750070EF756AAA1F7C}
ez_forensics
volatility文件扫描发现有7z和hint.txt,不过提取hint.txt后是空文件
尝试提取出7z,但是也是空的,工具的问题?
用LovelyForm尝试,成功导出7z压缩包,不过被加密
没有找到其他信息,尝试爆破,john爆了半天没爆出来,想到hint(hint的密文俩次rot就可以)
尝试hashdump
python2 vol.py -f ezforensics.raw --profile=Win7SP1x64 hashdump
拿到密码strawberries,解压压缩包拿到mobax的配置文件
如果这里是我的思路,肯定是去破解密钥,连ssh,那么密码在里面
这里就用到了一款对应的工具:github.comhttps://github.com/HyperSine/how-does-MobaXterm-encrypt-passwordhttps://github.com/HyperSine/how-does-MobaXterm-encrypt-password
如果像我这样,忽略掉主密钥的存在,去爆破ssh的秘密,那么就可以坐牢一下午了
如果注意到文件名,把文件名当作主密钥即可出flag
里面的内容base64转码即可