# Panduan Pemeriksaan Kompromi Server PHP/Linux

## Tujuan

Panduan ini digunakan untuk memeriksa server Linux yang menjalankan aplikasi PHP, seperti Laravel, CodeIgniter, WordPress, Nextcloud, atau aplikasi PHP kustom.

Panduan ini tidak bergantung pada nama malware tertentu. Nama file, service, proses, domain, port, dan teknik persistence dapat berbeda pada setiap server. Fokus pemeriksaan adalah pada **perilaku mencurigakan**, **perubahan sistem**, dan **ketidaksesuaian terhadap baseline server**.

> Catatan penting: Jika ditemukan bukti kompromi pada level `root`, integritas sistem operasi tidak lagi dapat dipercaya sepenuhnya. Pembersihan manual dapat membantu investigasi dan containment, tetapi pendekatan pemulihan yang paling aman adalah membangun ulang server dari image bersih.

---

# 1. Indikator Utama Kompromi

Server patut dicurigai apabila ditemukan satu atau lebih kondisi berikut:

- Service systemd yang tidak dikenal.
- Binary atau script di `/usr/bin`, `/usr/sbin`, atau `/usr/local/bin` yang bukan milik paket resmi.
- Perintah administrasi seperti `ps`, `netstat`, `ss`, `lsof`, `top`, atau `who` menghasilkan data yang berbeda dari binary aslinya.
- File `.bashrc`, `.profile`, `/etc/profile`, atau konfigurasi shell menjalankan `curl`, `wget`, binary asing, atau callback ke domain eksternal.
- File PHP asing di direktori upload, data, cache, storage, public, atau temporary.
- Banyak script tersembunyi di `/tmp` atau `/var/tmp`.
- Terdapat aktivitas port scanning, SSH scanning, MySQL probing, SSRF testing, reverse shell, atau lateral movement.
- Terdapat koneksi keluar ke domain atau IP yang tidak dikenal.
- Terdapat user, SSH key, cronjob, atau service yang tidak pernah dibuat oleh administrator.
- Log keamanan berhenti, hilang, dihapus, atau menunjukkan gap waktu yang tidak wajar.

---

# 2. Prinsip Pemeriksaan

Gunakan prinsip berikut selama investigasi:

1. Jangan langsung menghapus artefak.
2. Dokumentasikan lokasi, ukuran, owner, permission, timestamp, hash, dan isi file.
3. Gunakan path absolut untuk perintah penting.
4. Jangan mempercayai output command sebelum memastikan command tersebut asli.
5. Bandingkan kondisi server dengan server sehat atau package database.
6. Pisahkan proses investigasi, containment, eradication, dan recovery.
7. Rotasi kredensial hanya dari perangkat dan server yang bersih.
8. Hindari reboot sebelum bukti volatile seperti proses dan koneksi aktif dikumpulkan.

---

# 3. Pemeriksaan Awal Sistem

## 3.1 Informasi dasar

```bash
date
hostnamectl
uname -a
cat /etc/os-release
uptime
who
w
last -ai | head -50
lastb -ai | head -50
```

Periksa:

- Login dari IP yang tidak dikenal.
- Login pada jam yang tidak wajar.
- Login `root` langsung.
- Reboot yang tidak direncanakan.
- Session yang masih aktif.
- Perbedaan tanggal atau timezone.

## 3.2 Catat waktu investigasi

```bash
mkdir -p /root/incident-response
date -Is | tee /root/incident-response/investigation-start.txt
```

---

# 4. Validasi Command Administrasi

## 4.1 Periksa command yang sebenarnya dijalankan

```bash
type -a ps
type -a netstat
type -a lsof
type -a ss
type -a top
type -a who
type -a curl
type -a wget
echo "$PATH"
```

Waspadai apabila `/usr/local/bin` atau direktori tidak standar muncul sebelum `/usr/bin` dan `/bin`.

Contoh PATH hijacking:

```text
/usr/local/bin/ps
/usr/bin/ps
/bin/ps
```

Ketika pengguna mengetik `ps`, shell akan menjalankan file pertama yang ditemukan.

## 4.2 Periksa isi file wrapper

```bash
file /usr/local/bin/ps
sed -n '1,200p' /usr/local/bin/ps

file /usr/local/bin/netstat
sed -n '1,200p' /usr/local/bin/netstat

file /usr/local/bin/lsof
sed -n '1,200p' /usr/local/bin/lsof
```

Wrapper berbahaya sering berbentuk:

```bash
#!/bin/bash
/bin/ps "$@" | grep -Ev 'nama-malware|port|PID'
```

Perilaku tersebut berarti output command asli difilter untuk menyembunyikan proses.

## 4.3 Bandingkan wrapper dengan binary asli

