DEFCON 26 Final CTF
分享一下 2018 暑假跟 BFS 聯隊們一起打 DEFCON CTF Final 的心得,初賽跌跌撞撞的打入前 25,GRE 一戰也有很大一部份的原因是因為這樣爆炸的 XD 。決賽在 25 個隊伍中,我們 BFS 是首次參賽,沒有太多打這種 attack & defense 大賽的經驗,然而初生之犢不畏虎,最後獲得 12 名的成績,比我們預期中的還要好很多!
初賽
我大概從大二升大三的暑假加入實驗室,跟著大家一起打 CTF,大四的時候打的特別瘋狂,去了日本、羅馬尼亞比了 CTF 決賽。 DEFCON 在 CTF 比賽中,可以說是資安競賽界的奧運,我跟 Balsn 的隊長 sces60107 討論之後,他果斷認為如果不處成聯隊,單單靠 Balsn 肯定是無法入圍決賽的,加上我們兩個又快畢業了,希望最少能夠打進一次 Defcon Final。
於是,我們馬上就聯絡了 BambooFox、DoubleSigma,以及後來加入的 KerKerYuan,組成 BFS 聯隊,最後在初賽拿下前 25 名,順利取得前往美國拉斯維加斯比決賽的資格!
這裡還是要感謝教授們、教育部、各大企業,整場比賽的機票住宿以及生活雜支,還有兩個助理,都讓我們能專心在準備比賽本身,不用去顧慮其他行政等等事務。
決賽前的準備
決賽前我們大概有一週的時間可以準備一下比賽的環境,在 sces60107 的指導下,我們很快分成了不同組處理不同工作, packet 組負責研究封包、產生 replay 攻擊的 payload,exploit 組主要負責看題目以及寫 payload,而我隸屬的是 infra 組,負責處理比賽期間環境的網路、VPN、還有 attack script 的自動化流程、監控題目狀況等等。
infra 組加上我只有四個人,兩個人負責寫 web 前後端 (vue.js + flask),我負責寫平行的 script worker (python thread queue),一個負責接記分板以及題目狀況到 kibana 視覺化。此外我還有一項工作就是要架 VPN,讓飯店房間裡面的人打比賽如同親臨現場XD
VPN
本來是要用 OpenVPN 快速解決的,但因為之前一直很想架看看 IPsec VPN, HITCON 也是用 IPsec 當做 VPN,IPsec 又有 RFC 以及 OS 的支援,就來挑戰看看了!我用 strongswan 大概弄了一個禮拜終於弄好,但最恐怖的是不同 OS 的差別超級大,Linux 上跑起來跟 mac / windows 完全就不同情況, mac 還不能噴 vpn log,我只能通靈猜出 bug 在哪裡……. 最後只好放棄去抄 algo-vpn 的 config 檔。
架構是這樣,我們有一個 cloud 架在美國西岸,有 public IP,飯店房間的人「所有」流量都經過這台 cloud 出去,不要忘記 DEFCON 的會場飯店聚集一堆駭客,網路感覺就非常不安全……。而現場我們的主機也會與這台 cloud 連 VPN,然後盡量讓 routing 都在 cloud 以及現場主機做,減少 client 端的 config 負擔。
因此從飯店的電腦連線到比賽現場的題目,免不了就是兩層 NAT,第一層把 IP 換成 cloud 內網 vpn IP,第二層把 cloud 內網 vpn IP 換成現場電腦的 IP 來連到比賽題目。不過這次的題目幾乎不太需要什麼大流量,因此在 30 人的環境下用起來很順暢沒什麼問題,唯一有問題的是比賽網路,文章後面會提到。
比賽當天
D-Day
比賽當天,我們把助理叫來的早餐吃一吃就準備進入會場報到了,一隊最多只能派八個人進去,雖然可以偷渡啦,但最後一天因為要辦閉幕式的關係,需要出示 OOO 硬幣才能進入,會比較麻煩一點。
賽前的規則把我們弄的有點手忙腳亂,一是封包並不會馬上給,而是要等題目快要被很多隊伍解開了才給,這讓 packet 組的戰術有些受到影響,此外這是除了 attack & defense,還有 king of the hill (KoH),要知道 KoH 對於小隊伍是非常不利的,基本上只有強隊可以拿到分數,最後是沒有給 gamebox,上 patch 的方法是用主辦單位架的 git (但第二天主辦單位的 git patch server 就爆炸了XD)
比賽開始,首先網路爆炸,現場提供外網連線,但是超級慢,調包率約 25% ,根本不能用…,我們只好讓主機透過飯店 Wifi 連外,租來的 wifi 機以及 4g 網路更爛,latency 很大而且頻寬極小,掉包嚴重,甚至不太能看 youtube。主辦單位應該也很頭痛,uplink bandwidth 貌似很低,開會的時候主辦單位花了不少時間說他們正在努力修網路。
飯店的 wireless 雖然穩定多了,不過第二天(還是第三天我忘了) 出現大斷線,會場大家網路都掛光光XD 此外最慘的是,將近 30 人的隊伍,沒有一個人有帶 AP, 最後只好把備用的電腦拿來當 AP,也有請某人的 mac book 支援了一陣子。
題外話:房間裡面的 Wifi 要收錢,但 1F 的 guest wireless 可以讓一個 mac address 免費使用 24 hr。有人就發現可以把電腦拿到樓下 1F 註冊,接著上來房間用 wifi 就不用收錢了,Is this a feature or …?
網路穩定之後,因為我個人沒有什麼 pwn / reverse 之類的能力,主要靠打 web 跟 misc / forency 維生,在 Defcon 這種比較傳統一堆 pwn 的題目中,沒什麼發揮空間,所以我們就確保 attack manager 有忠實的把 script 打出去取得 flag,還有現場 de 了不少 attack manager 的 bug,調整了一下 file descriptor 的 limit,剩下就是監控主機這樣,第二天有好一段時間現場只有我一個人,大家都躲去飯店房間了 XD 而且現場主辦會播一些很ㄎ一ㄤ的歌曲,什麼影片有人在尖叫、各種迷幻的影片之類的,非常的吵雜,可能也是因為這樣所以大家躲去房間吧。
Contribution
比賽後期終於有一題 bew 我可以做點貢獻,由於題目某個路徑的檔案是可寫的,雖然沒有攻擊 payload,但稍微逛一下發現,一堆隊伍的這個檔案被寫上了 flag,我馬上就寫一隻 script 來偷這些 flag,並且把自己隊伍的這個檔案一直刪除,做點基礎的防禦。這招剛開始奏效讓我們振奮不已,我也是蠻開心的終於有點 web 類的題目可以打,但打開題目發現果然是 web assembly,包著 web 皮的題目。
這題後來交給另外一個 web 手去分析了,web assembly 裡面有後門會 eval,我則是著手看另外一題,他需要架一個基於XMPP的聊天環境的題目,再用某一隻 binary 跑 bot 起來溝通,最後一天我整場大概都在弄這題,架 server跟測試的 client,設定 anonymous login,雖然最後一天主辦補上了 docker file,不過好像還是沒人解開這題的樣子,據說漏洞在 library裡面。
Postscript
不得不說當初打CTF的時候,也真的很想要像 HITCON 一樣,打入 DEFCON 決賽並拿下前三的好成績,像世界證明自己的實力。這次能有機會抱眾人大腿打 defcon,也算是人生一大成就,不枉費我 GRE 一戰爆炸的成績XD
說到初賽,幸好當初我們初賽有選擇聯隊,而且正如 sces60107 所說的,我們初賽 22 名,只要少了任何一隊/任何一題就無緣決賽。至於決賽,我們很清楚自己的實力並沒有這麼傑出,長官們更是直接表示大家重要的是學習經驗跟交流……賽前我預估如果我們能夠打贏一半的隊伍,那就算是很好的表現了,最後拿下 12 剛好打贏一半的隊伍,還有大家很愛說嘴的:我們贏了三隊韓國隊xD
打完 Defcon fianl 最大的震撼當然是實力的差距,先不論我個人距離 Hitcon 裡的大神們有多遠,看看美國 CMU PPP 強隊以及韓國 DEFKORROOT 的解題速度跟實力,真的是令人敬佩不已。
不知道十年後的自己,有沒有機會,變成十年前的自己所嚮往成為的人呢?