天天看點

萬字實錄:從DDCTF大賽看目前網絡安全新趨勢 | 硬創公開課總結文+視訊(上篇)

  如果說,滴滴出行(以下簡稱滴滴)是近幾年來讓大家出行發生翻天覆地變化的一家公司,想必你不會反對。

據滴滴給出的官方資料,滴滴全平台上每天超過2000萬訂單。與此而來的是,這麼多乘客的消費資料和個人資訊,滴滴怎麼守護?

萬字實錄:從DDCTF大賽看目前網絡安全新趨勢 | 硬創公開課總結文+視訊(上篇)

快速增長的滴滴意識到了這一點。2016年9月底,矽谷安全教父弓峰敏與網絡安全資深專家蔔峥加盟滴滴,弓峰敏出任滴滴資訊安全戰略副總裁和滴滴研究院副院長,負責制定資訊安全戰略和研發下一代資訊安全技術,蔔峥則擔任滴滴資訊安全副總裁,全面上司資訊安全團隊。今年3月9日,滴滴又宣布在加利福尼亞矽谷成立滴滴美國研究院,重點發展大資料安全和智能駕駛兩大核心領域。

弓峰敏表示:“滴滴平台從乘客到司機到合作夥伴,涉及大量金融付費交易的過程,帶來資訊保護以及類似身份資訊偷盜、欺詐犯罪等有關問題,滴滴需要保護客戶資訊、避免付費和交易過程中的欺詐以及個人賬戶資訊洩露等,而最讓人振奮的是,滴滴不隻是解決出行問題,同時還能解決更大的問題,從國家到全球層面,包括城市發展、交通、環境保護等社會問題,這是極大的挑戰!”

随後,滴滴在 5 月 17 日啟動了首屆滴滴資訊安全闖關賽 (ddctf),5月30日已結束。

先挖網絡安全大佬,再通過大賽尋找優秀的網絡安全人才進行儲備,滴滴走了一條“肉眼可見”重視安全的道路。

但是,别人怎麼分析都是“邊角料”,我們看滴滴自己怎麼說。

6月8日,雷鋒網宅客頻道(微信id : letshome)邀請滴滴公司三位安全研究人員來一場硬創公開課,聊了聊如何看待目前網絡安全新趨勢,以及滴滴接下來怎麼做。

翟津健:斯坦福大學計算機專業

楊軍鋒 : 獲微軟 mitigationbypass bounty

王宇 : 在 black hat usa2014 演講和出任 geekpwn 活動評委

劉潇鋒:滴滴出行資訊安全工程師,多年web安全建設、攻防溯源、安全研究經曆。

萬字實錄:從DDCTF大賽看目前網絡安全新趨勢 | 硬創公開課總結文+視訊(上篇)

[從左到右依次為翟津健、楊軍鋒、王宇、劉潇鋒]

若想獲得此次公開課完整 ppt ,請在雷鋒網網絡安全頻道的微信公衆号“宅客頻道”(微信id:letshome)回複“滴滴公開課”。

楊軍鋒:這次是由我們四個人,包括王宇、翟老師、劉潇鋒和我來給各位觀衆聊聊這次 ctf 比賽以及目前網絡趨勢的情況。我們講解題目的同時會穿插一些我們對現在網絡安全趨勢的看法。

這裡是我們四個人一些簡單的介紹,可能大夥都比較熟悉,翟老師是屬于一路學霸性的,潇鋒是搞web搞得比較好的人,我是裡面最矬,來打平均線的一個人。

這次我們要聊聊為什麼我們要辦 ctf 。我們希望通過辦 ctf 來傳達我們對安全的一些理念,包括我們需要什麼樣的人才,我們期望的這些技能是什麼,我們希望通過 ctf 傳達資訊給同學們。我們這次辦ctf的一個重要目的,就是促進同學們對滴滴安全的了解,知道我們對極客精神的一種追求。

這是我們的願景,最重要的還是要玩得開心,在玩得開心的同時,能夠從中得到一些知識。有什麼補充的嗎?

劉潇鋒:沒有什麼補充的,我覺得ctf活動更是一種交流,還是玩得開心最重要。

楊軍鋒:我們這裡的願景是我們都在這次比賽中玩得開心,同時能從玩比賽裡拿走一些東西,不管是經驗也好,鍛煉也好,知識也好。

在這次比賽裡面,我看到有一些同學可能在某一個方向比較薄弱,看到他花了幾天的時間去學,有時學web,學一些知識,回來解題,我非常高興看到這樣的同學,一邊做題,一邊學習,然後在學和做中,我看到有一位同學,他在最後解題思路裡寫到,這次比賽解決了他很多年沒有系統化學習過的一些知識點,這就是我們聽到最好的回饋,同學們學到東西,我們非常開心。

我們接下來的議程就是會講解一些題目,但是由于我們的時間有限,不會把每一道題所有細節都陳列出來,主要就是講講思路,大概是怎麼做的,應該從什麼方向想。這些解題思路并不是唯一的,除了這些解題思路之外,可能還有其他的一些很好的解題思路,我們無法一一陳列在這裡,可能會有更好的解題思路。我們在這裡講的隻是給出了一個預期的解題方式,不是标準,也不是唯一的。

這次比賽我們一共準備了11道題目,很多同學說為什麼沒有漏洞利用的題目,這個題目由于最初規劃候,我們想要作為線上賽,沒有任何伺服器互動的環節。是以在這種情況下,完全對溢出的利用題目也好,同學們解題、伺服器搭建還是各方面,跟我們最初設想的可能會有點兒不一樣。

