Konfigurowanie przezroczystego serwera proxy SSL


14

Mam zestaw Linux z dwiema kartami sieciowymi do kontroli ruchu przechodzącego przez port 80. Jedna karta służy do wychodzenia do Internetu, druga podłączona jest do przełącznika sieciowego. Chodzi o to, aby móc sprawdzić cały ruch HTTP i HTTPS na urządzeniach podłączonych do tego przełącznika w celu debugowania.

Napisałem następujące reguły dla 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

W dniu 192.168.2.1:1337 mam przezroczysty serwer proxy HTTP używający Charlesa ( http://www.charlesproxy.com/ ) do nagrywania.

Dla portu 80 wszystko jest w porządku, ale kiedy dodam podobne reguły dla portu 443 (SSL) wskazującego na port 1337, pojawia się błąd dotyczący nieprawidłowej wiadomości przez Charlesa.

Używałem proxy SSL na tym samym komputerze wcześniej z Charlesem ( http://www.charlesproxy.com/documentation/proxying/ssl-proxying/ ), ale z jakiegoś powodu nie udało mi się to zrobić w sposób transparentny. Niektóre zasoby, które przeglądałem w Google, mówią, że to niemożliwe - jestem gotów przyjąć to jako odpowiedź, jeśli ktoś może wyjaśnić, dlaczego.

Uwaga: mam pełny dostęp do opisanego zestawu, w tym wszystkich klientów podłączonych do podsieci - dzięki czemu mogę akceptować certyfikaty z podpisem własnym autorstwa Charlesa. Rozwiązanie nie musi być specyficzne dla Charlesa, ponieważ teoretycznie wystarczy dowolny przezroczysty serwer proxy.

Dzięki!

Edycja: Po odrobinie zabawy mogłem go uruchomić dla konkretnego hosta. Kiedy modyfikuję moje iptables do następującego (i otwieram 1338 w charles dla odwrotnego proxy):

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

Jestem w stanie uzyskać odpowiedź, ale bez hosta docelowego. W odwrotnym proxy, jeśli tylko sprecyzuję, że wszystko od 1338 przechodzi do konkretnego hosta, który chciałem trafić, odpowiednio potrząsa ręką i mogę włączyć proxy proxy w celu sprawdzenia komunikacji.

Konfiguracja jest mniej niż idealna, ponieważ nie chcę zakładać, że wszystko z 1338 idzie do tego hosta - masz pojęcie, dlaczego host docelowy jest usuwany?

Dzięki jeszcze raz


Jakie masz konkretne problemy? Jest to możliwe, ponieważ ufasz certyfikatom, które generuje dynamicznie - może to być MITM i przechwytywać zwykły tekst komunikacji, a klient nadal ma zaufanie do połączenia.
Shane Madden

Zredagowałem swój post - uważam, że gospodarz docelowy został rozebrany
badunk

Odpowiedzi:


10

Problemy, które widzisz, są takie same, które uniemożliwiają użycie wielu certyfikatów na jednym adresie IP / porcie (bez użycia Wskazania nazwy serwera) .

W zwykłym HTTP przezroczysty serwer proxy może stwierdzić, z którym hostem chce się połączyć klient, zaglądając do Hostnagłówka.

Gdy przezroczysty serwer proxy HTTPS MITM otrzyma żądanie, nie może wiedzieć, o którą nazwę hosta prosił klient. (Nie jestem nawet pewien, czy może uzyskać adres IP z tymi regułami, co mogło przynajmniej pozwolić mu zgadywać przy użyciu wstecznego wyszukiwania DNS, nawet jeśli w ogólnym przypadku jest to mało prawdopodobne).

  • Aby uzyskać oczekiwaną nazwę hosta, serwer proxy MITM musiałby odczytać Hostnagłówek w komunikacie HTTP, co może nastąpić dopiero po pomyślnym uzgadnianiu.
  • Aby pomyślnie zakończyć uzgadnianie, serwer proxy MITM musi wygenerować fałszywy certyfikat zgodny z oczekiwaną nazwą hosta.

W rezultacie proxy MITM nie może wiedzieć, który certyfikat wygenerować przed uzgadnianiem.

Może to działać z nieprzezroczystym serwerem proxy MITM, ponieważ uzyskałbyś przynajmniej zamierzoną nazwę hosta za pomocą CONNECTmetody HTTP .


To wiele mi wyjaśniło, dzięki! Czuję, że mogę zacząć zadawać właściwe pytania. Jak można przejść do konfigurowania przezroczystego serwera proxy SSL? Jaki jest uścisk dłoni?
badunk

1
@badunk, nie sądzę, że możesz, chyba że wyłączysz wszystkie weryfikacje certyfikatów po stronie klienta.
Bruno

Innym sposobem, aby serwer proxy uzyskał prawidłową nazwę hosta, byłoby wysłanie żądania na docelowy adres IP w celu uzyskania certyfikatu przed kontynuowaniem uzgadniania między klientem a serwerem proxy.
Bruno

mitmproxy to serwer proxy HTTPS. Nie musisz wyłączać całej weryfikacji certyfikatu, ale musisz zainstalować certyfikat mitmproxy, ponieważ będzie on używany dla wszystkich połączeń https.
Tyler

3

Kilka podstawowych informacji na ten temat.

Jest tylko kilka urządzeń, które znam, które mogą skutecznie wykonać tę akcję. Jednak tak naprawdę nie są one dostępne dla ogółu społeczeństwa. Sam używam Fortinet Fortigate z odciążeniem SSL.

Zasadniczo to robi; przechwytuje połączenie SSL utworzone z hostem i odszyfrowuje połączenie sprzętowo, a następnie sprawdza, dokąd chcesz się udać, i podejmuje decyzję o zaporze ogniowej na podstawie tych informacji.

Następnie ustanawia własne połączenie z tym hostem w celu pobrania danych i ponownego podpisania oryginalnego żądania do klienta za pomocą urzędu certyfikacji podanego przez użytkownika. Aby to działało sprawnie, konieczne jest posiadanie urzędu certyfikacji w zaufanym głównym urzędzie certyfikacji na kliencie.

Tego rodzaju konfiguracje są używane w organizacjach w celu egzekwowania zasad firmy dotyczących korzystania z Internetu. Ponieważ korzystanie z Active Directory jest łatwe do zainstalowania firmowego urzędu certyfikacji na klientach, nie stanowi to problemu dla dużych organizacji.

Jest to JEDYNY sposób, w jaki można to zrobić bez tworzenia ręcznego serwera proxy, ponieważ ruch SSL jest szyfrowany. Zasadniczo jest to MITM, dlatego ważne jest, aby uwzględnić wszelkie kwestie prawne.


1

Jest jeszcze kilka sugestii na temat tego drugiego pytania, które mogliście zobaczyć: przejrzyste mity i fakty dotyczące proxy SSL . I jest ten link, który wyjaśnia, jak dokładnie skonfigurować Squid, aby stał się przezroczystym serwerem proxy SSL. To nie jest to, czego szukasz, ale może przynajmniej dać wgląd w to, co może pójść nie tak.

Reguły iptables wydają się być w porządku, ale nie mam pojęcia, czy oprogramowanie proxy, którego używasz, jest w stanie zrobić to, co próbujesz. Dokumentacja z pewnością twierdzi, że tak jest.


0

Aby dodać do rozwiązania Bruno, zbadałem trochę i chciałem się podzielić, w jaki sposób uzyskałem kolejną niezbyt idealną szybką poprawkę.

Po ustawieniu tych iptables mogę umieścić zwrotny serwer proxy na porcie 1338 i przekazać go do lokalnego hosta na porcie 1337. Ponieważ port 1337 jest przezroczystym serwerem proxy HTTP, a dane zostały odszyfrowane, pobierze nagłówek hosta i ustawi go jako miejsce docelowe gospodarz.

Główną wadą jest to, że zasadniczo przekonwertowałem połączenie https na http - co nie zawsze działa z każdym serwerem (nie wspominając o luce bezpieczeństwa, którą ujawniam).

Pracowałem w granicach mojego oprogramowania. Uważam, że czystszym rozwiązaniem według Bruno byłoby założenie, że cały ruch z 1338 powinien zostać odszyfrowany. Po odszyfrowaniu sprawdź host docelowy, a następnie proxy żądanie za pomocą protokołu SSL.


Nie jestem pewien, czy rozumiem, z pewnością nie nawiązujesz z tym prawidłowego https://połączenia z punktu widzenia klienta?
Bruno
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.