CTF奪旗賽是計算機安全競賽的一種形式。國內這一領域當前的規模最大的賽事BCTF“百度杯”全國網絡安全技術對抗賽決賽剛剛落下帷幕。作爲工作組的一名成員,想分享下自己的參與經歷。
網站開發
- 2013年9月,諸葛建偉老師組織了我們進行討論。
- 學習了怎麼把PSD轉化爲HTML和CSS,花了一天根據提供的PSD網站設計寫了初始版本前端。
- kelwin和zTrix覺得太醜提供了新設計。
- 花了一天主體框架換成了現在的樣子。
- 之前學過一些Rails,爲迎接新的挑戰繼續學了一些,瞭解用戶註冊和郵件發送等實現方式。
- 郵件系統採用
Postfix,騰訊企業郵箱使用中發現了好些問題。比如不含From:或To:首部時smtp.exmail.qq.com會返回250 Ok: queued as但實際上丟棄了信件且沒有退信。 教育網和電信某線路表現不一致,有部分禁止了AUTH LOGIN。 - 12日10日網站上線。
- 12月11日南京的新聞發佈會宣佈大賽正式啓動。
- 12月13日網站接受用戶註冊。
- 2月下旬諸葛建偉老師開始在各校進行巡講。
初賽
3月5日到7日,清華大學的七名工作組成員與中國海洋大學和浙江大學的各一名成員陸續來到位於南京紫金(江寧)科技創業特別社區的承辦單位南京賽寧信息技術有限公司。我們入住的賓館離公司有十幾分鐘車程。公司佔地面積很大,聯繫人給我們安排了一個很大的工作場所。
爲了吸引用戶參加我們設置了“大賽寶貝”的評選,優勝者將擔任形象禮儀,併爲各自的加油助威,統計隊員飲食需求並分發,以及拍照攝影宣傳,在團隊活動時擔任領隊等。7日我開發了大賽寶貝展示、投票和解題版等頁面,到報名結束時總計有42人報名。
8日到了近2:00我才把各項功能的bug都基本修復。之後大家回賓館休息,大概6:00我們又來到工作場所。8:00就要開賽了,這兩個小時我又添加了場景描述、最後正確提交時間等一系列功能。
初來乍到這道題是選手在新浪微博上關注BCTF後由工作組手動回粉從而推送flag的。關注操作點多了之後觸發了微博的保護機制,每次關注都要輸入驗證碼,工作組成員真的好辛苦……
開賽一段時間後我們發現有作弊情況發生。我們根據戰隊連續兩次正確提交的間隔,和其他戰隊正確提交的間隔,正常解題留下的日誌痕跡等多種手段進行作弊行爲的偵查。因爲大賽寶貝優勝者將獲得比較豐厚的獎金,我們注意到還有很多人在網上散佈答案,讓其他隊伍解出題獲得投票權爲他們指定的女生投票。另外還有不少同學校或是認識的人之間互相交流答案的情況。成都信息工程學院有較多大賽寶貝候選人報名,我們發現有很多投票的人存在作弊現象。我趕忙開發了封禁功能。之前我們的規則裏提到了“禁止隊伍之間分享任何解題思路及flag,違規者一律取消參賽資格”,我們也確實絕不姑息作弊現象,一經發現即取消參賽資格,並取消所有投票。
我們使用了很多大顯示屏監控平臺運行狀態並顯示各種統計信息,以及微博、郵箱和QQ、IRC等聊天工具裏選手提出的問題。

