Żądny wiedzy? Wbijaj na Mega Sekurak Hacking Party w maju! -30% z kodem: majearly

Zobacz realne znalezisko z naszego pentestu – w prosty sposób można było ominąć 2FA.

29 grudnia 2023, 13:47 | Teksty | komentarzy 5
Tagi: , , ,

Przeprowadzanie testów penetracyjnych wymaga użycia istniejących rozwiązań, które w sposób znaczący mogą ułatwić pracę audytora. W przypadku aplikacji internetowej cenne jest rozpoznanie struktury katalogów lub odnalezienie plików, które mogą wzbudzić zainteresowanie testera. W tym celu stosuje się takie narzędzia jak:

• ffuf,
• dirbuster,
• gobuster.

Podczas omawianego pentestu, użyłem narzędzia ffuf z podstawowym słownikiem dostępnym publicznie pod adresem:

https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/common.txt

Zastosowana komenda do odkrycia interesujących plików była następująca:

ffuf -w ./common.txt -u https://tested_site.top/FUZZ | tee logs.txt

Rozpisując szczegółowo parametry:
ffuf <- uruchomienie programu
-w ./common.txt <- wskazanie słownika
-u https://tested_site.top/FUZZ <- wskazanie adresu testowanej strony, gdzie parametr FUZZ jest symbolem zastępczym dla elementów ze słownika

| tee logs.txt <- wyświetlanie wyników na ekranie i zapisanie do pliku logs.txt

Podczas gdy program fuzzujący (ffuf) próbuje zlokalizować interesujące pliki, opiszę ogólny zarys badanej aplikacji. Jest to aplikacja do której można zalogować się za pomocą uwierzytelniania dwuskładnikowego (2FA) w postaci SMS. Pozostała funkcjonalność aplikacji nie jest istotna dla opisu wyników testu.

Zobaczmy co interesującego odnalazło narzędzie ffuf za pośrednictwem komendy: 

cat logs.txt | grep 200

W wyniku komendy otrzymamy informację o plikach zlokalizowanych i dostępie z poziomu przeglądarki (kod 200 oznacza sukces, strona istnieje).

W wyniku komendy zobaczymy kilka linii, a wśród nich:

.gitignore         [Status: 200, Size: XX, Words: XX, Lines: XX]

Teraz, gdy wiemy który plik znajduje się na serwerze, możemy sprawdzić co ten plik zawiera za pośrednictwem komendy:

wget -qO- https://tested_site.top/.gitignore

Wynik wykonania powyższego polecenia:

/config.php
/lib/editor/tinymce/extra/tools/temp
/tags/
/TAGS
/cscope.*
(...)
/local/scrt_library/classes/token/log.txt
/local/scrt_library/classes/token/SessionToken.php
(...)

Wśród informacji zlokalizowanych w pliku .gitignore możemy zidentyfikować newralgiczne ścieżki. Dla audytora naturalnym jest by je zweryfikować. Jedna konkretna ścieżka przyciągnęła moją uwagę – to ta wyróżniona boldem w powyższym kodzie. 

Wywołując komendę wget, uzyskano zawartość wspomnianego pliku:

wget -qO- https://tested_site.top/local/scrt_library/classes/token/log.txt

Widać plik dziennika wysyłki SMS (ocenzurowano):

(...)
data: 2023-04-03 14:08:57
url:http://[tested.site].local/[skrypt].php?mobile?661234586&message=[application_name]+-+Twoj+token+SV6YHLS2
response: 3923561393
data: 2023-04-03 14:08:57
url:http://[tested.site].local/[skrypt].php?mobile?661234586&message=[application_name]+-+Twoj+token+DVO4EIRU
response: 3923561827
data: 2023-04-03 14:08:57
url:http://[tested.site].local/[skrypt].php?mobile?691234582&message=[application_name]+-+Twoj+token+9JO1GIEC

Potencjalny atakujący uzyskał więc numery telefonów osób posiadających konto w aplikacji i mógł całkowicie ominąć 2FA, przepisując kod z pliku.

Rekomendacje dla takich sytuacji:

Zaleca się przechowywanie logów w formie zanonimizowanej, w katalogu poza głównym katalogiem aplikacji z ograniczonymi uprawnieniami. Anonimizacja pliku logów zapewnia, że nieuprawnione osoby, uzyskując dostęp, nie będą miały wglądu w wrażliwe dane. Ponadto przeniesienie pliku do katalogu niedostępnego z sieci wraz z odpowiednimi uprawnieniami znacząco zwiększy bezpieczeństwo.

~Robert „ProXy” Kruczek, audytor w Securitum.

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. Andrzej

    Serio :-) Martwe koty na sekuraku

    cat logs.txt | grep 200

    Odpowiedz
    • SeeM

      Jak się kotuje cały plik, to pomysł na grepa przychodzi dwa razy szybciej.

      Odpowiedz
  2. stryj

    A tych telefonów, o nie ocenzurowaliście?

    A sukcesu, jak zawsze, gratuluję!

    Odpowiedz
  3. Theło

    Co to za U2F? Token powinien być czasowy, a najlepiej czasowy i jednorazowy. Wszystko z .(kropką) na początku powinno zwracać kod odpowiedzi 404 (lub ewentualnie 503).

    Odpowiedz
    • Tomasz

      Ale on może być czasowy, mając dostęp do logów w czasie rzeczywistym potencjalnie jesteś w stanie odczytać token jeszcze zanim ofiara weźmie telefon do ręki i odczyta SMSa.

      Odpowiedz

Odpowiedz