if99.net

IF99 ITB

Archive for March, 2013

Menipu dengan Kabar Anak Kecelakaan, Modus yang Sudah Basi (Namun Banyak Juga Korbannya)

without comments

Beberapa hari yang lalu pembantu di rumah (kami semua sudah ke kantor dan anak-anak masuk sekolah) menerima telepon dari orang tidak dikenal yang mengaku guru anak saya bernama Agus. Orang bernama Agus itu mengabarkan anak saya jatuh dari tangga di sekolah dan pingsan dan sekarang dia dibawa ke rumah sakit. Agus meninggalkan nomor telepon untuk segera dihubungi.

Tentu saja pembantu di rumah panik, mana hanya dia sendiri di rumah. Namun pembantu saya masih bisa berpikir normal lalu menelpon istri saya di kantor. Istri saya mengabarkan bahwa itu penipuan, sebab tidak ada guru anak kami bernama Agus (itulah pentingnya mengetahui nama-nama guru di sekolah anak kita). Untuk lebih menyakinkan lagi, istri saya menelpon gurunya di sekolah, ternyata anak kami sehat-sehat saja tuh.

Ini kejadian kedua orang tidak dikenal menelpon ke rumah kami. Tahun yang lalu juga ada kejadian yang mirip, kali ini “menimpa” anak saya yang nomor dua. Jam sembilan pagi si penelpon mengabarkan bahwa anak saya yang sedang naik sepeda ditabrak oleh mobil dan sekarang sedang berada di rumah sakit. Dia mengaku sebagai orang yang membawa anak saya itu ke rumah sakit, kemudian meninggalkan nomor telepon untuk dihubungi kembali. Kebetulan waktu itu istri saya sedang berada di rumah karena sedang sakit, jadi pembantu yang menerima telpon langsung memanggil istri saya. Jelas sekali ini penipuan, sebab anak saya tidak mungkin main sepeda pada jam belajar sekolah. Sekolahnya sangat ketat sebab tidak membolehkan murid keluar areal sekolah selama jam sekolah. Jadi, mana mungkin dia berkeliaran di jalan raya pada jam segitu?

Modus penipuan model begini sudah sering terjadi dan korbannya sudah banyak. Modusnya mengabarkan anak atau anggota keluarga kita kecelakaan, lalu kita disuruh menghubungi nomor yang dia berikan. Kalau kita panik maka masuklah kita dalam perangkap si penipu. Orang yang kita hubungi itu ujung-ujungnya mengaku dokter dan mengatakan bahwa anak kita akan dioperasi, tetapi rumah sakit membutuhkan biaya operasi (untuk membeli obat, alat, dan sebagainya) yang harus ditransfer saat itu juga. Dokter gadungan itu menebar “ancaman” bahwa jika operasi telat dilakukan maka nyawa anak kita tidak bisa diselamatkan. Siapapun orangtua pasti tambah panik dan langsung ke ATM untuk mentransfer uang ke rekening dokter palsu.

Berdasarkan cerita yang saya dengar dari korban maupun dari cerita orang-orang, modus penipuan yang saya ceritakan di atas tergolong mudah dipatahkan karena “korban” dan keluarga masih dalam satu kota/lokasi. Bagaimana jika korban terpisah dalam jarak yang jauh? Modus yang pernah saya dengar adalah sebagai berikut:

Targetnya adalah anak atau anggota keluarga yang tinggal di kota lain (mungkin karena kuliah atau bekerja di kota yang jauh). Penipu itu terorganisir melalui jaringan dan sudah mengenal nomor telpon kerabat si target (keluarganya atau teman-temannya). Mula-mula si target ditelpon oleh seseorang yang mengaku polisi. Polisi itu meminta si target mematikan HP-nya dengan alasan sedang melacak sinyal telepon pelaku kejahatan (teroris, penebar narkoba, dsb). Selain si target, polisi gadungan itu juga menghubungi kerabat korban yang tinggal sekota (seperti teman kos, teman kuliah, teman kerja) dan meminta mematikan HP mereka selama satu jam dengan alasan yang sama.

Setelah HP si target dan kerabatnya mati, penipu yang mengaku dokter bernama X menelpon orangtua korban dan mengabarkan si target ditabrak mobil dan sekarang berada di rumah sakit. Dokter gadungan mengatakan si target akan dioperasi tetapi terkendala peralatan medis yang harus diimpor dari Singapura. Dokter gadungan meminta si orangtua mentransfer uang segera supaya alat medis dapat dipesan dan diterbangkan langsung dari Singapura secepatnya agar operasi dapat dilakukan.

Orangtua yang masuk perangkap penipu tentu jalan pikirannya tidak jernih lagi sebab dilanda kepanikan. Ketika HP si anak dihubungi, mati, begitu pula ketika teman-teman si anak dihubungi untuk menanyakan kepastian kecelakaan itu ternyata HP mereka juga mati, tambah paniklah si orangtua. Kondisi makin mencekam setelah dokter gadungan menelpon beberapa kali dengan mengabarkan kondisi si anak yang makin kritis. Jika orangtua masuk dalam perangkap penipu, maka puluhan juta uang melayang via ATM ke rekening penipu.

Seharusnya orangtua menenangkan diri terlebih dahulu lalu mencoba berpikir nomal bahwa rumah sakit manapun tidak punya prosedur menghubungi keluarga untuk meminta biaya operasi. Biaya operasi ditanggung rumah sakit, baru setelah pasien keluar dari rumah sakit biaya operasi dibebankan kepada keluarga korban. Tetapi, penipu memanfaatkan keawaman orang Indonesia yang tidak paham prosedur di rumah sakit. Lebih bagus lagi kalau orangtua memiliki nomor kontak rumah sakit yang dituju, lalu menanyakan apakah betul ada dokter bernama X. Kalau memang ada, tanyakan lagi apakah ada korban kecelakaan bernama anak kita, dan sebagainya. Intinya adalah cek dan ricek itu penting.


Written by rinaldimunir

March 28th, 2013 at 9:23 am

Posted in Pengalamanku

Timing Side Channel Attack

without comments

Dalam tulisan kali ini saya akan membahas tentang side channel attack khususnya timing attack. Kita tentu sering mendengar kata pepatah bahwa ‘Time is money”, ternyata selain dianggap uang, waktu juga bisa dijadikan senjata maut untuk memecahkan kode, kriptografi atau mendapatkan informasi rahasia lainnya.

Side Channel Attack

Timing attack adalah bagian dari keluarga besar side channel attack. Side channel attack adalah serangan yang memanfaatkan kebocoran informasi yang ditimbulkan karena aktivitas yang dilakukan mesin atau program. Seperti halnya di dunia fisik, setiap aktivitas yang dilakukan program sebenarnya menimbulkan “efek samping” atau jejak yang bisa diamati. Seperti menyelesaikan puzzle, dengan mengumpulkan kepingan-kepingan informasi yang bocor ini kita bisa menyelesaikan puzzle.

Kebocoran informasi yang bisa dimanfaatkan untuk side channel attack antara lain:

  • Informasi waktu respons
  • Konsumsi listrik
  • Suara
  • Radiasi elektromagnet

Sebagai ilustrasi coba bayangkan, bagaimana caranya mengetahui apakah Pentagon sedang merencanakan suatu operasi besar ?

pentagon

Mungkin ada yang menjawab, kita harus menyelundupkan mata-mata ke sana. Cara itu memang bisa dilakukan, tapi mengingat Pentagon penjagaannya super ketat, cara itu bisa dibilang mission impossible, sangat sulit, mahal dan beresiko tinggi. Cara lain yang bisa dilakukan dengan mudah dan murah adalah dengan Pizza!

domino

Lho kok bisa, apa hubungannya Pentagon dan Pizza ? Ternyata penjualan pizza Domino berhubungan dengan aktivitas yang dilakukan pegawai Pentagon. Ketika Pentagon sedang merencanakan atau melakukan sesuatu yang besar, maka akan terjadi aktivitas tinggi. Ketika aktivitas tinggi, banyak pegawai yang memesan Pizza sehingga penjualan pizza Domino akan melonjak.

Jadi ternyata informasi yang tampaknya sepele, penjualan pizza, bisa menjadi indikator yang cukup akurat untuk mengetahui apakah Pentagon sedang merencakan operasi besar. Mengenai indikator pizza ini pernah ditulis di washingtonpost.com tahun 1998 lalu.

Lie to Me

Saya termasuk penggemar serial TV “Lie to Me” yang menceritakan tentang seorang bernama Dr. Lightman yang memiliki kemampuan khusus untuk mendekteksi perasaan seseorang hanya dengan mengamati body language seseorang ketika menjawab suatu pertanyaan. Salah satu keahliannya adalah dia bisa menjadi “human lie detector” artinya dia bisa mengetahui apakah seseorang berbohong atau jujur.

lie-to-me

Ekspresi di wajah menunjukkan isi hati seseorang, apakah dia sedang sedih, gembira, marah atau berbohong. Ekspresi ini akan muncul secara alami jadi sulit untuk ditutup-tutupi atau dibuat-buat, kecuali mungkin orang yang sudah sangat terlatih atau mungkin seorang psikopat.

