Jeffxx Blog

隨手筆記.

Defcon 22 Final HITCON 參賽心得 (上)

寫作能力不佳,平常只寫技術文章,不是很敢寫心情抒發之類的東西 但這次太不一樣了,決定嘗試一下.

感謝超罩的隊友們 : Orange Sean Jery Peter Shik atdog dm4 lucas ddaa

感謝 Alan, TT , GD , Kenny, Turkey 四處奔走 在拉斯維加斯幫我們打理食衣住行

感謝趨勢贊助旅費讓我們可以成行.

比賽時忘記拍照, 感謝 Orange 友情提供照片.


在心得開始前先說明一下什麼是 Attack & Defense.

主辦單位會為所有參加的隊伍準備需要守護的伺服器 – gamebox , 這檯伺服器上提供數種服務,會有網頁, 遊戲或其他特殊用途的Server 等等. 每個服務都有數個漏洞,漏洞可能只是簡單的資訊泄露, 阻斷服務; 也可能是一個嚴重的漏洞讓客戶端可以在伺服器上執行任意指令.

參賽的隊伍需要做的事情就是守護好自己的伺服器,打爆別人的. 守護好自己的伺服器,正常提供服務. 若服務沒有正常運作,每一回合(5分鐘) -19分,扣的分數平均分配給服務正常的隊伍. 而正常運作的服務因為有漏洞的關係,很可能被其他隊伍利用來偷取伺服器上的檔案 – token. 只要被搶走token, 該回合扣19分, 搶走token的隊伍平分.

每種服務獨立計算,所以如果同時四個服務都被打穿,一回合會掉76分… 去年很多隊伍打到第二天分數被搶光光,好不容易搶到一些分數卻又馬上被搶走,第二天下午就棄權了


一開賽,我們就照前一天的演練迅速將防禦程式放到Gamebox上, 誰知第一回合馬上被主辦單位判定服務不正常, 與其他五隊一起被扣了19分. 開局就失分, 士氣大受打擊, 在沒有經驗的情況下, 連續掉了四回合的分數才止住失分,

開賽20分鐘, HITCON墊底 ,還放棄了數道217準備許久的防線.

保持墊底一段時間後,總算在第一支服務(Eliza)的程式分析有了進展

找到兩個漏洞 information leak 與 stack overflow, 先透過 information leak 的漏洞leak出函式的位置. 因為伺服器啟動了ASLR, 每次執行程式的函式位置都不一樣

再來就可以利用stack overflow的漏洞控制程式執行流程. 在這邊我們犯了一個錯誤,看到有ASLR,就以為也有DEP的保護, 就花了很多時間在建構ROP, 想繞過DEP的保護. DEP: Data Execution Prevention, 禁止在data段執行指令

先弄第一段ROP,取得函式庫的記憶體位置,再建第二段ROP跳轉到C libary 的system執行指令. 但在Sean成功寫出exploit之前,已有其他隊伍率先寫出並開始攻擊所有隊伍, 發現token泄露之後 Jery在兩回合內將我們找出的弱點補上.

而我在分析流量時,一直無法從payload裡面找到ROP, 放棄找ROP之後才發現一個讓我吐血的事情, Eliza 用qemu-i386跑起來時不知道為何沒有DEP,直接只蓋EIP 2byte 跳一個ROP gadge去執行stack上的shellcode就可以執行任意指令了 . 同時也發現不到半小時已有部分隊伍根據第一隊的思路寫出exploit. 其他隊伍也有可能是replay封包 賭那1/16 ASLR分配到相同位置的機率

但直到Sean寫出ROP版本的exploit,開始攻擊其他隊伍的時候,還是有近半數的隊伍沒有修補好漏洞,瞬間搶到很多token. Peter和Shik將攻擊自動化之後,Orange還加進了後門程式,就算對方已修補漏洞,只要沒有被發現後門, 我們還是能取得對方的token,靠這招打一次偷好幾次XD

第二個服務是一個web server, 我們一直沒有投入人力下去看, 不過我們在分析封包時有找到其他隊伍的攻擊payload,透過重放攻擊也有取得部分隊伍的token.

過了平靜的幾個小時,突然間發現修補好漏洞的Eliza開始掉分,原以為是patch失效, 抓出攻擊流量一看差點暈倒, 有隊伍找到了一個很難觸發的弱點,寫出了成功率很高的攻擊程式.

Eliza是一個類似大航海的宇宙經營遊戲,遊戲一開始會有一萬元跟一萬單位油, 每個星球賣跟買的東西與價錢都不一樣,要引發這個漏洞的前提是要賺進大量的金錢, 買不同物品買到超過程式分配的大小,也會造成Stack overflow, 新買的物品數量會蓋到其中一個函式的指標,靠著物品數量控制程式執行流程, 這個漏洞花了兩位ACM World final一個下午加晚上的時間寫出賺錢程式觸發漏洞.

第一天結束時我們隊伍排在第五,猜測是因為前面服務沒有正常運作被扣了太多分. 草草吃了晚餐,開始討論第二天戰術及晚上工作 # 忘記當天吃什麼了, 比賽只要一開始大家都會忘記吃東西 Shik打開麵包咬著開始寫code寫到過了20分鐘都沒發現

第二天一早進去,驚喜地發現我們排在第二名,與第一名的差距也縮短到一千分以內 原來是主辦單位算分程式有bug, 扣一次分會變扣兩次分, 連夜修正回來

比賽開始後就按照吃早餐時討論的工作分配, 第二天的是沒有計分板的,內網的計分板只有名次 大螢幕上一個戰場圖顯示目前各隊互相攻擊的狀況, 我們坐在邊邊就得輪流去看伺服器有沒有被攻擊成功,上的防禦如何上 上的防禦有沒有效, 看到一半赫然發現我們變成第一名了!!!!!!!!!!!!!

大家都傻住了,莫名其妙就爬到第一名,第一天晚上還在想不能被剃光頭.. 整個落差有點大

先寫到這邊,留在最開心的時候…


補充:

  • 很多細節和時間順序已經想不起來了,是憑印象亂湊的XD

  • 八個人同時要做: “監控伺服器狀態,檢查流量,分析程式,發動攻擊,啟動防禦,漏洞修補,重放其他隊的攻擊”. 工作很多很雜,團隊能不能好好的分工很重要,幸好我們平時有一起CTF練默契.否則會死得很慘

  • 雖然三天加起來可以互相打的時間大概是24小時, 但現場這24小時壓力非常大,發現分數掉要等十五分鐘才拿的到封包流量來分析, 拿到之後要分析攻擊,找漏洞,修補,同時token還是一直往外噴, 每晚五分鐘就多噴19分,都是拼了命想辦法在第一時間搞定. 在這樣的壓力下體力消耗得很快, 到晚上八點賽程結束後還要離線分析.想辦法做出攻擊payload,結果第一天寫到一半就躺成這樣了….