第22届信息安全与对抗技术竞赛“博弈对抗赛”决赛writeup
字数 4007 2025-11-07 08:41:54

ISCC博弈对抗赛实战教学文档

文档说明

本文档旨在系统性地解析ISCC博弈对抗赛中的核心技术与战术思路。内容涵盖赛制理解攻防对抗流程具体题目解题技巧以及高级利用手法。通过本教程,您将学习到如何在真实的攻防场景中,从初始立足点逐步扩大优势,最终控制比赛局面。


第一章:赛制与整体攻防框架

1.1 赛制概述

  • 模式:近真环境真实对抗,包含基础知识、阵地攻防、高地攻防等模式。
  • 时长:12小时,是对体力、脑力和团队协作的终极考验。
  • 核心目标:在保护己方服务(私地)的同时,攻击并控制其他队伍的服务。
  • 资源:开局获得本队私地(靶机)地址。通过攻击获取其他队伍的私地地址。

1.2 攻防对抗核心思路

一个清晰的攻防流程是取胜的关键,其核心思路如下图所示:

flowchart TD
    A[初始立足点<br>获取私地Shell] --> B[建立持久化通道<br>写入SSH公钥]
    B --> C[搭建代理网络<br>上传Gost & Fscan]
    C --> D[信息收集<br>扫描B段IP]
    D --> E{目标存活判断}
    E -- 服务存活 --> F[攻击 exploit]
    E -- 服务被Kill(常见) --> G[无法攻击]
    F --> H[获取Flag/得分]
    I[高地开放] --> J[扫描高地IP/端口]
    J --> F

阶段详解

  1. 突破口确立:首先攻克本队的私地题目,获得一个初始的、非持久的Shell。
  2. 权限维持:将非持久化Shell升级为稳定的SSH连接,为后续操作打下坚实基础。
  3. 横向移动:在控制的跳板(靶机)上部署代理工具(Gost)和扫描器(Fscan),使整个战队都能访问到其他队伍的私网环境。
  4. 情报搜集:利用扫描器对目标IP段进行端口扫描,识别存活的Pwn或Web服务。
  5. 攻击执行:对存活的目标服务发起攻击。注意:比赛中常见的防守策略是直接kill -9结束题目进程,导致攻击无法进行。
  6. 高地争夺:比赛后期开放的高地题目,需要重复扫描和攻击流程。

第二章:关键技术点详解

2.1 权限维持:从WebShell到SSH隧道

拿到初始Shell后的第一步是建立持久化连接。

  • 操作步骤

    1. 攻击者自己的机器上生成SSH密钥对:ssh-keygen -t rsa(默认路径为 ~/.ssh/id_rsa.pub~/.ssh/id_rsa)。
    2. 获得的初始Shell中,将公钥(id_rsa.pub的内容)写入目标靶机的 ~/.ssh/authorized_keys 文件。
      # 示例命令
      mkdir -p ~/.ssh
      echo "ssh-rsa AAAAB3NzaC1yc2E...(你的公钥内容)" > ~/.ssh/authorized_keys
      chmod 700 ~/.ssh
      chmod 600 ~/.ssh/authorized_keys
      
    3. 从攻击者机器直接SSH连接靶机:ssh -i /path/to/your_private_key user@target_ip。这样就获得了一个完整的、稳定的Shell。
  • 教学意义:该方法比维持一个脆弱的WebShell或Netcat Shell可靠得多,支持文件传输(SCP/SFTP)、端口转发等高级功能。

2.2 代理搭建与团队协作