```bash
/usr/local/bin/ps -ef > /tmp/ps-wrapper.txt
/bin/ps -ef > /tmp/ps-original.txt

diff -u \
  <(sort /tmp/ps-wrapper.txt) \
  <(sort /tmp/ps-original.txt)
```

Untuk `lsof`:

```bash
/usr/local/bin/lsof -nP > /tmp/lsof-wrapper.txt
/usr/bin/lsof -nP > /tmp/lsof-original.txt

diff -u \
  <(sort /tmp/lsof-wrapper.txt) \
  <(sort /tmp/lsof-original.txt)
```

Untuk `netstat`:

```bash
/usr/local/bin/netstat -plant > /tmp/netstat-wrapper.txt
/bin/netstat -plant > /tmp/netstat-original.txt

diff -u \
  <(sort /tmp/netstat-wrapper.txt) \
  <(sort /tmp/netstat-original.txt)
```

## 4.4 Verifikasi kepemilikan paket

```bash
dpkg -S /usr/local/bin/ps
dpkg -S /usr/local/bin/netstat
dpkg -S /usr/local/bin/lsof
dpkg -S /bin/ps
dpkg -S /usr/bin/lsof
```

File di `/usr/local/bin` umumnya tidak dikelola `dpkg`, tetapi keberadaannya harus dapat dijelaskan oleh administrator.

## 4.5 Istilah forensik yang tepat

Gunakan istilah:

> Trojanized wrapper for a system utility that intercepts execution through PATH precedence and filters selected processes or connections from administrative output.

---

# 5. Pemeriksaan Proses Aktif

Gunakan binary asli dengan path absolut:

```bash
/bin/ps auxf
/bin/ps -ef --forest
/bin/ps -eo pid,ppid,user,lstart,etime,cmd --sort=lstart
```

Cari pola mencurigakan:

```bash
/bin/ps auxww | grep -Ei \
'curl|wget|socat|nc |netcat|bash -i|python.*socket|perl.*socket|php.*shell|xmrig|kinsing|gs-netcat|gsocket'
```

Periksa binary setiap proses:

```bash
for pid in $(/bin/ps -e -o pid=); do
  exe=$(readlink -f /proc/$pid/exe 2>/dev/null)
  cmd=$(tr '\0' ' ' < /proc/$pid/cmdline 2>/dev/null)
  printf '%-8s %-50s %s\n' "$pid" "$exe" "$cmd"
done
```

Cari proses dengan executable yang telah dihapus:

```bash
/usr/bin/lsof +L1
```

atau:

```bash
for pid in /proc/[0-9]*; do
  exe=$(readlink "$pid/exe" 2>/dev/null)
  case "$exe" in
    *"(deleted)"*) echo "$pid -> $exe" ;;
  esac
done
```

---

# 6. Pemeriksaan Koneksi Jaringan

Gunakan:

```bash
/usr/bin/ss -plant
/usr/bin/ss -plunt
/usr/bin/lsof -nP -i
/bin/netstat -plant 2>/dev/null
```

Cari koneksi keluar aktif:

```bash
/usr/bin/ss -tpn state established
```

Periksa DNS:

```bash
cat /etc/resolv.conf
grep -RInE \
'nameserver|search' \
/etc/resolv.conf /etc/systemd/resolved.conf /etc/network 2>/dev/null
```

Cari domain atau IP mencurigakan di konfigurasi dan file:

```bash
grep -RInE \
'https?://|curl |wget |nc |netcat|socat|bash -i|/dev/tcp/' \
/etc /root /home /usr/local /var/www \
2>/dev/null
```

Perhatikan:

- Domain asing.
- IP publik yang tidak termasuk layanan organisasi.
- Koneksi ke port tidak lazim.
- Proses PHP, shell, atau binary asing yang membuka koneksi keluar.
- Listener pada port seperti `4444`, `1337`, `31337`, atau port acak.

Port tertentu tidak otomatis berarti malware. Nilai harus dikaitkan dengan proses dan kebutuhan layanan.

---

# 7. Pemeriksaan Systemd Persistence

## 7.1 Daftar service

```bash
systemctl list-unit-files --type=service
systemctl list-units --type=service --all
systemctl --failed
```

Cari nama yang menyerupai layanan sah tetapi tidak dikenal:

```bash
systemctl list-unit-files | grep -Ei \
'syslog|security|update|snap|network|system|default|agent|monitor|watch|daemon'
```

## 7.2 Cari unit custom

```bash
find \
/etc/systemd/system \
/usr/lib/systemd/system \
/lib/systemd/system \
-type f \
-ls
```

Tampilkan unit yang dibuat atau berubah baru-baru ini:

```bash
find /etc/systemd/system -type f -mtime -180 -ls
```

Periksa isi unit:

```bash
systemctl cat nama-service.service
systemctl show nama-service.service
```

