Ayo Lawan Bot XMLRPC

Bila anda adalah pengguna WordPress, maka anda harus membaca artikel ini. Mengapa? Karena di dalam WordPress, ada satu file yang ibaratnya adalah usus buntu. Seperti kita ketahui, usus buntu memang ada manfaatnya, tapi bila terkena infeksi, maka bisa membuat repot dan sering kali usus buntu itu harus dibuang.

Demikian pula dengan WordPress. Di dalam WordPress, ada satu file bernama xmlrpc.php (untuk selanjutnya disebut XMLRPC). Sebenarnya file ini berguna agar WordPress dapat berkomunikasi dengan sistem lain, misalkan aplikasi WordPress di ponsel. Tapi zaman sekarang telah amat jarang orang mengetik blog dari aplikasi WordPress. Alih-alih mendapat manfaat, file ini justru sering menjadi incaran peretas sebagai pintu gerbang pertama sebelum penetrasi lebih dalam ke server.

XMLRPC singkatan dari “XML Remote Procedure Call”, yaitu protokol komunikasi jaringan yang memungkinkan aplikasi di dalam bahasa pemrograman yang berbeda untuk berkomunikasi dengan satu sama lain melalui jaringan menggunakan XML sebagai format pesan yang diambil atau dikirim melalui protokol HTTP atau HTTPS. Jadi, bukan hanya WordPress yang memakai ini. CMS lain pun mungkin ada.

Berdasarkan laporan, 43% dari semua situs web menggunakan WordPress sebagai sistem manajemen konten mereka. Jika kita mempertimbangkan jumlah situs web yang menggunakan CMS yang diakui, kita dapat mengatakan bahwa WordPress mendominasi 64,8% dari internet.

Para peretas pemula tidak berminat meretas situs-situs web yang dijaga ketat secara profesional seperti situs web Pentagon. Yang penting bisa men-deface situs web orang lain kemudian namanya muncul di situ, bagi mereka ini sudah sangat menyenangkan.

Karena di Internet ada 400 juta situs web aktif, maka akan sangat melelahkan bila dicek kerentanannya secara manual satu persatu, Maka mereka memakai Bot. Bot ini akan bekerja non-stop 24×7 untuk memanen situs-situs web di mesin pencari, kemudian satu persatu dicoba. Bila gagal dibobol, pindah lagi ke situs web lain. Demikian seterusnya.

Maka tak heran, bagi anda yang mempunyai akses ke file error log, akan banyak ditemui baris-baris seperti ini:

2023/05/10 19:48:53 [error] 4938#4938: *1442 access forbidden by rule, client: xxx.xxx.xxx.xxx, server: www.example.com, request: “GET /xmlrpc.php HTTP/1.1″, host: “www.example.com”

Server saya dihujani akses ilegal ini hampir tiap 30 detik sekali. Kadang kala malah hanya berselang satu detik. Ini cukup merepotkan bagi situs web yang menempati VPS dengan spec rendah, sebab seolah-olah diserang oleh DDOS, dan mungkin saja bisa membuat server macet. Mending bila hanya file xmlrpc.php yang diakses. Sering kali bot juga mencoba file-file dan folder-folder lain, misalkan file wp-config.php.

Untunglah, server saya telah dipasangi sistem dengan alur sebagai berikut:

  1. Bila ada akses ke file xmlrpc.php, maka IP address itu langsung di-blok oleh firewall.
  2. IP address itu dilaporkan ke Cloudflare agar juga diblok. Ini lumayan bisa melindungi puluhan situs web saya yang lain.
  3. Juga dilaporkan ke AbuseIPDB.com agar teman-teman para admin server di seluruh penjuru Bumi juga dapat melakukan tindakan mitigasi sebelum IP address itu mendatangi servernya. Cara kerjanya mirip TrueCaller yang bila satu pengguna menandai nomor HP tersebut sebagai spammer, maka seluruh pengguna TrueCaller yang lain ikut dilindungi.

Pada artikel ini, saya akan memandu poin pertama. Poin ke-2 dan ke-3 perlu pembahasan lebih panjang sehingga tidak dibahas di sini.

Kita samakan dulu sistem yang dipakai.

Saya memakai:

  • Ubuntu.
  • PHP-FPM.
  • Nginx.

Bila sistem anda berbeda, mungkin harus ada yang diubah pada settingan di bawah ini, terutama pada filter Fail2Ban. Oke, mari kita mulai.

Install Nginx:

sudo apt update
sudo apt install nginx
systemctl start nginx
systemctl enable nginx

Berikutnya install PHP. Saya memakai PHP 8.1. Sila disesuaikan angkanya bila anda masih ingin memakai PHP versi lain.

sudo apt install php8.1 php8.1-fpm

Itu hanya contoh minimal. Sila ditambahkan ekstensi lain yang dibutuhkan.

Sekarang kita masuk tahap menyiapkan blok server Nginx. Misalkan anda mempunyai satu domain bernama example.com. Mari kita buat blok servernya.

