第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
阶段详解:
- 突破口确立:首先攻克本队的私地题目,获得一个初始的、非持久的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文件。# 示例命令 mkdir -p ~/.ssh echo "ssh-rsa AAAAB3NzaC1yc2E...(你的公钥内容)" > ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys - 从攻击者机器直接SSH连接靶机:
ssh -i /path/to/your_private_key user@target_ip。这样就获得了一个完整的、稳定的Shell。
- 在攻击者自己的机器上生成SSH密钥对:
-
教学意义:该方法比维持一个脆弱的WebShell或Netcat Shell可靠得多,支持文件传输(SCP/SFTP)、端口转发等高级功能。
2.2 代理搭建与团队协作
为了能让所有队员都能访问到比赛内网,需要搭建代理。
- 工具选择:Gost (https://github.com/go-gost/gost),一个功能强大的安全隧道工具。
- 部署与使用:
- 通过SCP将Gost二进制文件上传到已被控制的靶机上。
- 在靶机上启动Gost代理服务。
# 示例:在靶机的1080端口启动一个SOCKS5代理 ./gost -L socks5://:1080 - 战队成员在本机配置Proxychains等工具,指向跳板机的代理IP和端口。
- 后续的扫描和攻击命令前加上
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文件结构。
- 修复压缩包:使用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。
- 第一次溢出:构造ROP链,泄露一个GOT表地址(如
- UAF利用:
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),后者更简洁。
- ORW:
- 在
第四章:防守策略与总结
4.1 有效防守策略
- 进程清除:最简单有效的临时防守方法是在每轮攻击开始前,直接
kill -9掉本队的题目服务进程。这样攻击方即使找到你的IP,也无法利用。但注意:正规比赛可能有Check机制,服务下线会被扣分。本文提及的该届比赛无Check机制。 - 补丁修复:针对题目漏洞,编写补丁并重启服务。例如,修复Pwn题的溢出点,或更新Web题的代码。
- 监控与预警:部署监控脚本,检测异常连接和文件修改。
4.2 核心技能总结
通过本次WriteUp的学习,需要掌握以下技能:
- 攻防整体流程规划:从单点突破到横向移动的完整思路。
- 权限维持技术:SSH密钥认证等持久化方法。
- 内网渗透工具使用:Gost代理、Fscan扫描器。
- 复杂CTF题目解法:多种密码学攻击、二进制漏洞组合利用。
- 高级Pwn技巧:堆利用、栈保护绕过、沙箱逃脱。
希望这份详尽的教学文档能对您的学习有所帮助