Koneksi SSH melalui HTTPS
(trofi.github.io)- Pada jaringan terbatas, meskipun port
SSHdiblokir, jalur akses jarak jauh dapat dibuat dengan port HTTPS 443 dan metodeCONNECT - Server membuka
CONNECTdenganmod_proxy_connectmilikapache2, tetapi hanya mengizinkan target ssh-server:22 untuk mempersempit cakupan proxy - Klien menghubungkan ProxyCommand OpenSSH dengan
socat, dan pada HTTPS skrip mengirim headerCONNECTsecara langsung - Beberapa firewall atau
httpddapat menutup koneksi yang menganggur, sehinggaServerAliveInterval 30membantu menjaga sesi tetap hidup - Cara ini mengenkapsulasi
SSHdi dalamTLSsehingga lebih mudah menghindari pemblokiran, tetapi masih menyisakan beban enkripsi ganda dan konfigurasi klien
Membuat jalur koneksi SSH di jaringan terbatas
- Di lingkungan Wi-Fi rumah sakit, sebagian besar jenis koneksi diblokir, dan umumnya hanya TCP 80 untuk
HTTPserta TCP 443 untukHTTPSyang diizinkan - UDP 53 untuk
DNSdan TCP 853 untukDoTtampaknya berfungsi untuk penyedia DNS yang dikenal luas SSHsepenuhnya diblokir pada TCP 22 dan sebagian besar port kustom- Karena ada koneksi alternatif
GSMyang dapat dipakai untuk mengonfigurasi ulang server jarak jauh, berbagai metode bypass bisa diuji
Berbagi satu port dan enkapsulasi protokol
- Ada cara untuk menerima
SSHdanHTTPSbersama-sama pada satu port lalu membaginya secara transparan- sslh project memperkirakan protokol dengan heuristik lalu mengarahkan ulang ke backend sebenarnya seperti
SSH,HTTPS, atau protokol yang didukung - Keuntungannya, klien
sshtidak memerlukan konfigurasi khusus dan cukup menentukan port non-default - Kekurangannya, perlu menyiapkan layanan tambahan,
HTTPSjuga harus melewatisslh, dan alamat asal koneksi tersamarkan di backend sehingga pencatatan log bisa merepotkan
- sslh project memperkirakan protokol dengan heuristik lalu mengarahkan ulang ke backend sebenarnya seperti
- Pilihan lain adalah sepenuhnya mengenkapsulasi satu protokol di dalam protokol lain
ProxyCommandOpenSSH memungkinkan pengguna menentukan sarana transport yang akan digunakan protokolssh- Karena
SSHdibungkus di dalam stream lain tanpa heuristik, perangkat lunak DPI mungkin lebih sulit memblokirnya HTTPSitu sendiri tidak dialihkan atau terdampak- Namun, kinerja dapat menurun karena enkripsi ganda, dan konfigurasi klien diperlukan
Konfigurasi SSH over HTTP
- Pertama, dicoba metode melewatkan
SSHmelaluiHTTP - Konfigurasi
apache2di sisi server memuatmod_proxy_connectdan mengizinkan CONNECT ke port 22 denganAllowCONNECT 22 <Proxy *>pada dasarnya menolak semuanya, dan hanya<Proxy ssh-server>yang diizinkan untuk membatasi target kessh-server:22.ssh/configdi sisi klien menggunakanPROXY:http-server:%h:%p,proxyport=80miliksocatpadaProxyCommand- Dengan konfigurasi ini, menjalankan
$ ssh ssh-via-httpmemungkinkan koneksi keSSHmelalui port 80 ServerAliveInterval 30mengirim probe secara berkala untuk menghindari koneksiHTTPyang menganggur ditutup diam-diam di jalur perantarahttpdbawaan menggunakanTimeOut 60, yang menutup tunnel jika tidak ada input/output selama 60 detik
Konfigurasi SSH over HTTPS
socatternyata tidak mendukung proxyHTTPSmelalui metodeCONNECTdan hanya mendukungHTTP- Sebagai gantinya, digunakan fitur enkapsulasi TLS milik
socat, sementara permintaan berbasisCONNECTdiimplementasikan langsung dalam skrip ~/.ssh/https-tunnel.bashbekerja dengan alur berikut- Terlebih dahulu mencetak header
CONNECT ssh-server:22 HTTP/1.1danHost: ssh-server - Setelah itu, menyambungkan input standar apa adanya
- Seluruh stream diteruskan ke
socat - "SSL:$3:$4"untuk membuat koneksi TLS
- Terlebih dahulu mencetak header
- Di
.ssh/config,ProxyCommand ~/.ssh/https-tunnel.bashditetapkan untukHost ssh-via-https - Saat
$ ssh ssh-via-httpsdijalankan, koneksi kessh-serverberhasil melalui tunnelHTTPSseperti yang diharapkan
Hal yang perlu diperhatikan saat operasi
- Di lingkungan tempat
HTTPSdiizinkan secara luas, data dapat dikirim melewati perangkat perantara yang sangat membatasi - Metode
CONNECTmungkin terlihat seperti jejak lama, tetapi berguna untuk membungkus stream payload TCP arbitrer di dalam stream hostTLS ServerAliveIntervalmembantu mempertahankan koneksi OpenSSH ketika lapisan transport di bawahnya tidak ramah terhadap koneksi menganggur- Variasi konfigurasi
nginxtersedia di CONNECT passthrough on nginx
1 komentar
Komentar Hacker News
Bagian tulisan yang mengatakan, “HTTPS ada di mana-mana sehingga bahkan perangkat perantara yang sangat membatasi pun dapat meloloskan data” pada dasarnya menjelaskan alasan mengapa hampir semua protokol VPN proprietari, yang disebut “SSL VPN”, mengimplementasikan mode membuka terowongan lewat HTTPS
Walaupun bukan perilaku default, setidaknya mode ini disediakan sebagai jalur alternatif, dengan tujuan memastikan ada mode yang bisa berfungsi di hampir koneksi internet mana pun di seluruh dunia
Saya adalah salah satu pengembang utama https://gitlab.com/openconnect/openconnect, yang mengimplementasikan berbagai protokol VPN berbasis TLS, dan juga membuat https://github.com/dlenski/what-vpn yang mendeteksi dan mengidentifikasi lebih banyak jenis server VPN berbasis TLS
Dulu penyedia internet Belanda XS4ALL menyediakan fitur persis seperti ini
Mereka membuka akses SSH di port 80, dan ini beberapa kali sangat membantu saat sedang bepergian ketika WiFi hotel memblokir semua port selain 80
Namun dari sudut pandang KPN, kemungkinan sejak awal mereka memang tidak nyaman dengan budaya hacker XS4ALL
Rasanya seperti menghidupkan kembali budaya radio bajak laut era 1960-an
https://en.wikipedia.org/wiki/Pirate_radio_in_Europe
https://www.shodan.io/search/facet?query=ssh&facet=port
https://www.shodan.io/search/facet.png?query=ssh&facet=port
Sementara itu port 80 jauh lebih jarang
Dulu saya ingat hanya memakainya sebagai penyedia newsgroup
Sering kali ada pilihan ketiga: menjalankan SSH di port 80 atau 443 pada host lain, lalu menggunakan ProxyJump dari sana ke tujuan akhir
Atau Anda juga bisa membuka SOCKS melalui host itu untuk mendapatkan koneksi internet yang secara umum lebih sedikit difilter
Saya memakai SOCKS, dan juga meneruskan DNS berbasis TLS melalui port forwarding pada koneksi SSH
Beberapa tahun lalu saat pertama kali menyiapkan proxy SOCKS dan cukup sering memakai WiFi, saya belum pernah melihat tempat yang memeriksa lebih dari sekadar port, tetapi perangkat seperti itu memang ada dan mungkin sekarang lebih umum
Jadi saya cukup SSH ke server saya dan memakainya seperti biasa
Belakangan saya membuat arsip file Windows
.iso, mengunduhnya ke laptop lalu mengunggahnya ke server denganscp; tampaknya penggunaan puluhan GB gabungan upload dan download di port non-80/443 cukup untuk memicu pemeriksaan lalu lintas, sehingga sekitar jam makan siang tim IT memblokir port 22Tetapi mereka tidak memblokir port lain, jadi saya memindahkan SSH pada port forwarding ke 443 dan terus memakainya
Setelah itu tim IT sekolah menyadari saya memakai SSH di 443 dan menambahkan analisis lalu lintas dasar untuk memblokir SSH di 80/443, tetapi semua port lain tetap terbuka
Pada akhirnya mereka memblokir server saya di tingkat IP, tetapi semua IP lain tetap terbuka
Saya bisa melewatinya dengan VPS dan ProxyJump, tetapi karena ini program SMA early college, setelah kelas 2 saya hampir tidak pernah lagi berada di sekolah jadi rasanya tidak terlalu layak diupayakan
Saat berikutnya saya ke sana, saya ingin mencoba hanya untuk membuktikan bahwa itu bisa dilakukan, dan kalau mereka memblokir SSH di semua port, saya bisa menjalankan SSH di atas HTTPS pada VPS
Setelah lulus, saya juga ingin melihat lagi sejauh mana ini masih memungkinkan di WiFi tamu
Ini memang sedikit promosi terang-terangan, tetapi di Adaptive [1] kami membangun infrastruktur keamanan data
Salah satu produk kami meneruskan SSH dan berbagai protokol lain di atas HTTP/3 sehingga pengguna dapat terhubung ke database, server, dan sumber daya lain melalui satu port outbound
Mirip keluarga Ngrok, tetapi bisa di-self-host, dan dapat mendukung akses tanpa kata sandi atau diberi kredensial sementara serta perlindungan maker-checker
[1] https://adaptive.live/
Dalam praktiknya, hanya dengan membuat
opensshmendengarkan di port 443 saja sudah cukup untuk melewati sebagian besar firewallBagus. Anehnya, saya belum pernah memikirkan metode
CONNECTsebagai sesuatu seperti reverse proxy, bukan forward proxyNamun dalam kasus saya,
CONNECTsaja tidak cukup, jadi saya memakai SSH di atas WebSocket untuk menembus proxy kantorProxy itu memeriksa koneksi HTTPS dengan CA kustom milik perusahaan
Saya memodifikasi
socatagar server SSH saya bisa disajikan sebagai WebSocket melalui Apache, lalu di sisi klien saya memakainya bersamaProxyCommandmilik OpenSSHSaya terus berpikir untuk mengunggah patch itu, tetapi ada juga pilihan lain seperti
websocatHampir 20 tahun lalu saya memakai corkscrew[0], alat yang melakukan persis hal ini, untuk menjebol firewall kantor
Implementasi mandirinya dan artikelnya rapi
0: https://github.com/bryanpkc/corkscrew
corkscrewhanya bekerja dalam kondisi tertentu: Anda harus berada di belakang proxy HTTP, dan proxy HTTP itu harus mendukung metodeCONNECTSaat saya mengerjakan kontrak singkat sekitar 20 tahun lalu, syarat pertama terpenuhi tetapi syarat kedua tidak
Untungnya ada alat yang bisa dipakai bahkan dalam kasus seperti ini, meski tentu perlu konfigurasi di sisi server
https://github.com/larsbrinkhoff/httptunnel
Secara umum, tunneling melalui HTTP/2 tampaknya merupakan pilihan yang baik
Ada gRPC[1], protokol remote procedure call yang dibangun di atas HTTP/2
HTTP/2 unggul untuk multipleksing karena memanfaatkan satu koneksi TCP untuk mengirim dan menerima banyak struktur data secara bersamaan
Namun, karena QUIC sendiri sudah menyediakan multipleksing, mungkin tidak ada alasan untuk memakai HTTP/3
Ke depannya, karena para pembuat perangkat perantara tidak akan berhenti melakukan diskriminasi, sepertinya sebagian besar komunikasi akan berjalan di atas HTTP/2 terenkripsi dan QUIC
Untuk mengurangi active probing[2], mungkin kita perlu menyajikan konten HTTP/2·HTTP/3 yang acak, mungkin bahkan dihasilkan AI
[1] <https://grpc.io>
[2] <https://blog.torproject.org/learning-more-about-gfws-active-...>
HTTP sendiri sudah merupakan protokol request/response, dan pada dasarnya bisa dipakai untuk remote procedure call
Entah HTTP 1, 2, atau 3, tampaknya tidak banyak bedanya
Evolusi protokol itu sendiri juga agak meragukan, dan ada sisi bahwa ia dirancang untuk memanfaatkan hal-hal yang tidak diperlukan dalam lingkungan remote procedure call
Pada dasarnya, ia lebih dekat dengan sesuatu yang dirancang untuk internet publik daripada untuk layanan lokal
HTTP/3 berjalan di atas QUIC
Sebaliknya, saya lebih suka HTTP di atas SSH
Setengah bercanda, tetapi akan bagus kalau browser punya manajemen identitas setara SSH bawaan
Saat pertama kali membaca hobo, usulan autentikasi HTTP dengan kunci publik, saya sempat antusias, lalu sadar tidak ada implementasi server maupun implementasi klien browser
Ada implementasi JavaScript, tetapi bukan dalam bentuk yang saya inginkan
ssh -D “*:8080” hostPerintah ini menjalankan proxy SOCKS di port 8080
Saya selalu memakainya di Firefox, dan kerjanya seperti VPN jadul
Praktis untuk hal-hal yang meragukan, tetapi juga saya pakai untuk mengakses dasbor rmq di jaringan privat AWS
https://techcommunity.microsoft.com/t5/iis-support-blog/clie...
Saya tidak cukup paham detailnya untuk tahu apakah ini memenuhi kebutuhan, tetapi pernah memakainya untuk autentikasi server saat kuliah
ssh://google.comhttps://news.ycombinator.com/item?id=38664729
Kenapa
sslhtidak lebih disukai?Ia dapat mendeteksi HTTP, TLS/SSL (termasuk SNI dan ALPN), SSH, OpenVPN, tinc, XMPP, SOCKS5, dan bahkan bisa mengenali protokol lain yang dapat diperiksa dengan regex
Kegunaan tipikalnya adalah menyajikan beberapa layanan sekaligus di port 443
Misalnya, Anda bisa tetap terhubung ke SSH dari dalam firewall kantor sambil terus menyajikan HTTPS di port yang sama
https://www.rutschle.net/tech/sslh/README.html
sslhatau enkapsulasi penuhAlasan memilih enkapsulasi penuh tampaknya karena ada satu layanan yang tidak perlu dikonfigurasi, server HTTP yang menangani koneksi membuat alamat jarak jauh di log menjadi akurat, dan mungkin juga karena semangat hacker lebih menyukai solusi baru daripada solusi yang sudah ada