Crackme Terbuka

Jan 07 2023
Panduan Pemula untuk Meretas File yang Dilindungi Kata Sandi
Bersiaplah untuk bersenang-senang meretas! Dalam postingan blog ini, kami akan menunjukkan cara membobol file executable C sederhana yang diamankan dengan kata sandi menggunakan Ubuntu 20.04 LTS.
PC: Spektrum IEEE

Bersiaplah untuk bersenang-senang meretas! Dalam postingan blog ini, kami akan menunjukkan cara membobol file executable C sederhana yang diamankan dengan kata sandi menggunakan Ubuntu 20.04 LTS. Apakah Anda baru memulai atau pro berpengalaman, tutorial ini memiliki sesuatu untuk semua orang. Saatnya melenturkan keterampilan dunia maya itu!

Semua file yang digunakan dalam tutorial ini dapat ditemukan di GitHub di sini . Anda dapat mengkloning repositori ke lingkungan lokal Anda untuk mengakses file terenkripsi.

Untuk memulai, kita dapat mengeksekusi crackmefile untuk mengamati perilakunya dengan menavigasi ke direktori crackme dan memasukkan perintah berikut:

$ ./crackme

Access Denied

Perintah fileini digunakan untuk mengidentifikasi jenis file. Ini dilakukan dengan melakukan serangkaian tes dalam urutan tertentu: tes sistem file , tes angka ajaib , dan tes bahasa .

PC: Di sini

Pengujian ini dirancang untuk menentukan jenis file berdasarkan kontennya dan metadata apa pun yang terkait dengannya. Jika Anda ingin menggunakan fileperintah untuk mengidentifikasi jenis file tertentu, Anda dapat melakukannya dengan menjalankannya file [filename]di terminal. Sebagai contoh:

$ file crackme

crackme: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=e06e0b0229279a69506925702a7f79e36bdc3eb2, not stripped

  1. File yang dapat dieksekusi yang dirancang untuk dijalankan pada sistem operasi Linux 64-bit
  2. Dikompilasi untuk arsitektur x86–64 dan ditautkan secara dinamis, artinya bergantung pada pustaka bersama untuk berfungsi
  3. Ditafsirkan oleh juru bahasa /lib64/ld-linux-x86–64.so.2
  4. Dibuat untuk GNU/Linux 2.6.24 dan memiliki pengidentifikasi unik yang disebut "BuildID"
  5. Belum dilucuti, sehingga masih berisi informasi dan simbol debug yang dapat digunakan untuk analisis.

Perlu dicatat juga bahwa ltracedapat digunakan bersama dengan alat lain seperti gdb( GNU Debugger ) untuk menganalisis lebih lanjut perilaku program dan berpotensi merekayasa baliknya yang tidak akan kami gunakan untuk tutorial ini.

Kita dapat menjalankan ltracefile crack me dengan memasukkan perintah berikut:

$ ltrace ./crackme