Bisa dikatakan ekspresi di wajah ini adalah bentuk kebocoran informasi yang bila dibaca oleh orang yang ahli bisa membocorkan informasi isi hati seseorang, jadi serangan dengan membaca ekspresi wajah ini juga salah satu bentuk side channel attack.

Timing Attack

Kalau kita cari-cari di internet, banyak sumber yang menyebutkan indikator yang bisa dipakai sebagai lie indicator.

seorang yang berbohong membutuhkan waktu processing lebih lama dari pada kalau dia sedang jujur

Ketika seseorang berbohong dia akan cenderung mengulur-ngulur waktu atau menunda waktu karena dia butuh waktu lebih banyak untuk berpikir. Kata-kata atau gerak gerik yang mengindikasikan bahwa dia sedang mengulur waktu karena butuh waktu processing lebih lama antara lain (sumber) :

  • repeat the question
  • adjust their clothing
  • start by speaking slowly, until confident
  • start with ‘well’, ‘actually’ and other words that delay

Cara mendeteksi kebohongan dengan melihat waktu respons yang dibutuhkan untuk menjawab pertanyaan adalah salah satu bentuk side channel attack atau lebih khusus lagi timing attack.

Timing attack ini adalah serangan yang sulit untuk dicegah karena setiap operasi di komputer membutuhkan waktu untuk mengekesekusinya. Secepat apapun operasi komputer dilakukan tetap saja ada waktu yang terpakai walaupun hanya sekian nanosecond. Waktu eksekusi suatu program bisa berbeda bila input yang diberikan berbeda. Dengan pengukuran yang akurat dari waktu untuk mengerjakan suatu operasi, seorang penyerang bisa membaca dan menebak informasi rahasia

String Matching

Programmer ketika membuat program umumnya menggunakan algoritma yang seefisien dan secepat mungkin waktu eksekusinya, ini sudah menjadi insting dasar seorang programmer. Namun yang jadi masalah adalah insting dasar untuk mempersingkat waktu dalam tempo sesingkat-singkatnya ini justru menjadi kelemahan yang bisa dieksploitasi attacker.

Pseudo code untuk mengetahui apakah dua string sama atau tidak biasanya seperti ini:

Screen Shot 2013-03-27 at 3.24.05 PM

Perhatikan pseudo-code di atas yang pertama dilakukan adalah memeriksa apakah panjang string A dan B sama? Bila berbeda, fungsi langsung berhenti di situ dengan nilai false. Hal ini terlihat sangat logis, bila panjangnya saja sudah berbeda, untuk apa lagi harus memeriksa isinya.

Bila panjang A dan B sama, maka dilakukan pengecekan apakah byte pertama isinya sama? Bila byte pertama sama, fungsi akan berlanjut untuk memeriksa byte kedua, ketiga, keempat dan seterusnya. Namun bila byte pertama isinya berbeda, fungsi juga berhenti disini dengan nilai false. Ini juga sangat sesuai dengan insting programmer, bila byte pertama saja sudah berbeda, untuk apa memeriksa byte kedua, ketiga dan seterusnya.

Lalu dimana sebenarnya masalahnya pseudo-code di atas? Bukankah ini sangat logis dan sesuai dengan insting dasar programmer, menyelesaikan masalah tanpa masalah dan dalam tempo yang sesingkat-singkatnya?

Kebocoran Informasi Waktu

Diagram di bawah ini menunjukkan aktivitas yang dilakukan server untuk memeriksa apakah password yang dikirim client sama dengan password yang tersimpan di server. Setiap aktivitas yang dilakukan server tentu akan memakan waktu yang dalam gambar di bawah ini dilambangkan dengan t0, t1, t2, t3 dan seterusnya.

Screen Shot 2013-03-27 at 2.11.27 PM

Perhatikan pada t0, attacker mengirimkan password. Server akan memeriksa apakah panjang password yang dikirim client sama dengan panjang password yang tersimpan.

  • Bila panjang tidak sama, server akan memberi respons pada waktu t1
  • Bila panjang sama, tapi byte pertama tidak sama, server akan memberi respons pada waktu t2
  • Bila panjang dan byte pertama sama, tapi byte kedua tidak sama, server akan memberi respons pada waktu t3

Dari alur aktivitas tersebut terjadi kebocoran informasi yang fatal, dengan mengamati waktu respons, apakah t1, t2, t3, t4 dan seterusnya, informasi yang bisa didapatkan attacker adalah:

  • Panjang password di server
  • Posisi byte yang salah

Dua informasi tersebut sudah cukup untuk mendapatkan password yang dirahasiakan di server.

Sebenarnya timing attack ada banyak bentuk dan variasinya, tidak hanya string matching saja. Pada dasarnya timing attack bisa dilakukan pada aplikasi yang membocorkan informasi pada clientnya dalam bentuk perbedaan waktu respons.

Sebagai contoh, potongan pseudo-code di bawah ini menunjukkan logika bahwa bila secret key adalah bilangan ganjil maka program akan memanggil fungsi doA() yang diketahui menghabiskan waktu 10 ms, sedangkan bila secret key adalah bilangan genap, maka program akan memanggil fungsi doB() yang lebih lama dibandingkan doA().

Dengan cara mengirimkan informasi ke server dan mengamati waktu responsnya, apakah 10 ms atau 15 ms, seorang attacker bisa mengetahui bahwa secretkey yang dipakai adalah bilangan ganjil atau genap.

Screen Shot 2013-03-27 at 10.44.51 PM

Contoh lain adalah potongan pseudo-code di bawah ini. Ceritanya ini adalah potongan kode yang menangani proses transfer ke suatu rekening tujuan. Bila potongan kodenya seperti ini, maka seseorang yang mengirimkan uang ke rekening tujuan bisa mengetahui saldo rekening tujuan dengan cara mengamati waktu transfer.

Bila ketika transfer ke rekening XXX waktu yang dibutuhkan adalah 1 ms, maka isi rekening XXX diyakini di bawah 100 ribu. Bila ketika transfer ke rekening XXX waktu yang dibutuhkan adalah 5 ms, maka isi rekening XXX diyakini antara 100 ribu sampai 1 juta rupiah. Namun bila waktu yang dibutuhkan untuk transfer adalah 20 ms, maka isi rekening tersebut diyakini berisi lebih dari  satu juta.

Screen Shot 2013-03-27 at 10.44.57 PM

Itu adalah beberapa contoh bentuk-bentuk timing attack. Ada masih banyak lagi bentuk yang lain, tapi dalam tulisan ini saya akan fokuskan pembahasan pada timing attack pada string matching untuk mendapatkan secret key.

Ada yang bisa memberi contoh lain timing attack atau side channel attack di dunia nyata ? Mungkin waktu yang dibutuhkan KPK untuk menetapkan seseorang menjadi tersangka bisa dijadikan suatu indikator, lonjakan jumlah nasi box yang dikirim ke gedung KPK mungkin menandakan akan ada tersangka baru atau akan ada operasi tangkap tangan baru.

Contoh Kasus

Sebagai ilustrasi saya akan memberi contoh kasus yang bisa menunjukkan bagaimana timing attack bisa dilakukan untuk mencuri kunci rahasia. Berikut adalah contoh source code aplikasi (kita sebut sebagai guessme) yang vulnerable terhadap timing attack.

Screen Shot 2013-03-27 at 3.59.50 PM

Aplikasi guessme tersebut membaca file secretkey.txt yang berisi kunci rahasia, kemudian membandingkan dengan input dari user (argv). Bila input argument dari user sama dengan isi kunci dalam file secretkey.txt, maka program akan menampilkan ‘CORRECT’, namun bila salah program akan langsung keluar tanpa pesan apapun. Program di atas vulnerable karena ketika melakukan perbandingan dua string, program akan berhenti ketika panjang tidak sama atau ketika karakter pada posisi tertentu tidak sama.

Karena aplikasi tersebut membutuhkan file secretkey.txt, kita harus membuat file secretkey.txt dulu. Saya membuat script bash kecil untuk men-generate teks random dengan panjang 4-9. Script bash makerandom.sh ini digunakan untuk men-generate kunci rahasia secara random. Dalam skenario ini, sebagai proof of concept, saya sendiri tidak membaca isi file secretkey.txt dan kita harus mengetahui isinya dengan timing attack.

kali17

Setelah program dicompile, berikut adalah apa yang terjadi ketika kita menjalankan program tersebut tapi tidak tahu kunci rahasianya. Setiap kali kita memasukkan kunci yang salah, program akan langsung keluar tanpa berkomentar apa-apa.

kali17

Mengukur Waktu Eksekusi

Cara untuk mengukur waktu eksekusi adalah dengan mencatat waktu sebelum dan sesudah eksekusi kemudian menghitung perbedaan dua waktu tersebut. Agar pengukurannya akurat, kita membutuhkan fungsi yang bisa mendapatkan waktu dengan akurasi sampai nanosecond. Saya menggunakan fungsi clock_gettime() di Linux untuk mendapatkan waktu dengan akurasi sampai nanosecond.

Berikut adalah contoh program yang melakukan pengukuran waktu eksekusi. Perhatikan apa yang dilakukan program ini:

  1. Mengambil waktu sebelum eksekusi dengan clock_gettime
  2. Mengeksekusi program yang akan diukur waktu (dalam contoh ini: guessme) di child process
  3. Parent process menunggu dengan wait() sampai child process selesai menjalankan guessme
  4. Setelah child selesai mengeksekusi guessme, parent mengambil waktu sekarang dengan clock_gettime
  5. Menghitung selisih waktu dalam nanosecond antara sesudah dan sebelum eksekusi

