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}