2011 台灣駭客年會 (HIT2011) 心得及 Wargame 解題思路

前兩天前往中研院參加「台灣駭客年會」(HIT2011),一早報到時就能看出今年的聲勢浩大,據說有七百多人報名,也要感謝為數不少的黑衣工作人員們 <( _ _ )>。

今年打定要來賺回報名費,所以從一開始就跑去第二會議廳開戰,幸好今年第一、二會議廳的同步投影品質很不錯,一邊廝殺的過程還可以順便聽聽台上的大牛們演講。

Wargame 第一天的狀況看來是很多高手都尚未露面,所以解了一些簡單的題目之後運氣很好地溜進前三名,當天晚上受邀和主辦單位、講師、貴賓們一起參加遊艇趴。雖然在淡水河上漂流三個多小時還滿累人的,不過整個氣氛就是很高級,而且跟這麼多高人聚在同一條船上的經驗也是非常特別。下場就是結束馬上從北車搭小黃回家,完全沒力氣再碰 Wargame,洗完澡倒頭就睡了 XDD

第二天一早到會場後不久 wargame server 就上線了,連上 score board 一看,果然馬上就被強者們電翻,名次瞬間往下掉掉掉,僅管沒什麼戰鬥力了,還是要開戰拼一下。

下面是今年 wargame 的最後排行:(點開看大圖)

HIT2011 Wargame result

Wargame 題目在噗浪上看到有人 (@rsghost) 備份:  http://rsghost.web.fc2.com/HIT201_wargame/10.0.15.1/ 不知道會存活多久,要備份要快XD

今年的 Wargame 品質真的很高,不論是整個系統或是題目都很棒,尤其好幾題都出得非常有創意,解題之餘實在是令人佩服出題者的高深莫測!今年運氣還算不錯,解了七題,下面就列一下有解出來的題目的思路:

Web 1

標準的 CAPTCHA 破解題。一開始看到雜亂的背景,直覺認為單純 OCR 應該不夠,所以去找了幾年前發佈的專案 PWNtcha 來處理,沒想到出來的結果都包了一堆問號… 後來本來想用 Python + PIL 自己硬幹辨識,不過懸崖勒馬想說用 gocr 試試看好了,結果一試就出來!囧>

既然處理好辨識的部分,剩下的用 curl 就可以解決了。

Web 2

這題也是瞎矇中的 XD 第一天午餐的時候無聊打開 wargame site 想說能不能有靈感,結果看到這題新出現,隨手點進去決定先看看、吃飽飯再解,結果亂玩亂玩就玩出 key 來了!這題感覺是要寫一支猜數字的 client,原題應該也是不難啦。

Misc 1

就… 標準的 wargame 送分題,注意一下要全部大寫,句末還有一個驚嘆號就好了。

Misc 2

時事題!!給了一堆地震資料的 KMZ 檔,解開 zip 後是 Google Earth 用的 KML 格式,有超級多點的。一開始想說既然是預言,就該從日期下手,果不其然找出三處地震的發生時間是在未來,但不知道 key 的格式,用震央地名送了幾次都失敗。後來看地名好像事有蹊蹺,直覺認為應該是要在 Google Earth 上找大頭針拼出來的文字圖樣吧,找了很久之後放棄Orz 結果第二天才公布 key 的格式是一串 md5 hash,這根本猜不到啊 XDD 照要求送 key 就過了。

Misc 6

Flash 送分題。打開後按下按鈕就會在左上角出現一個很小的 text box,放大整個 flash 影片之後 focus 到 text box 裡按全選、複製就可以得到 key 了。

Misc 7

也是時事題!nc 連上去之後發現是前幾天被爆料有後門的 vsftpd 2.3.4,一開始手動送 username「:)」沒有過,想說會不會是主機 firewall 沒設好,後來打開 metasploit 用工具打一下也是沒收穫。結果仔細一看才發現,username 的第一個字元必須要是 valid character,重送一次「USER X:)」然後再 nc 上 tcp/6200 就會噴出 key 了。

Forensics 2

