0
本文作者: 李勤 | 2017-06-16 12:01 | 專題:雷峰網(wǎng)公開課 |
如果說,滴滴出行(以下簡稱滴滴)是近幾年來讓大家出行發(fā)生翻天覆地變化的一家公司,想必你不會(huì)反對(duì)。
據(jù)滴滴給出的官方數(shù)據(jù),滴滴全平臺(tái)上每天超過2000萬訂單。與此而來的是,這么多乘客的消費(fèi)數(shù)據(jù)和個(gè)人信息,滴滴怎么守護(hù)?
快速增長的滴滴意識(shí)到了這一點(diǎn)。2016年9月底,硅谷安全教父弓峰敏與網(wǎng)絡(luò)安全資深專家卜崢加盟滴滴,弓峰敏出任滴滴信息安全戰(zhàn)略副總裁和滴滴研究院副院長,負(fù)責(zé)制定信息安全戰(zhàn)略和研發(fā)下一代信息安全技術(shù),卜崢則擔(dān)任滴滴信息安全副總裁,全面領(lǐng)導(dǎo)信息安全團(tuán)隊(duì)。今年3月9日,滴滴又宣布在加利福尼亞硅谷成立滴滴美國研究院,重點(diǎn)發(fā)展大數(shù)據(jù)安全和智能駕駛兩大核心領(lǐng)域。
弓峰敏表示:“滴滴平臺(tái)從乘客到司機(jī)到合作伙伴,涉及大量金融付費(fèi)交易的過程,帶來信息保護(hù)以及類似身份信息偷盜、欺詐犯罪等有關(guān)問題,滴滴需要保護(hù)客戶信息、避免付費(fèi)和交易過程中的欺詐以及個(gè)人賬戶信息泄露等,而最讓人振奮的是,滴滴不只是解決出行問題,同時(shí)還能解決更大的問題,從國家到全球?qū)用?,包括城市發(fā)展、交通、環(huán)境保護(hù)等社會(huì)問題,這是極大的挑戰(zhàn)!”
隨后,滴滴在 5 月 17 日啟動(dòng)了首屆滴滴信息安全闖關(guān)賽 (DDCTF),5月30日已結(jié)束。
先挖網(wǎng)絡(luò)安全大佬,再通過大賽尋找優(yōu)秀的網(wǎng)絡(luò)安全人才進(jìn)行儲(chǔ)備,滴滴走了一條“肉眼可見”重視安全的道路。
但是,別人怎么分析都是“邊角料”,我們看滴滴自己怎么說。
6月8日,雷鋒網(wǎng)宅客頻道(微信ID : letshome)邀請(qǐng)滴滴公司三位安全研究人員來一場硬創(chuàng)公開課,聊了聊如何看待當(dāng)前網(wǎng)絡(luò)安全新趨勢,以及滴滴接下來怎么做。
翟津?。核固垢4髮W(xué)計(jì)算機(jī)專業(yè)
楊軍鋒 : 獲微軟 MitigationBypass Bounty
王宇 : 在 Black Hat USA2014 演講和出任 GeekPwn 活動(dòng)評(píng)委
劉瀟鋒:滴滴出行信息安全工程師,多年Web安全建設(shè)、攻防溯源、安全研究經(jīng)歷。
[從左到右依次為翟津健、楊軍鋒、王宇、劉瀟鋒]
若想獲得此次公開課完整 PPT ,請(qǐng)?jiān)诶卒h網(wǎng)網(wǎng)絡(luò)安全頻道的微信公眾號(hào)“宅客頻道”(微信ID:letshome)回復(fù)“滴滴公開課”。
楊軍鋒:這次是由我們四個(gè)人,包括王宇、翟老師、劉瀟鋒和我來給各位觀眾聊聊這次 CTF 比賽以及當(dāng)前網(wǎng)絡(luò)趨勢的情況。我們講解題目的同時(shí)會(huì)穿插一些我們對(duì)現(xiàn)在網(wǎng)絡(luò)安全趨勢的看法。
這里是我們四個(gè)人一些簡單的介紹,可能大伙都比較熟悉,翟老師是屬于一路學(xué)霸性的,瀟鋒是搞web搞得比較好的人,我是里面最矬,來打平均線的一個(gè)人。
這次我們要聊聊為什么我們要辦 CTF 。我們希望通過辦 CTF 來傳達(dá)我們對(duì)安全的一些理念,包括我們需要什么樣的人才,我們期望的這些技能是什么,我們希望通過 CTF 傳達(dá)信息給同學(xué)們。我們這次辦CTF的一個(gè)重要目的,就是促進(jìn)同學(xué)們對(duì)滴滴安全的了解,知道我們對(duì)極客精神的一種追求。
這是我們的愿景,最重要的還是要玩得開心,在玩得開心的同時(shí),能夠從中得到一些知識(shí)。有什么補(bǔ)充的嗎?
劉瀟鋒:沒有什么補(bǔ)充的,我覺得CTF活動(dòng)更是一種交流,還是玩得開心最重要。
楊軍鋒:我們這里的愿景是我們都在這次比賽中玩得開心,同時(shí)能從玩比賽里拿走一些東西,不管是經(jīng)驗(yàn)也好,鍛煉也好,知識(shí)也好。
在這次比賽里面,我看到有一些同學(xué)可能在某一個(gè)方向比較薄弱,看到他花了幾天的時(shí)間去學(xué),有時(shí)學(xué)web,學(xué)一些知識(shí),回來解題,我非常高興看到這樣的同學(xué),一邊做題,一邊學(xué)習(xí),然后在學(xué)和做中,我看到有一位同學(xué),他在最后解題思路里寫到,這次比賽解決了他很多年沒有系統(tǒng)化學(xué)習(xí)過的一些知識(shí)點(diǎn),這就是我們聽到最好的回饋,同學(xué)們學(xué)到東西,我們非常開心。
我們接下來的議程就是會(huì)講解一些題目,但是由于我們的時(shí)間有限,不會(huì)把每一道題所有細(xì)節(jié)都陳列出來,主要就是講講思路,大概是怎么做的,應(yīng)該從什么方向想。這些解題思路并不是唯一的,除了這些解題思路之外,可能還有其他的一些很好的解題思路,我們無法一一陳列在這里,可能會(huì)有更好的解題思路。我們?cè)谶@里講的只是給出了一個(gè)預(yù)期的解題方式,不是標(biāo)準(zhǔn),也不是唯一的。
這次比賽我們一共準(zhǔn)備了11道題目,很多同學(xué)說為什么沒有漏洞利用的題目,這個(gè)題目由于最初規(guī)劃候,我們想要作為線上賽,沒有任何服務(wù)器交互的環(huán)節(jié)。所以在這種情況下,完全對(duì)溢出的利用題目也好,同學(xué)們解題、服務(wù)器搭建還是各方面,跟我們最初設(shè)想的可能會(huì)有點(diǎn)兒不一樣。
我們最初決定的所有的題目都是離線題,不需要同學(xué)們連接服務(wù)器,但是最后玩出web題目什么的,還是搭建了線上的環(huán)境,這是后來由于出題時(shí)一些不得不折中的地方,除了這三道web題,其他都是離線可以解的題目。
第一道題目是Mach-O上的一個(gè)逆向題,接下來就是一個(gè)安卓題,主要是JAVA的、逆向的,比較簡單,這些都是windows題目,這道題目主要就是模擬典型的釣魚攻擊場景,是長著一個(gè)word文檔的圖標(biāo)。這個(gè)是Panic,就是由教授來出題的,這個(gè)崩潰題目,你只要加載、驅(qū)動(dòng),然后你Mach-O,Panic就是會(huì)崩潰了。Injection就是web題目。
接下來Android normal這道題就是翟老師出的。這道是快戰(zhàn)攻擊題,這道題挺有意思的,我相信很多同學(xué)如果做到它,印象應(yīng)該挺深刻的。然后是Crackme,是到RC6到AEC算法變形題目,很多同學(xué)對(duì)它很有怨氣,今天它的出題人也來到了現(xiàn)場,不是來到了現(xiàn)場,也來到了線上。接下來的這道題目就是代碼神經(jīng)題,我見到有好幾位同學(xué)被卡在這里。Findkey這道題就是比較純粹的數(shù)學(xué)題了。最后一道壓軸題是翟老師出的安卓難題。
這個(gè)排序我們是根據(jù)經(jīng)驗(yàn)按照我們想的難度排的,但是確實(shí)是也不是很嚴(yán)格地按照難度梯隊(duì)排列,但是大體上是升序的難度級(jí)別變化。
我們?cè)谥v題目之前,先來講講解這些題目所需要的一些工具,有一些工具可能是我們比較偏愛的,但是你也可以用其他的同類型的工具,都可以,這個(gè)沒有一定非得要用哪個(gè)工具去完成調(diào)試、抓包這些任務(wù)。
web版編譯工具的話,剛開始比賽的時(shí)候有一些國外的同學(xué)過來問我們說他們沒有IDA,怎么辦?其實(shí)IDA是有一個(gè)5.0的免費(fèi)版本的,只不過是不支持反編譯長C維代碼,如果版權(quán)意識(shí)比較好的同學(xué),可以選擇使用免費(fèi)版本。當(dāng)然我并不是在這里倡導(dǎo)我們使用盜版的IDA,我出于一個(gè)官方的立場,是絕對(duì)不能推薦使用盜版的。
這個(gè)Hopper,我不知道怎么念前面這個(gè)反匯編工具,這個(gè)好像只是說Mac的,所以如果有用戶Mac電腦的同學(xué),你們可以考慮使用這個(gè)反編譯工具,聽說是挺好用的,但是我本人沒有試過。
接下來這個(gè)snowman,我不知道有多少同學(xué)知道,這個(gè)工具是支持生成偽代碼的,可以不依賴于IDA直接工作,如果你實(shí)在是版權(quán)意識(shí)比較強(qiáng),希望享受F5的待遇,snowman可能是不錯(cuò)的選擇。
接下來這個(gè)應(yīng)該打CTF的同學(xué)都應(yīng)該知道,但是我其實(shí)沒怎么用過它,所以我就沒辦法多介紹。JEB是PK的時(shí)候應(yīng)該用的比較多,后來這個(gè)GUI的程序,也是一個(gè)JAVA的反編譯程序,挺好用的。
調(diào)試工具的方面,提供選擇的面也是蠻多的,有OD、inmulity,由于前兩個(gè)Oldydbg inmulity都沒有支持64位windows,這個(gè)是支持64位的,而且我看到他們最近的開發(fā)進(jìn)度也非???,我們也可以關(guān)注一下,這個(gè)可能是我們最常用的,特別是在我們調(diào)系統(tǒng)和各方面必不可少的調(diào)試工具。GDB我相信用過windows或者是Unis的同學(xué)都應(yīng)該比較熟悉,因?yàn)镃TF里面出現(xiàn)比較多的題目應(yīng)該都是需要GDB去調(diào)的,IDA本身也有一個(gè)調(diào)試支持的功能,都是可以用的。
除了前面所有這些調(diào)試反編譯工具之外,抓包的這部分工具也比較多,各種各樣的,這里提供了一些選項(xiàng)給同學(xué)們。其他的類似工具我覺得比較有用,而Cooker是一個(gè)虛擬的分析系統(tǒng),特別是你把一個(gè)APK、ESE提交到分析平臺(tái)里面去,會(huì)給出一部分比較詳細(xì)的分析報(bào)告,當(dāng)你有時(shí)候在分析的時(shí)候是比較有用的,因?yàn)槟惚容^直觀地得到一些分析報(bào)告。
這個(gè)工具套件我相信對(duì)windows有接觸甚至沒有接觸的老用戶都應(yīng)該知道,它是微軟出的一套官方的工具,里面包含了進(jìn)程監(jiān)控以及行為監(jiān)控、進(jìn)程管理器一些很強(qiáng)大的工具。
這是后面的一些工具,就是Netcat,這個(gè)工具就是NC,我們通常所知道端口監(jiān)聽,連端口的時(shí)候經(jīng)常要用到的。然后salcat就是轉(zhuǎn)發(fā)端口,這個(gè)時(shí)候就比較有用了。
這個(gè)工具比如說在求解一些線性規(guī)劃或者是其他很多求解類題目,是比較有用的,你指定了約束條件讓它跑吧,可能就比較容易求解了。
這個(gè)是我在這次比賽里面看到同學(xué)們的解題思路才知道有這么一個(gè)神器,我不知道怎么念,它也是一個(gè)有點(diǎn)兒像mitlab的這么一個(gè)元件,可以求解很多像離散對(duì)數(shù)、離散數(shù)學(xué)很多東西它都可以做,就是離散數(shù)論的一些計(jì)算它能做之外,其他的功能也很強(qiáng)大,推薦都去了解了解。
教授這里有什么地方要補(bǔ)充嗎?
王宇:我覺得可能每個(gè)人都可能有一些用得比較順手的小工具吧,也就差不多是這些吧,可能最多再有一些插件,包括我相信每一個(gè)選手都會(huì)攢一堆特別好用的腳本,每個(gè)人都有一點(diǎn)兒擅長的東西。
楊軍鋒:那教授剛才也提了一些插件什么的,都挺有幫助的,謝謝教授的建議。
接下來這道題目,第一道入門的題目是Mac,為什么出Mac?教授說一說。
王宇:第一道論文題目就是Mac的嗎?
楊軍鋒:對(duì),Mac64位的。
王宇:就是藍(lán)屏的那個(gè)?
楊軍鋒:不是,這道是查理的那個(gè)。第一道題目因?yàn)楫吘故侨腴T題,我們對(duì)選手的預(yù)期是比較低的,不管你懂不懂逆向,我們都覺得你應(yīng)該可以做出來這道題目,因?yàn)楫吘故侨腴T題目,我還認(rèn)為是比較簡單的一道題目。所以很多同學(xué)剛拿到第一道題目的時(shí)候,問我是不是沒錢就做不了題目,不是這樣的,沒錢也能做題目,我們都是沒錢的人,所以不是說沒有錢就做不了這道題目。
另外這道題目其實(shí)由于太簡單了,所以靜態(tài)分析已經(jīng)足夠了,不一定要?jiǎng)討B(tài)地去調(diào)試。當(dāng)然你可以動(dòng)態(tài)調(diào)試,如果你有錢,有Mac筆記本,可以動(dòng)態(tài)調(diào)試,即便沒有Mac筆記本,搭建一個(gè)虛擬機(jī)去調(diào)試也是可以的。
這道題目就像剛才的,用IDA或者是snowman去反編譯后,就基本上能看到只有幾個(gè)函數(shù),我相信你很容易能找到關(guān)鍵點(diǎn),你就一個(gè)一個(gè)函數(shù)去翻,看到有一個(gè)地方有易貨,就是它了。這個(gè)函數(shù)不在正常的執(zhí)行流上面,你正常執(zhí)行可能走不到這里來,你可能發(fā)現(xiàn)幾個(gè)函數(shù),一個(gè)一個(gè)翻之后發(fā)現(xiàn)這里有輸出,這里有易貨,出于常年打CTF的慣例,應(yīng)該已經(jīng)意識(shí)到這里有問題了,那這樣就比較簡單了。
很多同學(xué)就覺得在標(biāo)紅框的這句話里面會(huì)有一點(diǎn)點(diǎn)困惑,不知道這里是怎么計(jì)算出來的,我在這里簡單講講。這是一個(gè)開始,一個(gè)函數(shù)地址減去另一個(gè)函數(shù)地址,這個(gè)值其實(shí)是固定的,你只需要找到這個(gè)函數(shù)的地址之后,人工算算,算一下這個(gè)結(jié)果是多少,再移位,移完位之后再易貨,這個(gè)全局?jǐn)?shù)組的第一個(gè)字節(jié),事實(shí)上你就已經(jīng)拿到了V2。這里還有一個(gè)函數(shù),你會(huì)發(fā)現(xiàn)你不需要去關(guān)心它到底是干嘛的。
接下來你看到的就是一個(gè)典型的解密流程,為什么你知道它是解密流程?后面有一個(gè)fanao allput,已經(jīng)知道這里有一個(gè)最終的輸出,就是輸出解密結(jié)果。
我也看到當(dāng)時(shí)很多提交題目的同學(xué)們,把這個(gè)全局字符數(shù)組的第一個(gè)字節(jié)好像是一個(gè)A還是V,就把它當(dāng)成了郵箱地址的一部分發(fā)來,一直沒有收到我們的回信,覺得是不是出問題了。其實(shí)這里你要留意這句最后的輸出,你會(huì)發(fā)現(xiàn)輸出是從第一個(gè),索引是1開始輸出的,這里有一個(gè)地址,這里是以索引為1的第一個(gè)字節(jié),如果從1開始計(jì)數(shù)是從第二個(gè)字節(jié)開始輸出。
所以這道題目比較簡單。
剛才為什么我們第一道題目會(huì)是一個(gè)Mac題目,我在這里補(bǔ)充一點(diǎn)兒,因?yàn)槲覀儸F(xiàn)在大量的辦公機(jī)器都是Mac的,包括我們滴滴里面很多同事,大部分同事都是用Mac辦公的,Mac安全對(duì)于我們來說是一個(gè)很重要的部分。所以不管是我們內(nèi)部防護(hù),還是在研究方面,我們都認(rèn)為Mac是一個(gè)不可忽視的平臺(tái)。因?yàn)橛腥擞玫牡胤?,它就?huì)產(chǎn)生信息,產(chǎn)生信息就會(huì)有價(jià)值,這些有價(jià)值的信息是需要我們保護(hù)的,這是我們第一道題出Mac的考慮。
楊軍鋒:王宇老師是對(duì)于windows、安卓、Mac平臺(tái)都有比較深的研究,屬于非常優(yōu)秀的專家,不知道他對(duì)第一道題目有什么看法。
王宇:第一道題是一個(gè)入門題,我相信可能不需要太多的訓(xùn)練都能把第一道題處理出來。剛才軍鋒同學(xué)說的我覺得是這樣的。
我印象比較深的是2015年,有一個(gè)比較大的事件,就是美國的新地平線號(hào)探測器,它飛躍了冥王星,花了9年時(shí)間,48億公里,NASA是當(dāng)時(shí)很興奮的一個(gè)機(jī)構(gòu),它在世界網(wǎng)絡(luò)上瘋狂地放各種冥王星的照片,甚至每天都是在以照片直播的形式直播近距離看冥王星。
你可以看到NASA看到內(nèi)部慶祝的照片,他們所有的工程師幾乎99%都是在用Mac book的機(jī)器。從這些照片去分析,你就可以推測出某些特殊的機(jī)構(gòu),或者是在某些趨勢,已經(jīng)是重心開始慢慢地由傳統(tǒng)的PC向Mac平臺(tái)和移動(dòng)平臺(tái)轉(zhuǎn)移。
所以安全這個(gè)東西應(yīng)該是有前綴,它的前綴應(yīng)該是計(jì)算機(jī)安全,所以它應(yīng)該是依附在計(jì)算機(jī)產(chǎn)業(yè)鏈的鏈條上的,應(yīng)該是隨著計(jì)算機(jī)熱點(diǎn)的不斷變換在變換的。
我覺得各位同學(xué)也不應(yīng)該把自己局限在某一個(gè)很窄的領(lǐng)域上,應(yīng)該是見多識(shí)廣的多面手,我相信這樣更受企業(yè)的歡迎。
所以第一道題和我們這次的出題考慮,雖然沒有漏洞相關(guān)的題目,但是可能我們盡量讓平臺(tái)更豐富一些,有移動(dòng)的、安卓的、Mac的、web的、windows的,應(yīng)該來說有這方面的考慮。
楊軍鋒:好的,那我們就先開始講Android easy這道題目吧,由于翟老師不在,我在這里簡單給大家講講這道題目。Android easy這道題目真的就很easy,真的很簡單,非常簡單,以至于我覺得不用花太多的時(shí)間跟大家說。因?yàn)槟阒苯臃淳幾g之后,看到的就是跟原碼差不多的,完全一樣的這么一個(gè)代碼,我們會(huì)看得到在這里非常簡潔,第一就是易貨兩個(gè)數(shù)組。
你看到中間有這些,其實(shí)這頁P(yáng)PT是翟老師寫的,后面這些像偏移這些都不用看,你直接把兩個(gè)數(shù)組給易貨完之后,然后把所有字符打印出來,你發(fā)現(xiàn)里面就包含著key,把這個(gè)key交過來,這道題目就OK了。
接下來講這道windows題目,很多同學(xué)拿到題目第一個(gè)反應(yīng)就覺得這涉及到windows惡意木馬的題目,確實(shí)它長得比較像惡意木馬,長得像word,你雙擊它,突然就不見了。所以把一些同學(xué)給嚇到了,真是不好意思,我們這些題目全部都是比較干凈的,不會(huì)侵害你的計(jì)算機(jī),所以不用擔(dān)心。
這個(gè)題目背景是這樣子的,現(xiàn)在當(dāng)前的APTE以及大眾化這種黑客集團(tuán)、軟件這些界限在不斷模糊,以前很多時(shí)候我們覺得APTE會(huì)用高端的技術(shù)來做攻擊,比如說漏洞,高端的利用去打一個(gè)企業(yè),現(xiàn)在你會(huì)慢慢發(fā)現(xiàn)有一些APTE集團(tuán)開始用一些釣魚的手法,你看起來很低端,但是很管用。因?yàn)橐粋€(gè)企業(yè)里面有幾萬人,只要一個(gè)人中招就可以了。
所以這些看起來粗糙,但是成本低,收益大的,這些手法,像現(xiàn)在的紅攻擊,你在很多地方慢慢發(fā)現(xiàn),十年前曾經(jīng)很火爆的紅病毒,現(xiàn)在有重新泛濫的趨勢。那像這些PE文件值長得像一個(gè)文檔的攻擊手法很低級(jí),但是確實(shí)到今天為止,還是管用的。
所以這個(gè)程序就是一個(gè)整個(gè)像word文檔,雙擊就會(huì)打開一個(gè)真正的文檔,就把這個(gè)刪除了,接著是一個(gè)Payload來運(yùn)行,完全就是惡意軟件的套路,但是只是一個(gè)比較友好的惡意軟件。這個(gè)惡意軟件在UPS外面扎了一層混淆,其實(shí)不是兩層殼,你可以理解為兩層殼,為什么要扎入一場混淆呢?因?yàn)槲遗潞芏嗤瑢W(xué)直接就用UPS解壓文件,直接就拿到了,根本就不用動(dòng)手脫殼,不用調(diào)試器怎么去分析。
同時(shí)里面有一個(gè)很小的反調(diào)試的功能,只檢查PEB的級(jí)位,這個(gè)位置,如果發(fā)現(xiàn)正在被調(diào)試的話,就篡改掉默認(rèn)進(jìn)程堆,這會(huì)導(dǎo)致堆函數(shù)里面,離真正原始的反調(diào)試的點(diǎn)比較遠(yuǎn),這樣同學(xué)比較難去定位,這是故意惡心人的。
怎么去解這道題目呢?脫殼和不脫殼都是可以的,怎么去避免反調(diào)試呢?Ollydbg裝OD這個(gè)插件就具有的反調(diào)試功能,如果你不知道怎么安裝,那我今天直接去吾愛破解上直接拉吾愛破解專版,這個(gè)插件也集成了反調(diào)試的一些功能,我看很多同學(xué)直接用Ollydbg,根本就沒有去碰反調(diào)試的那一塊代碼。
接下來怎么辦?你可以脫殼,然后把它弄出來,用IDA分析,也可以在關(guān)鍵函數(shù),比如說你會(huì)用行為監(jiān)控發(fā)現(xiàn)它會(huì)寫一個(gè)文件,會(huì)打開一個(gè)文件,你在關(guān)鍵函數(shù)上殺一個(gè)斷點(diǎn),等它斷下來的時(shí)候,可以dnp這個(gè)程序出來進(jìn)行,或者是你直接就在調(diào)試器里面調(diào)試也是可以搞定的。
這個(gè)主要邏輯就是釋放一個(gè)文檔,釋放一個(gè)DOCS文檔,并且打開,然后把字符復(fù)制到臨時(shí)目錄底下,然后創(chuàng)建一個(gè)進(jìn)程,啟動(dòng)一個(gè)新的實(shí)例,最后刪除原始的拷貝。
接下來就是下載Payload,就是像圖片一樣的東西,使用IC4算法去解密到JPG,解密完之后,在這里執(zhí)行,然后在里面還會(huì)有一個(gè)單字節(jié)易貨解密,最后解密完之后,就把這段削殼,那段其實(shí)是面向sbori的削殼,執(zhí)行之后就彈出一個(gè)框,里面就都會(huì)有的那個(gè)key。
這里面有一個(gè)坑點(diǎn),就是在Payload前面的四個(gè)字節(jié)其實(shí)是個(gè)時(shí)間戳,這個(gè)時(shí)間戳如果在1800秒之后,當(dāng)前的時(shí)間戳大約這個(gè)圖片要是Payload的時(shí)間戳1800秒以上,這個(gè)Payload就不會(huì)被執(zhí)行,你如果去詳細(xì)分析的時(shí)候,就會(huì)發(fā)現(xiàn)這里有一個(gè)坑,然后把這個(gè)坑跳過去,接下來你的代碼就可以直接執(zhí)行這段belou,最后拿到key了。很多同學(xué)說這個(gè)key事實(shí)上出題人是做了一個(gè)反向混淆,中間插了H,但是其實(shí)不是,由于它是一段代碼,所以有一個(gè)push,就是H,這是匯編語言的push指令,并不是我故意去混淆的。
下一道題目是教授的Panic題目,把時(shí)間交給教授。
王宇:隨便弄了一道 Mac 驅(qū)動(dòng)的Panic題目。我覺得任何一個(gè)想從事內(nèi)核開發(fā)相關(guān)的同學(xué),首先調(diào)試環(huán)境,還有內(nèi)核調(diào)試工具,包括調(diào)試的手段,這些東西都是一個(gè)逃不過的話題,無論你去打算做內(nèi)核開發(fā)還是做用戶開發(fā),這個(gè)話題或者是這個(gè)時(shí)間的投入是成長必不可少的階段,是逃不過去的。
我認(rèn)識(shí)的很多同學(xué)都是機(jī)器上一堆環(huán)境,首先是一堆機(jī)器,機(jī)器上都是一堆環(huán)境,就是調(diào)試環(huán)境,這些都算是簡單的,因?yàn)閺S商會(huì)默認(rèn)給你做一些支持。但是反過來,如果大家以后想做安卓 root或者是iphone的越獄,你會(huì)發(fā)現(xiàn)那些環(huán)境的調(diào)試友好程度是更加不友好的,可能在系統(tǒng)上是不會(huì)給你有一個(gè)內(nèi)核級(jí)等你的調(diào)試器連上來,也不會(huì)給你提供符號(hào)或者是原代碼。
這些系統(tǒng)可能都算是最強(qiáng)健的系統(tǒng),如果大家想搞一些更冷門的東西,比如說像車載的系統(tǒng)調(diào)試、手機(jī)基站通訊的調(diào)試,這些東西的調(diào)試難度和調(diào)試環(huán)境的搭建、模擬,包括像一些思科專屬設(shè)備的mix指令和一些專屬設(shè)備的調(diào)試,可能會(huì)更花時(shí)間。
所以我們?cè)谶@邊簡單地考察了一下,假設(shè)一個(gè)學(xué)生從來沒有接觸過Mac,他從零接觸,到把調(diào)試環(huán)境搭起來大概花多長時(shí)間,可能這個(gè)時(shí)間的花費(fèi)要在三個(gè)小時(shí)左右,這是給大家預(yù)估的成本。
結(jié)合第一張圖,Mac系統(tǒng)調(diào)試的時(shí)候,我們可以看到第一張圖,我弄了一個(gè)10.11的系統(tǒng),LIDB是可以把這個(gè)系統(tǒng)斷在加載階段,這個(gè)時(shí)候系統(tǒng)啟動(dòng)它的,如果我們?cè)敢獾脑?,可以把它斷下來,如果?nèi)核是自己編譯的話,那就可以做相關(guān)的登錄。
下一頁是這道題目的本身了,這道題目的解法是真的沒有太多的難度,因?yàn)槲沂歉嬖V大家,只要加載就一定會(huì)crash,只要crash,內(nèi)存里面一定會(huì)有key的信息。
所以我們看到的至少玩這個(gè)題的解法有三種,另外為了降低難度的話,這道題其實(shí)是放出了所有的符號(hào),既然有符號(hào),靜態(tài)分析的難度是很低的。很多同學(xué)已經(jīng)在代碼中找到了做易貨的函數(shù),因?yàn)閗ey的格式基本上是公開的,前面是一個(gè)生成的哈希值,后面是一個(gè)@滴滴出行結(jié)尾的域名,你直接去找@,還有.com這種關(guān)鍵字,其實(shí)很容易就能把這個(gè)郵箱的key給枚舉出來。所以我看到大部分同學(xué),可能是90%的同學(xué)都是用枚舉的方法做的,但是大概也有三位同學(xué)用的是大環(huán)境去做的。
其實(shí)你只要把環(huán)境搭起來,從第二張圖可以看到,直接在滯塵器里面搜一圈,發(fā)現(xiàn)至少是前幾個(gè)很可疑,每一個(gè)都去內(nèi)存看一眼,就可以找到了。
這是靜態(tài)的方法和動(dòng)態(tài)的方法。
另外還有一些同學(xué)用的是創(chuàng)建了一個(gè)pradonp,然后從中間搜這個(gè)特征,這也是一個(gè)很好的方法。我相信一個(gè)人對(duì)這個(gè)理解和用的手段不一樣,有靜態(tài)簡易的方法,也有動(dòng)態(tài)稍微難一點(diǎn)的方法,雖然動(dòng)態(tài)的方法會(huì)至少花三小時(shí)的時(shí)間,但是這個(gè)時(shí)間我個(gè)人認(rèn)為是值得的。
再下一頁,我截了一個(gè)調(diào)試的截圖,一個(gè)全黑的頁面,就是LIDB,這個(gè)圖如果大家熟悉undibge的話,再看這個(gè)會(huì)覺得很簡陋,非常簡陋。
第一,它連個(gè)密令行的輸入窗口都沒有給你,你想在這邊輸密令是不太現(xiàn)實(shí)的,這個(gè)是LIDB在密令行里輸JY跳出來的默認(rèn)界面。
第二,這個(gè)界面對(duì)于byneri級(jí)別的調(diào)試支持其實(shí)是做得非常爛的。比如,我們?cè)谧钣疫叺腸osdek的里面,看到戰(zhàn)爭的第0層,連byneri地址都不給你顯示,只是默認(rèn)顯示原代碼。
最大的一個(gè)問題是它跟nousceoul調(diào)試相比的話,windows現(xiàn)在看來真的是越見良性,給你做了大量的工具是免費(fèi)的。
另外,它還做了上百條內(nèi)建的building的conmad,你可以輸入簡單的感嘆號(hào)××004327系統(tǒng)就能直接幫你解析符號(hào),只要能找到對(duì)應(yīng)的single,能幫你解析符號(hào),能幫你去辨明內(nèi)核的數(shù)據(jù)結(jié)構(gòu),能幫你把內(nèi)核的數(shù)據(jù)結(jié)構(gòu)按照相對(duì)可讀的格式給你打出來。
實(shí)際上這件事情已經(jīng)幫大家省了非常多的時(shí)間,但是可能你會(huì)發(fā)現(xiàn)在××004349沒有太多人幫你做這件事情,特別是××可以看到蘋果對(duì)于Mac的內(nèi)核開發(fā)是非常不友好的。
這個(gè)是給大家簡單地展示一下調(diào)試大概是長什么樣。
這個(gè)調(diào)試環(huán)境已經(jīng)非常簡單,如果大家以這個(gè)為起點(diǎn)的話,再去看iphone的越獄,你們會(huì)發(fā)現(xiàn)調(diào)試的友好程度可能會(huì)再往下一個(gè)量級(jí),無論是從符號(hào)的支持、加密文件如何做解密,還有調(diào)試密令,包括像友好程度,挺考驗(yàn)選手們的耐心和實(shí)力的。
我的幻燈片前三頁已經(jīng)講完了,最后一頁其實(shí)是做了一個(gè)截圖,是想說一下那道題目有一個(gè)附加的小問題。Panic其實(shí)是很簡單的,你只要一加載,過一小會(huì)兒,這一小會(huì)兒可能是幾百個(gè)毫秒,這個(gè)系統(tǒng)就Panic,就藍(lán)屏重啟了,但是它的原因是什么?
如果是他想回答這個(gè)問題,想得到這個(gè)題的附加分,可能需要的背景知識(shí)有:
第一,搭建一個(gè)調(diào)試環(huán)境。
第二,可能需要?jiǎng)討B(tài)調(diào)試一下這個(gè)驅(qū)動(dòng),大概是在做什么。
第三,如果調(diào)試這個(gè)驅(qū)動(dòng)去看這個(gè)驅(qū)動(dòng)的時(shí)限的話,就會(huì)發(fā)現(xiàn)這是Mac平臺(tái)標(biāo)準(zhǔn)的發(fā)System Callstack驅(qū)動(dòng),可能是需要知道一下Mac的文件系統(tǒng)是怎么做回調(diào)這件事情。如果大家熟悉windows驅(qū)動(dòng)開發(fā)的話,mini showter driver整個(gè)的設(shè)計(jì)其實(shí)是非常講究的,微軟20多年、30年的設(shè)計(jì)迭代了好多版,現(xiàn)在這個(gè)mini foot的設(shè)計(jì)其實(shí)是非常漂亮的一版設(shè)計(jì)。
比如,以第三方做showter driver的方便程度來講,我說的第三方可能是指殺毒軟件廠商,做硬盤加密的廠商,還有做磁盤還原、過濾、影子系統(tǒng)的廠商,這類廠商在做產(chǎn)品架構(gòu)的時(shí)候,微軟已經(jīng)幫你考慮了很多事情了,很多事情都需要你做,但是反過來,在Mac Cernol給你callstack的條件是非常簡陋的。你可以看到從2003年到2017年14年間callstack的代碼都沒有怎么更新過,這件事情在windows cernol其實(shí)是不可思議的。
我覺得比較奇葩的一點(diǎn),你作為一個(gè)文件系統(tǒng)的回調(diào),至少系統(tǒng)應(yīng)該告訴你這個(gè)文件應(yīng)該被創(chuàng)建或者是打開,但是真正去看這個(gè)Mac的文件系統(tǒng)規(guī)律驅(qū)動(dòng)的時(shí)候,你會(huì)發(fā)現(xiàn)Mac沒有把文件創(chuàng)建的事件作為一個(gè)回調(diào)發(fā)給你。我想作為第三方開發(fā)的人,一定想要區(qū)分出什么是文件的創(chuàng)建和什么是文件的打開,這是一個(gè)很關(guān)鍵的問題。怎么做呢?可能只有自己寫代碼來做了,既然Mac沒有給你提供任何的幫助,那就只有自己做了。
所以我在第四頁的截圖,左邊的截圖是我自己寫的內(nèi)存的打印,我downp了某一個(gè)函數(shù)入口的RPP所有callstack的信息,通過解析這個(gè)信息,我們能找到每一層callstack的戰(zhàn)爭和防御。右邊就是我在驅(qū)動(dòng)里面集成了一個(gè)disdome的引擎,我會(huì)訪問我想關(guān)心的內(nèi)核函數(shù)。
我在這邊列了兩個(gè),每一個(gè)都列了前多少個(gè)字節(jié),沒有列太多。
第一,反匯編OSKEXT Start這個(gè)函數(shù),這個(gè)函數(shù)是所有驅(qū)動(dòng)加載的函數(shù)。
第二,VM Open,這個(gè)東西是屬于文件系統(tǒng)的處理函數(shù)。
也就是說我如果結(jié)合左邊的圖去downp callstack,解析戰(zhàn)爭,再結(jié)合右邊的圖去反匯編,我能把整個(gè)文件系統(tǒng)的callstack調(diào)用站,我所有負(fù)函數(shù)至少能識(shí)別出來。這個(gè)時(shí)候再去結(jié)合負(fù)函數(shù)里面找一些特征。
比如說文件的操作,負(fù)函數(shù)里面有一個(gè)調(diào)用,里面帶著參數(shù)的Fnode,如果置不同位的話,表示的含義是不一樣的。比如說2是表示創(chuàng)建,0是表示打開等等。如果我能定位到它,并且我能解析當(dāng)前文件實(shí)踐Fnode的值是多少的話,實(shí)際上我就能區(qū)分出這個(gè)行為到底是一個(gè)文件的打開行為還是創(chuàng)建行為。但是這個(gè)過程理論上應(yīng)該是操作系統(tǒng)幫你做,但是如果操作系統(tǒng)沒有幫你做的話,你就得自己來。所以我其實(shí)是在這邊演示了一個(gè)怎么自己來的一個(gè)代碼。
再回到這道題目的附加分,為什么這個(gè)系統(tǒng)藍(lán)屏了?如果能把這些東西都簡單摸一圈,它的答案應(yīng)該是在31次文件操作的時(shí),并且當(dāng)前的文件事件是一個(gè)qufir操作。
這就是整個(gè)出題的考量和題目的細(xì)節(jié)。它可能會(huì)比較花選手的時(shí)間,特別是如果選手不熟悉的話,但是實(shí)際上真的去花一點(diǎn)兒時(shí)間折騰系統(tǒng)調(diào)試,我覺得是值得的,并且相對(duì)來講是比較練內(nèi)功的。
我上大學(xué)時(shí),有一位老叫張銀奎,他剛開始寫他那本鴻篇巨著《軟件調(diào)試》的第一版,那時(shí)候我是上大三。當(dāng)時(shí)我是主動(dòng)跳出去幫他看看,幫他打雜。實(shí)際上我真的去審校這本書的時(shí)候,我發(fā)現(xiàn)里面有非常多的細(xì)節(jié),他那本書更多的是在windows Cenol,因?yàn)樗救耸怯⑻貭柕?,他可能集中在英特爾CPU。
如果大家再去工作中結(jié)合Mac等等,實(shí)際上內(nèi)功的修煉還是逃不了的。剛才有同學(xué)在直播間里說一方面可能需要廣度,另一方面深度怎么做呢?每一個(gè)點(diǎn)的積累都是值得花時(shí)間的。
劉瀟鋒:我們確定出來一共有四列的時(shí)候,就可以在腦子里面構(gòu)想一下這個(gè) flag 所在的這張表大概是一個(gè)什么樣的結(jié)構(gòu),用我們現(xiàn)在在界面上看到的這樣一些東西。我們有四個(gè)標(biāo)題,每個(gè)標(biāo)題里面有內(nèi)容,標(biāo)題里面可以通過ID這個(gè)參數(shù)知道肯定在這個(gè)表里有一個(gè)ID。flag應(yīng)該是在第四列,因?yàn)榭偣簿椭挥兴牧?。所以我們就畫出了像PPT里面的這樣的一張圖,flag大概是在這個(gè)里面,我們需要在這里面注入出來。
剛才前面是限制了空格、逗號(hào)、引號(hào)、斜線,當(dāng)然這個(gè)對(duì)于大家常搞四核注入的人來說,這個(gè)比較容易繞過的,不允許空格,我們可以用;不允許逗號(hào),可以用join的形式,我們需要多少字段可以用join構(gòu)造出這樣一個(gè)字段數(shù);如果不允許引號(hào)的話,可以采用十六進(jìn)制編碼。
有了這些手段,基本上可以去實(shí)施了,因?yàn)樵跍y試時(shí)沒有發(fā)現(xiàn)關(guān)鍵字被過濾,所以可以嘗試一下,先使用聯(lián)合查詢注入這樣的方式,接下來的注入方式其實(shí)很套路的,就是利用masacal系統(tǒng)表、information sikima這樣一些庫里面的表的字段。
首先第一個(gè)語句,就是把數(shù)據(jù)庫的名給注出來,我做了一個(gè)處理,就是把所有的0a,之前說空格是過濾的,但是我們用0a來做間隔符,但是為了方便大家看PPT,我就把0a又改成了空格,實(shí)際上大家測試的時(shí)候還要換成0a的。第一個(gè)語句就是把數(shù)據(jù)庫注出來,中間有一個(gè)十六進(jìn)制編碼,解析出來就是information sikima,就是說我們先獲取這個(gè)數(shù)據(jù)庫里面到底有哪些庫名,把information這個(gè)系統(tǒng)庫先給排出去,這個(gè)是很常見的思路。我們注出來一個(gè)結(jié)果,比如說數(shù)據(jù)庫名是T1。
接下來我們?cè)儆胻able name這個(gè)表把表名注出來,這也是很常規(guī)的方式,就是news。
接下來再注字段名,是用callum name這個(gè)字段來注出來,是secret。
這樣我們就還原出了之前我們這張表格里的flag所在字段的字段名是secret。
接下來就是很顯然的,我們會(huì)去構(gòu)造,從某一個(gè)庫、某一張表提取某一個(gè)字段,這樣我們就可以把flag拿出來了,當(dāng)時(shí)這里有坑,這道題的坑就在這兒,把secret的字段也給過濾了。所以說可能做到這兒會(huì)卡一下。其實(shí)你去仔細(xì)想一下,或者是精心構(gòu)造一下,就可以繞過這個(gè)限制。
這里面有兩種方法。
第一,盲注。我可以不知道flag具體是什么,但是我可以用union的方式去構(gòu)造一個(gè)字符串,和flag做一個(gè)比較、排序,根據(jù)前端頁面的顯示,我們會(huì)發(fā)現(xiàn)這個(gè)差異,這樣的話我們不斷地調(diào)整這個(gè)字符串,按字典序,我們就逐漸比較,就會(huì)把這個(gè)flag比較出來。這個(gè)可能需要大家用panson或者是PHP去寫一個(gè)腳本,跑得更快一些。
第二,構(gòu)造一個(gè)子查詢。大家看我的PPT,相當(dāng)于是拼了好幾次,把這個(gè)flag的值給拼出來了。這里提醒一下大家,大家看最后一行為什么要這么寫?其實(shí)也很顯然,因?yàn)椴辉试S逗號(hào),我們不能寫逗號(hào),只能用這種方式寫,這個(gè)時(shí)候flag就注出來了。
楊軍鋒:接下來這個(gè)題目是Android Normal,很多同學(xué)要求重復(fù)講一遍剛才的注入題目的第一頁,你把剛才那一頁再跟同學(xué)們講一下。
嘉賓:OK,第一頁其實(shí)沒有什么,就是題目的一個(gè)介紹。
因?yàn)槲覀冊(cè)诰€題,你肯定要訪問一下我們的頁面,我們會(huì)看到頁面上顯示了這幾個(gè)標(biāo)題,每個(gè)標(biāo)題是一個(gè)超鏈,你點(diǎn)進(jìn)去以后會(huì)看到下面有一個(gè)針對(duì)這個(gè)標(biāo)題的介紹,就是類似于這個(gè)標(biāo)題文章的內(nèi)容,最下面是flag,點(diǎn)進(jìn)去,這個(gè)flag本身就是標(biāo)題,flag is here就是這個(gè)文章的內(nèi)容。但是這個(gè)頁面里面并沒有flag的值。
所以我們找到了這個(gè)注入點(diǎn),就是news,叫php ID=4。
接下來我們要測試它有沒有過濾特殊字符,我們測試完了發(fā)現(xiàn)單引號(hào)、雙引號(hào)、斜線、空格都過濾了。
第一頁就是這些內(nèi)容,接下來我們用all derby去判測出原始的secal語句里面到底有幾點(diǎn),查詢出來的內(nèi)容有幾點(diǎn)。因?yàn)閡nion查詢這個(gè)大家應(yīng)該都知道的,子查詢里面的列數(shù)和前面的原始查詢的列數(shù)是一樣,才可以在數(shù)據(jù)庫當(dāng)中成功執(zhí)行反饋結(jié)果。
翟津?。?/span>跟Android easy一樣,Android Normal就是用C++寫的,所以思路也是一樣的,看到第18到21行,就是XOR的操作,23行開始是一個(gè)outside,就相當(dāng)于JAVA里的outside,向右移了一位,然后把第一個(gè)取出來。24行就是說在不停地找最后一個(gè)end,end就是一個(gè)0,就從頭到尾把這個(gè)key取到,這個(gè)是Android Normal的題。
楊軍鋒:翟老師,你出這道題目,我們也是希望安卓平臺(tái)、windows平臺(tái)、Mac平臺(tái)都希望每一個(gè)平臺(tái)都有,使得我們題目的豐富度會(huì)更高一點(diǎn)。
下面一個(gè)題目是web題目。
劉瀟鋒:這個(gè)XSS題要比cecal room那道題難一些,做出來的人也少一些,大概20個(gè)人左右,這道題其實(shí)主要是考了一下CSP頭,就是HTML5平時(shí)持的那個(gè)內(nèi)容安全策略投。
首先這也是一個(gè)線上的題,大家訪問了這個(gè)題的頁面,會(huì)看到有一個(gè)Message Board,就是一個(gè)提交信息的界面,就是聊天吧。
下面有一個(gè)verification code,就是說驗(yàn)證碼還要提交,這個(gè)驗(yàn)證碼大家看一下,挺復(fù)雜的,這個(gè)驗(yàn)證碼需要我們填寫,做了一次MD5,又做了一次字符TRY5的截取6位以后,要和那個(gè)相等。
這個(gè)目的其實(shí)也很明顯,因?yàn)閄SS的題大家常參加CTF比賽的同學(xué)應(yīng)該都知道,它一定是后臺(tái)有一個(gè)程序在跑,你提交給他什么東西,他帶著管理員的cookie去用瀏覽器訪問,一定是在做這樣的事情。
所以做了這樣一個(gè)驗(yàn)證碼的限制,實(shí)際上也是讓大家別頻繁地這么刷,降低瀏覽器開啟、關(guān)閉的速度。這個(gè)我本地測試過,我Mac是I7的處理器,算這個(gè)碼,其實(shí)有些碼還是要算一段時(shí)間的,快的話可能一分鐘之內(nèi)就會(huì)出結(jié)果,慢的時(shí)候可能兩、三分鐘甚至十分鐘可能才能創(chuàng)出MD5這個(gè)哈希值。
我們現(xiàn)在回歸正題吧,下面的這個(gè)腳本大家可以看一下,這種腳本很容易做了。我們用瀏覽器調(diào)試功能就可以看到這個(gè)頁面在返回的時(shí)候有一個(gè)CSP頭,這個(gè)CSP頭設(shè)置的default-src是self,script-src也是self,默認(rèn)和腳本狀態(tài)下只允許加載本域的資源。
但是CSP由于是一個(gè)非常新的規(guī)范,也就是近幾年才開始推廣開來的,所以說它存在著一些問題,主要是不同瀏覽器對(duì)標(biāo)準(zhǔn)的支持是不是跟得上最新的標(biāo)準(zhǔn),支持上有一些問題。
所以說這道題其實(shí)也是利用了chrome瀏覽器對(duì)CSP頭的一個(gè)bypass。
其實(shí)大家在網(wǎng)上可以看到這種bypass、CSP頭的方式,這道題可以利用link這個(gè)標(biāo)簽,REL屬性設(shè)置成預(yù)加載的時(shí)候,是可以訪問外域的,是可以向外域請(qǐng)求資源的。
我們用一個(gè)在公網(wǎng)上的VPS監(jiān)聽一個(gè)端口,這里面舉例就是7777這樣一個(gè)端口,然后把這個(gè)link標(biāo)簽在Message Borad那個(gè)地方提交上去,提交上去以后瀏覽器一定會(huì)帶著管理員的cookie打開瀏覽器訪問頁面,這個(gè)頁面里就是你輸入的內(nèi)容,你輸入的內(nèi)容就已經(jīng)被echo到這個(gè)頁面里了,是一個(gè)link標(biāo)簽,相當(dāng)于瀏覽器會(huì)自動(dòng)地加載這個(gè)link標(biāo)簽訪問那個(gè)地址,那個(gè)地址是你設(shè)置的VPS的地址,這樣的話VPS就聽到了這個(gè)請(qǐng)求,在referer字段里面打出了這樣一個(gè)信息,這個(gè)referer就是指示了瀏覽器在訪問這個(gè)link之前所在的頁面是什么。
這里面值得關(guān)注的就是有一個(gè)哈希字段,這個(gè)時(shí)候大家就可以思考一下,這個(gè)哈希字段是做什么用的。其實(shí)就是它用來標(biāo)識(shí)每一個(gè)用戶每次提交的Payload的位置,你訪問這個(gè)地址,帶著哈希,就會(huì)執(zhí)行哈希對(duì)應(yīng)的Payload。其實(shí)我們可以在本地瀏覽器里面訪問一下referer里面的請(qǐng)求,我們會(huì)發(fā)現(xiàn)它就正好是我們剛才提交的Payload,我們就會(huì)在我們的瀏覽器里執(zhí)行,但是我們的瀏覽器里面只有我們自己的cookie,沒有管理員的cookie,所以說我們沒有拿到flag,這道題我們猜到flag是在管理員的cookie里。
這個(gè)時(shí)候我們發(fā)現(xiàn)CSP頭里面沒有支持腳本的內(nèi)聯(lián)執(zhí)行,也就是說我們?cè)谔峤坏臅r(shí)候塑造的內(nèi)聯(lián)JS腳本是沒有辦法執(zhí)行的,這個(gè)時(shí)候我們?cè)俳Y(jié)合剛才的哈希,我們開開腦洞怎么繞過這個(gè)限制。
我在下面直接告訴大家結(jié)果吧,我們可以通過二次攻擊。
第一次,我們把一個(gè)JS腳本提交上去,提交的同時(shí)我們用link標(biāo)簽把這次提交的哈希值從referer里邊帶出來,大家看一下頁面上的這個(gè)截圖,我們提交了link標(biāo)簽和下面的Location.href,提交這個(gè)字段,由于link標(biāo)簽打過來的哈希值我們記錄下來。接下來再去提交一個(gè)script的標(biāo)簽,script標(biāo)簽的sals字段就是剛才的referer里面記錄的地址。
這樣的話我們第二次提交的時(shí)候,后端會(huì)調(diào)用瀏覽器去加載這個(gè)script標(biāo)簽的sals的域,加載的時(shí)候正好是我們第一次提交的JS代碼。這樣的話我們沒有做inline的操作,我們沒有內(nèi)嵌inline的JS代碼,我們是用外域加載,而且這個(gè)外域還是在我們的self的限制范圍內(nèi)的,所以說這樣我們就實(shí)現(xiàn)了一個(gè)在CSP這個(gè)限制策略下把我們的JS腳本執(zhí)行起來了,執(zhí)行的時(shí)候就會(huì)把cookie也帶回來,帶回來發(fā)現(xiàn)是一個(gè)64的編碼,我們解碼以后發(fā)現(xiàn)是這樣的,上面寫著set cookie、flag,還有flag的內(nèi)容,有一個(gè)時(shí)間戳,后面是pass,因?yàn)閏ookie有一個(gè)路徑。
我們發(fā)現(xiàn)這只是這道題flag一個(gè)位置的說明,告訴我們這個(gè)cookie在當(dāng)前的根目下是拿不到的,必須要在T2,這個(gè)flag is here這個(gè)路徑下才能拿到cookie。我們就想辦法怎么去讓我們的頁面到這個(gè)目錄下,然后把cookie拿過來以后再傳過來。就是構(gòu)造下面截圖當(dāng)中這樣一個(gè)Payload,就是動(dòng)態(tài)創(chuàng)建一個(gè)iframe的標(biāo)簽,這個(gè)iframe標(biāo)簽的sals字段就是剛才說的那個(gè)存放cookie的目錄。由于它們是在一個(gè)同域下,不存在跨域的問題,所以我們可以在當(dāng)前域去通過瀏覽器對(duì)象獲取到我們創(chuàng)建的iframe標(biāo)簽里面cookie。
大家可以看一下這個(gè)Payload,我們通過兩次提交,第一次提交的時(shí)候把我們接下來要執(zhí)行的JS腳本先提交上去,換回了這個(gè)哈希值,再構(gòu)造一個(gè)script標(biāo)簽,這個(gè)標(biāo)簽的sals屬性就是剛才的那個(gè)referer,這樣的話第二次再提交的時(shí)候,瀏覽器帶著管理員的cookie去訪問這個(gè)地址,間接地就訪問了剛才動(dòng)態(tài)創(chuàng)建iframe的腳本,這個(gè)腳本在iframe的內(nèi)部是目標(biāo)路徑,在這個(gè)目標(biāo)路徑下拿到cookie,然后再通過iframe傳到當(dāng)前的腳本里,再給我們反饋回來。大概就是這樣的流程。
最后的結(jié)果就是截圖里面看到的get后面這樣一大串,這里面就把flag給帶出來了。
楊軍鋒:接下來這道題目是教授的,很多同學(xué)對(duì)這道題目怨氣很大,我都理解,因?yàn)槲覍?duì)它也有挺大怨氣的。下面有請(qǐng)教授。
王宇:為什么要有怨氣?
楊軍鋒:因?yàn)樘y了。
王宇:這道題其實(shí)沒有太大的難度,可能就是題型會(huì)有比較多的東西,因?yàn)樗且粡垐D片做展示,里面肯定是嵌了一些文件,解密有一個(gè)密碼,反正就是比較雜,最后其實(shí)是一個(gè)Crackme算法的逆向。
如果從頭開始說的話,13行代碼就可以完成前兩步的工作,主要是做一個(gè)解碼,把頭簡單修復(fù)一下,就能從圖片里面找到了,當(dāng)然得定位到文件的偏移了,就能從這張圖片里提出一個(gè)壓縮包,壓縮包是給了一個(gè)密碼提示,解密完之后就是一個(gè)標(biāo)準(zhǔn)的Crackme算法的破解題了。
這道題目拿到了Crackme的程序,實(shí)際上如果大家之前看Crackme大賽,你會(huì)發(fā)現(xiàn)這道題目已經(jīng)是難度降得非常低了,它既沒有復(fù)雜的算法,因?yàn)閹讉€(gè)標(biāo)準(zhǔn)的東西,MD5、RC6和VES這些東西,沒有復(fù)雜的算法,也沒有加殼,我沒有選擇加殼,也沒有加venpratict這種變態(tài)虛擬機(jī)殼。理論上只要熟悉算法的話,花的時(shí)間應(yīng)該在兩個(gè)小時(shí)左右。
改的東西是仁者見仁,智者見智,因?yàn)檫@種算法里面可改的地方太多了,我只是隨便挑了幾個(gè)點(diǎn)做了一點(diǎn)兒小微調(diào),但是我做什么微調(diào)呢?作為想解題的人就得做一個(gè)逆操作,這樣的話才能把這個(gè)算法給解出來。
微調(diào)是幾個(gè)地方:
第一,MD5里面的init表里面的初始值,這個(gè)改實(shí)際上對(duì)于題目沒有任何影響,拿它當(dāng)黑盒就可以了,根本不用關(guān)心我這邊改了什么東西。
第二,2、4、6至少變了左移這些東西,左移的位數(shù),包括像矩陣復(fù)值的順序。
第三,AES的算法變了置換表的內(nèi)容和虛化表的內(nèi)容,我如果把這些表的東西都給變了的話,反過來查表的方法這個(gè)函數(shù)可能我也得重新寫一下。
第四,4×4矩陣,我把里面的初始值也給變了,做了一下位移,我記得好像是左移了一位。反過來想去解題,解出key的人,所有的操作都得實(shí)際操作,我做了左移,他們就得做右移。
其實(shí)我覺得只要熟悉這幾個(gè)算法的人,理論上是可以對(duì)比標(biāo)準(zhǔn)算法的生成邏輯,花點(diǎn)兒時(shí)間寫一個(gè)腳本去跑一下我變了什么的逆邏輯。其實(shí)能看出規(guī)律的,因?yàn)槲易笠埔晃?,大家右移就好了,這樣的話就能把所有的東西還原了,這就OK了。
當(dāng)時(shí)寫得還比較倉促,還出了bug,因?yàn)檫@個(gè)代碼實(shí)際上是我2009年、2010年甚至是2008年那會(huì)兒寫的東西,好久沒有維護(hù)了,只不過這次是把它捆在了一張圖片里面,這個(gè)可能是想讓大家多一些樂趣的地方。
我記得有一次我在藍(lán)蓮花參加的一個(gè)比賽,他們的圖片很變態(tài)的,嵌了很多玩意兒。這個(gè)題目其實(shí)真的沒有太多的點(diǎn),我覺得想要高難度還是最后津健老師給大家展示一下流利的英文演講。
楊軍鋒:其實(shí)教授剛才講的這個(gè),他把關(guān)鍵的代碼已經(jīng)貼在這里了,教授給大伙講講哪一個(gè)地區(qū)你做了變化?
王宇:我所有貼出來的地區(qū)都做了變化。
楊軍鋒:好的,那我理解了。
王宇:貼出來的link我是在網(wǎng)上隨便找的,因?yàn)槎际菢?biāo)準(zhǔn)算法,那三個(gè)link都是標(biāo)準(zhǔn)的link,我變的就是這些地方,如果想去找dif的話,就在這些地方找就好了,實(shí)際上沒有幾處。
楊軍鋒:同學(xué)們都看見了。行,有一些同學(xué)會(huì)問,如果他們沒辦法識(shí)別出來這個(gè)RC6的話,那逆回去了難度是不是很高?
王宇:這是一個(gè)好問題,其實(shí)當(dāng)時(shí)為了故意沒有這樣的難度,我隱藏了一些東西,比如說像有些key的生成故意沒有寫init的函數(shù),然后把init的結(jié)果直接寫在代碼里了,做了一些最基本的特征隱藏。但是這一類的東西如果大家熟悉IDA的話,因?yàn)镈IA官網(wǎng)每年都有IDA插件的評(píng)比,有很多插件得年度冠軍的插件,通過bineri級(jí)別、相似度去識(shí)別你代碼里面用了哪些庫,如果大家用那個(gè)庫去分析這個(gè)程序的話,他能非常輕易地識(shí)別出你的代碼里面有多少代碼和RC6的代碼重合度非常高,相似度可能達(dá)到70%、80%、90%,實(shí)際上這個(gè)算法的識(shí)別就跑不了了。AES理論上如果大家熟悉工具,這道題目的解題應(yīng)該很快的。
楊軍鋒:好的,這道題目還有別的補(bǔ)充嗎?或者是有什么延展性的?對(duì)解密這塊你有沒有什么東西要跟同學(xué)們講?
王宇:這些都是基本功,看雪那本書《加密解密》我覺得可能大家都是看得比較早的幾本書之一了,工作中未必能用到,但是這些知識(shí)是應(yīng)該需要掌握的。所以可能把幾個(gè)串起來,再捆上一些圖片逼著自己看一眼,如果能扛下來,這也是一個(gè)進(jìn)步。
楊軍鋒:好的,我們這道題就到這里了。web題還是最受同學(xué)們歡迎的題目,這道題是web題里面最難的一道題目,還是由又帥又瘦的劉老師來跟大家講解一下。
劉瀟鋒:這個(gè)題出的時(shí)候有沒有告訴大家這是一個(gè)代碼審計(jì)題?
楊軍鋒:告訴了。
(由于篇幅限制,想看接下來的內(nèi)容,請(qǐng)搜索下篇)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。