Pada awal Oktober, tim riset X-Labs mengidentifikasi kampanye malspam yang menargetkan bisnis dan individu di Italia melalui PEC (Posta Elettronica Certificata). PEC adalah sistem email bersertifikat yang umum digunakan di Italia untuk komunikasi yang aman dan diakui secara hukum. Sistem ini banyak diadopsi oleh individu, bisnis, dan administrasi publik—terutama dalam kasus di mana bukti komunikasi diperlukan. Karena sifatnya yang dipercaya, PEC sering dieksploitasi oleh penjahat siber untuk tujuan jahat. Tim kami mengamati banyak email malspam serupa yang menargetkan berbagai entitas melalui telemetri cloud mereka. Gambar 1 menggambarkan contoh email yang menggunakan PEC untuk menyebarkan kode berbahaya. Email tersebut ditujukan untuk pelanggan Italia. Isi email telah diterjemahkan ke dalam bahasa Inggris sebagai berikut: Nama perusahaan dan alamatnya telah sengaja disensor untuk melindungi informasi mereka. Aktor ancaman menyamarkan URL sebenarnya dengan menggunakan nama perusahaan sebagai teks tautan. Dalam email di atas, kami mengidentifikasi tautan berbahaya, yaitu: hxxps://nk916b6wt4xq0kq92uq9a5b8xdk19cqbizqfbty7sw1jehqee3ds[.]customerconverse[.]com/aoc9h3 Subdomain tersebut tampaknya dihasilkan oleh DGA dan terlihat acak. Terdapat informasi minimal tentang domain tersebut, sehingga kemungkinan besar dikendalikan oleh penyerang. Pada saat analisis, URL tersebut aktif dan mengunduh file JavaScript berbahaya (_Fattura_38377668.js). Mari kita lihat lebih dekat struktur skrip dan analisis perilakunya. Analisis JavaScript Setelah pemeriksaan awal, skrip tersebut tampak sangat obfuscated, sehingga sulit untuk mengetahui fungsionalitas aslinya. Untuk lebih memahami operasinya, kami melakukan proses de-obfuscation. Terdapat 3 fungsi dalam skrip tersebut: honour_march_0thehas() honour_march_0wasbut(thehas, wasbut) hvngqasq(zfutxpog) Mari kita breakdown setiap fungsi untuk memahaminya: Fungsi honour_march_0thehas() Di dalam fungsi ini, sebuah variabel bernama overchurch dideklarasikan, yang merupakan array yang berisi empat string. String dalam array overchurch tampaknya merupakan data yang diobfuscated atau di-encode. Tanpa konteks lebih lanjut, sulit untuk menentukan tujuan pasti mereka, tetapi mereka mungkin mewakili informasi yang dienkripsi atau di-encode yang dapat digunakan di tempat lain dalam kode. Gambar 2 menunjukkan cuplikan kodenya. Fig. 2 – Overchurch code snippet Fungsi honour_march_0wasbut(thehas, wasbut) Fungsi ini mengambil dua parameter: – thehas – objek atau array yang menyimpan data yang di-encode. – wasbut – kemungkinan berfungsi sebagai kunci atau parameter tambahan untuk decoding. Fungsi ini memanggil fungsi yang telah didefinisikan sebelumnya, honour_march_0thehas(), untuk mengambil array string (disimpan dalam viiheld). Fungsi luar honour_march_0wasbut kemudian ditugaskan ulang menjadi fungsi dalam yang melakukan operasi tertentu. Parameter input pertama dari fromhabit disesuaikan dengan mengurangi 301 (0x12D). Nilai ini kemudian digunakan untuk mengindeks ke dalam array viiheld Fig. 3 – Deciphering the function Jika honour_march_0wasbut[‘AiPGsL’] tidak terdefinisi, fungsi ini menginisialisasi beberapa fungsi dan variabel. Metode decoding base64 kustom (ditunjukkan dalam Gambar 4): – Mengambil parameter input bernama Wallsmisleading, yang diharapkan berupa string yang di-encode dengan Base64. – Menggunakan operasi bitwise dan aritmetika modular untuk mengonversi setiap karakter Base64 menjadi nilai biner yang sesuai. – Nilai biner yang telah didekode kemudian dikonversi kembali menjadi karakter menggunakan String.fromCharCode. – Setelah decoding, fungsi ini membangun string yang di-encode URL. Setiap nilai karakter dikonversi ke format percent-encoded. – Akhirnya, fungsi ini mengembalikan string yang sepenuhnya terdecode URL. – Operasi bitwise menambahkan lapisan kompleksitas, yang bisa jadi upaya untuk menyembunyikan logika decoding. Fig. 4 –Custom base4 decoding method Dekoding seperti cipher menggunakan operasi XOR (ditunjukkan dalam Gambar 5): – Fungsi ini menggunakan sebuah kunci (yang berasal dari input wAllsmisleading) untuk mendekode string input (vIiheld) dengan cara melakukan XOR pada karakter-karakter. Fig. 5 – XOR operations Fungsi (Gambar 6) mencoba untuk mengambil hasil yang telah dihitung sebelumnya dari parameter thehas (yang kemungkinan adalah array atau objek) menggunakan indeks fromhabit yang telah disesuaikan dan ownchurch. Fig. 6 – Retrieving function Akhirnya, fungsi ini mengembalikan nilai yang terdekode. Fungsi `hvngqasq(zfutxpog)` Fungsi ini menerima string heksadesimal (zfutxpog), memastikan bahwa jumlah karakternya genap, dan mengonversi setiap pasangan dua karakter menjadi nilai integer yang sesuai. Array angka yang dihasilkan kemudian dikembalikan. Gambar 7 menunjukkan cuplikan kodenya. Fig. 7 – Number array code snippet Selanjutnya, ada 3 variabel yang sekarang akan merujuk pada fungsi `honour_march_0wasbut`: – `uaxpaudedmqohlyd` – `ysqyhmnt` – `hkjtqnfwmnjzwo` Ada 2 variabel yang menyimpan nilai yang dikembalikan dari fungsi `hvngqasq` (lihat Gambar 9): – `aosfxhvcl` – `ollazxbarpu` Fig. 8 – Two variables Dengan CyberChef, nilai yang dikembalikan dari fungsi `hvngqasq` dihitung. Gambar 9 menunjukkan resep CyberChef: Fig. 9 – CyberChef recipe Mari kita lanjutkan untuk memeriksa bagian-bagian kode di mana nilai yang dikembalikan digunakan. Gambar 10 menunjukkan kode di mana variabel-variabel ini digunakan. Fig. 10 – Variable code snippet Ada operasi XOR antara elemen dari dua array, aosfxhvcl dan ollazxbarpu, dan mengubah hasilnya menjadi karakter menggunakan String.fromCharCode(). Kode tersebut cukup jelas. Untuk memeriksa nilai yang disimpan dalam variabel cqlduvdo, kami membuat kode Python berikut: Fig. 11 – Python code Fig. 12 – Returned result Voila! Ini mengungkap beberapa informasi menarik. Meskipun masih tampak ditulis dalam PowerShell dan terlihat terobfuski, mari kita bahas elemen kunci. – new-alias press c$($qgbulzirjil)l;: Ini membuat alias baru bernama press, dan membuatnya secara dinamis berdasarkan variabel $qgbulzirjil. $qgbulzirjil didefinisikan sebagai ‘ur’, sehingga c$($qgbulzirjil)l diperluas menjadi ‘curl’, menjadikan press sebagai alias untuk curl (yang digunakan untuk mengirim permintaan HTTP). – $bumtcbxgwj=(7251,7253,7270… mendefinisikan serangkaian angka, dan loop berikutnya melakukan iterasi melalui angka-angka tersebut. Setiap angka dikurangi 7148, dan angka yang dihasilkan diubah menjadi karakter. Ini menunjukkan bahwa angka-angka tersebut mewakili kode ASCII yang terobfuski. Kami mendekode bagian ini untuk melihat outputnya. Berikut adalah kode Python di bawah ini: Fig. 13 – Pytohn script (ASCII codes) URL yang DIDEKODE: gizpvovur.top/1.php?s=mints13 – .$([char](9992-9887)+’e’+’x): Ini secara dinamis membangun dan mengeksekusi sebuah perintah. Hasil matematikanya adalah 105, yang merupakan kode ASCII untuk ‘i’, sehingga ini menjadi iex, singkatan untuk perintah PowerShell Invoke-Expression, yang mengeksekusi kode di dalamnya. – Skrip ini mengunduh atau berinteraksi dengan URL gizpvovur[.]top/1.php?s=mints13 menggunakan curl. Perilaku ini bisa menjadi bagian dari skrip untuk mengambil payload atau instruksi lebih lanjut dari server jarak jauh, dan memiliki potensi niat jahat. Mari kita lanjut ke langkah berikutnya. Gambar 14 menunjukkan cuplikan kode lanjutan: Fig. 14 – Folllow-up code snippet Sekali lagi, sebuah array dibuat dan diberikan ke variabel nkgkunojefmjc. Seperti yang disebutkan sebelumnya, variabel uaxpaudedmqohlyd, ysqyhmnt, dan hkjtqnfwmnjzwo merujuk ke fungsi honour_march_0wasbut, yang menyebabkan beberapa fungsi dan variabel diinisialisasi jika kondisi tertentu (yang disebutkan di atas) tidak terpenuhi. Ini sangat memakan waktu untuk mendekode fungsi secara manual, tetapi kita bisa melakukan…