Horeee …
blog saya di-HACK!



GEJALA


INDENTIFIKASI


PEMULIHAN

Ketika sebulan lalu trafik blog saya down dan sering tidak bisa diakses, saya hanya menyangka bahwa itu gara-gara diaktifkannya algoritma Google Caffeine yang memang memengaruhi trafik web di seluruh dunia. Saya bahkan tidak terpikir untuk mengecek di Google Search Console (GSC), itu kesalahan pertama. Kesalahan kedua, saya mematikan Jetpack dan tidak menggunakan perlindungan jenis apa pun. Akibatnya, ribuan komen SPAM menumpuk. Every single fucking day.

Saat itu saya belum tahu bahwa blog saya diretas.

Tanggal 25 November 2017, saya memutuskan untuk pindah server dari Singapura ke Indonesia. Ini penting saya ceritakan untuk mengidentifikasi sumber masalahnya dan kapan peretasan terjadi. Setelah pindah server itu, saya menginstal ulang WordPress (yang otomatis menghapus semua plugin), menganti theme, dan mengunggah konten dari awal.

Saya baru sadar bahwa blog saya diretas setelah ngecek GSC lalu menemukan banyak sekali page not found , server error, dan URL dengan domain blog saya tapi judulnya asing seperti dalam gambar di bawah ini. Page not found wajar untuk blog yang baru diinstal ulang karena ada beberapa permalink yang berubah, tapi tidak wajar jika URL nof found berisi URL yang tidak saya tulis. Harap diingat bahwa Crawl Errors di GSC berasal dari internal link, bukan internal dan eksternal link seperti di Broken Link Checker. Seseorang telah menginjeksikan URL-URL ini ke dalam blog saya.

GEJALA BLOG ANDA DIRETAS

Ketika mendengar kata “diretas”, atau “di-hack”, pertanyaan pertama yang sering terlintas di benak orang-orang adalah, “Siapa?” atau “Mengapa?”. Mungkin Anda berpikir bahwa blog Anda sengaja diretas oleh musuh-musuh politik atau mantan yang sakit hati. Tapi, peretasan tidak selalu bermotif personal. Web berbasis CMS (WordPress, Drupal, Joomla, dll.) memang lebih rentan diretas jika dibandingkan dengan platform lainnya. Peretasnya pun tidak selalu manusia langsung, tapi bot. Setiap harinya, ribuan situs web diretas. Kita hanya bagian dari statistik. Do not take it too personally. 

Memang apa sih bahayanya kalau blog kita diretas? Well, dari mulai di-blacklist oleh semua search engine sampai tidak bisa diakses dan dijadikan botnet (komputer zombie). Dalam beberapa kasus, bisa menginfeksi device, data-data Anda dicuri atau hilang sama sekali.

GEJALA UMUM

Tergantung jenis peretasan dan metode yang digunakan oleh cracker (peretas jahat), gejalanya bisa berbeda-beda. Ini yang paling umum:

  1. Blog jadi lambat.
  2. Sering terjadi gagal move on loading, server error, atau tidak bisa diakses yang gejalanya mirip dengan gangguan internet.
  3. Meningkatnya jumlah Crawl Errors di GSC, berasal dari URL blog biasa atau URL asing seperti dalam contoh yang saya berikan di atas.
  4. Menurunnya trafik untuk query atau keyword yang biasanya mengantarkan trafik paling banyak ke blog Anda. Sebaliknya, trafik meningkat yang berasal dari query atau keyword aneh. Lihat di Google Analytics dan GSC, jangan lihat PV di dasboard blog.  Google Search Console >> Dashboard >> Search Traffic >> Search Analytics.
  5. Terdapat backlink dari situs yang mencurigakan. Untuk mengecek baclink, jangan gunakan Moz karena tidak akan terdeteksi, tetap gunakan GSC. Google Search Console >> Dashboard >> Search Traffic >> Links to Your Site.
  6. Untuk kasus yang parah, Anda akan mendapatkan “surat cinta” dari Google yang mengabarkan bahwa blog Anda terinfeksi malware. Lebih seringnya sih Anda tidak akan mendapatkan peringatan apa-apa, tapi Google diam-diam menurunkan peringkat blog Anda dari SERPs. Mirip-mirip ama pacar yang enggak ngasih tahu kesalahan kita apa, tahu-tahu selingkuh aja.
  7. Terjadi penambahan atau modifikasi file di cPanel yang bukan dilakukan oleh Anda atau hosting provider. 
  8. Coba cek di search engine dengan metode >> site:namablog.com. Contoh: site:langitamaravati.com. Kalau masih ada, kita masih punya kesempatan untuk memperbaiki hubungan ini (eh, gimana?), kalau hilang sama sekali, berhenti baca blog post ini lalu segera cari bantuan ahli. Lihat sampai ke halaman paling ujung, perhatikan judul, URL, dan snippet (deskripsi). Kalau ada judul post/page yang bukan ditulis oleh Anda, blog Anda positif diretas.
URL NORMAL

URL INJECTION

IDENTIFIKASI
JENIS PERETASAN

