25-01-2019 / Od 0 do pentestera

Java Sprint Boot Actuator

Spring Boot Actuator to narzędzie które pozwala nam na monitorowanie naszej aplikacji napisanej w springu.

W szybki sposób możemy zmierzyć różne metryki, monitorować trafik na naszym serwerze czy też sprawdzić stan naszej bazy danych.

Wszystko to za sprawą prostych endpointów restowych.

Dzisiaj nieco inne spojrzenie na ten mechanizm - demonstrujący, że nie warto udostępniać takich danych osobą postronnym – nawet jeśli na pierwszy rzut oka dane, zwracane przez system wydają się bezpieczne.

W standardowej konfiguracji z poziomu interfejsu webowego dostępne są endpointy health oraz info1.

Lista endpointów spring boot

Jeżeli chcemy aby i inne były dostępne, musimy odpowiednio zmodyfikować naszą konfigurację.

Oczywiście można definiować pojedynczo, które odnośniki mają być aktywne - rozdzielając je po przecinku.

Wygodny programista może jednak użyć gwiazdki - aby udostępnić na stronie wszystkie funkcjonalności.

Ustawienia endpointów

Samo w sobie takie upraszczanie swojego życia nie jest złe.

Zobaczmy jednak co to oznacza dla bezpieczeństwa.

Czasami nasza aplikacja wykorzystuje jakieś tajne dane - na przykład klucze API.

Ze względów bezpieczeństwa nie chcemy ich zaszywać na sztywno w kodzie źródłowym aplikacji.

Często więc używamy zmiennych środowiskowych i to właśnie do nich odwołujemy się w naszym kodzie.

Wystawiając endpoint env - możemy otrzymać listę zmiennych dostępnych dla naszej aplikacji.

W taki sposób ktoś może poznać nasze sekrety.

Zmienne środowiskowe

Innym niedocenianym endpointem jest heapdump - który zwraca rzut pamięci naszego procesu.

Co można tam znaleźć? Jeżeli przechowujesz jakieś tajne informacje w zmiennych statycznych - można je tutaj łatwo odnaleźć.

Zmodyfikujemy nasz przykład tak, aby klucz do API został zaszyty w kodzie źródłowym jako zmienna statyczna.

Do przeglądania tego pliku warto użyć zewnętrznego narzędzia.

Jednym z takich narzędzi jest Eclipse Memory Analyzer2.

Na liście klas wybieramy tą, która nas interesuje a następnie sprawdzamy zakładkę Statics.

Jak widzisz wartość zdefiniowana w klasie jest tutaj widoczna jak na dłoni.

Zmienna statyczna

Kolejnym endpointem na który warto zwrócić uwagę jest httptrace.

Wyświetla on listę kilkunastu ostatnich żądań do serwera.

Wiemy zatem kiedy ktoś wysłał zapytanie pod dany adres URL.

Co w tym złego? Oprócz adresów widnieje tam również kompletna lista nagłówków wysyłanych przez klienta.

W tych nagłówkach mieszczą się ciasteczka użytkownika.

Atak może wyglądać następująco: atakujący wchodzi na endpoint httprace, odświeżając go co jakiś czas - oczekując aż użytkownik z wysokimi uprawnieniami zaloguje się do aplikacji.

Następnie wykorzystując jego ciasteczko - loguje się na cudze konto i dokonuje złośliwej akcji.

Prawda, że przerażająca perspektywa?

Lista żądań klientów

Wiem już, że niektóre z informacji jakie można tutaj znaleźć mogą być potencjalnie przydatne dla atakującego.

Co zatem zrobić jeżeli nadal chcemy korzystać z tego narzędzia?

Jeżeli nie potrzebujemy go na serwerze produkcyjnym - warto zatroszczyć się o ustawienie odpowiednich excludów.

Zabezpieczenie endpointów

Można również zachować się tak jak definiuje dokumentacja - czyli traktować te endpointy tak jak wszystkie inne adresy, które powinny być dostępne tylko dla administratora albo innego upoważnionego użytkownika.

Jeżeli używasz Spring Security - są one chronione w standardowej konfiguracji.

Icon made by Freepik, prettycons from www.flaticon.com