[心得] AIS3 EOF 2024 Final
[TOC]
這次是第四次參賽 總算是拿到前三名了 > <
![Scoreboard](https://img.stoneapp.tech/t510599/eof-2024/final/Scoreboard.png)
最後拿到了第一名 感謝隊友們
寫篇文章記錄一下發生的趣事跟題目
## 每年慣例(?)
~~打 EOF 就要壞個東西~~
[去年](post.php?pid=954)打一打 筆電爆炸讀不到硬碟
今年打一打 PVE 就掛掉了直接開不回來
## 組隊
今年是第一次改成單人打 Quals -> 晉級後組隊的形式
主辦單位安排了一個媒合活動 照名次讓他排隊伍志願序 並按照志願序問該隊伍是否讓他加入
都沒媒合到再隨機分組
我們這隊最後是這樣的組成:
兩個被我騙去修程安的同學 + 一個去年 EOF 隊友 + 一個 Web 佬 + 剩下媒合進來的
媒合的部分是說要進來就說好 ~~所以整隊的初賽名次其實都靠前~~
## 賽前準備
我們隊其實直到比賽前一天下午才開始弄 ~~在這之前連訊息都沒傳過~~
下午把 trello / Discord 等東西創好就沒啥動靜了 (?
後面大概快晚上 11 點才開始弄 wireguard 跟開 VM
剩下東西甚至是到場地才開始架 XD (見 [#Infra](#Infra)
## Infra
今年默默撿了一點 Infra 工作來做 整體架構如下:
![infra](https://img.stoneapp.tech/t510599/eof-2024/final/eof-infra.png)
今年比賽方提供了一台 jumpbox 來連進比賽機器 不過規格只開 2C1G 不太夠用
所以在學校開了一台 VM 來讓大家跑腳本跟其他有的沒的 然後用 wireguard 全部串一起
### Attack Manager
我們架了 [Destructive Farm](https://github.com/DestructiveVoice/DestructiveFarm) 來自動打 exploit
![Destructive Farm Server](https://img.stoneapp.tech/t510599/eof-2024/final/Destructive%20Farm%20-%20Server.png)
架構分成負責送 flag 跟分發 config (題目 IP etc.) 的 server
跟執行 exploit 並傳 flag 給 server 的 client
因為清大之前跳電跳到怕了 所以把 attack manager server 放在 jumpbox (其實也不太吃資源)
VM 只跑 client 以方便隨時跳走 ~~第一天沒多久 VM 就死了 連 PVE Host 一起~~ ~~分開放的決定是對的~~
多虧 @yikuo 贊助了別的 VM 後面才能不用全卡在 jumpbox
### Elastic
感謝 @yikuo 的協助 我們在第二天有了 elastic search 可以看流量 也會自動匯入 pcap
找 HTTP 裡面的 payload 變得方便許多 ~~還意外發現 casino 其實會錄到各隊 team token~~
![team token](https://img.stoneapp.tech/t510599/eof-2024/final/casino/team-token.png)
### Grafana
原本在賽前一天晚上找了 @yikuo 幫忙架 grafana 要來看 service check / score etc.
但是後來發現其實沒啥用 所以被放置了
### Patch Diff
賽前 staff 發了訊息說會有 container image 形式的 patch
我寫了自動 download patch 並找了 @a91082900 來弄自動 `container-diff`
但在中 [GCP DDoS Alert](#GCP%20DDoS%20Alert) 之後被限速限爆所以載不動 patch 然後就放置了
### GCP DDoS Alert
比賽第一天大概下午兩點 (~4 hr) 就被海豹問說我們幹了啥 並有以下附圖:
![iftop](https://img.stoneapp.tech/t510599/eof-2024/final/ddos.png)
基本上是 [Patch Diff](#Patch%20Diff) 抓 patch 抓太兇 GCP 就生氣氣了
接下來整天整隊的 outbound 就被限速在 10 Mbps 左右 只要有人載 patch 整隊網路就死光
我整個下午都在顧 iftop 看誰在搞 最後才發現是抓 patch 流量
![iftop](https://img.stoneapp.tech/t510599/eof-2024/final/iftop.png)
後來翔哥幫我們換 IP 不過沒啥用 隔天重開一台 VM 才解決
感謝翔哥
## hahamut (AAD)
這題是一開始比賽就放出來的題目 因為那時候都在顧 infra 所以其實沒看 到最後也都沒怎麼看 XD
比賽後期看大家 SLA 都是 down
後來聽 @maple3142 說才知道 service check 會 DROP db
而預期解是有人會透過 patch 上 tcpdump 錄 service check 流量
更多可以看 maple 釋出的 repo: [AIS3-EOF/2024-ad-hahamut-public](https://github.com/AIS3-EOF/2024-ad-hahamut-public)
## rush popper (KoH)
> 出題好麻煩?讓開發者們/參賽者們幫我出 👍
> -- splitline
這題是要路邊撿一個 composer package 裝起來 然後串 POP chain 並 call 指定 function
並且需要在 call trace 中使用到該 package 的 class
觸發點可以是 `__destruct`、`__call`、`__toString`
先比 payload 長度 再比觸發點 最短的就是 king 分數按照該 package 星星數換算
~~這題出現的 POP chain 基本上都是 splitline 題目出過的~~
第一天基本上只有 phpggc 上面的兩個 chain (splitline 放的)
和 `predis/predis` 的 chain (今年程安 web 作業)
剛好解作業這題的五人中有三個都在我們這隊 所以可以很快樂地直接丟上去 (*附個我自己的 [Writeup](https://hackmd.io/@t510599/2023-swsec-hw4#Private-Browsing-Revenge)*
phpggc 雖然有一隊拿走了 但靠 `predis/predis` 第一天賺了不少分數
第二天大家做了作業回來 開場有人丟了 `*/fluentpdo` 的 chain 而且有三個同樣的 package 不同名字
我做的作業倒是都沒用 因為走錯方向 (只是拿 phpggc 的 chain 硬塞 class)
所以改變策略: ~~蹲別人的來撿漏~~
一開始 `predis` 被搶走了 因為我 port 打 48763 別隊換成 1 之類更短的 port
後面找到 `fluentpdo` 可以把裡面的 `a:b` 換成 `a:` ~~不過也沒多久就被搶走了~~
接下來是把所有的 `private`、`protected` 全部都換成 `public` 可以省掉 `\x00`
還很開心的跟隊友講說我把每題都幹下來了
但是 `phpggc` 很貼心的幫我換了行 (多 `\n`) 馬上被搶走了 QQ
這題默默直接變成拚手速遊戲 所以第二天幾乎都在顧這題
被瘋狂互搶的苦主 -> [別隊的 WriteUp](https://blog.ching367436.me/ais3-eof-2024-final/#popper-KoH)
OwO
後面還有 `monolog` 用了 `mixed` 所以 member name 可以是空字串這種鬼東西 (原本我們改成 `a`)
或是 payload 最後面的 `}` 其實可以少幾個等等
某個時候的截圖:
![king](https://img.stoneapp.tech/t510599/eof-2024/final/rush_p0pper/king.png)
幸好前面 `fluentpdo` 拚手速拚贏了 最後就穩定在這樣的狀態直到回合結束:
![ranking](https://img.stoneapp.tech/t510599/eof-2024/final/rush_p0pper/ranking.png)
最後這題也是最高分
## ICPC (KoH)
這題是讓你寫 shellcode 解一些簡單的程式題
但是每 round 每個隊伍可以各 ban 一個 byte 所以有些 instruction 就不能寫
都是隊友在寫 只有隨便提個建議說可以 XOR shellcode 再解密來 bypass 就好
詳情可以看別隊 [Curious 的 WriteUp](https://curious-lucifer.netlify.app/writeup/ais3_eof_2024_final_icpc_writeup/)
## casino
每隊有一台拉霸機 可以拿自己的 team token 去玩 把機器上的錢贏出來 (機器也有 machine token)
另外還有一個銀行做 verification 金流是讓他處理
題目有分兩個部分 一個是拉霸機介面 另外還有一個 admin panel
拉霸機就是個一般的 flask 而 admin panel 則是用 pyinstaller 包起來的 flask
而且用了 python 3.12 所以 pyc 沒辦法直接 decompile
後來看到某隊的 patch 活得很好 所以挖出來用 pycdc 看
![patch secret](https://img.stoneapp.tech/t510599/eof-2024/final/casino/patch-secret.png)
哇嗚 有野生的寫死 secret 更酷的是他是 Python 3.11 的 pyc
有了 secret 之後就可以任意簽 session 來操作 admin panel 而裡面有 web shell 可以用
又剛好大家都跟他們的 patch 所以可以到處用 XD
策略是每回合進到大家的機器 cat machine token 之後就把他們 service 砍到再起不能
除了不能再被 RCE 以外 也能避免錢被玩走 更甚者能賺很多 SLA 分數
![service check](https://img.stoneapp.tech/t510599/eof-2024/final/casino/service-check.png)
後面再拿各隊的 machine token 玩 把錢贏來 ~~偶有太雖被贏錢要認賠的環節~~
雖然第二天的一半才發現以上解法 但最後這題還是拿了最高分
據說預設解是拿 chatgpt 幫你看 bytecode
再用 `python -m app` 並透過 flask 的 `__init__.py` 補洞
賽後問到 patch 出 python 3.11 pyc 的隊伍是用這個工具 decompile 的 -> https://pylingual.io/
甚至是個 web service 超酷
## Pwn2Own
結合了 web + pwn 的題目 東西會包成 firmware 用樹梅派跑起來
原本的功能是顯示目前隊伍分數 兼具主辦拿來送跑馬燈
而目標是讓機器播出指定的影片 (*我的豆花~~~ 30 塊~~~!*)
一開始隊友挖了個 XSS 後 我隨手把影片丟到自己 server 跟寫了 `<video>` tag 給他
還有他們搞出 web shell 後說記得加 `DISPLAY=:0` 來跑 chromium
然後後面再玩了一下 web shell 之後就沒怎麼關注這題了
隔天看隊友搬了鍵盤出來直接切 tty 搞 terminal 跟 gdb 手刻 shellcode 了
更多詳情可參閱[別隊的 writeup](https://hackmd.io/@pwn2ooown/HJK40Xpca)
## 雜記
- 中華電信資安所床很硬
- 中華電信資安所沒有牙刷
- 中華電信資安所宿舍網路甚麼都鎖 只剩 TCP 80/443 最好帶自己網路 or 準備 SSLVPN
## 結語
EOF 好好玩 而且今年人變多了 不用再一人一題顧到累得半死了
但機器可以不要再死了嗎 QQ
![gameover](https://img.stoneapp.tech/t510599/eof-2024/final/gameover.gif)
## WriteUp 們
- https://hackmd.io/@pwn2ooown/HJK40Xpca
- https://blog.ching367436.me/ais3-eof-2024-final/
- https://curious-lucifer.netlify.app/writeup/ais3_eof_2024_final_icpc_writeup/
- https://taiyou.tw/blog/2024/02/10/AIS3-EOF-Final-2024/
---
默默發現[去年的文](post.php?pid=954)還沒寫 (?
2024-02-06 02:36:01
留言
Last fetch: --:--
現在還沒有留言!