Perhatikan:

- `ExecStart` menuju `/tmp`, `/var/tmp`, `/dev/shm`, home directory, atau binary asing.
- Nama service menyerupai komponen sistem.
- `Restart=always`.
- `WantedBy=multi-user.target`.
- Menjalankan `curl`, `wget`, shell, Python, Perl, atau PHP.
- File unit tidak berasal dari paket resmi.

## 7.3 Verifikasi service terhadap paket

```bash
dpkg -S /lib/systemd/system/nama.service
dpkg -S /usr/lib/systemd/system/nama.service
```

File di `/etc/systemd/system` biasanya custom. Pastikan administrator mengetahui asalnya.

## 7.4 Jangan hapus sebelum mencatat bukti

```bash
systemctl cat nama-service.service \
  > /root/incident-response/nama-service.service.txt

stat /etc/systemd/system/nama-service.service \
  > /root/incident-response/nama-service.stat.txt

sha256sum /etc/systemd/system/nama-service.service \
  > /root/incident-response/nama-service.sha256.txt
```

---

# 8. Pemeriksaan Cron dan Scheduled Task

```bash
crontab -l
crontab -u root -l
```

Periksa semua user:

```bash
for user in $(cut -d: -f1 /etc/passwd); do
  echo "===== $user ====="
  crontab -u "$user" -l 2>/dev/null
done
```

Cari scheduled task:

```bash
find \
/etc/cron.d \
/etc/cron.daily \
/etc/cron.hourly \
/etc/cron.weekly \
/etc/cron.monthly \
/var/spool/cron \
-type f \
-ls 2>/dev/null
```

Cari command berisiko:

```bash
grep -RInE \
'curl|wget|bash|sh |python|perl|php|base64|/tmp|/var/tmp|/dev/shm|nc |socat' \
/etc/cron* /var/spool/cron \
2>/dev/null
```

Periksa systemd timer:

```bash
systemctl list-timers --all
```

Periksa `at`:

```bash
atq
ls -lah /var/spool/cron/atjobs 2>/dev/null
```

---

# 9. Pemeriksaan Shell Persistence

## 9.1 File shell utama

```bash
sed -n '1,240p' /root/.bashrc
sed -n '1,240p' /root/.profile
sed -n '1,240p' /etc/profile
sed -n '1,240p' /etc/bash.bashrc
```

Periksa semua home user:

```bash
find /root /home \
-maxdepth 3 \
-type f \
\( \
  -name '.bashrc' -o \
  -name '.profile' -o \
  -name '.bash_profile' -o \
  -name '.zshrc' \
\) \
-print
```

Cari callback:

```bash
grep -RInE \
'curl|wget|nc |netcat|socat|/dev/tcp|bash -i|python|perl|php|base64|eval' \
/root/.bashrc /root/.profile /etc/profile /etc/bash.bashrc /home \
2>/dev/null
```

Waspadai:

- Pengiriman notifikasi login.
- Eksekusi binary asing.
- Download payload.
- Perintah yang dijalankan setiap login.
- Pengubahan `PATH`.
- Alias command sistem.

## 9.2 Periksa alias dan fungsi shell

```bash
alias
declare -f
env
```

Cari konfigurasi global:

```bash
grep -RInE \
'alias (ps|ls|netstat|lsof|ss|top|who)|function (ps|netstat|lsof)' \
/etc /root /home \
2>/dev/null
```

---

# 10. Pemeriksaan SSH Persistence

## 10.1 Authorized keys

```bash
find /root /home \
-type f \
-name authorized_keys \
-print \
-exec stat {} \; \
-exec cat {} \;
```

Periksa fingerprint:

```bash
ssh-keygen -lf /root/.ssh/authorized_keys 2>/dev/null
```

## 10.2 Konfigurasi SSH

```bash
sshd -T
grep -RInE \
'PermitRootLogin|PasswordAuthentication|PubkeyAuthentication|AuthorizedKeysFile|AllowUsers|AllowGroups' \
/etc/ssh
```

## 10.3 User mencurigakan

```bash
cat /etc/passwd
awk -F: '$3 == 0 {print}' /etc/passwd
getent group sudo
getent group adm
```

Cari user baru:

```bash
find /home -maxdepth 1 -mindepth 1 -type d -ls
stat /etc/passwd /etc/shadow /etc/group
```

---

# 11. Pemeriksaan Binary dan File Sistem

## 11.1 File tidak dikenal di lokasi sensitif

```bash
find \
/usr/bin \
/usr/sbin \
/usr/local/bin \
/usr/local/sbin \
-type f \
-mtime -180 \
-ls
```

Cari file kosong yang tidak lazim:

```bash
find /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin \
-type f -size 0 -ls
```

Cari executable di direktori temporary:

