Hash MD5 berukuran 16 byte. Jika kita mengubah satu karakter saja pada string yang di hash, maka hash akan berbeda sangat jauh, sehingga hash md5 dapat digunakan untuk mendeteksi kerusakan pada file.
Dengan menggunakan bash
alfakatsuki@justPC:~$ echo -n 'a' | md5sum
0cc175b9c0f1b6a831c399e269772661 -
import hashlib
print hashlib.md5("a").hexdigest()
alfakatsuki@justPC:~$ echo 'AAAAAAAAAA' > testbinary.txt
alfakatsuki@justPC:~$ cat testbinary.txt
AAAAAAAAAA
alfakatsuki@justPC:~$ md5sum testbinary.txt
86d48f739677a6bc11751a9a3fd4a0d1 testbinary.txt
alfakatsuki@justPC:~$ echo 'AAAAAAAAAB' > testbinary.txt
alfakatsuki@justPC:~$ cat testbinary.txt
AAAAAAAAAB
alfakatsuki@justPC:~$ md5sum testbinary.txt
5542eaca4309f3aa71bf384f23eeb966 testbinary.txt
Hash juga digunakan untuk menyimpan password sehingga pihak server pun tidak mengetahui password yang sebenarnya. Password yang dikirim user, dihash, dan hash tersebut disimpan sebagai pencocok apabila user akan login. Sehingga apabila server diserang, keamanan pengguna masih tetap terjaga.
Namun walaupun tidak dapat direverse, hash masih bisa dikembalikan dengan metode bruteforce. Kumpulan word di hash lalu disimpan di internet sebagai database dari word sebelum dihash. Begitulah cara decrypt md5 bekerja dengan mencocokan hash md5 dengan database hash yang dimiliki oleh web tersebut.
Namun beberapa password menggunakan padding atau karakter sampah pada plain text sehingga tidak akan didapat hash yang sama pada database. Kita akan mencoba menyelesaikan soal sederhana untuk mendekrip hash yang memiliki padding.
Saya memiliki hash Quest.
596d4043ad79fc82e7f496daff8dc8e9
. String asli dari hash ini adalah "SARAPANKUY" dengan padding 1 byte di kiri dan satu byte dikanan string. Tugas kita adalah mengirim flag padding yang digunakan dengan format CTF{"hexapaddingkiri"+"hexapadingkanan"}. Contoh jawaban. CTF{'\x41\x41'}Kita dapat menggunakan python untuk membruteforce byte tersebut. Byte berkisar dari 0x00 sampai 0xff.
import hashlib
string = "SARAPANKUY"
hashtrue = "596d4043ad79fc82e7f496daff8dc8e9"
kelar = 0
#untuk membruteforce byte kiri
for i in range(0x00, 0xff):
if kelar == 1:
break
#untuk membruteforce byte kanan
for j in range(0x00, 0xff):
if kelar == 1 :
break
stringbaru = chr(i) + string + chr(j)
hashbaru = hashlib.md5(stringbaru).hexdigest()
print hex(i), hex(j), hashbaru, hashtrue
if hashbaru == hashtrue:
kelar = 1
# 0x99 0x99 596d4043ad79fc82e7f496daff8dc8e9 596d4043ad79fc82e7f496daff8dc8e9
Sekian yang dapat saya bagikan. Semoga bermanfaat bagi kita semua :).
Tidak ada komentar:
Posting Komentar