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:

  1. Gruby klient korzysta z HTTPS, brak jest jakiejkolwiek weryfikacji certyfikatu serwera;
  2. 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ń