我們最初決定的所有的題目都是離線題,不需要同學們連接配接伺服器,但是最後玩出web題目什麼的,還是搭建了線上的環境,這是後來由于出題時一些不得不折中的地方,除了這三道web題,其他都是離線可以解的題目。

第一道題目是mach-o上的一個逆向題,接下來就是一個安卓題,主要是java的、逆向的,比較簡單,這些都是windows題目,這道題目主要就是模拟典型的釣魚攻擊場景,是長着一個word文檔的圖示。這個是panic,就是由教授來出題的,這個崩潰題目,你隻要加載、驅動,然後你mach-o,panic就是會崩潰了。injection就是web題目。

接下來android normal這道題就是翟老師出的。這道是快戰攻擊題,這道題挺有意思的,我相信很多同學如果做到它,印象應該挺深刻的。然後是crackme,是到rc6到aec算法變形題目,很多同學對它很有怨氣,今天它的出題人也來到了現場,不是來到了現場,也來到了線上。接下來的這道題目就是代碼神經題,我見到有好幾位同學被卡在這裡。findkey這道題就是比較純粹的數學題了。最後一道壓軸題是翟老師出的安卓難題。

這個排序我們是根據經驗按照我們想的難度排的,但是确實是也不是很嚴格地按照難度梯隊排列,但是大體上是升序的難度級别變化。

我們在講題目之前,先來講講解這些題目所需要的一些工具,有一些工具可能是我們比較偏愛的,但是你也可以用其他的同類型的工具,都可以,這個沒有一定非得要用哪個工具去完成調試、抓包這些任務。

web版編譯工具的話,剛開始比賽的時候有一些國外的同學過來問我們說他們沒有ida,怎麼辦?其實ida是有一個5.0的免費版本的,隻不過是不支援反編譯長c維代碼,如果版權意識比較好的同學,可以選擇使用免費版本。當然我并不是在這裡倡導我們使用盜版的ida,我出于一個官方的立場,是絕對不能推薦使用盜版的。

這個hopper,我不知道怎麼念前面這個反彙編工具,這個好像隻是說mac的,是以如果有使用者mac電腦的同學,你們可以考慮使用這個反編譯工具,聽說是挺好用的,但是我本人沒有試過。

接下來這個snowman,我不知道有多少同學知道,這個工具是支援生成僞代碼的,可以不依賴于ida直接工作,如果你實在是版權意識比較強,希望享受f5的待遇,snowman可能是不錯的選擇。

接下來這個應該打ctf的同學都應該知道,但是我其實沒怎麼用過它,是以我就沒辦法多介紹。jeb是pk的時候應該用的比較多,後來這個gui的程式,也是一個java的反編譯程式,挺好用的。

調試工具的方面,提供選擇的面也是蠻多的,有od、inmulity,由于前兩個oldydbg inmulity都沒有支援64位windows,這個是支援64位的,而且我看到他們最近的開發進度也非常快,我們也可以關注一下,這個可能是我們最常用的,特别是在我們調系統和各方面必不可少的調試工具。gdb我相信用過windows或者是unis的同學都應該比較熟悉,因為ctf裡面出現比較多的題目應該都是需要gdb去調的,ida本身也有一個調試支援的功能,都是可以用的。

除了前面所有這些調試反編譯工具之外,抓包的這部分工具也比較多,各種各樣的,這裡提供了一些選項給同學們。其他的類似工具我覺得比較有用,而cooker是一個虛拟的分析系統,特别是你把一個apk、ese送出到分析平台裡面去,會給出一部分比較詳細的分析報告,當你有時候在分析的時候是比較有用的,因為你比較直覺地得到一些分析報告。

這個工具套件我相信對windows有接觸甚至沒有接觸的老使用者都應該知道,它是微軟出的一套官方的工具,裡面包含了程序監控以及行為監控、程序管理器一些很強大的工具。

這是後面的一些工具,就是netcat,這個工具就是nc,我們通常所知道端口監聽,連端口的時候經常要用到的。然後salcat就是轉發端口,這個時候就比較有用了。

這個工具比如說在求解一些線性規劃或者是其他很多求解類題目,是比較有用的,你指定了限制條件讓它跑吧,可能就比較容易求解了。

這個是我在這次比賽裡面看到同學們的解題思路才知道有這麼一個神器,我不知道怎麼念,它也是一個有點兒像mitlab的這麼一個元件,可以求解很多像離散對數、離散數學很多東西它都可以做,就是離散數論的一些計算它能做之外,其他的功能也很強大,推薦都去了解了解。

教授這裡有什麼地方要補充嗎?

王宇:我覺得可能每個人都可能有一些用得比較順手的小工具吧,也就差不多是這些吧,可能最多再有一些插件,包括我相信每一個選手都會攢一堆特别好用的腳本,每個人都有一點兒擅長的東西。

楊軍鋒:那教授剛才也提了一些插件什麼的,都挺有幫助的,謝謝教授的建議。

接下來這道題目,第一道入門的題目是mac,為什麼出mac?教授說一說。

王宇:第一道論文題目就是mac的嗎?

楊軍鋒:對,mac64位的。

王宇:就是藍屏的那個?

楊軍鋒:不是,這道是查理的那個。第一道題目因為畢竟是入門題,我們對選手的預期是比較低的,不管你懂不懂逆向,我們都覺得你應該可以做出來這道題目,因為畢竟是入門題目,我還認為是比較簡單的一道題目。是以很多同學剛拿到第一道題目的時候,問我是不是沒錢就做不了題目,不是這樣的,沒錢也能做題目,我們都是沒錢的人,是以不是說沒有錢就做不了這道題目。

