Reverse Engineering Ransomware Brain Cipher penyerang PDN

Di tulisan ini saya ingin sharing mengenai reverse engineering (RE) ransomware yang menyerang PDN. Saya tidak akan ikut-ikutan mencela berbagai pihak, hanya sekedar membahas teknis ransomwarenya, berikut kelemahan kecilnya yang memungkinkan sebagian data akan bisa didekrip tanpa key dalam kondisi tertentu.

Hal dasar mengenai ransomware pernah saya bahas di beberapa artikel saya yang lain sejak beberapa tahun yang lalu, misalnya tentang Ransomware Wannacry, dan Membongkar Ransomware.

Tentang Lock Bit

Lock Bit adalah keluarga ransomware yang sangat terkenal. Kisahnya sangat panjang dan bisa dibaca sendiri di berbagai tulisan di Internet, tapi beberapa hal pentingnya adalah:

  • Lockbit memakai sistem referal, jadi bisa saja orang dalam yang menjalankan ransomware meski semua sudah aman
  • Ada banyak target LockBit, cara yang mereka pakai adalah: untuk tiap target, mereka membuat malware baru, mereka menggunakan sebuah template EXE dan software builder. Jadi sebelum menyerang mereka akan membuat dua buah exe: locker.exe dan unlocker.exe
  • Tiap target bisa dikustomisasi, misalnya: isi README yang akan ditampilkan ke user (berisi alamat, encryption id, dsb), bisa juga fitur-fitur tertentu diaktifkan atau dinonaktifkan tergantung targetnya seperti apa.
  • Group asli lockbit sudah ditakedown oleh kerjasama polisi internasional
  • Sayangnya builder/generator LockBit ini sudah bocor, group manapun bisa membuat varian Lockbit dengan pesan yang berbeda-beda
  • Setiap Locker EXE yang dihasilkan memiliki key yang unik, yang digenerate ketika builder dijalankan. Locker.exe hanya berisi public key (untuk disebar) dan Unlocker.exe berisi private key (ini ditahan oleh group ransomwarenya).

Karena file exe lockbit dihasilkan/digenerate, maka perilaku malware bisa berbeda-beda tergantung config.json yang dipakai. Jadi penting sekali untuk mendapatkan sampel eksak yang menyerang suatu target, karena bisa berbeda-beda kelakuannya.

Sebagian isi config.json Lockbit Builder

Bagaimana Ransomware bisa masuk?

Ada ribuan cara ransomware bisa masuk, sampai saat ini bagaimana bisa masuk PDN semua hanya spekulasi. Tapi secara umum: jalur masuk apapun bisa dipilih attacker. Attacker biasa melakukan privilege escalation dan lateral movement untuk bisa menghack sistem asalkan sudah masuk ke satu sistem saja.

Untuk white hat yang ingin belajar ilmu semacam ini, bisa mengikuti sertifikasi sejenis OSEP. Di situ akan diajari bagaimana melakukan privilege escalation (naik hak jadi admin), lateral movement (bergerak ke sistem lain yang berhubung), dan termasuk juga teknik agar tidak terdeteksi oleh berbagai antivirus, dan bagaimana mendisable antivirus.

Setelah masuk manual, berbagai database bisa didump, berbagai file bisa ditransfer/upload ke remote system. Nanti file-file ini akan digunakan untuk memeras: kalau tidak bayar, data akan kami bocorkan.

Ketika varian lockbit menyerang

Setiap locker.exe yang dihasilkan akan memiliki Encryption ID yang berbeda, ini caranya group ransomware bisa mengidentifikasi korban. Korban akan melihat semua file terenkrip, dan ada README yang berisi alamat yang harus dikunjungi (dengan Tor browser), dan encryption ID.

Mulai chat dengan customer service ransomware

Pengguna bisa mengunjungi alamat tersebut, memasukkan encryption ID, lalu bisa chat dengan customer support group malware.

Kelemahan dan Revisi Lockbit

Lock Bit sudah sampai versi 3 dan sudah hampir bebas bug. Dulu ada bug sehingga kadang bisa mendapatkan kembali file tanpa membayar. Secara teknis, evolusi lockbit sangat panjang, sudah sampai 3.0. Algoritma enkripsi yang digunakan sudah berubah (tidak lagi AES, tapi memakai Salsa20 supaya lebih cepat), berbagai teknik obfuscation juga sudah ditambah agar semakin sulit membongkar malwarenya.

Sampel PDN