也是很潮的時事題!題目是一個 1 x 203401 pixels 的 PNG 圖片,剛好前陣子不小心看到 Defcon 19 CTF Quals 有類似的題目,把 203401 拿去質因數分解得到 (11^2) x (41^2),直覺認為 11 x 41 = 451 大概是重組後的長寬大小,寫了一支 py script 把圖片切一切重組一下,得到一個 QR code,解碼後就是 key 了。


其它還有一些耳聞解法或是關主有出來面對公布思路的也列一下:

Web 3

題目有給定的路徑是「/GetEvent.asp?s=b.__name」,看不出所以然來,隨便試了幾個 s 的值之後得到 500,沒有頭緒所以一下子就放棄了。後來在 IRC 上看到,其實該頁面存在 SQL injection flaw,用的 SQL 式是 sql = “Select a.__id, ” + s + “, c.__user, d.__pwd, e.__mail from _id as a, _name as b, _user as c, _pwd as d, _mail as e”,也就是 s 可以插的意思… Orz

(20110725 updated) 這題後來關主 Orange 也有釋出解題思路,請看: http://orange-tw.blogspot.com/2011/07/hitcon2011wargame-web-3.html

Web 4

據關主表示是很有創意的技術 && real site 常用到的。一開始看到 WP login form 之後找了一下幾個 WP 弱點,雖然直覺想說不太可能還是試了一下,果真不行。後來發現註冊頁面檢查使用者帳號是否重覆的地方存在 SQL injection 漏洞,但我實在對 SQL inj 沒輒,試了一兩個自動工具也插不出來,也是立刻放棄 XD

後來關主 Orange 有在他的 blog 上釋出解題思路,就直接看吧: http://orange-tw.blogspot.com/2011/07/hitcon2011wargame-web-4.html

Misc 3

壞掉以及被填上顏色的 QR code,去找 spec 修正一下定位點跟 information block 之後解碼就可以得到 key。這題我做的時候一直修錯 info block,導致一直掃不出來,也是殘念啊…

Misc 4

只有 10 分的 flash 題,下意識就拿出拆 swf 的工具把它拆個精光,看一下 resources 沒有發現,後來把 action scripts 都大略看了一下,也是沒甚麼收穫,想說 10 分而已怎麼這麼複雜 XD 沒想到其實我就有看到 key 了… 囧!!

而且這題竟然在 YouTube 上就可以找到 key 了啊啊啊啊啊!# http://www.youtube.com/watch?v=tNCCDRiwj8U

本來想說提示裡的 hidden level 是關主另外加的 Orz

Misc 5

(20110726 updated) 給一個壞掉的 RAR,後來提示說經由 FTP 傳輸,所以下意識想到要把 0a 改成 0d0a,但是全部有 100 多個 0a 啊囧… 列舉全部的話太多了不可能暴力破,所以放棄= =a

後來關主 Outian 有釋出解題用的程式 (in perl): http://outian.net/temp/hit2011_misc5.txt 看來就是要把其中一個 0a 改成 0d0a 即可 Orzzzzz

Forensics 1

生活題,關主事先在 komica 上張貼 HIT2011 的相關文章,要從討論區裡顯示的 ID 去推出發文者的 IP 來,後來 google 到這些 ID 的生成方法,照著寫 scripts 去暴力猜,看提示說 IP 是某大 ISP 發的,直覺猜是 Hinet,所以上 TWNIC 找一下 Hinet 的 IP ranges 之後就開始暴力破。還一度跑掛我的機器… 打電話回去請人重開。

這題最失敗的就是,我的 salt 是直接用那篇文裡面的… Orz 後來才發現 komica 上每個板都有不同的 salt,難怪跑不出來。看來要先去 komica 上 po 一篇文,用自己的 IP 算出該板 salt 之後,再用這個 salt 去破題目給的 ID。

Forensics 3

(20110726 updated) 這題還是不知道怎麼解,不過後來在噗浪上看到 medicalwei 釋出的 gist: https://gist.github.com/1102434。我本來也要這樣幹的,可是想說應該不是這樣解… Orz

Forensics 4

(20110726 updated) 沒解出來,後來看到今年第三名強者 Jeffxx 團隊釋出的文件: http://wargame.cs.nctu.edu.tw/file/hit2011.txt 直接看吧。

Crypto 2