另外這道題目其實由于太簡單了,是以靜态分析已經足夠了,不一定要動态地去調試。當然你可以動态調試,如果你有錢,有mac筆記本,可以動态調試,即便沒有mac筆記本,搭建一個虛拟機去調試也是可以的。

這道題目就像剛才的,用ida或者是snowman去反編譯後,就基本上能看到隻有幾個函數,我相信你很容易能找到關鍵點,你就一個一個函數去翻,看到有一個地方有易貨,就是它了。這個函數不在正常的執行流上面,你正常執行可能走不到這裡來,你可能發現幾個函數,一個一個翻之後發現這裡有輸出,這裡有易貨,出于常年打ctf的慣例,應該已經意識到這裡有問題了,那這樣就比較簡單了。

很多同學就覺得在标紅框的這句話裡面會有一點點困惑,不知道這裡是怎麼計算出來的,我在這裡簡單講講。這是一個開始,一個函數位址減去另一個函數位址,這個值其實是固定的,你隻需要找到這個函數的位址之後,人工算算,算一下這個結果是多少,再移位,移完位之後再易貨,這個全局數組的第一個位元組,事實上你就已經拿到了v2。這裡還有一個函數,你會發現你不需要去關心它到底是幹嘛的。

接下來你看到的就是一個典型的解密流程,為什麼你知道它是解密流程?後面有一個fanao allput,已經知道這裡有一個最終的輸出,就是輸出解密結果。

我也看到當時很多送出題目的同學們,把這個全局字元數組的第一個位元組好像是一個a還是v,就把它當成了郵箱位址的一部分發來,一直沒有收到我們的回信,覺得是不是出問題了。其實這裡你要留意這句最後的輸出,你會發現輸出是從第一個,索引是1開始輸出的,這裡有一個位址,這裡是以索引為1的第一個位元組,如果從1開始計數是從第二個位元組開始輸出。

是以這道題目比較簡單。

剛才為什麼我們第一道題目會是一個mac題目,我在這裡補充一點兒,因為我們現在大量的辦公機器都是mac的,包括我們滴滴裡面很多同僚,大部分同僚都是用mac辦公的,mac安全對于我們來說是一個很重要的部分。是以不管是我們内部防護,還是在研究方面,我們都認為mac是一個不可忽視的平台。因為有人用的地方,它就會産生資訊,産生資訊就會有價值,這些有價值的資訊是需要我們保護的,這是我們第一道題出mac的考慮。

楊軍鋒:王宇老師是對于windows、安卓、mac平台都有比較深的研究,屬于非常優秀的專家,不知道他對第一道題目有什麼看法。

王宇:第一道題是一個入門題,我相信可能不需要太多的訓練都能把第一道題處理出來。剛才軍鋒同學說的我覺得是這樣的。

我印象比較深的是2015年,有一個比較大的事件,就是美國的新地平線号探測器,它飛躍了冥王星,花了9年時間,48億公裡,nasa是當時很興奮的一個機構,它在世界網絡上瘋狂地放各種冥王星的照片,甚至每天都是在以照片直播的形式直播近距離看冥王星。

你可以看到nasa看到内部慶祝的照片,他們所有的工程師幾乎99%都是在用mac book的機器。從這些照片去分析,你就可以推測出某些特殊的機構,或者是在某些趨勢,已經是重心開始慢慢地由傳統的pc向mac平台和移動平台轉移。

是以安全這個東西應該是有字首,它的字首應該是計算機安全,是以它應該是依附在計算機産業鍊的鍊條上的,應該是随着計算機熱點的不斷變換在變換的。

我覺得各位同學也不應該把自己局限在某一個很窄的領域上,應該是見多識廣的多面手,我相信這樣更受企業的歡迎。

是以第一道題和我們這次的出題考慮,雖然沒有漏洞相關的題目,但是可能我們盡量讓平台更豐富一些,有移動的、安卓的、mac的、web的、windows的,應該來說有這方面的考慮。

楊軍鋒:好的,那我們就先開始講android easy這道題目吧,由于翟老師不在,我在這裡簡單給大家講講這道題目。android easy這道題目真的就很easy,真的很簡單,非常簡單,以至于我覺得不用花太多的時間跟大家說。因為你直接反編譯之後,看到的就是跟原碼差不多的,完全一樣的這麼一個代碼,我們會看得到在這裡非常簡潔,第一就是易貨兩個數組。

你看到中間有這些,其實這頁ppt是翟老師寫的,後面這些像偏移這些都不用看,你直接把兩個數組給易貨完之後,然後把所有字元列印出來,你發現裡面就包含着key,把這個key交過來,這道題目就ok了。

接下來講這道windows題目,很多同學拿到題目第一個反應就覺得這涉及到windows惡意木馬的題目,确實它長得比較像惡意木馬,長得像word,你輕按兩下它,突然就不見了。是以把一些同學給吓到了,真是不好意思,我們這些題目全部都是比較幹淨的,不會侵害你的計算機,是以不用擔心。

這個題目背景是這樣子的,現在目前的apte以及大衆化這種黑客集團、軟體這些界限在不斷模糊,以前很多時候我們覺得apte會用高端的技術來做攻擊,比如說漏洞,高端的利用去打一個企業,現在你會慢慢發現有一些apte集團開始用一些釣魚的手法,你看起來很低端,但是很管用。因為一個企業裡面有幾萬人,隻要一個人中招就可以了。

