HITCON CTF 2024
Author: 堇姬Naup
rank: 24th & Taiwan 1st
這次跟bamboofox & starburst kiwawa & b33f一起打,主要看we
Echo as a Service
source code
Dockerfile
1 | FROM oven/bun:1.1.8-slim |
source code
1 | import { $ } from "bun"; |
分析
我們需要執行readflag
,並同時加入give me the flag
這四個參數,就可以拿到flag,這邊有個很明顯的command injection
1 | const output = await $`echo ${msg}`.text(); |
但嘗試了許多payload,特殊符號都會被轉義掉,所以去看一下bun shell的source code(1.1.8 版本的 bun)
https://github.com/oven-sh/bun/blob/bun-v1.1.8/src/shell/shell.zig#L4090
往上追可以找到這些字符會被escape
1 | /// Characters that need to escaped |
其中空格被escape,原本打算使用${IFS}
但都被escape掉,不過其實可以用tab來bypass,不過當我使用
1 | readflag give me the flag |
也不行,所以可能要想其他方法,首先我們想到可以寫到一個檔案裡面執行,但>
被ban了
最後payload我們使用了<
來寫入
首先1<exec
可以開個空檔案,簡單來說就是我把exec這個檔案重新定向到標準輸出,前面的echo印出空字串,所以檔案會抓到他輸出了啥,因次開了空檔案
所以如果用
1 | readflag give me the flag1<exec |
那就可以把你要執行的指令寫進去了
看當前目錄底下有哪些檔案
1 | `ls` |
可以看exec檔案內容
1 | cat<exec |
最後我們使用
1 | sh<exec |
就可以執行檔案裡面的內容了
hitcon{i_found_this_bug_during_LINECTF_but_unfortunately_it_became_1day_challenge_a_few_months_ago}