P³-Shellcode Loader (Process Parameter Poisoning) adalah teknik code injection canggih yang dikembangkan oleh Max Hirschberger dan Ogulcan Ugur dari Orange Cyberdefense (SensePost). Tool ini memanfaatkan Process Parameters structure (PEB) di Windows sebagai staging area dan lokasi eksekusi untuk shellcode injection ke remote process tanpa memicu mekanisme deteksi yang umum digunakan oleh EDR. Yang membuat teknik ini sangat signifikan adalah kemampuannya untuk melewati empat solusi EDR terkemuka tanpa menghasilkan satu alert pun, meskipun EDR dikonfigurasi untuk mendeteksi, memblokir, dan meremidiasi process injection.
Inti dari teknik ini adalah jawaban atas pertanyaan fundamental: bagaimana mentransfer kode berbahaya ke target process dan membuatnya executable tanpa menggunakan VirtualAllocEx dan WriteProcessMemory — dua API yang menjadi fokus utama monitoring EDR? Jawabannya ada di process startup parameters yang ditransfer dari satu process ke process lain saat pembuatan process baru. Dengan menggunakan parameter-parameter ini untuk transfer kode berbahaya, kedua API tersebut sepenuhnya dihindari, sehingga mengurangi kecurigaan secara signifikan.
Proses injection dimulai dengan membuat process baru melalui CreateProcessW dengan poisoned parameter. Ada tiga parameter yang dapat diracuni: pertama, ShellInfo melalui field lpReserved di STARTUPINFOW yang akan di-copy ke variabel ShellInfo di PEB target. Kedua, Environment block melalui parameter lpEnvironment dengan flag CREATE_UNICODE_ENVIRONMENT. Ketiga, CommandLine melalui parameter lpCommandLine dari CreateProcessW. Setelah process dibuat, data yang diracuni ditemukan melalui PEB structure menggunakan tiga langkah: pertama, tentukan starting address PEB melalui NtQueryInformationProcess. Kedua, baca PEB structure dari remote process menggunakan NtReadVirtualMemoryEx. Ketiga, baca RTL_USER_PROCESS_PARAMETERS untuk mendapatkan pointer ke data yang diinjeksi.
Untuk mengeksekusi kode yang sudah diinjeksi, P³ menggunakan manipulasi thread context melalui NtSetContextThread alih-alih CreateRemoteThread atau APC. Keunggulannya adalah CreateProcessW sudah menyediakan handle valid untuk main thread di dalam PROCESS_INFORMATION structure. Dengan hanya menggunakan NtSetContextThread untuk mengubah instruction pointer (RIP) ke alamat shellcode, teknik ini menghindari penggunaan NtWriteVirtualMemory, VirtualAllocEx, dan CreateRemoteThread — tiga API yang paling dipantau oleh EDR.
Tool ini mendukung empat jenis payload: pertama, demo sederhana yang menampilkan popup window. Kedua, shellcode hexadecimal yang dapat berisi null bytes (ditangani oleh shellcode generator internal). Ketiga, path ke DLL file yang dimuat melalui LoadLibraryA di dalam target. Keempat, raw shellcode dari URL HTTP(S). Shellcode generator internal menggunakan primitive XOR untuk menghasilkan data apa pun termasuk zero bytes tanpa menggunakan null terminator — mengatasi keterbatasan bahwa parameter process hanya menyalin data sampai null terminator.
Tutorial Penggunaan P³-Shellcode Loader
Untuk menggunakan P³-Shellcode Loader, clone repository dari GitHub: git clone https://github.com/Orange-Cyberdefense/p3-loader. Buka solution P3-Loader.sln di Visual Studio dan build dalam konfigurasi Release. Pastikan Anda memiliki Visual Studio dengan workload C++ Desktop Development yang terinstall. Setelah build selesai, jalankan executable yang dihasilkan.
Tool akan menampilkan menu pemilihan parameter yang akan diracuni: pilihan 1 untuk injection via ShellInfo (lpReserved), pilihan 2 untuk injection via Environment block, dan pilihan 3 untuk injection via CommandLine. Selanjutnya, masukkan path ke executable target yang akan dijadikan wadah shellcode — bisa berupa process yang sudah berjalan atau executable baru. Untuk payload, pilih salah satu dari empat opsi yang tersedia: demo Message Box, shellcode hexadecimal, path ke DLL, atau URL HTTP(S) untuk download shellcode.
Setelah semua parameter dimasukkan, tool akan membuat process target dengan parameter yang sudah diracuni. Kemudian tool membaca PEB dari target process, menemukan data yang diinjeksi, mengubah proteksi memori dari RW menjadi RX melalui NtProtectVirtualMemory, dan mengarahkan eksekusi ke shellcode melalui manipulasi thread context. Seluruh proses ini hanya melibatkan pembuatan process, pembacaan memori, perubahan proteksi memori, dan manipulasi thread context — operasi yang jauh lebih sedikit mencurigakan dibandingkan injection konvensional.
Untuk pengujian terhadap EDR, siapkan environment Windows dengan salah satu solusi EDR utama (seperti CrowdStrike, SentinelOne, Microsoft Defender for Endpoint, atau Cortex Xdr) dalam mode deteksi dan remidiasi. Jalankan P³ Loader dengan target process dan payload pilihan Anda. Monitor alert yang dihasilkan oleh EDR — dalam pengujian oleh Orange Cyberdefense, teknik ini berhasil melewati keempat EDR tanpa menghasilkan satu alert pun. Bandingkan hasilnya dengan process injection konvensional menggunakan VirtualAllocEx + WriteProcessMemory + CreateRemoteThread yang langsung memicu deteksi.
Analisa Retasan
P³-Shellcode Loader membuktikan bahwa boundary antara teknik yang diketahui dan teknik yang efektif masih sangat lebar di dunia keamanan endpoint. Proses Parameter Poisoning bukanlah konsep baru — modexp pernah mendemonstrasikan konsep serupa pada tahun 2020. Namun, implementasi P³ oleh Orange Cyberdefense membawa konsep ini ke level yang sangat lebih matang, dengan shellcode generator yang mampu menangani null byte limitation, tiga metode poisoning yang berbeda, dan pengujian komprehensif terhadap empat EDR market-leading. Gap antara publikasi akademik dan weaponisasi praktis masih menjadi challenge besar bagi industri keamanan.
Temuan yang paling kritis adalah bagaimana P³ mengeksploitasi arsitektur PEB Windows. Process Environment Block adalah struktur data yang ada di semua process dan unik untuk setiap process — termasuk ProcessParameters yang menampung CommandLine, Environment, ShellInfo, dan RuntimeData. Ketika CreateProcessW dipanggil, parameter-parameter ini ditulis ke PEB target process. Karena transfer ini terjadi melalui mekanisme process creation yang legitimate, EDR tidak memperlakukannya sebagai operasi berbahaya. Ini adalah contoh sempurna dari confused deputy pattern di mana mekanisme operating system yang legitimate dimanfaatkan untuk tujuan berbahaya.
Dari sisi deteksi, P³ memang meninggalkan beberapa indikator yang bisa dimanfaatkan oleh tim defensif. Indikator pertama adalah VirtualProtectEx yang membuat region memori executable diikuti oleh SetThreadContext dengan minimal CONTEXT_CONTROL. Indikator kedua adalah VirtualProtectEx yang membuat halaman process parameters executable — baik di process sendiri maupun di external process. Indikator ketiga adalah pembuatan process di mana salah satu parameter yang dieksploitasi menunjukkan anomali — misalnya entropy command line yang mendekati entropy shellcode. Indikator keempat adalah pembacaan remote process parameters structure yang ditunjuk oleh PEB. Namun, masing-masing indikator ini memiliki tantangan false positive tersendiri, sehingga reliable detection memerlukan correlation multiple indicators.
Perbandingan antara P³ dan technique konvensional sangat jelas: P³ tidak memerlukan VirtualAllocEx (explicit allocation dihindari), tidak memerlukan WriteProcessMemory (transfer terjadi secara indirect melalui CreateProcessW), dan menggunakan SetThreadContext alih-alih CreateRemoteThread untuk redirect execution. Risk of detection berkurang secara signifikan karena operasi yang dilakukan lebih sedikit dan lebih menyerupai aktivitas process creation yang legitimate. Bagi organisasi Indonesia, ini menjadi pengingat bahwa mempercayai EDR sepenuhnya sebagai pertahanan satu-satunya adalah pendekatan yang berisiko — defense in depth dengan multiple detection layers tetap menjadi best practice.
P³ membuktikan bahwa teknik injection yang mengandalkan pembuatan process baru dengan poisoned parameters dapat melewati empat solusi EDR terkemuka tanpa menghasilkan alert. Ini menegaskan bahwa pertahanan berlapis tetap menjadi kebutuhan, bukan pilihan.
Sumber: GitHub – Orange-Cyberdefense/p3-loader | SensePost — Process Parameter Poisoning