Tak lama setelah peristiwa ini, BSSN menerbitkan IOC (indicator of compromise), sayangnya versi pertama sangat ngawur (misalnya: ada yang MD5 sama dengan SHA1, ada file normal dimasukkan sebagai indikator malware). Tapi kemudian BSSN menerbitkan versi kedua, lalu ketiga yang sepertinya lebih benar.

Versi kedua IOC dari BSSN

Dari hashnya kita bisa mencari sampel Lockbit dari berbagai situs sharing malware. Meskipun terlihat ada 4 baris di tabel, itu, hanya ada 2 file yaitu win_old.exe (bisa download di: VExchange · Virus.exchange) dan win.exe (juga ada di: Virus.exchange).

Mana yang benar menginfeksi PDN? sulit sekali mencari informasi ini, jadi cara termudah adalah: saya jalankan keduanya di virtual machine saya (terputus dari Internet, agar mengenkrip file lokal adn membuat README ransom), hasilnya: file pertama itu yang masuk akal, karena berbagai alasan:

  1. File win.exe sudah ada di aneka situs malware sejak 19 juni, sebelum peristiwa PDN
  2. File win_old.exe jika dijalankan akan membuat readme dengan encryption ID, dan jika saya kunjungi website ransomwarenya dan saya buka chatnya maka keluar tagihan 8 juta USD, dan isi chat. Sedangkan untuk sampel satu lagi (win.exe), chat ID-nya tidak valid
Chat ransomware PDN

Sebagai catatan: sulit sekali saya mendapatkan sampel eksak, dari berbagai pihak tidak ada yang mau ngeshare. Sudah dijelaskan panjang lebar, tapi tetap bebal. Ini jawaban Kominfo waktu ditanya sampelnya, malah diberikan versi lama di github, waktu ditanya apakah sampel eksak malah dijawab:

Mereka pikir file datanya cukup buat dibruteforce:

Saya menyerah berhadapan dengan mereka

Padahal sudah dijelaskan susah payah kenapa butuh sampel eksaknya, supaya tahu apakah ini varian baru, atau versi lama yang ada bugnya. Bahkan sekarang LockBit tidak lagi memakai AES256, tapi memakai Salsa20.

Oh iya, itu bukan percakapan dengan saya langsung, tapi teman saya Deny yang berusaha mendapatkan sampel juga. Deny ini temen yang di cerita posting saya yang ini. Saya punya cukup banyak temen di Indonesia yang jagoan RE, tapi tidak ada yang dilibatkan di kasus PDN ini.

Bug Keystream Reuse

Penjelasan bug ini sudah sangat jelas ada di situs ini (ini sudah saya share via berbagai group umum dan berbagai jalur lain):

https://blog.calif.io/p/dissecting-lockbit-v3-ransomware#%C2%A7keystream-reuse-vulnerability

Tapi karena ternyata agak sulit dipahami oleh orang awam (bahkan orang IT), saya akan coba jelaskan lagi di sini dengan lebih sederhana, plus saya buat POC (Proof Of Conceptnya) untuk membuktikan bahwa memang bugnya berjalan, dan berlaku untuk varian yang menyerang PDN, serta apa syarat eksaknya supaya file bisa didekrip tanpa master key.

Pertama, jika belum paham tentang dasar enkripsi, baca dulu tulisan saya: Unbreakable Encryption. Supaya paham beberapa hal dasar tentang enkripsi dan kenapa tidak bisa memakai brute force.

Hal yang perlu dipahami adalah: dari sebuah key, kita bisa menghasilkan bilangan “random” yang tak terhingga banyaknya. Ini istilahnya adalah keystream. Keystream ini bisa dioperasikan ke data (plaintext), biasanya operasinya adalah XOR.

XOR beroperasi di level bit, jika dua bit operand berbeda maka hasilnya 1 dan jika sama maka hasilnya 0. Operasi XOR memiliki properti bahwa: jika A XOR B = C, maka C XOR B = A dan C XOR A = B.

LockBit tidak mengenkripsi keseluruhan file, apalagi jika filenya besar, bisa ada area “SKIP” yang besarnya puluhan gigabyte. Jika misalnya sebuah virtual machine terenkripsi, maka ada kemungkinan data di tengah-tengah yang bisa diselamatkan (asalkan paham algoritma skip yang digunakan malware, yang sudah dijelaskan di artikel yg saya link).

Kenapa lompat seperti ini? karena mengenkrip file besar butuh waktu lama. Ransomware ingin efeknya maksimum, itu juga alasannya tidak memakai AES lagi, karena lambat, dan diganti dengan Salsa20.