Oke, setelah memerhatikan gejala dan investigasi awal, blog saya positif diretas, terus gimana? Berikutnya adalah mengidentifikasi jenis peretasannya agar tidak salah diagnosis. Kenapa ini penting? Karena seperti kata Maile Ohye, Developer Programs Tech Lead-nya Google, mengetahui jenis dan metode peretasan akan sangat berguna untuk menentukan langkah-langkah pemulihan.

Berikut saya cantumkan tautan dari Google sebagai bahan referensi Anda:

  1. Identifying and Diagnosing Injected Gibberish URL Hacking
  2. Webmaster’s Guide for Hacked Site

Apakah dengan membaca dua tautan itu saja cukup untuk mengambil diagnosis? Terus terang, enggak. Saya membaca banyak sekali artikel dan ngulik sendiri karena menurut saya ini seru. Hitung-hitung sambil belajar.

Oh iya, sebelum kita melangkah lebih jauh, Google mengkategorikan peretasan ke dalam dua tingkatan infeksi: malware dan spam. Keduanya sama-sama berbahaya. Biasanya sama-sama menggunakan malware jenis rootkit/exploit yang dioperasikan oleh bot. Yang berbeda hanya stadiumnya.

Dengan panduan gejala yang saya jelaskan di subbab sebelumnya, ini yang saya lakukan untuk memastikan jenis peretasan:

1. Google search console (GSC) – Security Issues

GSC >> Dashboard >> Security Issues

Ini untuk mengecek apakah saya mendapatkan surat cinta atau tidak, ternyata tidak ada peringatan apa-apa dari Google. Blog saya dinyatakan aman. Iya, aman, sih, tapi ranking dan trafik terjun bebas. Apakah blog saya memang sudah aman dan bebas dari jeratan? Ya, enggak, orang gejalanya makin parah, kok. Nah, beda halnya bila mendapat surat cinta. Kalau Anda mendapatkan surat cinta seperti di bawah ini, segera cari bantuan.

Diagnosis #1:
Kategori:  spam (at least bukan malware)

2. SCAN – Sucuri, Quretta, WordFence

Karena alarm Google tidak menyala, saya mencari second opinion dari pihak lain: scanning memakai 3 plugin secara bergantian. Sucuri, Quretta, dan WordFence. Sucuri dan Quretta memberikan hasil negatif. WordFence, meskipun hasil scanning-nya tidak bisa diandalkan, tapi karena ada fitur live traffic jadi cukup peka untuk mendeteksi berbabagi IP address yang berusaha mengakses login dan terus-menerus mengunjungi laman-laman URL injection. FYI, googlebot dan crawler resmi lainnya tidak pernah berusaha mengakes login karena sudah diblok oleh robot.txt dan mereka patuh terhadap itu, sedangkan bot-bot para cracker tidak. Mereka gigih sekali mencari backdoor agar bisa menancapkan taring-taringnya yang tajam. Eh, sori, saya lupa kalau lagi menulis genre tekno, bukan cerpen. 😀

Selain memindai via plugin, saya juga melakukan scanning di ketiga situs web mereka, hasilnya tetap negatif. Sebagai bahan perbandingan, saya memasukkan URL dari salah satu backlink yang ada di GSC,  dan voila, malware, cuy. Sekalinya dapet backlink, dari situs berisi malware. Kan, Neng Uchan jadi sedih. Hiks.

Diagnosis #2:
Kategori: konfirm spam *fyuh

3. Google search console (GSC) – Crawl Errors

GSC >> Dashboard >> Crawl >> Crawl Errors

Jika Anda tidak menemukan indikasi apa-apa di Security Issues, lanjutkan pengecekan ke Crawl Errors. Seperti yang Anda lihat, banyak sekali 404 not found dengan judul blog post yang tidak saya kenali. Sekali lagi, Crawl Errors berasal dari internal link, artinya URL-URL itu ada di blog saya. Kalau sudah not found, berarti sudah tidak ada, dong? Jangan senang dulu, petualangan kita belum selesai.

Sampai tanggal 8 Desember 2017, jumlah URL asing masih di angka 1,236. Ini jumlah yang lebih dari cukup untuk menurunkan blog saya dari SERPs. Iya, sih, 404 not found biasa tidak berpengaruh pada ranking, tapi spammy content sebaliknya. Google Penguin dan Caffeine sekarang live. Yang pertama kali “digantung” ya web-web penuh spam.

Oh, saya juga mengecek di properti satu lagi (domain tanpa www), di sana tidak sebanyak properti utama, tapi link-nya lebih liar lagi.

Klik URL >> Linked from

Bisa Anda lihat kan struktur permalink-nya? Sama seperti URL blog post biasa: http://www.langitamaravati.com + judul. Padahal saya tidak pernah menulis blog post dengan judul ini.  Tapi kenapa bisa ada URL dengan nama blog saya? INILAH YANG DINAMAKAN URL INJECTION.

Boleh diklik enggak? Coba aja, tapi saya sarankan sih jangan.