是以這些看起來粗糙,但是成本低,收益大的,這些手法,像現在的紅攻擊,你在很多地方慢慢發現,十年前曾經很火爆的紅病毒,現在有重新泛濫的趨勢。那像這些pe檔案值長得像一個文檔的攻擊手法很低級,但是确實到今天為止,還是管用的。

是以這個程式就是一個整個像word文檔,輕按兩下就會打開一個真正的文檔,就把這個删除了,接着是一個payload來運作,完全就是惡意軟體的套路,但是隻是一個比較友好的惡意軟體。這個惡意軟體在ups外面紮了一層混淆,其實不是兩層殼,你可以了解為兩層殼,為什麼要紮入一場混淆呢?因為我怕很多同學直接就用ups解壓檔案,直接就拿到了,根本就不用動手脫殼,不用調試器怎麼去分析。

同時裡面有一個很小的反調試的功能,隻檢查peb的級位,這個位置,如果發現正在被調試的話,就篡改掉預設程序堆,這會導緻堆函數裡面,離真正原始的反調試的點比較遠,這樣同學比較難去定位,這是故意惡心人的。

怎麼去解這道題目呢?脫殼和不脫殼都是可以的,怎麼去避免反調試呢?ollydbg裝od這個插件就具有的反調試功能,如果你不知道怎麼安裝,那我今天直接去吾愛破解上直接拉吾愛破解專版,這個插件也內建了反調試的一些功能,我看很多同學直接用ollydbg,根本就沒有去碰反調試的那一塊代碼。

接下來怎麼辦?你可以脫殼,然後把它弄出來,用ida分析,也可以在關鍵函數,比如說你會用行為監控發現它會寫一個檔案,會打開一個檔案,你在關鍵函數上殺一個斷點,等它斷下來的時候,可以dnp這個程式出來進行,或者是你直接就在調試器裡面調試也是可以搞定的。

這個主要邏輯就是釋放一個文檔,釋放一個docs文檔,并且打開,然後把字元複制到臨時目錄底下,然後建立一個程序,啟動一個新的執行個體,最後删除原始的拷貝。

接下來就是下載下傳payload,就是像圖檔一樣的東西,使用ic4算法去解密到jpg,解密完之後,在這裡執行,然後在裡面還會有一個單位元組易貨解密,最後解密完之後,就把這段削殼,那段其實是面向sbori的削殼,執行之後就彈出一個框,裡面就都會有的那個key。

這裡面有一個坑點,就是在payload前面的四個位元組其實是個時間戳,這個時間戳如果在1800秒之後,目前的時間戳大約這個圖檔要是payload的時間戳1800秒以上,這個payload就不會被執行,你如果去詳細分析的時候,就會發現這裡有一個坑,然後把這個坑跳過去,接下來你的代碼就可以直接執行這段belou,最後拿到key了。很多同學說這個key事實上出題人是做了一個反向混淆,中間插了h,但是其實不是,由于它是一段代碼,是以有一個push,就是h,這是彙編語言的push指令,并不是我故意去混淆的。

下一道題目是教授的panic題目,把時間交給教授。

王宇:随便弄了一道 mac 驅動的panic題目。我覺得任何一個想從事核心開發相關的同學,首先調試環境,還有核心調試工具,包括調試的手段,這些東西都是一個逃不過的話題,無論你去打算做核心開發還是做使用者開發,這個話題或者是這個時間的投入是成長必不可少的階段,是逃不過去的。

我認識的很多同學都是機器上一堆環境,首先是一堆機器,機器上都是一堆環境,就是調試環境,這些都算是簡單的,因為廠商會預設給你做一些支援。但是反過來,如果大家以後想做安卓 root或者是iphone的越獄,你會發現那些環境的調試友好程度是更加不友好的,可能在系統上是不會給你有一個核心級等你的調試器連上來,也不會給你提供符号或者是原代碼。

這些系統可能都算是最強健的系統,如果大家想搞一些更冷門的東西,比如說像車載的系統調試、手機基站通訊的調試,這些東西的調試難度和調試環境的搭建、模拟,包括像一些思科專屬裝置的mix指令和一些專屬裝置的調試,可能會更花時間。

是以我們在這邊簡單地考察了一下,假設一個學生從來沒有接觸過mac,他從零接觸,到把調試環境搭起來大概花多長時間,可能這個時間的花費要在三個小時左右,這是給大家預估的成本。

結合第一張圖,mac系統調試的時候,我們可以看到第一張圖,我弄了一個10.11的系統,lidb是可以把這個系統斷在加載階段,這個時候系統啟動它的,如果我們願意的話,可以把它斷下來,如果核心是自己編譯的話,那就可以做相關的登入。

下一頁是這道題目的本身了,這道題目的解法是真的沒有太多的難度,因為我是告訴大家,隻要加載就一定會crash,隻要crash,記憶體裡面一定會有key的資訊。

是以我們看到的至少玩這個題的解法有三種,另外為了降低難度的話,這道題其實是放出了所有的符号,既然有符号,靜态分析的難度是很低的。很多同學已經在代碼中找到了做易貨的函數,因為key的格式基本上是公開的,前面是一個生成的哈希值,後面是一個@滴滴出行結尾的域名,你直接去找@,還有.com這種關鍵字,其實很容易就能把這個郵箱的key給枚舉出來。是以我看到大部分同學,可能是90%的同學都是用枚舉的方法做的,但是大概也有三位同學用的是大環境去做的。

其實你隻要把環境搭起來,從第二張圖可以看到,直接在滞塵器裡面搜一圈,發現至少是前幾個很可疑,每一個都去記憶體看一眼,就可以找到了。

