Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Zobacz realne znalezisko z naszego pentestu – w prosty sposób można było ominąć 2FA.
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.
Serio :-) Martwe koty na sekuraku
cat logs.txt | grep 200
Jak się kotuje cały plik, to pomysł na grepa przychodzi dwa razy szybciej.
A tych telefonów, o nie ocenzurowaliście?
A sukcesu, jak zawsze, gratuluję!
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).
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.