Screen Shot 2013-03-27 at 8.51.48 PM

Bila source di atas dicompile (jangan lupa tambahkan -lrt di gcc) dan dijalankan, maka hasilnya seperti gambar di bawah ini. Output dari program ini adalah input string dan waktu eksekusi dalam nanosecond.

kali17

Ternyata setelah dijalankan waktu eksekusi guessme berbeda-beda dengan rentang yang lebar, terkadang rendah terkadang tinggi atau bahkan tinggi sekali. Mari kita coba jalankan program timingattack ini sebanyak 5.000 kali lalu kita plot hasilnya pada chart.

Screen Shot 2013-03-27 at 9.33.40 PM

Wow hasilnya ternyata cukup berantakan, ada banyak noise dengan nilai yang sangat tinggi atau sangat rendah. Sepintas kalau dilihat logika timing attack itu sederhana, kita hanya mengirim input ke server kemudian mengamati apakah waktu respons dari server adalah t1, t2 atau t3 dan seterusnya. Namun sebenarnya mengukur waktu respons server tidak sesederhana itu, waktu dari respons tidak pasti dan berubah-ubah, tergantung dari banyak faktor, antara lain load CPU, bandwidth jaringan dan faktor lain yang kita sebut sebagai noise/jitter.

Karena adanya noise/jitter itu maka kita tidak bisa mengukur hanya satu kali, kita harus melakukan banyak pengukuran dan mengambil rata-ratanya. Sebelum mengambil rata-ratanya akan lebih baik lagi kalau kita menyaring data agar data dengan nilai yang sangat tinggi atau sangat rendah dihilangkan sehingga lebih mencerminkan waktu eksekusi yang sebenarnya.

Saya menggunakan pendekatan sederhana untuk memfilter noise, semua data hasil sekian banyak pengukuran diurutkan dulu secara ascending, kemudian saya membuang 15% data tertinggi dan 15% data terendah sehingga hanya menyisakan 70% data di tengah yang tidak terlalu tinggi dan tidak terlalu rendah. Data yang telah difilter inilah yang kemudian akan diambil reratanya.

Berikut adalah source code program yang melakukan pengukuran waktu eksekusi sebanyak 10.000 kali, memfilter datanya kemudian mengeluarkan rata-rata waktu eksekusi.

Screen Shot 2013-03-27 at 9.47.15 PM

 Source code di atas mirip dengan yang sebelumnya hanya saja ada penambahan kode di bawahnya untuk melakukan sorting dengan QuickSort, kemudian 15% data tertinggi dan terendah dibuang kemudian dihitung rata-ratanya.

Mencari Panjang Kunci dengan Timing Attack

Pertama yang harus kita lakukan adalah mencari tahu panjang kunci dari waktu respons server. Bila waktu response dari server adalah t1, maka kemungkinan besar panjang password yang kita kirim salah, dan kita harus mencoba lagi dengan password yang berbeda panjangnya, sampai akhirnya kita mendapatkan waktu respons t2 yang berarti panjang password benar, tapi byte pertama salah.

Jadi cara mencari panjang kunci adalah dengan brute force (trial/error), dimulai dengan password yang panjangnya satu, bila salah, coba dengan password yang panjangnya dua, tiga, empat dan seterusnya.

Berikut adalah script bash yang digunakan untuk mencoba password dengan panjang 4-9.

Screen Shot 2013-03-27 at 4.17.11 PM

Dan berikut adalah hasil eksekusi script bash di atas.

kali6

Bila data di atas kita plot dalam chart maka akan terlihat jelas ada perbedaan waktu ketika kita mengirim guess dengan panjang 7 karakter. Ketika menerima input yang panjangnya 7, waktu responsnya sedikit lebih lama dibandingkan kalau panjang input bukan 7. Berdasarkan hasil pengukuran ini, kita cukup yakin bahwa panjang kunci adalah 7 karakter.

Screen Shot 2013-03-26 at 6.35.47 AM

Mencari Karakter ke-1

Setelah mengetahui bahwa panjang kunci adalah 7 karakter, selanjutnya kita harus mulai mencari isinya dimulai dari byte pertama. Cara mencari tahu isi byte pertama adalah dengan mengirimkan input sepanjang 7 karakter “a######”, “b######”, “c######” sampai dengan “z######” dan mengamati waktu respons dari setiap input tersebut. Dari semua input string tersebut, input string yang membuat waktu respons relatif lebih lama dibanding yang lain adalah tersangka utama isi byte pertama.

Screen Shot 2013-03-27 at 10.07.25 PM

Kita membutuhkan satu script lagi untuk melakukan brute force dari a sampai z. Script brutetime.sh di atas membutuhkan  argument berupa prefix (kecuali byte pertama tidak perlu) yang akan diconcat dengan byte yang dicoba dari a-z dan diakhiri dengan postfix berupa deretan karakter ‘#’. Berikut adalah output dari script brutetime.sh di atas.

kali12

Data di atas bila diplot dalam chart akan terlihat seperti gambar di bawah ini.

Screen Shot 2013-03-26 at 2.16.03 PM

Dari grafik di atas terlihat bahwa ketika kita mencoba guess dengan string ‘z######’ waktu responsenya lebih tinggi daripada yang lainnya sehingga kita bisa yakin bahwa karakter pertama adalah ‘z’.

Mencari karakter ke-2

Setelah kita yakin bahwa karakter pertama adalah ‘z’ selanjutnya kita harus mencari karakter ke-2. Caranya adalah dengan mengirimkan input string sepanjang 7 karakter: ‘za#####’, ‘zb#####’, ‘zc#####’ sampai ‘zz#####’ kemudia mengamati waktu respons dari setiap input tersebut. Input string yang membuat waktu responsnya relatif lebih lama dibanding yang lain diduga adalah isi karakter ke-2.

kali13

Chart di bawah ini menunjukkan bahwa waktu respons dari input string ‘zf#####’ relatif lebih tinggi dibanding yang lain, sehingga kita bisa menduga dengan keyakinan tinggi bahwa huruf kedua adalah ‘f’.

Screen Shot 2013-03-26 at 6.42.29 AM

Mencari karakter ke-3

Kita lanjutkan dengan cara yang sama untuk mencari karakter sesudah ‘zf’.

kali7

Dari hasil chart di bawah ini terlihat bahwa input string ‘zfa####’ mendapatkan waktu respons yang relatif lebih lama dibanding yang lain sehingga kita yakin bahwa karakter ke-3 adalah huruf ‘a’.

Screen Shot 2013-03-26 at 6.45.03 AM

Mencari karakter ke-4

Mari kita mencari tahu karakter ke-4 sesudah ‘zfa’. Gambar di bawah ini adalah output dari script brutetime.sh dengan argument zfa (3 karater yang sudah diketahui).

kali14

Pada chart di bawah ini ada satu titik data outlier yang terpencil, berbeda sendiri dari kelompoknya, data ini bisa diabaikan dan dianggap sebagai noise. Waktu respons untuk input string ‘zfam###’ terlihat konsisten lebih tinggi dibanding yang lain sehingga kita bisa meyakini bahwa karakter ke-4 adalah huruf ‘m’.

Screen Shot 2013-03-26 at 6.46.33 AM

Mencari karakter ke-5

Ayo tinggal 3 lagi byte lagi. Gambar di bawah ini adalah output dari script brutetime.sh dengan argument zfam (4 byte yang sudah diketahui).

kali15

Berikut adalah chart dari output data di atas.

Screen Shot 2013-03-26 at 6.49.39 AM

Kali ini hasilnya tidak sebagus sebelumnya. Ada tiga kandidat yang diduga sebagai karakter ke-5, yaitu i, o atau x yang nilainya tidak berbeda banyak. Kalau ada kasus begini kita bisa uji sekali lagi untuk tiga huruf tersebut. Berikut adalah hasil pengujiannya.

kali9

Ternyata hasilnya kandidat zfami## hasilnya konsisten lebih tinggi dari 741 ribu, sedangkan zfamo## dan zfamx## hasilnya jauh di bawah zfami dan setara dengan huruf lainnya. Input string ‘zfamo’ dan ‘zfamx’ ketika ditest terlihat lebih tinggi dari seharusnya mungkin karena CPU load kebetulan sedang tinggi.

Mencari karakter ke-6

Satu lagi karakter yang harus kita cari dengan timing attack adalah karakter ke-6. Dengan cara yang sama dengan yang sebelumnya, berikut adalah output dari script brutetime.

kali16

Hasil di atas ketika diplot sebagai chart memperlihatkan bahwa input string ‘zfamip#’ mendapatkan waktu respons lebih tinggi di banding yang lain sehingga kita yakin bahwa 6 karakter pertama adalah zfamip.

Screen Shot 2013-03-26 at 7.00.47 AM

Mencari karakter terakhir

Mencari karakter terakhir tidak perlu dengan timing attack karena input string yang benar akan meresponse dengan ‘CORRECT’. Kita butuh script untuk melakukan brute force karakter terakhir mulai dari ‘a’ sampai ‘z’. Script di bawah ini adalah script untuk melakukan brute force karakter terakhir.

