這題的註解是:
Flag is hitcon{ENCRYPTION_KEY}, and here is a hint for you :P
P.S. If you fail in submitting the flag and want to argue with author, read the source first!
Source 是一個超連結,裡面寫着 assert ENCRYPTION_KEY.islower()
。
如果點進去網站本身的話,會發現這是一個類似精簡版 Reddit (美國 PTT) 的網站。
如果仔細看每個連結的文字和實際上的 URL,會發現 URL 不太單純。它長的像:
<a href="?s=59154ed9ef5129d081160c5f9882f57dcfd76f05f6ac8f1a38114a30fb1839a27fea88c412d9e1149dedcb1c01c0a6662a36d91fd8751e52ba939a65efbe150f9504247abb9fe6be24d3d4dcfda82306">An Innovative Phishing Style</a>
看看周遭的連結,會發現這東西看似沒啥規律,但 URL 長度似乎會和 s=
的內容有關聯。如果把所有 s 參數都抓下來,然後計算它們的長度的話,會發現全部密文長度都是 8 的倍數。
其中有兩個 URL 長度相等,但其密文長度不太一樣。分別是:
8c762b8f22036dbbdda56facf732ffa71c3a372e4530241246449a55e25888cf98164f49a25f54a84ea0640e3adaf107cc67c8f2e688e8adf18895d89bfae58e33ae2e67609b509afb0e52f2f8b2145e
# https://newsroom.fb.com/news/2018/09/security-update/
a164de5c0574559c7181f4ff4ee6693c8740afb01d3c8d6f1c5bc1d931bb57cf2d17cbc566279d6f51fdf7c38111ee10602ad1a9467cb0db9d80eb3c9a5ff4b33674c613d436ac902241ce2f5d5ab0825a6bdd41073fb6e31202b4fcd3e2dc08b0ec4469e20ff376
# https://www.securifera.com/blog/2018/10/07/servicefu/
故此題目的加密法應該是有加入一些 salt (cipher text = url + salt)。
我們可以試著亂改 URL 內的幾個字元。如果寫 script 去測試的話,會發現只有前 96 字是有效的。故我們可以得知以下結論:
常用的 Block Cipher 加密算法有 DES 和 AES 兩種。但 AES 最小是 AES-128,我們的密文長度遠遠不夠。故推測應該是 DES-ECB 組合。
DES 加密當中,只有 56bit 中有用。其 8 倍數的 bit 都是用來做校驗的,故每個字的最後一個字都要丟掉,例如...
bin(ord('b')) -> 01100010 -> 0110001X
bin(ord('c')) -> 01100011 -> 0110001X
因為 key 是英文字母,小寫,故只有 14 個字母可用。難度爲 14^8。
假設把明文以 block size = 8 來拆分的話,會看到結尾有 3ca92540eb2d0a42
。這是因為 PKCS5 的規則下,Padding 的內容要和長度一樣 (例如 block size = 8,要 pad 的爲 8 位,則要寫 0x08 八次)。故我們可以 hashcat 一波,得知密鑰內容。
我們在下一集中會講到此題後續解法和 Oh My Raddit v2。
推薦這篇,這個比 CTFTime 上的清楚非常多。
hitcon2018受虐笔记二:Oh-My-Raddit-1-and-2学习 | wonderkun's|blog
Using padding in encryption