nano /etc/nginx/conf.d/example.com.conf

Kemudian ketik ini:

server {

  listen 80;
  listen [::]:80;
  server_name example.com www.example.com;
  root /var/www/example.com/wordpress;
  index index.php;

  error_log /var/log/nginx/error.example.com.log;

  location ~ /(xmlrpc|wp-config)\.php$ {
    deny all;
  }

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    include fastcgi_params;
    fastcgi_intercept_errors on;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }
}

Konfigurasi di atas bisa memblok akses ke xmlrpc.php dan wp-config.php
Simpan dengan cara menekan Ctrl + O, enter, Ctrl + X.

Reload Nginx akan konfigurasi di atas terbaca.

nginx -s reload

Install WordPress di folder /var/www/example.com/wordpress. Caranya:

mkdir /var/www/example.com
cd /var/www/example.com
wget https://wordpress.org/latest.zip
unzip latest.zip

Buat username dan database untuk instalasi WordPress ini, kemudian lakukan instalasi memakai peramban dengan mengetik http://example.com
Langkah ini dilewati saja ya? Terlalu panjang bila dibahas. Anda pasti sudah bisa.

Sekarang kita masuk ke intinya.

Sampai di sini sebenarnya xmlrpc.php sudah tidak bisa diakses oleh siapa pun, sebab telah diblok oleh Nginx. Tapi kita belum membuat serangan balik ke bot. Mari kita memberi pelajaran bahwa semut pun bisa melawan bila diinjak. Kita lawan memakai fail2ban.

Memasang Fail2Ban

Hal penting yang harus diperhatikan adalah: Yang dipraktikkan di sini tidak berfungsi bila situs web anda “bersembunyi” di balik proxy-nya Cloudflare (Proxy Status: Proxied). Mengapa? Karena ketika Proxy diaktifkan, Cloudflare akan menjadi orang ke-tiga yang berdiri di tengah-tengah antara bot dengan server anda. Akibatnya yang diblok adalah IP addressnya Cloudflare.

Ada pengaturan tambahan agar server anda tetap dapat memakai Cloudflare, tapi itu nanti saja kapan-kapan dibahas. Sekarang dianggap anda tidak memakai Proxy Cloudflare, atau memakai Cloudflare tapi Proxy Status = DNS Only.

Mari kita mulai. Ketik perintah ini:

sudo apt update
sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.{conf,local}

Kita membuat filter untuk XMLRPC bernama nginx-xmlrpc.

cd /etc/fail2ban/filter.d
sudo nano nginx-xmlrpc.conf

Ketik seperti ini:

[Definition]
failregex = \[error\] \d+#\d+: \*\d+ access forbidden by rule, client: <HOST>, server: [a-zA-Z.]+, request: "(GET|POST) \/+xmlrpc.php
ignoreregex =

Perhatikan bahwa failregex di atas ditulis berdasarkan isi file log. Bila isi file log berbeda, maka regex-nya pun berbeda.

Simpan dengan menekan tombol Ctlr+O, Enter, Ctrl+X.
Setelah itu kita mengedit file jail.local dengan perintah:

sudo nano /etc/fail2ban/jail.local

Ketik kode di bawah ini.

[nginx-xmlrpc]
enabled = true
port = http,https
filter = nginx-xmlrpc
logpath = /var/log/nginx/error.*.log
maxretry = 1
bantime = 24h

Arti dari konfigurasi di atas adalah: Bila di dalam file log yang bernama error.example.com.log terlihat ada percobaan mengakses file xmlrpc.php, maka IP address tersebut diblok selama 24 jam.

Reload agar konfigurasi itu diterapkan.

sudo fail2ban-client reload

Untuk mengetahui sudah berapa IP address yang diblok, berikan perintah:

sudo fail2ban-client status nginx-xmlrpc

Bila ingin mengetes apakah filter kita berfungsi, gunakan Peramban untuk membuka http://example.com/xmlrpc.php. Akan muncul pesan error File not found. Tapi diam-diam IP address anda telah diblok. Coba saja buka kembali http://example.com. Seharusnya anda tidak bisa membuka example.com untuk yang kali ke dua (karena diblok). Tunggu 24 jam untuk bisa mengakses situs web itu lagi.

Untuk membuka blokiran (terlalu lama bila harus menunggu 24 jam), ketik:

sudo fail2ban-client unban xxx.xxx.xxx.xxx

Di mana xxx adalah IP address anda.

Alternatif lain untuk mengecek apakah filter berfungsi adalah dengan mengetik:

sudo fail2ban-regex /var/log/nginx/error.example.com.log /etc/fail2ban/filter.d/nginx-xmlrpc.conf

Semoga artikel ini bermanfaat. Sila link artikel ini dishare, tapi mohon artikelnya jangan dicopas ke blog anda ya!

Di atas adalah konfigurasi minimal. Anda harus melakukan setting tambahan agar server anda makin sulit diretas. Bila anda tidak yakin, boleh hubungi saya untuk dibantu disetting.

Web Hosting

Leave a Reply