corp-mail

description
Author: lordrukie x beluga
Rumor said that my office's internal email system was breached somewhere... must've been the wind.
Overview
Challenge ini adalah aplikasi web email korporat berbasis Flask yang dilindungi oleh HAProxy.
Vulnerability: Python Format String Injection (SSTI-like) & HAProxy ACL Bypass. Goal: Mendapatkan akses Admin untuk membaca email user lain (di mana flag berada). Proteksi: Aplikasi menggunakan JWT untuk autentikasi. Endpoint /admin dilindungi oleh HAProxy (kemungkinan diblokir dari luar).
Langkah Penyelesaian
1. Information Disclosure (Format String Injection)
Celah keamanan terdapat pada fitur Update Signature di halaman /settings. Aplikasi mengambil input signature dari pengguna dan langsung memprosesnya menggunakan fungsi formatting tanpa sanitasi yang memadai.
Analisis Source Code (application/routes/user.py):
# ...existing code...
@bp.route('/settings', methods=['GET', 'POST'])
@login_required
def settings():
if request.method == 'POST':
signature_template = request.form.get('signature', '')
formatted_signature = format_signature(signature_template, g.user['username'])
db.execute('UPDATE users SET signature = ? WHERE id = ?', (formatted_signature, g.user['user_id']))Karena signature_template diperlakukan sebagai template, payload berikut akan mengembalikan konfigurasi aplikasi (termasuk JWT secret):
{{ app.config }}Langkah singkat:
- Daftar akun baru → Login → buka
/settings→ masukkan{{ app.config }}sebagai signature → submit → lihat output di halaman profile/preview.

Output berisi konfigurasi aplikasi — catat nilai JWT_SECRET.

2. Forge JWT (menjadi admin)
Dengan JWT_SECRET, kita dapat membuat token baru dengan is_admin set ke 1.
Contoh pembuatan token menggunakan Python (pyjwt):
import jwt
secret = "<JWT_SECRET_FROM_APP>"
payload = {"user_id": 2, "username": "you", "is_admin": 1}
token = jwt.encode(payload, secret, algorithm='HS256')
print(token)Set cookie session menggunakan token baru ini (misal session=...) lalu akses endpoint admin.
Langkah singkat:
-
Ambil Token Asli: Login sebagai user biasa dan ambil cookie session.

-
Decode Token, lalu copy payload token itu ke encode

-
forge Token: Ubah is_admin menjadi 1 dan sign ulang menggunakan secret yang di dapat sebelumnya.

-
Gunakan token baru ini untuk mengakses endpoint admin.

3. Bypass HAProxy (path normalization)
Walaupun token sudah menjadi admin, akses ke /admin diblokir oleh HAProxy ACL.
Namun beberapa server (termasuk Flask) melakukan normalisasi path sehingga //admin diperlakukan sama dengan /admin.
HAProxy sering mencocokkan literal path dan tidak menormalkan //.
Oleh karena itu, gunakan double slash untuk melewati ACL:
GET //admin/user/1/emails
GET //admin/email/5//admin/user/1/emails

//admin/email/5

Flag
C2C{f0rm4t_str1ng_l34k5_4nd_n0rm4l1z4t10n_4c7c96aecc9b}