這是靜态的方法和動态的方法。

另外還有一些同學用的是建立了一個pradonp,然後從中間搜這個特征,這也是一個很好的方法。我相信一個人對這個了解和用的手段不一樣,有靜态簡易的方法,也有動态稍微難一點的方法,雖然動态的方法會至少花三小時的時間,但是這個時間我個人認為是值得的。

再下一頁,我截了一個調試的截圖,一個全黑的頁面,就是lidb,這個圖如果大家熟悉undibge的話,再看這個會覺得很簡陋,非常簡陋。

第一,它連個密令行的輸入視窗都沒有給你,你想在這邊輸密令是不太現實的,這個是lidb在密令行裡輸jy跳出來的預設界面。

第二,這個界面對于byneri級别的調試支援其實是做得非常爛的。比如,我們在最右邊的cosdek的裡面,看到戰争的第0層,連byneri位址都不給你顯示,隻是預設顯示原代碼。

最大的一個問題是它跟nousceoul調試相比的話,windows現在看來真的是越見良性,給你做了大量的工具是免費的。

另外,它還做了上百條内建的building的conmad,你可以輸入簡單的感歎号××004327系統就能直接幫你解析符号,隻要能找到對應的single,能幫你解析符号,能幫你去辨明核心的資料結構,能幫你把核心的資料結構按照相對可讀的格式給你打出來。

實際上這件事情已經幫大家省了非常多的時間,但是可能你會發現在××004349沒有太多人幫你做這件事情,特别是××可以看到蘋果對于mac的核心開發是非常不友好的。

這個是給大家簡單地展示一下調試大概是長什麼樣。

這個調試環境已經非常簡單,如果大家以這個為起點的話,再去看iphone的越獄,你們會發現調試的友好程度可能會再往下一個量級,無論是從符号的支援、加密檔案如何做解密,還有調試密令,包括像友好程度,挺考驗選手們的耐心和實力的。

我的幻燈片前三頁已經講完了,最後一頁其實是做了一個截圖,是想說一下那道題目有一個附加的小問題。panic其實是很簡單的,你隻要一加載,過一小會兒,這一小會兒可能是幾百個毫秒,這個系統就panic,就藍屏重新開機了,但是它的原因是什麼?

如果是他想回答這個問題,想得到這個題的附加分,可能需要的背景知識有:

第一,搭建一個調試環境。

第二,可能需要動态調試一下這個驅動,大概是在做什麼。

第三,如果調試這個驅動去看這個驅動的時限的話,就會發現這是mac平台标準的發system callstack驅動,可能是需要知道一下mac的檔案系統是怎麼做回調這件事情。如果大家熟悉windows驅動開發的話,mini showter driver整個的設計其實是非常講究的,微軟20多年、30年的設計疊代了好多版,現在這個mini foot的設計其實是非常漂亮的一版設計。

比如,以第三方做showter driver的友善程度來講,我說的第三方可能是指防毒軟體廠商,做硬碟加密的廠商,還有做磁盤還原、過濾、影子系統的廠商,這類廠商在做産品架構的時候,微軟已經幫你考慮了很多事情了,很多事情都需要你做,但是反過來,在mac cernol給你callstack的條件是非常簡陋的。你可以看到從2003年到2017年14年間callstack的代碼都沒有怎麼更新過,這件事情在windows cernol其實是不可思議的。

我覺得比較奇葩的一點,你作為一個檔案系統的回調,至少系統應該告訴你這個檔案應該被建立或者是打開,但是真正去看這個mac的檔案系統規律驅動的時候,你會發現mac沒有把檔案建立的事件作為一個回調發給你。我想作為第三方開發的人,一定想要區分出什麼是檔案的建立和什麼是檔案的打開,這是一個很關鍵的問題。怎麼做呢?可能隻有自己寫代碼來做了,既然mac沒有給你提供任何的幫助,那就隻有自己做了。

是以我在第四頁的截圖,左邊的截圖是我自己寫的記憶體的列印,我downp了某一個函數入口的rpp所有callstack的資訊,通過解析這個資訊,我們能找到每一層callstack的戰争和防禦。右邊就是我在驅動裡面內建了一個disdome的引擎,我會通路我想關心的核心函數。

我在這邊列了兩個,每一個都列了前多少個位元組,沒有列太多。

第一,反彙編oskext start這個函數,這個函數是所有驅動加載的函數。

第二,vm open,這個東西是屬于檔案系統的處理函數。

也就是說我如果結合左邊的圖去downp callstack,解析戰争,再結合右邊的圖去反彙編,我能把整個檔案系統的callstack調用站,我所有負函數至少能識别出來。這個時候再去結合負函數裡面找一些特征。

比如說檔案的操作,負函數裡面有一個調用,裡面帶着參數的fnode,如果置不同位的話,表示的含義是不一樣的。比如說2是表示建立,0是表示打開等等。如果我能定位到它,并且我能解析目前檔案實踐fnode的值是多少的話,實際上我就能區分出這個行為到底是一個檔案的打開行為還是建立行為。但是這個過程理論上應該是作業系統幫你做,但是如果作業系統沒有幫你做的話,你就得自己來。是以我其實是在這邊示範了一個怎麼自己來的一個代碼。

再回到這道題目的附加分,為什麼這個系統藍屏了?如果能把這些東西都簡單摸一圈,它的答案應該是在31次檔案操作的時,并且目前的檔案事件是一個qufir操作。

這就是整個出題的考量和題目的細節。它可能會比較花選手的時間,特别是如果選手不熟悉的話,但是實際上真的去花一點兒時間折騰系統調試,我覺得是值得的,并且相對來講是比較練内功的。

