htrace.sh

09 Jan 2019

debugging  http  https  profiling  projects 

Share on:

Podczas codziennej pracy zawsze brakowało mi narzędzia, dzięki któremu mógłbym w prosty i szybki sposób przetestować konfigurację wystawianych publicznie serwisów. Umiejętność użycia takich narzędzi jak curl czy openssl jest według mnie bardzo ważna, jednak jak to zwykle z konsolowymi narzędziami bywa, dostarczają one mnóstwo opcji, które ciężko zapamiętać.

Wprowadzenie #

htrace.sh jest narzędziem powłoki wspomagającym profilowanie i debug’owanie aplikacji działających na protokołach HTTP/HTTPS. Jest to także prosty wrapper obsługujący zewnętrzne narzędzia takie jak: testssl.sh, ssllabs, mozilla-observatory czy skrypty skanera nmap. Repozytorium projektu znajduje się tutaj.

Jego głównym założeniem projektowym była możliwość wykrycia wszystkich błędów związanych z przekierowaniami. Niby nic szczególnego jednak przy jakichkolwiek wdrożeniach czy choćby zmianach takich jak ustawienie list kontroli dostępu (IP ACL) weryfikacja była niekiedy kłopotliwa.

Potrzebowałem także przejrzysty obraz tego, co się dzieje z danym request’em oraz to, w jaki sposób jest on interpretowany przez serwery HTTP.

Funkcje #

Po pewnym czasie stwierdziłem, że warto byłoby dodać kilka innych ciekawych oraz ważnych funkcji dotyczących:

Przykłady #

Więcej przykładów znajduje się na Wiki projektu w rozdziale One liners.

Weryfikowanie przekierowań #

Jeżeli chcemy sprawdzić przekierowania, np. czy domena www.badssl.com kieruje na badssl.com:

❯ htrace.sh -u https://www.badssl.com --hide-src-ip

     htrace.sh v1.1.7  (openssl 1.1.1d : ok)


    URI: https://www.badssl.com

         » request-method: GET
         » user-agent:     Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36

    req  time_total   time_connect    local_socket           via              remote_socket         geo   proto   ver   code     next_hop
    ---  ----------   ------------    ------------           ---              -------------         ---   -----   ---   ----     --------
 •   1   0.605406     0.605406        xxx.xxx.xxx.xxx:65158  xxx.xxx.xxx.xxx  104.154.89.105:443    US    https   1.1   301      https://badssl.com/
 •   2   1.211578     0.606172        xxx.xxx.xxx.xxx:65164  xxx.xxx.xxx.xxx  104.154.89.105:443    US    https   1.1   200

Podobnie, jeśli zależy nam na sprawdzeniu przekierowań między protokołami tj. z HTTP na HTTPS.

Podgląd nagłówków odpowiedzi #

Kolejną z opcji jest podgląd nagłówków serwowanych w odpowiedzi:

❯ htrace.sh -u http://badssl.com --headers --hide-src-ip

     htrace.sh v1.1.7  (openssl 1.1.1d : ok)


    URI: http://badssl.com

         » request-method: GET
         » user-agent:     Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134

    req  time_total   time_connect    local_socket           via              remote_socket         geo   proto   ver   code     next_hop
    ---  ----------   ------------    ------------           ---              -------------         ---   -----   ---   ----     --------
 •   1   0.282043     0.282043        xxx.xxx.xxx.xxx:21592  xxx.xxx.xxx.xxx  104.154.89.105:80     US    http    1.1   301      https://badssl.com/

         › HTTP/1.1 301 Moved Permanently
         › Server: nginx/1.10.3 (Ubuntu)
         › Date: Mon, 30 Dec 2019 12:13:37 GMT
         › Content-Type: text/html
         › Content-Length: 194
         › Connection: keep-alive
         › Location: https://badssl.com/

    req  time_total   time_connect    local_socket           via              remote_socket         geo   proto   ver   code     next_hop
    ---  ----------   ------------    ------------           ---              -------------         ---   -----   ---   ----     --------
 •   2   0.851682     0.569639        xxx.xxx.xxx.xxx:65174  xxx.xxx.xxx.xxx  104.154.89.105:443    US    https   1.1   200

         › HTTP/1.1 200 OK
         › Server: nginx/1.10.3 (Ubuntu)
         › Date: Mon, 30 Dec 2019 12:13:38 GMT
         › Content-Type: text/html
         › Last-Modified: Mon, 16 Dec 2019 19:42:34 GMT
         › Transfer-Encoding: chunked
         › Connection: keep-alive
         › ETag: W/"5df7de2a-2e05"
         › Cache-Control: no-store
         › Content-Encoding: gzip

Podgląd konfiguracji SSL/TLS #

Następnie możemy podejrzeć konfigurację SSL/TLS oraz wyświetlić podstawowe informacje na temat certyfikatów chroniących domenę:

❯ htrace.sh -u http://badssl.com --ssl --hide-src-ip

     htrace.sh v1.1.7  (openssl 1.1.1d : ok)


    URI: http://badssl.com

         » request-method: GET
         » user-agent:     Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36

    req  time_total   time_connect    local_socket           via              remote_socket         geo   proto   ver   code     next_hop
    ---  ----------   ------------    ------------           ---              -------------         ---   -----   ---   ----     --------
 •   1   0.285111     0.285111        xxx.xxx.xxx.xxx:21608  xxx.xxx.xxx.xxx  104.154.89.105:80     US    http    1.1   301      https://badssl.com/
         ssl: off
 •   2   0.847384     0.562273        xxx.xxx.xxx.xxx:65190  xxx.xxx.xxx.xxx  104.154.89.105:443    US    https   1.1   200
         ssl: on, version(TLSv1.2), cipher(ECDHE-RSA-AES128-GCM-SHA256), temp_key(ECDH,P-256,256bits)
         public-key(2048 bit), signature(sha256WithRSAEncryption)
         date: Mar 18 00:00:00 2017 GMT / Mar 25 12:00:00 2020 GMT (85 days to expired)
         issuer: DigiCert SHA2 Secure Server CA (DigiCert Inc)
         owner: Lucas Garron
         cn: *.badssl.com
         san: *.badssl.com badssl.com
         sni: not match
         validity: match
         chain of trust:
          └─0:*.badssl.com ★ ✓
            ├   DigiCert SHA2 Secure Server CA
            └─1:DigiCert SHA2 Secure Server CA ✓
              ├   DigiCert Global Root CA
              └─2:DigiCert Global Root CA ✓ ⊙
                └ DigiCert Global Root CA
         verification: ok