Setelah sebelumnya aku sudah berbagi bagaimana cara membuat akun SSH,
tapi kita sendiri kurang mengenal apa itu SSH Tunneling dan bagaimana
kinerjanya. Kita cuma tahu SSH Tunneling hanya sebagai proxy chain untuk
internet gratis. Jadi mari kita belajar mengenal SSH Tunneling lebih jauh, itung-itung sebagai pengetahuan untuk tips dan trik internet.
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).
Rizki Wicaksono
Kupas Tuntas 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 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.
Penulis Rizki Wicaksono
Kupas Tuntas SSH Tunneling
0 comments:
Posting Komentar