Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Quick tip – Cisco VPN – i zmiana tablicy routingu
Ostatnio natrafiliśmy na ciekawy problem podczas używania klienta VPN Cisco AnyConnect. Mianowicie: po utworzeniu tunelu VPN-owego, klient ustawia swoje własne tablice routingu, w czym oczywiście nie ma nic dziwnego, jednak później stale je monitoruje, nie pozwalając na żadną zmianę. Wyobraźmy sobie więc następującą sytuację:
- Tworzymy tunel VPN za pomocą klienta Cisco,
- Okazuje się, że VPN jest skonfigurowany w taki sposób, że cały ruch internetowy jest przepuszczany przez niego. My jednak chcemy, żeby przez VPN-a odbywał się ruch tylko do jednego konkretnego adresu IP,
- Próbujemy więc dostosować tablice routingu w systemie do swoich potrzeb…
- … nie możemy jednak tego zrobić, gdyż VPN automatycznie cofa każdą naszą zmianę!
Powyższy problem można łatwo potwierdzić, jeśli odpalimy w jednym terminalu polecenie route add -net 192.168.56.0/24 p7p1 a w drugim ip monitor route (polecenie do śledzenia zmian w tablicy routingu). (Rys. 1).
Zaczęliśmy się zastanawiać, w jaki sposób możemy rozwiązać ten problem. Jedną z pierwszych, choć niezbyt rozsądnych, propozycji były próby nieustannego ustawiania nowej reguły w pętli, licząc na to, że vpn nie będzie nadążał z usuwaniem. Rozwiązanie w pewnym stopniu działało, ale było niestabilne i powodowało duże zużycie procesora.
Okazało się, że problem jest znany i w internecie istnieją jego rozwiązania, np. polegające na nadpisaniu jednej z funkcji agenta VPN, tym samym sprawiając, że monitorowanie tablic routingu nie jest wykonywane. Okazuje się jednak, że i ten sposób prowadzi do 100% zużycia CPU.
W końcu wpadliśmy na inne rozwiązanie: skoro tunel VPN-owy jest już zestawiony i działa (utworzone są interfejsy itp.), to de facto daemon odpowiedzialny za utrzymywanie VPN-a nie potrzebuje już praw roota do działania, natomiast prawa roota są niezbędne by usunąć cokolwiek z tablicy routingu. Jeśli więc zmienimy uprawnienia działającego procesu VPN z roota na dowolnego innego użytkownika, podstawowa funkcjonalność powinna zostać zachowana, zaś pozbędziemy się niepożądanego zachowania. Sprawdźmy to!
Zaczynamy od ustalenia ID procesu vpnagentd i podpinamy pod niego gdb (Rys 2.).
W gdb wystarczy skorzystać z wywołania funkcji seteuid() , podając w argumencie dowolny uid innego użytkownika (Rys 3.)
Po wszystkim wychodzimy z gdb i potwierdzamy, że właściciel procesu rzeczywiście został zmieniony (Rys 4.).
Teraz wystarczy już tylko dodać nowy wpis do tablicy routingu i cieszyć się, że Cisco VPN go nie usunie ;) (Rys 5.).
–Michał Bentkowski, realizuje testy penetracyjne w Securitum.
Można też po prostu zamienić oryginalnego klienta Cisco na darmowy vpnc, który wszystkie operacje związane z tablicą routingu przekierowuje z głównej binarki do osobnego skryptu shell (dzięki temu binarka ma mniej zależności od konkretnych bibliotek, a w shellu łatwiej ogarnąć rozbieżności pomiędzy systemami operacyjnymi).
Tak więc w vpnc możemy swobodnie grzebać w skrypcie shellowym i nie tylko zabronić klientowi usuwania wpisów z tablicy routingu, ale wręcz je automatycznie tworzyć po nawiązaniu połączenia w taki sposób, jak jest wygodnie nam, a nie adminowi tego VPN-a.
Albo ShrewVPN, też pozwala manipulować tablicami.
Swoją drogą ciekawe, czy takich manipulacji, jak opisana w artykule, nie zabrania umowa licencyjna tego klienta… nie zdziwiłbym się.
Żeby tylko się nie okazało ze użycie ShrewVPN też jest niezgodne z licencją ;)
przydatny trick. dzieki.
swietne… +1
Juz wiem, czemu jeden z serwerow anyConnecta z ktorego korzystam, nie wpuszcza klientow linuksowych (ani vpnc ani oryginalnego ciscowego) :-). Choc slyszalem tez, ze trzeba wykupic oddzielna licencje na obsluge klientow linuksowych – ale nie chce mi sie w to wierzyc.
A udalo sie komus oszukac taka konfiguracje – tzn. blokujaca dostep linuksowego klienta? Nie musialbym sie meczyc z winda.
Postaw sobie router VPN na jakiejś wirtualce – po prostu niech sobie działa Windows z klientem VPN, a na innych komputerach dodaj wpis do tablicy routingu, kierujący ruch do wnętrza VPN na tą wirtualkę.
Niestety konfiguracja VPNa odcina LAN. I poki nie ma podobnego tricka jak powyzszy na widnows, to takie rozwiazanie nie zadziala.
Z tymi klientami alternatywnymi nie jest tak prosto jak mogłoby się wydawać. Firewall ASA sprawdza wersję klienta AnyConnect który się połączył i jeżeli wersja się nie zgadza, następuje jego aktualizacja do wersji podawanej z firewalla.
Mówisz o tej samej wersji, którą w vpnc można ustawić poleceniem –application-version? :)
Zapominacie o jednej bardzo ważnej rzeczy, wszystkie alternatywne klienty podane wyżej nie wspierają SSLa więc jak wymusi się że VPN ma być po SSL to teraz tylko AnyConnect.
ale przekombinowane ;]
vpnc przyjmuje dodatkowa opcje w configu ustawiajace tylko te routy ktore chcesz ( przydatne, gdy na jednym serwerze odpalonych jest kilka vpnc tuneli). to samo z anyconnectem.
w sumie jest to obrzezany kawalek vpnc-script:
Script ifconfig $TUNDEV inet $INTERNAL_IP4_ADDRESS pointopoint $INTERNAL_IP4_ADDRESS netmask 255.255.255.255 mtu 1412 up 2> /dev/null ; ip ro add X.X.X.X./X dev $TUNDEV
No tak, tylko rzecz w tym, że administrator VPN może wyłączyć split-horizon, czyli wymusić, że cały ruch (również do Internetu) ma iść przez VPN.
Cały artykuł i komentarze dotyczą właśnie *omijania* tego wymysłu.
Sztuczki z ldpreload nie działają?
Poproszę jakiś tip dla klienta cisco anyconnect na windowsa… :)
vpnc jest calkiem calkiem, ale niestety:
a) wywala sie,
b) nie wspiera wszystkich opcji (man […] Note: cisco-tcp encapsulation is not yet supported)
c) ale jak sie da uzyc, to tez polecam!!!
Witam,
na macbooka poproszę, niestety po polaczeniu się z moim vpn (dostarczanym od pracodawcy) wycina mi caly ruch i dochodzi do crash wszystkich apek (notatki, adobe, teams!!)
zainstalowalem gdb, ale nie zmienia to uid usera..