SSH Tunneling dan Internet Gratis

Saat ini sepertinya semua developer sudah memakai SSH sehari-hari. Sebagian mungkin sudah mengenal beberapa fitur ekstra SSH, tapi kebanyakan tidak tahu fitur lengkapnya. Wajar saja sih, meski RFC untuk SSH ini singkat (terbagi dalam beberapa RFC), ada banyak fitur di luar RFC yang diimplementasikan oleh berbagai software SSH. Sampai-sampai ada beberapa buku yang khusus hanya membahas SSH saja.

Di tulisan ini, saya tidak akan membahas semua fitur SSH, hanya beberapa fitur yang menarik yang berhubungan dengan port forwarding, serta pembahasan bagaimana SSH ini bisa menjadi jalan untuk internet gratis atau tanpa restriksi.

Fitur paling dasar yang dikenal orang adalah login ke server lain, dan berikutnya mungkin melakukan scp atau sftp ke server lain untuk mentransfer file. Fitur menarik berikutnya adalah X11 forwarding yang untuk mengakses aplikasi GUI di server (unix) lain.
client-server

SSH mendukung multi channel dalam satu koneksi, dan ini bisa dimanfaatkan untuk TCP/IP forwarding (mengenai ini bisa dibaca di RFC 4254). Saya akan jelaskan beberapa kegunaan forwarding ini. Channel yang dibentuk oleh mekanisme forwarding ini disebut juga sebagai tunnel.

Kegunaan pertama adalah untuk mengakses sesuatu di remote system. Contohnya: kita ingin melakukan koneksi database ke suatu system remote, tapi portnya hanya terbuka untuk lokal saja. Seperti ini:

forward1

Contoh perintahnya:

ssh -L 3306:dbserver:3306 [email protected]

Di sini kita melakukan yang namanya “local port forwarding”, sebuah port akan dibuka di client untuk mendengarkan request di localhost, dan akan diforward ke sistem remote. Jadi setelah perintah tersebut dijalankan (dan selama ssh belum ditutup), kita akan bisa menggunakan program desktop kita untuk melakukan koneksi ke “localhost:3306” dan itu akan terhubung ke sistem remote.

Kegunaan berikutnya adalah agar remote system bisa mengakses sistem kita. Contohnya kita ingin mengetes koneksi ke Paypal (atau sistem eksternal lain), dan kita tidak ingin mendeploy ke server karena masih dalam tahap development.

forward2

Kita bisa melakukan ini:

ssh -R 1000:localhost:5000 [email protected]

Ini namanya “remote port forwarding”, sebuah port akan dibuka di server untuk menerima koneksi, jika ada koneksi, maka koneksi tersebut akan diforward ke sistem lokal. Dengan cara seperti ini, jika kita berpindah development dari desktop ke laptop atau pindah lokasi kerja (dari cafe satu ke cafe lain), dengan IP berbeda, kita tetap bisa mengetes dengan membuka koneksi SSH dari lokasi tersebut.

socks

OpenSSH, Putty, BitVise, dan beberapa software SSH lain memungkinan bentuk forwarding yang lain: SOCKS forwarding. Dengan socks forwarding, kita bisa memforward semua request ke remote server. Untuk memakai forwarding ini, kita perlu memakai software yang mendukung socks forwarding (misalnya Firefox mendukung ini, Chrome juga tapi butuh extension seperti Proxy Helper atau perlu command line khusus). Apa kegunaan ini? salah satunya adalah untuk mendapatkan internet yang unrestricted (bypass blocking). Kegunaan lainnya adalah supaya kita bisa dianggap berasal dari tempat lain (negara lain) sesuai tempat server berada.

Contoh perintahnya:

ssh -D 9091 [email protected]

socks2

Secara singkat bisa disimpulkan bahwa kita bisa menumpangkan protokol lain di atas SSH, tapi yang lebih menarik lagi: beberapa implementasi SSH (seperti OpenSSH, Putty dan BitVise) memungkinkan kita menumpangkan SSH di atas protokol lain. Analoginya begini: jika protokol SSH itu seperti mobil yang bisa ditumpangi orang, maka “mobil” ini juga bisa ditumpangkan di atas kendaraan lain.

