2019年4月29日上午9:00,第五屆XCTF國際聯賽分站賽——*CTF 2019國際賽宣告圓滿落幕。據官方報道,本次賽事共有來自71個國家和地區的1026支隊伍參賽,參賽人數達5078人安勝ISEC團隊本著學習交流、共同提高的目的,與各隊伍同台競技、互相切磋,最終獲得第五名的成績

榜單結果

本次比賽面向全球CTF戰隊,在全球不同地點同時開賽。從4月27日早上9:00開始,比賽持續48小時,賽題分為pwn、reverse、crypto、web、misc幾大類型,偏重於二進位,考察點從基本的彙編指令,到更深一步的高級漏洞利用都有涉及,需要參賽選手有較強的二進位基礎,更考驗隊員之間的默契配合程度

想知道我們的參賽選手們是如何見招拆招、攻克一道道難題的嗎?別急,WriteUp解題思路看這裡.....

一、MISC

misc1:She

Enjoy the game!

HINT:Please combine numbers in the order of the rooms

解題:

通過分析下載文件發現是使用RPG Makr XP製作的一款遊戲,下載RPG Maker XP V1.03 .exe軟體,創建新項目,將項目中的Game.rxproj放到She目錄下,打開文件即可進行遊戲編輯,通過分析代碼將第一隻BOOS的攻擊改為1

圖1

通過老鷹後,顯示一些提示,會有幽靈找你,碰到要重新開始,通過編輯器將幽靈刪除

圖2

有9個門,測試後37無條件打開,雙擊門判斷門打開的前提條件,發現382157這個順序,按照該順序獲取到的數值是371269,按照房間順序排列得到213697。

圖3

根據提示將拿到的數字進行MD5加密,得到d6f3fdffbcb462607878af65d059f274,即為flag。

misc2:babyflash

Recently my younger brother learnt how to make a flash.

Here』s his first work.

解題:

JPEXS反編譯flash.swf得到441張黑白圖片和1個mp3文件。

圖4

令黑的為1、白的為0利用python處理。

圖5
圖6

生成二維碼。

圖7