为了能让所有队员都能访问到比赛内网,需要搭建代理。

  • 工具选择:Gost (https://github.com/go-gost/gost),一个功能强大的安全隧道工具。
  • 部署与使用
    1. 通过SCP将Gost二进制文件上传到已被控制的靶机上。
    2. 在靶机上启动Gost代理服务。
      # 示例:在靶机的1080端口启动一个SOCKS5代理
      ./gost -L socks5://:1080
      
    3. 战队成员在本机配置Proxychains等工具,指向跳板机的代理IP和端口。
    4. 后续的扫描和攻击命令前加上proxychains4,即可通过代理进行。
      proxychains4 nmap -sT -Pn 172.16.1.0/24
      

2.3 信息收集:网络扫描

  • 工具选择:Fscan(内网渗透常用扫描器)。
  • 扫描策略
    • 快速扫描整个B段IP,寻找开放了常见Pwn或Web端口的机器。
    • 命令示例:proxychains4 ./fscan -h 172.16.1.0/24 -p 80,8080,9999,10000(端口根据实际题目调整)。
    • 发现IP后,再进行详细端口扫描和服务识别。

第三章:CTF题目WriteUp精讲

3.1 MISC-合二为一

知识点:压缩包修复、注释信息利用、RSA低解密指数攻击(Wiener's Attack)、Word文件结构。

  1. 修复压缩包:使用WinRAR的修复功能。
  2. 寻找密码:修复后的压缩包注释中包含一个字符串,此为第一层密码,用于解压出a文件夹。
  3. RSA攻击a文件夹中的txt文件提示使用低解密指数攻击。需要使用RSA-wiener-attack工具脚本进行解密,得到第二层密码。
  4. 修复Word文档b文件夹是一个被解压的Word文档(后缀改为.zip)。将其重新压缩为ZIP文件,并修改后缀为.docx。如果打开失败,检查Word文档必需的[Content_Types].xml_relsdocProps等文件夹是否齐全,可从a文件夹中补全。
  5. 共模攻击:打开的Word文档中的脚本是RSA共模攻击场景,但e1e2不互素,存在最大公约数a = gcd(e1, e2)。攻击后得到的是m^a,需要对结果开a次方根才能得到真正的明文m
  6. 获取Flag:将得到的明文字符串逆向输出即为最终Flag。

3.2 私地Pwn-rand

知识点:堆利用(UAF, Use-After-Free)、栈溢出、Canary绕过、Ret2libc。

  1. 代码审计
    • 主程序存在栈溢出点。
    • 需要绕过sub_401216函数中的五次输入判断。
    • 关键条件:ptr指针指向的内容必须为"BossDontNeedKey"
  2. 漏洞利用
    • UAF利用ptrfree后进入tcache bin。随后程序申请v2堆块时,如果我们申请相同大小(调试确定为0x58字节),v2会复用ptr的堆块。此时向v2写入"BossDontNeedKey",也就等同于修改了ptr的内容,从而成功绕过判断。
    • 栈溢出:进入栈溢出函数后,程序开启Canary保护。
    • 泄露Canary:利用read函数读满缓冲区,覆盖Canary最低位(null字节)。程序在返回前会检查Canary,失败则会打印输出,从而泄露出Canary值(因为覆盖最低位后检查失败,但原Canary值会被输出)。
    • Ret2libc:由于缺乏Leak,需要分两步:
      • 第一次溢出:构造ROP链,泄露一个GOT表地址(如puts),计算libc基址。
      • 第二次溢出:再次触发溢出,构造system("/bin/sh")的ROP链,获取完整Shell。

3.3 高地Pwn1-restaurant

知识点:逆向分析、堆漏洞(UAF, Heap Overflow)、__free_hook利用。

  1. 身份认证绕过:程序开始有异或(XOR)操作进行认证。编写Python脚本逆向计算,得到凭证为guest/12345
  2. 漏洞识别
    • delete函数存在UAF(释放后未置空指针)。
    • edit函数存在堆溢出(可写入超过堆块大小的数据)。
  3. 利用步骤
    • 申请一个较大的堆块(如0x430大小)后释放,使其进入unsorted bin(其中包含main_arena的地址)。
    • 利用UAF或堆溢出,通过show功能泄露unsorted bin中的地址,计算libc_base
    • 利用UAF修改一个已释放堆块的fd指针,或利用堆溢出修改堆块数据,最终目标是劫持__free_hooksystem函数。
    • 申请到__free_hook附近的堆块并写入system地址。
    • 释放一个内容为"/bin/sh"的堆块,触发system("/bin/sh")

3.4 高地Pwn2-Exnoted

知识点:整数溢出、格式化字符串漏洞、栈溢出、沙箱绕过(ORW)。

  1. 漏洞1:格式化字符串泄露
    • log_note函数中,输入一个超过int16_t最大值(32767)的数,如0x8000,会发生整数溢出,使得v1被赋值为32768,导致read函数可以读入超长数据,造成栈溢出。
    • 溢出的数据通过sprintf拼接到栈上的tmp变量。
    • show函数中,tmp被直接打印,存在格式化字符串漏洞。使用%p可以泄露栈上的数据,包括ELF地址和Canary。
  2. 漏洞2:栈溢出getshell
    • exnote函数中存在明显的栈溢出。
    • 利用步骤
      • 利用格式化字符串漏洞泄露ELF基址、Canary和libc地址。
      • 利用exnote中的栈溢出,结合泄露的Canary,构造ROP链。由于程序禁用了execve,无法直接execve("/bin/sh")
      • 沙箱绕过:采用ORW(Open-Read-Write)或openat+sendfile的ROP链来读取Flag文件。
        • ORWopen("flag", 0) -> read(fd, buf, 0x100) -> write(1, buf, 0x100)
        • 或者使用openat(AT_FDCWD, "flag", 0) + sendfile(1, fd, NULL, 0x100),后者更简洁。

第四章:防守策略与总结

4.1 有效防守策略

  • 进程清除:最简单有效的临时防守方法是在每轮攻击开始前,直接kill -9掉本队的题目服务进程。这样攻击方即使找到你的IP,也无法利用。但注意:正规比赛可能有Check机制,服务下线会被扣分。本文提及的该届比赛无Check机制。
  • 补丁修复:针对题目漏洞,编写补丁并重启服务。例如,修复Pwn题的溢出点,或更新Web题的代码。
  • 监控与预警:部署监控脚本,检测异常连接和文件修改。

4.2 核心技能总结

通过本次WriteUp的学习,需要掌握以下技能:

  1. 攻防整体流程规划:从单点突破到横向移动的完整思路。
  2. 权限维持技术:SSH密钥认证等持久化方法。
  3. 内网渗透工具使用:Gost代理、Fscan扫描器。
  4. 复杂CTF题目解法:多种密码学攻击、二进制漏洞组合利用。
  5. 高级Pwn技巧:堆利用、栈保护绕过、沙箱逃脱。

希望这份详尽的教学文档能对您的学习有所帮助

ISCC博弈对抗赛实战教学文档 文档说明 本文档旨在系统性地解析ISCC博弈对抗赛中的核心技术与战术思路。内容涵盖 赛制理解 、 攻防对抗流程 、 具体题目解题技巧 以及 高级利用手法 。通过本教程,您将学习到如何在真实的攻防场景中,从初始立足点逐步扩大优势,最终控制比赛局面。 第一章:赛制与整体攻防框架 1.1 赛制概述 模式 :近真环境真实对抗,包含基础知识、阵地攻防、高地攻防等模式。 时长 :12小时,是对体力、脑力和团队协作的终极考验。 核心目标 :在保护己方服务(私地)的同时,攻击并控制其他队伍的服务。 资源 :开局获得本队私地(靶机)地址。通过攻击获取其他队伍的私地地址。 1.2 攻防对抗核心思路 一个清晰的攻防流程是取胜的关键,其核心思路如下图所示: 阶段详解 : 突破口确立 :首先攻克本队的私地题目,获得一个初始的、非持久的Shell。 权限维持 :将非持久化Shell升级为稳定的SSH连接,为后续操作打下坚实基础。 横向移动 :在控制的跳板(靶机)上部署代理工具(Gost)和扫描器(Fscan),使整个战队都能访问到其他队伍的私网环境。 情报搜集 :利用扫描器对目标IP段进行端口扫描,识别存活的Pwn或Web服务。 攻击执行 :对存活的目标服务发起攻击。 注意 :比赛中常见的防守策略是直接 kill -9 结束题目进程,导致攻击无法进行。 高地争夺 :比赛后期开放的高地题目,需要重复扫描和攻击流程。 第二章:关键技术点详解 2.1 权限维持:从WebShell到SSH隧道 拿到初始Shell后的第一步是建立持久化连接。 操作步骤 : 在 攻击者自己的机器 上生成SSH密钥对: ssh-keygen -t rsa (默认路径为 ~/.ssh/id_rsa.pub 和 ~/.ssh/id_rsa )。 在 获得的初始Shell 中,将公钥( id_rsa.pub 的内容)写入目标靶机的 ~/.ssh/authorized_keys 文件。 从攻击者机器直接SSH连接靶机: ssh -i /path/to/your_private_key user@target_ip 。这样就获得了一个完整的、稳定的Shell。 教学意义 :该方法比维持一个脆弱的WebShell或Netcat Shell可靠得多,支持文件传输(SCP/SFTP)、端口转发等高级功能。 2.2 代理搭建与团队协作 为了能让所有队员都能访问到比赛内网,需要搭建代理。 工具选择 :Gost (https://github.com/go-gost/gost),一个功能强大的安全隧道工具。 部署与使用 : 通过SCP将Gost二进制文件上传到已被控制的靶机上。 在靶机上启动Gost代理服务。 战队成员在本机配置Proxychains等工具,指向跳板机的代理IP和端口。 后续的扫描和攻击命令前加上 proxychains4 ,即可通过代理进行。 2.3 信息收集:网络扫描 工具选择 :Fscan(内网渗透常用扫描器)。 扫描策略 : 快速扫描整个B段IP,寻找开放了常见Pwn或Web端口的机器。 命令示例: proxychains4 ./fscan -h 172.16.1.0/24 -p 80,8080,9999,10000 (端口根据实际题目调整)。 发现IP后,再进行详细端口扫描和服务识别。 第三章:CTF题目WriteUp精讲 3.1 MISC-合二为一 知识点 :压缩包修复、注释信息利用、RSA低解密指数攻击(Wiener's Attack)、Word文件结构。 修复压缩包 :使用WinRAR的修复功能。 寻找密码 :修复后的压缩包注释中包含一个字符串,此为第一层密码,用于解压出 a 文件夹。 RSA攻击 : a 文件夹中的 txt 文件提示使用 低解密指数攻击 。需要使用 RSA-wiener-attack 工具脚本进行解密,得到第二层密码。 修复Word文档 : b 文件夹是一个被解压的Word文档(后缀改为.zip)。将其重新压缩为ZIP文件,并修改后缀为 .docx 。如果打开失败,检查Word文档必需的 [Content_Types].xml 、 _rels 、 docProps 等文件夹是否齐全,可从 a 文件夹中补全。 共模攻击 :打开的Word文档中的脚本是RSA共模攻击场景,但 e1 和 e2 不互素,存在最大公约数 a = gcd(e1, e2) 。攻击后得到的是 m^a ,需要对结果开 a 次方根才能得到真正的明文 m 。 获取Flag :将得到的明文字符串逆向输出即为最终Flag。 3.2 私地Pwn-rand 知识点 :堆利用(UAF, Use-After-Free)、栈溢出、Canary绕过、Ret2libc。 代码审计 : 主程序存在栈溢出点。 需要绕过 sub_401216 函数中的五次输入判断。 关键条件: ptr 指针指向的内容必须为 "BossDontNeedKey" 。 漏洞利用 : UAF利用 : ptr 被 free 后进入tcache bin。随后程序申请 v2 堆块时,如果我们申请相同大小(调试确定为0x58字节), v2 会复用 ptr 的堆块。此时向 v2 写入 "BossDontNeedKey" ,也就等同于修改了 ptr 的内容,从而成功绕过判断。 栈溢出 :进入栈溢出函数后,程序开启Canary保护。 泄露Canary :利用 read 函数读满缓冲区,覆盖Canary最低位(null字节)。程序在返回前会检查Canary,失败则会打印输出,从而泄露出Canary值(因为覆盖最低位后检查失败,但原Canary值会被输出)。 Ret2libc :由于缺乏Leak,需要分两步: 第一次溢出 :构造ROP链,泄露一个GOT表地址(如 puts ),计算libc基址。 第二次溢出 :再次触发溢出,构造 system("/bin/sh") 的ROP链,获取完整Shell。 3.3 高地Pwn1-restaurant 知识点 :逆向分析、堆漏洞(UAF, Heap Overflow)、 __free_hook 利用。 身份认证绕过 :程序开始有异或(XOR)操作进行认证。编写Python脚本逆向计算,得到凭证为 guest/12345 。 漏洞识别 : delete 函数存在UAF(释放后未置空指针)。 edit 函数存在堆溢出(可写入超过堆块大小的数据)。 利用步骤 : 申请一个较大的堆块(如0x430大小)后释放,使其进入unsorted bin(其中包含main_ arena的地址)。 利用UAF或堆溢出,通过 show 功能泄露unsorted bin中的地址,计算 libc_base 。 利用UAF修改一个已释放堆块的 fd 指针,或利用堆溢出修改堆块数据,最终目标是劫持 __free_hook 为 system 函数。 申请到 __free_hook 附近的堆块并写入 system 地址。 释放一个内容为 "/bin/sh" 的堆块,触发 system("/bin/sh") 。 3.4 高地Pwn2-Exnoted 知识点 :整数溢出、格式化字符串漏洞、栈溢出、沙箱绕过(ORW)。 漏洞1:格式化字符串泄露 在 log_note 函数中,输入一个超过int16_ t最大值(32767)的数,如 0x8000 ,会发生整数溢出,使得 v1 被赋值为32768,导致 read 函数可以读入超长数据,造成栈溢出。 溢出的数据通过 sprintf 拼接到栈上的 tmp 变量。 在 show 函数中, tmp 被直接打印,存在格式化字符串漏洞。使用 %p 可以泄露栈上的数据,包括ELF地址和Canary。 漏洞2:栈溢出getshell 在 exnote 函数中存在明显的栈溢出。 利用步骤 : 利用格式化字符串漏洞泄露ELF基址、Canary和libc地址。 利用 exnote 中的栈溢出,结合泄露的Canary,构造ROP链。由于程序禁用了 execve ,无法直接 execve("/bin/sh") 。 沙箱绕过 :采用ORW(Open-Read-Write)或 openat + sendfile 的ROP链来读取Flag文件。 ORW : open("flag", 0) -> read(fd, buf, 0x100) -> write(1, buf, 0x100) 。 或者使用 openat(AT_FDCWD, "flag", 0) + sendfile(1, fd, NULL, 0x100) ,后者更简洁。 第四章:防守策略与总结 4.1 有效防守策略 进程清除 :最简单有效的临时防守方法是在每轮攻击开始前,直接 kill -9 掉本队的题目服务进程。这样攻击方即使找到你的IP,也无法利用。 但注意 :正规比赛可能有Check机制,服务下线会被扣分。本文提及的该届比赛无Check机制。 补丁修复 :针对题目漏洞,编写补丁并重启服务。例如,修复Pwn题的溢出点,或更新Web题的代码。 监控与预警 :部署监控脚本,检测异常连接和文件修改。 4.2 核心技能总结 通过本次WriteUp的学习,需要掌握以下技能: 攻防整体流程规划 :从单点突破到横向移动的完整思路。 权限维持技术 :SSH密钥认证等持久化方法。 内网渗透工具使用 :Gost代理、Fscan扫描器。 复杂CTF题目解法 :多种密码学攻击、二进制漏洞组合利用。 高级Pwn技巧 :堆利用、栈保护绕过、沙箱逃脱。 希望这份详尽的教学文档能对您的学习有所帮助