Diagnosis #3:
Tipe infeksi:  URL Injection

URL Injection means a hacker has created new pages on your site, often containing spammy words or links. Sometimes these new pages contain code that does things you didn’t intend, such as redirecting your users to other sites or making your webserver participate in a denial-of-service attack against other sites.
-Google

Tip:

  •  Download data URL errors baik dari desktop maupun dari smartphone. Ini untuk database kita.
  • Download juga data dari Search Traffic (Search Analytics, Link to Your Sites, &  Internal Links)
  • Data-data ini akan berguna bagi Anda pada saat proses pemulihan.

4. Search Results Pages (SERPs)

Untuk memastikan dan melihat seberapa parah infeksi, lakukan pencarian nama blog dengan metode “site”.

Contoh:
site:langitamaravati.com

Catatan:

  1. Hanya masukkan nama blog tanpa http/s atau www.
  2. Pastikan tidak ada spasi di antara “:” dengan nama blog.
  3. Lihat di hasil penelusuran. Di halaman-halaman awal, hasil pencarian akan terlihat normal, berisi URL blog Anda, post, page, tag, kategori, dll.
  4. Cari terus di halaman selanjutnya. Tergantung dari seberapa besar/banyak konten blog, URL injection akan terlihat di halaman 10 ke atas.
URL Injection

Coba perhatikan, permalink-nya SAMA PERSIS dengan struktur permalink blog saya. Kalau saya yang menemukan ini, saya akan mengabaikannya karena tahu bukan saya yang menulis. Tapi bagaimana kalau pengunjung lain? Bagaimana kalau ada yang mengklik karena judulnya begitu menarik? Itu sebabnya mengapa URL injection berbahaya bukan hanya untuk blog yang diretas, tapi juga untuk pengunjungnya.

Tapi, bedakan dengan yang ini:

Jika Anda melakukan pencarian tanpa “site”, hasil yang akan keluar random. Iya, akan ada web-web aneh berisi nama Anda atau ajakan untuk mengunduh apa pun (lagu, buku, foto, dll), tapi tidak bisa mendeteksi URL injection. Hasil pencarian di gambar ini adalah scrapping content, biasanya diambil dari feed blog kita. Apakah berbahaya? Situs webnya sih kebanyakan aman, file yang diunduhnya itu yang bahaya.

Diagnosis #4
Positif URL injection

Tip:

  1. Copas semua link URL injection dari hasil pencarian untuk digunakan pada saat pemulihan. Kalau jumlahnya terlalu banyak, copas sampai 5 laman atau bisa menggunakan add ons.

Catatan:

  1. Screen shoot hasil penelusuran di atas diambil tanggal 28 November 2017, URL injection masih ada di laman 18 dan jumlahnya hanya 2 laman. Sehari kemudian, sampai di page one.
  2. Tanggal 30 November, 15 laman pertama SERPs dipenuhi URL injection diikuti dengan peningkatan URL not found di GSC. URL asli blog saya entah ada di mana.
  3. Tanggal 30 November, karena melihat tanggal di cache (tanggal terakhir kali URL itu dirayapi Googlebot) dan crawl error detail, saya sempat menyangka bahwa infeksi berasal dari sesuatu sebelum tanggal 25 November dan semua URL injection yang ada di SERPs dan GSC hanyalah sampah hajatan yang belum sempat dibereskan.
  4. Ingat kan kalau tanggal 25 November saya instal ulang WordPress? Saya pikir, kode apa pun akan tersapu bersih, jadi tanggal 30 saya hanya melakukan pertolongan pertama dengan mensubmit remove URL di GSC lalu berharap hati blog saya akan disembuhkan oleh waktu. Ini kesalahan ketiga.
  5.  Tanggal 8 Desember, saya baru tahu bahwa blog saya masih diretas.

5. Cache

Sampai di sini Anda sudah bosan, belum? Plis, yang sabar ya menghadapi aku, ini kan demi masa depan kita bersama. Hahahaha. Kan biar komporehensif atuh.

Spam URL injection ada beberapa tipe, ada yang langsung mengalihkan user atau pengunjung ke situs tujuan peretas (sneaky redirect) ada pula yang menggunakan metode cloaking. Saya harus tahu ini agar lebih spesifik. What to do?

A. Lihat URL Tujuan

Klik salah satu URL dan lihat kita dibawa ke mana. Sebetulnya ini langkah yang berisiko, tapi karena “Fetch as Google” doang tidak memberikan gambaran yang jelas, saya mengambil risiko itu. Well, Chrome menggunakan sandboxing environment, sih. Kalau ada apa-apa tab akan tertutup dengan sendirinya. Ternyata saya tidak dibawa ke mana-mana selain ke laman 404 page not found.

SERPs normal

B. Cache

Jangan senang dulu, sesuatu yang tidak bisa ditemukan bukan berarti itu tidak ada di sana. Masuk lagi ke hasil pencarian dan lihat cache-nya.

Inilah penampakan asli dari URL tadi. Saya sudah cek beberapa URL lain dan isinya serupa. Anda bisa lihat banyak sekali keyword-rich berisi link, bahkan memanipulasi menu navigasi. Ini dinamakan Gibberish URL Hacking.