Screen Shot 2013-03-27 at 10.28.29 PM

Bila script di atas dijalankan kita bisa mendapatkan konfirmasi positif bahwa kunci rahasia yang panjangnya 7 karakter adalah ‘zfamipd’.

kali8

 

Written by Rizki Wicaksono

March 27th, 2013 at 10:54 pm

Posted in Cryptography

Dua dari Tiga Hakim Masuk Neraka

without comments

Hari Jumat yang lalu ada kejadian yang menghebohkan dunia hukum di negeri ini. Seorang hakim yang menjabat Wakil Kepala Pengadilan Negeri Bandung ditangkap oleh KPK di kantornya karena telah menerima uang suap sebesar 150 juta dari seseorang pengusaha (baca beritanya di sini).

Kasus hakim (termasuk juga jaksa) yang ditangkap karena menerima suap dari orang yang terlibat hukum sudah kesekian kali terjadi. Seakan tidak kapok-kapok saja dengan kasus yang serupa, hakim yang culas menjual integritasnya demi seonggok uang. Hakim yang bermental buruk seperti ini berkongkalingkong dengan orang yang terlibat perkara. Hukuman seseorang bisa diatur menjadi ringan atau bebas, tentu saja dengan imbalan berupa uang atau materi.

Di negeri ini apa saja bisa dibeli, termasuk hukum pun bisa dibeli. Kasus-kasus penegak hukum (polisi, jaksa, hakim, panitera) ditangkap karena terlibat korupsi membuat kepercayaan masyarakat kita kepada penegak hukum sudah mencapai titik nadir. Kalau penegak hukum saja sudah mempermainkan hukum, kepada siapa lagi kita harus percaya?

Hakim adalah orang yang dipercaya untuk memutus perkara dengan jujur. Allah SWT mempunyai 99 buah nama (asmaul husna), salah satunya Al-Hakim yang artinya Maha Bijaksana. Allah lah Hakim yang sebenar-benarnya adil karena Dia Maha Bijaksana. Allah memberikan sebagian sifat bijaksana-Nya itu kepada para hakim, agar para hakim dapat memutus perkara dengan adil sebagaimana sifat Allah yang Maha Bijaksana itu. Karena itu, tidak salah bila ada orang yang mengatakan bahwa hakim adalah “wakil Tuhan di bumi”. Kata Rasulullah SAW, Allah selalu bersama seorang hakim selama dia berlaku adil:

Allah beserta seorang hakim selama dia tidak menzalimi. Bila dia berbuat zalim maka Allah akan menjauhinya dan setanlah yang selalu mendampinginya. (HR. Tirmidzi).

Kepercayaan Rasulullah kepada hakim demikian besar, sampai-sampai Rasulullah berkata sebagai berikut:

Barangsiapa diangkat menjadi hakim maka dia telah disembelih tanpa menggunakan pisau. (HR. Abu Dawud).

Lidah seorang hakim berada di antara dua bara api sehingga dia menuju surga atau neraka. (HR. Abu Na’im dan Ad-Dailami).

Oleh karena hakim menjalankan sebagian sifat Allah yang Maha Bijaksana, maka sangat besar murka Allah kepada hakim yang tidak berlaku adil. Dalam sebuah hadis Rasulullah berkata bahwa dua dari tiga hakim masuk neraka karena mereka mengadili tidak dengan kebenaran (termasuk menjual hukum dengan uang):

Hakim terdiri dari tiga golongan. Dua golongan hakim masuk neraka dan segolongan hakim lagi masuk surga. Yang masuk surga ialah yang mengetahui kebenaran hukum dan mengadili dengan hukum tersebut. Bila seorang hakim mengetahui yang haq tapi tidak mengadili dengan hukum tersebut, bahkan bertindak zalim dalam memutuskan perkara, maka dia masuk neraka. Yang segolongan lagi hakim yang bodoh, yang tidak mengetahui yang haq dan memutuskan perkara berdasarkan kebodohannya, maka dia juga masuk neraka. (HR. Abu Dawud dan Ath-Thahawi).

Betapa berat pertanggugjawaban seorang hakim di akhirat kelak, karena itu janganlah para hakim (dan jaksa) mempermainkan hukum. Siksa Allah menunggu para hakim yang bisa dibeli.


Written by rinaldimunir

March 26th, 2013 at 10:24 pm

Posted in Agama,Indonesiaku

Berkunjung ke Kota Mataram di Pulau Lombok (Bagian 3): Ayam Taliwang, Pelecing Kangkung, dan Sate Bulayak

without comments

Ini tulisan terakhir dari seri tulisan jalan-jalan di Mataram. Tulisan pertama dan kedua sudah saya tampilkan beberapa waktu yang lalu. Tulisan ketiga ini menceritakan pengalaman saya menikmati kuliner di Mataram.

Berkunjung ke Pulau Lombok makanan apa yang teringat di dalam kepala? Tentu saja ayam taliwang dan pelecing kangkung. Ayam taliwang adalah masakan asli dari Lombok. Masakan ayam taliwang dapat kita temui dengan mudah di seluruh kota Mataram. Ayam taliwang dijual di restoran, kedai, hingga warung kaki lima.

Kedai ayam taliwang di Jalan Garuda.

Kedai ayam taliwang di Jalan Garuda.

Ayam taliwang adalah ayam kampung berusia muda yang dimasak secara utuh (tanpa dipotong-potong), bisa digoreng atau dibakar sesuai selera. Bila dibakar, maka bumbu-bumbunya adalah bumbu khas Taliwang.

Ayam taliwang sedang dibakar

Ayam taliwang sedang dibakar

Saya membeli seporsi ayam taliwang untuk dimakan di hotel. Satu porsi ayam taliwang terdiri dari satu ekor ayam goreng (atau bakar), pelecing kangkung, sambal pedas dan sambal manis, acar terung bulat, dan lalap ketimun. Hmmm… saya sudah tidak sabar lagi menikmati ayam taliwang sendiri di dalam kamar hote.

Seporsi ayam taliwang (sambal dan teman-temannya masih dibungkus plastik)

Seporsi ayam taliwang dan pelecing kangkung (sambal dan teman-temannya masih dibungkus plastik)

Nah, sambal, acar, pelecing kangkung, dan lalap mentimun sudah dibuka semua.

Nah, sambal, acar,dan sayuran sudah dibuka semua.

Mau?

Selain ayam taliwang, ada lagi makanan khas Lombok yang patut dicoba, yaitu sate bulayak. Sate ini terbuat dari daging ayam atau jeroannya, dan dimakan dengan bumbu yang gurih dan kental (dari santan?) Rasanya pedas dan maknyus. Sate bulayak dapat dimakan dengan lontong yang dibuat memanjang dan dibungkus dengan daun nyiur kelapa.

Sate bulayak dan lontong panjang

Sate bulayak dan lontong panjang

Pedagang sate bulayak dapat kita temui di kawasan kuliner di sepanjang jalan Cendana (jalan ke arah Bandara Selaparang, bandara lama).

Pedagang sate bulayak

Pedagang sate bulayak

Selamat menikmati kuliner di kota Mataram!


Written by rinaldimunir

March 25th, 2013 at 10:32 pm

Toilet di Hotel Berbintang yang Tidak Indonesiani (dan Islami)

without comments

Menginap di hotel adalah kegiatan yang sering saya lakukan ketika ada konferensi ilmiah (nasiona/internasional), diundang sebagai pembicara, atau sebagai pembimbing TA, atau ada tugas dari kantor, baik di dalam negeri maupun di luar negeri. Rata-rata hotel tempat saya menginap adalah hotel bintang 3 atau 4. Baru sekali saja saya menginap di hotel bintang lima. Alhamdulillah, semuanya dibiayai oleh kantor atau pengundang.

Setiap kali saya menginap di hotel, saya sering mengamati kondisi toiletnya. Ini penting bagi saya, sebab kondisi toilet menentukan cara bersuci setelah hadas kecil (pipis) atau hadas besar (BAB).

Yang memprihatinkan bagi saya adalah banyak pengembang hotel mengabaikan budaya orang Indonesia dalam pembangunan hotelnya. Saya memperhatikan beberapa hotel berbintang (terutama hotel bintang empat ke atas) tidak menyediakan selang semprot untuk bersuci setelah hadas. Alat pembersih yang tersedia di samping kloset duduk hanya tisu gulung, seperti pada foto toilet di sebuah hotel di bawah ini.

Kloset duduk tanpa selang semprot buat bersuci.

Kloset duduk tanpa selang semprot buat bersuci.

Membersihkan hadas dengan tisu adalah kebiasaan orang Barat, bukan budaya orang Indonesia. Coba perhatikan toilet di rumah orang Indonesia, hampir tidak pernah kita temukan tisu gulung untuk pembersih hadas. Untuk bersuci setelah hadas yang digunakan adalah air. Orang bule yang datang ke Indonesia mungkin terkaget-kaget kalau menemukan toilet di rumah orang Indonesia hanya menggunakan air untuk bersuci setelah BAB, apalagi bila mengetahui cara membersihkan BAB adalah dengan cara cebok pakai tangan kiri. Mungkin mereka tidak pernah membersihkan hajat dengan teknik cebok itu, ha..ha..ha, mungkin terkesan jorok kali.