得到*ctf{half_flag_&,用audacity打開mp3以頻譜圖顯示。

圖8

最後flag*ctf{half_flag_&&_the_rest}

misc3:otaku

One day,you and your otaku friend went to the comic expo together and he had a car accident right beside you.Before he died,he gave you a USB hard disk which contained this zip.Please find out his last wish.

提示:The txt is GBK encoding.

解題:

winhex等工具打開壓縮包去掉偽加密09標識,得到doc的一段話。

圖9

Hello everyone, I am Gilbert. Everyone thought that I was killed, but actually I survived. Now that I have no cash with me and I』m trapped in another country. I cant contact Violet now. She must be desperate to see me and I dont want her to cry for me. I need to pay 300 for the train, and 88 for the meal. Cash or battlenet point are both accepted. I dont play the Hearthstone, and I dont even know what is Rastakhans Rumble.

利用python處理,將此寫入txt,編碼為gbk

根據注釋:

壓縮軟體:winrar版本 5.70 beta 2

配置:zip壓縮文件(低壓縮率)

壓縮方式:標準

下載winrar

圖10

壓縮後進行明文攻擊,密鑰從1開始。

圖11

成功得到口令My_waifu,再解壓圖片zsteg flag.png,最後得到flag*ctf{vI0l3t_Ev3rg@RdeN}

圖12

misc4:Sokoban

Lets play another Sokoban game.

You only have 60 seconds to complete 25 levels,the number of boxes is greater than or equal to 1,less than or equal to 3,and the map size is at most 12*10.

$ nc 34.92.121.149 9091

解題:

根據題目提示進行nc連接。

圖13

發現是一個推箱子的遊戲,需要找到最優解(路徑最短),且在60秒內完成25個關卡。

C++編程實現找到最優解並提交通關。

文件夾下兩個CPP為源文件,a為編譯後的腳本部分代碼:

圖14

運行結果:

圖15

二、CRYPTO

crypto1:babyprng

$ nc 34.92.185.118 10002

解題:

根據題目提示進行nc連接。

圖16

下載py文件,根據程序了解,需要輸入四個字元(字母數字)和隨機的一串字元進行sha256加密,密文要等於給的那串。

py腳本:

圖17

輸入正確的四個字元後進入下一步,需要輸入十六進位數。按題目中的程序,十六進位數有取值範圍,使用py腳本暴力破解符合條件的數

圖18
圖19

由於原本題目中的size為100000,本地根本跑不出來,修改size數值後獲取了一個十六進位數。

圖20

crypto2:babyprng2

nc 34.92.185.118 10003

解題:

第二題和第一題類似,第一步還是sha256,只是第二步多了些十六進位數匹配和數值修改

py腳本:

圖21
圖22

這裡size數值取1,十六進位數為5個,得到結果0004350106。

但在本地測試數值是否正確時,提交幾遍後才出flag。在賽題環境中手動提交一直失敗,而且在重新跑過腳本後出來的結果又不同,懷疑為腳本問題,但本地提交多次都成功,可能為最後隨機數的問題,最終以一個PHP腳本提交答案。

圖23

獲取flag。

圖24

crypto3:notcurves

!!!this challenge is under maintaince. !!! For the sake of fairness you can download the old script.

this challenge is up now! the file has been updated, you can download the old script at here.$ nc 34.85.45.159 20005

解題:

分析Python腳本源程序,發現其是兩層加密,第一層是破解SHA256,求出輸入字元的前4個字元,其破解SHA256的Python源代碼如下。

圖25

將上面破解求出的4個字母字元,提交伺服器即可進入第二層破解演算法

圖26

分析上述代碼,進入這裡的時候,前面很多應該是擾亂代碼,輸入」5」可進入下一步,輸入一個坐標點(u,v),使其滿足條件:(u*v)%p==0,這裡的p是兩個15比特素數的乘積,嘗試多次輸入兩個素數,才使其滿足前面的條件。後來總結時發現其實是可以輸入(0,0)的,這可能是出題者的一個失誤。

圖27

三、WEB

web1:mywebsql

圖28

提示:

圖29

解題:

通過admin/admin弱口令登錄。

圖30

找到一個Mywebsql漏洞:

github.com/eddietcc/CVE

Create a test table (code) and write a shell code in this table.

圖31

Shell地址:

圖32

使用perl反彈shell。

圖33

轉義單引號並url編碼,根目錄下有readflag和flag文件,執行readflag腳本提示一個算術題,需提交答案。由於無法直接輸入,所以需要腳本實現結果的輸入

圖34

使用PHP的proc_open來執行/readflag,並算出隨機算式的答案重定向到程序中獲取flag,附上腳本代碼。

圖35

web2:Echohub

how2stack

圖36

提示:

run.sh =>#!/bin/sh service --status-all | awk {print $4}| xargs -i service {} start sleep infinity;

I am sorry for that `sandbox.php` is basically no use, so this challenge can be solved more easily.

解題:

進入題目,發現在data中提交任意字元都會返回phpinfo,而提交長度過大時會提示emmmmmm...Don attack me!,查看頁面代碼,發現提示:

圖37

提交之後得到源代碼。查看phpinfo,發現disable_functions禁用很多,但是move_uploaded_file函數拼錯了,所以可以利用其上傳文件到指定目錄,但open_basedir中的目錄不存在,所以實際上無法使用。發現stream_socket_client、fputs、fgets、create_function這些函數沒有禁止,所以可以利用其構造一個簡易的phpshell。

查看index.php代碼,通過混淆加密的方式加密代碼,解密之後,查看源代碼,提示「emmmmmm...Don attack me!」時應該是出現了棧溢出,採用srand函數使用時間戳對隨機數進行布種,而時間戳可以通過phpinfo中的server變數得到,故本題中的隨機數都可以預判

預判其棧結構

圖38

修改index.php代碼,將關鍵部分改掉,改成可以生成poc的程序。

圖39
圖40
圖41
圖42

這樣就形成簡易版poc程序,可以得到一個在30秒後執行命令的exp,由於php的create_function函數存在注入漏洞,通過該poc程序,調用create_function函數,就可以執行任意代碼。

這就是構造完畢的exp,在伺服器上觀察一個埠,該exp成功執行後,就可以得到一個php的shell,可以執行任意php代碼,執行結果通過ob_flush();flush();可以輸出到頁面上,也可以賦值給$s變數回顯到shell上。

圖43

接下來就跟0ctf-2019一樣,這裡引用某篇文章說明。

圖45

雖然這個沒有真正做出來,但指明了方向,即使用php-fpm修改php_value來執行命令,php_value中雖然無法修改disable_functions,但是可以修改sendmail_path的地址達到命令執行的效果,而雖然禁用了mail,但是php中發送郵件的函數很多,例如error_log函數

圖46

然後在發送數據包的地方輸出。(伺服器禁用了fsocket系列函數,所以該poc無法正常運行。)

圖47

然後在伺服器上再觀察一次埠,將phpshell中得到的BASE64_CODE通過stream_socket_client發送給php-fpm,這樣就能在伺服器上運行任意命令了,此時反彈一個cmdshell回來。

圖48

得到cmdshell後,執行readflag,發現輸出跟之前的題目類似,則使用之前題目readflag的程序,通過eval得到flag。

圖49
圖50

四、REVERSE

reverse1:yy

Do you love yy ?

解題:

程序邏輯:

根據給定的規則解析並處理輸入。

思路:

根據yyec可以得到合法字符集:*CTF{abcdefghijklmnopqrstuvwxyz0123456789_};

根據輸入取表更新buffer,使用round_key加密buffer(aes_cbc_encrypt),字元_表示進行下一輪處理(重置buffer),將得到的結果與加密串比較;

輸入字元與box的對應關係;

aes_cbc_decrypt即可得到flag;

flag: *CTF{yy_funct10n_1s_h4rd_and_n0_n33d_to_r3v3rs3} 。

reverse2:Obfuscating Macros II

You have seen something like this before,I guess.

解題

程序類似表達式計算。

程序邏輯:

根據輸入的兩個DWORD64進行計算,並與給定的兩個DWORD64比較。

思路:

程序有固定的處理模式: if (xx) { do stuff };

在對應的模式處下斷即可得到完整的處理邏輯。

flag:*CTF{fUnfl@tCf9}。

reverse3:Matr1x

What information is hidden in the matrix?

解題:

3*3魔方

程序邏輯:

魔方每個面上的點都有1個值,計為DWORD v[6][3][3],根據輸入旋轉魔方,計算每個面上點的值。

sum(corner + center) == 給定的值1,

sum(middle + center) == 給定的值2,

計算每個面上的點與另一個數組的點乘, 得到6個DWORD作為flag輸出。

思路:

3個點集合:corner(4*6)、middle(4*6)、center(6)。

窮舉可以確定每個面center、middle、center的值(每個點的具體順序未確定),計算flag並以*CTF{..}作為過濾條件即可得到flag。

flag: *CTF{7h1S_Cu63_is_m4g1c}。

reverse4:fanoGo

Do you kown go & fano encode?

$ nc 34.92.37.22 10001

解題:

Go程序

程序邏輯:

以字典文件corpus.txt初始化編碼器;

if Fano.Decode(輸入) == 給定字元串:輸出flag。

思路:

程序中同時存在Fano.Encode函數,patch程序調用Fano.Encode(給定字元串)並輸出。

flag:*CTF{NUY4a3E5D9186hVzejoyItr7xHBcmOpv}。

五、PWN

pwn1:quicksort

I』m very quick!

$ nc 34.92.96.238 10000

解題:

1.輸入存在棧溢出

圖51

2.棧溢出覆蓋ptr即可實現任意地址任意寫;

3.修改ptr指向got表,即可泄漏libc基址;

4.修改atoi為system,輸入/bin/sh;即可獲得shell。

py腳本:

圖52

pwn2:girlfriend

new libc, new life.

$ nc 34.92.96.238 10001

解題:

1.Double free;

圖53

2.申請大於0x400的堆,然後釋放,可以獲得main_aren_top的地址;

3.Libc2.29在free時會檢查free的地址是否已經在tcache中,要先填滿tcache再觸發double free;

4.fastbin attack修改free_hook指向system;

5.觸發free(「/bin/sh;」)。

py腳本:

圖54
圖55

pwn3:babyshell

An easy shellcode

$ nc 34.92.37.22 10002

解題:

遇到0時就停止檢查,在shellcode前加上push 0即可繞過檢查。

py腳本:

圖56

pwn4:blindpwn

Close your eyes!

$ nc 34.92.37.22 10000

checksec:

Arch:amd64-64-little

RELRO:Partial RELRO

Stack:No canary found

NX:NX enabled

PIE:No PIE (0x400000)

file libc:

libc-2.23.so: ELF 64-bit LSB shared object,

x86-64, version 1 (GNU/Linux),dynamically

linked, interpreter /lib64/ld-linux-x86-64.so.2,

BuildID[sha1]=b5381a457906d279073822a5ceb2

解題:

本題沒有提供程序,給了伺服器和埠,沒有aslr和棧保護。

1.鏈接後提示"Welcome to this blind pwn!",輸入任意內容,提示"Goodbye!";

2.輸入1個超長字元串,沒有看到"Goodbye!",說明溢出了;

3.確定返回地址的位置,修改返回地址(從0x400000開始),直接有返回輸出;

4.從輸出中得到libc基址,one_gadget get shell。

pwn5:upxofcpp

$ nc 34.92.121.149 10000

解題:

1.用upx脫殼;

2.存在UAF漏洞;

3.upx加殼的堆可執行,可以在堆上構造shellcode;

4.申請一個size為6的vec_0和一個size為10的vec_1,釋放vec_0後,vec_0的vtb便指向堆,然後釋放vec_1,再申請一個size為6的vec_3,直接輸入-1,就可以不破壞vec_0的vtb;

5.同上的方法可以使vtb+0x10也指向堆;

6.在vtb+0x10指向的地方構造shellcode

7.調用show,觸發vtb+0x10。

py腳本:

圖57

官方題目地址如下,有需要的小夥伴可進行學習探討:

github.com/sixstars/sta

以上WriteUp,你get到了嗎?

歡迎大家文末留言,共同交流,

也歡迎志同道合的朋友加入ISEC團隊

未來安勝將繼續砥礪前行

以專業的姿態守護網路安全!

安勝作為國內領先的網路安全類產品及服務提供商,秉承「創新為安,服務致勝」的經營理念,專註於網路安全類產品的生產與服務;以「研發+服務+銷售」的經營模式,「裝備+平台+服務」的產品體系,在技術研究、研發創新、產品化等方面已形成一套完整的流程化體系,為廣大用戶提供量體裁衣的綜合解決方案!

我們擁有獨立的技術及產品的預研基地—ISEC實驗室,專註於網路安全前沿技術研究,提供網路安全培訓、應急響應、安全檢測等服務。此外,實驗室打造獨家資訊交流分享平台—「ISEC安全e站」,提供原創技術文章、網路安全信息資訊、實時熱點獨家解析等。

2018年

承擔全國兩會網路安保工作;

承擔青島上合峰會網路安保工作。

2017年

承擔全國兩會網路安保工作;

承擔金磚「廈門會晤」網路安保工作;

承擔北京「一帶一路」國際合作高峰論壇網路安保工作;

承擔中國共產黨第十九次全國代表大會網路安保工作;

承擔第四屆世界互聯網大會網路安保工作。

2016年

承擔全國兩會網路安保工作;

為貴陽大數據與網路安全攻防演練提供技術支持;

承擔G20峰會網路安保工作;

承擔第三屆世界互聯網大會網路安保工作。

2015年

承擔第二屆世界互聯網大會網路安保工作。

不忘初心、砥礪前行;未來,我們將繼續堅守、不懈追求,為國家網路安全事業保駕護航!


推薦閱讀:
相关文章