從 Web 狗的視角看 OSEE — 從 0.1 開始的 Advanced Windows Exploitation 考試

✅:『課程結束後一年內要考到 OSEE 證照喔』
🍊:「安啦,有一整年能準備哪不行」
(⏳⋯⋯)
✅:『公司下個月開始宣傳課程,到時候要有心得文唷』
🍊:「好(默默打開 OffSec 網站排了死線前一天考試)」
(⏳⋯⋯)
🍊:「下禮拜就要考試了,怎麼會這樣 ヽ(゚Д゚≡゚Д゚)ノ 」
✅:『你到底在幹嘛???』
這篇文算是自己準備 OSEE 考試的一點小心得,關於課程內容大家可以參考上一篇由 NiNi 撰寫的《EXP-401 (OSEE):用五天課程訓練通透十年的知識體系》,也可以期待下禮拜 Angelboy 要出的「我獨自速通 OSEE 🐈⬛」!
不過說實話,準備這個考試真的壓力很大;相較前幾個人,他們根本就是用母語考 N1 超級不公平!但如果整個研究組又只有我沒過,一定會被他們笑半天(可能不只 🤷♂️);為了不丟公司首席(還有自己)的臉,只好小小跳脫舒適圈、認真準備 OSEE 考試。因此這篇文章將從個人的角度出發、評估自己所擁有的技能、衡量是否符合 OSEE 考試所需的最低要求,並加以準備。如果你看完後覺得「就這樣?」,那相信你一定也能輕鬆通過號稱 OffSec 系列最難的 EXP-401 考試! (๑•̀ㅂ•́)و✧
前情提要
基本上,課程內容早就忘光光。而這半年為了一些酷東西(敬請期待✨),也好幾個月沒開過 IDA Pro 了,我直到考前一個禮拜才意識到大事不妙 😨;更何況當初為了壓死線,還把考試排在一個超爛的時間點(周日早上五點)。扣掉手上在弄的酷東西、公司庶務(好歹我也是個主管 ╮(╯_╰)╭),零零總總加起來只有「三天」能讀書!
(什麼,周休三日?研究員是沒有休假的!)
從前一篇 NiNi 的文中相信大家已經知道,整份 OSEE 教材約有 600 頁。鑒於上次讀原文書已經是高中(Gray Hat Python —— 嘿對,我大學沒讀過原文書XD),我決定第一天先把精力花在情蒐:找找有沒有考古題,或能從別人的心得萃取一些資訊;盡可能大膽地猜題,並想像考試時可能會遇到的坎。過程中發現 OSEE 的題目很固定,只有兩題:
- Windows Kernel 的本地提權
- UserMode App 的遠端程式碼執行
而網路上的普遍評價都是:前者簡單到爆,後者才是整個考試的重點,跳脫 Sandbox 的部分也在這!在對考試內容大致有個輪廓後,便開始認命讀書 —— 大概是一天要讀個 200 頁才能趕得上的進度之類的。整個 OSEE 課程主要分成五個部分:
- Shellcode - Windows Shellcode
- VM-Escape Exploit - VMware Workstation Guest-To-Host Escape
- Browser Exploit - Microsoft Edge Type Confusion
- Kernel Exploit Part 1 - Driver Callback Overwrite
- Kernel Exploit Part 2 - Unsanitized User-mode Callback
上面的內容並非完全沒有經驗,但也不能說有經驗。你可能想說「這個人在供三小」?且聽我娓娓道來!
準備過程
1. Windows Shellcode
第一個章節主要涵蓋 Windows 基礎知識以及 Shell Coding 上的各種慣例。Windows 的 Shellcode 不像 Unix-Like 系統上那麼方便,短短十幾個 Bytes 就能跳個 Shell;必須使用組合語言在各種不同的 Windows 結構中跳轉,並動態取出相對應的 Symbol 地址。因此一組 Shellcode 動輒兩、三百 Bytes 起跳,甚至利用 Egg Hunting 也是家常便飯。
對我來說,可以快速跳過這個章節的原因主要歸功於早期在玩皮卡丘打排球時的訓練。在當時(還是 Perl 時代)的 Metasploit 還不像現在那麼穩定,因此自己寫一套 Shellcode 框架就變成一件很炫的事。而很多古早的產生器都會寫死一些值,導致其無法橫跨多個 Windows 版本;因此為了讓一份 Shellcode 可以跨平台,必須確實了解每行指令,並嘗試修復它們!
因此簡單來說,這就是個用來暖身的環節 —— 考驗著學生對組合語言的熟悉程度,以及是否具備對本堂課程最最最最最基本的知識,這應該也是個順便給老師評估學生程度(?)的環節。如果上面的內容聽起來有點陌生,那你可以考慮先跳過這張證照,或認真讀讀《加密與解密》!(台北天瓏還有賣,沒想到出到第四版了XD)
2. VM-Escape Exploit
從這個章節起,整個 OSEE 才算真正開始見真章!正如其名,這一章專注在「如何從虛擬機跳出來」。對我來說,這也算另一個能用經驗輾壓的章節,我約在數年前有小研究過 VMware 的攻擊面,因此無論是 VMware 的 Backdoor 機制或是基於其之上的 Drag & Drop 漏洞都能駕輕就熟,印象那時還很認真逆向了 vmware-vmx
,並找出一些漏洞(被廠商摸頭又是另個故事了 ¯\_(ツ)_/¯ )。因此如果有認真讀過下面這幾篇,那我想這個章節應該就差不多了:
- 2017 - The Weak Bug - Exploiting a Heap Overflow in VMware
- 2017 - The Great Escapes of VMware: A Retrospective Case Study of …
- 2018 - A bunch of Red Pills: VMware Escapes
- 2018 - L’art de l’évasion: Modern VMWare Exploitation Techniques
不過,雖然我快速跳過了這章的前半,但由於當初是從「找漏洞」的視角下去學習,並沒有花太多時間著墨在「如何利用漏洞」上,因此我反而花了滿多額外的時間在複習後半段的漏洞利用,例如 LFH 機制,或是如何繞過額外的 WDEG 及 EAF 保護等。
3. Browser Exploit
這應該是整個課程聽起來最高大上的部分,從這開始難度也逐漸母湯。雖然十五年前我也玩過所謂的「瀏覽器漏洞」。不過在當時主流還是 x86 架構,只要一個 vtable call 跳到 0x0C0C0C0C 就能輕鬆 Heap Spray 的年代(還有燙燙燙跟屯屯屯XD) —— 此時彼時的難度絕對無法同日而語。
回顧這幾年,我對瀏覽器漏洞的認識也還停留在基礎的 addressOf
、fakeObj
,或是用 String Length 去造任意讀寫。雖然這些招數在好幾年前也過時了,不過好在這些概念在底層還能通用。此外,更歸功於以前 CTF 的訓練(被 Advanced Heap Exploitation 摧殘後這些都是小兒科 🤷♂️),即使在不熟悉的平台上,漏洞該如何利用、或成因等,那些熟悉度都還在。因此反倒我更專注在複習這章的「防禦繞過」(例如 CFG、ACG)、「漏洞的武器化」(使用 Data-Only Attack 穿梭在 Assembly 跟 JavaScript 中),以及後續地繞過 Sandbox 本身。
—— 回顧時,發現小時候自己居然還宣稱過「專精於 Windows 漏洞利用」,應該也算一種愚昧之巔 😖。
4. Kernel Exploit - Part 1
由於長期偏科在那些「遠端利用」的漏洞,老實說這個章節對我來說真的完全空白。自己對於 Windows Kernel 的認識也還停留在早期的 Token Kidnapping;或者強者我同事每次分享時,偷學個一兩招。不過仔細想想,他每個禮拜都在報新洞(羨慕),算下來好像也學了不少招 😆。只是,直到去年 OSEE 課程前,我連一次 Kernel Exploit 都還沒完成過,因此就算前面應用層還能靠老本硬嗑,從這開始就真的完全陌生了,也是本次考試我最最最最最擔心的部分 😨。
我大概花了一整天讓自己沉浸在 Windows Kernel 的世界,重新熟悉 IRQL/IOCTL、PML4/PTE、SMEP/SMAP 的概念,以及東逛逛西逛逛 KPROCESS/KTHREAD 等重要的結構。
5. Kernel Exploit - Part 2
來不及啦。怎麼可能在三天複習完 OSEE,這章整個跳過XD
—— 不過雖然來不及,但 Win32k 常見的漏洞模式我大概還是知道,只能祈禱自己的老本還夠用(?)
此外,這章所提到的虛擬化安全,例如 VBS、HVCI、EPT、kCFG 等。雖然我猜不會考(想想就很難出XD),但我反倒看得很開心。好好讀一讀感覺對未來也很有幫助,而最後一天就在這種 —— 輕輕鬆鬆、隨隨便便、東看看西看看的快樂氣氛下渡過!✨ 😌 🌱
考試
由於挑了一個爛時間,前一天我特地十二點不到就上床睡覺,結果就是 —— 完 ~ 全 ~ 睡 ~ 不 ~ 著 😵💫 🛌 ❌。約莫早上四點提著兩罐紅牛到辦公室應試。
時間一到便是 OffSec 一系列的 —— 開攝影機、How are you、I am fine thank you,還有秀護照的流程。考試開始時完全不想面對未知事物,反倒先挑了更難的 UserMode App 開局,過程中不知腦袋卡到啥還挑了一個爛方法,妄想著一步登天。寫完要戳遠端時才發現連最開始的 Leak 都失敗大崩潰,好在最後還是靠著毅力硬輾過去。解完第一題發現天亮了,為了不打擾同事星期一上班趕緊轉換地點。快 48 小時沒睡下樓梯時還小暈了一下,又重新認識到睡覺很重要XD
回到家洗洗睡起來趕快看下一題。相較前一題,Kernel 提權的洞真的簡單到不可思議。但小丑如我,連一開始的確認環境都花了好多時間。本地提權部分好像就較沒啥好說的,比較值得一提的是鑑於有同事因為報告寫太水沒過,我花了八個小時寫報告(據說還算快的),最終在考試結束前一小時提早交卷結束整個考試流程!🎉
後續
都考過了,應該可以結束這篇了吧 —— 附上人權!
說實話,OSEE 難度整體難度不高。不過自己還在卡在很多不應該的地方,著實該打屁股。除了沒睡飽、沒洗澡能好好思考,還有不是母語這些顯而易見的藉口外,事後還是覆盤了下自己還有哪些「可以做得更好」的地方?
其實整個流程看下來我也知道,最欠缺的就是「實作」—— 這導致雖然能搞定所有的關鍵流程,反而我都卡在一些莫名其妙的小細節上。尤其 CTF 的背景又容易在一些不切實際的地方上鑽牛角尖,因此這裡給考生的一點小建議是:
- 絕對要把課堂上的 Extra Miles 做過一遍,有好好做完一定會過!
- OSEE 著重在最基礎的「你懂不懂」,因此不用擔心沒有實際的漏洞挖掘經驗會無法應試。
- CTF 上那些炫招不會出現,當你開始思考用 Partial Overwrite 搞事時你已經走火入魔了。
給自己的一個小反思是 —— 這些年好像太把技能特化在「找漏洞」這件事上,對於「記憶體上的利用」反倒沒有太多著墨,說起來著實有些慚愧;不過想想自己只是隻 Web 狗,又覺得好像還好(汪)。相信如果有 WEB-401 的話我也能速通! 💪
—— 坐等 OffSec 出 WEB-401 😜
推薦嗎?
平心而論,這是一次很棒的體驗!不僅課程內容充實、跳脫了舒適圈,甚至還能跟好朋友一起讀書!然而最令我驚訝的是「課程講師的專業度」(聽說 OSEE 全球只有四位講師),他們不僅對課程的掌握度極高、對每個細節滾瓜爛熟,甚至能解答你對於 Windows 所有天馬行空的怪問題。我相信既使是已經能速通的 Angelboy,也從課堂上學到不少新東西(吧)(跑XD
不過,無論是想系統性地了解 Windows 的漏洞利用體系,或是 CTF 仔想要驗證一下自己的能力到哪,我想 EXP-401 (OSEE)絕對是你的最佳選擇! 👍