(20110726 updated) 在 IRC 上看到關主 Aphyr 釋出的超詳解: https://plus.google.com/118167027367905384991/posts/ToLQkMRXtiY

Binary 1

題目給的 SlotMachine.exe 執行後會 drop 一個檔案:SlotMachineDrop.exe 而且執行它,會根據亂數彈出 fake key。根據後來的提示,應該是要把某個變數的值改成 7(程式裡是 mod 6),就會執行一段本來跑不到的程式進而噴出 key 來。結果我一直對 SlotMachine.exe 下手… 之後才聽說是要改另外那個 SlotMachineDrop.exe,一樣也是很失敗。

(20110725 updated) 不對… 改 SlotMachine.exe 是對的,我當時找到的點也是對的,只是要改成「6」,不是改成「7」啊!!!!! 因為原本是 mod 6,所以改成 6 才是原本不會出現的第七個數字 Orz 這樣顯得我更笨了

Binary 3

題目是用很經典的「特訓 99」遊戲去改的,我的逆向工程並不強,所以一開始扔進 OD 發現有加殼,用 PEid 掃一下沒結果,認為是奇怪的殼,而我對脫殼沒甚麼研究,所以大概就放棄了。

關主 Orange 一樣有在 blog 釋出解題思路: http://orange-tw.blogspot.com/2011/07/hitcon2011wargame-binary-3.html


這次都沒有解出任何 Crypto 與 Binary 的題目,實在是大失敗啊… :(

在 Linux 下搶奪 IP 地址

最近接手了一台 server,網段跟公用的 DHCP pool 是同一個沒有切開,而該網段的 IP 地址發完了,所以有些使用者就會隨便亂搶別人的 IP 地址來用,一台 server 常常因為 IP 地址被搶走而不能連線實在是天底下數一數二的杯具。

搜尋了一下,發現一個治標不治本的方法:

# arping -A [ip address] -I [interface]

例如你的 IP 地址是 192.168.55.66,而網路介面是 eth0,則執行以下指令(需 root 權限):

# arping -A 192.168.55.66 -I eth0

利用不斷發出的 ARP request 去把 IP 地址要回來…Orz 這個方法還算可行,當然最佳解法是去找網管好好的喬一下。

在 C# 中抓取指定視窗的畫面截圖

早上在寫那個陽春的寶石方塊小幫手時遇到一個問題,就是我要使用 C# 去抓取遊戲的畫面,才能進行分析並給出提示。

在網路上翻了一些討論,發現最簡單的方法是調用 Win32 API 裡的 GetWindowRect 取得目標視窗的位置與大小之後,使用 C# 內建的 Graphics 類別抓取截圖。這個方法寫起來簡單,但有一個缺點就是,目標視窗必須顯示在最上層,不然會被其它視窗蓋到(因為是抓取螢幕畫面)。

程式碼如下:

需要特別注意的是,若目標視窗被最小化之後,則得到的位置與大小都會是負值

「如何準備演講與投影片」簡報上線


點這裡到 Google Docs 觀看投影片

今天應系上資工營教學股之邀,分享了一些關於準備簡報的經驗,也與大家分享。

本簡報採用 CC BY-NC 3.0 授權,若您喜歡的話,歡迎散布 :)

一些增進工作效率的技巧

曾經看過一些關於「時間管理」的文章,試圖改進自己做事情的效率,而不要拖拖拉拉或是浪費掉時間而不自知;我發覺最大、也最常犯的錯誤就是,什麼事都想要找一塊「完整的時間」出來做,然而這種時間是相當稀有的,所以到頭來就會發現什麼工作沒能完成。

