网络安全之CTF-Misc&取证&OSINT全解

Misc

签到&签退

公众号发送信息获取flag

问卷

回答问卷得flag

芙宁娜的图片

随波逐流扫一下图片,在RGB通道发现key

key:H&N2025

看txt

+++++ +++[- >++++ ++++< ]>+++ +++++ +++++ ++.<+ +++++ [->-- ----< ]>--- --.<+ +++++ [->++ ++++< ]>+++ +.++. ++++. <+++[ ->--- <]>-- ---.< +++++ ++[-> +++++ ++<]> ++++. <++++ +[->- ----< ]>--- ----- -.<++ ++++[ ->--- ---<] >---- -.<++ +++++ +[->+ +++++ ++<]> +++++ .<+++ +[->- ---<] >---- --.<+ ++++[ ->+++ ++<]> +.<++ ++[-> ----< ]>--- -.<++ +[->+ ++<]> ++.-. ----- ---.+ +++++ +.--- --.<+ +++[- >++++ <]>+. <++++ [->-- --<]> ----- .<+++ [->++ +<]>+ ++.<+ +++[- >---- <]>-- .<+++ +[->+ +++<] >++++ +.<++ +[->- --<]> ---.- --.-- ----. <++++ +[->- ----< ]>--- .<+++ +++[- >++++ ++<]> +++++ +++.+ +++++ .---- -.--- ----- .<+++ [->++ +<]>+ +++.< +++++ +++[- >---- ----< ]>--- ----- ----- -.<++ +++++ +[->+ +++++ ++<]> +++++ +++++ ++.<+ +++[- >---- <]>-- --.<+ +++[- >++++ <]>+. +++.- ---.- ----- --.<+ +++++ +[->- ----- -<]>- ----- --.<+ +++++ ++[-> +++++ +++<] >++++ +++++ +++++ +.<

brainfuck解密

