Cara mulai belajar hacking web

Ini adalah salah satu pertanyaan yang banyak ditanyakan ke saya: dari mana memulai kalau hanya ingin belajar hacking web (pentest atau mengejar bug bounty aplikasi web). Daripada saya menjawab berulang-ulang, saya tuliskan saja di posting ini. Jawaban ini bukan satu-satunya jawaban, ada banyak jawaban lain di Internet. Jawaban inipun mungkin bukan yang paling benar, jadi bacalah juga jawaban orang lain sebelum memutuskan.

Tujuan

Hal paling utama adaalah: apa sih tujuannya ingin bisa hacking web? Contohnya:

  • untuk bug hunting (bug bounty)
  • untuk pentesting
  • untuk mengetes keamanan aplikasi web buatan sendiri
  • untung tujuan jahat (defacing, dump database, dsb)

Tergantung masing-masing tujuan, caranya belajarnya bisa sangat berbeda. Untuk penjelasan berikutnya, saya akan menggunakan contoh dua bug umum:

  • IDOR (Indirect Direct Object Reference)
  • SQL injection

Kedua bug tersebut biasanya relatif mudah ditemukan dan mudah dipelajari. Remaja umur 19 tahun yang mendapatkan 1 juta dollar (total selama 3 tahun bug hunting) menyatakan bahwa bug favoritnya adalah IDOR karena katanya “mudah ditemukan dan hasilnya besar”.

Lanjutkan membaca “Cara mulai belajar hacking web”

Mengenal command Injection Attack

Dalam tulisan ini saya akan membas attack “command injection” atau dikenal juga sebagi “OS command injection”, di mana attacker bisa menyisipkan perintah untuk dieksekusi. Seperti saya contohkan dalam beberapa artikel saya di blog ini dalam kategori CLI, banyak program CLI yang bisa melakukan hal kompleks dengan sangat mudah. Kadang seseorang akan memanggil program CLI eksternal daripada harus coding sendiri fungsionalitas yang rumit. Contohnya: untuk resize satu file gambar dengan imagemagick bisa dilakukan dengan satu perintah:

convert -resize 50% input.jpg output.jpg

Dan ini bisa dipanggil dari program lain, misalnya PHP dengan:

system("convert -resize 50% input.jpg output.jpg")

Atau Python dengan

import os
os.system("convert -resize 50% input.jpg output.jpg")

Atau bahasa-bahasa lain dengan cara serupa. Seperti halnya SQL injection, jika kita tidak melakukan escaping (dalam kasus ini namanya “shell escaping“) maka akibatnya bisa fatal. Contoh sederhana lain yang ada pada banyak router adalah penggunaan perintah ping via web interface. Di balik layar, yang dilakukan adalah:

system("ping -c 3 $target")

Jika kita bisa memasukkan apapun dalam $target, tanpa verifikasi, maka kita bisa memasukkan: localhost; ls, hasilnya: command ping localhost dieksekusi, lalu ls dieksekusi. Dalam kasus ini biasanya output ls akan muncul di layar.

Contoh command injection pada router yang saya miliki
Lanjutkan membaca “Mengenal command Injection Attack”

Block Cipher

Seperti namanya, sebuah block cipher mengenkrip 1 blok data setiap waktu. Ukuran blok ini biasanya kecil, misalnya AES memakai ukuran blok 128 bit (16 byte). Karena enkripsi dilakukan per blok, maka jika ukuran data kurang dari ukuran blok maka perlu ditambahkan padding (yang sudah dibahas sebelumnya). Jadi tidak seperti stream cipher, ukuran data hasil bisa sedikit lebih besar karena padding.

Ada banyak contoh block cipher, misalnya AES (yang jadi standar saat ini), DES (standar sebelumnya), TEA (block cipher yang sangat sederhana), Blowfish, dsb. Salah satu alasan enkripsi dilakukan per blok adalah: ada operasi permutasi yang bisa dilakukan dalam tiap blok. Contohnya jika ukuran blok hanya 4 byte dan kita memiliki data dengan urutan 1 2 3 4, maka bisa dilakukan permutas sehingga urutannya (misalnya) menjadi 2 3 1 4.

Tentunya tidak hanya permutasi saja yang dilakukan, biasanya ada banyak langkah yang diulang beberapa kali (iterated block cipher). Setiap langkah bisa berupa substitusi (menggunakan yang namanya S-BOX), permutasi, pemecahan blok menjadi beberapa bagian, dan penggabungan kembali bagian tersebut.

Mode Of Operation

Untuk tiap block cipher, kita bisa menggunakannya dalam berbagai mode. Mode paling sederhana adalah Electronic Codebook (ECB): ambil satu blok, enkrip blok itu saja, lupakan semua, jika ada blok baru maka enkrip blok itu saja, dst. Ini jadi mirip dengan stream cipher hanya saja ukurannya per blok. Di dalam mode ini tidak ada IV (initialization vector).


Lanjutkan membaca “Block Cipher”

Stream cipher

