2014年2月10日 星期一

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} 


沒有留言:

張貼留言