O&NPTF{Y0u_yepognizeq_the_Couphu's_psog.}

维吉尼亚解密

H&NCTF{Y0u_recognised_the_Chuchu's_plot.}

星辉骑士

解压docx文件

在星辉骑士\word\media目录下找到flag.zip文件,解压出来

垃圾邮件解密

spammimic - hide a message in spam

999.txt为flag

H&NCTF{0231265452-you-kn*w-spanmimic}

乱成一锅粥了

下载流量包,导出所有zip

对zip中的txt文件名字进行解密

经过几个尝试发现命名规则为01-50每个数的MD5加密

我重新还原原本的txt序列名称

import os
import hashlib

def generate_md5_dict():
    """生成数字01-50到其MD5值的映射字典"""
    md5_dict = {}
    for i in range(1, 51):
        # 格式化为两位数,前面补零
        num_str = f"{i:02d}"
        # 计算MD5值
        md5_hash = hashlib.md5(num_str.encode('utf-8')).hexdigest()
        md5_dict[md5_hash] = num_str
    return md5_dict

def rename_files(folder_path):
    """重命名文件从MD5值回数字"""
    md5_dict = generate_md5_dict()
    
    # 遍历文件夹中的所有文件
    for filename in os.listdir(folder_path):
        if filename.endswith('.txt'):
            # 去掉.txt后缀获取MD5部分
            md5_part = os.path.splitext(filename)[0]
            
            if md5_part in md5_dict:
                original_num = md5_dict[md5_part]
                new_filename = f"{original_num}.txt"
                old_path = os.path.join(folder_path, filename)
                new_path = os.path.join(folder_path, new_filename)
                
                # 重命名文件
                os.rename(old_path, new_path)
                print(f"重命名: {filename} -> {new_filename}")
            else:
                print(f"跳过: {filename} (未找到对应的数字)")

# 使用示例
folder_path = ""  # 替换为你的文件夹路径
rename_files(folder_path)

发现为iV开头的base64,即png图片的base64的形式

继续还原

import os
import base64

def read_and_combine_txt_to_image(folder_path, output_image_path):
    # 初始化空字符串用于存储拼接内容
    combined_content = ""
    
    # 按顺序读取01.txt到50.txt
    for i in range(1, 51):
        # 生成文件名,保证两位数字格式
        filename = f"{i:02d}.txt"
        file_path = os.path.join(folder_path, filename)
        
        try:
            with open(file_path, 'r', encoding='utf-8') as file:
                combined_content += file.read()
        except FileNotFoundError:
            print(f"警告: 文件 {filename} 未找到,已跳过")
        except Exception as e:
            print(f"读取文件 {filename} 时出错: {str(e)}")
    
    if not combined_content:
        print("错误: 没有读取到任何文件内容")
        return False
    
    try:
        # 将拼接后的内容解码为二进制数据
        image_data = base64.b64decode(combined_content)
        
        # 将二进制数据写入图片文件
        with open(output_image_path, 'wb') as image_file:
            image_file.write(image_data)
        
        print(f"成功将拼接内容转换为图片并保存到: {output_image_path}")
        return True
    except base64.binascii.Error:
        print("错误: 拼接的内容不是有效的Base64编码")
    except Exception as e:
        print(f"转换或保存图片时出错: {str(e)}")
    
    return False

# 使用示例
folder_path = ""  # 替换为你的txt文件所在文件夹路径
output_image_path = "output_image.png"  # 输出的图片路径

read_and_combine_txt_to_image(folder_path, output_image_path)

得到二维码碎片

拼个图片扫码即可

H&NCTF{This_wont_be_difficult_for_you}

谁动了黑线?

查看csv

最后一列tx_hash是base58,解密一下

import csv
import base58

def decode_and_replace_base58_in_csv(csv_file_path, output_file_path=None):
    """
    读取CSV文件,对最后一列(除第一行外)进行Base58解密,并用解密结果替换原始数据
    
    参数:
        csv_file_path (str): 原始CSV文件路径
        output_file_path (str): 输出文件路径(如果为None则覆盖原文件)
        
    返回:
        list: 包含所有行的列表,每行最后一列已被解密(如果成功)
    """
    all_rows = []
    
    try:
        with open(csv_file_path, mode='r', encoding='utf-8') as file:
            reader = csv.reader(file)
            
            # 读取标题行
            headers = next(reader, None)
            if headers is not None:
                all_rows.append(headers)
            
            for row in reader:
                if not row:  # 跳过空行
                    continue
                    
                original_value = row[-1].strip()  # 获取最后一列数据并去除空白
                
                try:
                    # 尝试Base58解码
                    decoded = base58.b58decode(original_value).decode('utf-8')
                    row[-1] = decoded  # 用解密结果替换原始数据
                    print(f"行 {reader.line_num}: 解密成功 {original_value} -> {decoded}")
                except Exception as e:
                    print(f"行 {reader.line_num}: 解密失败 - {original_value} - 错误: {str(e)}")
                    # 解密失败则保留原始数据
                
                all_rows.append(row)
                
        # 确定输出文件路径
        output_path = output_file_path if output_file_path else csv_file_path
        
        # 写入更新后的数据
        with open(output_path, mode='w', encoding='utf-8', newline='') as file:
            writer = csv.writer(file)
            writer.writerows(all_rows)
            
        print(f"\n文件已保存到: {output_path}")
                    
    except FileNotFoundError:
        print(f"错误: 文件 {csv_file_path} 未找到")
    except Exception as e:
        print(f"处理文件时发生错误: {str(e)}")
    
    return all_rows

# 使用示例
if __name__ == "__main__":
    # 替换为你的CSV文件路径
    input_csv = "your_file.csv"
    output_csv = "decoded_file.csv"  # 设为None则会覆盖原文件
    
    # 调用函数处理CSV文件
    updated_data = decode_and_replace_base58_in_csv(input_csv, output_csv)
    
    # 打印前几行结果作为示例
    print("\n前几行解密结果示例:")
    for i, row in enumerate(updated_data[:5]):
        print(f"行 {i+1}: {row}")

排序发现类似明文格式

我们编写代码,读取csv表的最后一列(除了第一行),读取第9位到第12位帮我把带有小写字母或者下划线_数据提取出来,最后全部拼起来

import csv

def process_csv(filename):
    result = []
    
    with open(filename, 'r', newline='', encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile)
        
        # 跳过第一行(标题行)
        next(reader, None)
        
        for row in reader:
            if not row:  # 跳过空行
                continue
                
            # 获取最后一列
            last_column = row[-1]
            
            # 检查长度是否足够
            if len(last_column) >= 12:
                # 提取第9到12位(Python中索引从0开始,所以是8:12)
                substring = last_column[8:12]
                
                # 检查是否包含小写字母或下划线
                if any(c.islower() or c == '_' for c in substring):
                    result.append(substring)
    
    # 将所有符合条件的子字符串拼接起来
    final_string = ''.join(result)
    return final_string

# 使用示例
filename = 'decoded_file.csv'  # 替换为你的CSV文件名
output = process_csv(filename)
print("拼接结果:", output)

#拼接结果: little_dog_is_Aomr!!
H&NCTF{little_dog_is_Aomr!!}

Forensics

ez_game

下载镜像,火眼挂载

有个readme.txt

这次是个简单的取证小游戏
1.我藏了一个电脑,它的密码是很简单的弱密码,但是你找的到吗
2.图片没有隐写,但是它凭什么可以成为key,好难猜啊
3.如果你找的了flag,注意flag的内容全部大写

藏了一个电脑,我索引到一个hhh文件

有分别找到key.jpg和一个加密zip

全部导出

根据提示:图片没有隐写,但是它凭什么可以成为key

参考西湖论剑2025,图片可以作为密钥文件进行VC镜像挂载

我们挂载hhh文件

得到一个虚拟机

我们继续挂载vmdk

查看历史命令

有个hhh文件,且最近访问过

导出

010查看存在额外字符,猜测为零宽隐写

shift

类似上述历史命令

echo "key(shift):`1234567890-=" >> hhh.txt

根据提示1:密码是很简单的弱密码

题目给了

·123456789-=

通过shift反转得到

~!@#$%^&*()_+     //即为zip密码

解压之前得到的zip,得到flag.drawio文件

加载文件

H&NCTF{YOU_R_SSSO_COOL}

OSINT

Chasing Freedom 1

图片属性得到时间0503

图片定位到蓝眼泪观景台,开始对周围一通爆搜一个一个试

H&NCTF{0503-丁鼻垄}

Chasing Freedom 2

因为我是先写第3题,后写第二题的,发现时间差不多,而且是一个灯塔,那就试试去搜索东庠岛灯塔,还真找到一模一样的

H&NCTF{0504-东庠岛灯塔}

Chasing Freedom 3

拖进随波逐流找到时间

查看图片发现岚庠渡,去搜索

然后发现岚庠渡只有1,2,3号,去试试H&NCTF{0504-东庠码头-岚庠渡1号},全都试过了,发现不对,

H&NCTF{0504-流水码头-岚庠渡3号}

猜猜我在哪儿?

提示从太原出发到西安lm研发中心的路途

拍摄取景,应该是在高铁上

差不多定位到这

根据朝向,和四周地形进一步定位

试一下周围地点最终得到

flag{永济市张营镇下吴村}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值