<summary><strong>Zacznij od zera i zostań ekspertem AWS Red Team z</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
Jeśli interesuje Cię **kariera hakerska** i hakowanie niemożliwych do zhakowania - **rekrutujemy!** (_wymagana biegła znajomość języka polskiego w mowie i piśmie_).
**Część tego posta opiera się na świetnym poście:** [**https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology)\
**Autor doskonałego narzędzia do testowania penetracyjnego JWT** [**https://github.com/ticarpi/jwt\_tool**](https://github.com/ticarpi/jwt\_tool)
Możesz po prostu zmieniać dane, pozostawiając sygnaturę bez zmian i sprawdzić, czy serwer sprawdza sygnaturę. Spróbuj zmienić swoją nazwę użytkownika na "admin" na przykład.
Użyj rozszerzenia Burp o nazwie "JSON Web Token", aby wypróbować tę podatność i zmienić różne wartości wewnątrz JWT (wyślij żądanie do Repeater, a w zakładce "JSON Web Token" możesz modyfikować wartości tokena. Możesz również wybrać wartość pola "Alg" jako "None").
Jeśli zmienisz algorytm z RS256 na HS256, kod backendu użyje klucza publicznego jako klucza tajnego, a następnie użyje algorytmu HS256 do weryfikacji sygnatury.
Następnie, korzystając z klucza publicznego i zmieniając RS256 na HS256, możemy utworzyć poprawną sygnaturę. Możesz pobrać certyfikat serwera internetowego wykonując to:
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well.
Instrukcje opisują metodę oceny bezpieczeństwa tokenów JWT, zwłaszcza tych korzystających z nagłówka "jku". Ten nagłówek powinien odnosić się do pliku JWKS (JSON Web Key Set), który zawiera klucz publiczny niezbędny do weryfikacji tokenu.
* Obserwacja żądań HTTP do określonego adresu URL wskazuje na próby serwera pobrania kluczy z podanego linku.
* Podczas korzystania z `jwt_tool` w tym procesie, ważne jest zaktualizowanie pliku `jwtconf.ini` z lokalizacją Twojego osobistego pliku JWKS, aby ułatwić testowanie.
Opcjonalna deklaracja nagłówka znana jako `kid` jest wykorzystywana do identyfikacji konkretnego klucza, co staje się szczególnie istotne w środowiskach, gdzie istnieje wiele kluczy do weryfikacji podpisu tokenu. Ta deklaracja pomaga w wyborze odpowiedniego klucza do weryfikacji podpisu tokenu.
Gdy deklaracja `kid` jest obecna w nagłówku, zaleca się przeszukanie katalogu sieciowego w poszukiwaniu odpowiadającego pliku lub jego wariantów. Na przykład, jeśli `"kid":"klucz/12345"` jest określony, pliki _/klucz/12345_ i _/klucz/12345.pem_ powinny być wyszukiwane w głównym katalogu sieciowym.
Deklaracja `kid` może również być wykorzystana do nawigacji po systemie plików, potencjalnie umożliwiając wybór dowolnego pliku. Możliwe jest testowanie łączności lub wykonywanie ataków Server-Side Request Forgery (SSRF), zmieniając wartość `kid` w celu docelowego pliku lub usługi. Zmiana tokenu JWT w celu zmiany wartości `kid` zachowując oryginalny podpis może być osiągnięta za pomocą flagi `-T` w jwt\_tool, jak pokazano poniżej:
Poprzez celowanie w pliki z przewidywalną zawartością, możliwe jest sfałszowanie ważnego JWT. Na przykład plik `/proc/sys/kernel/randomize_va_space` w systemach Linux, zawierający wartość **2**, może być użyty w parametrze `kid` z **2** jako symetrycznym hasłem do generowania JWT.
Jeśli zawartość claimu `kid` jest wykorzystywana do pobrania hasła z bazy danych, wstrzyknięcie SQL może ułatwić modyfikację ładunku `kid`. Przykładowy ładunek wykorzystujący wstrzyknięcie SQL do zmiany procesu podpisywania JWT to:
Scenariusz, w którym parametr `kid` określa ścieżkę pliku używaną w kontekście wykonania polecenia, może prowadzić do podatności na zdalne wykonanie kodu (RCE). Poprzez wstrzykiwanie poleceń do parametru `kid`, możliwe jest ujawnienie prywatnych kluczy. Przykładowy ładunek do osiągnięcia RCE i ujawnienia kluczy to:
Jeśli token używa claimu nagłówkowego "**jku**", **sprawdź podany adres URL**. Powinien on wskazywać na adres URL zawierający plik JWKS, który przechowuje klucz publiczny do weryfikacji tokenu. Zmodyfikuj token, aby wskazywał wartość jku na usługę sieciową, którą możesz monitorować pod kątem ruchu.
Następnie możesz użyć na przykład [**jwt.io**](https://jwt.io), aby utworzyć nowy JWT z **utworzonymi kluczami publicznymi i prywatnymi oraz wskazując parametr jku na utworzony certyfikat.** Aby utworzyć poprawny certyfikat jku, możesz pobrać oryginalny i zmienić wymagane parametry.
X.509 URL. URI wskazujący na zestaw publicznych certyfikatów X.509 (standard formatu certyfikatu) zakodowanych w formie PEM. Pierwszy certyfikat w zestawie musi być tym, który został użyty do podpisania tego JWT. Kolejne certyfikaty podpisują poprzedni, co kończy łańcuch certyfikatów. X.509 jest zdefiniowany w RFC 5280. Wymagane jest zabezpieczenie transportu do przesyłania certyfikatów.
Następnie możesz użyć na przykład [**jwt.io**](https://jwt.io), aby utworzyć nowy JWT z **utworzonymi kluczami publicznymi i prywatnymi oraz wskazując parametr x5u na certyfikat .crt utworzony.**
Jeśli atakujący **wygeneruje certyfikat podpisany własnoręcznie** i utworzy sfałszowany token, używając odpowiadającego klucza prywatnego i zastąpi wartość parametru "x5c" nowo wygenerowanym certyfikatem oraz zmodyfikuje inne parametry, mianowicie n, e i x5t, to w rezultacie sfałszowany token zostanie zaakceptowany przez serwer.
n ="ANQ3hoFoDxGQMhYOAc6CHmzz6_Z20hiP1Nvl1IN6phLwBj5gLei3e4e-DDmdwQ1zOueacCun0DkX1gMtTTX36jR8CnoBRBUTmNsQ7zaL3jIU4iXeYGuy7WPZ_TQEuAO1ogVQudn2zTXEiQeh-58tuPeTVpKmqZdS3Mpum3l72GHBbqggo_1h3cyvW4j3QM49YbV35aHV3WbwZJXPzWcDoEnCM4EwnqJiKeSpxvaClxQ5nQo3h2WdnV03C5WuLWaBNhDfC_HItdcaZ3pjImAjo4jkkej6mW3eXqtmDX39uZUyvwBzreMWh6uOu9W0DMdGBbfNNWcaR5tSZEGGj2divE8";
e = "AQAB";
const key = new NodeRSA();
var importedKey = key.importKey({n: Buffer.from(n, 'base64'),e: Buffer.from(e, 'base64'),}, 'components-public');
Możliwe jest wygenerowanie nowego klucza prywatnego/publicznego, osadzenie nowego klucza publicznego wewnątrz tokena i użycie go do wygenerowania nowego podpisu:
Jednak wyobraź sobie sytuację, w której maksymalna długość ID wynosi 4 (0001-9999). Żądanie 0001 i 10001 będą używać tego samego ID. Dlatego jeśli serwer zwiększa ID przy każdym żądaniu, można to wykorzystać do **odtwarzania żądania** (konieczne jest wysłanie 10000 żądań między każdym udanym odtworzeniem).
Zauważono, że niektóre aplikacje internetowe polegają na zaufanej usłudze JWT do generowania i zarządzania swoimi tokenami. Zdarzały się sytuacje, w których token wygenerowany dla jednego klienta przez usługę JWT został zaakceptowany przez innego klienta tej samej usługi JWT. Jeśli obserwuje się wydanie lub odnowienie JWT za pośrednictwem usługi innej firmy, należy zbadać możliwość zarejestrowania się na koncie innego klienta tej usługi za pomocą tego samego nazwy użytkownika/adresu e-mail. Następnie można spróbować odtworzyć uzyskany token w żądaniu do celu, aby sprawdzić, czy zostanie zaakceptowany.
* Akceptacja twojego tokenu może wskazywać na poważny problem, potencjalnie umożliwiający podszywanie się pod dowolne konto użytkownika. Należy jednak zauważyć, że może być konieczna zgoda na szersze testowanie, jeśli rejestracja w aplikacji innej firmy może wprowadzić w obszar szarej strefy prawniczej.
Ważność tokenu jest sprawdzana za pomocą twierdzenia ładunku "exp". Ponieważ JWT często są używane bez informacji sesyjnych, wymagane jest ostrożne postępowanie. W wielu przypadkach przechwycenie i odtworzenie tokenu innego użytkownika może umożliwić podszywanie się pod tego użytkownika. RFC dotyczący JWT zaleca łagodzenie ataków powtórnego odtwarzania JWT poprzez wykorzystanie twierdzenia "exp" do ustawienia czasu ważności tokenu. Ponadto istotne jest, aby aplikacja wdrożyła odpowiednie sprawdzenia, aby zapewnić przetwarzanie tej wartości i odrzucanie wygasłych tokenów. Jeśli token zawiera twierdzenie "exp" i limity czasu testowania na to pozwalają, zaleca się przechowywanie tokenu i jego odtwarzanie po upływie czasu ważności. Zawartość tokenu, w tym analiza znaczników czasu i sprawdzanie ważności (znacznik czasu w formacie UTC), można odczytać za pomocą flagi -R narzędzia jwt\_tool.
<summary><strong>Dowiedz się, jak hakować AWS od zera do bohatera z</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.