```bash
find /tmp /var/tmp /dev/shm \
-type f \
-perm /111 \
-ls
```

## 11.2 Verifikasi package integrity

Instal `debsums` jika dibutuhkan:

```bash
apt-get update
apt-get install debsums
```

Periksa file paket yang berubah:

```bash
debsums -s
```

Periksa package tertentu:

```bash
debsums -s procps
debsums -s net-tools
debsums -s lsof
debsums -s openssh-server
debsums -s systemd
```

Verifikasi ownership:

```bash
dpkg -S /bin/ps
dpkg -S /usr/bin/ss
dpkg -S /usr/bin/lsof
```

## 11.3 Hash file

```bash
sha256sum /path/file
md5sum /path/file
stat /path/file
file /path/file
```

Simpan bukti:

```bash
sha256sum /path/file \
  | tee -a /root/incident-response/hashes.txt
```

---

# 12. Pemeriksaan Direktori Temporary

Direktori berikut sering digunakan malware:

- `/tmp`
- `/var/tmp`
- `/dev/shm`
- `/run`
- `/run/user`
- `/var/cache`
- direktori tersembunyi dalam home user

Daftar file:

```bash
find /tmp /var/tmp /dev/shm \
-xdev \
-type f \
-ls
```

Cari script:

```bash
find /tmp /var/tmp /dev/shm \
-type f \
\( \
  -name '*.sh' -o \
  -name '*.php' -o \
  -name '*.py' -o \
  -name '*.pl' -o \
  -name '*.phar' \
\) \
-ls
```

Cari nama tersembunyi:

```bash
find /tmp /var/tmp /dev/shm \
-type f \
-name '.*' \
-ls
```

Cari kata kunci:

```bash
grep -RInE \
'curl|wget|base64|eval|system\(|exec\(|shell_exec|passthru|proc_open|popen|/dev/tcp|nc |socat|ssh |mysql|portscan|metabase|ssrf' \
/tmp /var/tmp /dev/shm \
2>/dev/null
```

## Interpretasi

Banyak file seperti berikut merupakan indikator kuat aktivitas pasca-eksploitasi:

```text
.portscan.sh
.mysql_sweep.sh
.ssh_results.txt
.metabase.sh
.ssrf_test.sh
.test_shell.php
.nc_data.sh
```

Nama bisa berubah. Fokus pada isi dan perilaku script.

---

# 13. Pemeriksaan Aplikasi PHP

## 13.1 Cari file PHP baru atau berubah

```bash
find /var/www \
-type f \
\( -name '*.php' -o -name '*.phtml' -o -name '*.phar' \) \
-mtime -180 \
-ls
```

Sesuaikan periode dengan waktu dugaan insiden.

## 13.2 Cari PHP di lokasi yang seharusnya tidak executable

```bash
find /var/www \
-type f \
-name '*.php' \
-path '*/uploads/*' \
-ls

find /var/www \
-type f \
-name '*.php' \
-path '*/data/*' \
-ls

find /var/www \
-type f \
-name '*.php' \
-path '*/storage/*' \
-ls

find /var/www \
-type f \
-name '*.php' \
-path '*/cache/*' \
-ls
```

Lokasi rawan:

- `uploads`
- `files`
- `data`
- `storage`
- `cache`
- `tmp`
- `public/uploads`
- direktori attachment
- direktori hasil ekstraksi arsip

## 13.3 Cari fungsi berbahaya

```bash
grep -RInE \
'eval\s*\(|assert\s*\(|base64_decode\s*\(|gzinflate\s*\(|gzuncompress\s*\(|str_rot13\s*\(|shell_exec\s*\(|system\s*\(|passthru\s*\(|exec\s*\(|proc_open\s*\(|popen\s*\(|pcntl_exec\s*\(' \
/var/www \
--include='*.php' \
2>/dev/null
```

Kehadiran fungsi tersebut tidak otomatis berarti malware. Banyak framework dan library menggunakannya secara sah. Periksa konteksnya.

## 13.4 Cari pola web shell

```bash
grep -RInE \
'\$_(GET|POST|REQUEST|COOKIE).*(system|exec|shell_exec|passthru|eval)|cmd=.*\$_|preg_replace.*\/e|create_function|php_uname|whoami|uname -a' \
/var/www \
--include='*.php' \
2>/dev/null
```

## 13.5 Cari PHP berukuran sangat kecil

```bash
find /var/www \
-type f \
-name '*.php' \
-size -2k \
-ls
```

File PHP kecil seperti `a.php`, `x.php`, `test.php`, atau `1.php` harus diperiksa, terutama bila:

- Owner tidak sesuai.
- Tanggal pembuatan tidak dikenal.
- Berada di direktori upload atau data.
- Isinya menjalankan command.
- Dibuat oleh `root` atau `www-data` tanpa alasan.