The hallmark of gibberish is spammy pages that appear to be added to the site. These pages contain keyword-rich gibberish text, links, and images in order to manipulate search engines. This hack often uses cloaking to avoid webmasters from detecting it. Cloaking refers to the practice of presenting different content or URLs to webmasters, visitors, and search engines. For example, the webmaster of the site might be shown an empty or HTTP 404 page which would lead the webmaster to believe the hack is no longer present. However, users who visit the page from search results will still be redirected to spammy pages, and search engines that crawl the site will still be presented with gibberish content.

Gibberish Page

Diagnosis #5:
Tipe: Gibberish URL Hacking
Metode: cloaking

“Cloaking >> Mengelabui user dan Googlebot (mesin bot Google) dengan cara menampilkan konten yang berbeda. Misalnya, ketika Googlebot merayapi (aduh naon nya istilah nu rada alus? menggerayangi? *dicabok) web kita, informasi yang disampaikan ya normal seperti biasa sehingga URL palsu yang diinjeksikan itu akan muncul di mesin pencari. Tapi, ketika user mengklik link tersebut, yang ditampilkan tidak sesuai. Bisa saja ke “404 not found”, bisa jadi ke web penuh malware, atau ke situs web lain yang sama sekali berbeda.”

6. Raw Access Logs – Celah Keamanan

Seperti yang dikatakan Mas Hendra, pemilik blog Share System, memeriksa timeline itu penting untuk mengetahui kapan peretasan terjadi sekaligus mendeteksi celah keamanan blog kita. Salah satu langkah yang bisa Anda gunakan adalah mengecek raw access log. Karena ilmu kanuragan saya belum cukup kalau ngomongin soal begituan, mangga ke tautan di bawah ini supaya Anda lebih tercerahkan.

Cara Mendeteksi Celah Keamanan Web

Sesuai petunjuk Mas Hendra, saya unduhlah file raw access logs bulan November dan Desember lalu mulai mencari kapan dan bagaimana peretas bisa masuk ke blog saya. Bener juga sih, lebih efektif ngecek access logs daripada random ngecek kode-kode PHP.


Jujur, ini pertama kalinya saya menghadapi file access logs dan well, cukup menantang. Saking menantangnya, saya bahkan tidak tahu harus memulai dari mana. Kalau Anda sama-sama baru kali ini kenalan dengan access logs seperti saya, mari kenalan dulu dengan anatominya:

188.230.137.90 – – [30/Nov/2017:19:12:23 +0700]  “GET /wp-content/uploads/2017/08/Tempat-wisata-penuh-misteri-di-Bali_opt- 1024×512.jpg HTTP/1.1” 200 103859 “http://www.langitamaravati.com/?svr=backroom-x” “Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0”

Anatomi raw access logs:

  1. 188.230.137.90 >> IP address
  2. 30/Nov/2017:19:12:23 +0700 >> Date, time, UTC offset (waktu akses)
  3. GET >> method (requests data from specified resources)
  4. /wp-contents/uploads/ … >> sumber data
  5. http://www.langitamaravati/… >> URL yang dikunjungi/diakses
  6. HTTP/1.1 >> HTTP standar
  7. 200 >> server response/response code/HTTP status code, 200 berarti OK
  8. 103859 >> 103859 bytes
  9. Mozilla/5.0 …  >> user agent string

Catatan:

  • Ada beberapa macam metode atau cara blog kita diakses, yang paling umum adalah GET & POST. GET artinya meminta data atau sekadar mengunjungi, POST artinya mensubmit atau memasukkan data untuk diproses.
  • IP address crawler (Google, Bing, Yandex, ahref, dll.) selalu berubah-ubah. Jadi untuk membedakan apakah yang mengakes blog kita itu crawler dari mesin pencari atau bukan, lihat user agent-nya.
  • Hosting provider TIDAK PERNAH mengakses login atau menambahkan file apa pun di cPanel tanpa persetujuan kita.
  • Ada beberapa plugin yang bisa mengakses WP-admin atau WP-login untuk keperluan scanning. Misalnya, Sucuri dan WordFence. Itu pun kalau kita memang menginstal plugin tersebut.
  • Selain human visitor dan crawler/bot search engine, ada bot-bot pihak ketiga yang mengakses blog karena diaktifkan oleh kita. Misalnya: broken link checker, Moz, Alexa, dll.
  • Untuk lebih kenal dengan crawler dan aktivitasnya, coba gunakan plugin WordFence dan lihat di fitur Live Traffic.

TIP:

  1. Kita punya dua macam IP address: device yang kita gunakan, dan IP address network (hosting provider). Jadi jangan tertukar antara IP address sendiri dengan IP address cracker.
  2. Tergantung pengaturan router yang Anda gunakan, IP address bisa bersifat dinamis atau statis. Untuk Indihome, IP address akan berubah jika router di-restart.
  3. Masing-masing browser punya user agent string, termasuk browser yang kita gunakan. Ini juga sama, jangan sampai Anda curiga kepada sesosok (((sesosok))) user agent yang kerap kali mengakses login, eh ternyata itu browser Anda.