__libc_start_main(0x40087d, 1, 0x7ffeef764458, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9)                                                                                                         = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9)                                                                                     = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9)                                                                                                         = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9)                                                                                                    = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9)                                                                                                          = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9)                                                                                                      = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9)                                                                                                            = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9)                                                                                     = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9)                                                                                                  = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9)                                                                                                     = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9)                                                                                         = -4
strncmp("USER=vagrant", "Passw0rd=", 9)                                                                                                            = 5
strncmp("SHLVL=1", "Passw0rd=", 9)                                                                                                                 = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9)                                                                                                       = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9)                                                                                          = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9)                                                                                            = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9)                                                                                     = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9)                                                                                     = -32
strncmp("DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "Passw0rd=", 9)                                                                                     = -12
strncmp("SSH_TTY=/dev/pts/0", "Passw0rd=", 9)                                                                                                      = 3
strncmp("OLDPWD=/home/vagrant/crackme_tut"..., "Passw0rd=", 9)                                                                                     = -1
strncmp("_=/usr/bin/ltrace", "Passw0rd=", 9)                                                                                                       = 15
puts("Access Denied"Access Denied
)                                                                                                                              = 14
+++ exited (status 1) +++

      
                
PC: ALX

  1. __libc_start_mainadalah fungsi yang mengatur lingkungan program dan memanggil fungsi utamanya. Dibutuhkan berbagai argumen dan disediakan oleh pustaka standar C ( libc ). Ini disebut oleh fungsi titik masuk utama program.
  2. Baris yang diawali dengan strncmpmenunjukkan bahwa program memanggil strncmpfungsi, yaitu fungsi yang membandingkan sejumlah karakter tertentu (dalam hal ini, 9 karakter) dari dua string. String yang dibandingkan tampaknya merupakan berbagai variabel lingkungan (misalnya "SHELL", "PWD", "LOGNAME", dll.) dan string "Passw0rd=". Tampaknya program sedang memeriksa apakah ada variabel lingkungan yang dimulai dengan string "Passw0rd=".
  3. Fungsi putsdipanggil di bagian akhir dengan string " Access Denied ", yang mungkin menunjukkan bahwa program mencetak pesan ini jika tidak ada variabel lingkungan yang dimulai dengan "Passw0rd=".

Untuk mengatur variabel lingkungan di Linux, kita bisa menggunakan exportperintah di terminal. Misalnya, untuk menyetel variabel lingkungan bernama Passw0rdke nilai test, kita dapat menjalankan:

export Passw0rd=test

$ ltrace ./crackme

__libc_start_main(0x40087d, 1, 0x7fff085f1d38, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9)                                                                                                         = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9)                                                                                     = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9)                                                                                                         = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9)                                                                                                    = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9)                                                                                                          = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9)                                                                                                      = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9)                                                                                                            = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9)                                                                                     = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9)                                                                                                  = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9)                                                                                                     = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9)                                                                                         = -4
strncmp("USER=vagrant", "Passw0rd=", 9)                                                                                                            = 5
strncmp("SHLVL=1", "Passw0rd=", 9)                                                                                                                 = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9)                                                                                                       = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9)                                                                                          = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9)                                                                                            = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9)                                                                                     = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9)                                                                                     = -32
strncmp("Passw0rd=test", "Passw0rd=", 9)                                                                                                           = 0
MD5_Init(0x7fff085f1b90, 0x400b06, 9, 6)                                                                                                           = 1
strlen("test")                                                                                                                                     = 4
MD5_Update(0x7fff085f1b90, 0x7fff085f2f68, 4, 0x7fff085f2f68)                                                                                      = 1
MD5_Final(0x7fff085f1bf0, 0x7fff085f1b90, 0x7fff085f1b90, 0)                                                                                       = 1
sprintf("09", "%02x", 0x9)                                                                                                                         = 2
sprintf("8f", "%02x", 0x8f)                                                                                                                        = 2
sprintf("6b", "%02x", 0x6b)                                                                                                                        = 2
sprintf("cd", "%02x", 0xcd)                                                                                                                        = 2
sprintf("46", "%02x", 0x46)                                                                                                                        = 2
sprintf("21", "%02x", 0x21)                                                                                                                        = 2
sprintf("d3", "%02x", 0xd3)                                                                                                                        = 2
sprintf("73", "%02x", 0x73)                                                                                                                        = 2
sprintf("ca", "%02x", 0xca)                                                                                                                        = 2
sprintf("de", "%02x", 0xde)                                                                                                                        = 2
sprintf("4e", "%02x", 0x4e)                                                                                                                        = 2
sprintf("83", "%02x", 0x83)                                                                                                                        = 2
sprintf("26", "%02x", 0x26)                                                                                                                        = 2
sprintf("27", "%02x", 0x27)                                                                                                                        = 2
sprintf("b4", "%02x", 0xb4)                                                                                                                        = 2
sprintf("f6", "%02x", 0xf6)                                                                                                                        = 2
strcmp("c4032d9e95a93d91b9b595dcfcca640b"..., "098f6bcd4621d373cade4e832627b4f6"...)                                                               = 51
puts("Access Denied"Access Denied
)                                                                                                                              = 14
+++ exited (status 1) +++

      
                
PC: Here

  1. Kita sudah mengetahui bahwa baris pertama menunjukkan bahwa __libc_start_mainfungsi dipanggil dengan empat argumen: alamat fungsi utama, jumlah argumen program, penunjuk ke array argumen program, dan penunjuk ke fungsi yang akan dipanggil saat fungsi utama pengembalian.
  2. Baris berikut menunjukkan serangkaian panggilan ke strncmpfungsi, yang membandingkan dua string dan mengembalikan bilangan bulat yang menunjukkan urutan leksikografisnya. Tampaknya program mencoba membandingkan setiap variabel lingkungan dalam sistem dengan string "Passw0rd=".
  3. Setelah ini, ada panggilan ke MD5_Init, MD5_Update, dan MD5_Finalfungsi, yang merupakan bagian dari fungsi hash kriptografi MD5 . Sepertinya program menghitung hash MD5 dari nilai variabel lingkungan Passw0rd.
  4. Selanjutnya, ada panggilan ke sprintffungsi, yang memformat string dan menyimpannya dalam buffer. Tampaknya program memformat byte hash MD5 sebagai nilai heksadesimal dan menyimpannya dalam string.
  5. Output menyertakan panggilan ke strcmpfungsi dengan dua string sebagai argumen: "c4032d9e95a93d91b9b595dcfcca640b" dan "098f6bcd4621d373cade4e832627b4f6". Ini menunjukkan bahwa program membandingkan hash MD5 dari kata sandi dengan hash dari variabel lingkungan Passw0rd yang diekspor.
  6. Fungsi putsini dipanggil di bagian akhir dengan string "Access Denied", yang menunjukkan bahwa kata sandi salah. Namun, kemungkinan besar hal ini akan segera teratasi.

Kita dapat menggunakan situs web ini untuk membalikkan string hash ke nilainya.

Sumber: Pusat MD5

Sekarang setelah kami menentukan bahwa kata sandi yang di-hash adalah LionelMessi , kami dapat menyetel Passw0rdvariabel lingkungan ke nilai ini dan menjalankan kembali ltraceperintah untuk melihat apakah menghasilkan hasil yang berbeda. Mari kita coba!

$ export Passw0rd=LionelMessi
$ ./crackme
Access Granted

PC: di sini

Ingatlah selalu untuk menggunakan kata sandi yang kuat dan unik, dan jangan pernah menggunakan kembali kata sandi di akun yang berbeda.

Nantikan rilis kami yang akan datang di GitHub dari program C yang membandingkan hash MD5 dengan kamus dan membalikkannya ke bentuk string aslinya. Tetap disini!

Kami harap Anda menikmati tutorial tentang cracking file sederhana ini. Jika Anda memiliki komentar atau pertanyaan, jangan ragu untuk meninggalkannya di bagian komentar di bawah. Selamat meretas!