## 13.6 Periksa file mencurigakan dengan aman

Jangan menjalankan file.

Gunakan:

```bash
stat /path/suspicious.php
file /path/suspicious.php
sha256sum /path/suspicious.php
sed -n '1,240p' /path/suspicious.php
xxd /path/suspicious.php | head
```

Untuk file panjang:

```bash
head -100 /path/suspicious.php
tail -100 /path/suspicious.php
```

## 13.7 Bandingkan dengan repository

Untuk aplikasi berbasis Git:

```bash
cd /var/www/aplikasi
git status
git diff
git log --stat --since='6 months ago'
```

Perhatikan:

- File untracked.
- File core framework berubah.
- Perubahan pada route, controller, middleware, dan bootstrap.
- Perubahan `.htaccess`, `index.php`, atau entry point.
- Backdoor dalam dependency.

Jangan langsung menjalankan `git reset --hard` sebelum bukti disimpan.

---

# 14. Pemeriksaan Konfigurasi PHP

## 14.1 Daftar versi dan modul

```bash
php -v
php -m
php --ini
```

Periksa PHP-FPM:

```bash
systemctl status 'php*-fpm'
find /etc/php -type f -ls
```

## 14.2 Konfigurasi berisiko

```bash
grep -RInE \
'disable_functions|allow_url_include|allow_url_fopen|auto_prepend_file|auto_append_file|open_basedir' \
/etc/php
```

Waspadai perubahan pada:

```ini
auto_prepend_file=/path/backdoor.php
auto_append_file=/path/backdoor.php
```

Cari konfigurasi tersembunyi:

```bash
find /var/www /tmp /var/tmp \
-type f \
\( -name '.user.ini' -o -name 'php.ini' \) \
-ls
```

Tampilkan isinya:

```bash
find /var/www \
-type f \
-name '.user.ini' \
-print \
-exec cat {} \;
```

---

# 15. Pemeriksaan Web Server

## 15.1 NGINX

```bash
nginx -T > /root/incident-response/nginx-full-config.txt 2>&1
grep -RInE \
'fastcgi_pass|proxy_pass|alias|root|include|rewrite|return 30|location' \
/etc/nginx
```

Periksa:

- Location tersembunyi.
- Proxy ke port asing.
- Include file dari `/tmp`.
- Rule yang mengizinkan PHP dalam direktori upload.
- Disable keamanan pada path tertentu.

## 15.2 Apache

```bash
apachectl -S
apachectl -M
apachectl -t -D DUMP_VHOSTS
grep -RInE \
'ProxyPass|RewriteRule|SetHandler|AddHandler|php|Include' \
/etc/apache2
```

## 15.3 Cegah eksekusi PHP pada upload

Contoh NGINX:

```nginx
location ~* ^/(uploads|files|data|storage)/.*\.php$ {
    deny all;
    return 403;
}
```

Sesuaikan dengan struktur aplikasi agar tidak memblokir file sah.

---

# 16. Pemeriksaan Log Web dan Aplikasi

## 16.1 NGINX

```bash
zgrep -hEi \
'cmd=|shell|upload|\.php\?|base64|eval|system\(|wget|curl|/vendor/phpunit|wp-file-manager|boaform|\.env|phpunit' \
/var/log/nginx/access.log* \
| tail -500
```

## 16.2 Apache

```bash
zgrep -hEi \
'cmd=|shell|upload|\.php\?|base64|eval|system\(|wget|curl|/vendor/phpunit|\.env' \
/var/log/apache2/access.log* \
| tail -500
```

## 16.3 Cari request ke file mencurigakan

```bash
zgrep -h \
'a.php\|test.php\|shell.php\|cmd.php' \
/var/log/nginx/access.log* \
/var/log/apache2/access.log* \
2>/dev/null
```

## 16.4 Laravel

```bash
find /var/www -path '*/storage/logs/*.log' -type f -ls
grep -RInE \
'Error|Exception|UploadedFile|shell_exec|system\(|exec\(|SQLSTATE|authentication|login' \
/var/www/*/storage/logs \
2>/dev/null
```

## 16.5 CodeIgniter

```bash
find /var/www -path '*/application/logs/*' -type f -ls
```

## 16.6 Nextcloud

Periksa:

- `data/nextcloud.log`
- audit log
- file integrity
- aplikasi tambahan yang baru diinstal
- direktori data yang berisi file PHP

---

# 17. Pemeriksaan Database dan Kredensial

Cari file rahasia:

```bash
find /var/www \
-type f \
\( \
  -name '.env' -o \
  -name 'config.php' -o \
  -name 'database.php' -o \
  -name 'wp-config.php' \
\) \
-ls
```

Periksa permission:

