1. 程式人生 > >轉 信安之路 CTF初識與深入

轉 信安之路 CTF初識與深入

感謝公眾號:信安之路myh0st 授權釋出,這個公眾號的文章堅持技術分享,推薦大家加一下哦!

感受:堅持學習+技術實踐總能找到自己的路!

這段時間一直在忙活CTF相關的東西,從參賽者到出題人,刷過一些題,也初步瞭解了出題人的邏輯;這篇文章就簡單地講一下CTF如何入門以及如何深入的學習、利用CTF這個訓練、學習平臺。

文章裡會涉及的一些資源:http://pan.baidu.com/s/1jIDpV8q

CTF認知

CTF可以理解成一種鍛鍊和學習資訊保安技術的訓練場,具體的解釋在百度以及這篇安全維基~上都有,就不再贅述了。而CTF對信安人員的意義,在我看來,是擴寬我們的安全知識面,以及實戰式應用我們學到的安全知識。隨著《網路安全法》的公佈,以及企業安全意識的增長,信安領域剛入門的小白越來越難找到真實、合法的環境來訓練自己的技能。而CTF的出現,彌補了這個空白。

如何入門CTF

CTF分為Web、Reverse、Pwn、Crypto、Mobile、Misc六大類,我是走web方向的,偶爾也做一下misc。在這篇文章裡,就以web為切入點,講解一下如何開始,以及ctf學習帶給我web技術那些啟示與收穫。

沒有接觸過ctf的小夥伴可以先看看這個

https://ctf-wiki.github.io/ctf-wiki/ #/introduction

裡面對ctf的介紹。

要開始ctf生涯,刷題是第一步,在這裡貼一下精靈大大的ctf訓練場集合:

https://www.zhihu.com/question/30505597

總結得非常全,對於web方向,重點強調一下bugku這個平臺,真的很不錯,題目很經典,只有兩三個腦洞比較大,體驗不是很好。想要學知識的可以先把bugku刷上一遍。

當然,刷題也有刷題的方法,那就是必須要搞清楚題目背後的知識點點原理。不然即使你似懂非懂地拿到了flag,對於個人的成長也是無濟於事。一道題扣一天,搞懂了原理不是浪費時間;照著write up刷了一遍,背後原理啥都不懂才是真的浪費時間。

在這段事件的學習之中有幾個知識點,讓我受益頗多,貼出來給大家分享一下。會盡量找一些可以復原環境的題目,供大家測試。

PS:由於我在寫文章的時候bugku平臺正在維護,所以可能題目連結之後會換,如果連結失效的話,大家可以去搜一下bugku的入口,題目名稱是對應的。

