CTF 參加初體驗
承蒙朋友邀請,我人生首度參加資訊安全競賽——政府舉辦的資安金盾獎,本來就預期會很難,但沒想到會這麼難,深深感受到有一個世界等著去探索。
在報名時有個小插曲,本人就讀五專,現在是高一的年紀,然而我的學校在報名網被歸類在大專組,這樣我就無法和其他高中的友人 TNPLR 一同參加。為此我寫信去跟主辦單位反應,主班單位就添加了五專部的選項,實在令人感動,可見主辦單位的誠意。
初賽
設備
初賽的設備我覺得挺神奇的,首先不能帶自己的電腦、儲存裝置,手機不能用,主辦單位提供的是一台 Windows 電腦,並且要「連到虛擬機」作答,然而虛擬機還是 Windows,我不懂為何不用實體機就好了?
作答過程不能連上外網,也就是說沒辦法查資料,我本來就夠弱了,沒辦法搜尋就更弱了。只能用 Windows 電腦也是個很大的障礙,工具很不足,Base64 這種基本工具都沒有… 沒網路又不能用線上工具。我在此建議大會,既然使用了虛擬機,就提供 Linux 這個選項,不然對於長年不使用專有作業系統的人來說實在不友善。
題目
雖然只是初賽,但每題都很難,我們在 Crypto、Web 和 Misc 都稍有斬獲,但最終都沒有解出來,全部輸掉。但很神奇的是,在兩週之後,我們竟然收到了決賽通知書,還是從 98 中剩餘的 15 隊。我們推測之後認為應該是題目有錯,導致當天顯示錯誤,但其實有答對,否則不可能隨便挑 15 隊進入決賽。
無論真相為何,既然進入了決賽,就要好好比。
決賽
決賽場地位於張榮發基金會,決賽比五個小時,國高中組有十題題目,題目分數為 100 三題、200 四題、300 三題。試題範圍跟初賽一樣,但沒有特別標注哪題是哪種類型,以下將根據我的觀察進行分類。
設備
決賽使用個人的電腦,並且可以上外網,這樣真的好很多,不需要用彆扭的 Windows,我也先裝好資安方面的 Linux 虛擬機——Kali,但還沒熟悉其中的工具,所以其實沒有很大的幫助。
雖然可以上外網,但比賽禁止與「外部通訊」,意思是不能和隊員以外的人類溝通,我覺得這個用字要再精確一點,因為瀏覽網頁其實也是一種「與外部通訊」,避免造成選手誤會。
既然是比資安比賽,當然就要破解漏洞,在比賽後我想到了一種安全的通訊方式。假設有兩個隊伍 A 和 B,A 事先在賽前跟 B 約好一個通訊埠和一組帳密,比賽開始後,A 在他的電腦架設一個 SSH Server,並使用事前約定好的埠口,然後 B 就用 nmap 掃描區網所有電腦,掃到事前約定好的埠口就代表該主機是 A 隊,然後就可以用約定好的帳密登入進去了。
這個作法有多種安全性,首先,這個過程完全就是操作終端機,看起來跟平常解 CTF 並無二異。第二,因為使用 SSH,所以通訊過程是加密的,主辦單位也不知道。那有了這個通訊方法後,就可以透過把 flag 留在伺服器中的某個檔案的方式來交換答案。
但有個大漏洞是:主辦單位可以發現兩個不同隊伍的 IP 有通訊的行為,雖然不知道通訊內容為何,但還是有可能會因此被舉發,所以好孩子還是不要嘗試喔!
TNPLR 他的筆電是學校發的,規定上不能自己改系統,而且是 Microsoft Surface Go,為此他另外帶了一直以來當 NAT 使用的 10 年古董筆電,在賽前晚上灌了 Fedora Server,我也灌了一支 Kali Live USB 給他的 Surface Go 使用,事後證實這支 USB 幫了很大的忙。
第四題 Forensics
第四題是封包檢測,由 TNPLR 負責,就是開 WireShark 然後分析題目的封包檔,一開始的封包檔還給錯,到了大概開始半小時後才發布了新的封包檔,TNPLR 拿到新的封包檔後馬上就解開了,這是我們從初賽到現在第一次解開題目。
第五題 Web
這一題是 100 分,應該是比較簡單的題目,線索是伺服器的某一個檔案的路徑(伺服器為 Windows 系統),和一個可以給你註冊帳號並在上面留言的網站,我在帳號上做了 SQL Injection,成功取得了所有的留言內容(還可以即時監控大家的發言),然後就發現題目的線索,有個在比賽當天之前的 post,上面寫著看起來像是帳號密碼的資料。在此之前,我就已經發現這臺 Server 還有 Telnet、FTP 這兩個服務,我用網站註冊的帳號不能進去(廢話),然後 FTP 的 anonymous 也進不去。
我接下來拿取得的帳密去登 Telnet,結果發現帳密是正確的,但該使用者 Allen 並沒有 Telnet 執行權限,因此無法登入。我接下來試 FTP,發現可以登入,但神奇的是,我打 ls 指令都跑不出來,因為這樣卡了好久,TNPLR 的 Fedora 隨便就 ls 出來,我後來改用檔案管理員的 FTP 連線就正常,我懷疑是 FTP 指令的設定問題。
然而進到了 FTP 後,我仍然找不出線索,找到了一個 log 檔案,裡面好像有其他人的登入資料,但是我拿這些帳密去試都行不通,接下來我就卡在這裡了。
然後我突然發現一個很大的漏洞,這個 FTP 是可讀寫的,所以我就把資料複製出來,然後把 FTP 上的檔案全部刪掉,有幾個目錄無法刪除,但最重要的 log 檔被我刪掉了。我還放了一個假的 Gold.txt 用來騙後面的人,這大概是我最有成就感的事了。
後面主辦單位提示,說可以用 webshell 取得 shell,但我完全不知道這東西怎麼用,於是這題就死在這裡了。
第十題 Reverse
第十題的題目是給你一個 Linux 執行檔,要你找出密碼,該程式本身是一個猜密碼的程式,一開始完全沒頭緒,聰明的 TNPLR 就想到將 John 的字典去試,然而也沒有結果。後來開始用 od 分析二進位檔,TNPLR 發現裡面好像有些字串,然後我靈機一動用 grep -a 直接去搜 “Password”,就找到關鍵的一行,那行將第一部份的密碼直接寫出來:Do you know the buffer overflow,然後程式的第一部份就通過,但這個密碼還不是答案。
本來想用第一部份的方式比照辦理,然而卻沒辦法再搜出有意義的字串,估計應該是有將密碼 Hash 過了,黔驢技窮,我們後來注意到,當你打一個很長的密碼進去後,再打 exit 退出時,會印出 ** stack smashing detected **,然而不知道這到底有沒有意義,反正不是答案,TNPLR 還去找了 core dump 的 log,找是找到了,但好像沒啥關聯。
這題卡在這邊就結束了。
第八題 Web
第八題則是一個神奇的「自由言論討論版」,要你去找出元首(主席?)的機密,首先它不是在一般的 80,是在 8080,這個用 nmap 就可以掃出來了。
題外話,這個網站的標語寫:「保障你的言論自由,但不保障你言論後的自由」,是不是在隱射什麼?
網站裡面有一個 <secret_flag> 跟被註解的 <link>,secret_flag 的 href(位址欄位)看起來很可疑,但是連過去沒資料,然後 link 裡面有一個 /upload 連結,連過去發現這個網站還有另一個頁面,可以讓你上傳 zip 檔,伺服器會解壓縮後顯示出來。
TNPLR 做了個假網頁傳過去,有顯示出來但就僅僅如此了,也掃描不到 Telnet、FTP 什麼可以攻擊,唯一的 Port 就只有 8080,大會提示也看不懂。這題就死在這了。
心得
剩下的題目還有 Android、另一個 Web、資料鑑識、加解密演算法、兩個圖片分析,這幾個都是沒什麼頭緒,就不加以贅述了。結果就是解出一題(估計是最簡單的),然後殘念三題,無緣獎金。
這次比賽讓我和 TNPLR 開了眼界,原來自己如此無知,對於很多攻擊手法、分析工具都不了解,我唯一會的大概就只有基礎的 SQL Injection,另外就很陽春的 binary 分析,也許 Linux 操作也能勉強算,但卻不會用 Kali 裡頭的各種工具。
我一直的志向都是「寫程式」,是創造,對資安的技能沒有那麼大的興趣,但我也明瞭,要了解如何攻擊,才會知道怎麼防禦,讓自己的程式不會被攻破。這次透過比賽給予我機會,讓我能合法的去練習「攻擊」,感受到當駭客的樂趣,雖然我沒有解出任何一題,但中間破解出了某些部份,還是很有成就感,尤其是我把 Allen 的 FTP 刪光真的是有夠爽(魔笑)。
雖然這次是解謎型 CTF,但我也因此對伺服器攻防產生了興趣,未來希望能開發一款劇情遊戲,就是以伺服器防禦與資安鑑識為主題,而且還有人物的推理劇情。要能夠開發出這個遊戲,我就必須累積足夠的資安見識與比賽經驗,才能夠去「設計題目」。如果未來真的有譜,再與大家分享。