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


沒有留言:

張貼留言