```bash
stat /var/www/aplikasi/.env
```

Cari kredensial yang mungkin terekspos:

```bash
grep -RInE \
'DB_PASSWORD|DB_USERNAME|APP_KEY|SECRET|TOKEN|PRIVATE_KEY|AWS_ACCESS_KEY|SMTP_PASSWORD' \
/var/www \
--exclude-dir=vendor \
--exclude-dir=node_modules \
2>/dev/null
```

Jika server terkompromi sebagai root, anggap seluruh kredensial yang tersimpan di server telah diketahui penyerang.

Rotasi:

- Password SSH.
- SSH key.
- Database user.
- Root database.
- API token.
- SMTP credentials.
- Cloud access key.
- JWT secret.
- Laravel `APP_KEY` jika diperlukan.
- OAuth secret.
- Storage credentials.
- Backup credentials.

---

# 18. Pemeriksaan Lateral Movement

Cari aktivitas scanning internal:

```bash
grep -RInE \
'10\.[0-9]+\.[0-9]+\.[0-9]+|172\.(1[6-9]|2[0-9]|3[0-1])\.[0-9]+\.[0-9]+|192\.168\.[0-9]+\.[0-9]+' \
/tmp /var/tmp /root /home \
2>/dev/null
```

Cari command SSH:

```bash
grep -RInE \
'ssh |scp |sftp |sshpass|ProxyCommand|StrictHostKeyChecking=no' \
/tmp /var/tmp /root /home \
2>/dev/null
```

Cari history:

```bash
find /root /home \
-type f \
\( -name '.bash_history' -o -name '.zsh_history' \) \
-print \
-exec tail -200 {} \;
```

Jika terdapat scanning ke subnet internal, periksa host lain yang dapat dijangkau dari server tersebut.

---

# 19. Pemeriksaan Rootkit dan Kernel-Level Tampering

Pemeriksaan berikut bersifat tambahan dan tidak dapat menjamin sistem bersih:

```bash
apt-get install rkhunter chkrootkit
rkhunter --check
chkrootkit
```

Periksa module kernel:

```bash
lsmod
cat /proc/modules
dmesg -T | tail -200
```

Periksa eBPF:

```bash
bpftool prog show 2>/dev/null
bpftool map show 2>/dev/null
```

Jika ada kompromi root, hasil tools pada host yang sama tetap harus dianggap berpotensi tidak tepercaya.

---

# 20. Pengumpulan Bukti Minimum

Buat direktori:

```bash
mkdir -p /root/incident-response
chmod 700 /root/incident-response
```

Simpan output:

```bash
/bin/ps auxf \
  > /root/incident-response/ps-auxf.txt

/usr/bin/ss -plunt \
  > /root/incident-response/ss-plunt.txt

/usr/bin/lsof -nP \
  > /root/incident-response/lsof.txt

systemctl list-unit-files \
  > /root/incident-response/systemd-unit-files.txt

systemctl list-units --all \
  > /root/incident-response/systemd-units.txt

find /tmp /var/tmp /dev/shm -type f -ls \
  > /root/incident-response/temp-files.txt

find /var/www -type f -mtime -180 -ls \
  > /root/incident-response/web-files-recent.txt
```

Salin artefak dengan metadata:

```bash
cp -a --preserve=all \
/path/suspicious-file \
/root/incident-response/
```

Buat hash:

```bash
find /root/incident-response \
-type f \
-exec sha256sum {} \; \
> /root/incident-response/SHA256SUMS.txt
```

Catat timeline:

```bash
find \
/etc/systemd/system \
/usr/local/bin \
/usr/local/sbin \
/tmp \
/var/tmp \
/dev/shm \
/var/www \
-type f \
-printf '%TY-%Tm-%Td %TH:%TM:%TS %u %g %m %s %p\n' \
2>/dev/null \
| sort \
> /root/incident-response/timeline-files.txt
```

---

# 21. Containment

Jika kompromi dikonfirmasi:

1. Lepaskan server dari internet atau batasi jaringan melalui firewall upstream.
2. Pertahankan akses administrator hanya dari IP tepercaya.
3. Blokir domain dan IP C2 pada firewall, DNS, proxy, dan gateway.
4. Blokir komunikasi lateral menuju subnet internal jika tidak diperlukan.
5. Simpan proses dan koneksi aktif sebelum menghentikan service.
6. Jangan melakukan login ke akun penting dari server terkompromi.
7. Jangan memasukkan kredensial baru ke server terkompromi.
8. Jangan langsung reboot kecuali risiko operasional mengharuskan.
9. Informasikan tim keamanan dan pemilik sistem.

Contoh containment sementara:

```bash
iptables-save > /root/incident-response/iptables-before.txt
nft list ruleset > /root/incident-response/nft-before.txt 2>/dev/null
```