我上大學時,有一位老叫張銀奎,他剛開始寫他那本鴻篇巨著《軟體調試》的第一版,那時候我是上大三。當時我是主動跳出去幫他看看,幫他打雜。實際上我真的去審校這本書的時候,我發現裡面有非常多的細節,他那本書更多的是在windows cenol,因為他本人是英特爾的,他可能集中在英特爾cpu。

如果大家再去工作中結合mac等等,實際上内功的修煉還是逃不了的。剛才有同學在直播間裡說一方面可能需要廣度,另一方面深度怎麼做呢?每一個點的積累都是值得花時間的。

劉潇鋒:我們确定出來一共有四列的時候,就可以在腦子裡面構想一下這個 flag 所在的這張表大概是一個什麼樣的結構,用我們現在在界面上看到的這樣一些東西。我們有四個标題,每個标題裡面有内容,标題裡面可以通過id這個參數知道肯定在這個表裡有一個id。flag應該是在第四列,因為總共就隻有四列。是以我們就畫出了像ppt裡面的這樣的一張圖,flag大概是在這個裡面,我們需要在這裡面注入出來。

剛才前面是限制了空格、逗号、引号、斜線,當然這個對于大家常搞四核注入的人來說,這個比較容易繞過的,不允許空格,我們可以用

萬字實錄:從DDCTF大賽看目前網絡安全新趨勢 | 硬創公開課總結文+視訊(上篇)

;不允許逗号,可以用join的形式,我們需要多少字段可以用join構造出這樣一個字段數;如果不允許引号的話,可以采用十六進制編碼。

有了這些手段,基本上可以去實施了,因為在測試時沒有發現關鍵字被過濾,是以可以嘗試一下,先使用聯合查詢注入這樣的方式,接下來的注入方式其實很套路的,就是利用masacal系統表、information sikima這樣一些庫裡面的表的字段。

首先第一個語句,就是把資料庫的名給注出來,我做了一個處理,就是把所有的0a,之前說空格是過濾的,但是我們用0a來做間隔符,但是為了友善大家看ppt,我就把0a又改成了空格,實際上大家測試的時候還要換成0a的。第一個語句就是把資料庫注出來,中間有一個十六進制編碼,解析出來就是information sikima,就是說我們先擷取這個資料庫裡面到底有哪些庫名,把information這個系統庫先給排出去,這個是很常見的思路。我們注出來一個結果,比如說資料庫名是t1。

接下來我們再用table name這個表把表名注出來,這也是很正常的方式,就是news。

接下來再注字段名,是用callum name這個字段來注出來,是secret。

這樣我們就還原出了之前我們這張表格裡的flag所在字段的字段名是secret。

接下來就是很顯然的,我們會去構造,從某一個庫、某一張表提取某一個字段,這樣我們就可以把flag拿出來了,當時這裡有坑,這道題的坑就在這兒,把secret的字段也給過濾了。是以說可能做到這兒會卡一下。其實你去仔細想一下,或者是精心構造一下,就可以繞過這個限制。

這裡面有兩種方法。

第一,盲注。我可以不知道flag具體是什麼,但是我可以用union的方式去構造一個字元串,和flag做一個比較、排序,根據前端頁面的顯示,我們會發現這個差異,這樣的話我們不斷地調整這個字元串,按字典序,我們就逐漸比較,就會把這個flag比較出來。這個可能需要大家用panson或者是php去寫一個腳本,跑得更快一些。

第二,構造一個子查詢。大家看我的ppt,相當于是拼了好幾次,把這個flag的值給拼出來了。這裡提醒一下大家,大家看最後一行為什麼要這麼寫?其實也很顯然,因為不允許逗号,我們不能寫逗号,隻能用這種方式寫,這個時候flag就注出來了。

楊軍鋒:接下來這個題目是android normal,很多同學要求重複講一遍剛才的注入題目的第一頁,你把剛才那一頁再跟同學們講一下。

嘉賓:ok,第一頁其實沒有什麼,就是題目的一個介紹。

因為我們線上題,你肯定要通路一下我們的頁面,我們會看到頁面上顯示了這幾個标題,每個标題是一個超鍊,你點進去以後會看到下面有一個針對這個标題的介紹,就是類似于這個标題文章的内容,最下面是flag,點進去,這個flag本身就是标題,flag is here就是這個文章的内容。但是這個頁面裡面并沒有flag的值。

是以我們找到了這個注入點,就是news,叫php id=4。

接下來我們要測試它有沒有過濾特殊字元,我們測試完了發現單引号、雙引号、斜線、空格都過濾了。

第一頁就是這些内容,接下來我們用all derby去判測出原始的secal語句裡面到底有幾點,查詢出來的内容有幾點。因為union查詢這個大家應該都知道的,子查詢裡面的列數和前面的原始查詢的列數是一樣,才可以在資料庫當中成功執行回報結果。

翟津健:跟android easy一樣,android normal就是用c++寫的,是以思路也是一樣的,看到第18到21行,就是xor的操作,23行開始是一個outside,就相當于java裡的outside,向右移了一位,然後把第一個取出來。24行就是說在不停地找最後一個end,end就是一個0,就從頭到尾把這個key取到,這個是android normal的題。

楊軍鋒:翟老師,你出這道題目,我們也是希望安卓平台、windows平台、mac平台都希望每一個平台都有,使得我們題目的豐富度會更高一點。

下面一個題目是web題目。