下面分享一下目前正在練習的技巧:

  1. 將「完整」的時間拿來做非常重要、需要相當專注的工作,其它相對零碎的時間拿來活用。零碎時間可以做一些即使突然被打斷也不會有什麼損失的事,例如:等車或坐車的時候可以看看文件、洗澡的時候可以想一些新的點子、上課前老師還沒出現的時候翻翻書…。
  2. 總覺得自己很忙嗎?練習記錄下自己一天做了什麼事情。這可以獲得兩種結果:
    a. 發現自己其實是在空忙、浪費不少時間
    b. 讓自己知道,雖然事情很多,但有慢慢解決、是有在向前進的
  3. 睡前躺在床上花點時間,回想今天從早到晚發生的事。除了可以反省行為舉止之外,也可以得到兩種結果:
    a. 如果整天都在打混,就檢討一下原因
    b. 如果真的有完成工作,就藉機鼓勵自己(見下一點)
  4. 完成工作後鼓勵自己。可以為自己安排一個休閒活動,或是去做一件很想做、但卻一直沒能去做的事。不要將這個當作浪費時間,相反地,休息過後工作效率會更佳。
  5. 自己掌握時間,創造空檔而不是無謂的等待。例如兩件約會間隔 15 分鐘,這個空窗期我們通常只會無所事事等待下一個約會;這時不妨將間隔調整成 30 分鐘以上,便可以拿來完成一件簡單的工作,又不影響到原定的行程。
  6. 懂得拒絕。當你覺得別人找你進行一件意義不大、又非常耗時的工作,適度的拒絕可以避免之後焦頭爛額的工作。不過當然也不能總是拒絕別人。

這些小技巧我目前也還在學習,嘗試著想要身體力行每一個細節,大家一起努力吧!

Apache 加上 mod_upload_progress,輕鬆顯示上傳進度

Progress bar

在這些個 Module 還沒有面世之前,經由 Web 要上傳檔案是一件挺麻煩的事,以往大家都選擇使用 Flash uploader,然而有些使用者沒有安裝 Flash player,就沒有辦法上傳檔案了、或是得為這些人額外準備所謂的「傳統上傳」。

Piotr Sarnacki 一開始在 Nginx 用 nginx-upload-progress-module 用得很開心,直到換成 Apache + Passenger (mod_rails) 之後,發現他可愛的上傳進度條不見了,所以就寫了給 Apache 用的 mod_upload_progress

安裝這個 Module 相當簡單,但是您要先備妥一些套件,在 Ubuntu Linux 上可以用下列的指令安裝:

sudo apt-get install build-essential
sudo apt-get install apache2-prefork-dev
sudo apt-get install libapr1-dev libaprutil1-dev

若您使用其它的 Linux 發行版,請尋找相對應的安裝指令即可。

備妥這些套件之後,到 mod_upload_progress 的 Github 頁面下載程式碼,解壓縮後進到資料夾內輸入下列指令:

sudo apxs2 -c -i -a mod_upload_progress.c
  • -c :編譯
  • -i :安裝(將 mod_upload_progress.so 複製到 library 資料夾)
  • -a :啟動(將 LoadModule 參數加入 Apache 設定檔)

之後到您的 Virtual Host 設定檔案裡,加入下列參數:

<Location />
    # 為這個資料夾下的網頁啟用上傳進度顯示
    TrackUploads On
</Location>

<Location /progress>
    # 在這個資料夾回報上傳進度
    ReportUploads On
</Location>

隨後記得重新啟動您的 Apache 伺服器以套用方才變更的設定(以 Ubuntu Linux 為例):

sudo /etc/init.d/apache2 restart

安裝完成之後,來看一下要怎麼使用這個進度顯示的功能。首先要為上傳檔案的 Form 加入一點新東西:

<form id="upload" action="/save?X-Progress-ID=[uuid]">

新加上去的那個參數「X-Progress-ID」是一個以數字構成的 ID,可以用 JavaScript 在頁面載入時自動產生。送出這組 ID 的目的是要讓 Apache 可以辨別目前的上傳,好讓我們稍後可以取得進度資訊。

開始上傳之後,可以送 GET request 到「/progress」(或是您剛才設定的位址)取得上傳進度,只要在 GET request 的 header 加上一個參數「X-Progress-ID」,數值就是剛才產生的那個 ID。

回傳的資料是 JSON 格式,一共會有以下四種可能的結果:

{'state': 'starting'}

表示「尚未開始」或是「未知的狀態」

{'state': 'done'}

這當然是表示「上傳成功」了

{'state': 'error', 'status':}

表示「上傳失敗」,status 的值是 HTTP 錯誤代碼

{'state': 'uploading', 'received': 'size':}

