8 lat historii i kilkanaście milionów użytkowników mogą sugerować, że aplikacja jest już dojrzała i solidnie przetestowana. Nie zawsze jest to jednak prawdą, a śmiesznie trywialne i niebezpieczne błędy mogą ciągle czekać na odkrycie.
Powstała w roku 2007 pod nazwą Read it Later aplikacja Pocket rządzi dzisiaj na rynku narzędzi umożliwiających pobranie wybranych artykułów i zapisanie ich w celu późniejszej lektury. Mimo iż jej działaniu na pewno przyglądał się niejeden badacz, to Clint Ruoho odkrył metodę przejęcia serwerów firmy przez zestaw naprawdę prostych błędów.
Pobierz linka
Jednym z pierwszych etapów rozpoznania potencjalnych podatności serwera jest weryfikacja znanych adresów, mogących dostarczyć dodatkowych informacji o jego działaniu. Jednym z nich jest usługa statystyk Apache kryjących się z reguły pod linkiem /server-status. Często można w niej wyczytać ciekawe informacje (np. na serwerach Empiku pozwalała na poznanie danych klientów), jednak serwery Pocketa informowały, że choć usługa jest włączona, to jest niedostępna dla internautów. Kiedy jednak pomyślimy, że testujemy usługę pobierania linków z internetu, może warto sprawdzić, co stanie się, gdy do kolejki dodamy
http://127.0.0.1/server-status
Jak się zapewne już domyślacie, serwer Pocketa grzecznie pobrał żądany plik i zaserwował go badaczowi. Dzięki temu można było poznać wewnętrzną adresację infrastruktury używanej przez Pocketa (a także np. podglądać aktywność jego użytkowników). Z kolei próby wczytania takich linków jak
file:///etc/passwd ssh://localhost telnet://localhost:25
nie dały żadnego rezultatu. Kiedy jednak badacz zorientował się, że Pocket korzysta z infrastruktury chmury Amazona, dodał do kolejki pobierania linki specyficzne dla tej usługi, czyli:
http://169.254.169.254/latest/meta-data/ http://169.254.169.254/latest/meta-data/hostname http://169.254.169.254/latest/meta-data/ami-id
Linki zadziały i można w nich było znaleźć sporo technicznych szczegółów konfiguracyjnych (strefa, rodzaj instancji, rodzaj połączeń sieciowych i podłączonych usług przechowywania danych, adresy MAC itp.). Ciągle jednak brak było możliwości uzyskania zdalnego dostępu do serwerów.
Skoro link nie działa…
Korzystając z odkrytych już problemów atakujący mógł np. przeskanować usługi HTTP na serwerze lokalnym omijając reguły firewalla, zidentyfikować dostępne aplikacje i atakować je udając lokalnego użytkownika. Czemu jednak nie spróbować czegoś bardziej zuchwałego? Skoro zakolejkowanie file:///etc/passwd nie działało, to ciekawe jak serwer zachowa się gdy link dodany do kolejki wskaże na serwer, który odpowie odpowiednim błędem 301.
HTTP/1.1 301 Moved Permanently Location: file:///etc/passwd Content-Length: 52 Date: Tue, 28 Jul 2015 18:42:58 GMT Connection: keep-alive Moved Permanently. Redirecting to file:///etc/passwd
Wyobrażamy sobie zdziwienie na twarzy badacza, gdy w swojej aplikacji znalazł zawartość pliku /etc/passwd pobranego z serwera Pocketa. A pomyślcie, jaka była jego reakcja, gdy sprawdził, że może pobrać dowolny plik z serwera, ponieważ proces działa na uprawnieniach roota.
Scenariusz całego ataku mógł zatem wyglądać następująco:
- przez /server-status poznajemy prywatną adresację serwerów
- przez 301 pobieramy /etc/passwd i poznajemy listę użytkowników
- przez 301 pobieramy klucz prywatny SSH wybranego użytkownika
- uruchamiamy instancję serwera w tej samej strefie, dostając dostęp do tej samej prywatnej adresacji
- logujemy się na serwer
To oczywiście tylko przykład – prawdopodobnych możliwości ataku było znacznie więcej. Pocket szybko błędy załatał, pytanie jednak, jakie jeszcze czekają na odkrycie. Co ciekawe, bardzo podobne błędy odnaleziono już rok temu w Prezi.
Komentarze
Zawsze mnie dziwi lektura o tych wszystkich złotych receptarch typu docker, puppet itp. Postawienie serwera w 1 minutę! A obraz dockera ściągasz z chmury, ktoś już to przecież zrobił… Niestety, jak chce się coś zrobić dobrze, to trzeba cały stack od dołu łatać i bazować na wiedzy i doświadczeniu.
Trochę mi tutaj pasuje analogia do ruchu drogowego. Jak jedna osoba złamie przepisy to jeszcze nie powinno się nic stać (może kolizja). Druga osoba powinna zachować szczególną ostrożność a prędkości powinny być dostosowane do sytuacji. Tak IMO jest zaprojektowany kodeks i wielu ludzi myśli „pojadę szybciej i tak zjadą, wymuszę, ustąpią”. Ale jak nawali kilka rzeczy to draka gotowa. Tak też jest tutaj, program nie filtrował danych wejściowych, ale to jeszcze nic.. działanie na prawach roota? draka gotowa.
Punkt 4 nie uda się. Jak niby chcielibyście uzyskać adresację oraz vlan aktualnie przydzielony do jakiegoś klienta? Cloud tak nie działa.
Macie też problem z instalacją Pocket w Firefox?
Dla Polski chyba nie jest instalowany w „standardzie”.
Żadnych problemów – Firefox 40.0.2, Pocket 1.2.
W standardzie nie jest instalowany nigdzie. Po co miałby być skoro wymaga założenia konta ?
nie miałem problemow, ale wróciłem do rozszerzenia
na co mi jakiś durny guziczek jak rozszerzenie ma piękny popup, do tego znacznie sprawniej działający od webapki?
tylko ff to ma, pozostałe oficjalne dodatki pocketa to tylko add to pocket button niestety (chociaż na chroma jest coś do wyświetlania listy, ale bez możliwości dodania znowu…)
@Robik, ależ oczywiście, że ma w standardzie…
Nie pisz, jak się Tobie wydaje, tylko na podstawie faktów ;)
https://getpocket.com/blog/2015/06/pocket-is-now-built-into-firefox/
Faktycznie. Nie widziałem zmiany bo używam Pocket dość długo, od czasu zakupu czytnika. Z tego co widzę to jak masz dodatek to po aktualizacji nic mi się nie zmieniło. Nie wiem czy nie zaryzykować przeinstalowania Firefoxa, na drugim screenie widać dodaną opcję „View pocket list”. Wygląda ciekawie, zwłaszcza dla mnie bo używam Pocket do wielu rzeczy (np. załatwia mi poranną lekturę rss w drodze do pracy ;-).