台灣駭客挑戰美國CGC天網機器人專題系列報導(十):CGC平台實驗
作者: 陳仲寬
這部分以整體系統的角度帶大家瞭解CGC的概念,並與實際CGC系統聯繫起來,再以CGC Virtual Competition Evironment的實驗,實際運行一次虛擬的CGC比賽,以體驗比賽的狀況。本文參考CGC Virtual Competition的文章,帶大家進行一次虛擬的CGC競賽。這個競賽中,我們並不會真正運行程式,而是透過模擬比賽的方式,讓大家了解技術層面的東西。
基礎平台設定
首先,Darpa官方提供了一組Vagrant的設定,可以快速幫我們設定好這套系統,並自動裝好系統中的機器。Vagrant是一套自動化開發環境建構的工具,提供自動化虛擬機器的設定及建構功能。安裝Vagrant,可至Vagrant官網下載安裝程式,按照指令即可安裝Vagrant系統。接著,我們可以來建立實驗環境,依照以下指令安裝cgc環境。
mkdir cgc2 wget https://s3.amazonaws.com/cgcdist/boxes/Vagrantfile vagrant up
你會看到以下畫面,代表vagrant正在安裝多台CGC平台機器。
安裝完成後,我們可用以下指令觀察系統狀態。
vagrant status
可以看到vagrant已經架設五台機器,並都做好設定。利用vagrant我們可以向操作虛擬機器一樣操作這些機器,例如:suspend, resume, halt, destroy
從這些訊息中,我們可以看到有多台機器,各機器角色如下:
cb:這台機器使用來放置並運行競賽程式(Challenge Binary)。
ids:這台機器會擋在cb的前面,所有進來的流量,會先經過這台機器,在網路曾進行過濾。而過濾的規則各個隊伍透過ti進行設置。
pov:這台機器負責送出攻擊碼(漏洞驗證碼,pov),而送出後會先經由ids再到cb這台機器,做最後的執行與判斷攻擊是否成功。
crs:這台機器用來模擬CRS系統,其實不在CGC平台中,所以這台機器會透過ti這台機器,來與CGC平台溝通。
vagrant ssh
ti(Team Interface): 這台機器用作於當作CGC系統的介面,各隊伍可以利用這個介面取得或更新更像資訊,像是上傳Patch過後的程式或下載別隊的程式,都要透過這個介面。 我們可以用以下指令,連進這台機器:
vagrant ssh ti
cb介紹及實例
我們現在已經把機器跑起來,下一步則是要安裝比賽用的題目,我們這邊拿CQE的CADET_00003這個題目來練習。可以依照以下指令編譯這道題目。
cd /usr/share/cgc-sample-challenges/examples/CADET_00003 sudo make build generate-polls install
程式執行檔位於 /usr/share/cgc-sample-challenges/examples/CADET_00003/bin。我們直接執行這隻程式結果如下:
我們可以看到Segmentation Fault出現了!!代表讀者已經完成這一題了XD,當然這是為了demo方便,實際上題目不會比這個簡單。所以我們可以去看pov檔案來驗證我們的想法,在pov資料夾中,有一些主辦方已經寫好的攻擊程式(pov)如下。
可以看到他做的事與我們差不多,這個攻擊碼也是送了一堆A來造成程式錯誤,應該是一個經典的buffer overflow漏洞。
replay poller/for-release/GEN_00001.xm
<?xml version=“1.0” standalone=“no” ?> <!DOCTYPE pov SYSTEM “/usr/share/cgc-docs/replay.dtd”> <pov> <cbid>service</cbid> <seed>ec640096e6c1a14ed790ac57e1af6a5735ad9c9094e94bf01c54800625181db12c9bcd2f50f8d76e3477cb0f8cd95975</seed> <replay> <read><delim>\x0a</delim><match><data>\x0a</data></match></read> <read><delim>\x0a</delim><match><data>Welcome to Palindrome Finder\x0a</data></match></read> <read><delim>\x0a</delim><match><data>\x0a</data></match></read> <read><length>37</length><match><data>\x09Please enter a possible palindrome: </data></match></read> <write><data>f8uvu9HY9fJmvWnccovA4hDdc\x0a</data></write> <read><delim>\x0a</delim><match><data>\x09\x09Nope\x2c that\x27s not a palindrome\x0a</data></match></read> <read><delim>\x0a</delim><match><data>\x0a</data></match></read> <read><length>37</length><match><data>\x09Please enter a possible palindrome: </data></match></read> <write><data>XV3MHHvJp\x0a</data></write> <read><delim>\x0a</delim><match><data>\x09\x09Nope\x2c that\x27s not a palindrome\x0a</data></match></read> <read><delim>\x0a</delim><match><data>\x0a</data></match></read> <read><length>37</length><match><data>\x09Please enter a possible palindrome: </data></match></read> <write><data>bGqRQMgK69RzHhT7ssKwotKOoqk8\x0a</data></write> <read><delim>\x0a</delim><match><data>\x09\x09Nope\x2c that\x27s not a palindrome\x0a</data></match></read> </replay> </pov>
接著我們來測試攻擊碼能不能成功,cb-test這個工具可以幫我們完成相當多的測試。
cd /usr/share/cgc-sample-challenges/examples/CADET_00003 cb-test –xml_dir pov –director bin –cb CADET_00003 –should_core
可以看到Type 1 POV 成功。在官方資料中,也有給修補過後的程式,位置在:
/usr/share/cgc-sample-challenges/examples/CADET_00003/bin/CADET_00003_patched
讀者也可以跑一下看看發生什麼事。以下指令則測試binary是否能通過poller test,測試你的修補沒有破壞程式原有功能。
cb-test –cb CADET_00003 –directory bin –xml poller/for-release/GEN_00001.xml
最後一個跟cb相關的要件是ids,我們可以在ids資料夾下面看到ids設定,這個檔案大多是依靠七個自定義行為,及一些regular expression來處理。
虛擬競賽
現在我們也瞭解一個binary的狀況了,最後我們利用官方的虛擬競賽,來體會機器人在比賽中要做的各項功能
。要開啟一場虛擬的比賽,需要以下步驟。
ti-rotate –roundlen 300
ti-server
現在該到我們的重點了,我們可以先到crs這台機器上,這台機器象徵我們的自動攻防機器,所以所有操作都會在這台機器上。那讓我們先到這台機器。
vagrant ssh
進入CRS機器後,可以利用ti-client取得比賽資訊,或上傳下載資料。
在上圖,我們分別利用round, scoreboard, teams指令,查詢當前回合, 各隊分數以及各隊編號。接著,我們介紹如何利用各種操作進行比賽。 其中feedback指令可以幫我們看一下現在binary的狀況,以及各攻擊代碼的效能。
比賽中,我們需要撰寫攻擊程式碼以攻擊其他隊伍,因此我們首先透過ti-client上傳攻擊程式碼。
接著我們同樣去上傳我們的修補程式,避免被其他隊攻擊。
我們也可以利用ti-client的upload_ids去上傳ids rule。 最後consensus指令可以幫我們取得其他隊的程式及IDS rule
說明完這些指令,CGC平台就紹就暫時告段落了。在這篇文章中,我們帶大家安裝CGC的實驗環境,所有比賽或分析,都可以在平台上進行。接著帶大家簡單看一下一隻程式範例CADET_00003。最後,則說明了如何架設虛擬的競賽,了解比賽中的各種操作。希望能讓大家更了解CGC比賽。