overproxy
Putty dan BitVise mendukung HTTP Proxy, jadi kita bisa melakukan koneksi ke server lain melalui proxy ini. Syaratnya adalah: proxy harus menerima “CONNECT” dan mengijinkan port yang Anda tuju (konfigurasi default Squid hanya mengijinkan koneksi ke port 443, jadi tidak bisa digunakan untuk koneksi ke ssh di port 22 tanpa perubahan konfigurasi). OpenSSH lebih generik lagi: mendukung opsi yang namanya ProxyCommand.

Dengan ProxyCommand, kita bisa melewatkan SSH di atas apa saja. Sudah ada implementasi untuk melewatkan paket SSH via ICMP dan DNS. Protokol yang dipakai sangat sederhana: ssh akan menjalankan program yang disebut di opsi ProxyCommand dan akan berkomunikasi dengan program tersebut via stdin dan stdout. Untuk memakai HTTP Proxy , kita bisa memakai netcat versi openbsd (perhatikan bahwa ada banyak versi netcat):

ssh [email protected]_server -o "ProxyCommand=nc -X connect -x some-proxy:$proxy_port %h %p"

Sebenarnya kita bisa membuat sendiri program yang bisa melakukan apa yang dilakukan netcat. Seperti ini (perhatikan ada bagian yang saya comment, akan saya jelaskan nanti):

Jika ingin memakai skrip kita sebagai ganti netcat:

ssh [email protected]_server -o "ProxyCommand=python proxy.py %h %p"

SSH via DNS dan ICMP yang disebutkan di atas kadang digunakan karena bisa membypass internet gratis. Paper Mobile Data Charging: New Attacks and Countermeasures mencontohkan kelemahan konfigurasi beberapa provider 3G/4G yang memungkinkan Internet gratis dengan memanfaatkan port 53 yang biasanya dipakai untuk DNS. Perlu dicatat bahwa jika port TCP 53 diblok (hanya UDP saja), lalu semua diredirect ke DNS milik provider, tapi jika DNS provider masih melakukan dan merespon recursive query, maka SSH over DNS masih bisa dilakukan (SSH ini dilakukan dengan me-wrap paket SSH dalam paket DNS).

trick
Jika Anda kreatif, Anda bisa melewatkan SSH melalui berbagai layanan lain, misalnya bisa saja kita membuat SSH over Telegram/Line/WhatsApp (walau mungkin akan ada batasan jumlah message yang bisa dikirimkan per detik atau per menit melalui program-program messenger tersebut).

Dari penelusuran yang dilakukan di Internet, saya mendapati berbagai teknik yang disebut dengan “injek” yang ternyata merupakan header injection. Intinya: billing beberapa provider (tadinya ) bisa ditipu dengan menambahkan string tertentu setelah CONNECT sehingga seolah-olah kita melakukan koneksi ke host lain. Contohnya kira-kira seperti ini: “CONNECT namahost:port GET http://0.facebook.com Hostname: 0.facebook.com” dengan asumsi bahwa 0.facebook.com merupakan domain yang digratiskan oleh operator. Dari skrip yang saya temui di Internet, sepertinya sistem billing hanya melihat ada substring “GET domaingratis” dan menggratiskan koneksi tersebut. Dalam contoh Python sebelumnya, penambahan teks header ekstra saya comment.

Saya sendiri tidak bisa mencoba apakah berbagai macam trik tersebut masih berlaku atau tidak (posisi saya tidak di Indonesia). Sepertinya sebagian masih berlaku dengan berbagai variasi (misalnya dengan mengubah verb GET menjadi POST/OPTIONS/DELETE/PROPFIND, dsb), karena masih ada yang mengumbar keberhasilannya di Facebook. Tentunya trik semacam itu tetap butuh SSH server. Inti dari triknya adalah: kita perlu bisa mengakses satu saja server yang terhubung ke internet secara gratis, maka server itu akan menjadi batu loncatan supaya bisa mengakses konten lain.

Menurut saya kelemahan semacam itu lebih dikarenakan kemalasan saja. Secara teknis: untuk situs yang digratiskan sebaiknya selalu via HTTPS (Facebook, freebasics, dsb sudah memakai HTTPS sekarang). Jika situs gratis tidak memakai HTTPS, maka harus ada IP whitelisting. Jika proxy hanya mengecek header, tapi tidak mengecek IP server, maka kita bisa saja membuat HTTP server sendiri di port 80 yang bahkan tidak menggunakan verb CONNECT sama sekali (tapi berlaku seperti CONNECT).

