SSH Tunneling adalah teknik yang
wajib dikuasai hacker. Teknik ini sangat cocok dipakai sebagai backdoor
dari dunia luar langsung menembus ke dalam “behind enemy lines”
melewati semua firewall, IDS, IPS atau apapun itu di perbatasan. Dalam artikel ini saya juga menjelaskan bagaimana melakukan chaining tunnel, yaitu menyambung tunnel dengan tunnel lain.
Apa itu Tunneling?
Secara sederhana tunneling
berarti mengirimkan data melalui koneksi lain yang sudah terbentuk.
Kalau anda buka situs internet banking, pasti anda akan membukanya
dengan URL berawalan “https”, yang sejatinya adalah data dalam protokol
HTTP yang dikirimkan melalui koneksi dengan protokol SSL, atau “HTTP
over SSL”, dalam bahasa gaulnya berarti HTTP digendong sama SSL.
SSH dan SSL adalah dua contoh
tunneling protocol, keduanya bisa dipakai untuk menggendong data dalam
protokol apa saja (tidak hanya http). Hanya bedanya adalah pada SSL
dibutuhkan public key certificate dalam format X.509 yang perlu
diverifikasi melalui Certificate Authority resmi. SSH tidak memerlukan
public key certificate, sehingga lebih sederhana dan lebih mudah
dipakai.
Protocol Encapsulation
Dalam kasus https, data dalam
protokol HTTP di-enkapsulasi (dibungkus) dalam protokol SSL sebagai
payload. Enkapsulasi juga terjadi dalam layer model TCP/IP, yaitu data
pada layer yang lebih atas menjadi payload dan di-enkapsulasi dengan
protokol pada layer di bawahnya.
Anda tentu tahu boneka lucu
terbuat dari kayu dari Rusia bernama Matryoshka. Keunikan boneka ini
adalah boneka yang berukuran kecil bisa dimasukkan ke dalam boneka yang
lebih besar, dan boneka yang lebih besar juga bisa dimasukkan ke dalam
boneka yang lebih besar lagi hingga pada akhirnya hanya ada satu boneka
saja yang paling besar. Bila boneka yang paling besar itu dibuka, maka
di dalamnya akan ada satu boneka yang lebih kecil, bila boneka tersebut
dibuka, maka akan ditemukan boneka lagi yang lebih kecil, demikian
seterusnya hingga boneka yang terkecil.
Gambar di bawah ini sangat tepat menggambarkan apa itu protocol encapsulation.
Gambar di atas menggambarkan
bagaimana data ketika dikirim dienkapsulasi dan dikirimkan melalui
protokol yang berada pada layer di bawahnya. Pada gambar di atas bisa
dikatakan bahwa email message tersebut dikirimkan dalam bentuk paket
SMTP over TCP over IP over Ethernet. Jadi pada akhirnya semua data
tersebut akan terkirim dalam bentuk paket ethernet.
Dalam ilustrasi boneka
matryoshka, pesan email adalah boneka matryoshka terkecil. Boneka ini
dimasukkan dalam boneka matryoshka SMTP yang ukurannya lebih besar,
kemudian boneka matryoshka SMTP ini dimasukkan dalam boneka matryoshka
TCP, kemudian boneka matryoshka TCP ini dimasukkan dalam boneka
matryoshka IP, dan akhirnya dimasukkan ke dalam boneka matryoshka
ethernet yang berukuran paling besar.
Jadi boneka matryoshka yang
diterima lawan biacara adalah boneka matryoshka yang terbesar. Bila
boneka ini dibuka, di dalamnya ada boneka Matryoshka IP yang lebih
kecil, dan bila boneka ini juga dibuka, di dalamnya ada boneka
matryoshka TCP yang semakin kecil ukurannya. Bila boneka matryoshka TCP
ini dibuka, di dalamnya ada boneka matryoshka SMTP yang didalamnya ada
matryoshka email message. Email message adalah boneka matryoshka
terkecil.
Port Forwarding
Port forwarding atau port mapping
pengalihan (redirection) koneksi dari suatu IP:Port ke IP:Port yang
lain. Ini artinya adalah semua koneksi yang ditujukan ke IP:Port asal
akan dialihkan ke IP:Port tujuan seolah-olah client sedang menghubungi
IP:Port tujuan secara langsung.
Contoh: bila kita definisikan
port forwarding 127.0.0.1:8080 dipetakan ke 192.168.10.10:80, artinya
bila browser di arahkan ke url http://127.0.0.1:8080, maka request HTTP
tersebut akan diteruskan ke 192.168.10.10:80. Jadi walaupun pada
localhost (127.0.0.1) port 8080 tidak ada web server, namun web browser
bisa membuka web pada url http://localhost:8080.
Pada port forwarding tersebut,
didefinisikan sehingga klien dari dunia luar bisa mengakses service yang
ada pada jaringan internal. Port forwarding yang didefinisikan adalah:
- 64.130.31.59:10004 –> 192.168.1.103:22
Artinya untuk SSH ke host 192.168.1.103, maka client harus ssh ke IP 64.130.31.59 port 10004.
- 64.130.31.59:10001 –> 192.168.1.100:22
Artinya untuk SSH ke host 192.168.1.100, maka client harus ssh ke IP 64.130.31.59 port 10001.
- 64.130.31.59:8080 –> 192.168.1.102:80
Port forwarding pada ssh, mirip
dengan port forwarding pada gambar di atas, namun ada sedikit perbedaan.
Pada port forward gambar di atas, titik koneksi masuk dan keluar sama,
artinya koneksi masuk ke IP dan port tertentu, dan koneksi tersebut akan
diforward ke tempat lain dari titik yang sama juga. Sedangkan port
forwarding pada ssh, titik keluarnya berbeda dengan titik masuknya. Agar
lebih jelas, silakan lihat gambar di bawah ini.
Pada gambar di atas pada bagian
atas, koneksi yang masuk di titik masuk, diforward ke tujuan dari titik
itu juga. Ini adalah tipikal port forwarding di router/proxy. Sedangkan
pada gambar di bawahnya, koneksi yang masuk di titik masuk, diforward ke
tujuan dari titik lain di ujung sebelah kanan. Kotak panjang yang
menghubungkan dua titik berwarna oranye tersebut menggambarkan koneksi
ssh. Koneksi yang masuk akan diforward dari ujung koneksi ssh, bukan
dari titik masuknya.
Konsep SSH Tunneling
SSH adalah protokol yang
multiguna, selain untuk menggantikan telnet, SSH juga mendukung fitur
tunneling, port forwarding, download/upload file (Secure FTP), SOCKS
proxy dsb. Semua fitur tersebut dibungkus dengan enkripsi sehingga data
yang lewat melalui protokol ini aman dari jangkauan hacker.
Dalam ssh tunneling, data yang
dikirimkan melalui koneksi ssh akan di-enkapsulasi (dibungkus) dalam
paket SSH seperti pada gambar di bawah ini.
Selain enkapsulasi paket, dalam ssh tunnel juga dibutuhkan port forwarding. Port forwarding dalam SSH tunnel ada 3 jenis:
- Local Port Forwarding
- Remote Port Forwarding
- Dynamic Port Forwarding
Perhatikan gambar di bawah ini untuk memahami perbedaan antara local port forwarding dan remote port forwarding.
Dari gambar di atas jelas terlihat bahwa perbedaan antara local dan remote port forwarding.
- Pada local port forwarding, komputer yang bertindak sebagai ssh client akan menjadi titik masuk koneksi yang akan diforward dan komputer yang bertindak sebagai ssh server menjadi titik keluar. Jadi koneksi yang masuk ke titik masuk di komputer ssh client akan diforward ke tujuan dari komputer ssh server. Gambar di bawah ini ilustrasi lain dari ssh local port forwarding.
- Pada remote port forwarding, komputer yang bertindak sebagai ssh server akan menjadi titik masuk koneksi yang akan diforward dan komputer yang bertindak sebagai ssh client menjadi titik keluar. Jadi koneksi yang masuk ke titik masuk di komputer ssh server akan diforward ke tujuan dari komputer ssh client. Gambar di bawah ini ilustrasi lain dari ssh remote port forwarding.
Jadi yang perlu diingat dalam
perbedaan antara local dan remote port forwarding adalah posisi titik
masuk koneksi yang akan diforward. Bila titik masuknya ada di komputer
yang berperan sebagai ssh client, maka itu adalah local port forwarding,
namun bila titik masuknya di komputer ssh server, maka itu adalah
remote port forwarding.
Dalam bahasa sederhananya,
disebut local karena dari sudut pandang ssh client, titik masuknya ada
di localhost, dan disebut remote karena titik masuknya bukan di
localhost, tapi di komputer ujung sana.
Static vs Dynamic Port Forwarding
Sebenarnya dynamic port
forwarding termasuk local port forwarding juga karena pada dynamic port
forwarding, titik masuk koneksi yang akan diforward berada di komputer
yang berperan sebagai ssh client. Namun pada local dan remote port
forwarding biasa (static), IP address dan port asal dan tujuan harus
disetting dulu sebelum bisa dipakai, jadi sifatnya statis.
Gambar di atas adalah (static)
local port forwarding biasa. Pada local port forwarding biasa (static),
setiap pemetaan port asal dan IP:port tujuannya harus disetting satu per
satu. Jadi terlihat pada gambar di atas, bila ada 3 tujuan yang ingin
dihubungi, maka 3 pemetaan port asal dan IP:port tujuan harus disetting
semua sebelum bisa dipakai.
Pada gambar di atas terlihat di
ssh client ada 3 port yang LISTEN (3 bulatan merah di sisi ssh client)
untuk 3 tujuan yang berbeda. Perlu dicatat juga bahwa ketiga pemetaan
port forwarding tersebut dilakukan di atas satu koneksi ssh yang sama
(multiple port forwarding on single ssh connection).
Sedangkan pada dynamic (local)
port forwarding, kita tidak perlu menentukan pemetaan port asal dan
IP:tujuan untuk setiap tujuan. Kita hanya perlu menentukan port berapa
yang akan LISTEN di localhost (di komputer ssh client), dan semua
aplikasi bisa memanfaatkan port tersebut sebagai proxy ke tujuan manapun
dengan protokol SOCKS (SOCKS proxy). Berbeda dengan gambar sebelumnya,
pada dynamic port forwarding di sisi ssh client hanya ada satu port yang
LISTEN (hanya ada satu bulatan merah).
Multiple Port Forwarding on Single SSH Connection
Walaupun jarang dipakai, namun
sebenarnya ssh mendukung banyak port forwarding dalam satu koneksi ssh.
Kalau kita membutuhkan 3 local port forwarding dan 4 remote port
forwarding, kita tidak perlu membuat 7 koneksi ssh, cukup satu koneksi
ssh saja.
Gambar di atas memperlihatkan
ilustrasi multi port forwarding pada satu koneksi ssh yang sama. Dalam
satu koneksi ssh tersebut port forwarding yang dibuat adalah:
- Panah berwarna hitam paling atas adalah local port forwarding.
- Panah berwarna biru dan biru gelap di tengah adalah dynamic port forwarding.
- Panah berwarna hijau paling bawah adalah remote port forwarding.
Daripada membuat 3 koneksi ssh
untuk masing-masing port forwarding, jauh lebih sederhana dan praktis
membuat multi port forwarding pada satu koneksi ssh.
Membuat Local Port Forwarding
Sekarang setelah memahami
konseptualnya, kita langsung praktek bagaimana membuat ssh tunnel dengan
putty di Windows dan command line ssh di Linux. Command untuk membuat
local port forwarding secara umum adalah:
ssh -L localport:servertujuan:porttujuan user@ssh_server Contohnya adalah: ssh -L 8888:www.kompas.com:80 admin@serverku.com
Perintah di atas akan membuat semua koneksi ke port 8888 di localhost, dialihkan ke www.kompas.com port 80 melalui serverku.com. Titik masuknya adalah localhost:8888 dan titik keluarnya adalah serverku.com. Bila kita membuka browser ke URL http://localhost:8888, request HTTP tersebut akan sampai di www.kompas.com:80 melalui serverku.com, artinya dari sudut pandang www.kompas.com koneksi berasal dari serverku.com, bukan dari komputer yang menjalankan perintah tersebut. Dalam log web server www.kompas.com, IP address visitor adalah ip address serverku.com, bukan ip address komputer yang menjalankan perintah tersebut.
ssh -L localport:servertujuan:porttujuan user@ssh_server Contohnya adalah: ssh -L 8888:www.kompas.com:80 admin@serverku.com
Perintah di atas akan membuat semua koneksi ke port 8888 di localhost, dialihkan ke www.kompas.com port 80 melalui serverku.com. Titik masuknya adalah localhost:8888 dan titik keluarnya adalah serverku.com. Bila kita membuka browser ke URL http://localhost:8888, request HTTP tersebut akan sampai di www.kompas.com:80 melalui serverku.com, artinya dari sudut pandang www.kompas.com koneksi berasal dari serverku.com, bukan dari komputer yang menjalankan perintah tersebut. Dalam log web server www.kompas.com, IP address visitor adalah ip address serverku.com, bukan ip address komputer yang menjalankan perintah tersebut.
Kalau dalam windows, kita bisa
gunakan putty.exe untuk membuat local port forwarding tunnel. Gambar di
bawah ini adalah setting untuk forward koneksi localhost:8888 ke
www.kompas.com:80. Caranya adalah dengan memasukkan 8888 ke dalam field
“Source port”, dan memasukkan www.kompas.com:80 ke dalam field
“Destination”. Setelah itu klik “Add”. Anda bisa menambahkan port
forwarding yang lain sebanyak yang anda butuhkan dengan mengulang cara
yang sama lalu klik “Add” lagi.
Membuat Remote Port Forwarding Command untuk membuat remote port forwarding di Linux secara umum adalah: ssh -R remoteport:servertujuan:porttujuan user@ssh_server
Contohnya adalah: ssh -R 8080:192.168.1.1:80 admin@serverku.com
Perintah di atas akan membuat setiap koneksi ke serverku.com:8080 akan dialihkan ke 192.168.1.1 melalui komputer yang menjalankan perintah tersebut. Pada log server tujuan (192.168.1.1:80) yang terlihat dari koneksi yang masuk bukan ip address serverku.com. Server 192.168.1.1:80 akan melihat koneksi berasal dari komputer yang menjalankan perintah di tersebut (komputer ssh client).
Kalau dengan putty caranya
masukkan 9999 ke dalam kolom “Source port”, kemudian masukkan
192.168.1.1:80 sebagai kolom “Destination”, lalu klik Add. Anda bisa
menambahkan banyak port forwarding dalam satu koneksi ssh, dengan cara
yang sama, lalu klik Add sebanyak yang anda butuhkan.
Remote port forwarding ini sangat
cocok dipakai sebagai backdoor. Bila seorang hacker telah berhasil
menyusup hingga “behind enemy lines”, dia bisa membuat remote port
forwarding tunnel dari “behind enemy lines” ke server di luar milik
hacker. Ini artinya hacker telah membuat terowongan, dengan pintu masuk
di luar, dan pintu keluar di “behind enemy lines”. Ingat pada Remote
port forwarding, titik/pintu masuk adalah di sisi ssh server, dan
titik/pintu keluar di ssh sisi client. Dengan memakai terowongan ini,
hacker bisa masuk melalui pintu di servernya sendiri yang berada di
luar, dan secara otomatis hacker tersebut masuk ke “behind enemy lines”
karena pintu keluar dari terowongan ini ada di “behind enemy lines”.
Chaining Tunnel
Terkadang ketika melakukan
penetrasi, di dunia nyata keadaan tidaklah semulus dan seindah teori
atau dalam lab. Firewall seringkali membuat kita tidak bisa bebas
membuat koneksi ke server yang kita inginkan. Dalam situasi seperti ini
kita harus berputar-putar melalu beberapa server, sampai kita bisa
mencapai server target.
Perhatikan gambar di atas, target
yang akan diserang hacker adalah server D.D.D.D port 3389, yaitu Remote
Desktop connection, hacker ingin melakukan remote desktop komputer
tersebut. Namun server D hanya bisa diakses oleh server C, dan server C
hanya bisa diakses dari A. Hacker sudah menguasai penuh server A dan C,
bagaimana caranya hacker tersebut bisa remote desktop ke D ?
Tujuan akhirnya adalah hacker ingin koneksi ke localhost:9999 di laptop backtracknya, akan diforward ke D.D.D.D:3389. Jadi nanti dia tinggal menjalankan RDP client dengan memasukkan localhost:9999, dan dia otomatis akan terkoneksi ke RDP di server D. Sebagai info tambahan, komputer A dan C adalah linux dengan ssh service diaktifkan.
Mari kita coba membuat semua tunnel ini purely hanya dengan ssh.
1. Buat port forwarding localhost:9999 –> C.C.C.C:8888 via A.A.A.A.
Tujuan akhirnya adalah hacker ingin koneksi ke localhost:9999 di laptop backtracknya, akan diforward ke D.D.D.D:3389. Jadi nanti dia tinggal menjalankan RDP client dengan memasukkan localhost:9999, dan dia otomatis akan terkoneksi ke RDP di server D. Sebagai info tambahan, komputer A dan C adalah linux dengan ssh service diaktifkan.
Mari kita coba membuat semua tunnel ini purely hanya dengan ssh.
1. Buat port forwarding localhost:9999 –> C.C.C.C:8888 via A.A.A.A.
Hacker menjalankan ssh client di
backtracknya untuk membuat koneksi ke ssh server A.A.A.A. Dalam koneksi
ssh ini, dia membuat local port forwarding 9999:C.C.C.C:8888, yang
artinya adalah koneksi ke port 9999 di backtrack si hacker akan
diforward ke C.C.C.C:8888 via A.A.A.A.
2. Buat port forwarding C.C.C.C:8888 –> D.D.D.D:3389 via C.C.C.C Di komputer C, hacker membuat koneksi ssh ke localhost (ke C itu sendiri). Dalam koneksi ssh ke diri sendiri ini dia membuat local port forwarding 8888:D.D.D.D:3389. Artinya adalah koneksi ke C.C.C.C:8888 akan diforward ke D.D.D.D:3389 (via C.C.C.C itu sendiri).
Kita membuat 2 tunnel, yang pertama adalah tunnel dengan pintu masuk di backtrack hacker dan pintu keluar di A.A.A.A. Tunnel kedua adalah denngan pintu masuk dan pintu keluar di C juga.
Pada tunnel pertama, koneksi ke pintu masuk di backtrack hacker (localhost:9999), akan diforward ke C.C.C.C:8888 via A.A.A.A Sedangkan pada server C.C.C.C sudah dibuat port forwarding sehingga semua koneksi yang masuk ke C.C.C.C:8888 akan diforward menuju D.D.D.D:3389.
Jadi akhirnya nanti alurnya adalah: localhost:9999 –> C.C.C.C:8888 –> D.D.D.D:3389
2. Buat port forwarding C.C.C.C:8888 –> D.D.D.D:3389 via C.C.C.C Di komputer C, hacker membuat koneksi ssh ke localhost (ke C itu sendiri). Dalam koneksi ssh ke diri sendiri ini dia membuat local port forwarding 8888:D.D.D.D:3389. Artinya adalah koneksi ke C.C.C.C:8888 akan diforward ke D.D.D.D:3389 (via C.C.C.C itu sendiri).
Kita membuat 2 tunnel, yang pertama adalah tunnel dengan pintu masuk di backtrack hacker dan pintu keluar di A.A.A.A. Tunnel kedua adalah denngan pintu masuk dan pintu keluar di C juga.
Pada tunnel pertama, koneksi ke pintu masuk di backtrack hacker (localhost:9999), akan diforward ke C.C.C.C:8888 via A.A.A.A Sedangkan pada server C.C.C.C sudah dibuat port forwarding sehingga semua koneksi yang masuk ke C.C.C.C:8888 akan diforward menuju D.D.D.D:3389.
Jadi akhirnya nanti alurnya adalah: localhost:9999 –> C.C.C.C:8888 –> D.D.D.D:3389
Gambar di atas menunjukkan chain
tunnel yang dibuat. Koneksi ke localhost:9999 akan diteruskan ke
C.C.C.C:888 dan koneksi ke C.C.C.C:8888 akan diteruskan ke D.D.D.D:3389.
Jadi sama artinya dengan koneksi ke localhost:9999 diteruskan ke
D.D.D.D:3389.
Tidak ada komentar:
Posting Komentar