21:00左右一部分工作組成員先回賓館休息,休息到9日3:00多回來監控平臺運營;另一部分成員則堅持到3:00多再回去休息, 11:00回到工作場所。這一天我又做了一些開發,修正了網站的一些細節問題。 14:00開始競爭變得非常激烈,前十幾名的戰隊都在爭奪前八名, 相對名次變化非常大。 到了下半夜一些成員實在疲憊不堪回賓館睡覺了。
10日8:00比賽結束,我們知道這一時期很可能產生作弊行爲,大家仍然忙碌着維護平臺,不敢掉以輕心。
6:00多在審計了他們訪問服務的日誌後,我們發現“無
名”的提交可疑,向對方打電話詢問解法。
7:40多flying發現某支戰隊於7:36的一個提交解出了某道題,
但之前有兩次錯誤的提交,較早的那個提交是正確提交的一個前綴,較晚的提交則和正確提交相差一個字符。而這類逆向技術的解答通常是複製粘貼的,剛好錯一個字符的可能性非常小。我們爲此覺得非常可疑,向該戰隊的聯繫人打電話質詢題目的解法,對方無法描述清解法細節。這基本證明對方作弊了。對方表示和以前畢業的學長那裏進行的討論。比賽結束了,在交流中對方終於承認的確是提交了別的隊伍解題得到的答案。
初賽比賽統計和運營體會
註冊並驗證的用戶共有2547名,其中戰隊236支,在比賽期間登錄網站參與的有至少1576人。除去被封禁的,得分的個人有218個,戰隊190個,確實是國內規模最大的賽事。除了大陸的對網絡安全有興趣的人士,還有香港的戰隊VXRL和臺灣的戰隊217參與,還有美國的戰隊UCSB的PartOfShellphish。另一支臺灣的戰隊Chroot和世界排名第二的美國CMU的PPP也註冊了但未解題。
根據參賽戰隊提供的數據,從中篩選出格式符合規範的,整理得到大陸各省份的參賽人數:
| 北京 | 287 |
| 江蘇 | 196 |
| 廣東 | 184 |
| 四川 | 165 |
| 上海 | 103 |
| 河南 | 74 |
| 浙江 | 57 |
| 黑龍江 | 55 |
| 山東 | 54 |
| 重慶 | 52 |
| 陝西 | 52 |
| 福建 | 47 |
| 湖南 | 33 |
| 湖北 | 30 |
| 遼寧 | 12 |
| 天津 | 10 |
| 安徽 | 9 |
| 山西 | 7 |
| 吉林 | 4 |
| 新疆 | 4 |
| 甘肅 | 4 |
| 內蒙古 | 3 |
| 寧夏 | 1 |
| 海南 | 1 |
| 青海 | 1 |
在提供學校或公司信息的戰隊裏,成都信息工程學院和西安電子科技大學參賽人數最多,都有13支隊伍,緊隨其後的的是浙江大學(8支)、東南大學(7支)、電子科技大學(6支)、南陽理工學院(6支),另外還有19支公司戰隊。
比賽臨結束時調研怎麼用R的ggplot2繪圖。前二十名戰隊的分數走勢如下圖:

賽後工作組在微博上發放了一個問卷讓參賽選手填寫,詢問瞭解BCTF比賽的渠道、對題目的看法、對決賽的期待等。多數是在CTF交流羣或者微博瞭解到比賽,個別是參加西安電子科技大學和杭州電子科技大學的比賽時瞭解的,也有從看雪論壇或是學長、朋友那裏瞭解的。參加比賽的原因主要是興趣,想藉此學習網絡安全的知識,所有人都表示難度偏高。沒有入圍決賽的隊伍也表示希望有直播,能感受一下決賽的氛圍。一些戰隊認爲應該再多增設Web安全題目,也有認爲需要增加社會工程學題目的。
大家希望賽後能發佈題解,以及像Google Code Jam等算法競賽那樣多設置幾輪,所有人都表示會參加明年的比賽。
大家希望多出Web題目也和國內安全界重Web有關。國內研究安全的人大多着眼於Web安全,逆向技術和軟件漏洞利用方面比較薄弱,和國外強隊相比有非常明顯的差距。很多人認爲題目出得較難,而事實上我們工作組已經考慮到國內戰隊接觸較少,也受限於我們自身的水平,題目是出得比較容易的,相信放到國際比賽中很多強隊可以在極短的時間裏做出來。比較欣慰的是有選手錶示“辦的很好阿,特別是抓作弊算是國內最好的了“,這讓我們感受到汗水沒有白費。
CTF界有一個衡量各戰隊實力的較爲權威的網站http://ctftime.org。它對國際的各項賽事設置了權重,根據http://ctftime.org/前150支戰隊中對有唯一國家或地區歸屬的戰隊的統計,俄羅斯最多,有26支,其次是美國19支、韓國9支、日本9支、法國9支、德國5支、荷蘭5支,亞洲國家中伊朗、越南、印度也都有3支戰隊,而中國大陸只有2支戰隊。
決賽
決賽分爲兩天,5月2日和3日。我因爲4月20日去廣州參加了ASC14超算比賽,一直到27日纔回北京,29日來到南京,決賽做的事比較少,基本就做些零碎的打雜活。4月30日使用Highcharts.js寫了一個顯示分數趨勢的網頁http://bctf.cn/final/trend/。學習Redis的SLAVEOF。5月1日學習Sinatra寫了顯示異常流量的Web服務。之後研究怎麼用ssh執行後臺命令。有幾個麻煩點:
ruby是rvm提供的,ssh服務端的bash是以非交互式模式運行的,且標準輸入輸出是管道,不會source.bashrc、.bash_profile等文件。直接用ssh localhost ruby -v會找不到ruby- 需要檢測到
ruby進程不存在再執行命令,以防多次執行
可能使用supervisor之類服務管理器更爲合適,但因爲某些考慮沒有使用,直接用pgrep判斷。
1 | bash -lc "pgrep -fa \"[t]rend.rb\" || cd trend && nohup ruby \"t\"rend.rb build/data.json" &> /dev/null |
5月1日晚在“世紀緣”有個歡迎晚宴,部分工作組成員在互動遊戲前提前離開來到比賽場地爲繼續開發平臺和題目。
然後要把VuryLeo的/battlefield/、/pwningwall/等移到網站上,以及Redis的同步等。
實現方法是tcpdump -l後用awk把端口號映射爲服務名,並產生Apache風格的log管道給logstalgia。
5月3日學習了server-sent
events,把socket.io改寫爲EventSource。學習了Sammy.js,用到了http://10.10.10.10/trend/上,提供了Day
1和Day 2兩個圖片。比賽結束前一小時封榜,做了少量管理操作。 
“HITCON 217”第一天下午分數扶搖直上,比賽結束分數幾乎是第二名三倍了。“HITCON 217”戰隊的成員,感覺上,比大陸好多選手知識全面一些,打了很多比賽,職業選手也確實帶來了很多優勢。
逸事
比賽過程中有選手把網線接到其他隊伍的路由器上物理滲透。
有選手重蹈覆轍,Mac OS
X加上Python的system被;rm -rf /命令注入了。如果是Linux較新版本的coreutils就不會發生了。
“HITCON 217”領隊對平臺展示部分大爲讚賞,主要都是[VuryLeo]的功勞,自己畢竟也貢獻綿薄之力,心裏美滋滋的。
決賽統計
pwn成功服務的次數等統計數據都在https://gist.github.com/MaskRay/c80215c5c3126482633d裏,jq果真是神器,以前就當pretty
printer用的,太屈才了。
整場兩戰隊排名改變只發生了25次。Day 1下午“HITCON 217”超過“Light4Freedom”成爲第一後就再沒被其他隊伍超過了,和第二名的差距也越來越大。
賽制
賽制很大程度上模仿了DEF CON 21 CTF決賽。零和遊戲是很殘酷的,好在工作組的NPC可以給大家送分數,也起到了發送提示流量的作用。
1 | # cat states | jq -r '.pwns[] | .pwner as $p | .victim | "\($p)"' | sort | uniq -c | sort -n | grep -v NPC |
對於各服務,唯一掌握漏洞的隊伍有極大的優勢。當瞭解的隊伍多了之後,防禦明顯就比攻擊重要多了。上表是各戰隊pwn成功的次數,“無名”攻擊次數很多,但攻擊得到的分數要和其他攻擊隊伍平分,而防禦沒做好一下子就丟10分。
攻防比賽的平臺形式,感覺還有很多要改進的地方。因爲懶惰和事情太多,沒有投入足夠的時間,對自己的表現不太滿意。
5月4日
0:00和VuryLeo做CodeJam 1B,感覺寫算法題的能力日益下降或是夜裏狀態很差,900多名勉強過了。
這一天的安排是湖畔論道,段海新老師的展示不錯,可惜聽不大懂。下午有馬傑和BCTF工作組同伴的展示傍晚的座談會還不錯。
晚上參觀夫子廟,夜遊秦淮。 
5月5日
工作組成員各自啓程踏上歸途。