Menyiapkan proxy SSL transparan

14

Saya memiliki kotak linux yang diatur dengan 2 kartu jaringan untuk memeriksa lalu lintas melalui port 80. Satu kartu digunakan untuk internet, yang lain dihubungkan ke switch jaringan. Intinya adalah untuk dapat memeriksa semua lalu lintas HTTP dan HTTPS pada perangkat yang terhubung ke sakelar itu untuk tujuan debugging.

Saya telah menulis aturan berikut untuk iptables:

nat

-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337

-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

Pada 192.168.2.1:1337, saya punya proksi http transparan menggunakan Charles ( http://www.charlesproxy.com/ ) untuk merekam.

Semuanya baik-baik saja untuk port 80, tetapi ketika saya menambahkan aturan serupa untuk port 443 (SSL) yang menunjuk ke port 1337, saya mendapatkan kesalahan tentang pesan tidak valid melalui Charles.

Saya telah menggunakan proxy proxy pada komputer yang sama sebelumnya dengan Charles ( http://www.charlesproxy.com/documentation/proxying/ssl-proxying/ ), tetapi tidak berhasil melakukannya secara transparan karena alasan tertentu. Beberapa sumber yang saya googled mengatakan ini tidak mungkin - Saya bersedia menerimanya sebagai jawaban jika seseorang dapat menjelaskan alasannya.

Sebagai catatan, saya memiliki akses penuh ke pengaturan yang dijelaskan termasuk semua klien yang terhubung ke subnet - sehingga saya dapat menerima sertifikat yang ditandatangani sendiri oleh Charles. Solusinya tidak harus spesifik-Charles karena secara teori, proxy transparan apa pun akan dilakukan.

Terima kasih!

Sunting: Setelah bermain dengannya sedikit, saya bisa membuatnya bekerja untuk host tertentu. Ketika saya memodifikasi iptables saya sebagai berikut (dan buka 1338 di charles untuk proxy terbalik):

nat

-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337

-A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.2.1:1338
-A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 1338

-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

Saya bisa mendapatkan respons, tetapi tanpa host tujuan. Di proksi terbalik, jika saya hanya menentukan bahwa semuanya dari 1338 masuk ke host tertentu yang ingin saya tekan, ia melakukan jabat tangan dengan benar dan saya dapat mengaktifkan proxy SSL untuk memeriksa komunikasi.

Penyiapannya kurang ideal karena saya tidak ingin menganggap semuanya dari 1338 masuk ke host itu - ada ide mengapa host tujuan sedang dilucuti?

Terima kasih lagi

badunk
sumber
Apa masalah spesifik yang Anda miliki? Itu mungkin, karena Anda mempercayai sertifikat yang dihasilkannya secara dinamis - itu bisa menjadi MITM dan menangkap teks komunikasi yang sederhana, dan membuat koneksi masih dapat dipercaya oleh klien.
Shane Madden
Saya mengedit posting saya - saya percaya tuan rumah tujuan akan
dihapus

Jawaban:

10

Masalah yang Anda lihat adalah sama yang mencegah penggunaan beberapa sertifikat pada satu alamat / port IP (tanpa menggunakan Indikasi Nama Server) .

Dalam HTTP biasa, proksi transparan Anda dapat memberi tahu host mana yang ingin disambungkan klien dengan melihat ke Hostheader.

Ketika proksi transparan HTTPS MITM mendapatkan permintaan, ia tidak dapat mengetahui nama host yang diminta oleh klien. (Saya bahkan tidak yakin itu bisa mendapatkan alamat IP dengan aturan-aturan ini, yang setidaknya mungkin memungkinkannya untuk membuat perkiraan menggunakan lookup DNS terbalik, meskipun itu tidak mungkin berfungsi dalam kasus umum.)

  • Untuk mendapatkan nama host yang diharapkan, proksi MITM harus membaca Hostheader di pesan HTTP, yang hanya dapat terjadi setelah jabat tangan yang sukses.
  • Untuk mendapatkan jabat tangan yang sukses, proksi MITM perlu membuat sertifikat spoof yang cocok dengan nama host yang diharapkan.

Akibatnya, proxy MITM tidak dapat mengetahui sertifikat mana yang akan dihasilkan sebelum jabat tangan.

Ini dapat bekerja dengan proksi MITM yang tidak transparan, karena Anda setidaknya akan mendapatkan nama host yang dimaksud melalui CONNECTmetode HTTP .

Bruno
sumber
Ini menjelaskan banyak kepada saya terima kasih! Saya merasa bisa mulai mengajukan pertanyaan yang tepat. Bagaimana cara menyiapkan proxy SSL transparan? Seperti apa jabat tangannya?
badunk
1
@badunk, saya rasa Anda tidak bisa, kecuali jika Anda menonaktifkan semua verifikasi sertifikat di sisi klien.
Bruno
Cara lain untuk proxy untuk mendapatkan nama host yang tepat adalah dengan membuat permintaan sendiri ke alamat IP target untuk mendapatkan sertifikatnya, sebelum melanjutkan dengan jabat tangan antara klien dan proxy.
Bruno
mitmproxy adalah proksi HTTPS. Anda tidak harus menonaktifkan semua verifikasi sertifikat tetapi Anda harus menginstal sertifikat mitmproxy karena akan digunakan untuk semua koneksi https.
Tyler
3

Hanya beberapa info dasar tentang topik ini.

Hanya ada beberapa perangkat yang saya tahu yang dapat berhasil melakukan tindakan ini. Namun mereka tidak benar-benar tersedia untuk masyarakat umum. Saya sendiri menggunakan Fortinet Fortigate dengan SSL Offloading.

Apa yang pada dasarnya dilakukannya adalah; itu memotong Koneksi SSL yang dibuat ke host dan mendekripsi koneksi dalam perangkat keras, kemudian memeriksa ke mana Anda ingin pergi dan membuat keputusan firewall berdasarkan informasi itu.

Setelah itu mengatur koneksi itu sendiri ke host itu untuk mengambil data dan menandatangani ulang permintaan asli kepada klien menggunakan CA yang disediakan oleh pengguna. Untuk membuat ini berfungsi dengan lancar, diperlukan CA di CA akar tepercaya pada klien.

Pengaturan semacam ini digunakan dalam organisasi untuk menegakkan kebijakan perusahaan terkait penggunaan internet. Karena menggunakan Direktori Aktif, mudah untuk menginstal CA perusahaan Anda di klien, ini bukan masalah bagi organisasi besar.

Ini adalah HANYA cara Anda dapat melakukannya tanpa membuat proksi manual, karena lalu lintas SSL dienkripsi. Ini pada dasarnya adalah MITM sehingga penting untuk memiliki masalah hukum yang tercakup.

Jochen Oonincx
sumber
1

Ada beberapa saran lagi tentang pertanyaan lain yang mungkin Anda lihat: mitos dan fakta proxy SSL transparan . Dan ada tautan ini yang menjelaskan bagaimana tepatnya mengkonfigurasi Squid menjadi proxy SSL transparan. Ini bukan apa yang Anda cari, tetapi setidaknya mungkin memberi Anda wawasan tentang apa yang salah.

Aturan iptables tampak oke, tetapi saya tidak tahu apakah perangkat lunak proxy yang Anda gunakan mampu melakukan apa yang Anda coba lakukan. Dokumentasi tentu saja mengklaim ini sebagai masalahnya.

chutz
sumber
0

Untuk menambah solusi Bruno, saya menyelidiki sedikit dan ingin membagikan bagaimana saya mendapatkan perbaikan cepat yang kurang ideal.

Setelah mengatur iptables tersebut, saya dapat meletakkan proxy terbalik pada port 1338 dan meneruskannya ke localhost pada port 1337. Karena port 1337 adalah proxy http transparan dan data telah didekripsi, ia akan mengambil header host dan menjadikannya tujuan. tuan rumah.

Kelemahan utama adalah bahwa saya pada dasarnya telah mengkonversi koneksi https ke http - yang tidak selalu berfungsi dengan setiap server (belum lagi lubang keamanan yang saya paparkan dari itu).

Saya bekerja dari batas perangkat lunak saya. Saya percaya solusi yang lebih bersih menurut Bruno adalah dengan mengasumsikan semua lalu lintas dari tahun 1338 harus didekripsi. Setelah dekripsi, periksa host tujuan dan kemudian proksi permintaan menggunakan SSL.

badunk
sumber
Tidak yakin saya mengerti, tentu saja, Anda tidak membuat https://koneksi yang tepat dari sudut pandang klien dengan ini?
Bruno