Transport layer security w aplikacjach (2)
Czasami sposób, w jaki “usunięte” zostają zgłoszone błędy jest, łagodnie mówiąc, kreatywny. Historia z dawnych czasów:
- Gruby klient korzysta z HTTPS, brak jest jakiejkolwiek weryfikacji certyfikatu serwera;
- W nowej wersji błąd zostaje usunięty, certyfikat jest weryfikowany, ale, uwaga, tylko przy pierwszym połączeniu.
Po dokładniejszym sprawdzeniu okazało się, że w tym połączeniu nie są wymieniane żadne dane(!) Klient łączył się z serwerem tylko po to, by sprawdzić, czy certyfikat jest prawidłowy (włącznie z pewną formą certificate pinning). Jeśli nie – dalsze połączenia nie były nawiązywane.
Obejście takiego “zabezpieczenia” jest trywialne – puścić bez modyfikacji pierwsze połączenie, normalnie robić mitm na kolejnych. W Fiddlerze można to zrobić bez większych problemów tworząc prosty skrypt, który na pierwszym połączeniu (tunel CONNECT) ustawi flagę:
oSession[“x-no-decrypt”] = “yes”;
Tak przy okazji – można też zrobić taką konfigurację:
Przeglądarka –> Fiddler –> Burp –> Serwer
Następnie można korzystać z flagi x-overrideGateway do tego, by konkretne requesty były wysyłane bezpośrednio do serwera z pominięciem Burp:
oSession[“x-overrideGateway”] = “DIRECT”;
Dlaczego? Burp również ma opcję SSL pass through, ale np. automatyczne przepuszczanie tylko pierwszego połączenia do określonego serwera zdecydowanie łatwiej jest zrobić w Fiddlerze (i kilka innych rzeczy w oparciu o skrypty – również).
P.S: Tak, wiem – Burp też ma skrypty. Nie zmienia to faktu, że w Fiddlerze pewne rzeczy jest po prostu łatwiej / szybciej zrobić. To z kolei nie zmienia faktu, że inne rzeczy zdecydowanie łatwiej jest zrobić w Burpie :P
Oryginał tego wpisu dostępny jest pod adresem Transport layer security w aplikacjach (2)
Autor: Paweł Goleń