# Writeup Gemastik 2024 (Warm-up)
Writeup Homebrew untuk warm-up babak penyisihan Gemastik 2024.
Masing masing challenge akan di-rank berdasarkan opini pribadi yang memiliki enum
- Very Easy
- Easy
- Medium
- Hard
- Very Hard
Team Homebrew :
## Forensic
### Stego (Easy)
Kita diberikan sebuah file png bernama `lsb_image.png`, dari sini kita sudah mendapatkan informasi krusial bahwa challenge ini merupakan LSB (Least Significant Bit) steganography.

Secara sekilas tidak menemukan apa apa, tetapi setelah kita analisis menggunakan [StegOnline](https://georgeom.net/StegOnline) menggunakan fitur show Bit Planes, akan memunculkan QR Code Berikut:

gemastik{ctf_2o24_uhuy_d0nk}
### QR Acak (Very Easy)
Kita diberikan satu image yang menunjukkan QR Code yang diacak-acak.

Setelah inspect menggunakan GIMP, ternyata setiap distorsi memiliki offset 10 pixel, dan hanya berlaku untuk segmen genap. dengan pengetahuan ini, kami membuat script python yang akan menggeser segmen ganjil sebanyak 10 pixel kekiri.

dan hasilnya akan menjadi seperti ini

gemastik{siber_as1k_4nd_c0cok}
### Retrivial (Very Hard)
Kang yasin aja yg bikin inimah wkwk, file sm pocnya ada di kang yasin
## Cryptography
### Next Flag (Very Easy)
Diberikan `next_source.py` dan `next_output.py`

Dengan Sekilas, dapat dilihat bahwa enkripsi ini sangat simple, dia mengambil FLAG dan menggunakan library gmpy2 untuk merubah masing masing karakter di flag ( pembacaan char to int) dan mengubahnya menjadi bilangan prima diatasnya yang paling dekat. dan berikut outputnya:

Dengan pengetahuan ini, kita membuat script python untuk dekripsi menggunakan library gmpy2 itu sendiri


## Reverse Engineering
### Mamba Lambda (Very Hard)
Diberikan satu buah file txt yang kelihatannya seperti python bytecode, dengan clue bahwa file tersebut digenerate menggunakan python dis.dis().
diketahui 3 buah fungsi dari snippet file .pyc tersebut.
**Main Function**

Fungsi ini menunjukkan beberapa hal, tetapi yang paling penting adalah ia menggunakan compare operation untuk user input, dan meng-comparenya dengan suatu string yang telah terenkripsi dalam bentuk byte menggunakan fungsi lambda.
**Lambda**

Fungsi lambda ini hanyalah wrapper untuk general expression yang diulang berkali kali sepanjang string length, fungsi genexpr ini akan dijalankan untuk masing masing karakter dalam string dan string dikonversi dalam bentuk byte.
**General Expression**

Fungsi ini berupa runtutan instruksi aritmatika yang akan dilakukan untuk meng-enkripsi string yang diberikan ke fungsi lambda.
**Disassembly**
Kita tahu bahwa
- Fungsi main hanya meng-encrypt dan meng-compare
- Didalam fungsi main ada string flag hasil enkripsi
- Flag pasti diawali string `'gemastik{'`
- Enkripsi menggunakan general expression diatas
Sehingga game-plan kita adalah untuk men-disassemble bytecode ini sehingga dapat meng-enkripsi `gemastik{` menjadi awal yang sama seperti hasil enkripsi pada bytecode.
Setelah membaca dokumentasi dis.dis() python, kita mengetahui bahwa cara kerja instruksi python bytecode adalah menggunakan stack, masing masing variabel akan ditumpuk di dalam stack dan proses aritmatika hanya akan berlaku pada 2 variabel di atas stack, 2 variabel tersebut akan di pop, setelah itu stack akan di push dengan hasil aritmatika yang dilakukan oleh instruksi. maka ketika kita analisis manual fungsi tersebut, kita mendapat fungsi aritmatikanya:
(x + 13371337 * (2024 - x) * (2025 - x)) % 199 + (x + 1) % 25
sehingga kita bisa reconstruksi code python-nya

Tetapi, karena ada % 25, kita tidak bisa tahu value dari byte secara pasti, sehingga kita lakukan bruteforce terhadap byte string akhir sehingga kita dapat flagnya


(95-126 itu maksudnya flagnya lowercase semua, karena kita pikir kalau misalnya formatnya sama seperti flag lain, ada leetspeaknya, dia bakal harus campur range-nya, jadi kita coba yang bruteforce dulu)
## Web (Easy)
### Internal Page

Diberikan source code dan akses ke page-nya. source code menunjukkan bahwa ini adalah page yang dibuat menggunakan nginx, serta ada 2 index.php yang menunjukkan bahwa ada 2 web, web pubkic dan web private.

site.conf menunjukkan bahwa ada 2 proxy yang bergantung pada variabel Host pada header web, apabila Host != internal.gemastik.puspresnas.go.id, maka kita akan ter-kick ke web public, sebaliknya, kita akan masuk web private.
Solusinya simple, ganti variabel Host di header:

Kita bisa masuk ke web private, akan tetapi ada roadblock disini, request harus benar benar datang dari internal. Tetapi apakah betul requestnya tidak dapat di forge?
melihat source code index.php pada web private akan menunjukkan bahwa whitelistnya di hardcode :kekw:

Dan throwback ke config nginx, yaitu site.conf

Satu fungsi ini digunakan sebagai forwarding address, dimana kita bisa melakukan forgery pada X-Forwarded-For secara manual dan membuat agar web tersebut melihat kita sebagai salah satu ip address yang di whitelist