Khusus bagi umat Islam, pembersih yang disunnahkan setelah hadas adalah air (baca tulisan ini), hanya pada saat darurat ketika tidak ada air sajalah maka dibolehkan bersuci dengan kertas (tisu), daun, batu, dan sebagainya (baca ini: bersuci dengan batu, tisu, dsb).

Ketika menginap di hotel-hotel berbintang yang tidak menyediakan selang semprot air di samping kloset duduk –hanya ada tisu gulung– maka mau tidak mau kita harus sedikit “kreatif” setelah hadas, misalnya bersuci dengan air yang diambil pakai gelas kaca yang tersedia untuk gosok gigi atau kumur-kumur, atau menggunakan air dari kran atau shower yang terdapat di atas bathub seperti foto di bawah ini. Dari kloset kita harus mengangsur kaki sedikit ke arah kran atau shower tersebut untuk bersuci. Jorok ya, tetapi mau gimana lagi, begitulah kondisinya, jadi terpaksa harus kreatif.

Bathub dengan kran dan shower

Bathub dengan kran dan shower

Di luar negeri (bukan negara-negara berpenduduk muslim), kita menemukan kondisi toilet dengan pembersih hanya tisu gulung seperti foto di atas. Tidak hanya di negara-negara Barat, bahkan di negara di Asia pun kondisinya sama. Ketika saya berkunjung ke Korea tahun lalu, kondisi toiletnya juga sama, hanya ada pembersih hadas dengan tisu gulung, dan hal ini tidak hanya di hotel, tetapi juga di toilet umum, toilet di restoran, toilet di kampus, dan sebagainya.

Makanya saya heran dengan pengembang hotel di Indonesia, apakah mereka membangun hotelnya hanya untuk tamu orang asing saja? Faktanya mayoritas tamu hotel adalah orang Indonesia sendiri, bangsa kita sendiri, yang tidak punya budaya membersihkan hadas dengan tisu gulung. Apalagi dengan penduduk mayoritas bergama Islam, maka seharusnya pengembang hotel memperhatikan kebutuhan umat Islam bersuci dengan air.

Jalan tengahnya adalah menyediakan dua alternatif untuk bersuci, tidak hanya menyediakan tisu gulung, tetapi juga menyediakan selang semprot di samping kloset seperti foto di bawah ini.