表示「正在上傳」,received 的值是現在傳了多少、size 的值是檔案有多大,兩者都以 Bytes 為單位。

提醒:如果您想搭配 Rails 使用的話,請記得將 csrf-token 放在 form 裡面一起傳出去(或是關掉 CSRF protection),不然會一直得到 HTTP 500 錯誤!

下面是一個搭配 Rails 使用的簡單範例:(寫得好醜…Orz)

延伸閱讀(您可以在後兩篇找到這個 module 的詳細使用方式與範例):

「Git in a Nutshell」簡報上線


點這裡連到 slideshare 觀看 “Git in a Nutshell”

這學期就要開始進行大學專題了,是以小組為單位一起研究、寫作,因此當然少不了一個簡單、易用的版本控制系統,非 Git 莫屬啦!

趁著第二次 meeting、大家都還沒什麼進度的時候,趕緊跟組員們介紹 Git 這個好用的工具,所以上網搜尋了一下給新手的 Git 入門資源,看到 @chihchun 大哥在兩年前發表的「一個小時內搞懂 Git」,裡面提到 Scott Chacon「Getting Git」讓我大開眼界,拜讀了一下之後當作參考,做了上面這份介紹 Git 基本使用方式的簡報,跟大家分享!

高效率的 Linux 遠端桌面:NoMachine NX

僅管 Linux 大部分的功能都可以在 command-line 下實現,偶爾還是會需要遠端圖形介面;以往大家都使用 VNC,然而 VNC 有著(對新手而言)不好安裝設定、以及連線速度慢的缺點,用起來實在不太順手。

有個速度較快而且跨平台的工具:TeamViewer,最近也推出 Linux 版本了;但 TeamViewer 只能控制當前使用者的 session,而且不能讓 server 自動上線,這點就比較困擾。

前陣子 @itsZero 推薦我使用 NoMachine 推出的 NX,試用之下發現速度真快!而且 NX 的 Free版本提供兩位遠端使用者同時上線,遠端的 X session 都是新開的,不會影響到電腦本地端的使用(NX 4 可以選擇是否要接上之前已開啟的 session)。正巧今天同學詢問有沒有比 VNC 更好的解決方案,就趁這個機會分享一下這套工具。

首先您的 Linux 機器必須裝有圖形介面(很顯然地…)以及 OpenSSH server(因為 NX 的連線是透過 SSH 服務)。之後連到 NX 的官網,下載相對應的 NX Server for Linux 包裝:

  • Debian 系的 Linux (Debian、Ubuntu…) 下載 DEB 包裝
  • RedHat 系的 Linux (RHEL、CentOS、Fedora…) 下載 RPM 包裝
  • 其它 Linux 發行版可以選擇下載 TAR 包裝

目前官網上提供下載的版本有 NX 3.4.0 與 NX 4 Preview 2,筆者上次安裝 NX Client 3.4.0 for Mac,發現需要額外安裝與 PPC 相容的 Rosseta 套件,因此這次便選擇較新的 NX 4。

下載完對應的安裝套件之後,按照下載頁面上所提供的指示安裝(必須擁有管理員權限):

  • 安裝 DEB 包裝,請執行 `sudo dpkg -i nxserver_vdw_4.0.104-3_i686.deb`
  • 安裝 RPM 包裝,請執行 `sudo rpm -i nxserver-vdw-4.0.104-3.i686.rpm`
  • 若是 TAR 包裝,將 tar 壓縮檔搬到 /usr 並解壓縮之後,執行 `sudo /usr/NX/scripts/setup/nxserver —install` 即可

到目前為止,您已完成 server 端的安裝設定,接下來只要到官網上下載 NX Player 就可以準備連線到 server 端了!打開 NX Player 之後輸入 server 的 IP 位址,它會要求輸入帳號密碼,NX 的登入驗證是整合 Linux 的使用者,所以直接使用已有的帳號即可,不需為 NX 特別設定額外的使用者。

    人嘛…每過一陣子就會有 blogging 的欲望;總之我又回來了,希望這次的三分鐘熱度可以持續久一點 :P

    人嘛…每過一陣子就會有 blogging 的欲望;
    總之我又回來了,希望這次的三分鐘熱度可以持續久一點 :P