[OSCCTF Qual 2022] – Book

Pada soal ini, kita diminta untuk memasukkan inputan nama dan program akan mengeluarkan hasil enkripsinya dengan model plaintextnya.

Coba kami masukkan nama yang berbeda.

Bisa dilihat jika panjang input nya sama, maka hasil enkripsi block setengah ke belakang juga sama. Berarti kemungkinan besar algoritma yang digunakan AES ECB (ditandai juga dengan judul ‘book’). Jika bagian json merupakan hasil dekripsi dari hex di atas, maka isi flag bisa didapat dari melakukan ecb oracle padding attack.

Visualisasi

Inputan “mamat” ketika dienkripsi =

| {“username”: “ma | #tiap block terdiri dari 16 bytes
| mat”, “flag”: “f |
| lagflagflagflagf |
| lagflagflagflagf |
| lagflagflagfla”} |

*andaikan flagflagflag… adalah string flag aslinya yang belum kita ketahui

Pada karakter pertama flag “f” di block kedua, kita dapat mengetahui nilainya dengan cara mengambil nilai enkripsi biasa dengan input nama mamat, dibandingkan dengan jika inputan nama adalah mamat”, “flag”: “[bruteforcekarakter].

Contoh ketika membruteforce

{“username”: “ma
mat”, “flag”: “a
“, “flag”: “flag
flagflagflagflag
flagflagflagflag
flagflagfla”}
{“username”: “ma
mat”, “flag”: “b
“, “flag”: “flag
flagflagflagflag
flagflagflagflag
flagflagfla”}
{“username”: “ma
mat”, “flag”: “c
“, “flag”: “flag
flagflagflagflag
flagflagflagflag
flagflagfla”}

… dan seterusnya.

Kita bandingkan block kedua hasil enc input normal dengan block kedua hasil enc input bruteforce. Jika hasilnya sama, maka tinggal dilihat karakter apa yang dibrute force. Didapatkanlah karakter pertama dari flag. Poinnya adalah kita harus memposisikan bilangan yang dibruteforce harus berada di akhir setiap block (atau karakter ke-15) setiap block. Dengan proses ini kita menemukan huruf pertama adalah O (dari OSC2022{.*} tentunya)

Bagaimana karakter kedua yang letaknya sudah berbeda block dan tidak di akhir? Input namanya bisa kita manipulasi dengan menambahkan padding sebelum bagian “, “flag”: “. contohnya jadi seperti ini:

Inputan target

{“username”: “ma
matxxxxxxxxxxxxx
xx”, “flag”: “Ol
agflagflagflagfl
agflagflagflagfl
agflagflagfla”}

Inputan bruteforce

{“username”: “ma
matxxxxxxxxxxxxx
xx”, “flag”: “Oa
“, “flag”: “flag
flagflagflagflag
flagflagflagflag
flagflagfla”}
{“username”: “ma
matxxxxxxxxxxxxx
xx”, “flag”: “Ob
“, “flag”: “flag
flagflagflagflag
flagflagflagflag
flagflagfla”}

… dan seterusnya, dan dapatkan karakter kedua.

Seterusnya melakukan cara itu, dan setiap putaran brute padding di awal dikurangi 1 karakter, dan setelah flag”: “ di-append dengan karakter-karakter yang sudah didapat. Lakukan sampai flag lengkap.

Script:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import random
import signal
import subprocess
import socketserver
from pwn import *

def attempt(payload):
    r = remote(‘139.59.117.189’, 4442)
    r.recvuntil(b’namamu?\n’)
    r.sendline(payload)
    r.recvline()
    res = r.recvline().strip().decode()
    r.close()
    return res

payload = b”kodok”
appendance = b””
for trial in range(1, 4):
    for x in range(8):
        paddingan = b’f’*((8*trial)-x)
        normal = payload + paddingan
        target = attempt(normal)
        payload2 = normal + b’\”, \”flag\”: \”OSC2022{‘ + appendance
        print(payload2)
        for i in string.printable:
            brute = payload2 + i.encode()
            res = attempt(brute)
            if target[0:32*(trial+2)] in res:
                appendance+=i.encode()
                print(‘a’)
                break
        if “OSC2022{.*}” in res:
            print(‘done lur’, res)
            break

Tinggal menunggu brute-force an jalan dan dapatkan flagnya kalau sudah bertemu OSC2022{.*}:

Flag = OSC2022{0h_th1s_3cb_sucks}

Leave a Reply

Your email address will not be published. Required fields are marked *