CHECK YOUR IP ADDRESS


CHECK YOUR USER AGENT

Cara Mencari Kelamahan di Raw Access Logs:

Mencari akses mencurigakan di antara ribuan data itu, saya akui, tidak mudah. Lebih sulit daripada mencari jodoh. Sebelum kelayapan di access logs, saya ngecek dulu di GSC >> Search Traffics >> Search Analytics, untuk melihat sejak kapan keyword dan query aneh mulai ada. Saya juga mengecek dalam 7 hari terakhir untuk melihat apakah queries itu masih ada. Tahu tidak ada berapa banyak query aneh dalam 7 hari terakhir? Ada 999. Seru, kan? Hahahaha.


Oke, jadi kita sudah dapat tanggal, nih. URL injection mulai ada tanggal 11 November 2017. Berikutnya apa?Mencari aktivitas mencurigakan. Gimana caranya? Aslina teuing. Hahaha. Saya mulai mencari di tanggal 1 November karena saya mah rajin, lalu menemukan URL parameter (?/svr=…) yang diikuti query aneh.

66.249.71.73 – – [02/Nov/2017:17:51:37 +0800] “GET /?svr=pettson-s-inventions-online-dating HTTP/1.1″ 200 9241 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

Oke, mari kita cari di Google dan inilah hasilnya. Parameter ini bukan hanya ada satu dua, tapi ribuan. *teguk kopi item

Kalau Anda jomblo rajin, coba buat database seperti ini untuk memudahkan melakukan pencarian. FYI, access log untuk periode satu bulan bukan terdiri dari seratus atau dua ratus baris, melainkan ratusan ribu baris. Kan bisa CTRL+F. Iya kalau Anda tahu apa yang Anda cari, kalau enggak? Menurut saya Ms Excel lebih mudah digunakan untuk menyaring ratusan ribu baris data seperti ini.

93.91.113.119 – – [31/Oct/2017:20:40:36 +0800] “GET /wp-login.php HTTP/1.1” 200 1345 “-” “Mozilla/5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0”

93.91.113.119 – – [31/Oct/2017:20:40:37 +0800] “POST /wp-login.php HTTP/1.1” 200 1471 “http://langitamaravati.com/wp-login.php” “Mozilla/5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0”

Ada yang berusaha mengakses login. Ini jelas bukan IP address komputer dan jaringan saya, pun bukan user agent browser yang saya gunakan. Serangan ini terjadi lebih dari satu kali, berasal dari IP address yang berbeda-beda, tapi user agent-nya sama: Mozilla/5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0.

Anda yang sering “nonton” live traffic-nya WordFence pasti tahulah bahwa serangan ke login terjadi setiap detik. Iya, setiap detik. “Benderanya” mungkin berbeda, bisa dari Rusia, India, bahkan dari Jakarta. Tapi user agent-nya biasanya serupa.

Ada dua lagi user agent yang sudah menjadi “legenda” di seluruh dunia sebagai botnya brute force attack:

  1. Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1
  2. Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko; googleweblight) Chrome/38.0.1025.166 Mobile Safari/535.19

Bot kedua memang tampak seperti Google Web Light milik Google, tapi jika dilihat dari kelakuan kotornya, bot ini pantas diblok. Jadi, kalau Anda menemukan user agent seperti di atas, don’t ask, just block.

Tapi, dari mana bot-bot ini bisa masuk? Di mana celahnya? Menurut berita yang saya baca di blognya WordFence, akhir Oktober 2017 exploit menyerang plugin Contact Form for WordPress – Ultimate Form Builder Lite dan 50 ribu penggunanya. Exploit ini mengekploitasi celah keamanan dengan mengirimkan request ke /wp-admin/admin-ajax.php. Saya tidak memakai plugin Form Builder Lite, tapi menggunakan Contact Form 7 yang bundling dengan Elementor dan theme yang saya gunakan. Maka saya mencari pola yang sama dan menemukan yang seperti ini:

66.102.6.162 – – [24/Nov/2017:14:43:00 +0800] “POST //wp-admin/admin-ajax.php 0.5423163361847401 HTTP/1.1” 200 983 “http://www.langitamaravati.com/?svr=free-desi-porn-site” “Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko; googleweblight) Chrome/38.0.1025.166 Mobile Safari/535.19”

66.102.6.162 – – [24/Nov/2017:14:43:11 +0800] “GET /wp-content/uploads/2017/09/2.-TIPS-AND-TUTORIAL-262×300.png HTTP/1.1” 200 19096 “http://www.langitamaravati.com/?svr=free-desi-porn-sites” “Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko; googleweblight) Chrome/38.0.1025.166 Mobile Safari/535.19”

69.116.113.25 – – [24/Nov/2017:17:33:50 +0800] “GET /wp-content/plugins/contact-form-7/includes/css/styles.css?ver=4.9.1 HTTP/1.1” 200 687 “http://www.langitamaravati.com/?svr=allegra-cole-world-download” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36”