Gunakan firewall upstream bila memungkinkan karena firewall lokal dapat dimodifikasi penyerang.

---

# 22. Eradication

Pembersihan manual hanya untuk containment atau sistem non-kritis.

Tahapan minimum:

- Hentikan service palsu.
- Nonaktifkan persistence.
- Karantina binary dan script.
- Hapus wrapper command setelah bukti disimpan.
- Pulihkan package sistem dari repository resmi.
- Hapus SSH key dan user asing.
- Hapus cronjob dan timer asing.
- Audit source code aplikasi.
- Perbarui framework, library, plugin, dan OS.
- Tutup vulnerability atau salah konfigurasi yang menjadi jalur masuk.

Contoh karantina:

```bash
mkdir -p /root/quarantine
chmod 700 /root/quarantine

mv /usr/local/bin/ps \
/root/quarantine/ps-wrapper

mv /usr/local/bin/lsof \
/root/quarantine/lsof-wrapper
```

Setelah itu bersihkan cache command shell:

```bash
hash -r
type -a ps
type -a lsof
```

Jangan melakukan eradication sebelum bukti penting dikumpulkan.

---

# 23. Recovery yang Direkomendasikan

Untuk kompromi `root`, recovery terbaik:

1. Siapkan server baru dari image resmi.
2. Gunakan versi OS yang masih didukung.
3. Patch seluruh package.
4. Instal aplikasi dari repository source yang dipercaya.
5. Jangan menyalin binary atau konfigurasi sistem lama secara utuh.
6. Migrasikan hanya:
   - database yang telah diverifikasi,
   - dokumen pengguna,
   - media,
   - konfigurasi yang sudah ditinjau,
   - source code yang sudah dibandingkan dengan repository.
7. Jangan menyalin:
   - `/usr`,
   - `/bin`,
   - `/sbin`,
   - `/etc` secara utuh,
   - `/root`,
   - cron lama,
   - systemd unit lama,
   - binary custom yang tidak diverifikasi.
8. Rotasi seluruh kredensial.
9. Aktifkan monitoring sebelum go-live.
10. Lakukan vulnerability assessment ulang.

---

# 24. Hardening Server PHP

## 24.1 Permission

Rekomendasi umum:

```bash
find /var/www/aplikasi -type d -exec chmod 755 {} \;
find /var/www/aplikasi -type f -exec chmod 644 {} \;
```

Direktori writable hanya pada lokasi yang benar-benar dibutuhkan.

Contoh Laravel:

- `storage`
- `bootstrap/cache`

Jangan memberikan `777`.

## 24.2 Pisahkan owner source dan runtime

Contoh:

- Source code dimiliki user deployment.
- PHP-FPM berjalan sebagai `www-data`.
- `www-data` hanya dapat menulis pada storage/upload tertentu.

## 24.3 Nonaktifkan PHP di upload

Pastikan file PHP tidak dapat dieksekusi dari direktori upload, storage, data, attachment, dan cache.

## 24.4 Batasi fungsi PHP

Pertimbangkan:

```ini
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec
```

Jangan menerapkan tanpa pengujian karena beberapa aplikasi membutuhkannya.

## 24.5 Patch management

Perbarui:

- PHP.
- Framework.
- Composer dependency.
- Plugin.
- Web server.
- Database.
- OS.
- Container image.

## 24.6 Secrets

- Jangan menyimpan secrets di repository.
- Gunakan file permission ketat.
- Gunakan secret manager jika tersedia.
- Jangan menampilkan `.env` melalui web.
- Blokir akses ke dotfile.

Contoh NGINX:

```nginx
location ~ /\.(?!well-known) {
    deny all;
}
```

## 24.7 Upload security

- Validasi MIME type.
- Validasi extension.
- Rename file upload.
- Simpan di luar document root.
- Scan dengan antivirus.
- Blokir double extension.
- Jangan percaya filename dari pengguna.
- Jangan mengekstrak ZIP tanpa validasi path traversal.

---

# 25. Monitoring yang Disarankan

Pantau:

- Perubahan `/etc/systemd/system`.
- Perubahan `/usr/local/bin`.
- File PHP baru di upload/data/storage.
- Perubahan `.bashrc`, `.profile`, dan `authorized_keys`.
- Koneksi keluar yang tidak dikenal.
- Proses yang berjalan dari `/tmp`, `/var/tmp`, dan `/dev/shm`.
- User baru.
- Cronjob baru.
- Login root.
- Perubahan konfigurasi PHP dan web server.
- File dengan owner `www-data` di lokasi source code.
- Integritas package.

Tools yang dapat digunakan:

- Wazuh.
- Auditd.
- Falco.
- AIDE.
- OSSEC.
- Suricata.
- CrowdSec.
- Fail2ban.
- SIEM terpusat.
- EDR Linux.