劉潇鋒:這個xss題要比cecal room那道題難一些,做出來的人也少一些,大概20個人左右,這道題其實主要是考了一下csp頭,就是html5平時持的那個内容安全政策投。

首先這也是一個線上的題,大家通路了這個題的頁面,會看到有一個message board,就是一個送出資訊的界面,就是聊天吧。

下面有一個verification code,就是說驗證碼還要送出,這個驗證碼大家看一下,挺複雜的,這個驗證碼需要我們填寫,做了一次md5,又做了一次字元try5的截取6位以後,要和那個相等。

這個目的其實也很明顯,因為xss的題大家常參加ctf比賽的同學應該都知道,它一定是背景有一個程式在跑,你送出給他什麼東西,他帶着管理者的cookie去用浏覽器通路,一定是在做這樣的事情。

是以做了這樣一個驗證碼的限制,實際上也是讓大家别頻繁地這麼刷,降低浏覽器開啟、關閉的速度。這個我本地測試過,我mac是i7的處理器,算這個碼,其實有些碼還是要算一段時間的,快的話可能一分鐘之内就會出結果,慢的時候可能兩、三分鐘甚至十分鐘可能才能創出md5這個哈希值。

我們現在回歸正題吧,下面的這個腳本大家可以看一下,這種腳本很容易做了。我們用浏覽器調試功能就可以看到這個頁面在傳回的時候有一個csp頭,這個csp頭設定的default-src是self,script-src也是self,預設和腳本狀态下隻允許加載本域的資源。

但是csp由于是一個非常新的規範,也就是近幾年才開始推廣開來的,是以說它存在着一些問題,主要是不同浏覽器對标準的支援是不是跟得上最新的标準,支援上有一些問題。

是以說這道題其實也是利用了chrome浏覽器對csp頭的一個bypass。

其實大家在網上可以看到這種bypass、csp頭的方式,這道題可以利用link這個标簽,rel屬性設定成預加載的時候,是可以通路外域的,是可以向外域請求資源的。

我們用一個在公網上的vps監聽一個端口,這裡面舉例就是7777這樣一個端口,然後把這個link标簽在message borad那個地方送出上去,送出上去以後浏覽器一定會帶着管理者的cookie打開浏覽器通路頁面,這個頁面裡就是你輸入的内容,你輸入的内容就已經被echo到這個頁面裡了,是一個link标簽,相當于浏覽器會自動地加載這個link标簽通路那個位址,那個位址是你設定的vps的位址,這樣的話vps就聽到了這個請求,在referer字段裡面打出了這樣一個資訊,這個referer就是訓示了浏覽器在通路這個link之前所在的頁面是什麼。

這裡面值得關注的就是有一個哈希字段,這個時候大家就可以思考一下,這個哈希字段是做什麼用的。其實就是它用來辨別每一個使用者每次送出的payload的位置,你通路這個位址,帶着哈希,就會執行哈希對應的payload。其實我們可以在本地浏覽器裡面通路一下referer裡面的請求,我們會發現它就正好是我們剛才送出的payload,我們就會在我們的浏覽器裡執行,但是我們的浏覽器裡面隻有我們自己的cookie,沒有管理者的cookie,是以說我們沒有拿到flag,這道題我們猜到flag是在管理者的cookie裡。

這個時候我們發現csp頭裡面沒有支援腳本的内聯執行,也就是說我們在送出的時候塑造的内聯js腳本是沒有辦法執行的,這個時候我們再結合剛才的哈希,我們開開腦洞怎麼繞過這個限制。

我在下面直接告訴大家結果吧,我們可以通過二次攻擊。

第一次,我們把一個js腳本送出上去,送出的同時我們用link标簽把這次送出的哈希值從referer裡邊帶出來,大家看一下頁面上的這個截圖,我們送出了link标簽和下面的location.href,送出這個字段,由于link标簽打過來的哈希值我們記錄下來。接下來再去送出一個script的标簽,script标簽的sals字段就是剛才的referer裡面記錄的位址。

這樣的話我們第二次送出的時候,後端會調用浏覽器去加載這個script标簽的sals的域,加載的時候正好是我們第一次送出的js代碼。這樣的話我們沒有做inline的操作,我們沒有内嵌inline的js代碼,我們是用外域加載,而且這個外域還是在我們的self的限制範圍内的,是以說這樣我們就實作了一個在csp這個限制政策下把我們的js腳本執行起來了,執行的時候就會把cookie也帶回來,帶回來發現是一個64的編碼,我們解碼以後發現是這樣的,上面寫着set cookie、flag,還有flag的内容,有一個時間戳,後面是pass,因為cookie有一個路徑。

我們發現這隻是這道題flag一個位置的說明,告訴我們這個cookie在目前的根目下是拿不到的,必須要在t2,這個flag is here這個路徑下才能拿到cookie。我們就想辦法怎麼去讓我們的頁面到這個目錄下,然後把cookie拿過來以後再傳過來。就是構造下面截圖當中這樣一個payload,就是動态建立一個iframe的标簽,這個iframe标簽的sals字段就是剛才說的那個存放cookie的目錄。由于它們是在一個同域下,不存在跨域的問題,是以我們可以在目前域去通過浏覽器對象擷取到我們建立的iframe标簽裡面cookie。

大家可以看一下這個payload,我們通過兩次送出,第一次送出的時候把我們接下來要執行的js腳本先送出上去,換回了這個哈希值,再構造一個script标簽,這個标簽的sals屬性就是剛才的那個referer,這樣的話第二次再送出的時候,浏覽器帶着管理者的cookie去通路這個位址,間接地就通路了剛才動态建立iframe的腳本,這個腳本在iframe的内部是目标路徑,在這個目标路徑下拿到cookie,然後再通過iframe傳到目前的腳本裡,再給我們回報回來。大概就是這樣的流程。

