2016 金盾獎 決賽

2 minute read

本篇是為了履行通過「金盾獎初賽心得」ㄧ文的承諾,所以來寫一下金盾 CTF 決賽心得。首先介紹一下比賽的一些規則,並抱怨主辦單位食古不化的規定,文中亦會提到這次的題目方向跟解題思路,但並沒有很完整,還請見諒。最後總結這次比賽的結果和收穫。

競賽環境與規則

  1. 競賽時提供 6 台電腦,全部都是 Windows 7

    • 2 台查資料電腦:可對外連線,但無法看題目跟傳 flag,不可安裝東西
    • 3 台解題電腦:可以看題目跟安裝工具,但無法對外連線跟傳 flag
    • 1 台金鑰電腦:可以傳 flag,只能傳 flag 不能做其他操作
  2. 需自備存取設備,例如隨身碟或行動硬碟

  3. 嚴禁使用行動裝置、無線 AP 分享器、通訊軟體

  4. 可攜帶自己筆電,但不得連線網際網路,查獲即取消參賽資格

  5. 總共 13 題,每題 100 或 200 分,該題目只要有一組答對,就扣減題目 10% 的分數,至多扣減到 50 %

    (如果第一個答題的拿 100 分,第六個之後答題的人就只能拿 50 分)

  6. 比賽時間共五個小時

對規則的抱怨

  • 要上網下載工具,需要用第一台電腦下載到隨身碟裡面,再傳到解題電腦,超級麻煩
  • 有一題要對外連線才看得到,有一題目出了 4 GB 左右的封包題
  • 解題電腦預先安裝好 vmware 虛擬機,但是卻是壞的,主辦真的有夠雷
  • 自己攜帶的筆電竟然限制不能上網,有夠白爛,主辦單位有怕攻擊怕到這種程度?
  • flag 字串沒有任何固定格式
  • 每上傳一次 flag 就要重新登入,帳號密碼預設都是亂碼,不能改
  • 上傳 flag 的 server 因為 https 壞掉,竟然要用 http 傳,當天我真的很想用 ARP spoofing 攔截看看
  • 其中兩題因為開放時間不一致,只要答對就是拿該題 100% 的分數,不做任何扣減
  • 記分板在休息區,需要離開比賽場地才能看,而且只有隊伍分數排名,沒有該題目的解題統計
  • 我覺得扣減分數扣太多了,最多會差到 50%,根本就是比運氣看誰先挑到簡單的題目解
  • 比賽比到後期,提示的數量超多,因為有些題目太麻煩/通靈了所以沒什麼人解

據說主辦單位因為很怕被攻擊,所以才做了很多莫名其妙的限制。

我真的不懂他們腦袋在想什麼,防止被攻擊的正確作法,絕對不是限制參賽選手的能力,而是應該主動增加題目 server 安全性好嗎!

題目

Goole Drive 部份題目下載 (tar.gz)

RSA + Ceasar Cipher

題目很阿沙力,直接給了才三位數左右的 cipher text、 private key、N,還有一個加密的壓縮檔。直接計算 cipher text 的 private key 次方解出明文,解開壓縮檔得到一個文字文件。

接著文件要求用 Caesar cipher 解密一串文字,暴力嘗試即得 flag,這是本次競賽最水題目。

WEP

這前幾年的金盾獎好像也有出過類似的…..

題目給了兩個 pcap 封包檔,一個是 WEP 握手、輸入密碼的封包,另外一邊是加密後的資料。

先利用 airctack-ng 解出 WEP 密碼,再去分析另一個檔案的封包,最後好像還要解一些編碼、steganography。

Web shell

Web 題,註冊帳號後可以上傳大頭貼,但沒有對上傳檔案做檢查,所以可以直接上傳 web shell

接著題目敘述寫到需要拿到 root ,再去 /root/ (root 的家目錄) 拿 flag,但這題 web shell 的預設使用者並不是 root ,所以需要提昇權限。

uname -all 看到 server 是 Ubuntu 14,所以我就拿 CVE-2016-5195 Dirty COW 來 get root,無奈我一跑下去 server 就 crash 了,好幾次都這樣……

官方在比賽中給了一大堆提示:

  • 上傳 php shell
  • 用 nc 反連 shell 回來
  • 利用 CVE-2015-1328 overlayfs 拿到 root

我試了 nc 連,但 server 不理我(也有可能被 windows 雷,不能用自己電腦實在太慘了),也試了題目給的 CVE 都沒有成功,也試了 DirtyCOW,貌似成功但 server 之後就 crash 連不到, 只好放棄解這題。

主辦單位沒有隔開選手環境,我看到了一大堆別人的新潮 web shell ,還用 Dirty COW 玩壞題目 server XD 這應該是整場比賽最大收穫之一!

Windows Binary: Pokemon

給了一個壓縮檔,密碼也附上了,只要寫 script 解開約 150 層的 zip,就可以得到一個 Windows PE 32 檔案。

這個檔案會先問一個密碼,直接 strings file_name 可以看到一個可疑的 base64 string,它就是密碼!

輸入密碼後程式會給你一個 memory address,想辦法在執行的時候 jmp 過去執行,就可以拿到一張 png,裡面是 flag

SQL Injection

貌似是 SQL injection,這題是隊友小胖解的,所以我不知道詳細。

聽說打 123/123 就拿到 flag 了?

Binary: Logoshot System

Linux binary 題,我們不擅長 binary 所以沒有嘗試

Binary: Fuzz

又是 binary 題的樣子,隊友 laurice 拼了很久,但我一樣不知道詳細過程。

Ransomware

給一堆勒索軟體加密後的檔案,還有加密程式。首先逆向分析加密程式發現是 DES,裡面寫死了 key 跟 IV,直接把那些加密檔案還原就好。

ASP.NET

Web 題,好像是利用它頁面的 LFI,去讀 ASP.NET 的 config,拿 flag

Encrypted SMTP

給了封包檔案,前面先用 FTP 明文傳送 key.pem 檔案,後面走 TLS 加密後的 SMTP 協定。

先抽出 key.pem,用 wireshark 的功能解開加密的 SMTP,再根據提示用 Snow, openstego 還原檔案即可得 flag

Frequency Analysis

先用頻率分析解出明文,然後我就不知道了….

Stego

先利用提示解出壓縮檔密碼 5566,再根據進一步的提示用 openstego(還是steghide 不確定) 解出真正的圖片,人工解開 Braille (盲文),最後base64 + uudecode 解出 flag

DNS

給了一個 4G 的封包擋,使用者利用 DNS 去查詢(還是新增我忘了)一些奇怪的 domain name,藉此達到存放資料的效果,解出來後好像還有一些東西要拆。

比賽結果

最後由 inndy 率領的台科大奪冠,而我們 lab 的 Balsn 則是亞軍,217 們則分別是第三與第四。我賽後也稍微打聽了一下,最低得獎標準似乎是解出四題。

inndy 那一隊得獎的時候開心的不得了,直呼終於打敗 217 了 XD,反觀 217 的臉都臭的跟什麼一樣,我想他們也很傷心吧 …..

我跟 Laurice 、小胖開賽一小時左右就解了兩題,然後直到比賽結束都是只有兩題的成績………..

無論如何,非常感謝我的隊友