Kisah Liburan Saya yang Hancur karena Reverse Engineering WSC
(blog.es3n1n.eu)- defendnot, yang dibuat saat perjalanan ke Seoul, adalah alat yang mencoba menonaktifkan Windows Defender dengan memanggil langsung API layanan Windows Security Center (WSC), dan berujung pada beberapa hari reverse engineering
- Alat sebelumnya, no-defender, menggunakan kode antivirus yang sudah ada untuk mendaftarkan bahwa ada antivirus lain di WSC; setelah meraih sekitar 1,5 ribu star GitHub, alat itu dihapus karena permintaan DMCA dari pengembang antivirus
- Awalnya, pemanggilan COM API WSC berhasil direproduksi dalam sekitar 1 jam, tetapi WSC memverifikasi proses pemanggil sehingga akses dari proses biasa ditolak
- Dari hasil analisis, WSC memeriksa WinDefend SID, hak administrator, tanda tangan, serta flag
ForceIntegritypadaDllCharacteristicsPE, dan implementasi akhirnya menggunakanTaskmgr.exe - Implementasi diselesaikan sambil memperbaiki error path
ctx.bindan masalah kondisi daya autorun, dalam lingkungan yang melibatkan MacBook arm64, PC jarak jauh di AS, latensi Parsec 210 ms, hingga VM Shadow.tech
Latar belakang pembuatan defendnot
- defendnot adalah alat yang menggunakan langsung API layanan Windows Security Center untuk menonaktifkan Windows Defender
- Inti dari proses implementasinya bukan pada pemanggilan WSC itu sendiri, melainkan pada upaya melewati satu per satu kondisi verifikasi yang menghalanginya serta lingkungan kerja yang merepotkan
- Dokumentasi teknis WSC yang lebih detail akan dipublikasikan nanti oleh orang lain
no-defender dan DMCA setahun lalu
- no-defender, yang dirilis sekitar setahun lalu, menggunakan Windows API untuk antivirus guna mematikan Windows Defender
- API ini digunakan untuk memberi tahu sistem bahwa “sudah ada antivirus lain, jadi pemeriksaan Defender tidak perlu dijalankan”
- Komponen sistem yang mengelola area tersebut adalah Windows Security Center (WSC)
- no-defender bekerja dengan memakai kode pihak ketiga dari antivirus yang sudah ada untuk memaksa antivirus tersebut terdaftar di WSC
- Dalam beberapa minggu setelah dirilis, proyek itu mendapat sekitar 1,5k stars, lalu setelah pengembang antivirus yang kodenya digunakan mengajukan permintaan DMCA takedown, isi repositori dihapus dan proyeknya diakhiri
Analisis WSC dimulai lagi saat perjalanan ke Seoul
- Saat menginap di Airbnb di Seoul, MrBruh melihat-lihat no-defender lalu mengirim pesan bahwa ia sedang meneliti apakah implementasi yang “bersih” tanpa binary antivirus memungkinkan
- Biasanya untuk CTF atau pekerjaan reversing x86, penulis membawa laptop x86 terpisah, tetapi dalam perjalanan kali ini hanya membawa M4Pro MacBook
- Meski kondisinya kurang menguntungkan karena tidak ada perangkat x86 untuk reversing, analisis WSC dimulai dengan memanfaatkan waktu sebelum teman-teman bangun
Hari 1: Mereproduksi COM API WSC dan penolakan akses pertama
- MrBruh menyediakan binary WSC terbaru, dan implementasi pendaftaran WSC dari antivirus yang sebelumnya digunakan dijadikan implementasi referensi
- Di WSC ada COM API yang digunakan antivirus, dan pemanggilan yang dilakukan antivirus lama berhasil direproduksi dalam sekitar 1 jam
- Pengujian dilakukan dengan mem-boot Windows arm64 di Parallels, tetapi hasilnya adalah access denied
- Berdasarkan pengalaman sebelumnya, diketahui bahwa WSC memverifikasi proses pemanggil API, dan pada awalnya verifikasi tanda tangan diduga sebagai kemungkinan penyebab
- Setelah kode diinjeksikan ke proses yang digunakan antivirus lama untuk pekerjaan WSC, pemanggilan COM untuk pendaftaran antivirus baru dan pembaruan status berjalan normal
Upaya menghapus binary antivirus
- Agar proyek baru tidak kembali dipermasalahkan oleh vendor antivirus lama, binary antivirus ingin diganti dengan binary yang disediakan sistem
- Proses target pertama yang dipilih adalah
cmd.exe, tetapi pemanggilan API WSC ditolak - Saat memeriksa
wscsvc.dll, ditemukan kode yang memeriksa apakah proses pemanggil adalah PPL - Proses yang dibuat dengan
CreateProcessAbiasa bukan proses terlindungi PPL, dan pada dini hari itu pekerjaan tidak bisa dilanjutkan lebih jauh
Hari 2: Membangun lingkungan remote debugging yang merepotkan
- Di MacBook arm64, Windows x86 sulit ditangani dengan baik, dan penulis ingin menghindari bekerja di lingkungan arm64 atau tidak bisa memakai x64dbg
- Teman penulis, pindos, memberi akses ke PC, lalu koneksi jarak jauh dilakukan dengan Parsec
- Karena koneksinya dari Korea ke PC di Amerika Serikat, latensi rata-ratanya sekitar 210 ms
- Alur kerja saat itu sangat merepotkan
- Membangun modul dengan MSVC di Windows arm64 pada Parallels
- Membagikan hasil build ke host melalui folder bersama
- Menyalin hasil build ke VM di PC pindos melalui AnyDesk
- Men-debug layanan WSC di lingkungan Parsec dengan latensi 210 ms
- Lingkungan ini begitu tidak nyaman sampai sangat menurunkan kecepatan pengembangan dan analisis
Debugging layanan WSC dan WinDefend SID
- Layanan WSC adalah DLL yang dijalankan oleh
svchost, dan faktor utama yang menghalangi pemasangan debugger adalah perlindungan PPL - Di VM, test mode diaktifkan, lalu digunakan driver yang menghapus PPL dari proses target dengan beberapa baris kode di kernel mode
- Titik kegagalan saat
cmd.exememinta pendaftaran antivirus ke WSC adalahWscServiceUtils::CreateExternalBaseFromCaller - Fungsi tersebut menyamar sebagai RPC client, lalu memeriksa apakah token proses pemanggil memiliki SID
WinDefend - Karena saat itu penulis belum begitu memahami cara kerja token Windows, ia menyimpulkan bahwa pemeriksaan bisa dilewati dengan menyamar sebagai
WinDefend - Dalam kondisi kurang tidur, ia juga keliru menafsirkan bahwa binary antivirus lama lolos pemeriksaan
IsMemberini
Percobaan menyamar sebagai WinDefend dan kegagalan
- Setelah mempelajari token Windows selama beberapa jam, implementasi diarahkan pada menjalankan proses dengan token yang berisi WinDefend SID agar pemeriksaan WSC bisa dilewati
- Kode dicoba dijalankan dengan
WinDefendSID ditempelkan kecmd, tetapi meski pemanggilan COM mengembalikanSTATUS_SUCCESS, pendaftaran antivirus baru sebenarnya tidak terjadi - Pendekatan ini pada akhirnya tidak berguna, dan perlu diverifikasi ulang keesokan harinya
Hari 3: Merekonstruksi algoritme verifikasi yang sebenarnya
- Setelah diperiksa lagi, binary antivirus lama ternyata tidak lolos pemeriksaan WinDefend SID
- Jika pemeriksaan itu lolos, yang bisa ditangani adalah objek WSC milik Windows Defender, tetapi Defender tidak bisa langsung dinonaktifkan hanya dengan pemanggilan WSC, sehingga tidak berguna
- Kode penyamaran WinDefend dihapus, lalu cabang lain pada conditional dianalisis
- Pada cabang tersebut, hal-hal berikut diperiksa terhadap binary pemanggil
- Apakah proses dalam status elevated
- Apakah tanda tangan binary valid
- Apakah ada flag tertentu pada
DllCharacteristicsPE
- Flag
DllCharacteristicsyang diperiksa diCSecurityVerificationManager::CreateExternalBaseFromPESettingsadalah ForceIntegrity - Kode yang mereproduksi pemeriksaan binary oleh WSC dibuat di folder
wsc-binary-checkpada repositori defendnot, lalu diuji terhadap binary System32
Penggunaan Taskmgr.exe dan bug ctx.bin
- Karena teman penulis perlu memakai PC-nya lagi, koneksi Parsec dilakukan langsung ke VM, tetapi dengan tambahan software encoding, lingkungan menjadi semakin lambat
Taskmgr.exedigunakan menggantikancmd.exe, tetapi error RPC masih terjadi- Karena latensi dan masalah input membuat debugging di VM yang sama menjadi sulit, atas rekomendasi, penulis membayar $30 untuk berlangganan shadow.tech
- VM Shadow.tech memiliki versi Windows yang lebih lama, sehingga kode
wscsvctidak banyak di-inline ke satu fungsi seperti versi terbaru, dan hasil dekompilasinya juga lebih mudah dibaca - Penyebab error sebenarnya adalah nama AV yang diberikan ke WSC salah
defendnot-loadermenggunakanctx.bin, yang berisi parameter terserialisasi, untuk meneruskan data kedefendnot.dll- IPC untuk pelacakan status diimplementasikan terpisah, tetapi untuk pengiriman konfigurasi masih tersisa cara
ctx.bindari kode no-defender lama - Fungsi yang mencari path
ctx.binmenjadikan folder dasar modulTaskmgr.exe, bukannodefend.dll, sebagai acuan - Akibatnya, null byte dikirim sebagai nama AV, dan WSC menolak buffer tersebut
- Setelah masalah path diperbaiki, pengujian berhasil
Perapian kode dan masalah autorun
- Agar bisa selesai pada hari yang sama, perapian kode dan implementasi fitur tambahan dikerjakan hingga pukul 8 pagi
- Fitur tambahan mencakup kemampuan untuk menambahkan dirinya sendiri ke autorun
- Pada pukul 8 pagi, hanya autorun yang belum berjalan dengan benar; setelah mencoba berbagai cara dan gagal, penulis tidur
- Saat diperiksa lagi keesokan harinya, penyebabnya adalah dua checkbox terkait daya saat membuat tugas Task Scheduler
- Karena laptop tidak terhubung ke daya AC, tugas tidak dijalankan; setelah flag tersebut dimatikan, autorun berfungsi
- Setelah itu, kode dirapikan beberapa jam lagi dan pekerjaan diselesaikan
Penutup
- Pekerjaan itu sendiri menyenangkan, tetapi masalah lingkungan dan alur remote debugging yang berulang selama beberapa hari adalah pengalaman yang tidak ingin diulangi
- Terutama MacBook arm64, VM x86 jarak jauh, latensi tinggi, encoding lambat, serta bug path file yang baru ketahuan belakangan sangat meningkatkan tingkat kesulitan implementasi
- Dokumentasi WSC yang lebih teknis akan dipublikasikan secara terpisah nanti
1 komentar
Komentar Hacker News
Cara paling invasif tetapi efektif untuk mematikan Defender adalah boot dari live Linux USB, mengganti nama
C:\ProgramData\Microsoft\Windows Defender, lalu membuat file kosong di lokasi tersebutSebagai referensi, WSC adalah singkatan dari Windows Security Center
Saya cukup bingung karena ungkapan
the antivirus I was using. Saya tidak paham kenapa vendor antivirus itu punya alasan untuk mengirim permintaan takedown DMCA kepada penulisMungkin maksudnya penulis merekayasa balik antivirus lain dan memasukkan sebagian darinya ke proyek open source. Tapi karena ada juga judul seperti
Impersonating WinDefend, saya jadi penasaran apakah pada akhirnya penulis memang melanggar hukum hak cipta dengan cara tertentuTepat sebelum paragraf yang dikutip ada penjelasan bahwa “proyek ini menggunakan kode pihak ketiga dari antivirus yang sudah ada, dan memaksa antivirus itu terdaftar sebagai antivirus di WSC”
Kode ini terasa terkutuk:
https://github.com/es3n1n/defendnot/blob/master/defendnot-lo...
Kalau ingin tahu apa yang sebenarnya terjadi, lihat di sini:
https://github.com/es3n1n/defendnot/blob/master/cxx-shared/s...
Misalnya, bahasa D punya konsep statement yang dieksekusi di akhir scope sebagai fitur bawaan bahasa
Ringkasnya, ini bukan ditulis AI. Kode ini menunda pemanggilan fungsi sampai objek keluar dari scope. Implementasinya memakai makro C untuk membuat sintaks yang lebih pendek dengan menghilangkan sebagian definisi lambda/fungsi anonim C yang diperlukan, serta membuat nama variabel unik untuk mengelola pemanggilan tertunda
Namun sintaks hasilnya menghindari konvensi umum penulisan huruf besar yang biasanya menandai makro C, dan sekilas terlihat seperti pemanggilan fungsi pada pointer objek. Kalau tidak terbiasa dengan pola ini, atau berharap makro ditampilkan berbeda, ini bisa membingungkan
Bagi sebagian orang, pola ini cukup umum dan berguna sehingga dalam konteks tertentu hampir bisa dianggap idiom. Penjelasan teknis di https://news.ycombinator.com/item?id=43959403#43960905 menguraikan cara kerja makronya dengan baik
Saat liburan, saya merekayasa balik virtual desktop Windows, dan itu membuat liburan saya jauh lebih menyenangkan. Kenangan terbaik tahun lalu adalah menyadari bahwa reverse engineering benar-benar menyenangkan
Saya juga belajar banyak hal menarik; di bawah RPC Windows ada lapisan messaging yang tidak terdokumentasi: https://csandker.io/2022/05/24/Offensive-Windows-IPC-3-ALPC....
Setiap kali melihat foto profil karakter anime, saya tahu tulisannya bakal bagus. Saya simpan untuk nanti kalau harus kembali ke lingkungan Windows yang kurang menyenangkan
Untuk yang penasaran: WSC adalah singkatan dari Windows Security Center. Saya juga harus mencarinya
Kenapa ada yang ingin mematikan WSC?
Kalau Anda vendor EDR, ini adalah pemanggilan API yang diobfuscate yang bisa dipakai untuk menekan atau menonaktifkan Windows Firewall. Misalnya, saya rasa CrowdStrike bisa memakai Windows Firewall atau memakai implementasi sendiri
netcat.exetidak bolehBaru-baru ini saya membaca https://nostarch.com/windows-security-internals, dan artikel ini membuatnya jauh lebih terasa relevan
Saya sudah sedikit tahu kira-kira bagaimana mekanisme backend seperti ini berjalan di Windows, tapi waktunya pas. Bab terakhir buku itu juga membahas token dan SID dengan cukup mendalam, mirip dengan yang dibahas penulis artikel ini