---

# 26. Checklist Cepat

## Validasi command

```bash
type -a ps netstat lsof ss top
echo "$PATH"
```

## Proses

```bash
/bin/ps auxf
/bin/ps -eo pid,ppid,user,lstart,cmd --sort=lstart
```

## Jaringan

```bash
/usr/bin/ss -plunt
/usr/bin/lsof -nP -i
```

## Persistence

```bash
systemctl list-unit-files
systemctl list-timers --all
crontab -l
```

## Shell

```bash
grep -RInE \
'curl|wget|socat|/dev/tcp|bash -i|base64|eval' \
/root /home /etc/profile /etc/bash.bashrc \
2>/dev/null
```

## Temporary

```bash
find /tmp /var/tmp /dev/shm -type f -ls
```

## PHP

```bash
find /var/www \
-type f \
\( -name '*.php' -o -name '*.phtml' -o -name '*.phar' \) \
-mtime -180 \
-ls
```

## Package integrity

```bash
debsums -s
```

## SSH

```bash
find /root /home -name authorized_keys -type f -print -exec cat {} \;
```

---

# 27. Klasifikasi Temuan

## Rendah

- File sementara yang dapat dijelaskan.
- Service custom yang terdokumentasi.
- File PHP baru hasil deployment resmi.
- Binary `/usr/local/bin` yang diketahui administrator.

## Sedang

- File PHP asing di upload.
- Service baru tanpa dokumentasi.
- Cronjob menjalankan `curl` atau `wget`.
- Koneksi keluar tidak dikenal.
- User atau SSH key asing.

## Tinggi

- Wrapper `ps`, `lsof`, `netstat`, atau `ss` yang memfilter output.
- Binary asing berjalan sebagai root.
- Reverse shell.
- Service persistence palsu.
- Callback dari `.bashrc`.
- Aktivitas scanning jaringan internal.
- Web shell aktif.
- File sistem atau package dimodifikasi.
- Log dihapus atau dimanipulasi.

## Kritis

- Kompromi root terkonfirmasi.
- Penyerang memiliki persistence aktif.
- Kredensial dan secrets kemungkinan dieksfiltrasi.
- Terdapat lateral movement.
- Sistem kritis atau data sensitif terdampak.

---

# 28. Contoh Kesimpulan Laporan

> Berdasarkan hasil pemeriksaan, ditemukan mekanisme intersepsi command melalui prioritas PATH, berupa wrapper pada utilitas administrasi yang memfilter proses dan koneksi tertentu dari output. Ditemukan pula persistence melalui service atau shell initialization, artefak script pada direktori temporary, serta indikasi scanning terhadap jaringan internal. Kombinasi temuan tersebut menunjukkan kompromi sistem pada tingkat administratif atau root. Oleh karena itu, integritas sistem operasi tidak dapat dijamin dan pemulihan melalui rebuild dari image bersih direkomendasikan.

---

# 29. Catatan Penting

Tidak ditemukannya nama file atau domain yang sama dengan insiden sebelumnya **bukan berarti server bersih**.

Malware dapat menggunakan:

- Nama file acak.
- Nama service menyerupai system service.
- Port acak.
- Domain baru.
- Binary terenkripsi.
- Fileless execution.
- Cron, systemd, SSH key, PHP auto-prepend, atau container sebagai persistence.

Pemeriksaan harus berfokus pada:

- Siapa yang membuat file.
- Dari paket atau deployment mana file berasal.
- Apa yang dilakukan file.
- Kapan file muncul.
- User apa yang menjalankannya.
- Proses apa yang memanggilnya.
- Koneksi apa yang dibuat.
- Apakah perilakunya sesuai fungsi server.

---

# 30. Urutan Pemeriksaan yang Direkomendasikan

1. Catat waktu dan identitas server.
2. Periksa command hijacking.
3. Ambil daftar proses dan koneksi menggunakan binary asli.
4. Periksa systemd, cron, timer, SSH key, dan shell persistence.
5. Periksa `/tmp`, `/var/tmp`, dan `/dev/shm`.
6. Audit file PHP baru dan lokasi upload.
7. Periksa log web dan autentikasi.
8. Bangun timeline.
9. Identifikasi initial access.
10. Lakukan containment.
11. Simpan artefak.
12. Rebuild server jika root compromise terkonfirmasi.
13. Rotasi kredensial dari sistem bersih.
14. Pantau host lain yang satu jaringan.

---

**Dokumen ini adalah panduan pemeriksaan dan respons awal, bukan pengganti proses digital forensics formal. Untuk insiden yang melibatkan data sensitif, layanan publik, atau potensi lateral movement, libatkan tim keamanan informasi dan lakukan preservasi bukti sesuai prosedur organisasi.**