Kloset duduk dengan tisu gulung an selang semprot air (Sumber foto: http://muhammadrefa.wordpress.com/2012/01/28/mari-bermain-ke-wc-sma-negeri-12-bandung/)

Kloset duduk dengan tisu gulung an selang semprot air (Sumber foto: http://muhammadrefa.wordpress.com/2012/01/28/mari-bermain-ke-wc-sma-negeri-12-bandung/)

Beberapa hotel yang saya kunjungi menyediakan sekaligus tisu gulung dan selang semprot di samping kloset. Jadi, mau pakai cara apa untuk membersihkan hadas, silakan pilih cara mana yang suka.


Written by rinaldimunir

March 24th, 2013 at 5:32 pm

Posted in Agama,Indonesiaku

Termasuk Gratifikasikah Ini?

without comments

Di milis dosen ITB beberapa waktu lalu pernah ramai diskusi tentang gratifikasi. Jadi ceritanya ada surat edaran dari Ketua KPK, Pak Abraham Samad, tentang larangan menerima gratifikasi. Gratifikasi secara sederhana adalah pemberian (berupa uang, barang, atau fasilitas) terkait dengan tugas dan wewenang seseorang, yang mungkin dapat mempengaruhi orang tersebut dalam mengambil keputusan yang berhubungan dengan si pemberi gratifikasi tersebut (waduh, definisinya masih rekursif). Gratifikasi tergolong dalam bentuk suap, dan perbuatan suap itu termasuk tindak pidana korupsi.

Setelah membaca surat himbauan KPK tersebut, saya jadi mikir-mikir sendiri. Wah, jangan-jangan selama ini saya telah menerima gratifikasi nih dari mahasiswa kami, he..he..he. Lha, kami para dosen sering tuh menerima pemberian dari mahasiswa. Misalnya mereka baru pulang dari kampung halaman sehabis lebaran atau libur panjang, lalu datang ke ruangan dosen membawa oleh-oleh. Ini Pak/Bu, sedikit oleh-oleh dari kampung. Mau ditolak, takut menyinggung perasaan sang mahasiswa, kalau diterima takut dituduh korupsi, serba salah kami jadinya, hi..hi..hi.

Namun, umumnya pemberian oleh-oleh tersebut kami terima juga dengan senang hati. Kami percaya ketulusan hati mahasiswa, mereka memberi oleh-oleh tidak bermaksud menyogok atau menyuap. Ini murni bentuk budaya orang Indonesia yang suka membawa oleh-oleh setelah pulang dari suatu tempat. Apakah oleh-oleh makanan itu kami laporkan ke KPK untuk dikembalikan? Mungkin setiba di KPK oleh-oleh makanan tersebut sudah basi kali.

Saya tidak percaya mahasiswa yang memberi oleh-oleh makanan tersebut bermaksud melakukan gratifikasi. Meskipun mahasiswa yang memberi makanan adalah mahasiswa bimbingan TA atau mahasiswa wali sekalipun, namun saya bisa membaca maksud hati dia tidak bermaksud melakukan suap. Mungkin ceritanya akan lain jika oleh-oleh yang diberikannya itu berupa barang bermerek atau barang berharga seperti ponsel, laptop, atau mobil (wah!). Nah, kalau hadiah seperti ini patut dicurigai, pasti ada udang dibalik bakwan. Jadi semua berpulang kepada hati nurani saja, ketulusan hati seseorang dapat kita ketahui apakah niatnya memberi untuk menyuap atau memang memberi sebagai bentuk keramahan.

Masih terkait dengan hadiah, ada cerita menarik lainnya. Mahasiswa bimbingan TA kami sering memberi hadiah kenang-kenangan setelah mereka selesai diwisuda. Mereka mengatakan ada titipan dari orangtua mereka sebagai tanda terima kasih telah membimbing putra/puteri mereka. Kenang-kenangan itu, selain berupa kue, kebanyakan berupa baju batik, baju koko (untuk shalat), dasi, ikat pinggang, dan sebagainya. Nah yang ini sukar ditolak, sebab merupakan amanat dari orangtua mereka. Orang Indonesia pada dasarnya tahu berterima kasih, mereka mewujudkan tanda terima kasih pada seseorang dalam bentuk pemberian kenang-kenangan. “Untung” saja (kalau dibilang untung) mereka memberikannya setelah proses TA selesai, tentu tidak ada pengaruhnya lagi terhadap nilai TA mereka. Kalau hadiah-hadiah tersebut diberikan selama proses bimbingan TA jelas akan saya tolak, dan untungnya lagi mahasiswa kami memang tidak pernah melakukannya.

Bicara mengenai bimbingan TA tersebut, saya teringat cerita teman yang menjadi dosen di sebuah perguruan tinggi di luar Jawa (tidak perlu saya sebut nama PT nya, negeri atau swasta). Di PT tersebut ada budaya yang sudah mengakar turun temurun dan sudah menjadi cerita dari mulut ke mulut mahasiswa, yaitu tentang budaya gratifikasi. Oknum dosen di sana sering meminta syarat mahasiswa membawa oleh-oleh berupa barang atau makanan kalau melakukan bimbingan skripsi. Bimbingan skripsi sering dilakukan di rumah dosen. Sang dosen bahkan menentukan jenis barang apa yang dibawa, misalnya susu, biskuit, pizza, minuman, dan lain-lain, bahkan amplop berisi uang. Kalau mahasiswa tidak membawa oleh-oleh, pintu rumah dosen tidak akan dibuka. Karena sudah menjadi budaya, maka mahasiswa memenuhi permintaan dosen tersebut tanpa protes. Jelas saja mereka tidak mau protes, kalau protes atau merasa keberatan bisa-bisa urusan skripsinya akan panjang ceritanya, bahkan bisa-bisa tidak lulus karena mahasiswa tidak memenuhi permintaan dosen. Ya, di sebagian daerah dosen itu ditakuti mahasiswanya karena dosen punya kuasa mutlak untuk meluluskan atau tidak meluluskan mahasiswa.

Teman saya melanjutkan ceritanya, membawa oleh-oleh ke rumah dosen sudah menjadi budaya masif di sana. Memang tidak semua dosen melakukan perbuatan tidak pantas tersebut, ada juga satu dua orang dosen yang menolak melakukannya, tetapi yang menolak itu justru dianggap aneh. Lha, sudah menjadi budaya, maka kalau lain sendiri malah dianggap aneh. Mungkin lama-lama yang menolak itu akhirnya terseret arus dan ikut pula melakukannya.

Tidak hanya berkaitan dengan oleh-oleh, kata teman saya, tetapi ada juga transaksi gratifikasi yang berhubungan dengan mata kuliah. Mahasiswa ingin dapat nilai apa, dosen bisa menentukan nilai mata kuliah asalkan mahasiswa membayar sejumlah uang. Bahkan, bila mahasiswa jarang masuk kuliah, tidak ikut ujian, atau tidak membuat tugas, dia tetap bisa lulus dengan nilai ajaib karena sudah memenuhi keinginan sang dosen yang meminta uang sejumlah tetentu.

Saya percaya dan yakin di tempat kami di ITB tidak ada dosen-dosen yang melakukan perbuatan meminta-minta kepada mahasiswa. Saya pribadi tidak membolehkan mahasiswa melakukan bimbingan TA di rumah. Semua urusan terkait akademis harus diselesaikan di kampus. Untungnya juga mahasiswa tidak pernah datang ke rumah saya, kecuali yang mengantarkan undangan pernikahannya beberapa tahun setelah mereka lulus.

Saya mendukung surat himbauan Ketua KPK tersebut. Intinya mengingatkan kita, khususnya yang berkarir dalam bidang akademis, untuk tidak terjebak dalam pemberian gratifikasi dari anak didik.


Written by rinaldimunir

March 21st, 2013 at 11:03 am

Kemasan Makanan Hewan vs Makanan Manusia

without comments

pet_foodSaat melewati lorong makanan hewan di sebuah swalayan, seorang anak berusia 3 tahun bertanya pada ayahnya, apakah makanan yang bergambar anjing dan kucing itu boleh ia ambil untuk dirinya, karena kemasannya begitu menarik. Ayahnya lalu menjelaskan bahwa yang bergambar anjing itu makanan anjing, yang bergambar kucing itu makanan kucing.

Selang beberapa menit kemudian, mereka pun melewati lorong dengan rak berisi sereal. Ternyata ada gambar gorilla, koala, dan lemur (hewan khas Madagaskar). Si anak kecil tadi langsung mengambil kesimpulan, kemasan bergambar gorilla adalah makanan untuk gorilla, kemasan koala untuk koala, kemasan lemur untuk lemur.cereal_food

Ayahnya kemudian memilih untuk diam saja, membiarkan simpul-simpul logika sederhana yang baru diajarkannya tak rusak oleh pengecualian-pengecualian yang begitu ramai mewarnai hidup ini. Ayahnya yakin, akan tiba saatnya si anak akan dapat memahami sendiri apa yang boleh atau tidak untuk dirinya dan mana yang terbaik untuk dunianya.


Written by arifrahmat

March 19th, 2013 at 11:47 am

Advanced Padding Oracle Attack

without comments

Tulisan ini adalah lanjutan dari tulisan sebelumnya yang membahas tentang padding oracle attack. Dalam tulisan sebelumnya saya sudah menjelaskan bagaimana melakukan dekripsi dengan mengirimkan ‘specially crafted’ ciphertext dan menginterogasi ‘the oracle’ apakah hasil dekripsinya menghasilkan padding yang valid atau tidak.

Kali ini saya akan lanjutkan pembahasan padding oracle attack untuk mengenkripsi pesan baru, bukan hanya mendekrip pesan seperti yang sudah dibahas di tulisan sebelumnya. Saya juga akan memberikan contoh aplikasi yang vulnerable dan bagaimana membuat script untuk eksploitasinya.

Bagi yang belum mengerti apa itu padding oracle attack sangat dianjurkan membaca tulisan sebelumnya karena disini tidak dibahas lagi apa yang sudah dibahas di sana.

Padding Oracle Encryption

Dalam tulisan sebelumnya sudah dibahas bagaimana padding oracle attack bisa digunakan untuk mendekrip suatu cipherteks. Namun ternyata tidak hanya itu yang bisa dilakukan dengan padding oracle attack, padding oracle juga bisa digunakan untuk mengenkrip plainteks.

Mari kita sedikit mereview cara kita mendekrip ciphertext dengan padding oracle attack. Dalam contoh pada tulisan sebelumnya kita diberikan ciphertext ’2D7850F447A90B87123B36A038A8682F’ untuk didekrip. Cipherteks tersebut bisa dipecah menjadi 2 blok berukuran 8 byte:

  • C1 = 2D-78-50-F4-47-A9-0B-87
  • C2 = 12-3B-36-A0-38-A8-68-2F

Dalam tulisan sebelumnya pertama kita mendekrip blok dari C2 dulu. Gambar di bawah ini memperlihatkan apa yang terjadi di server ketika mendekrip blok C2 menjadi P2.

Screen Shot 2013-03-17 at 2.38.45 PM

Perlu diperhatikan bahwa P2 adalah hasil XOR antara Decrypt(C2) dengan C1.

  • P2 = Decrypt(C2) XOR C1

Lalu apa artinya? Artinya adalah P2 sangat tergantung dengan blok ciphertext sebelumnya (C1). Jadi bila kita mengirim 2 blok ciphertext, hasil dekripsi blok ciphertext kedua dipengaruhi atau tergantung dari blok ciphertext pertama.

Ingat, ketika melakukan serangan padding oracle attack, kita juga mengirimkan 2 blok ciphertext, blok pertama berubah-ubah ketika melakukan brute force (sedangkan blok kedua tetap) untuk memaksa byte terakhir P2 bernilai seperti yang kita inginkan (01, 02-02, 03-03-03, 04-04-04-04 dan seterusnya). Saya posting lagi gambar di tulisan sebelumnya.

Screen Shot 2013-03-13 at 2.20.57 PM

Dalam gambar di atas kita mengirimkan 2 blok ciphertext, dengan blok pertama nilainya dirancang khusus agar P2 bernilai 08-08-08-08-08-08-08-08.

Kalau kita bisa memaksa P2 bernilai tertentu, artinya kita bisa membuat P2 bernilai apapun yang kita mau, bagaimana caranya? Caranya mudah, yaitu dengan mengirimkan C1 tertentu yang membuat hasil XOR antara Decrypt(C2) dan C1 menjadi yang kita mau.

Dari padding oracle attack kita bisa tahu isi Decrypt(C2), sedangkan C1 adalah nilai yang bisa bebas dikirim oleh client (under attacker’s control), jadi tidak ada kesulitan untuk membuat P2 menjadi bernilai apapun yang diinginkan.

Sebagai contoh, kita ambil kasus dari tulisan sebelumnya. Dari padding oracle attack di tulisan sebelumnya kita sudah mengetahui Decrypt(C2):

  • Decrypt(12-3B-36-A0-38-A8-68-2F) = 64-32-1B-B8-0A-AA-08-86

Berapakah C1 agar P2 menjadi 4b-49-4c-4c-20-49-54-01 (‘KILL IT’ + 1 byte padding).

Screen Shot 2013-03-17 at 3.32.09 PM

C1 (warna hijau pada gambar di atas) bisa dihitung dengan mudah, dengan mengXORkan antara Decrypt(C2) (warna kuning pada gambar di atas) dengan P2 yang diinginkan (warna orange pada gambar di atas).

  • 86 XOR 01 = 87
  • 08 XOR 54 = 5C
  • AA XOR 49 = E3
  • 0A XOR 20 = 2A
  • B8 XOR 4C = F4
  • 1B XOR 4C = 57
  • 32 XOR 49 = 7B
  • 64 XOR 4B = 2F

Bila kita kirimkan C1, 2F-7B-57-F4-2A-E3-5C-87 dan C2, 12-3B-36-A0-38-A8-68-2F seperti gambar di bawah ini, maka bisa dipastikan P2 akan bernilai ‘KILL IT’+01 byte padding, artinya kita berhasil mengenkrip teks baru ‘KILL IT’+01 hanya dengan operasi XOR sederhana walaupun kita tidak mengetahui kunci enkripsinya.

Screen Shot 2013-03-17 at 3.38.07 PM

Jadi secara umum bila kita akan mengenkrip n blok plainteks, maka cara untuk mengenkripnya adalah:

  1. Generate blok Cn dengan isi bebas (random atau null byte)
  2. Dengan padding oracle attack, cari Decrypt(Cn)
  3. Hitung Cn-1 = Decrypt(Cn) XOR Pn
  4. Dengan padding oracle attack, cari Decrypt(Cn-1)
  5. Hitung Cn-2 = Decrypt(Cn-1) XOR Pn-1
  6. Dengan padding oracle attack, cari Decrypt(Cn-2)
  7. Hitung Cn-3 = Decrypt(Cn-2) XOR Pn-2
  8. dan seterusnya

Kenapa kita mulai dengan Cn berisi nilai random ? Karena sebenarnya isi Cn tidaklah penting, apapun isinya nanti hasil enkripsinya akan dipaksa menjadi plainteks yang diinginkan dengan bantuan Cn-1 di sebelah kirinya. Jadi terserah Cn isinya apa, yang penting Cn-1 dikirinya dihitung khusus untuk memaksa hasil dekripsinya menjadi yang diharapkan.

Dalam bahasa sederhana, agar dekripsi Ci menjadi Pi yang diinginkan, harus ditaruh Ci-1 yang sudah dihitung khusus di sebelah kirinya sebagai faktor yang mengoreksi atau memperbaiki hasil enkripsi Ci.

Begitu pula Ci-1 juga akan dikoreksi dengan Ci-2 yang juga sudah dihitung khusus dengan cara yang sama disebelah kirinya agar Ci-1 ketika didekrip menjadi Pi-1 yang diinginkan. Khusus untuk C1, pengoreksinya adalah C0 atau IV.

Contoh Enkripsi

Dalam skenario ini kita diberikan suatu server yang berperilaku sebagai ‘the oracle’, dia akan menjawab dengan padding valid/invalid setiap menerima kiriman ciphertext dari client.

Plainteks yang akan dienkrip: BESOK PAGI SERANGAN UMUM IWO JIMA.

Langkah pertama adalah memecah plainteks menjadi blok berukuran 8 byte termasuk paddingnya:

  1. P1 = ‘BESOK PA’
  2. P2 = ‘GI SERAN’
  3. P3 = ‘GAN UMUM’
  4. P4 = ‘ IWO JIM’
  5. P5 = ‘A’+07+07+07+07+07+07+07

Challengenya adalah kita harus mengenkrip plainteks di atas hanya dengan memanfaatkan ‘the oracle’ tanpa mengetahui kunci enkripsinya.

Kita akan menghitung mulai dari blok plainteks terakhir, P5 kemudian beranjak maju sampai P1. Proses mencari ciphertext adalah:

  1. C5 dipilih bebas secara random
  2. C4 = Decrypt(C5) XOR P5
  3. C3 = Decrypt(C4) XOR P4
  4. C2 = Decrypt(C3) XOR P3
  5. C1 = Decrypt(C2) XOR P2
  6. IV = Decrypt(C1) XOR P1

Decrypt(Ci) bisa dicari dengan padding oracle attack. Saya tidak akan menjelaskan bagaimana caranya, bila anda masih belum mengerti, silakan baca lagi tulisan saya sebelum ini.

Dengan prosedur sederhana ini kini kita sudah punya lengkap IV+C1+C2+C3+C4+C5 yang bila dikirim ke server akan didekrip menjadi plainteks yang kita inginkan ‘BESOK PAGI SERANGAN UMUM IWO JIMA’ walaupun kita tidak tahu kuncinya.

Tools Dekripsi dengan Padding Oracle Attack

Sebelum masuk ke enkripsi dengan padding oracle, kita mulai dulu dengan dekripsi padding oracle. Sebagai studi kasus, saya membuat script php yang vulnerable terhadap padding oracle attack, berikut adalah source codenya.

Screen Shot 2013-03-17 at 8.01.10 PM

Script tersebut menerima input dari parameter GET ‘crypted’ yang berisi IV+ciphertext dalam hex encoded string. Script mengambil 8 byte paling depan sebagai IV, dan sisanya sebagai ciphertext yang akan didekrip.

Ketika dikirimkan ciphertext melalui parameter crypted, script akan mendekripnya dan memeriksa padding hasil dekripsinya. Bila paddingnya valid maka script akan memberi response ‘PADDING OK’, bila padding invalid script akan memberi HTTP response status ’500 Internal Server Error’.

Kita diberikan URL dibawah ini berisi IV+ciphertext dan diminta untuk mendekrip isinya dengan menggunakan padding oracle attack.

http://localhost:8888/kripto/thematrixoracle.php?crypted=0102030405060708C10E6DCBB8CF910B324F2E498BFCFF207832DB0455ADFBD576577FF983EDE9454BCFDFB1F4678929

Script ‘thematrixoracle.php’ tersebut tidak memberikan banyak informasi, bila URL tersebut direquest, maka response yang didapat hanya teks ‘PADDING OK’. Namun bila parameter crypted tersebut diubah sedikit byte terakhirnya dari 29 menjadi 20, maka responsenya tidak ada, hanya status code 500. Gambar di bawah ini adalah ketika script tersebut direquest.

Screen Shot 2013-03-18 at 2.08.19 PM

Hanya dengan mengirimkan ‘specially crafted’ ciphertext dan menginterogasi ‘the oracle’ apakah ciphertext tersebut ketika didekrip menghasilkan plainteks dengan padding yang valid atau tidak, kita bisa mendekrip suatu cipherteks.

Source code dibawah ini adalah tools yang saya buat dengan python untuk melakukan padding oracle attack ke URL di atas.

Screen Shot 2013-03-18 at 12.49.33 PM

Screen Shot 2013-03-18 at 1.36.19 PM

Di bawah ini adalah rekaman screen recording ketika tools diatas dijalankan untuk mendekrip ciphertext yang diminta. Tools tersebut berhasil mendekrip ciphertext yang diminta menjadi ‘Serangan Umum 1 Maret jam 6 pagi’ walaupun tanpa mengetahui kuncinya sama sekali.


Tools di atas terlihat mendekrip ciphertext satu byte per satu byte sampai akhirnya semua ciphertext berhasil didekrip.

Tools Enkripsi dengan Padding Oracle Attack

Oke saya sudah menunjukkan sebuah contoh padding oracle dan tools untuk mengeksploitasinya yang digunakan untuk mendekrip suatu ciphertext. Ingat padding oracle tidak hanya bisa dipakai untuk mendekrip ciphertext, tapi kita bisa mengenkrip plainteks apa saja yang kita inginkan walaupun tanpa mengetahui kuncinya.

Di bawah ini adalah source code yang saya buat juga dengan python untuk mengenkrip suatu teks menggunakan padding oracle attack, tanpa mengetahui kuncinya.

Screen Shot 2013-03-19 at 6.22.37 AM

Screen Shot 2013-03-18 at 1.38.06 PM

Kalau dilihat source code padfinder.py sebelumnya, yang dipakai untuk mendekrip, dengan tools padenkrip.py untuk mengenkrip di atas tidak banyak bedanya. Baik enkrip maupun dekrip keduanya memang sama-sama mengirimkan ‘specially crafted’ ciphertext dan menginterogasi ‘the oracle’. Namun ada sedikit perbedaan di antara keduanya.

Bedanya hanya ketika melakukan dekripsi, hasil Decrypt di-XOR dengan ciphertext blok sebelumnya, sedangkan ketika melakukan enkripsi, hasil Decrypt di-XOR dengan plaintext yang diinginkan (ditarget).

Berikut adalah rekaman screen recording ketika tools di atas dijalankan untuk mengenkrip teks ‘BESOK PAGI SERANGAN UMUM IWO JIMA’. Setelah berhasil mengenkrip, untuk menguji apakah ciphertextnya benar atau salah. Cciphertext tersebut coba didekrip dengan padding oracle attack yang sama menggunakan tools padfinder.py yang sudah ditunjukkan dalam rekaman screen recording di atas.


Solving CTF Challenge

Saya menemukan sebuah challenge CTF yang mengeksploitasi padding oracle attack. Peserta diberikan URL berikut:

http://y-shahinzadeh.ir/padding-oracle/index.php?Str=51afc6b478d9031efdffca538c68dd4cfb7dbaba9b28d756

Bila URL tersebut dibuka di browser maka akan terlihat aturan dan goal dari challenge ini beserta plainteks hasil dekripsi cipherteks yang dikirim melalui parameter GET ‘Str’ bila padding plainteksnya valid.

Screen Shot 2013-03-19 at 5.59.04 AM
Screen Shot 2013-03-19 at 5.55.19 AM

Namun bila cipherteks yang dikirim plainteksnya tidak mengandung padding yang valid, akan terlihat pesan ‘Wrong padding’.

Screen Shot 2013-03-19 at 5.57.46 AM

Goalnya adalah kita harus mengenkrip teks ‘haroldabelson’ dan mengirimkan cipherteksnya ke URL tersebut. Goal berhasil tercapai bila URL tersebut memperlihatkan bahwa cipherteks yang kita kirim berhasil didekrip menjadi teks ‘haroldabelson’ yang diminta.

CTF ini mirip dengan PoC yang kita buat, jadi tools untuk eksploitasinya juga tidak banyak perubahan. Saya hanya perlu mengubah URL target dari localhost ke url CTF ini dan mengubah kondisi valid paddingnya. Kondisi valid paddingnya bukan lagi status ’200 OK’ tapi padding disebut valid bila HTML responsnya tidak mengandung kata ‘Wrong’.

Screen Shot 2013-03-19 at 6.17.40 AM

Karena iseng saya tidak akan mengenkrip teks ‘haroldabelson’ seperti yang diminta, saya akan mengenkrip tag HTML untuk melihat apakah hasil dekripsinya langsung di-dump ke client tanpa validasi atau ada validasi XSS dulu.

Screen Shot 2013-03-19 at 6.07.30 AM

Hasilnya ternyata memang tidak ada validasi XSS, cipherteks yang saya kirim langsung didekrip dan di-dump ke browser client tanpa dilakukan filtering atau validasi.

Screen Shot 2013-03-19 at 6.11.08 AM

Padding Oracle dan Authenticated Encryption

Padding oracle bisa dipakai untuk mendekrip pesan itu memang berbahaya karena mengancam confidentiality data. Namun sebenarnya enkripsi dengan padding oracle tidak kalah bahayanya dari dekripsi.

Bayangkan dalam situasi perang bila orang lain bisa membuat encrypted message palsu yang menyesatkan dengan kunci yang benar tanpa harus tahu kunci enkripsinya. Pihak yang menerima pesan palsu tadi akan mengira pesan tersebut ‘legitimate’ karena bisa didekrip dengan sempurna dan hasil dekripsinya pun menghasilkan pesan yang bisa dimengerti.

Don’t use encryption without message authentication

Ingat enkripsi hanya memberikan jaminan confidentiality, enkripsi tidak menjamin integrity dan authenticity. Kesalahan yang umum dilakukan adalah menggunakan enkripsi tanpa adanya message authentication. Padding oracle attack terjadi karena server langsung mendekrip ciphertext yang diterima, tanpa sebelumnya memeriksa apakah ciphertext tersebut terjamin integrity dan authenticitynya.

Seharusnya selain enkripsi, dibarengi juga dengan MAC untuk menjamin integrity dan authenticity dari pesan. Server tidak boleh mendekrip ciphertext sebelum yakin bahwa ciphertext tersebut integritasnya terjamin dengan cara memverifikasi MAC.

Written by Rizki Wicaksono

March 18th, 2013 at 3:33 pm

Posted in Cryptography

Bajigur dan Kacang Rebus Aki Jupri

without comments

Hampir setiap hari di depan rumah saya lewat pedagang bajigur yang sudah aki-aki (bahasa Sunda, artinya kakek-kakek). Sambil mendorong gerobak kecilnya dia meneriakkan dagangannya, bajiguuurrr….bandreeekkk… kacang rebuuuus…. Terdorong karena rasa iba saya pun memanggilnya, sekalian ingin membeli dagangannya itu.

Gerobak bajigur dan bandrek Aki Jupri

Gerobak bajigur dan bandrek Aki Jupri

Pak Jupri namanya, tapi karena sudah aki-aki saya memanggilnya aki Jupri saja. Dia pedagang keliling di kawasan Antapani. Setiap pagi dia menjajakan dagangannya, tidak hanya bajigur dan bandrek, tetapi juga jajanan sehat lain yang serba rebus atau kukus, seperti ketimus, lepet pisang, singkong rebus, pisang rebus, dan kacang rebus.

Aki Jupri dan dagangannya.

Aki Jupri dan dagangannya.

Ketimus, lepet pisang, kacang rebus, pisang rebus, singkong rebus, semua ada di dalam gerobak bajigur aki Jupri

Ketimus, lepet pisang, kacang rebus, pisang rebus, singkong rebus, semua ada di dalam gerobak bajigur aki Jupri

Semua jajanan itu harganya murah meriah, hanya seribu rupiah per buah, sedangkan bajigur atau bandrek dua ribu rupiah per gelas besar. Hmm… rasa bajigurnya enak sekali. FYI, bajigur adalah minuman khas Bandung, terbuat dari campuran santan dan gula merah ditambah daun pandan. Rasanya yang manis lebih enak diminum dalam keadaan panas panas. Lebih enak lagi minum bajigur sambil ditemani makan jajanan tadi, seperti singkong, kacang rebus, dan lepet. Sedangkan bandrek adalah minuman hangat rasa jahe, terbuat dari air gula merah ditambah jahe dan ramuan lainnya. Bandrek lebih nikmat diminum pada hari dingin atau malam hari untuk menghangatkan badan.

Saya membeli dagangan aki Jupri cukup banyak dengan niat melariskan dagangannya. Ketimus, kacang rebus, singkong, lepet, dan segelas besar bajigur saya borong. Kalau pun tidak akan habis sendiri, pembantu di rumah bisa menghabiskan :-) .

Aki Jupri sedang mengambilkan segelas bajigur

Aki Jupri sedang mengambilkan segelas bajigur

Ini jajanan aki Jupri yang saya beli

Ini jajanan aki Jupri yang saya beli

Tahukah anda, pedagang bajigur seperti aki Jupri ini masih banyak berjualan di Bandung. Mereka umumnya sudah tua-tua seperti aki Jupri. Gerobak dorongnya sangat khas, ya seukuran seperti pada gambar di atas. Mereka berdagang pada pagi hari atau sore hingga malam hari. Meskipun saat ini jajanan modern dan serba instan menyerbu toko-toko dan warung-warung, namun penggemar jajanan tradisionil masih ada.

Saya bertanya kepada aki Jupri, berapa umurnya sekarang. Betapa kaget saya, aki Jupri umurnya ternyata sudah 81 tahun! Dia sudah mengalami tiga zaman, yaitu zaman Belanda, zaman Jepang, dan zaman kemerdekaan sekarang. Aki Jupri sudah berdagang bajigur selama 31 tahun, yaitu sejak tahun 1982. Semua dagangannya itu dikerjakannya sendiri, mulai dari membeli bahan di pasar, mengolahnya, merebusnya, hingga menjajakannya. Semua bahan yang dia olah adalah dari kualitas nomor satu. Gulanya dari gula kawung, singkongnya singkong madu, pisangnya juga dari pisang yang bagus. Meskipun begitu, dia tetap menjualnya murah, hanya seribu rupiah per butir.

Aki Jupri dengan latar belakang gerobaknya

Aki Jupri dengan latar belakang gerobaknya

Aki Jupri mempunyai banyak anak, cucunya saja sudah 17 orang. Kata aki, anak-anaknya sudah melarang aki untuk tidak berdagang lagi, kasihan kata anak-anaknya, biar aki istirahat saja di rumah. Namun bagi aki Jupri, justru kalau duduk-duduk saja di rumah malah membuatnya sakit. Memang, orang kalau biasa bergerak lalu disuruh berhenti justru penyakit yang datang. Saya perhatikan badan aki Jupri terlihat sehat, mungkin hal ini karena efek berjalan kaki sambil mendorong gerobak yang dilakukannya setiap pagi. Memang yang terbaik buat aki adalah terus berjualan sampai dia sudah tidak mampu lagi berjalan.

Sekarang saya jadi pelanggan aki Jupri. Mudah-mudahan aki Jupri selalu diberi kesehatan oleh Allah YMK, agar saya tetap bisa membeli bajigurnya seringkali.


Written by rinaldimunir

March 18th, 2013 at 1:58 pm

Bawang Putih dan Bawang Merah Disebutkan Secara Eksplisit di dalam Al-Quran

without comments

Bumbu masak yang menjadi “hot topic” bulan ini adalah bawang merah dan bawang putih karena harganya yang melonjak luar biasa. Gara-gara kedua komoditas masak itu hebohlah masyarakat senegara. Fenomena ini mengingatkan kita beberapa tahun yang lalu ketika harga cabe meroket. Kenapa tidak, bawang merah dan bawang putih adalah pelengkap masak yang sangat penting. Saya rasa tidak ada masakan Indonesia maupun masakan asing yang tidak menggunakan bawang putih atau bawang merah. Tanpa bawang rasa masakan menjadi hambar tidak berselera. Begitu pentingnya keberadaan bawang bagi bangsa Indonesia, maka ketika harganya berlipat-lipat tidak seperti biasanya seperti sekarang, maka yang timbul adalah kehebohan nasional. Bayangkan harga sekilo bawang putih saat ini Rp80.000, sedangkan bawang merah lebih dari Rp40.000 (biasanya tidak sampai belasan ribu sekilo). Tidak hanya ibu-ibu yang mengeluh, tetapi para pedagang makanan seperti pengusaha rumah makan, pedagang bakso, pedagang nasi goreng, dan lain-lain ikut terkena dampak.

Saya tidak akan membicarakan tentang sebab musabab mahalnya harga bumbu dapur tersebut, tapi kali ini hubungan bawang dengan kitab suci. Percayakah anda bahwa bawang putih dan bawang merah ternyata disebutkan secara eksplisit di dalam kitab suci, yaitu Al-Quran. Selain disebutkan nama bawang, juga mentimun, dan kacang adas. Di dalam Al-Quran tidak banyak nama-nama tumbuhan yang disebutkan dengan jelas. Yang saya ingat adalah korma, gandum, bawang merah, bawang putih, mentimun, dan kacang adas. Ada yang lain?

Begini ceritanya penyebutan bawang putih dan bawang merah. Ketika itu Nabi Musa a.s membawa umatnya (bangsa Yahudi) keluar (eksodus) dari negeri Mesir menuju tanah yang dijanjikan. Rombongan itu terdiri dari kabilah-kabilah (suku-suku) yang sangat banyak jumlahnya. Namun umat Nabi Musa ini sangat cerewet kepada nabinya. Mereka selalu meminta Musa memohon kepada Tuhan agar diturunkan beraneka jenis makanan dari langit. Setelah bosan dengan makanan manna dan salwa, mereka lalu meminta lagi yang lain, seperti disebutkan di dalam Surat Al-Baqarah ayat 61:

“Dan (ingatlah), ketika kamu berkata: “Hai Musa, kami tidak bisa sabar (tahan) dengan satu macam makanan saja. Sebab itu mohonkanlah untuk kami kepada Tuhanmu, agar Dia mengeluarkan bagi kami dari apa yang ditumbuhkan bumi, yaitu sayur-mayurnya, ketimunnya, bawang putihnya, kacang adasnya, dan bawang merahnya.” (Al-Quran, Surat Al-Baqarah ayat 61)

Nah, itulah yang saya maksud bahwa bawang putih dan bawang merah disebutkan secara jelas di dalam Al-Quran. Itu artinya umat manusia sejak zaman dulu pun sudah tergantung pada kedua bumbu ini. Jadi, ketika harga kedua bumbu dapur tersebut melejit sangat tinggi, wajarlah heboh senegara.


Written by rinaldimunir

March 17th, 2013 at 8:52 am

Posted in Gado-gado