Dalam stream cipher plaintext dienkrip satu byte tiap waktu. Ini berbeda dengan block cipher (akan dibahas di posting berikutnya) yang harus mengenkrip satu blok byte dengan ukuran tertentu. Prinsip stream cipher adalah: dari sebuah key dihasilkan sebuah urutan byte-byte yang acak. Byte-byte ini kemudian di XOR-kan dengan plaintext. Karena sifat stream cipher yang menghasilkan byte acak, kadang ada yang menggunakan ini sebagai RNG (Random Number Generator)

Dengan stream cipher, panjang hasil enkripsi bisa sama dengan teks yang dienkripsi. Karena enkripsi bisa dilakukan per byte, maka begitu ada 1 byte data tersedia, data tersebut langsung bisa dienkripsi (tidak perlu menunggu satu blok data).

Beberapa contoh stream cipher adalah: RC4 (dipakai di banyak hal misalnya WIFI WEP dan juga oleh banyak malware) serta A5/1 dan A5/2 (dipakai di GSM versi lama). Secara umum block cipher bisa diubah menjadi stream cipher dengan mode OFB (Output Feedback) dan CTR (Counter), jadi sekarang ini tidak banyak stream cipher yang populer.

Baik block cipher maupun stream cipher perlu diberi IV (initialization vector). Tujuan IV ini mirip dengan salt pada waktu hashing. Jika ada dua message yang dienkrip dengan key yang sama, dengan menggunakan IV yang berbeda maka hasil enkripsinya akan berbeda. Dalam stream cipher, jika tidak ada IV dan kita mengenkrip dua pesan yang berbeda (A dan B), maka akibatnya kita bisa mendapatkan (A XOR B) meskipun tidak tahu keynya. Ini bisa terjadi karena

E1 = (A XOR C) # dengan C adalah sebuah stream dari key K
E2 = (B XOR C) # dengan C adalah sebuah stream dari key K yang sama
X = (E1 XOR E2) = (A XOR C) XOR (B XOR C) = A XOR B

Contohnya seperti ini jika data yang dienkrip adalah gambar dengan teks “Yohanes”

Hasilnya bagus tidak terbaca

Lanjutkan membaca “Stream cipher”

Tanda tangan digital (kriptografi)

Sebagian orang menyangka tanda tangan digital adalah tanda tangan manusia hasil scan/foto/ditulis dengan stylus, tapi dalam kriptografi, maksudnya bukan itu. Tandatangan digital bertujuan untuk membuktikan bahwa:

  • seseorang tidak bisa menyangkal bahwa pernah menandatangani sebuah dokumen/file (non repudiation)
  • semua orang lain bisa memverifikasi bahwa tanda tangan tersebut valid

Ada banyak skema tanda tangan digital. Prinsipnya sama: ada key private yang dimiliki oleh penandatangan (signer) dan ada key publik yang disebarkan publik. Contoh algoritma yang bisa dipakai adalah RSA. Saya memilih satu algoritma saja untuk menjelaskan karena saya sudah membahas RSA di posting lain.

Lanjutkan membaca “Tanda tangan digital (kriptografi)”

Padding dalam kriptografi

Padding merupakan salah satu konsep dasar dalam kriptografi. Konsep padding ini sederhana: sebuah pesan sebelum dienkrip atau dihash diberi tambahan sesuatu, bisa di awal, di tengah atau di akhir. Padding ini konsep sederhana, tapi perlu diketahui misalnya jika ingin memahami hash length extension attack.

Dalam kriptografi klasik, cryptanalysis bisa dilakukan terhadap pesan karena biasanya sebuah pesan bisa diprediksi awalannya (“Selamat siang”), atau akhirannya (“Dengan Hormat, XXX”). Dari teks parsial yang diketahui/ditebak itu bisa dilakukan berbagai analisis untuk mengetahui apa isi pesannya (known plaintext attack).

Lanjutkan membaca “Padding dalam kriptografi”

Fungsi Hash Kriptografi (Bagian 2)

Salt

Penggunaan hash untuk menyimpan password merupakan cara yang standar di berbagai aplikasi. Cara ini sederhana, tapi hash saja memiliki kelemahan:

  • jika ada dua atau lebih orang passwordnya sama, maka akan terlihat bahwa hashnya sama.
  • bisa dilakukan dictionary attack. Artinya: hash semua kata di kamus sekali, lalu cocokkan hashnya

Cara yang lebih baik adalah dengan menambahkan salt, berupa beberapa karakter random yang berbeda untuk tiap entry. Jadi misalnya jika password untuk user1 adalah 123, kita bisa menghasilkan salt random misalnya “xcd”, lalu salt ini dihash bersama password hash(“xcd”+”123”). Jika hash yang dipakai adalah MD5, maka hasilnya:

4c88e409f0d1938d4f0adf7bdc896fbe

Di dalam database atau file, kita perlu menyimpan salt yang dipakai: “xcd”, misalnya seperti ini: xcd$4c88e409f0d1938d4f0adf7bdc896fbe

Lanjutkan membaca “Fungsi Hash Kriptografi (Bagian 2)”