66.102.6.162 – – [24/Nov/2017:14:43:11 +0800] “GET /wp-content/uploads/2017/09/2.-TIPS-AND-TUTORIAL-262×300.png HTTP/1.1” 200 19096 “http://www.langitamaravati.com/?svr=free-desi-porn-sites” “Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko; googleweblight) Chrome/38.0.1025.166 Mobile Safari/535.19”

Sebelum tanggal 25 November, bot-bot ini masuk via plugin Contact Form 7 dan open directory (upload image). Tanggal 25 November saya instal ulang WP, tapi serangan tetap berlanjut. Kali ini via shopping chart-nya Woocommerce. Tapi semuanya dimulai dengan pola yang sama: /wp-admin/admin-ajax.php. 

Apakah ini artinya jenis serangannya adalah SQL injection. Jika melihat dari access logs dari bulan November sampai 12 Desember, ini adalah gabungan keduanya.

DIAGNOSIS:

  1. Diretas  >> positif
  2. Kategori >> spam
  3. Jenis >> URL injection & SQL injection
  4. Tipe >> gibberish content
  5. Metode >> cloaking
  6. Waktu >> 31 Oktober – 12 Desember 2017

Celah Keamanan:

  1. URL login >> ini celah pertama yang akan diserang cracker
  2. Contact Form 7
  3. Woocommerce
  4. Open directory

MEMULIHKAN BLOG
YANG DIRETAS

Jika Anda menemukan indikasi bahwa blog Anda diretas, yang pertama kali harus Anda lakukan adalah menyeduh secangkir kopi hitam dan pekat agar setrong menghadapi kenyataan. Yang kedua, jangan panik. Selow aja selow. Yang ketiga, hubungi pasangan dan katakan bahwa Anda tidak akan bisa dihubungi dalam satu-dua hari. Yang sudah resmi dan tinggal bersama … ya atur-atur ajalah. 😀

STEP #1: Amankan Server & cPanel

Bagi Anda yang menggunakan WP self hosted, segera hubungi hosting provider, berikan laporan lengkap dengan screenshoot, minta mereka untuk mengecek dan mengamankan server. Untuk kasus-kasus spam (URL injection, code injection, dan content injection), pihak hosting provider di seluruh dunia akan mengatakan bahwa mereka TIDAK MENDETEKSI APA-APA dan blog Anda baik-baik saja. Itu jawaban default, bahkan ketika Anda sudah menyertakan bukti-bukti. So, brace yourself! 

Saya jarang menemukan kasus URL injection pada platform Blogspot, tapi jika ini terjadi, Anda bisa mengikuti langkah-langkah yang disarankan oleh Google di sini.

  1. Ini diperlukan pengetahuan tentang kode terutama PHP dan Javascript atau setidaknya tahu cara menghapus file di cPanel.
  2. Backup data-data blog dan unduh agar jika blog terpaksa disapu bersih, Anda tidak perlu histeris.

Anda punya pilihan untuk langsung menginstal ulang WordPress dan benah-benah dari awal, tapi saya tidak memilih jalan itu karena seperti yang Anda lihat, blog saya tetap diretas bahkan setelah instal ulang WordPress.

STEP #2: Update & Tutup Celah Keamanan

PERTAMA:

  • Amankan SQL database. Saya tidak tahu cara menjelaskannya. Anda bisa baca-baca di sumber lainnya.
  • Ganti URL login. By default, URL login WP adalah www.contohdomain.com/wp-admin/ >> ganti ke www.contohdomain/somethingelse. Caranya? Googling, gih.
  • Gunakan 2 step authentication untuk login.
  • Ganti password: password login, password cPanel, password database, dan password hati kamu.
  • Deaktif semua plugin yang disusupi peretas (backdoor), hapus dari dashboard, hapus dari cPanel.

KEDUA:

Selalu update WordPress dan plugin ke versi terbaru. Jangan gunakan plugin yang tidak kompatibel. Satu lagi: keep it on your mind bahwa plugin dibuat oleh pihak ketiga dan pihak ketiga bisa menyebabkan keretakan rumah tangga (eh gimana?). Maka gunakan plugin dengan bijaksana, seperlunya.

Jangan gunakan plugin yang tidak kompatibel

KETIGA:

Peretasan bisa masuk dari mana saja, bahkan bisa masuk dari komputer Anda sendiri. WordPress memiliki celah-celah yang bisa dimasuki malware atau kode berbahaya yang disebut WordPress vulnerability.

  • JANGAN PERNAH MEMATIKAN ANTI SPAM. Gunakan Jetpack atau Akismet.
  • Pasang plugin sebagai firewall yang berfungsi untuk menangkal serangan sekaligus memblokir semua user agent mencurigakan. Saya merekomendasikan WordFence.
  • Blok semua user agent atau crawler mencurigakan dengan memodifikasi .htaccess atau robot.txt. Kalau Anda belum paham, WordFence ada fitur untuk memblokir bot-bot peretas. Sucuri lumayan sih, tapi blokir hanya bisa digunakan untuk akun berbayar.
  • SELALU MODERASI KOMENTAR. Kalau ada komentar berupa link postingan (bukan hanya domain blog), hapus aja udah komentarnya. Tuman!
  • Hapus semua formulir atau fitur input data dari pihak ketika, misalnya contact form. Sebagai gantinya, Anda bisa mencantumkan alamat email dan nomor telepon agar brand atau siapa pun yang berkepentingan mudah menghubungi Anda. Tombol subscriber? So far, aman.