Supaya lebih jelas lagi: di Linux/OSX biasanya implementasi ssh yang dipakai adalah OpenSSH (kecuali embedded Linux system yang banyak memakai dropbear), dan kita bisa dengan mudah membuat berbagai jenis proxy dengan skrip sederhana seperti di atas. Client ssh di Windows yang non command line (Putty, BitVise) hanya mendukung HTTP Proxy saja. Untuk bisa memodifikasi header, maka diperlukan tools lain, sehingga koneksinya dari SSH ke program injeksi (yang pura-pura jadi proxy server, tapi sebenarnya hanya menambah header), lalu program itu yang akan melakukan koneksi ke proxy server sebenarnya.

inject

Sedikit menyimpang dari topik utama SSH, yaitu mengenai internet gratis via operator seluler. Sebenarnya trik SSH ini bukan satu-satunya cara yang dilakukan orang. Misalnya pernah ada juga orang (vendor) yang memasang proxy gelap/tidak resmi di provider (jadi tidak ada hubungannya dengan SSH sama sekali). Tentunya ini mudah sekali dicari oleh operator (dengan port scanning ataupun monitoring jaringan).

Pernah juga kasus saya temui di mana ternyata pelanggan akan berada di satu segmen jaringan, dan pelanggan yang satu tidak diisolasi dari pelanggan lain dan traffic dari satu pelanggan ke yang lain tidak dikenai biaya. Salah satu pelanggan menghubungkan ponsel ke komputer yang juga terhubung ke internet yang unlimited. Ada yang mensetup seperti ini di rumah/kantornya nya, jadi “gratis” karena internet di server itu sudah dibayar (ada juga yang menjual koneksi internetnya ke orang lain secara murah). Saat ini sepertinya semua operator sudah mengkonfigurasi jaringannya dengan baik. Kalau Anda “gila”, Anda bahkan bisa mengirim pesan atau data via missed call.

SSH ini merupakan tool yang sangat berguna dan saya pakai setiap hari. Masih ada banyak hal lain yang bisa dipelajari yang cukup menarik tapi tidak saya bahas di sini. Jika Anda tertarik, beberapa topik yang layak dicari di Google: login dengan public/private key, file konfigurasi (.ssh/config supaya lebih gampang menyimpan berbagai opsi untuk berbagai host), opsi ControlMaster (supaya koneksi berikutnya lebih cepat), ssh-agent (supaya tidak perlu sering-sering mengetik password private key), VPN via SSH, dan escape characters.

8 thoughts on “SSH Tunneling dan Internet Gratis”

  1. Kondisi darurat dan sewaktu-waktu memang bisa pakai SSH. Namun bila menjadi kebisaan rutin, praktek yang umum adalah memasang VPN, tidak perlu penyesuaian di aplikasi. Trik internet gratis lewat port DNS memang kelengahan dari operator. Jamaknya port 53 di-redirect saja ke DNS provider dan hanya dibuka untuk UDP. Sepertinya tidak ada DNS lewat TCP.

    1. Betul, kalau memungkinkan maka VPN akan lebih mudah. Ada beberapa kasus di mana SSH tunneling ini lebih mudah (bisa adhoc, bisa tanpa hak admin, dsb).

      Perlu dicatat bahwa jika port TCP 53 diblok (hanya UDP saja), lalu semua diredirect ke DNS milik provider, tapi jika DNS provider masih melakukan dan merespon recursive query, maka SSH over DNS masih bisa dilakukan (SSH ini dilakukan dengan me-wrap paket SSH dalam paket DNS).

      1. kebetulan nih om ,, saya lg nyari app tunneling yg bisa koneksikan ssh pake jalur dns atau ssl.

  2. Operator utama sudah redirect port 53. “Inject” header yang masuk akal buat operator besar yang buka kerjasama dengan pihak lain dengan model bisnis akses data ke server khusus tidak dimeter, dan ini yang dieksploitasi.

    1. Mas, apakah selain diredirect, DNS milik provider juga tidak melakukan recursive query dan merespon?

      Karena jika port TCP 53 diblok (hanya UDP saja), lalu semua diredirect ke DNS milik provider, tapi jika DNS provider masih melakukan dan merespon recursive query, maka SSH over DNS masih bisa dilakukan (SSH ini dilakukan dengan me-wrap paket SSH dalam paket DNS).

      1. Saya sudah dapat jawaban dari facebook saya: ternyata sekarang traffic DNS keluar juga sudah dicharge.

  3. Inti nya gimana bang cara buat :’v ane bahan nya udah ada :’v post Tutorial nya di tunggu ya :’v

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.