SSH TUNNELING
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 dala
m 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.
Gambar
di bawah ini adalah contoh port forwarding dari web nakahara-informatics.com
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
Artinya untuk mengakses halaman web di
host 192.168.1.102, maka url yang harus dibuka di browser adalah
http://64.130.31.59:8080
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.
§ 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.
(static)
local port forwarding
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 conection).
dynamic
(local) port forwarding
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.
multi
port forwarding on a single ssh connection
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.
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.
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
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.
0 comments:
Post a Comment