STEP #3: Bersihkan Sisa-Sisa Pesta

Karena URL injection adalah link-link spam yang memanipulasi Googlebot, maka link ini akan terus tampil di mesin pencarian (dalam kasus saya, sudah sampai page one). Sepanjang link ini tampil di SERPs, maka dashboard GSC Anda akan terus dibanjiri “503 server error” dan “404 not found”. Tinggal tunggu waktu sampai Google sadar bahwa link itu berisi spam/malware lalu menurunkan blog Anda dari search engine.

Percaya sama saya, di-deindex Google itu lebih menyakitkan daripada di-kita-jalani-aja-dulu oleh si dia.

Anda punya dua pilihan:

  1. Mengkarantina blog, menjadikannya offline, menurunkan blog Anda sendiri dari search engine untuk sementara sambil membersihkan URL injection dengan selow.
  2. Tetap membiarkan blog terindeks lalu me-remove URL injection satu per satu secepat mungkin.

Saya memilih jadi yang kedua opsi kedua karena tidak mungkin off. Anda bebas memulai dari mana saja, tergantung kepada prioritas.

3a. URL Parameter

Fitur URL parameter sering digunakan untuk mencegah Google menelusuri duplikat konten. Dalam hal peretasan ini, satu parameter bisa berisi 5 URL atau 10 halaman hasil penelusuran.

Googlebot menemukan ribuan svr URL parameter di blog saya dan memutuskan untuk menelusuri semuanya. Yang akan kita lakukan adalah memerintahkan Googlebot untuk TIDAK MENELUSURI semua URL dengan parameter ini.

  1. Google Search Console >> Dashboard >> Crawl >> URL Parameters >> Edit

2. Select >> Yes 

3. No URLs >> save

3b. Menghapus URL dari Hasil Penelusuran

Kenapa harus dihapus dari hasil penelusuran? Sekali crawler menelusuri satu URL, mereka akan terus melakukannya. Dan sepanjang cache-nya masih disimpan oleh Google, selama itu pula URL-URL bangsat itu akan tampil di search result. Yang akan kita hapus bukan cuma URl, tapi dengan cache-nya.

1. Google >> site:namadomain.com

Sebelum melakukan penelusuran, sebaiknya clear cache dan cookies dulu. Agar tidak tercampur dengan URL yang sehat, Anda bisa manambahkan parameter atau kata kunci yang ada di URL injection (bisa dilihat di access log atau search analytics).

site:langitamaravati.com [spasi] svr
site:langitamaravati.com [spasi] backroom
site:langitamaravati.com [spasi] spy  

Akan muncul halaman seperti ini. Jumlah halaman yang muncul tergantung dari seberapa banyak URL injection-nya.

2. Copy link 

Sudah tahu kan bagaimana menyalin link dari hasil penelusuran? Bukan, bukan disorot URL-nya lalu disalin. Bukan juga diklik lalu menyalin dari bar.

Cara yang benar untuk menyalin URL dari hasil pencarian  >> Find a URL to use for demotion or removal requests

3. Request Removal

Paste URL di kolom request removal. Lakukan sampai URL injection habis atau sampai Anda capek. Bingung mana saja URL yang sudah diremove dan mana yang belum? Jangan khawatir, akan ada notifkasi kalau Anda mengajukan URL yang sama, kok.


REMOVE URL TOOL

  • Kalau URL sudah tidak ada di blog Anda lagi, Google akan me-remove URL dalam waktu 24 jam.
  • Kalau Anda mendapatkan notifikasi bahwa konten/URL ybs. masih ada di blog, saya sarankan untuk “close” lalu ngopi dulu.

TIP

  1. JANGAN PERNAH, saya ulangi, JANGAN PERNAH berpikir untuk me-redirect URL injection ke home atau ke post lain yang sehat hanya karena Anda aral dengan banyaknya URL not found. Itu akan membuat Googlebot berpikir bahwa URL injection benar-benar ada dan ditulis oleh Anda tapi sudah dialihkan ke halaman lain.
  2. URL injection yang dialihkan tidak bisa dihapus.
  3. Laman-laman not found itu akan hilang dari GSC dengan sendirinya. Biarkan waktu yang menghapus kenangan tentangnya.

STEP #4: DISAVOW BACKLINK

Biasanya, tujuan utama URL injection tipe gibberish content adalah untuk membuat link juice atau link building. Mendongkrak trafik sekaligus ranking si peretas dengan memanfaatkan web-web sehat. Dia akan mendapatkan backlink dari web sehat sementara kita mendapatkan pengunjung jadi-jadian. Bisa jadi backlink dari web botnet atau web zombie, bisa jadi dari web berisi spam lainnya. Ini akan berpengaruh buruk terhadap PageRank blog kita.

