關於 Web CTF 仔考 OSWE 的那件事
這是一篇以 Web CTF 仔視角來看的 OSWE 考試文,但就算你不是 Web CTF 仔或許也能參考看看一些考試思路 👀
OSWE (WEB-300)
- 作答時間 48 小時
- 僅兩題 (每題皆有 local.txt + proof.txt)
- 白箱(但只能從他們給的 VM 看原始碼,不能載下來)
- 較大 code base
- 目標為提權成 admin + 一鍵 RCE
身為一個 CTF 仔白箱看 code 根本是基礎必點技能了,所以這個證照我是直接裸考的。這邊直接先學大家拉一下時間線:
- Day 0 22:00 | 考試開始線
- Day 0 22:30-01:30 | 解完第一題但還沒寫腳本
- Day 1 19:00-20:00 | 寫一下第一題腳本
- Day 1 23:00-01:30 | 第二題 local.txt + 找到第二個洞
- Day 2 15:00-19:30 | 第二題 RCE + 腳本 + 補截圖
- Day 2 22:00 | 考試截止線
你或許會想,哇,那你差不多花 4、5 小時才解掉一題欸,以 CTF 來說應該還有點難度的題目吧?欸並沒有,它真正的難度在於超慢的網速。
網速真的很卡
前面說過,雖然身為白箱題,但 OSWE 並不像常見的 CTF 一樣會直接打包整包原始碼送給你,而是會要求你要以 RDP 或 SSH 連上去他們提供的虛擬機來看 code。簡單來說,一個題目他會提供兩台機器:題目機與測試機。題目機是給你拿 flag 的地方,而測試機是給你 debug 跟看 code 的機器。其實在測試機上他們很佛心的幫你裝好 code editor,甚至也幫你配置好 debug 環境了,但問題是那個虛擬機真的很慢,你遠端桌面連上去後,它可是會像用 512k 網速開圖片一樣一行一行 load 畫面的。
總之,這能有效大幅的降低你的閱讀程式碼速度。
當然,如果你儘可能避免使用 RDP,而使用 SSH,並搭配配置良好的 .vimrc 來閱讀的話,當然是能有一定程度的改善的——但還是蠻慢的就是。
對了,你可能會想說,欸有 SSH 啊,那我可不可以直接用 sshfs 或 VSCode 的 Remote Explorer 來看 code 啊?很抱歉,規則有寫明這是非法行為了。畢竟他們做此設計,無非是想防止考題外流啦。
巨大的 Code Base?
提到 OSWE,不少人的心得裡都會說到題目的 code 量很多云云,甚至有些人會拿來跟 CTF 比較,提到 CTF 的程式碼量大不了數百行,但 OSWE 卻可達到上千或上萬行,聽起來似乎有點駭人。
嗯,雖然這麼說沒錯,但 OSWE 的漏洞與 CTF 相比往往斧鑿痕相當重,一眼便能知道那邊的寫法是有問題的,因此也不大需要認真追完所有程式碼或釐清全部的架構邏輯便能發現漏洞。縱使仍有很多所謂的「兔子洞(rabbit hole)」,但畢竟是白箱,花幾秒鐘追一下便能快速排除了。而在 OSWE 也不大會出現像 CTF 般「有洞但是 exploit 超難構造」的場景,就算需要繞過 WAF、存在過濾條件,也往往是 Google 一下「<攻擊手法> bypass」之類的便能在前三個搜尋結果找到的常見招數。
總而言之,在 OSWE 中由於其題目漏洞人工感之重,因此直接以 pattern 找洞是一個很有效的方法。也就是:
「好,我現在想找看看有沒有 SQL injection,有的話我就能做很多事了」
「那就來直接從所有類似 SQL query 的程式碼下去找吧!」
「喔喔,我現在有一個檔案讀不到不然就能 RCE 了」
「那我來全域搜尋 /file_.*/g
找看看有沒有任意讀檔吧!」
基本上透過諸如此類的招式便能找到你需要的漏洞了。我想這種 mindset 對應付這個考試還蠻有幫助的,如果沒想過可以這樣打的話可以學一下(?)。當然,這前提仍是你要對漏洞種類與成因有基礎的了解,才能猜想出所謂的 pattern 會是什麼模樣。
回到 CTF 程式碼不多的說法,我不知道這麼說的人到底都打了些什麼 CTF,但我的就解題經驗裡,縱使 CTF 挑戰本體程式碼少,但不少挑戰往往都需要追到 library 或程式語言的內部底層邏輯,而 library 的程式碼量之大就不用多說了吧。
所以,難嗎?
我覺得就漏洞利用層面而言其實大多數都不難,都是很裸、好利用的漏洞,利用方式大多能從 PayloadsAllTheThings 或 HackTricks 等等的直接找到,甚至可能光透過瀏覽器逛逛網站,便能略知漏洞會在哪存在而不需先閱讀程式碼。如果以大型 CTF 來說的話,這當 Web 類別的暖身題應該不為過;就算以 AIS3 pre-exam 而言,我認為也還沒到 Web 類別最難題的程度。
但不得不說,若考生只是 script kiddie 、較難理解程式碼的程度,要能成功利用應該還是沒那麼輕鬆,仍然需要簡單了解你正在用的 payload 是什麼東西、為什麼能動才比較能穩定通關。
而就 OSWE 設計上著重的「白箱能力」而言,我想確實需要有最基礎的 mindset 來應付稍微多的程式碼才能及格,但其實並不需要到熟練使用 debugger、能從零通盤了解整體架構的程度,只要能找到寫爛的地方就好。
結論上來說,如果你自認是 Web CTF 仔,或是 code auditing 經驗者而言,這絕對是個可以輕鬆裸考的證照。
如果我是 OffSec
說個小秘密,其實稍微 Google 一下便能發現 OSWE 退役題目的 write-up。我看起來從 OSWE 誕生至今,應該只換過三套題。而那些題目與現役題目不只名稱一樣,乍看應該也是利用同一個模板一直去修改的——整體架構雷同,但換成挖不同的漏洞。
其實這讓我不禁覺得 OffSec 官方對待 OSWE 有點太混了 XD。如果我是 OffSec 的話,大概每個月或每季都會用同個模板換一次題,而每年都要重新開發一個模板吧。而至於題目設計上,我會希望降低程式碼的斧鑿痕,別讓玩家一眼就能看出這邊在埋洞;也可以擴大網站架構的規模,但這就更消耗人力成本了——不過現在有 AI 能幫寫,應該不是大問題吧 😉。
TL;DR
- 不能把 source code 載回本機要遠端看,但遠端網速好慢哭啊(這是寫這篇的重點)
- Code 其實沒到真的很多
- 有點讀 code 經驗可以輕鬆裸考
以上。另外當然還要感謝 DEVCORE 把拔贊助的課程 ><