Saya belum terlalu lama melakukan pentest (penetration testing) tapi sudah mengamati ada berbagai jenis client. Saya juga mulai sering ditanya oleh orang yang mau melakukan pentesting: apa aja sih yang perlu dipentest? terus prosesnya biasanya bagaimana?
Secara umum pentest adalah menguji sistem komputer terhadap kelemahan security. Apa yang diuji tentunya bergantung pada sistem yang ada. Contoh: jika sistem hanya digunakan internal perusahaan, maka yang ditest hanya internal saja. Jika aplikasi bisa diakses publik via aplikasi mobile, maka aplikasi mobile juga perlu ditest.
Contents
Apa yang ditest?
Pentest bisa dilakukan secara eksternal, artinya hanya dari akses website dan app saja, tidak masuk ke jaringan internal dan juga secara internal dengan datang ke perusahaan. Hal yang penting diidentifikasi adalah: apa asset penting yang perlu dilindungi dan sepenting apa assetnya, lalu bagaimana itu bisa diakses. Contoh: jika aplikasinya melibatkan pulsa atau voucher, kita perlu mengidentifikasi titik di mana isi pulsa bisa dilakukan, misalnya via website, via layanan partner, via aplikasi.
Kadang pentest eksternal saja sudah cukup. Contohnya: aplikasi sudah berjalan di server Amazon/Azure dan sudah dipastikan bahwa hanya ada satu orang yang memegang account ke server tersebut. Serangan terhadap jaringan internal perusahaan tidak akan bisa mengakses server itu.
Pada kasus lain, pentest kadang perlu dilakukan juga pada jaringan internal. Ini biasanya diperlukan pada perusahaan besar yang memiliki pegawai yang bisa langsung mengakses server. Jangan sampai ada pegawai yang seharusnya hanya boleh mengentri data ternyata bisa mengakses server penggajian. Hal yang ditest biasanya mulai dari WIFI (apakah ada tamu yang bisa mengakses jaringan perusahaan), firewall, aplikasi internal, password default, dsb.
Jangan kira karena perusahaan ada di wilayah yang dilindungi satpam maka Anda tidak butuh pentest internal. Karyawan bisa saja mendapatkan email yang berisi trojan/backdoor dan penyerang bisa masuk langsung ke jaringan internal perusahaan. Bisa juga karyawan menginstall game di ponselnya yang ternyata memiliki backdoor dan bisa mengakses data ketika ponsel tersebut terkoneksi ke WIFI kantor.
Mobile app juga merupakan hal yang penting untuk ditest. Kadang ada yang berpikir: ah API-nya sama kok dengan yang di web (memakai REST) jadi pasti sudah aman. Saya pernah melihat app seperti itu, tapi ternyata di mobile app-nya tersisa URL testing yang memungkinkan kita melakukan SQL Injection (kemudian ternyata bisa mendapatkan password admin, bisa membaca source code app, lalu bisa mendapatkan shell).
Proses testing
Akan sangat panjang untuk menjelaskan bagaimana seluruh proses testing dilakukan, jadi akan saya ceritakan secara umum saja. Secara umum di awal harus ditentukan apa yang akan ditest, apa batasannya (kadang pentest hanya boleh dilakukan setelah jam tertentu), siapa contact personnya, dsb. Biasanya dibuat juga perjanjian supaya jelas jika ada insiden selama proses pentesting.
Biasanya testing dilakukan dalam beberapa tingkat. Pertama adalah scanning secara umum (port yang terbuka, URL-URL standar) dan akan dicoba apakah tanpa memiliki user kita bisa mengakses hal-hal yang seharusnya tidak boleh diakses. Untuk aplikasi yang baik, biasanya ini tidak akan menghasilkan apa-apa, hanya temuan yang levelnya low risk.
Jika website atau aplikasi memiliki user account, maka pentester perlu diberi beberapa user account, biasanya mulai dari yang privilege rendah sampai tinggi. Beberapa hal yang ditest misalnya: apakah user privilege rendah bisa mengakses user lain, apakah bisa menaikkan privilegenya?
Account level admin juga dibutuhkan untuk memastikan. Contoh: jika user bisa mengirimkan pesan ke admin untuk mengeksploitasi XSS (cross site scripting), dan ini baru akan aktif ketika admin membuka pesan tersebut. Pentester akan lebih mudah/cepat mengetes jika diberi account admin dan memastikan apakah XSS ada atau tidak , daripada menunggu admin yang sesungguhnya untuk membuka pesannya (entah kapan).
Seringkali aplikasi sudah melindungi diri dari orang yang tidak punya account, tapi masih bolong ketika bisa masuk sebagai user apapun. Di dunia nyata account level rendah ini sering bisa didapatkan, misalnya dari password yang bocor di situs lain (password reuse), atau bahkan dengan social engineering.
Untuk aplikasi mobile kadang test singkat bisa dilakukan jika teknologi yang digunakan cukup standar (memakai REST API dsb). Tapi jika aplikasi sudah kompleks, memakai protokol tidak standar, atau menggunakan SSL Pinning, maka reverse engineering perlu dilakukan terhadap aplikasi.
Setelah berbagai kelemahan ditemukan, laporan akan dibuat dan mungkin perlu dipresentasikan ke client (jika ada hal-hal yang tidak dipahami client). Setelah itu developer dan atau admin akan segera memperbaiki bugnya. Setelah selesai akan dilaporkan kembali ke pentester.
Pentester akan melakukan testing ulang dan menyatakan apakah semua sudah beres atau belum. Kadang setelah sesuatu diperbaiki, bugnya berubah, atau malah bug baru jadi muncul, hal ini juga akan dilaporkan lagi. Jika semua sudah beres, maka pentest dianggap selesai.
Dalam kasus tertentu, perusahaan akan meminta training khusus untuk admin dan developer agar mereka bisa mengembangkan aplikasi dengan lebih aman. Hal-hal yang diajarkan biasanya meliputi bagaimana coding lebih baik dan bagaimana melakukan testing security awal sendiri.
Batasan Pentest
Attacker yang sesungguhnya bisa menyerang dari mana saja, tidak terbatas pada scope yang diuji jadi pentest tidak menjamin semua akan 100% aman. Sebenarnya bisa saja melakukan pentest dengan lengkap, tapi biayanya bisa sangat mahal. Contohnya: kebanyakan pentest tidak melakukan social engineering (bahasa awamnya: menipu orang/pegawai) padahal ini salah satu serangan yang umum.
Idealnya pentest dilakukan sejak sebelum sistem di-online-kan, jadi masalah bisa ditemukan dan diatasi sebelumnya. Hal yang sulit adalah jika sistem sudah online, lalu harus melakukan pentesting yang tidak boleh merusak data atau mengganggu stabilitas sistem. Dalam kenyataannya, dana pentesting belum tentu bisa turun ketika sistem belum siap online.
Pentest yang ideal biasanya disertai juga dengan review source code. Pentest blackbox sulit digunakan untuk mencari bug logika yang dalam. Saya pernah menemukan bug karena sebagian kode yang dirahasiakan ternyata terupload di github. Tanpa melihat source code itu saya tidak akan menemukan bugnya.
Pentest biasanya dilakukan hanya dalam hitungan hari, sementara penyerang yang tekun bisa mencoba menjebol sistem selama berbulan-bulan, bahkan bertahun-tahun. Setelah beberapa bulan mungkin attacker bisa menemukan celah kecil yang tidak ditemukan pentester dalam beberapa hari. Waktu beberapa hari biasanya cukup untuk menguji berbagai hal, tapi ini tergantung pada kompleksitas sistem dan kesiapan pihak yang ditest.
Kadang client sangat membatasi scope testing: hanya boleh x.example.com, tidak boleh subdomain lain. Nah jika ternyata sistem saling berhubungan, dan y.example.com kena hack, maka kemungkinan bisa masuk juga ke x.example.com (yang secara umum aman).
Perlu diperhatikan juga bahwa sistem juga bisa berubah setelah pentest dilakukan dan menjadi tidak aman lagi, atau sistem tidak diupdate setelah pentest sementara telah ditemukan bug baru di sistem operasi atau software di luar scope pentest (misalnya bug di database, bug di web server, dsb).
Jika sebuah perusahaan tidak punya sysadmin yang capable, jasa untuk mengecek dan mengupdate software ini bisa diberikan ke MSS (managed security service) provider. MSSP akan menginventarisasi berbagai device (firewall, router, dsb) dan software yang dipakai, dan akan diupgrade (dengan persetujuan client jika ada kemungkinan masalah). Pentest juga bisa dilakukan berkala. Untuk perusahaan besar seperti bank yang softwarenya sering diupdate, maka hal ini penting.
Pentester
Tiap perusahaan yang memberikan jasa pentesting memiliki standar yang berbeda. Ada yang mempekerjakan mahasiswa dengan gaji rendah, dan ada juga yang mempekerjakan profesional (yang memiliki sertifikasi) dengan gaji tinggi. Ada yang memiliki orang-orang yang memang passionate di bidang security, ada yang sekedar memakai tool saja sekenanya.
Perlu dicatat juga: hasil kerja mahasiswa belum tentu lebih buruk dari yang profesional, bahkan kadang hasilnya lebih baik. Beberapa profesional yang memiliki sertifikasi online bahkan kadang curang dengan menggunakan “joki”. Tapi biasanya orang yang sudah berpengalaman akan lebih baik dari pemula.
Pentester yang sudah berpengalaman biasanya sudah hapal dengan berbagai konfigurasi software yang umum. Untuk pentester yang sudah lama di daerah tertentu (misalnya pentester di wilayah Indonesia), bahkan kadang mereka tahu sistem X ini siapa developernya, karena biasanya sistem yang sama dijual ke banyak perusahaan. Kalaupun tidak sama persis, jika tahu developernya maka akan tahu juga berbagai komponen umum yang dipakai oleh developer itu.
Pengetahuan di luar hal teknis pentest bisa sangat berguna, contoh kasusnya begini: bank X dan bank Y sama-sama memakai produk Z. Ketika pentest Bank X memakai Z versi 1.0 tidak ditemukan bug, lalu beberapa bulan kemudian ada pekerjaan pentest baru untuk bank Y tapi memakai software Z versi 2.0. Ternyata ada bug di versi ini. Pentester bisa menghubungi bank X dan menanyakan apakah mereka sudah upgrade ke versi 2.0? jika sudah harap diketahui ada bug ini. Sebenarnya ini mirip dengan mengetahui berbagai bug di WordPress/Joomla atau sistem lain yang umum, tapi scopenya lokal di sebuah tempat tertentu.
Saat ini banyak proses testing dilakukan via tools otomatis (Acunetix dan sejenis). Tools-tools ini bisa menemukan cukup banyak bug sederhana, tapi bug-bug yang menyangkut logika tidak bisa ditemukan dengan tools semacam ini.
Anda perlu khawatir jika laporan pentest banyak berasal dari tool, dan apabila pentester tidak bisa menjelaskan dengan baik item bug tersebut. Contoh sederhana seperti ini: ada tool untuk mengecek apakah aplikasi iOS/Android berpotensi sebagai malware, tapi tool ini dipakai untuk mengecek aplikasi banking. Lalu ada item warning bahwa aplikasi mengakses SMS dan hal itu disertakan di laporan (padahal ini wajar karena dibutuhkan untuk autentikasi).
Biaya pentesting
Biaya pentesting ini bisa sangat rendah atau sangat tinggi tergantung pada banyak hal. Seperti sudah dibahas di atas: ini tergantung pada scope testing, dan berapa waktu yang dialokasikan untuk masing-masing.
Biaya juga bergantung pada siapa yang disewa oleh perusahaan testing. Akan sangat baik jika perusahaan menggungkan lebih dari satu pentester untuk meyakinkan bahwa semua bug bisa ditemukan dengan baik.
Secara umum tarif per hari kerja per orang (man day) berkisar ratusan ribu hingga jutaan rupiah. Jadi biaya pentest memang cukup mahal untuk sistem yang besar dan rumit (ini salah satu contoh perkiraan dari perusahaan asing). Tapi tentunya ini juga perlu dilihat dari kaca mata lain: Andaikan ada orang yang berhasil menjebol sistem Anda, berapa uang yang akan hilang, apakah puluhan juta? ratusan juta? milyaran?
Jika dana Anda tidak terlalu besar, Anda bisa mencari individu yang bisa mengecek secara singkat dengan biaya relatif rendah. Pentesting singkat yang dilakukan seseorang kadang cukup untuk menemukan bug-bug yang “jelas terlihat” dan akan cukup menjauhkan Anda dari script kiddies yang menyerang berbagai web secara random. Jika bisnis Anda sudah cukup besar, saya sarankan menyewa pentester dan mungkin juga jasa MSS.
Penutup
Tulisan ini hanya sekedar perkenalan secara umum terhadap pentesting. Banyak hal yang sangat teknis yang tidak saya bahas, tapi semoga sudah cukup memberikan gambaran seperti apa pentesting itu.
Saya baru ngerti pentesting dari sudut pandang orang yg ahli dibidangnya. Tidak sesederhana yg saya bayangkan. 🙂
Saya suka tulisannya. Jelas dan detail.