Langkah keempat adalah dengan disavow backlink atau meminta Google mengabaikan backlink-backlink dari sumber yang kita ajukan. Apakah disavow backlink masih perlu bahkan setelah algoritma Google Penguin dan Caffeine diaktifkan? Bukankah Google akan menurunkan bahkan menghapus web-web berisi spam? Yes, honey. We still need this tool.

Berhubung postingan ini sudah begitu panjang, saya tidak akan menjelaskan caranya. Anda bisa membaca How to Disavow Backlink yang ditulis oleh para punggawa Moz.com. Saya hanya akan memberika tip cara mengumpulkan data.

1. Google Search Console >> Search Traffic >> Link to Your Site

Anda akan menemukan 3 jenis link, pilih yang who links the most >> more. Unduh dari ketiga tombol download untuk memastikan tidak ada link yang tercecer.

2. Google Search Console >> Crawl >> Crawl Errors >> URL Not Found >> Linked From

Ada web dan link lain yang mengarah ke blog kita dan tidak ada di data link to your site. Bisa jadi karena belum terdeteksi. Untuk mengurangi risiko, masukkan semua eksternal link yang mencurigakan.

3. Ajukan Disavow

Ajukan disavow. Oh iya, lakukan untuk masing-masing properti. Misalnya, Anda punya dua properti untuk satu domain (yang satu memakai www, yang satu tidak). Buat dua, jangan disatukan karena masing-masing properti biasanya berisi backlink berbeda.

Berapa lama backlink dihapus? Well, tergantung sih. Dalam kasus saya, satu hari. Tidak ada notifikasi, tahu-tahu backlink itu sudah hilang.


DISAVOW BACKLINK TOOL

STEP #5: Stay Safe

  1. Hapus sitemap lama dan ajukan yang baru.
  2. Selalu logout setelah Anda mengakses blog. Note: logout berbeda dengan begitu saja menutup tab browser.
  3. Ganti password secara berkala.

STEP #6: MONITORING

Belajar dari pengalaman saya, sekali cracker menemukan celah keamanan di blog kita, maka mereka akan terus mengeksploitasi dan mencari celah lainnya. Terus monitoring dalam waktu minimal dua minggu selanjutnya.

  1. Unduh raw access logs setiap 2 hari sekali untuk memonitoring akses-akses mencurigakan juga untuk melihat apakah celah keamanan yang telah kita tutup masih terbuka atau tidak.
  2. Monitoring live traffic di WordFence, lihat apakah ada user agent atau IP address mencurigakan yang belum kita blok. Ada dua negara yang masuk ke dalam top list brute force attack, India dan Rusia. Kalau Anda menggunakan premium account, Anda bisa memblokir satu negara penuh bahkan satu benua kalau Anda mau.
  3. Monitoring GSC >> crawl errors, backlink, search analytics. Ketika saya menulis ini, masih banyak query asing, tapi query normal perlahan-lahan muncul dan mendatangkan trafik seperti biasa. Jumlah URL not found juga sudah jauh berkurang dari yang tadinya ribuan menjadi sekitar 300.
  4. Monitoring hasil penelusuran dengan metode site:namadomain.com, lihat apakah masih ada URL injection yang berkeliaran di SERPs. Kalau masih ada, langsung ajukan remove URL. Update per tanggal 15 Desember, URL injection sudah mundur jauh ke halaman 18. Minggu lalu 15 halaman pertama dipenuhi URL injection.
  5. Monitoring Google Analytics >> lihat organic traffic. Kalau masih ada organic traffic, kita boleh lega.
MOVE ON

Peretasan, apa pun jenisnya, bisa menimpa siapa saja. Bisa kepada saya, bisa juga kepada Anda. Ini pengalaman pertama saya berhadapan langsung dengan serangan yang begitu masif dan bertubi-tubi. Begadang selama berhari-hari, telat makan, dan malas jarang mandi. Mengalokasikan waktu, tenaga, dan pikiran demi satu tujuan: mengamankan blog saya.

Tapi saya bahagia.

Ketika tahu bahwa blog saya diretas, sebetulnya saya punya banyak pilihan yang lebih mudah. Instal ulang WordPress atau menyerahkan kepada ahli untuk menangani ini. Tapi itu bukan karakter saya. Saya lebih suka menghadapi masalah, face to face. Jujur, saya sama gapteknya dengan orang lain kalau masalah beginian. Namun, banyak hal yang saya pelajari, banyak ilmu yang akhirnya saya dapatkan. Saya jadi tahu celah keamanan blog saya, cara mengamankannya, dan lebih berhati-hati untuk ke depannya. Syukur-syukur kalau tulisan yang begitu panjang ini bisa bermanfaat bagi orang lain.

Sekarang waktunya untuk move on dan melanjutkan hidup.

Salam,
~eL

Share This