今年修了交大程安,期末考是用 AIS3 EOF 的初賽算分,很久沒有打 CTF 了,今年出題的品質很高,有很容易出現非預期解的那種題目,寫幾題自己有興趣的 Writeup

Execgen & Execgen-Revenge

這題簡單來說是給了一個 tmpfile,其中 IFS='',並在第一行寫入 #!{{可控}}(created by execgen)

這樣的檔案稱作 Shebang ,其中簡單版寫入沒有限制,困難版有 ^[A-Za-z0-9 /]*$ 的 Regex

tmpfile 執行後因為 IFS 的關係,會把後面所有的參數都當作 argv[1],所以不能用常見的 Command Injection Bypass 技巧繞過,好像很有多種解法,寫下來當作紀錄

預期解(吧)

Shebang 的長度受到 Kernel BINPRM_BUF_SIZE 常數的限制,在大約 2019 之前是 128,之後是 256

exec: increase BINPRM_BUF_SIZE to 256 · torvalds/linux@6eb3c3d
Large enterprise clients often run applications out of networked filesystems where the IT mandated layout of project volumes can end upleading to paths that are longer than 128 characters. Bumpi...

所以用空格或是 / 把長度補到剛好,後面的 (created by execgen) 就會被截斷。

e.g print('/'*233 + 'bin/cat /home/chal/flag')

非預期解 #1 - script

這個是我去翻 /bin 後找到的,在這題之前我也不知道有這種東西

script(1) - Linux manual page

簡單來說用途就是開個 session 並把結果當作檔案寫入檔名 argv[1]  的檔案中,而且這個程式也有支援 -c 的 argument(just like bash),而且更好的是,在 bash 中如果把指令跟 -c 一起放進 argv[1] 的話會被 parse 壞,要分成 argv[1] = -c / argv[2] = {{shell}} 這樣才不會用壞,但 script 的話可以直接放在 argv[1] 中。

所以直接 /bin/script /tmp/{{random}} 就可以拿到一個不回顯的 shell,然後再 /bin/cat /tmp/{{random}} 就可以了

因為是 nobody ,所以要一個能寫入的地方 (e.g. tmp),不然會 Permission denied
雖然 /tmp/{{random}} 尾端會被加上 (created by execgen) 但沒關係,會被當成檔名一起執行。
非預期解 #2 - tee

tee 就是 tee ,把 stdin 給到 stdout,並 clone 一份到 argv[1] 的檔案中,所以跟 #1 差不多,先用 /bin/tee /tmp/{{random}} 寫入一個檔案,然後再用 /bin/bash /tmp/{{random}} 去呼叫即可

Veronese

Trust

Share & ShaRcE

Monsieur de Paris