1、Bugku——計算題(http://120.24.86.145:8002/yanzhengma/)

這道題很簡單,在HTML裡限制了輸入數字的長度,所以通過快捷鍵F12,Element處修改長度限制,然後輸入90,getflag就行~

之所以把這麼簡單的題目貼出來,是想要強調一下,瀏覽器的除錯功能,就像這道題裡的可以修改HTML程式碼一樣,Java程式碼以及CSS程式碼都是可控的。在實戰過程中程式設計師將過濾函式或者重要資料寫到了HTML或者Java裡面,我們就可以輕鬆獲取。控制檯也可以執行我們的Java程式碼,實現一些mazing的功能。比如在真實場景就遇到一個,某刷題網站(高中題),是通過js傳送成績資料輸入進資料庫的。這麼一來完全可以攔截下請求,修改資料,分分鐘一百分。

瀏覽器的除錯功能很強大,Chrome的自帶F12就基本夠用,火狐的Firebug外掛也很牛。如果想進一步學習可以看下面的兩個連線:

http: //wiki.jikexueyuan.com/project/chrome-devtools/

http: //www.runoob.com/firebug/firebug-tutorial.html

無論是對CTF還是實戰都非常有用,再次強調,打CTF是為了獲取知識。

2、Bugku——SQL注入1(http://103.238.227.13:10087/)

過濾了幾乎所有的關鍵字,嘗試繞過無果之後發現,下面有個xss過濾程式碼。經搜尋得該函式會去掉所有的html標籤,所以向注入關鍵字中插入<>,就可以不被檢測到,併成功注入;

Demo http://103.238.227.13:10087/?id=1 %20uni %3Chtml %3Eon %20sel %3Chtml %3Eect %20%201,hash %20fr %3C %3Eom %20sql3.key %20w %3C %3Ehere %20id=1--+

Get flag!

這道題並不難,但想要強調的是這種白盒審計的思路。有幸認識一個審計超神的大佬,聽他講審計的時候,就經常見到類似這種情況,本來兩個過濾都很嚴實,但放到一起時,就可以用前一個過濾函式去繞過後一個過濾。這是程式設計師在寫程式時常犯的毛病,指的Mark一下。

3、Bugku——Flag在index裡(http://120.24.86.145:8005/post/)

進入題目發現有一個file引數,檢視原始碼,發現該引數可以包含php檔案,並且題目提示,flag在index.php裡,所以想到可以用php協議來獲取index.php的原始碼。

構造payload:

http:// 120.24.86.145: 8005/ post/index.php? file=php:// filter/ convert.base64-encode/resource=index.php

獲得經過base64編碼後的原始碼,放到hackbar裡解碼一下得:

Getflag~

這道題需要注意兩點,第一就是php協議,在這個檔案包含的點使用php協議就可以讀取任何檔案原始碼,類似地還有data協議,file協議。web協議的種類多,利用方法也多,可謂是實戰中的一大利器。在CTF線上賽中也經常用到,比如上次CUIT校賽以及西安的那個XCTF比賽中就用到了phar://協議。

想要仔細瞭解的夥伴可看一下:

http://php.net/manual/ zh/wrappers.php 4、Bugku——前女友(http://47.93.190.246:49162/)

點開原始碼發現一個txt檔案

訪問得到部分原始碼:

總共考察兩個php弱型別的知識點:

第一個是md5雙等號相等: md5('240610708') == md5('QNKCDZO')

第二個是陣列和字串進行strcmp返回0

所以payload:

http://47.93.190.246:49162/?v1=240610708&v2=QNKCDZO&v3[ ]=123

分類情況,以及少數的幾個知識點~審計相關,以及join,就BUG庫的提醒進行介紹。 Php弱型別算是PHP語言的一大特色了,在CTF中經常遇到,實際的白盒審計中也很常見。 詳細可參見:

https://www.dexcoder.com/RAnders00/article/46025、 Bugku——login1

SQL約束性攻擊,在檢測使用者是否已存在的問題上把控不嚴。介紹文章:

http:/ /www.freebuf.com/articles/web/124537.html

註冊的時候多留幾個空格就可以更改admin的密碼了~

具體原理已經在上面的連結中介紹得很清楚了,就不再贅述了。

CUIT實驗班考核——SQL2

原始碼在壓縮包裡,可自行搭環境測試,過濾了逗號和空格。以下是我寫的writeup:

拿到題後發現:

發現提示裡說,女神喜歡餅乾(COOKIE)所以猜測為COOKIE注入。這時就需要工具了,最方便的是用BurpSuite抓包送到Repeater,然後在原有Cookie後面加上分號

拿到題後,先測閉合情況,找一下原語句是用什麼閉合的,單引號?雙引號?括號?最常見的就是單引號。

測試的方法就是挨個用(1 -1 1’ -1’ 1# -1# 1’# -1’#)來測。本題是用 ’ 閉合的。

然後開始測試段數,使用order by 無回顯後,可以用

- 1’ unionselect1,2,3……n

來測,測到回顯位顯示出我們的數字即可。但這道題在嘗試的時候會報“what are you doing”,應該是某個關鍵詞被過濾掉了。所以在源語句的基礎上依次刪掉某個詞,每次只刪一個,如果都不行,就一次刪兩個。最後測出來是空格和逗號被過濾了~

空格很好繞過,可以用//來繞,檢測是否繞過成功可以用and//1=1#和and/**/1=0#來測。逗號在嘗試編碼繞過無果之後,去網上找到了:

http: //drops.blbana.cc/ 2017/ 05/ 20/SQLi- %E2%80%94%E2%80%94- %E9%80%97%E5%8F%B7%EF%BC%8C%E7%A9%BA%E6%A0%BC%EF%BC%8C%E5%AD%97%E6%AE%B5%E5%90%8D%E8%BF%87%E6%BB%A4%E7%AA%81%E7%A0%B4/

這篇文章,根據文章的內容再去查一下join的語法,再按照SQL注入的常規流程(不清楚的話建議刷一遍sqli)就可以構造出payload。

Payload截圖如下:

爆庫名:

爆表名:

爆列名:

爆FLAG~

小密圈——Mysql字符集問題

這個點非常棒,P師傅(這個部落格必須收藏啊~有沒有)已經講的很清楚了:

https://www.leavesongs.com/PENETRATION/mysql-charset-trick.html8、php4fun——全部

Php4fun原來是一個練習程式碼審計的一套小程式,但後面下線了,需要自己搭環境。本來想把幾個知識點在這裡闡述一下,但發現已經有很詳細的writeup了,再寫就是浪費時間。所以我把wp和原始碼都放到了壓縮包裡,可以自己搭環境玩一玩兒。

小總結

這段時間還做了,“網路安全實驗室”,“XSS Challenges”,和WeChall裡的一些題,但因為我做得很零碎,並且現在還沒有寫writeup,所以相關知識點就不列在這裡了。確實感覺從CTF中學到了很多很多~有個想法:在部落格上連載各大訓練平臺的Writeup,算是為大家服務,如果開始做了的話,會在下一篇CTF文章中,貼出連結的,敬請期待。

在壓縮包裡還有一個p師傅的PPT,關於CTF技巧的,安利一波~

因為我只是一隻web狗,所以其它題型也講不出什麼好東西來~在這裡貼一個之前出現過的連結

https://ctf-wiki.github.io/ctf-wiki/ #/introduction

真的是個好東西。

充分利用上面的一些資源,入門絕對不是問題啦~

哦,對了,做筆記是個很好的習慣,我用印象筆記,聽說國內的為知筆記也不錯~

如何進階CTF

講完了入門的問題,再講講進階,可能講得不好畢竟我是菜鳥

刷完一套bugku就可以嘗試著打打線上賽了

每年都會有各種各樣的比賽,而且感覺會越來越多~

可以在這裡找到最近的一些比賽,取得名次還有有獎勵豈不爽滋滋

https://ctftime .org/

如果因為時間安排,以及其它不可抗因素錯過了某些比賽,可以看官方的writeup來彌補一下。看到精彩處可以嘗試聯絡出題人,要一下題目的原始碼出題人雖然經常被‘追殺’,但人還是很好的除了一些敏感的東西,一般都會給你~

CUIT校賽經驗

下面就我CUIT的校賽,簡單說一下正規線上賽的難度係數與形式。

這場比賽,有兩個大三的學長帶,打起來雖不能說輕鬆,但也算是有驚無險~

我做了雜項和web,雜項在這裡就不說了。感覺考的是加解密的知識儲備以及運氣,對了,還遇到了個離散數學的題,媽媽誒,大一的萌新瑟瑟發抖~

Web部分我感覺題出的非常棒,官方的Writeup很詳細(萌新我還有地方沒搞懂啊)在這裡只是簡單介紹下題目的難度係數

比如,第一題“山水集團”,是一道SQL的題,一上來進行簡單的黑盒測試,然後想辦法繞過過濾,最後的解決為盲注寫指令碼。爆出賬號密碼後,又有一個Mysql字元編碼的繞過(就是上面說的那一點),進後臺之後是無回顯命令執行。

這道題是300分,比賽的時候沒做出來,看wp的時候就感覺師傅們真厲害其它的題目的難度在這道題的上下浮動,具體的可以看一下壓縮包裡的官方wp,(PS:“短域名“裡的那個dict協議真是厲害)

因為是在自己的學校辦的,並且隊伍裡有兩個大三的學長帶,所以有幸通過了線上選拔,參加了線下賽。

線下賽的比賽規則大概是,每個隊伍分一臺伺服器(給你SSH的密碼)。伺服器上的配置都一樣,每支隊伍都需要審計自己伺服器上的程式碼,找出漏洞,去打其它的隊伍。從早上9點到下午5點,共8個小時,中午管盒飯和飲料。每隔10分鐘會在伺服器的固定位置,重新整理flag檔案,拿到flag提交,就可以給自己的隊伍加分,被打的隊伍減分。

感覺線下賽主要打以下幾點:

1、快速白盒審計,發現並補上自己的洞

2、自動化攻擊,利用發現的洞攻擊其它隊伍的洞,用Python實現半自動化。

3、種不死馬,因為沒有提權,所以只能上馬來收割flag,一般的馬很容易被刪,所以可以根據下面的程式碼,來編寫一個自己的不死馬,其實就是無限迴圈生成,並且密碼加密的一個馬,但這種馬只要重啟一下服務就可以殺掉。還有一個更厲害的姿勢,目前還沒有殺掉的方法,等省賽過後再和大家分享吧~

4、審查日誌,可以在伺服器上放個記錄訪問日誌的指令碼,然後根據其它隊伍打你的payload找到漏洞的位置,還可以拿這個payload去打其它隊伍。(PS:比賽的時候發現了其它隊伍的上傳到我們伺服器上的馬,然後我們就很無恥地爆破出了密碼,只有三位數。然後借刀殺人,拿到了7/8臺伺服器,刷了一下午哈)

關於線下賽,這裡有兩個連結講得還不錯,可以學習一波不死馬可以把兩個文章的程式碼結合起來,自己寫一個

http: //bobao. 360.cn/ctf/detail/ 169.htmlhttp: //byd.dropsec.xyz/ 2017/ 05/ 16/CTF %E7%BA%BF%E4%B8%8B%E8%B5%9B%E7%9B%B8%E5%85%B3%E5%B7%A5%E5%85%B7/ index.html 防範思維CTF化

無疑,打CTF是有助於我們技術的提升的,對於學生而言,一個重量級CTF獎狀也將是你入職的敲門磚。

但打比賽與技術水平的高低倒還真沒有必然的聯絡,想要打比賽需要長時間的投入,需要了解出題人的套路,認識很多不喜歡打比賽但很厲害的大佬。而比賽畢竟只是比賽,不是100%的真實環境,多多少少有些出入之處。

所以不要只滿足於拿flag的快感,把從比賽獲得的知識應用到實戰上,拿個站、寫個外掛、審審程式碼什麼的。學,然後用,我認為這才是CTF的正確開啟姿勢。

出題人的一點想法

出題人真的挺難做的,既要想辦法把題目出得有內涵,又要考慮預期之外的解法,還要防“攪屎”(在此為南郵以及bugku裡被攪屎掛掉的幾道getshell題目默哀3分鐘)。

當然,就像p師傅說的,能成功地攪屎,也是一種能力體現。而能防止別人攪屎,是出題人能力的體現。

在這裡貼上一篇“攪屎”教程,和p師傅的Freebuf上的攪屎攻略:

http:/ /www.freebuf.com/articles/web/118149.html

以及P師傅防攪屎攻略:

http: //hack.hk.cn/ 2016/ 04/ 22/ctf %E4%B8%BB%E5%8A%9E%E6%96%B9%E6%8C%87%E5%8D%97%E4%B9%8B%E5%AF%B9%E6%8A%97%E6%90%85%E5%B1%8E%E6%A3%8D/

希望大家能夠從中學到些東西(反正我學到了~嘻嘻)