Ukuran skip (bagian yang tidak dienkrip) vs ukuran file

Dulu kebanyakan ransomware tidak mengenkrip nama file, hanya sekedar ditambahkan namanya di akhir, misalnya: README.txt.encrypted. Sekarang ransomware LockBit bisa diset (lihat config.json) agar mengenkrip nama file.

Tentunya supaya bisa dikembalikan, nama filenya harus disimpan oleh ransomware ini. Di mana di simpannya? di bagian footer. Tepatnya lagi yang dilakukan malware ketika mengenkrip sebuah file adalah:

  • Mengecek apakah filenya perlu diskip atau tidak, file tertentu (misalnya EXE, DLL, BAT) akan diskip supaya user tetap bisa masuk/login ke Windows dan membaca tuntutan ransom
  • Membuat key PER FILE, keynya berupa matriks inisialisasi untuk Salsa20 (yang penting diketahui: panjang key ini 64 byte)
  • Mengkompres NAMA file (bukan isi file) dengan library apLib (https://ibsensoftware.com/products_aPLib.html)
  • Di akhir/footer file: Menuliskan nama file (yang sudah dikompresi), panjang nama file, informasi mengenai “skip” dan key untuk file ini
  • Footer tersebut dienkrip lagi, karena kalau tidak dienkrip, gampang sekali mengembalikan filenya seperti semula

Nah bagian enkripsi Footer ini: di LockBit/Brain Cipher versi yang menyerang PDN, tiap 1000 file, keynya sama. Sekali lagi supaya jelas:

  • Tiap file KEY-nya berbeda (KEY _PER_FILE)
  • KEY tiap file ini dienkripsi lagi dengan KEY_PER_1000_FILE
  • KEY_PER_1000_FILE ini dienkrip dengan RSA

Jika kita punya RSA key dari pembuat malwarenya, maka kita bisa:

  • membuka KEY_PER_1000_FILE, dan hasilnya kita bisa
  • membuka KEY_PER_FILE, lalu mendekrip filenya

Tapi mendapatkan RSA key 1024 bit ini mustahil, kecuali mendapatkannya dari pembuat malware, atau cracking dengan super komputer.

Mari kita skip berbagai bagian footer ransomwarenya, hanya ke bagian yang menarik saja: nama file dan key per file. Perhatikan gambar berikut ini, ini adalah PENYEDERHANAAN , detailnya sedikit lebih kompleks dari ini (di contoh ini namanya tidak dikompres dulu, dan ada beberapa field yang saya skip):

  • Di footer file pertama (yang namanya A.TXT), isinya adalah A.TXT diikuti oleh KEY1 (key file pertama)
  • Di footer file kedua (yang namanya YOHANES.TXT) isinya adalah YOHANES.TXT diikuti oleh KEY2 (key file kedua)
  • Asumsinya kedua file ini masih memakai KEY_PER_1000_FILE yang sama (kemungkinan besar jika file di satu direktori, maka masih sama)
  • Kita tidak bisa tahu apa key yang sebenarnya, tapi di sini saya contohkan saja bilangan random. Kita tidak tahu keynya karena sudah dienkrip dengan KEY_PER_1000_FILE

Dari gambar di atas, yang kita ketahui adalah:

  • D: footer dari file A.TXT yang sudah dienkrip
  • E: footer dari file YOHANES.TXT yang sudah dienkrip
  • Kita asumsikan bahwa kita tahu apa nama file asli E. Misalnya bisa tahu karena di tengah2 filenya ada bagian tidak dienkrip, atau mungkin dari ukuran filenya, dan kita ingat nama filenya apa.
  • Nah sekarang kita bisa melakukan XOR nama file asli E (YOHANES.TXT) dengan E, hasilnya adalah: kita mendapatkan PARTIAL KEY F (tidak lengkap sampai habis, kita tetap tidak tahu isi KEY2)
  • Tapi dari PARTIAL KEY (F) ini jika diXORkan dengan D (footer A.TXT), maka akan terlihat KEY1 milik A.TXT

Jadi kelemahan ransomware yang ditemukan adalah:

  • Jika ada file yang namanya pendek (misalnya: backup.zip)
  • Dan ada file yang namanya panjang (misalnya: “Informasi Klaim – Asuransi Mikro Hospital Cash Plan 5 Diseases (Juli 2024).txt”)
  • Dan keduanya dienkrip dengan key yang sama (misalnya filenya sama-sama ada di Documents)
  • Maka file backup.zip bisa didekrip isinya, karena keynya bisa ditemukan

Tepatnya lagi, yang perlu dibandingkan adalah panjang nama file (bukan isi file) setelah dikompresi dengan aplib. Contohnya string “backup.zip” jika dikompress menjadi 22 karakter (karena dikonversi dulu menjadi UTF-16, lebih panjang dari teks ASCII/UTF-8-nya) dan “Informasi Klaim – Asuransi Mikro Hospital Cash Plan 5 Diseases (Juli 2024).txt” menjadi 107 karakter.

Berikut ini POC/Proof of concept (berhasil dekrip, tapi masih buggy, hasil decryptnya ada junk setelah data yang sudah terdekrip dengan benar, jika saya ada waktu akan saya perbaiki)

https://github.com/yohanes/lockbit-v3-linux-decryptor

Di POC (proof of concept saya), saya hanya mengetes kasus sederhana: Perbedaan panjang nama file pendek vs panjang (yang sudah dikompress) harus minimal 82 karakter. Tapi jika dioptimasi, bisa menangani perbedaan sampai 64 karakter saja, atau bahkan 62 karakter jika ingin membrute force 2 karakter terakhir.

Bagaimana mengetes POC ini?

  • download sampel ransomware ke dalam virtual machine
  • buat dua file, satu namanya pendek, satu cukup panjang (perbedaaan nama jika sudah dikompresi aplib > 82 karakter), isi file-nya terserah
  • jalankan ransomware dalam VM, tunggu sampai mengenkrip kedua file tersebut
  • copy kedua file hasil enkrip ke Linux
  • jalankan dengan parameter nama file pende, nama file panjang, dan nama asli file yang panjang

./stream-reuse shortname1 longname1 "Informasi Klaim - Asuransi Mikro Hospital Cash Plan 5 Diseases.txt"

POC ini masih bisa diperbaiki supaya bisa otomatis mencoba-coba nama file umum, bisa diperbaiki agar bisa memproses banyak file secara parallel, dsb.

Reverse Engineering Lanjutan

Apakah mungkin masih ada bug lain? mungkin ada, mungkin juga tidak. Tapi ini adalah contoh di mana reverse engineering bisa digunakan untuk recovery sebagian file. Apakah ada contoh kemungkinan bug lain?

Di versi lama Lockbit, generator key untuk Salsa20 adalah RtlRandomEx, fungsi ini merupakan PRNG (Pseudo Random Number Generator) jenisnya LCG (Linear Congruential Generator), kita bisa mencari seed atau memprediksi bilangan randomnya untuk mendapatkan semua key salsanya tanpa perlu memiliki private key RSA-nya. Di versi baru sudah memakai instruksi hardware RDRAND yang ada di prosesor Intel sejak 2012.

Tapi untuk melakukan reverse engineering ini:

RE memang tidak bisa dipakai menemukan key, tapi bisa dipakai menemukan bug pada sebuah ransomware (jika ada bugnya).

Penutup

Sangat disayangkan bahwa setelah berbagai kesalahan yang dilakukan, berbagai pihak masih menutup diri untuk bantuan merecover datanya, bahkan mendapatkan sampel ransomwarenya saja sulit sekali. Padahal jika punya sampel eksaknya, berbagai kemungkinan recovery bisa dicoba. Perlu diingat juga bahwa kalaupun file dirahasiakan, data yang sudah didapatkan oleh group ransomware akan tetap disebarluaskan ke semua orang.

Seperti yang sudah saya sebutkan di atas, contoh recoverynya adalah:

  • membuat program file carver khusus yang menskip byte terenkripsi untuk mengekstrak data yang tidak terenkrip dari sebuah virtual machine (algoritma skip didapatkan dari RE)
  • merecover sebagian file jika ada file lain yang namanya lebih panjang

Satu-satunya alasan tidak membagikan sampel adalah jika ingin membayar ransomnya. Dalam kasus ini:jika orang lain tahu ID enkripsinya, maka bisa melihat percakapan dengan group ransomwarenya (seperti screenshot saya di atas).

Andaikan tulisan ini tidak membantu PDN, semoga bisa menjadi pelajaran bagi yang baru belajar Reverse Engineering.

2 thoughts on “Reverse Engineering Ransomware Brain Cipher penyerang PDN”

  1. sudah benar kerja dan hidup outside of indonesia Pak, sengaja dilama lamain karena memang biar dananya ngucur.

  2. Terima kasih pak Yohanes, dengan membaca artikel ini, otak saya yang awalnya cuma doyan “npm install” sekarang tertarik sama cara kerja Salsa20

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.