[Sakana联队] SaarCTF对抗赛极限翻盘记录

1 分钟阅读时长

发布时间:

介绍

Sakana联队是第二次参加saarctf2024的AWD对抗, 相比于国内赛事, 这种高权限管理+高质量题目实在能给上好评, 今年的情况稍有不同, 因为时间紧急, 本次比赛仅一人: sudopacman进行参赛, 今年名次78/153名, 较去年109/249名来说不能算很好, 不过相比起来今年有了更优的攻防手段, 以下进行简要的经验复盘.

登录

今年为追求效率从openvpn改用到了效率更高的wireguard进行连接, 使用传统方式无法连上, 很羡慕每次都能成功优化更新. 以下是连接方式:

wg genkey | tee secret.key | wg pubkey > public.key

安装好wireguard后运行以上指令, 会生成对应的公钥与私钥(无需放置在.ssh页), 经测试在wsl1中无法完成配置, 后来测试实体机能够成功使用, 将公钥上传到官网>ME & MY TEAM>WireGuard Keys, 在对应的个人key选择download config进行下载, 获得一份saarctf.conf, 上传之前还需要稍微修改一下saarctf.conf文件, 添加上私钥串:

[Interface]
Address = 10.32.133.16/32
PrivateKey = [个人生成的私钥]

[Peer]
Endpoint = vpn.ctf.saarland:32133
AllowedIPs = 10.32.0.0/15
PublicKey = EXcdhix7o82LIsRDsSiowru0W1/eVz2mGDmD7Cq7oHE=
PersistentKeepalive = 20

之前需要打开wireguard>新建隧道选择文件saarctf.conf完成连接环境.

开启连接后可以尝试ping通内网, 等待比赛开始后可以使用openssh登录开始比赛.

进攻流程

给出saarctf给出题目更类似于ctf中的题目(web, re, 与pwn), 比赛开始时可以直接构造EXP拿分. 但是因为给出的服务器是root权限, 需要考虑其他选手对服务器进行的特殊操作, 相比传统awd中的手段, 还是直接在本地构造拿分要实用很多, 值得一提的是在熟悉的语言环境中选手可以考虑给系统加上完善的日志系统, 在他人攻击时能够仿制出EXP进行攻击拿分.

防御流程

本次比赛采用了一套特殊的防御手段, 核心思路是尽可能保证自己能够恢复环境, 另外结合常规awd中的套路加了IPS与IDS, 后期在被攻陷后自行恢复, 守住了4个环境, 可惜在第一次重启系统时没来得及保存环境, 导致有一个被攻陷环境被保留了下来, 后来想进行溯源反击, 但是因为实力不足没来得及对对方造成有效攻击, 以下给个简单的防御手段抛砖引玉:

#!/bin/bash

MONITORED_DIR="/proc"

TARGET_PROCESS_PATTERN="undesirable_process_pattern"
inotifywait -m -r -e create --format '%w%f' "$MONITORED_DIR" |
while read FILE
do
    PID=$(basename "$FILE")
    if ps -p "$PID" -o comm= | grep -q "$TARGET_PROCESS_PATTERN"; then
        echo "$(date): Detected potential malicious process $PID with name $(ps -p "$PID" -o comm=). Killing it."
        kill -9 "$PID" 2>/dev/null
    fi
done

还有一些去年提到的常规防御手段, 同样搬过来也会很有效:

修改危险指令

不建议直接删除, 我当时把很多重要工具进行改名, 结果防住了一些注入操作, 成功保住了几道赛题. 如果直接删除的话之后可能会有需要用到的地方, 像我之前出现了一个严重错误, 还好没有把指令直接删掉, 紧急修复了回去.

代码审计

删改掉一些危险代码, grep方法的魅力时刻, 结合vim的极端操作, 可以快速将一部分常见的威胁筛选抽离出来, 也可以配合一些安全工具进行大范围筛查(不过考虑到是类ctf环境, 成功率会很低).

复盘反思

拉包与远程同步进行

这确实是当时比赛中没有想到的, 六个环境文件量非常大, 导致拉包花了很多时间, 在本地拿到包开始分析时其他选手已经开始拿分了, 应该至少登两个shell, 在拉包的过程中先做些远程方便完成的事.

赛前总结

由于防御手段之间会出现相互冲突, 在赛前应该先考虑清楚步骤, 过程中因为出现了许多冲突(还有一些操作失误)导致部署防御脚本的过程中出现大量问题, 给出了攻击方充足的时间.

保持高效性

被运维习惯害了, 考虑到节约性能, 在初次针对性防守点的时候竟然还在sleep(), 实际上考虑攻击方EXP的连续攻击, 最好就是不间断地进行检测, 发现被攻击后立即反制.

patch

一直没学好二进制部分的技能, 在环境中会出现一些二进制的题目, 这种题型修改难度大, 在上次打awd的过程中曾问过队友应该怎么防二进制, 得知可以使用patch的方法(可以使用cutter进行patch), 但是因为没好好学导致技术不过关, 及时知道怎么被攻击也无法有效进行防御.