最後的結果就是截圖裡面看到的get後面這樣一大串,這裡面就把flag給帶出來了。

楊軍鋒:接下來這道題目是教授的,很多同學對這道題目怨氣很大,我都了解,因為我對它也有挺大怨氣的。下面有請教授。

王宇:為什麼要有怨氣?

楊軍鋒:因為太難了。

王宇:這道題其實沒有太大的難度,可能就是題型會有比較多的東西,因為它是一張圖檔做展示,裡面肯定是嵌了一些檔案,解密有一個密碼,反正就是比較雜,最後其實是一個crackme算法的逆向。

如果從頭開始說的話,13行代碼就可以完成前兩步的工作,主要是做一個解碼,把頭簡單修複一下,就能從圖檔裡面找到了,當然得定位到檔案的偏移了,就能從這張圖檔裡提出一個壓縮包,壓縮包是給了一個密碼提示,解密完之後就是一個标準的crackme算法的破解題了。

這道題目拿到了crackme的程式,實際上如果大家之前看crackme大賽,你會發現這道題目已經是難度降得非常低了,它既沒有複雜的算法,因為幾個标準的東西,md5、rc6和ves這些東西,沒有複雜的算法,也沒有加殼,我沒有選擇加殼,也沒有加venpratict這種變态虛拟機殼。理論上隻要熟悉算法的話,花的時間應該在兩個小時左右。

改的東西是仁者見仁,智者見智,因為這種算法裡面可改的地方太多了,我隻是随便挑了幾個點做了一點兒小微調,但是我做什麼微調呢?作為想解題的人就得做一個逆操作,這樣的話才能把這個算法給解出來。

微調是幾個地方:

第一,md5裡面的init表裡面的初始值,這個改實際上對于題目沒有任何影響,拿它當黑盒就可以了,根本不用關心我這邊改了什麼東西。

第二,2、4、6至少變了左移這些東西,左移的位數,包括像矩陣複值的順序。

第三,aes的算法變了置換表的内容和虛化表的内容,我如果把這些表的東西都給變了的話,反過來查表的方法這個函數可能我也得重新寫一下。

第四,4×4矩陣,我把裡面的初始值也給變了,做了一下位移,我記得好像是左移了一位。反過來想去解題,解出key的人,所有的操作都得實際操作,我做了左移,他們就得做右移。

其實我覺得隻要熟悉這幾個算法的人,理論上是可以對比标準算法的生成邏輯,花點兒時間寫一個腳本去跑一下我變了什麼的逆邏輯。其實能看出規律的,因為我左移一位,大家右移就好了,這樣的話就能把所有的東西還原了,這就ok了。

當時寫得還比較倉促,還出了bug,因為這個代碼實際上是我2009年、2010年甚至是2008年那會兒寫的東西,好久沒有維護了,隻不過這次是把它捆在了一張圖檔裡面,這個可能是想讓大家多一些樂趣的地方。

我記得有一次我在藍蓮花參加的一個比賽,他們的圖檔很變态的,嵌了很多玩意兒。這個題目其實真的沒有太多的點,我覺得想要高難度還是最後津健老師給大家展示一下流利的英文演講。

楊軍鋒:其實教授剛才講的這個,他把關鍵的代碼已經貼在這裡了,教授給大夥講講哪一個地區你做了變化?

王宇:我所有貼出來的地區都做了變化。

楊軍鋒:好的,那我了解了。

王宇:貼出來的link我是在網上随便找的,因為都是标準算法,那三個link都是标準的link,我變的就是這些地方,如果想去找dif的話,就在這些地方找就好了,實際上沒有幾處。

楊軍鋒:同學們都看見了。行,有一些同學會問,如果他們沒辦法識别出來這個rc6的話,那逆回去了難度是不是很高?

王宇:這是一個好問題,其實當時為了故意沒有這樣的難度,我隐藏了一些東西,比如說像有些key的生成故意沒有寫init的函數,然後把init的結果直接寫在代碼裡了,做了一些最基本的特征隐藏。但是這一類的東西如果大家熟悉ida的話,因為dia官網每年都有ida插件的評比,有很多插件得年度冠軍的插件,通過bineri級别、相似度去識别你代碼裡面用了哪些庫,如果大家用那個庫去分析這個程式的話,他能非常輕易地識别出你的代碼裡面有多少代碼和rc6的代碼重合度非常高,相似度可能達到70%、80%、90%,實際上這個算法的識别就跑不了了。aes理論上如果大家熟悉工具,這道題目的解題應該很快的。

楊軍鋒:好的,這道題目還有别的補充嗎?或者是有什麼延展性的?對解密這塊你有沒有什麼東西要跟同學們講?

王宇:這些都是基本功,看雪那本書《加密解密》我覺得可能大家都是看得比較早的幾本書之一了,工作中未必能用到,但是這些知識是應該需要掌握的。是以可能把幾個串起來,再捆上一些圖檔逼着自己看一眼,如果能扛下來,這也是一個進步。

楊軍鋒:好的,我們這道題就到這裡了。web題還是最受同學們歡迎的題目,這道題是web題裡面最難的一道題目,還是由又帥又瘦的劉老師來跟大家講解一下。

劉潇鋒:這個題出的時候有沒有告訴大家這是一個代碼審計題?

楊軍鋒:告訴了。

(由于篇幅限制,想看接下來的内容,請搜尋下篇)

繼續閱讀